@hype-stack/cli 0.2.1 → 0.2.2
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-B_p3GdS8.js → cli-CB6k2Kq3.js} +1164 -1091
- package/dist/commands/compose.d.ts.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/template.d.ts.map +1 -1
- package/dist/config/bin.js +1 -1
- package/dist/constants/themes.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/ui/swatch.d.ts +28 -0
- package/dist/ui/swatch.d.ts.map +1 -0
- package/dist/ui/theme.d.ts +8 -0
- package/dist/ui/theme.d.ts.map +1 -1
- package/dist/utils/fs.d.ts +10 -0
- package/dist/utils/fs.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { DEFAULT_THEME as e, THEME_CHOICES as t,
|
|
2
|
-
import { Command as
|
|
3
|
-
import * as
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import { exec as
|
|
9
|
-
import { downloadTemplate as
|
|
1
|
+
import { DEFAULT_THEME as e, THEME_CHOICES as t, THEME_LIST as n, getTheme as r, isThemeName as i } from "./themes.js";
|
|
2
|
+
import { Command as a } from "commander";
|
|
3
|
+
import * as o from "@clack/prompts";
|
|
4
|
+
import s from "node:fs/promises";
|
|
5
|
+
import c from "picocolors";
|
|
6
|
+
import l from "node:os";
|
|
7
|
+
import u from "node:path";
|
|
8
|
+
import { exec as d, spawn as f } from "node:child_process";
|
|
9
|
+
import { downloadTemplate as p } from "giget";
|
|
10
10
|
//#region \0rolldown/runtime.js
|
|
11
|
-
var
|
|
12
|
-
if (t && typeof t == "object" || typeof t == "function") for (var i =
|
|
11
|
+
var m = Object.create, h = Object.defineProperty, g = Object.getOwnPropertyDescriptor, _ = Object.getOwnPropertyNames, v = Object.getPrototypeOf, y = Object.prototype.hasOwnProperty, b = (e, t) => () => (t || (e((t = { exports: {} }).exports, t), e = null), t.exports), x = (e, t, n, r) => {
|
|
12
|
+
if (t && typeof t == "object" || typeof t == "function") for (var i = _(t), a = 0, o = i.length, s; a < o; a++) s = i[a], !y.call(e, s) && s !== n && h(e, s, {
|
|
13
13
|
get: ((e) => t[e]).bind(null, s),
|
|
14
|
-
enumerable: !(r =
|
|
14
|
+
enumerable: !(r = g(t, s)) || r.enumerable
|
|
15
15
|
});
|
|
16
16
|
return e;
|
|
17
|
-
},
|
|
17
|
+
}, S = (e, t, n) => (n = e == null ? {} : m(v(e)), x(t || !e || !e.__esModule ? h(n, "default", {
|
|
18
18
|
value: e,
|
|
19
19
|
enumerable: !0
|
|
20
|
-
}) : n, e)),
|
|
20
|
+
}) : n, e)), C = "0.0.1", w = "gh:BetterTyped/hype-stack", T = "stack.json", E = "/schema/stack.json", D = "https://hype-stack.dev", O = "HYPE_STACK_API_URL", ee = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/, k = [
|
|
21
21
|
{
|
|
22
22
|
value: "cursor",
|
|
23
23
|
label: "Cursor",
|
|
@@ -35,107 +35,111 @@ var p = Object.create, m = Object.defineProperty, h = Object.getOwnPropertyDescr
|
|
|
35
35
|
value: "copilot",
|
|
36
36
|
label: "GitHub Copilot"
|
|
37
37
|
}
|
|
38
|
-
],
|
|
39
|
-
function
|
|
38
|
+
], A = k.map((e) => e.value), j = ".cursor/rules", te = ".cursor", M = ".agents";
|
|
39
|
+
function N() {
|
|
40
40
|
let e = process.env.HYPE_STACK_API_URL;
|
|
41
|
-
return e ? (ne(e), e.replace(/\/+$/, "")) :
|
|
41
|
+
return e ? (ne(e), e.replace(/\/+$/, "")) : D;
|
|
42
42
|
}
|
|
43
|
-
function
|
|
43
|
+
function P() {
|
|
44
44
|
let e = process.env.HYPE_STACK_WEB_URL;
|
|
45
|
-
return e ? (ne(e), e.replace(/\/+$/, "")) :
|
|
45
|
+
return e ? (ne(e), e.replace(/\/+$/, "")) : N();
|
|
46
46
|
}
|
|
47
47
|
function ne(e) {
|
|
48
48
|
try {
|
|
49
49
|
let t = new URL(e);
|
|
50
|
-
if (!t.protocol.startsWith("http")) throw Error(`${
|
|
50
|
+
if (!t.protocol.startsWith("http")) throw Error(`${O} must use http or https protocol, got "${t.protocol}"`);
|
|
51
51
|
} catch (t) {
|
|
52
|
-
throw t instanceof TypeError ? Error(`${
|
|
52
|
+
throw t instanceof TypeError ? Error(`${O} is not a valid URL: "${e}"`, { cause: t }) : t;
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
function re() {
|
|
56
|
-
return `${
|
|
56
|
+
return `${N()}${E}`;
|
|
57
57
|
}
|
|
58
58
|
//#endregion
|
|
59
59
|
//#region src/ui/theme.ts
|
|
60
|
-
var
|
|
61
|
-
orange:
|
|
60
|
+
var F = (e) => `\x1b[38;5;208m${e}\x1b[39m`, ie = (e) => `\x1b[38;5;214m${e}\x1b[39m`, I = (e) => `\x1b[38;5;220m${e}\x1b[39m`, ae = (e) => `\x1b[38;5;33m${e}\x1b[39m`, L = (e) => `\x1b[38;5;39m${e}\x1b[39m`, oe = (e) => `\x1b[38;5;81m${e}\x1b[39m`, se = {
|
|
61
|
+
orange: F,
|
|
62
62
|
orangeBright: ie,
|
|
63
|
-
amber:
|
|
63
|
+
amber: I,
|
|
64
64
|
deepBlue: ae,
|
|
65
|
-
skyBlue:
|
|
65
|
+
skyBlue: L,
|
|
66
66
|
lightBlue: oe
|
|
67
|
-
}, L = {
|
|
68
|
-
brand: (e) => P(e),
|
|
69
|
-
brandBold: (e) => s.bold(P(e)),
|
|
70
|
-
accent: (e) => I(e),
|
|
71
|
-
accentBold: (e) => s.bold(I(e)),
|
|
72
|
-
success: (e) => s.green(e),
|
|
73
|
-
error: (e) => s.red(e),
|
|
74
|
-
warning: (e) => s.yellow(e),
|
|
75
|
-
muted: (e) => s.dim(e),
|
|
76
|
-
bold: (e) => s.bold(e),
|
|
77
|
-
highlight: (e) => s.bold(s.white(e)),
|
|
78
|
-
path: (e) => s.underline(I(e)),
|
|
79
|
-
command: (e) => s.bold(F(e)),
|
|
80
|
-
label: (e) => s.dim(s.bold(e))
|
|
81
67
|
}, R = {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
68
|
+
brand: (e) => F(e),
|
|
69
|
+
brandBold: (e) => c.bold(F(e)),
|
|
70
|
+
accent: (e) => L(e),
|
|
71
|
+
accentBold: (e) => c.bold(L(e)),
|
|
72
|
+
success: (e) => c.green(e),
|
|
73
|
+
error: (e) => c.red(e),
|
|
74
|
+
warning: (e) => c.yellow(e),
|
|
75
|
+
muted: (e) => c.dim(e),
|
|
76
|
+
bold: (e) => c.bold(e),
|
|
77
|
+
highlight: (e) => c.bold(c.white(e)),
|
|
78
|
+
path: (e) => c.underline(L(e)),
|
|
79
|
+
command: (e) => c.bold(I(e)),
|
|
80
|
+
label: (e) => c.dim(c.bold(e))
|
|
81
|
+
};
|
|
82
|
+
function ce(e, t = e) {
|
|
83
|
+
return `\x1b]8;;${e}\x07${L(t)}\x1b]8;;\x07`;
|
|
84
|
+
}
|
|
85
|
+
var z = {
|
|
86
|
+
arrow: F("›"),
|
|
87
|
+
bullet: R.muted("·"),
|
|
88
|
+
dash: R.muted("─"),
|
|
89
|
+
corner: R.muted("╰"),
|
|
90
|
+
pipe: R.muted("│"),
|
|
91
|
+
dot: R.muted("•"),
|
|
92
|
+
spark: I("✦"),
|
|
89
93
|
sparkSmall: ie("✧"),
|
|
90
|
-
bolt:
|
|
91
|
-
},
|
|
92
|
-
|
|
93
|
-
|
|
94
|
+
bolt: I("⚡")
|
|
95
|
+
}, le = [
|
|
96
|
+
I,
|
|
97
|
+
I,
|
|
94
98
|
ie,
|
|
95
|
-
|
|
99
|
+
F,
|
|
96
100
|
ae,
|
|
97
|
-
|
|
101
|
+
L,
|
|
98
102
|
oe,
|
|
99
103
|
oe
|
|
100
104
|
];
|
|
101
|
-
function
|
|
105
|
+
function ue(e) {
|
|
102
106
|
let t = [...e], n = t.length;
|
|
103
107
|
return t.map((e, t) => {
|
|
104
108
|
if (e === " " || e === "\n") return e;
|
|
105
109
|
let r = t / Math.max(n - 1, 1);
|
|
106
|
-
return
|
|
110
|
+
return le[Math.min(Math.floor(r * le.length), le.length - 1)](e);
|
|
107
111
|
}).join("");
|
|
108
112
|
}
|
|
109
|
-
function
|
|
113
|
+
function de(e, t, n) {
|
|
110
114
|
return Math.round(e + (t - e) * n);
|
|
111
115
|
}
|
|
112
|
-
function
|
|
116
|
+
function fe(e, t) {
|
|
113
117
|
let { start: n, end: r, angle: i = 1 } = t, a = Math.max(...e.map((e) => e.length), 1), o = Math.max(e.length - 1, 1);
|
|
114
118
|
return e.map((e, t) => [...e].map((e, s) => {
|
|
115
119
|
if (e === " ") return e;
|
|
116
120
|
let c = s / Math.max(a - 1, 1), l = t / o, u = Math.min((c + l * i) / (1 + i), 1);
|
|
117
|
-
return `\x1b[38;2;${
|
|
121
|
+
return `\x1b[38;2;${de(n[0], r[0], u)};${de(n[1], r[1], u)};${de(n[2], r[2], u)}m${e}\x1b[39m`;
|
|
118
122
|
}).join(""));
|
|
119
123
|
}
|
|
120
124
|
//#endregion
|
|
121
125
|
//#region src/core/license.ts
|
|
122
|
-
function
|
|
123
|
-
return `${
|
|
126
|
+
function pe(e) {
|
|
127
|
+
return `${P()}/packs/${e}`;
|
|
124
128
|
}
|
|
125
129
|
//#endregion
|
|
126
130
|
//#region ../../node_modules/.pnpm/@hyper-fetch+core@8.1.1/node_modules/@hyper-fetch/core/dist/index.mjs
|
|
127
|
-
var
|
|
131
|
+
var me = /* @__PURE__ */ S((/* @__PURE__ */ b(((e, t) => {
|
|
128
132
|
t.exports = {};
|
|
129
|
-
})))(), 1),
|
|
130
|
-
if (t && typeof t == "object" || typeof t == "function") for (var i =
|
|
133
|
+
})))(), 1), he = Object.create, ge = Object.defineProperty, _e = Object.getOwnPropertyDescriptor, ve = Object.getOwnPropertyNames, ye = Object.getPrototypeOf, be = Object.prototype.hasOwnProperty, xe = (e, t) => () => (t || e((t = { exports: {} }).exports, t), t.exports), Se = (e, t, n, r) => {
|
|
134
|
+
if (t && typeof t == "object" || typeof t == "function") for (var i = ve(t), a = 0, o = i.length, s; a < o; a++) s = i[a], !be.call(e, s) && s !== n && ge(e, s, {
|
|
131
135
|
get: ((e) => t[e]).bind(null, s),
|
|
132
|
-
enumerable: !(r =
|
|
136
|
+
enumerable: !(r = _e(t, s)) || r.enumerable
|
|
133
137
|
});
|
|
134
138
|
return e;
|
|
135
|
-
},
|
|
139
|
+
}, Ce = (e, t, n) => (n = e == null ? {} : he(ye(e)), Se(t || !e || !e.__esModule ? ge(n, "default", {
|
|
136
140
|
value: e,
|
|
137
141
|
enumerable: !0
|
|
138
|
-
}) : n, e)),
|
|
142
|
+
}) : n, e)), we = (e) => `${e.queryKey}_${Date.now().toString(36)}_${Math.random().toString(36).substring(2)}`, Te = /* @__PURE__ */ Ce((/* @__PURE__ */ xe(((e, t) => {
|
|
139
143
|
var n = typeof Reflect == "object" ? Reflect : null, r = n && typeof n.apply == "function" ? n.apply : function(e, t, n) {
|
|
140
144
|
return Function.prototype.apply.call(e, t, n);
|
|
141
145
|
}, i = n && typeof n.ownKeys == "function" ? n.ownKeys : Object.getOwnPropertySymbols ? function(e) {
|
|
@@ -310,7 +314,7 @@ var pe = /* @__PURE__ */ x((/* @__PURE__ */ y(((e, t) => {
|
|
|
310
314
|
});
|
|
311
315
|
else throw TypeError("The \"emitter\" argument must be of type EventEmitter. Received type " + typeof e);
|
|
312
316
|
}
|
|
313
|
-
})))()),
|
|
317
|
+
})))()), Ee = (e) => `listen_${String(e)}`, De = class extends Te.default {
|
|
314
318
|
emitCallbacks = [];
|
|
315
319
|
constructor(e) {
|
|
316
320
|
super(e);
|
|
@@ -322,26 +326,26 @@ var pe = /* @__PURE__ */ x((/* @__PURE__ */ y(((e, t) => {
|
|
|
322
326
|
onEmit = (e) => (this.emitCallbacks?.push(e), () => {
|
|
323
327
|
this.emitCallbacks = this.emitCallbacks?.filter((t) => t !== e);
|
|
324
328
|
});
|
|
325
|
-
onListener = (e, t) => (super.on(
|
|
326
|
-
super.off(
|
|
329
|
+
onListener = (e, t) => (super.on(Ee(e), t), () => {
|
|
330
|
+
super.off(Ee(e), t);
|
|
327
331
|
});
|
|
328
|
-
on = (e, t) => (super.on(e, t), super.emit(
|
|
329
|
-
off = (e, t) => (super.off(e, t), super.emit(
|
|
332
|
+
on = (e, t) => (super.on(e, t), super.emit(Ee(e), super.listeners(e).length), this);
|
|
333
|
+
off = (e, t) => (super.off(e, t), super.emit(Ee(e), super.listeners(e).length), this);
|
|
330
334
|
addListener = this.on;
|
|
331
335
|
removeListener = this.off;
|
|
332
|
-
},
|
|
333
|
-
emitter = new
|
|
334
|
-
events =
|
|
336
|
+
}, Oe = class {
|
|
337
|
+
emitter = new De();
|
|
338
|
+
events = Ne(this.emitter);
|
|
335
339
|
isBrowser;
|
|
336
340
|
isOnline;
|
|
337
341
|
isFocused;
|
|
338
342
|
constructor(e) {
|
|
339
343
|
this.options = e, this.emitter?.setMaxListeners(1e3);
|
|
340
|
-
let { initiallyFocused: t =
|
|
341
|
-
this.setInitialFocus(t), this.setInitialOnline(n), this.isBrowser =
|
|
344
|
+
let { initiallyFocused: t = V.initiallyFocused, initiallyOnline: n = V.initiallyOnline } = this.options || V;
|
|
345
|
+
this.setInitialFocus(t), this.setInitialOnline(n), this.isBrowser = Ae();
|
|
342
346
|
}
|
|
343
347
|
initialize = () => {
|
|
344
|
-
let { focusEvent: e =
|
|
348
|
+
let { focusEvent: e = V.focusEvent, onlineEvent: t = V.onlineEvent } = this.options || V;
|
|
345
349
|
e(this.setFocused), t(this.setOnline);
|
|
346
350
|
};
|
|
347
351
|
setInitialFocus = async (e) => {
|
|
@@ -356,51 +360,51 @@ var pe = /* @__PURE__ */ x((/* @__PURE__ */ y(((e, t) => {
|
|
|
356
360
|
setOnline = (e) => {
|
|
357
361
|
this.isOnline = e, e ? this.events.emitOnline() : this.events.emitOffline();
|
|
358
362
|
};
|
|
359
|
-
},
|
|
363
|
+
}, ke = () => {
|
|
360
364
|
try {
|
|
361
365
|
return !!(window && window.addEventListener);
|
|
362
366
|
} catch {
|
|
363
367
|
/* istanbul ignore next */
|
|
364
368
|
return !1;
|
|
365
369
|
}
|
|
366
|
-
},
|
|
370
|
+
}, Ae = () => {
|
|
367
371
|
try {
|
|
368
|
-
return !!(
|
|
372
|
+
return !!(ke() && window.document && window.document.addEventListener);
|
|
369
373
|
} catch {
|
|
370
374
|
/* istanbul ignore next */
|
|
371
375
|
return !1;
|
|
372
376
|
}
|
|
373
|
-
},
|
|
377
|
+
}, je = (e, t, n) => ke() ? (window.addEventListener(e, t, n), () => window.removeEventListener(e, t, n)) : () => null, Me = (e, t, n) => Ae() ? (window.document.addEventListener(e, t, n), () => window.document.removeEventListener(e, t, n)) : () => null, Ne = (e) => ({
|
|
374
378
|
emitFocus: () => {
|
|
375
|
-
e.emit(
|
|
379
|
+
e.emit(B.FOCUS);
|
|
376
380
|
},
|
|
377
381
|
emitBlur: () => {
|
|
378
|
-
e.emit(
|
|
382
|
+
e.emit(B.BLUR);
|
|
379
383
|
},
|
|
380
384
|
emitOnline: () => {
|
|
381
|
-
e.emit(
|
|
385
|
+
e.emit(B.ONLINE);
|
|
382
386
|
},
|
|
383
387
|
emitOffline: () => {
|
|
384
|
-
e.emit(
|
|
388
|
+
e.emit(B.OFFLINE);
|
|
385
389
|
},
|
|
386
|
-
onFocus: (t) => (e.on(
|
|
387
|
-
onBlur: (t) => (e.on(
|
|
388
|
-
onOnline: (t) => (e.on(
|
|
389
|
-
onOffline: (t) => (e.on(
|
|
390
|
-
}),
|
|
390
|
+
onFocus: (t) => (e.on(B.FOCUS, t), () => e.removeListener(B.FOCUS, t)),
|
|
391
|
+
onBlur: (t) => (e.on(B.BLUR, t), () => e.removeListener(B.BLUR, t)),
|
|
392
|
+
onOnline: (t) => (e.on(B.ONLINE, t), () => e.removeListener(B.ONLINE, t)),
|
|
393
|
+
onOffline: (t) => (e.on(B.OFFLINE, t), () => e.removeListener(B.OFFLINE, t))
|
|
394
|
+
}), B = /* @__PURE__ */ function(e) {
|
|
391
395
|
return e.FOCUS = "focus", e.BLUR = "blur", e.ONLINE = "online", e.OFFLINE = "offline", e;
|
|
392
|
-
}({}),
|
|
396
|
+
}({}), V = {
|
|
393
397
|
initiallyFocused: !0,
|
|
394
398
|
initiallyOnline: !0,
|
|
395
399
|
focusEvent: (e) => {
|
|
396
|
-
|
|
400
|
+
Me("visibilitychange", () => e(!0)), je("focus", () => e(!0)), je("blur", () => e(!1));
|
|
397
401
|
},
|
|
398
402
|
onlineEvent: (e) => {
|
|
399
|
-
|
|
403
|
+
je("online", () => e(!0)), je("offline", () => e(!1));
|
|
400
404
|
}
|
|
401
|
-
},
|
|
402
|
-
emitter = new
|
|
403
|
-
events =
|
|
405
|
+
}, Pe = class {
|
|
406
|
+
emitter = new De();
|
|
407
|
+
events = ut(this.emitter);
|
|
404
408
|
constructor() {
|
|
405
409
|
this.emitter?.setMaxListeners(1e3);
|
|
406
410
|
}
|
|
@@ -437,71 +441,71 @@ var pe = /* @__PURE__ */ x((/* @__PURE__ */ y(((e, t) => {
|
|
|
437
441
|
});
|
|
438
442
|
});
|
|
439
443
|
};
|
|
440
|
-
},
|
|
444
|
+
}, Fe = () => "loading-event-any", Ie = (e) => `${e}-loading-event`, Le = (e) => `${e}-loading-cache-event`, Re = (e) => `${e}-loading-event-by-id`, ze = () => "remove-event-any", Be = (e) => `${e}-remove-event`, Ve = (e) => `${e}-remove-event-by-id`, He = () => "request-abort-any", Ue = (e) => `${e}-request-abort`, We = (e) => `${e}-request-abort-by-id`, Ge = () => "response-any", Ke = (e) => `${e}-response`, qe = (e) => `${e}-response-by-id`, Je = () => "request-start-any", Ye = (e) => `${e}-request-start`, Xe = (e) => `${e}-request-start-by-id`, Ze = () => "response-start-any", Qe = (e) => `${e}-response-start`, $e = (e) => `${e}-response-start-by-id`, et = () => "request-progress-any", tt = (e) => `${e}-request-progress`, nt = (e) => `${e}-request-progress-by-id`, rt = () => "response-progress-any", it = (e) => `${e}-response-progress`, at = (e) => `${e}-response-progress-by-id`, ot = () => "request-deduplicated-any", st = (e) => `${e}-query-request-deduplicated`, ct = (e) => `${e}-cache-request-deduplicated`, lt = (e) => `${e}-request-deduplicated-by-id`, ut = (e) => ({
|
|
441
445
|
emitDeduplicated: (t, n = !1) => {
|
|
442
|
-
e.emit(
|
|
446
|
+
e.emit(ot(), t, n), e.emit(lt(t.requestId), t, n), e.emit(ct(t.request.cacheKey), t, n), e.emit(st(t.request.queryKey), t, n);
|
|
443
447
|
},
|
|
444
448
|
emitLoading: (t, n = !1) => {
|
|
445
|
-
e.emit(
|
|
449
|
+
e.emit(Fe(), t, n), e.emit(Re(t.requestId), t, n), e.emit(Le(t.request.cacheKey), t, n), e.emit(Ie(t.request.queryKey), t, n);
|
|
446
450
|
},
|
|
447
451
|
emitRequestStart: (t, n = !1) => {
|
|
448
|
-
e.emit(
|
|
452
|
+
e.emit(Je(), t, n), e.emit(Xe(t.requestId), t, n), e.emit(Ye(t.request.queryKey), t, n);
|
|
449
453
|
},
|
|
450
454
|
emitResponseStart: (t, n = !1) => {
|
|
451
|
-
e.emit(
|
|
455
|
+
e.emit(Ze(), t, n), e.emit($e(t.requestId), t, n), e.emit(Qe(t.request.queryKey), t, n);
|
|
452
456
|
},
|
|
453
457
|
emitUploadProgress: (t, n = !1) => {
|
|
454
|
-
e.emit(
|
|
458
|
+
e.emit(et(), t, n), e.emit(nt(t.requestId), t, n), e.emit(tt(t.request.queryKey), t, n);
|
|
455
459
|
},
|
|
456
460
|
emitDownloadProgress: (t, n = !1) => {
|
|
457
|
-
e.emit(
|
|
461
|
+
e.emit(rt(), t, n), e.emit(at(t.requestId), t, n), e.emit(it(t.request.queryKey), t, n);
|
|
458
462
|
},
|
|
459
463
|
emitResponse: (t, n = !1) => {
|
|
460
|
-
e.emit(
|
|
464
|
+
e.emit(Ge(), t, n), e.emit(qe(t.requestId), t, n), e.emit(Ke(t.request.cacheKey), t, n);
|
|
461
465
|
},
|
|
462
466
|
emitAbort: (t, n = !1) => {
|
|
463
|
-
e.emit(
|
|
467
|
+
e.emit(He(), t, n), e.emit(We(t.requestId), t, n), e.emit(Ue(t.request.abortKey), t, n);
|
|
464
468
|
},
|
|
465
469
|
emitRemove: (t, n = !1) => {
|
|
466
|
-
e.emit(
|
|
470
|
+
e.emit(ze(), t, n), e.emit(Ve(t.requestId), t, n), e.emit(Be(t.request.queryKey), t, n);
|
|
467
471
|
},
|
|
468
|
-
onDeduplicated: (t) => (e.on(
|
|
469
|
-
onDeduplicatedByQueue: (t, n) => (e.on(
|
|
470
|
-
onDeduplicatedByCache: (t, n) => (e.on(
|
|
471
|
-
onDeduplicatedById: (t, n) => (e.on(
|
|
472
|
-
onLoading: (t) => (e.on(
|
|
473
|
-
onLoadingByQueue: (t, n) => (e.on(
|
|
474
|
-
onLoadingByCache: (t, n) => (e.on(
|
|
475
|
-
onLoadingById: (t, n) => (e.on(
|
|
476
|
-
onRequestStart: (t) => (e.on(
|
|
477
|
-
onRequestStartByQueue: (t, n) => (e.on(
|
|
478
|
-
onRequestStartById: (t, n) => (e.on(
|
|
479
|
-
onResponseStart: (t) => (e.on(
|
|
480
|
-
onResponseStartByQueue: (t, n) => (e.on(
|
|
481
|
-
onResponseStartById: (t, n) => (e.on(
|
|
482
|
-
onUploadProgress: (t) => (e.on(
|
|
483
|
-
onUploadProgressByQueue: (t, n) => (e.on(
|
|
484
|
-
onUploadProgressById: (t, n) => (e.on(
|
|
485
|
-
onDownloadProgress: (t) => (e.on(
|
|
486
|
-
onDownloadProgressByQueue: (t, n) => (e.on(
|
|
487
|
-
onDownloadProgressById: (t, n) => (e.on(
|
|
488
|
-
onResponse: (t) => (e.on(
|
|
489
|
-
onResponseByCache: (t, n) => (e.on(
|
|
490
|
-
onResponseById: (t, n) => (e.on(
|
|
491
|
-
onAbort: (t) => (e.on(
|
|
492
|
-
onAbortByKey: (t, n) => (e.on(
|
|
493
|
-
onAbortById: (t, n) => (e.on(
|
|
494
|
-
onRemove: (t) => (e.on(
|
|
495
|
-
onRemoveByQueue: (t, n) => (e.on(
|
|
496
|
-
onRemoveById: (t, n) => (e.on(
|
|
497
|
-
}),
|
|
472
|
+
onDeduplicated: (t) => (e.on(ot(), t), () => e.removeListener(ot(), t)),
|
|
473
|
+
onDeduplicatedByQueue: (t, n) => (e.on(st(t), n), () => e.removeListener(st(t), n)),
|
|
474
|
+
onDeduplicatedByCache: (t, n) => (e.on(ct(t), n), () => e.removeListener(ct(t), n)),
|
|
475
|
+
onDeduplicatedById: (t, n) => (e.on(lt(t), n), () => e.removeListener(lt(t), n)),
|
|
476
|
+
onLoading: (t) => (e.on(Fe(), t), () => e.removeListener(Fe(), t)),
|
|
477
|
+
onLoadingByQueue: (t, n) => (e.on(Ie(t), n), () => e.removeListener(Ie(t), n)),
|
|
478
|
+
onLoadingByCache: (t, n) => (e.on(Le(t), n), () => e.removeListener(Le(t), n)),
|
|
479
|
+
onLoadingById: (t, n) => (e.on(Re(t), n), () => e.removeListener(Re(t), n)),
|
|
480
|
+
onRequestStart: (t) => (e.on(Je(), t), () => e.removeListener(Je(), t)),
|
|
481
|
+
onRequestStartByQueue: (t, n) => (e.on(Ye(t), n), () => e.removeListener(Ye(t), n)),
|
|
482
|
+
onRequestStartById: (t, n) => (e.on(Xe(t), n), () => e.removeListener(Xe(t), n)),
|
|
483
|
+
onResponseStart: (t) => (e.on(Ze(), t), () => e.removeListener(Ze(), t)),
|
|
484
|
+
onResponseStartByQueue: (t, n) => (e.on(Qe(t), n), () => e.removeListener(Qe(t), n)),
|
|
485
|
+
onResponseStartById: (t, n) => (e.on($e(t), n), () => e.removeListener($e(t), n)),
|
|
486
|
+
onUploadProgress: (t) => (e.on(et(), t), () => e.removeListener(et(), t)),
|
|
487
|
+
onUploadProgressByQueue: (t, n) => (e.on(tt(t), n), () => e.removeListener(tt(t), n)),
|
|
488
|
+
onUploadProgressById: (t, n) => (e.on(nt(t), n), () => e.removeListener(nt(t), n)),
|
|
489
|
+
onDownloadProgress: (t) => (e.on(rt(), t), () => e.removeListener(rt(), t)),
|
|
490
|
+
onDownloadProgressByQueue: (t, n) => (e.on(it(t), n), () => e.removeListener(it(t), n)),
|
|
491
|
+
onDownloadProgressById: (t, n) => (e.on(at(t), n), () => e.removeListener(at(t), n)),
|
|
492
|
+
onResponse: (t) => (e.on(Ge(), t), () => e.removeListener(Ge(), t)),
|
|
493
|
+
onResponseByCache: (t, n) => (e.on(Ke(t), n), () => e.removeListener(Ke(t), n)),
|
|
494
|
+
onResponseById: (t, n) => (e.on(qe(t), n), () => e.removeListener(qe(t), n)),
|
|
495
|
+
onAbort: (t) => (e.on(He(), t), () => e.removeListener(He(), t)),
|
|
496
|
+
onAbortByKey: (t, n) => (e.on(Ue(t), n), () => e.removeListener(Ue(t), n)),
|
|
497
|
+
onAbortById: (t, n) => (e.on(We(t), n), () => e.removeListener(We(t), n)),
|
|
498
|
+
onRemove: (t) => (e.on(ze(), t), () => e.removeListener(ze(), t)),
|
|
499
|
+
onRemoveByQueue: (t, n) => (e.on(Be(t), n), () => e.removeListener(Be(t), n)),
|
|
500
|
+
onRemoveById: (t, n) => (e.on(Ve(t), n), () => e.removeListener(Ve(t), n))
|
|
501
|
+
}), dt = class {
|
|
498
502
|
logger;
|
|
499
503
|
level;
|
|
500
504
|
modules;
|
|
501
|
-
emitter = new
|
|
505
|
+
emitter = new Te.default();
|
|
502
506
|
client;
|
|
503
507
|
constructor(e) {
|
|
504
|
-
this.options = e, this.emitter?.setMaxListeners(1e3), this.logger = this.options?.logger ||
|
|
508
|
+
this.options = e, this.emitter?.setMaxListeners(1e3), this.logger = this.options?.logger || mt, this.level = this.options?.level || "warning", this.modules = this.options?.modules;
|
|
505
509
|
}
|
|
506
510
|
setSeverity = (e) => {
|
|
507
511
|
this.level = e;
|
|
@@ -532,39 +536,39 @@ var pe = /* @__PURE__ */ x((/* @__PURE__ */ y(((e, t) => {
|
|
|
532
536
|
})
|
|
533
537
|
});
|
|
534
538
|
log = (e) => {
|
|
535
|
-
this.client.debug && (
|
|
539
|
+
this.client.debug && (ht.indexOf(this.level) <= ht.indexOf(e.level) || this.modules && !this.modules.includes(e.module) || this.logger(e));
|
|
536
540
|
};
|
|
537
|
-
},
|
|
538
|
-
let t =
|
|
541
|
+
}, ft = () => `${(/* @__PURE__ */ new Date()).toLocaleTimeString()}`, pt = (e) => e.type === "request" || e.type === "response" ? `${e.extra.request.endpoint}` : `[${e.module}]`, mt = (e) => {
|
|
542
|
+
let t = _t[e.level], n = vt[e.level], r = `%c[${ft()}]%c${e.title}%c${pt(e)}`, i = `${t}${n}font-weight:600;border-radius: 4px 0 0 4px;`, a = `${t}${n}font-weight:600;`, o = `${t}font-weight:normal;border-radius: 0 4px 4px 0;`;
|
|
539
543
|
e.extra && Object.keys(e.extra)?.length ? (console.groupCollapsed(r, i, a, o), console.log(e.extra), console.groupEnd()) : console.log(r, t);
|
|
540
|
-
},
|
|
544
|
+
}, ht = [
|
|
541
545
|
"error",
|
|
542
546
|
"warning",
|
|
543
547
|
"info",
|
|
544
548
|
"debug"
|
|
545
|
-
],
|
|
546
|
-
error: `${
|
|
547
|
-
warning: `${
|
|
548
|
-
info: `${
|
|
549
|
-
debug: `${
|
|
550
|
-
},
|
|
549
|
+
], gt = "padding:2px 5px;", _t = {
|
|
550
|
+
error: `${gt};background:#db252520;`,
|
|
551
|
+
warning: `${gt};background:#e1941e20;`,
|
|
552
|
+
info: `${gt};background:#1e74e120;`,
|
|
553
|
+
debug: `${gt};background:#00000020;`
|
|
554
|
+
}, vt = {
|
|
551
555
|
error: "color:#ff3737;",
|
|
552
556
|
warning: "color:#ffc107;",
|
|
553
557
|
info: "color:#34a8ff;",
|
|
554
558
|
debug: "color:#cccccc;"
|
|
555
|
-
},
|
|
559
|
+
}, yt = class extends Error {
|
|
556
560
|
constructor() {
|
|
557
561
|
super("Request timeout"), this.name = "TimeoutError";
|
|
558
562
|
}
|
|
559
|
-
},
|
|
563
|
+
}, bt = class extends Error {
|
|
560
564
|
constructor() {
|
|
561
565
|
super("Request aborted"), this.name = "AbortError";
|
|
562
566
|
}
|
|
563
|
-
},
|
|
567
|
+
}, xt = class extends Error {
|
|
564
568
|
constructor() {
|
|
565
569
|
super("Request deleted"), this.name = "DeletedError";
|
|
566
570
|
}
|
|
567
|
-
},
|
|
571
|
+
}, H = class extends Error {
|
|
568
572
|
description;
|
|
569
573
|
constructor(e) {
|
|
570
574
|
super("Request processing error"), this.description = e, this.name = "RequestProcessingError";
|
|
@@ -574,16 +578,16 @@ var pe = /* @__PURE__ */ x((/* @__PURE__ */ y(((e, t) => {
|
|
|
574
578
|
constructor(e) {
|
|
575
579
|
super("Unexpected error"), this.description = e, this.name = "UnexpectedError";
|
|
576
580
|
}
|
|
577
|
-
},
|
|
581
|
+
}, U = (e) => e === "timeout" ? new yt() : e === "abort" ? new bt() : e === "deleted" ? new xt() : e === "processing" ? new H() : new St(), Ct = (e) => {
|
|
578
582
|
try {
|
|
579
583
|
return JSON.stringify(e);
|
|
580
584
|
} catch {
|
|
581
585
|
return "";
|
|
582
586
|
}
|
|
583
587
|
}, wt = (e) => {
|
|
584
|
-
let t =
|
|
588
|
+
let t = ke() && e.payload instanceof FormData, n = typeof e.payload == "object" && e.payload !== null, r = {};
|
|
585
589
|
return !t && n && (r["Content-Type"] = "application/json"), Object.assign(r, e.headers), r;
|
|
586
|
-
}, Tt = (e) =>
|
|
590
|
+
}, Tt = (e) => ke() && e instanceof FormData ? e : Ct(e), Et = [
|
|
587
591
|
"onBeforeSent",
|
|
588
592
|
"onRequestStart",
|
|
589
593
|
"onResponseStart",
|
|
@@ -632,7 +636,7 @@ function Dt(e) {
|
|
|
632
636
|
}
|
|
633
637
|
var Ot = /* @__PURE__ */ function(e) {
|
|
634
638
|
return e.GET = "GET", e.POST = "POST", e.PUT = "PUT", e.PATCH = "PATCH", e.DELETE = "DELETE", e;
|
|
635
|
-
}({}),
|
|
639
|
+
}({}), W = (e, t) => t ? `${t}__${e}` : e, kt = (e) => {
|
|
636
640
|
try {
|
|
637
641
|
if (typeof e == "string") return e;
|
|
638
642
|
if (e == null) return "";
|
|
@@ -750,7 +754,7 @@ var Ot = /* @__PURE__ */ function(e) {
|
|
|
750
754
|
data: null,
|
|
751
755
|
status: null,
|
|
752
756
|
success: !1,
|
|
753
|
-
error:
|
|
757
|
+
error: U("deleted"),
|
|
754
758
|
extra: e.client.adapter.defaultExtra,
|
|
755
759
|
requestTimestamp: +/* @__PURE__ */ new Date(),
|
|
756
760
|
responseTimestamp: +/* @__PURE__ */ new Date()
|
|
@@ -918,7 +922,7 @@ var Ot = /* @__PURE__ */ function(e) {
|
|
|
918
922
|
}
|
|
919
923
|
abort = () => {
|
|
920
924
|
let { requestManager: e } = this.client;
|
|
921
|
-
return e.abortByKey(
|
|
925
|
+
return e.abortByKey(W(this.abortKey, this.scope)), this.clone();
|
|
922
926
|
};
|
|
923
927
|
dehydrate = (e) => {
|
|
924
928
|
let { response: t, override: n = !0 } = e || {};
|
|
@@ -933,7 +937,7 @@ var Ot = /* @__PURE__ */ function(e) {
|
|
|
933
937
|
cache: !0,
|
|
934
938
|
response: t
|
|
935
939
|
};
|
|
936
|
-
let r = this.client.cache.get(
|
|
940
|
+
let r = this.client.cache.get(W(this.cacheKey, this.scope));
|
|
937
941
|
if (r) return {
|
|
938
942
|
override: n,
|
|
939
943
|
cacheTime: this.cacheTime,
|
|
@@ -955,7 +959,7 @@ var Ot = /* @__PURE__ */ function(e) {
|
|
|
955
959
|
};
|
|
956
960
|
};
|
|
957
961
|
read() {
|
|
958
|
-
let e = this.client.cache.get(
|
|
962
|
+
let e = this.client.cache.get(W(this.cacheKey, this.scope));
|
|
959
963
|
if (e) return {
|
|
960
964
|
data: e.data,
|
|
961
965
|
error: e.error,
|
|
@@ -967,7 +971,7 @@ var Ot = /* @__PURE__ */ function(e) {
|
|
|
967
971
|
};
|
|
968
972
|
}
|
|
969
973
|
exec = async (e) => {
|
|
970
|
-
let { adapter: t, requestManager: n } = this.client, r = this.clone(e), i = this.client.unstable_requestIdMapper(this), a =
|
|
974
|
+
let { adapter: t, requestManager: n } = this.client, r = this.clone(e), i = this.client.unstable_requestIdMapper(this), a = W(this.abortKey, this.scope);
|
|
971
975
|
n.addAbortController(a, i);
|
|
972
976
|
let o = await t.fetch(r, i);
|
|
973
977
|
return n.removeAbortController(a, i), r.unstable_responseMapper ? r.unstable_responseMapper(o) : o;
|
|
@@ -997,7 +1001,7 @@ var Ot = /* @__PURE__ */ function(e) {
|
|
|
997
1001
|
requestId: t
|
|
998
1002
|
}
|
|
999
1003
|
}), d = await d.client.unstable_modifyRequest(d), d.auth && (d = await d.client.unstable_modifyAuth(d)), d.unstable_requestMapper && (d = await d.unstable_requestMapper(d, t));
|
|
1000
|
-
let { client: g, abortKey: _ } = d, v =
|
|
1004
|
+
let { client: g, abortKey: _ } = d, v = W(_, d.scope), y = d.payload;
|
|
1001
1005
|
d.unstable_payloadMapper ? y = await d.unstable_payloadMapper(d.payload) : s && (y = await s(y));
|
|
1002
1006
|
let b = d.options, x = +/* @__PURE__ */ new Date();
|
|
1003
1007
|
r(x);
|
|
@@ -1045,14 +1049,14 @@ var Ot = /* @__PURE__ */ function(e) {
|
|
|
1045
1049
|
requestId: t,
|
|
1046
1050
|
request: d
|
|
1047
1051
|
}), l;
|
|
1048
|
-
},
|
|
1052
|
+
}, ee = (e) => {
|
|
1049
1053
|
l ||= +/* @__PURE__ */ new Date(), f = w(f, e);
|
|
1050
1054
|
let t = +/* @__PURE__ */ new Date();
|
|
1051
1055
|
return T(l, t, {
|
|
1052
1056
|
total: f,
|
|
1053
1057
|
loaded: e.loaded || 0
|
|
1054
1058
|
}), t;
|
|
1055
|
-
},
|
|
1059
|
+
}, k = () => {
|
|
1056
1060
|
l ||= +/* @__PURE__ */ new Date();
|
|
1057
1061
|
let e = +/* @__PURE__ */ new Date();
|
|
1058
1062
|
return T(l, e, {
|
|
@@ -1114,7 +1118,7 @@ var Ot = /* @__PURE__ */ function(e) {
|
|
|
1114
1118
|
startTime: x,
|
|
1115
1119
|
logger: c,
|
|
1116
1120
|
resolve: n
|
|
1117
|
-
}),
|
|
1121
|
+
}), P = ({ status: e, extra: n }) => (c.error({
|
|
1118
1122
|
title: "Abort error",
|
|
1119
1123
|
type: "request",
|
|
1120
1124
|
extra: {
|
|
@@ -1122,10 +1126,10 @@ var Ot = /* @__PURE__ */ function(e) {
|
|
|
1122
1126
|
requestId: t
|
|
1123
1127
|
}
|
|
1124
1128
|
}), N({
|
|
1125
|
-
error: i(
|
|
1129
|
+
error: i(U("abort")),
|
|
1126
1130
|
status: e,
|
|
1127
1131
|
extra: n
|
|
1128
|
-
})),
|
|
1132
|
+
})), ne = ({ status: e, extra: n }) => (c.error({
|
|
1129
1133
|
title: "Timeout error",
|
|
1130
1134
|
type: "request",
|
|
1131
1135
|
extra: {
|
|
@@ -1133,10 +1137,10 @@ var Ot = /* @__PURE__ */ function(e) {
|
|
|
1133
1137
|
requestId: t
|
|
1134
1138
|
}
|
|
1135
1139
|
}), N({
|
|
1136
|
-
error:
|
|
1140
|
+
error: U("timeout"),
|
|
1137
1141
|
status: e,
|
|
1138
1142
|
extra: n
|
|
1139
|
-
})),
|
|
1143
|
+
})), re = ({ status: e, extra: n }) => (c.error({
|
|
1140
1144
|
title: "Unexpected error",
|
|
1141
1145
|
type: "request",
|
|
1142
1146
|
extra: {
|
|
@@ -1144,14 +1148,14 @@ var Ot = /* @__PURE__ */ function(e) {
|
|
|
1144
1148
|
requestId: t
|
|
1145
1149
|
}
|
|
1146
1150
|
}), N({
|
|
1147
|
-
error:
|
|
1151
|
+
error: U(),
|
|
1148
1152
|
status: e,
|
|
1149
1153
|
extra: n
|
|
1150
|
-
})),
|
|
1151
|
-
let i =
|
|
1152
|
-
if (!i) throw new
|
|
1154
|
+
})), F = () => a.getAbortController(v, t), ie = ({ status: e, extra: n, onAbort: r = () => {} }) => {
|
|
1155
|
+
let i = F();
|
|
1156
|
+
if (!i) throw new H("Controller is not found");
|
|
1153
1157
|
let o = () => {
|
|
1154
|
-
|
|
1158
|
+
P({
|
|
1155
1159
|
status: e,
|
|
1156
1160
|
extra: n
|
|
1157
1161
|
}), r(), a.events.emitAbort({
|
|
@@ -1171,32 +1175,32 @@ var Ot = /* @__PURE__ */ function(e) {
|
|
|
1171
1175
|
adapterOptions: b
|
|
1172
1176
|
}
|
|
1173
1177
|
});
|
|
1174
|
-
let
|
|
1178
|
+
let I = e.client.adapter.unstable_queryParamsMapper(d.queryParams), ae = e.client.adapter.unstable_endpointMapper(d.endpoint), L = e.client.adapter.unstable_headerMapper(d), { url: oe } = e.client;
|
|
1175
1179
|
return {
|
|
1176
1180
|
request: d,
|
|
1177
1181
|
requestId: t,
|
|
1178
|
-
url:
|
|
1179
|
-
endpoint:
|
|
1180
|
-
queryParams:
|
|
1182
|
+
url: oe,
|
|
1183
|
+
endpoint: ae,
|
|
1184
|
+
queryParams: I,
|
|
1181
1185
|
payload: y,
|
|
1182
|
-
headers:
|
|
1186
|
+
headers: L,
|
|
1183
1187
|
adapter: e.client.adapter,
|
|
1184
1188
|
adapterOptions: b,
|
|
1185
|
-
getAbortController:
|
|
1189
|
+
getAbortController: F,
|
|
1186
1190
|
getRequestStartTimestamp: S,
|
|
1187
1191
|
getResponseStartTimestamp: C,
|
|
1188
|
-
createAbortListener:
|
|
1192
|
+
createAbortListener: ie,
|
|
1189
1193
|
onBeforeRequest: D,
|
|
1190
1194
|
onRequestStart: O,
|
|
1191
|
-
onRequestProgress:
|
|
1192
|
-
onRequestEnd:
|
|
1195
|
+
onRequestProgress: ee,
|
|
1196
|
+
onRequestEnd: k,
|
|
1193
1197
|
onResponseStart: A,
|
|
1194
1198
|
onResponseProgress: j,
|
|
1195
1199
|
onResponseEnd: te,
|
|
1196
1200
|
onSuccess: M,
|
|
1197
|
-
onAbortError:
|
|
1198
|
-
onTimeoutError:
|
|
1199
|
-
onUnexpectedError:
|
|
1201
|
+
onAbortError: P,
|
|
1202
|
+
onTimeoutError: ne,
|
|
1203
|
+
onUnexpectedError: re,
|
|
1200
1204
|
onError: N
|
|
1201
1205
|
};
|
|
1202
1206
|
};
|
|
@@ -1230,7 +1234,7 @@ function Vt({ request: e, requestId: t, startTime: n, resolve: r, logger: i }) {
|
|
|
1230
1234
|
};
|
|
1231
1235
|
}
|
|
1232
1236
|
var Ht = async ({ request: e, requestId: t, onError: n, onResponseEnd: r, onTimeoutError: i, onRequestEnd: a, createAbortListener: o, onResponseProgress: s, onRequestProgress: c, onResponseStart: l, onBeforeRequest: u, onRequestStart: d, onSuccess: f, onAbortError: p, adapter: m }) => {
|
|
1233
|
-
if (!e.unstable_mock) throw new
|
|
1237
|
+
if (!e.unstable_mock) throw new H("Mock should be defined when calling mocker");
|
|
1234
1238
|
let h = !1, { requestTime: g = 20, responseTime: _ = 20, totalUploaded: v = 1e3, totalDownloaded: y = 1e3, timeout: b } = e.unstable_mock.config, { data: x, error: S, status: C, success: w = !0, extra: T = e.client.adapter.defaultExtra } = await e.unstable_mock.fn({
|
|
1235
1239
|
request: e,
|
|
1236
1240
|
requestId: t
|
|
@@ -1323,8 +1327,8 @@ var Ht = async ({ request: e, requestId: t, onError: n, onResponseEnd: r, onTime
|
|
|
1323
1327
|
async fetch(e, t) {
|
|
1324
1328
|
let n, r = async (r) => {
|
|
1325
1329
|
try {
|
|
1326
|
-
if (!this.initialized) throw new
|
|
1327
|
-
if (!this.unstable_fetcher) throw new
|
|
1330
|
+
if (!this.initialized) throw new H(`Adapter ${this.options.name} is not initialized`);
|
|
1331
|
+
if (!this.unstable_fetcher) throw new H(`Fetcher for ${this.options.name} adapter is not set`);
|
|
1328
1332
|
this.client.triggerPlugins("onAdapterFetch", {
|
|
1329
1333
|
adapter: this,
|
|
1330
1334
|
request: e,
|
|
@@ -1364,60 +1368,60 @@ var Ht = async ({ request: e, requestId: t, onError: n, onResponseEnd: r, onTime
|
|
|
1364
1368
|
} catch {
|
|
1365
1369
|
return e;
|
|
1366
1370
|
}
|
|
1367
|
-
}, Kt = (e) => e ? Gt(e) :
|
|
1371
|
+
}, Kt = (e) => e ? Gt(e) : U(), qt = (e) => (t) => {
|
|
1368
1372
|
let { skipNull: n, skipEmptyString: r } = e;
|
|
1369
1373
|
return !(r && t === void 0 || r && t === "" || n && t === null);
|
|
1370
|
-
},
|
|
1374
|
+
}, G = (e, { encode: t, strict: n }) => t && n ? encodeURIComponent(e).replace(/[!'()*]/g, (e) => `%${e.charCodeAt(0).toString(16).toUpperCase()}`) : t ? encodeURIComponent(e) : e, Jt = (e, t, n) => {
|
|
1371
1375
|
let r = !qt(n)(t);
|
|
1372
|
-
return !e || r ? "" : `${
|
|
1376
|
+
return !e || r ? "" : `${G(e, n)}=${G(t instanceof Date ? n.dateParser?.(t) || t.toISOString() : typeof t == "object" && !Array.isArray(t) ? n.objectParser?.(t) || JSON.stringify(t) : String(t), n)}`;
|
|
1373
1377
|
}, Yt = (e, t, n) => {
|
|
1374
1378
|
let { arrayFormat: r, arraySeparator: i } = n;
|
|
1375
1379
|
return t.filter(qt(n)).reduce((t, a, o) => {
|
|
1376
1380
|
switch (r) {
|
|
1377
1381
|
case "index": {
|
|
1378
|
-
let r = `${
|
|
1379
|
-
t.push(`${r}${
|
|
1382
|
+
let r = `${G(e, n)}[${G(String(o), n)}]=`;
|
|
1383
|
+
t.push(`${r}${G(String(a), n)}`);
|
|
1380
1384
|
break;
|
|
1381
1385
|
}
|
|
1382
1386
|
case "bracket": {
|
|
1383
|
-
let r = `${
|
|
1384
|
-
t.push(`${r}${
|
|
1387
|
+
let r = `${G(e, n)}[]=`;
|
|
1388
|
+
t.push(`${r}${G(String(a), n)}`);
|
|
1385
1389
|
break;
|
|
1386
1390
|
}
|
|
1387
1391
|
case "comma": {
|
|
1388
|
-
let r = !t.length && `${
|
|
1389
|
-
return [[...t, `${r}${
|
|
1392
|
+
let r = !t.length && `${G(e, n)}=` || "";
|
|
1393
|
+
return [[...t, `${r}${G(String(a), n)}`].join(",")];
|
|
1390
1394
|
}
|
|
1391
1395
|
case "separator": {
|
|
1392
|
-
let r = !t.length && `${
|
|
1393
|
-
return [[...t, `${r}${
|
|
1396
|
+
let r = !t.length && `${G(e, n)}=` || "";
|
|
1397
|
+
return [[...t, `${r}${G(String(a), n)}`].join(i || "|")];
|
|
1394
1398
|
}
|
|
1395
1399
|
case "bracket-separator": {
|
|
1396
|
-
let r = !t.length && `${
|
|
1397
|
-
return [[...t, `${r}${
|
|
1400
|
+
let r = !t.length && `${G(e, n)}[]=` || "";
|
|
1401
|
+
return [[...t, `${r}${G(String(a), n)}`].join(i || "|")];
|
|
1398
1402
|
}
|
|
1399
1403
|
default: {
|
|
1400
|
-
let r = `${
|
|
1401
|
-
t.push(`${r}${
|
|
1404
|
+
let r = `${G(e, n)}=`;
|
|
1405
|
+
t.push(`${r}${G(String(a), n)}`);
|
|
1402
1406
|
}
|
|
1403
1407
|
}
|
|
1404
1408
|
return t;
|
|
1405
1409
|
}, []).join("&");
|
|
1406
|
-
}, Xt = (e, t =
|
|
1410
|
+
}, Xt = (e, t = En) => {
|
|
1407
1411
|
if (!e || !Object.keys(e).length) return "";
|
|
1408
1412
|
if (typeof e == "string") return e[0] === "?" ? e : `?${e}`;
|
|
1409
1413
|
let n = Object.entries(e).map(([e, n]) => Array.isArray(n) ? Yt(e, n, t) : Jt(e, n, t)).filter(Boolean).join("&");
|
|
1410
1414
|
return n ? `?${n}` : "";
|
|
1411
|
-
}, Zt = Rt.SEC * 5,
|
|
1415
|
+
}, Zt = Rt.SEC * 5, Qt = { headers: {} }, $t = () => new Wt({
|
|
1412
1416
|
name: "http",
|
|
1413
1417
|
defaultMethod: Ot.GET,
|
|
1414
|
-
defaultExtra:
|
|
1418
|
+
defaultExtra: Qt,
|
|
1415
1419
|
systemErrorStatus: 0,
|
|
1416
|
-
systemErrorExtra:
|
|
1420
|
+
systemErrorExtra: Qt
|
|
1417
1421
|
}).setQueryParamsMapper(Xt).setFetcher(async ({ request: e, adapterOptions: t, headers: n, payload: r, onError: i, onResponseEnd: a, onTimeoutError: o, onRequestEnd: s, createAbortListener: c, getAbortController: l, onResponseProgress: u, onResponseStart: d, onBeforeRequest: f, onRequestStart: p, onRequestProgress: m, onSuccess: h }) => {
|
|
1418
1422
|
let { method: g, client: _, endpoint: v, queryParams: y } = e, b = y ? Xt(y) : "", x = `${_.url}${v}${b}`, S = l(), { timeout: C = Zt, streaming: w = !1, ...T } = t || {}, E = !1, D, O = c({
|
|
1419
1423
|
status: 0,
|
|
1420
|
-
extra:
|
|
1424
|
+
extra: Qt
|
|
1421
1425
|
});
|
|
1422
1426
|
C > 0 && S && (D = setTimeout(() => {
|
|
1423
1427
|
E = !0, O(), S.abort();
|
|
@@ -1483,18 +1487,18 @@ var Ht = async ({ request: e, requestId: t, onError: n, onResponseEnd: r, onTime
|
|
|
1483
1487
|
if (D && clearTimeout(D), O(), S?.signal?.aborted) {
|
|
1484
1488
|
E && o({
|
|
1485
1489
|
status: 0,
|
|
1486
|
-
extra:
|
|
1490
|
+
extra: Qt
|
|
1487
1491
|
});
|
|
1488
1492
|
return;
|
|
1489
1493
|
}
|
|
1490
1494
|
i({
|
|
1491
1495
|
error: e,
|
|
1492
1496
|
status: 0,
|
|
1493
|
-
extra:
|
|
1497
|
+
extra: Qt
|
|
1494
1498
|
});
|
|
1495
1499
|
}
|
|
1496
|
-
}),
|
|
1497
|
-
emitter = new
|
|
1500
|
+
}), en = () => $t(), tn = class {
|
|
1501
|
+
emitter = new De();
|
|
1498
1502
|
events;
|
|
1499
1503
|
storage;
|
|
1500
1504
|
lazyStorage;
|
|
@@ -1505,7 +1509,7 @@ var Ht = async ({ request: e, requestId: t, onError: n, onResponseEnd: r, onTime
|
|
|
1505
1509
|
constructor(e) {
|
|
1506
1510
|
this.options = e;
|
|
1507
1511
|
let { storage: t = /* @__PURE__ */ new Map(), lazyStorage: n, version: r = "0.0.1" } = e ?? {};
|
|
1508
|
-
this.emitter?.setMaxListeners(1e3), this.events =
|
|
1512
|
+
this.emitter?.setMaxListeners(1e3), this.events = un(this.emitter), this.storage = t, this.version = r, this.lazyStorage = n;
|
|
1509
1513
|
}
|
|
1510
1514
|
initialize = (e) => (this.client = e, this.logger = e.loggerManager.initialize(e, "Cache"), e.appManager.events.onOnline(() => {
|
|
1511
1515
|
[...this.storage.keys()].forEach(this.scheduleGarbageCollector);
|
|
@@ -1519,7 +1523,7 @@ var Ht = async ({ request: e, requestId: t, onError: n, onResponseEnd: r, onTime
|
|
|
1519
1523
|
response: t
|
|
1520
1524
|
}
|
|
1521
1525
|
});
|
|
1522
|
-
let { cacheKey: n, cache: r, staleTime: i, cacheTime: a, scope: o } = e, s =
|
|
1526
|
+
let { cacheKey: n, cache: r, staleTime: i, cacheTime: a, scope: o } = e, s = W(n, o), c = this.storage.get(s), l = typeof t == "function" ? t(c || null) : t, u = nn(c, l), d = {
|
|
1523
1527
|
...u,
|
|
1524
1528
|
scope: o,
|
|
1525
1529
|
staleTime: i,
|
|
@@ -1565,7 +1569,7 @@ var Ht = async ({ request: e, requestId: t, onError: n, onResponseEnd: r, onTime
|
|
|
1565
1569
|
partialResponse: t
|
|
1566
1570
|
}
|
|
1567
1571
|
});
|
|
1568
|
-
let { cacheKey: n, scope: r } = e, i =
|
|
1572
|
+
let { cacheKey: n, scope: r } = e, i = W(n, r), a = this.storage.get(i), o = typeof t == "function" ? t(a || null) : t;
|
|
1569
1573
|
a && this.set(e, {
|
|
1570
1574
|
...a,
|
|
1571
1575
|
...o
|
|
@@ -1603,7 +1607,7 @@ var Ht = async ({ request: e, requestId: t, onError: n, onResponseEnd: r, onTime
|
|
|
1603
1607
|
cacheKey: t
|
|
1604
1608
|
}), this.events.emitInvalidation(t);
|
|
1605
1609
|
};
|
|
1606
|
-
e instanceof zt ? n(
|
|
1610
|
+
e instanceof zt ? n(W(e.cacheKey, e.scope), e.cacheKey) : typeof e == "string" ? n(e) : t.length && t.forEach((t) => {
|
|
1607
1611
|
e.test(t) && n(t);
|
|
1608
1612
|
});
|
|
1609
1613
|
};
|
|
@@ -1658,49 +1662,49 @@ var Ht = async ({ request: e, requestId: t, onError: n, onResponseEnd: r, onTime
|
|
|
1658
1662
|
clear = async () => {
|
|
1659
1663
|
this.garbageCollectors.forEach((e) => clearTimeout(e)), this.storage.clear();
|
|
1660
1664
|
};
|
|
1661
|
-
},
|
|
1665
|
+
}, nn = (e, t) => {
|
|
1662
1666
|
let { data: n, success: r } = t, i = !r && e ? e.data : null, a = n || i;
|
|
1663
1667
|
return {
|
|
1664
1668
|
...t,
|
|
1665
1669
|
data: a
|
|
1666
1670
|
};
|
|
1667
|
-
},
|
|
1671
|
+
}, rn = () => "invalidate", an = (e) => `${e}_invalidate`, on = () => "delete", sn = (e) => `${e}_delete`, cn = (e) => `${e}_cache`, ln = () => "cache", un = (e) => ({
|
|
1668
1672
|
emitCacheData: (t, n = !1) => {
|
|
1669
|
-
e.emit(
|
|
1673
|
+
e.emit(ln(), t, n), e.emit(cn(t.cacheKey), t, n);
|
|
1670
1674
|
},
|
|
1671
1675
|
emitInvalidation: (t, n = !1) => {
|
|
1672
|
-
e.emit(
|
|
1676
|
+
e.emit(rn(), t, n), e.emit(an(t), n);
|
|
1673
1677
|
},
|
|
1674
1678
|
emitDelete: (t, n = !1) => {
|
|
1675
|
-
e.emit(
|
|
1679
|
+
e.emit(on(), t, n), e.emit(sn(t), n);
|
|
1676
1680
|
},
|
|
1677
|
-
onData: (t) => (e.on(
|
|
1678
|
-
onDataByKey: (t, n) => (e.on(
|
|
1679
|
-
onInvalidate: (t) => (e.on(
|
|
1680
|
-
onInvalidateByKey: (t, n) => (e.on(
|
|
1681
|
-
onDelete: (t) => (e.on(
|
|
1682
|
-
onDeleteByKey: (t, n) => (e.on(
|
|
1683
|
-
}),
|
|
1681
|
+
onData: (t) => (e.on(ln(), t), () => e.removeListener(ln(), t)),
|
|
1682
|
+
onDataByKey: (t, n) => (e.on(cn(t), n), () => e.removeListener(cn(t), n)),
|
|
1683
|
+
onInvalidate: (t) => (e.on(rn(), t), () => e.removeListener(rn(), t)),
|
|
1684
|
+
onInvalidateByKey: (t, n) => (e.on(an(t), n), () => e.removeListener(an(t), n)),
|
|
1685
|
+
onDelete: (t) => (e.on(on(), t), () => e.removeListener(on(), t)),
|
|
1686
|
+
onDeleteByKey: (t, n) => (e.on(sn(t), n), () => e.removeListener(sn(t), n))
|
|
1687
|
+
}), K = /* @__PURE__ */ function(e) {
|
|
1684
1688
|
return e.ONE_BY_ONE = "one-by-one", e.ALL_AT_ONCE = "all-at-once", e.PREVIOUS_CANCELED = "previous-canceled", e.DEDUPLICATED = "deduplicated", e;
|
|
1685
|
-
}({}),
|
|
1689
|
+
}({}), dn = (e) => ({
|
|
1686
1690
|
emitDrained: (t, n) => {
|
|
1687
|
-
e.emit(
|
|
1691
|
+
e.emit(pn(), t, n), e.emit(mn(t.queryKey), t, n);
|
|
1688
1692
|
},
|
|
1689
1693
|
emitQueueStatusChanged: (t, n) => {
|
|
1690
|
-
e.emit(
|
|
1694
|
+
e.emit(hn(), t, n), e.emit(gn(t.queryKey), t, n);
|
|
1691
1695
|
},
|
|
1692
1696
|
emitQueueChanged: (t, n) => {
|
|
1693
|
-
e.emit(
|
|
1697
|
+
e.emit(_n(), t, n), e.emit(vn(t.queryKey), t, n);
|
|
1694
1698
|
},
|
|
1695
|
-
onDrained: (t) => (e.on(
|
|
1696
|
-
onDrainedByKey: (t, n) => (e.on(
|
|
1697
|
-
onQueueStatusChange: (t) => (e.on(
|
|
1698
|
-
onQueueStatusChangeByKey: (t, n) => (e.on(
|
|
1699
|
-
onQueueChange: (t) => (e.on(
|
|
1700
|
-
onQueueChangeByKey: (t, n) => (e.on(
|
|
1701
|
-
}),
|
|
1702
|
-
emitter = new
|
|
1703
|
-
events =
|
|
1699
|
+
onDrained: (t) => (e.on(pn(), t), () => e.removeListener(pn(), t)),
|
|
1700
|
+
onDrainedByKey: (t, n) => (e.on(mn(t), n), () => e.removeListener(mn(t), n)),
|
|
1701
|
+
onQueueStatusChange: (t) => (e.on(hn(), t), () => e.removeListener(hn(), t)),
|
|
1702
|
+
onQueueStatusChangeByKey: (t, n) => (e.on(gn(t), n), () => e.removeListener(gn(t), n)),
|
|
1703
|
+
onQueueChange: (t) => (e.on(_n(), t), () => e.removeListener(_n(), t)),
|
|
1704
|
+
onQueueChangeByKey: (t, n) => (e.on(vn(t), n), () => e.removeListener(vn(t), n))
|
|
1705
|
+
}), fn = class {
|
|
1706
|
+
emitter = new De();
|
|
1707
|
+
events = dn(this.emitter);
|
|
1704
1708
|
storage = /* @__PURE__ */ new Map();
|
|
1705
1709
|
requestCount = /* @__PURE__ */ new Map();
|
|
1706
1710
|
runningRequests = /* @__PURE__ */ new Map();
|
|
@@ -1833,14 +1837,14 @@ var Ht = async ({ request: e, requestId: t, onError: n, onResponseEnd: r, onTime
|
|
|
1833
1837
|
hasRunningRequest = (e, t) => !!this.getRunningRequests(e).find((e) => e.requestId === t);
|
|
1834
1838
|
cancelRunningRequests = (e) => {
|
|
1835
1839
|
this.runningRequests.get(e)?.forEach((e) => {
|
|
1836
|
-
let t =
|
|
1840
|
+
let t = W(e.request.abortKey, e.request.scope);
|
|
1837
1841
|
this.client.requestManager.abortByRequestId(t, e.requestId);
|
|
1838
1842
|
}), this.deleteRunningRequests(e);
|
|
1839
1843
|
};
|
|
1840
1844
|
cancelRunningRequest = (e, t) => {
|
|
1841
1845
|
let n = this.getRunningRequests(e).filter((e) => {
|
|
1842
1846
|
if (e.requestId === t) {
|
|
1843
|
-
let t =
|
|
1847
|
+
let t = W(e.request.abortKey, e.request.scope);
|
|
1844
1848
|
return this.client.requestManager.abortByRequestId(t, e.requestId), !1;
|
|
1845
1849
|
}
|
|
1846
1850
|
return !0;
|
|
@@ -1868,7 +1872,7 @@ var Ht = async ({ request: e, requestId: t, onError: n, onResponseEnd: r, onTime
|
|
|
1868
1872
|
resolved: !1
|
|
1869
1873
|
});
|
|
1870
1874
|
add = (e) => {
|
|
1871
|
-
let t =
|
|
1875
|
+
let t = W(e.queryKey, e.scope), n = this.createStorageItem(e), { requestId: r } = n, [i] = this.getQueue(t).requests.slice(-1), a = xn(e, i);
|
|
1872
1876
|
switch (this.logger.debug({
|
|
1873
1877
|
title: "Adding request to queue",
|
|
1874
1878
|
type: "system",
|
|
@@ -1878,9 +1882,9 @@ var Ht = async ({ request: e, requestId: t, onError: n, onResponseEnd: r, onTime
|
|
|
1878
1882
|
requestId: r
|
|
1879
1883
|
}
|
|
1880
1884
|
}), a) {
|
|
1881
|
-
case
|
|
1882
|
-
case
|
|
1883
|
-
case
|
|
1885
|
+
case K.ONE_BY_ONE: return this.addQueueItem(t, n), this.flushQueue(t), r;
|
|
1886
|
+
case K.PREVIOUS_CANCELED: return this.cancelRunningRequests(t), this.clearQueue(t), this.addQueueItem(t, n), this.flushQueue(t), r;
|
|
1887
|
+
case K.DEDUPLICATED: return this.client.requestManager.events.emitDeduplicated({
|
|
1884
1888
|
request: i.request,
|
|
1885
1889
|
requestId: r,
|
|
1886
1890
|
deduplicatedRequest: e
|
|
@@ -1922,7 +1926,7 @@ var Ht = async ({ request: e, requestId: t, onError: n, onResponseEnd: r, onTime
|
|
|
1922
1926
|
requestId: n
|
|
1923
1927
|
}
|
|
1924
1928
|
});
|
|
1925
|
-
let { retry: r, retryTime: i, queryKey: a, abortKey: o, offline: s, scope: c } = t, l =
|
|
1929
|
+
let { retry: r, retryTime: i, queryKey: a, abortKey: o, offline: s, scope: c } = t, l = W(a, c), u = W(o, c), { adapter: d, requestManager: f, cache: p, appManager: m } = this.client, h = yn(e.retries, r), g = !m.isOnline && s, _ = this.hasRunningRequest(l, n), v = e.stopped;
|
|
1926
1930
|
if (g || _ || v) return this.logger.warning({
|
|
1927
1931
|
title: "Unable to perform request",
|
|
1928
1932
|
type: "system",
|
|
@@ -1942,7 +1946,7 @@ var Ht = async ({ request: e, requestId: t, onError: n, onResponseEnd: r, onTime
|
|
|
1942
1946
|
}), this.incrementQueueRequestCount(l), f.addAbortController(u, n);
|
|
1943
1947
|
let b = await d.fetch(t, n);
|
|
1944
1948
|
e.resolved = !0, f.removeAbortController(u, n);
|
|
1945
|
-
let x = !m.isOnline, S =
|
|
1949
|
+
let x = !m.isOnline, S = U("abort").message === b.error?.message, C = !this.hasRunningRequest(l, n) || S;
|
|
1946
1950
|
this.deleteRunningRequest(l, n);
|
|
1947
1951
|
let w = b.success || !h || !t.retryOnError || t.retryOnError(b), T = !b.success && h && w && !C && !x, E = {
|
|
1948
1952
|
isCanceled: C,
|
|
@@ -2056,26 +2060,26 @@ var Ht = async ({ request: e, requestId: t, onError: n, onResponseEnd: r, onTime
|
|
|
2056
2060
|
}
|
|
2057
2061
|
}), this.delete(l, n, u));
|
|
2058
2062
|
};
|
|
2059
|
-
},
|
|
2060
|
-
let { queued: n, cancelable: r, deduplicate: i } = e, a = t ?
|
|
2061
|
-
return n ?
|
|
2063
|
+
}, pn = () => "drained-event", mn = (e) => `${e}-drained-event`, hn = () => "status-event", gn = (e) => `${e}-status-event`, _n = () => "change-event", vn = (e) => `${e}-change-event`, yn = (e, t) => !!(t && e < t), bn = (e, t) => e.deduplicateTime ? +/* @__PURE__ */ new Date() - t.timestamp <= e.deduplicateTime : !0, xn = (e, t) => {
|
|
2064
|
+
let { queued: n, cancelable: r, deduplicate: i } = e, a = t ? bn(e, t) : !1;
|
|
2065
|
+
return n ? K.ONE_BY_ONE : r ? K.PREVIOUS_CANCELED : a && i ? K.DEDUPLICATED : K.ALL_AT_ONCE;
|
|
2062
2066
|
};
|
|
2063
|
-
function
|
|
2067
|
+
function Sn(e) {
|
|
2064
2068
|
return e === "client" || e === "server" ? e : typeof window < "u" && typeof document < "u" ? "client" : "server";
|
|
2065
2069
|
}
|
|
2066
|
-
var
|
|
2070
|
+
var Cn = async (e, t) => {
|
|
2067
2071
|
let n = t;
|
|
2068
2072
|
if (!t.requestOptions.disableRequestInterceptors) {
|
|
2069
2073
|
for (let r of e) if (n = await r(t), !n) throw Error("Request modifier must return request");
|
|
2070
2074
|
}
|
|
2071
2075
|
return n;
|
|
2072
|
-
},
|
|
2076
|
+
}, wn = async (e, t, n) => {
|
|
2073
2077
|
let r = t;
|
|
2074
2078
|
if (!n.requestOptions.disableResponseInterceptors) {
|
|
2075
2079
|
for (let i of e) if (r = await i(t, n), !r) throw Error("Response modifier must return data");
|
|
2076
2080
|
}
|
|
2077
2081
|
return r;
|
|
2078
|
-
},
|
|
2082
|
+
}, Tn = class {
|
|
2079
2083
|
url;
|
|
2080
2084
|
mode;
|
|
2081
2085
|
debug;
|
|
@@ -2084,8 +2088,8 @@ var Sn = async (e, t) => {
|
|
|
2084
2088
|
unstable_onResponseCallbacks = [];
|
|
2085
2089
|
unstable_onAuthCallbacks = [];
|
|
2086
2090
|
unstable_onRequestCallbacks = [];
|
|
2087
|
-
loggerManager = new
|
|
2088
|
-
requestManager = new
|
|
2091
|
+
loggerManager = new dt();
|
|
2092
|
+
requestManager = new Pe();
|
|
2089
2093
|
appManager;
|
|
2090
2094
|
adapter;
|
|
2091
2095
|
cache;
|
|
@@ -2096,12 +2100,12 @@ var Sn = async (e, t) => {
|
|
|
2096
2100
|
unstable_abortKeyMapper = Nt;
|
|
2097
2101
|
unstable_cacheKeyMapper = Pt;
|
|
2098
2102
|
unstable_queryKeyMapper = Pt;
|
|
2099
|
-
unstable_requestIdMapper =
|
|
2103
|
+
unstable_requestIdMapper = we;
|
|
2100
2104
|
logger = this.loggerManager.initialize(this, "Client");
|
|
2101
2105
|
constructor(e) {
|
|
2102
2106
|
this.options = e;
|
|
2103
2107
|
let { url: t, appManager: n, cache: r, fetchDispatcher: i, submitDispatcher: a, mode: o } = this.options;
|
|
2104
|
-
this.url = t, this.mode =
|
|
2108
|
+
this.url = t, this.mode = Sn(o), this.adapter = en(), this.appManager = n?.() || new Oe(), this.cache = r?.() || new tn(), this.fetchDispatcher = i?.() || new fn(), this.submitDispatcher = a?.() || new fn(), this.adapter.initialize(this), this.appManager.initialize(), this.cache.initialize(this), this.fetchDispatcher.initialize(this), this.submitDispatcher.initialize(this);
|
|
2105
2109
|
}
|
|
2106
2110
|
setDebug = (e) => (this.debug = e, this);
|
|
2107
2111
|
setLogLevel = (e) => (this.loggerManager.setSeverity(e), this);
|
|
@@ -2130,15 +2134,15 @@ var Sn = async (e, t) => {
|
|
|
2130
2134
|
setCacheKeyMapper = (e) => (this.unstable_cacheKeyMapper = e, this);
|
|
2131
2135
|
setQueryKeyMapper = (e) => (this.unstable_queryKeyMapper = e, this);
|
|
2132
2136
|
setRequestIdMapper = (e) => (this.unstable_requestIdMapper = e, this);
|
|
2133
|
-
unstable_modifyAuth = async (e) =>
|
|
2134
|
-
unstable_modifyRequest = async (e) =>
|
|
2135
|
-
unstable_modifyErrorResponse = async (e, t) =>
|
|
2136
|
-
unstable_modifySuccessResponse = async (e, t) =>
|
|
2137
|
-
unstable_modifyResponse = async (e, t) =>
|
|
2137
|
+
unstable_modifyAuth = async (e) => Cn(this.unstable_onAuthCallbacks, e);
|
|
2138
|
+
unstable_modifyRequest = async (e) => Cn(this.unstable_onRequestCallbacks, e);
|
|
2139
|
+
unstable_modifyErrorResponse = async (e, t) => wn(this.unstable_onErrorCallbacks, e, t);
|
|
2140
|
+
unstable_modifySuccessResponse = async (e, t) => wn(this.unstable_onSuccessCallbacks, e, t);
|
|
2141
|
+
unstable_modifyResponse = async (e, t) => wn(this.unstable_onResponseCallbacks, e, t);
|
|
2138
2142
|
fromJSON = (e) => zt.fromJSON(this, e);
|
|
2139
2143
|
clear = () => {
|
|
2140
2144
|
let { appManager: e, cache: t, fetchDispatcher: n, submitDispatcher: r } = this.options;
|
|
2141
|
-
this.requestManager.abortControllers.clear(), this.fetchDispatcher.clear(), this.submitDispatcher.clear(), this.cache.clear(), this.requestManager.emitter.removeAllListeners(), this.fetchDispatcher.emitter.removeAllListeners(), this.submitDispatcher.emitter.removeAllListeners(), this.cache.emitter.removeAllListeners(), this.cache = t?.() || new
|
|
2145
|
+
this.requestManager.abortControllers.clear(), this.fetchDispatcher.clear(), this.submitDispatcher.clear(), this.cache.clear(), this.requestManager.emitter.removeAllListeners(), this.fetchDispatcher.emitter.removeAllListeners(), this.submitDispatcher.emitter.removeAllListeners(), this.cache.emitter.removeAllListeners(), this.cache = t?.() || new tn(), this.appManager = e?.() || new Oe(), this.fetchDispatcher = n?.() || new fn(), this.submitDispatcher = r?.() || new fn(), this.appManager.initialize(), this.cache.initialize(this), this.fetchDispatcher.initialize(this), this.submitDispatcher.initialize(this);
|
|
2142
2146
|
};
|
|
2143
2147
|
hydrate = (e, t) => {
|
|
2144
2148
|
e?.forEach((e) => {
|
|
@@ -2155,7 +2159,7 @@ var Sn = async (e, t) => {
|
|
|
2155
2159
|
...a,
|
|
2156
2160
|
...t
|
|
2157
2161
|
};
|
|
2158
|
-
if (!s.override && this.cache.get(
|
|
2162
|
+
if (!s.override && this.cache.get(W(n, r))) return;
|
|
2159
2163
|
let c = Gt(i);
|
|
2160
2164
|
this.cache.set({
|
|
2161
2165
|
...s,
|
|
@@ -2171,7 +2175,7 @@ var Sn = async (e, t) => {
|
|
|
2171
2175
|
}, r = new zt(this, n);
|
|
2172
2176
|
return this.plugins.forEach((e) => e.trigger("onRequestCreate", { request: r })), r;
|
|
2173
2177
|
};
|
|
2174
|
-
},
|
|
2178
|
+
}, En = {
|
|
2175
2179
|
strict: !0,
|
|
2176
2180
|
encode: !0,
|
|
2177
2181
|
arrayFormat: "bracket",
|
|
@@ -2180,101 +2184,101 @@ var Sn = async (e, t) => {
|
|
|
2180
2184
|
skipNull: !0,
|
|
2181
2185
|
skipEmptyString: !0
|
|
2182
2186
|
};
|
|
2183
|
-
function
|
|
2184
|
-
return new
|
|
2187
|
+
function Dn(e) {
|
|
2188
|
+
return new Tn(e);
|
|
2185
2189
|
}
|
|
2186
2190
|
//#endregion
|
|
2187
2191
|
//#region src/core/client.ts
|
|
2188
|
-
var
|
|
2192
|
+
var q = Dn({ url: N() });
|
|
2189
2193
|
//#endregion
|
|
2190
2194
|
//#region src/core/auth-api.ts
|
|
2191
|
-
async function
|
|
2192
|
-
let { data: t, success: n } = await
|
|
2195
|
+
async function On(e) {
|
|
2196
|
+
let { data: t, success: n } = await q.createRequest()({
|
|
2193
2197
|
endpoint: "/auth/cli/whoami",
|
|
2194
2198
|
method: "GET"
|
|
2195
2199
|
}).setHeaders({ Authorization: `Bearer ${e}` }).send();
|
|
2196
2200
|
return !n || !t ? null : t;
|
|
2197
2201
|
}
|
|
2198
|
-
async function
|
|
2199
|
-
await
|
|
2202
|
+
async function kn(e) {
|
|
2203
|
+
await q.createRequest()({
|
|
2200
2204
|
endpoint: "/auth/cli/token",
|
|
2201
2205
|
method: "DELETE"
|
|
2202
2206
|
}).setHeaders({ Authorization: `Bearer ${e}` }).send();
|
|
2203
2207
|
}
|
|
2204
2208
|
//#endregion
|
|
2205
2209
|
//#region src/core/auth-store.ts
|
|
2206
|
-
var
|
|
2207
|
-
function
|
|
2210
|
+
var An = 1, jn = "hype-stack", Mn = "auth.json";
|
|
2211
|
+
function Nn() {
|
|
2208
2212
|
let e = process.env.HYPE_STACK_CONFIG_DIR;
|
|
2209
|
-
if (e) return
|
|
2210
|
-
let t =
|
|
2213
|
+
if (e) return u.join(e, jn);
|
|
2214
|
+
let t = l.homedir();
|
|
2211
2215
|
if (process.platform === "win32") {
|
|
2212
|
-
let e = process.env.APPDATA ??
|
|
2213
|
-
return
|
|
2216
|
+
let e = process.env.APPDATA ?? u.join(t, "AppData", "Roaming");
|
|
2217
|
+
return u.join(e, jn);
|
|
2214
2218
|
}
|
|
2215
|
-
if (process.platform === "darwin") return
|
|
2216
|
-
let n = process.env.XDG_CONFIG_HOME ??
|
|
2217
|
-
return
|
|
2219
|
+
if (process.platform === "darwin") return u.join(t, "Library", "Application Support", jn);
|
|
2220
|
+
let n = process.env.XDG_CONFIG_HOME ?? u.join(t, ".config");
|
|
2221
|
+
return u.join(n, jn);
|
|
2218
2222
|
}
|
|
2219
|
-
function
|
|
2220
|
-
return
|
|
2223
|
+
function Pn() {
|
|
2224
|
+
return u.join(Nn(), Mn);
|
|
2221
2225
|
}
|
|
2222
|
-
async function
|
|
2223
|
-
let e = await
|
|
2226
|
+
async function Fn() {
|
|
2227
|
+
let e = await s.readFile(Pn(), "utf-8").catch(() => null);
|
|
2224
2228
|
if (!e) return {
|
|
2225
|
-
version:
|
|
2229
|
+
version: An,
|
|
2226
2230
|
tokens: {}
|
|
2227
2231
|
};
|
|
2228
2232
|
let t = JSON.parse(e);
|
|
2229
2233
|
return {
|
|
2230
|
-
version: t.version ??
|
|
2234
|
+
version: t.version ?? An,
|
|
2231
2235
|
tokens: t.tokens ?? {}
|
|
2232
2236
|
};
|
|
2233
2237
|
}
|
|
2234
|
-
async function Fn(e) {
|
|
2235
|
-
let t = Mn();
|
|
2236
|
-
await o.mkdir(t, { recursive: !0 }), await o.writeFile(Nn(), `${JSON.stringify(e, null, 2)}\n`, { mode: 384 });
|
|
2237
|
-
}
|
|
2238
2238
|
async function In(e) {
|
|
2239
|
-
|
|
2239
|
+
let t = Nn();
|
|
2240
|
+
await s.mkdir(t, { recursive: !0 }), await s.writeFile(Pn(), `${JSON.stringify(e, null, 2)}\n`, { mode: 384 });
|
|
2240
2241
|
}
|
|
2241
|
-
async function Ln(e
|
|
2242
|
-
|
|
2243
|
-
n.tokens[e] = t, await Fn(n);
|
|
2242
|
+
async function Ln(e) {
|
|
2243
|
+
return (await Fn()).tokens[e] ?? null;
|
|
2244
2244
|
}
|
|
2245
|
-
async function Rn(e) {
|
|
2246
|
-
let
|
|
2247
|
-
|
|
2245
|
+
async function Rn(e, t) {
|
|
2246
|
+
let n = await Fn();
|
|
2247
|
+
n.tokens[e] = t, await In(n);
|
|
2248
|
+
}
|
|
2249
|
+
async function zn(e) {
|
|
2250
|
+
let t = await Fn();
|
|
2251
|
+
e in t.tokens && (delete t.tokens[e], await In(t));
|
|
2248
2252
|
}
|
|
2249
2253
|
//#endregion
|
|
2250
2254
|
//#region src/core/device.ts
|
|
2251
|
-
function
|
|
2252
|
-
let e =
|
|
2255
|
+
function Bn() {
|
|
2256
|
+
let e = l.networkInterfaces();
|
|
2253
2257
|
for (let t of Object.values(e)) if (t) {
|
|
2254
2258
|
for (let e of t) if (!e.internal && e.mac !== "00:00:00:00:00:00") return e.mac;
|
|
2255
2259
|
}
|
|
2256
2260
|
return "unknown";
|
|
2257
2261
|
}
|
|
2258
|
-
function Bn() {
|
|
2259
|
-
let e = `${zn()}:${c.hostname()}:${c.platform()}:${c.arch()}`;
|
|
2260
|
-
return (0, pe.createHash)("sha256").update(e).digest("hex").slice(0, 16);
|
|
2261
|
-
}
|
|
2262
2262
|
function Vn() {
|
|
2263
|
-
|
|
2263
|
+
let e = `${Bn()}:${l.hostname()}:${l.platform()}:${l.arch()}`;
|
|
2264
|
+
return (0, me.createHash)("sha256").update(e).digest("hex").slice(0, 16);
|
|
2265
|
+
}
|
|
2266
|
+
function Hn() {
|
|
2267
|
+
return `hype-stack/${C} ${l.platform()} ${l.arch()} node/${process.version.slice(1)}`;
|
|
2264
2268
|
}
|
|
2265
2269
|
//#endregion
|
|
2266
2270
|
//#region src/core/open-browser.ts
|
|
2267
|
-
function
|
|
2268
|
-
|
|
2271
|
+
function Un(e) {
|
|
2272
|
+
d(process.platform === "darwin" ? `open "${e}"` : process.platform === "win32" ? `start "" "${e}"` : `xdg-open "${e}"`);
|
|
2269
2273
|
}
|
|
2270
2274
|
//#endregion
|
|
2271
2275
|
//#region src/core/login.ts
|
|
2272
|
-
var
|
|
2273
|
-
async function
|
|
2274
|
-
let t = (0,
|
|
2276
|
+
var Wn = 300 * 1e3, Gn = (e) => `<!doctype html><html><head><meta charset="utf-8"><title>Hype Stack CLI</title></head><body style="font-family:system-ui,sans-serif;text-align:center;padding-top:4rem;color:#111"><h2>${e}</h2><p>You can close this tab and return to your terminal.</p></body></html>`;
|
|
2277
|
+
async function Kn(e = {}) {
|
|
2278
|
+
let t = (0, me.randomBytes)(16).toString("hex"), n = N(), r = me.default.createServer(), i = await new Promise((n, i) => {
|
|
2275
2279
|
let a = setTimeout(() => {
|
|
2276
2280
|
o(), i(/* @__PURE__ */ Error("Login timed out. Run `hype-stack login` again."));
|
|
2277
|
-
},
|
|
2281
|
+
}, Wn);
|
|
2278
2282
|
function o() {
|
|
2279
2283
|
clearTimeout(a), r.close(), r.closeAllConnections?.();
|
|
2280
2284
|
}
|
|
@@ -2288,7 +2292,7 @@ async function Gn(e = {}) {
|
|
|
2288
2292
|
r.writeHead(200, {
|
|
2289
2293
|
"Content-Type": "text/html",
|
|
2290
2294
|
Connection: "close"
|
|
2291
|
-
}), r.end(
|
|
2295
|
+
}), r.end(Gn(e));
|
|
2292
2296
|
};
|
|
2293
2297
|
if (a.searchParams.get("state") !== t) {
|
|
2294
2298
|
s("Login failed."), o(), i(/* @__PURE__ */ Error("Login failed: state mismatch. Run `hype-stack login` again."));
|
|
@@ -2303,55 +2307,55 @@ async function Gn(e = {}) {
|
|
|
2303
2307
|
}), r.on("error", (e) => {
|
|
2304
2308
|
o(), i(e);
|
|
2305
2309
|
}), r.listen(0, "127.0.0.1", () => {
|
|
2306
|
-
let { port: n } = r.address(), i = encodeURIComponent(
|
|
2307
|
-
e.onUrl?.(a),
|
|
2310
|
+
let { port: n } = r.address(), i = encodeURIComponent(Hn()), a = `${P()}/cli/authorize?port=${n}&state=${t}&label=${i}`;
|
|
2311
|
+
e.onUrl?.(a), Un(a);
|
|
2308
2312
|
});
|
|
2309
|
-
}), a = await
|
|
2313
|
+
}), a = await On(i).catch(() => null), o = {
|
|
2310
2314
|
token: i,
|
|
2311
2315
|
email: a?.email,
|
|
2312
2316
|
organizationId: a?.organizationId
|
|
2313
2317
|
};
|
|
2314
|
-
return await
|
|
2318
|
+
return await Rn(n, o), o;
|
|
2315
2319
|
}
|
|
2316
2320
|
//#endregion
|
|
2317
2321
|
//#region src/core/access-prompts.ts
|
|
2318
|
-
async function
|
|
2319
|
-
let e = await
|
|
2320
|
-
if (
|
|
2321
|
-
|
|
2322
|
+
async function qn() {
|
|
2323
|
+
let e = await o.confirm({ message: "Log in to install packs your organization owns? (opens your browser)" });
|
|
2324
|
+
if (o.isCancel(e) || !e) return null;
|
|
2325
|
+
o.log.step("Opening your browser to sign in...");
|
|
2322
2326
|
try {
|
|
2323
|
-
let e = await
|
|
2324
|
-
|
|
2327
|
+
let e = await Kn({ onUrl: (e) => {
|
|
2328
|
+
o.log.info(`If your browser didn't open, visit:\n ${R.path(e)}`);
|
|
2325
2329
|
} });
|
|
2326
|
-
return
|
|
2330
|
+
return o.log.success(e.email ? `Logged in as ${e.email}` : "Logged in"), e.token;
|
|
2327
2331
|
} catch (e) {
|
|
2328
|
-
return
|
|
2332
|
+
return o.log.error(e instanceof Error ? e.message : String(e)), null;
|
|
2329
2333
|
}
|
|
2330
2334
|
}
|
|
2331
|
-
async function
|
|
2335
|
+
async function Jn(e) {
|
|
2332
2336
|
if (e.length === 0) return;
|
|
2333
|
-
|
|
2337
|
+
o.note([
|
|
2334
2338
|
"These packs need a purchase before they can be installed:",
|
|
2335
2339
|
"",
|
|
2336
|
-
...e.map((e) => ` ${
|
|
2340
|
+
...e.map((e) => ` ${R.brand(e.displayName)} ${R.highlight(`$${e.price}`)}`)
|
|
2337
2341
|
].join("\n"), "Locked Packs");
|
|
2338
|
-
let t = await
|
|
2339
|
-
if (
|
|
2340
|
-
|
|
2342
|
+
let t = await o.confirm({ message: `Open the purchase ${e.length === 1 ? "page" : "pages"} in your browser?` });
|
|
2343
|
+
if (o.isCancel(t) || !t) {
|
|
2344
|
+
o.log.info(R.muted("Run 'hype-stack login' after purchasing, then 'hype-stack compose' again."));
|
|
2341
2345
|
return;
|
|
2342
2346
|
}
|
|
2343
|
-
for (let t of e)
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
` ${
|
|
2347
|
-
` ${
|
|
2347
|
+
for (let t of e) Un(pe(t.name));
|
|
2348
|
+
o.log.info([
|
|
2349
|
+
R.muted("After purchasing, run:"),
|
|
2350
|
+
` ${R.highlight("hype-stack login")} ${R.muted("Save your access")}`,
|
|
2351
|
+
` ${R.highlight("hype-stack compose")} ${R.muted("Install the packs")}`
|
|
2348
2352
|
].join("\n"));
|
|
2349
2353
|
}
|
|
2350
2354
|
//#endregion
|
|
2351
2355
|
//#region src/utils/exec.ts
|
|
2352
|
-
function
|
|
2356
|
+
function J(e, t, n) {
|
|
2353
2357
|
return new Promise((r, i) => {
|
|
2354
|
-
let a =
|
|
2358
|
+
let a = f(e, t, {
|
|
2355
2359
|
cwd: n.cwd,
|
|
2356
2360
|
stdio: [
|
|
2357
2361
|
"ignore",
|
|
@@ -2382,70 +2386,73 @@ function q(e, t, n) {
|
|
|
2382
2386
|
}
|
|
2383
2387
|
//#endregion
|
|
2384
2388
|
//#region src/utils/fs.ts
|
|
2385
|
-
async function Jn(e) {
|
|
2386
|
-
return (await o.stat(e).catch(() => null))?.isDirectory() ?? !1;
|
|
2387
|
-
}
|
|
2388
|
-
async function J(e) {
|
|
2389
|
-
return (await o.stat(e).catch(() => null))?.isFile() ?? !1;
|
|
2390
|
-
}
|
|
2391
2389
|
async function Yn(e) {
|
|
2392
|
-
return (await
|
|
2390
|
+
return (await s.stat(e).catch(() => null))?.isDirectory() ?? !1;
|
|
2391
|
+
}
|
|
2392
|
+
async function Y(e) {
|
|
2393
|
+
return (await s.stat(e).catch(() => null))?.isFile() ?? !1;
|
|
2393
2394
|
}
|
|
2394
2395
|
async function Xn(e) {
|
|
2395
|
-
|
|
2396
|
+
return (await s.readdir(e).catch(() => [])).length === 0;
|
|
2397
|
+
}
|
|
2398
|
+
async function Zn(e) {
|
|
2399
|
+
let t = await s.readFile(e, "utf-8").catch(() => null);
|
|
2396
2400
|
return t ? JSON.parse(t) : null;
|
|
2397
2401
|
}
|
|
2398
|
-
async function
|
|
2399
|
-
await
|
|
2402
|
+
async function Qn(e, t) {
|
|
2403
|
+
await s.writeFile(e, JSON.stringify(t, null, 2) + "\n", "utf-8");
|
|
2400
2404
|
}
|
|
2401
|
-
async function
|
|
2405
|
+
async function $n(e) {
|
|
2402
2406
|
let t = {};
|
|
2403
|
-
if (!await
|
|
2404
|
-
let n = await
|
|
2405
|
-
for (let r of n) r.isDirectory() && await
|
|
2407
|
+
if (!await Yn(e)) return t;
|
|
2408
|
+
let n = await s.readdir(e, { withFileTypes: !0 });
|
|
2409
|
+
for (let r of n) r.isDirectory() && await Y(u.join(e, r.name, "package.json")) && (t[r.name] = u.relative(u.dirname(e), u.join(e, r.name)));
|
|
2406
2410
|
return t;
|
|
2407
2411
|
}
|
|
2408
|
-
async function
|
|
2409
|
-
await
|
|
2412
|
+
async function er(e) {
|
|
2413
|
+
await s.rm(e, {
|
|
2410
2414
|
recursive: !0,
|
|
2411
2415
|
force: !0
|
|
2412
2416
|
});
|
|
2413
2417
|
}
|
|
2418
|
+
function tr(e, t) {
|
|
2419
|
+
return u.basename(e) === t ? e : u.join(e, t);
|
|
2420
|
+
}
|
|
2414
2421
|
//#endregion
|
|
2415
2422
|
//#region src/core/codegen.ts
|
|
2416
|
-
function
|
|
2417
|
-
|
|
2418
|
-
`${
|
|
2419
|
-
`${
|
|
2420
|
-
`${
|
|
2423
|
+
function nr(e) {
|
|
2424
|
+
o.log.info(R.muted("Run database setup yourself when ready:")), o.note([
|
|
2425
|
+
`${R.command(`cd ${e}`)}`,
|
|
2426
|
+
`${R.command("pnpm exec prisma generate")} ${R.muted("(regenerate the Prisma client)")}`,
|
|
2427
|
+
`${R.command("pnpm exec prisma migrate dev")} ${R.muted("(create + apply tables for new packs)")}`
|
|
2421
2428
|
].join("\n"), "Database Setup");
|
|
2422
2429
|
}
|
|
2423
|
-
async function
|
|
2424
|
-
let { projectRoot: t, paths: n, skipPrompts: r, runCommand: i =
|
|
2425
|
-
if (!await
|
|
2430
|
+
async function rr(e) {
|
|
2431
|
+
let { projectRoot: t, paths: n, skipPrompts: r, runCommand: i = J } = e, a = n.backend.root, s = u.join(t, a);
|
|
2432
|
+
if (!await Y(u.join(s, "package.json"))) return;
|
|
2426
2433
|
if (r) {
|
|
2427
|
-
|
|
2434
|
+
nr(a);
|
|
2428
2435
|
return;
|
|
2429
2436
|
}
|
|
2430
|
-
let c = await
|
|
2431
|
-
message: `Run database setup now? (${
|
|
2437
|
+
let c = await o.confirm({
|
|
2438
|
+
message: `Run database setup now? (${R.command("prisma generate")} + ${R.command("prisma migrate")})`,
|
|
2432
2439
|
initialValue: !0
|
|
2433
2440
|
});
|
|
2434
|
-
if (
|
|
2435
|
-
|
|
2441
|
+
if (o.isCancel(c) || !c) {
|
|
2442
|
+
nr(a);
|
|
2436
2443
|
return;
|
|
2437
2444
|
}
|
|
2438
|
-
let
|
|
2439
|
-
if (
|
|
2445
|
+
let l = o.spinner();
|
|
2446
|
+
if (l.start("Generating Prisma client..."), (await i("pnpm", [
|
|
2440
2447
|
"exec",
|
|
2441
2448
|
"prisma",
|
|
2442
2449
|
"generate"
|
|
2443
2450
|
], { cwd: s })).exitCode !== 0) {
|
|
2444
|
-
|
|
2451
|
+
l.stop(R.warning("Prisma client generation failed")), nr(a);
|
|
2445
2452
|
return;
|
|
2446
2453
|
}
|
|
2447
|
-
|
|
2448
|
-
let d =
|
|
2454
|
+
l.stop(R.success("Prisma client generated"));
|
|
2455
|
+
let d = o.spinner();
|
|
2449
2456
|
if (d.start("Applying database schema..."), (await i("pnpm", [
|
|
2450
2457
|
"exec",
|
|
2451
2458
|
"prisma",
|
|
@@ -2454,30 +2461,30 @@ async function tr(e) {
|
|
|
2454
2461
|
"--name",
|
|
2455
2462
|
"add-packs"
|
|
2456
2463
|
], { cwd: s })).exitCode !== 0) {
|
|
2457
|
-
d.stop(
|
|
2464
|
+
d.stop(R.warning("Database migration failed (is your database running?)")), nr(a);
|
|
2458
2465
|
return;
|
|
2459
2466
|
}
|
|
2460
|
-
d.stop(
|
|
2467
|
+
d.stop(R.success("Database schema applied"));
|
|
2461
2468
|
}
|
|
2462
2469
|
//#endregion
|
|
2463
2470
|
//#region src/core/stack-config.ts
|
|
2464
|
-
async function
|
|
2465
|
-
return
|
|
2471
|
+
async function ir(e) {
|
|
2472
|
+
return Zn(u.join(e, T));
|
|
2466
2473
|
}
|
|
2467
|
-
async function
|
|
2468
|
-
return
|
|
2474
|
+
async function ar(e) {
|
|
2475
|
+
return Y(u.join(e, T));
|
|
2469
2476
|
}
|
|
2470
|
-
async function
|
|
2471
|
-
await
|
|
2477
|
+
async function or(e, t) {
|
|
2478
|
+
await Qn(u.join(e, T), t);
|
|
2472
2479
|
}
|
|
2473
|
-
async function
|
|
2474
|
-
let t =
|
|
2480
|
+
async function sr(e) {
|
|
2481
|
+
let t = u.join(e, "apps"), n = u.join(e, "packages"), [r, i] = await Promise.all([$n(t), $n(n)]);
|
|
2475
2482
|
return {
|
|
2476
2483
|
apps: r,
|
|
2477
2484
|
packages: i
|
|
2478
2485
|
};
|
|
2479
2486
|
}
|
|
2480
|
-
function
|
|
2487
|
+
function cr(e) {
|
|
2481
2488
|
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";
|
|
2482
2489
|
return {
|
|
2483
2490
|
backend: {
|
|
@@ -2511,23 +2518,23 @@ function or(e) {
|
|
|
2511
2518
|
}
|
|
2512
2519
|
};
|
|
2513
2520
|
}
|
|
2514
|
-
function
|
|
2521
|
+
function lr(e, t) {
|
|
2515
2522
|
return {
|
|
2516
2523
|
$schema: re(),
|
|
2517
2524
|
version: 1,
|
|
2518
2525
|
name: e,
|
|
2519
2526
|
apps: t.apps,
|
|
2520
2527
|
packages: t.packages,
|
|
2521
|
-
paths:
|
|
2528
|
+
paths: cr(t),
|
|
2522
2529
|
installedPacks: [],
|
|
2523
2530
|
licenseKey: null
|
|
2524
2531
|
};
|
|
2525
2532
|
}
|
|
2526
|
-
async function
|
|
2527
|
-
let t =
|
|
2533
|
+
async function ur(e) {
|
|
2534
|
+
let t = u.join(e, "package.json"), n = u.join(e, "apps"), [r, i] = await Promise.all([Y(t), Yn(n)]);
|
|
2528
2535
|
return r && i;
|
|
2529
2536
|
}
|
|
2530
|
-
function
|
|
2537
|
+
function X(e, t) {
|
|
2531
2538
|
return e.replace(/\{\{(\w+)\.(\w+)\}\}/g, (n, r, i) => {
|
|
2532
2539
|
let a = t[r];
|
|
2533
2540
|
if (!a) throw Error(`Unknown app "${r}" in path template "${e}"`);
|
|
@@ -2538,8 +2545,8 @@ function Y(e, t) {
|
|
|
2538
2545
|
}
|
|
2539
2546
|
//#endregion
|
|
2540
2547
|
//#region src/core/registry.ts
|
|
2541
|
-
async function
|
|
2542
|
-
let { data: t, error: n, status: r } = await
|
|
2548
|
+
async function dr(e) {
|
|
2549
|
+
let { data: t, error: n, status: r } = await q.createRequest()({
|
|
2543
2550
|
endpoint: `/packs/${encodeURIComponent(e)}/manifest`,
|
|
2544
2551
|
method: "GET"
|
|
2545
2552
|
}).send();
|
|
@@ -2547,51 +2554,51 @@ async function lr(e) {
|
|
|
2547
2554
|
if (n || !t) throw Error(`Failed to load manifest for "${e}": ${String(n)}`);
|
|
2548
2555
|
return t;
|
|
2549
2556
|
}
|
|
2550
|
-
async function
|
|
2551
|
-
let n =
|
|
2557
|
+
async function fr(e, t = {}) {
|
|
2558
|
+
let n = q.createRequest()({
|
|
2552
2559
|
endpoint: `/packs/${encodeURIComponent(e)}/download`,
|
|
2553
2560
|
method: "POST"
|
|
2554
2561
|
}), r = {
|
|
2555
|
-
"X-Device-Id":
|
|
2556
|
-
"X-Client-Info":
|
|
2562
|
+
"X-Device-Id": Vn(),
|
|
2563
|
+
"X-Client-Info": Hn()
|
|
2557
2564
|
};
|
|
2558
2565
|
t.token && (r.Authorization = `Bearer ${t.token}`);
|
|
2559
|
-
let { data: i, error: a, success:
|
|
2560
|
-
if (!
|
|
2566
|
+
let { data: i, error: a, success: o } = await n.setPayload({ key: t.licenseKey ?? void 0 }).setHeaders(r).send();
|
|
2567
|
+
if (!o || !i) throw Error(`Failed to download pack "${e}": ${String(a)}`);
|
|
2561
2568
|
if (!i.ok) return {
|
|
2562
2569
|
status: "denied",
|
|
2563
2570
|
reason: i.reason,
|
|
2564
2571
|
packs: i.packs ?? [],
|
|
2565
2572
|
expiresAt: i.expiresAt ?? null
|
|
2566
2573
|
};
|
|
2567
|
-
let
|
|
2574
|
+
let c = await s.mkdtemp(u.join(l.tmpdir(), `hype-stack-pack-${e}-`));
|
|
2568
2575
|
return await Promise.all(i.files.map(async (e) => {
|
|
2569
|
-
let t =
|
|
2570
|
-
await
|
|
2576
|
+
let t = u.join(c, ...e.path.split("/"));
|
|
2577
|
+
await s.mkdir(u.dirname(t), { recursive: !0 }), await s.writeFile(t, Buffer.from(e.content, "base64"));
|
|
2571
2578
|
})), {
|
|
2572
2579
|
status: "ok",
|
|
2573
|
-
packDir:
|
|
2580
|
+
packDir: c
|
|
2574
2581
|
};
|
|
2575
2582
|
}
|
|
2576
|
-
function
|
|
2577
|
-
let r =
|
|
2578
|
-
return
|
|
2583
|
+
function pr(e, t, n) {
|
|
2584
|
+
let r = X(e, t);
|
|
2585
|
+
return u.resolve(n, r);
|
|
2579
2586
|
}
|
|
2580
|
-
function
|
|
2581
|
-
return
|
|
2587
|
+
function mr(e, t) {
|
|
2588
|
+
return u.join(t, e);
|
|
2582
2589
|
}
|
|
2583
|
-
var
|
|
2590
|
+
var hr = q.createRequest()({
|
|
2584
2591
|
endpoint: "/packs/list",
|
|
2585
2592
|
method: "GET"
|
|
2586
2593
|
});
|
|
2587
|
-
async function
|
|
2588
|
-
let { data: e, error: t } = await
|
|
2594
|
+
async function gr() {
|
|
2595
|
+
let { data: e, error: t } = await hr.send();
|
|
2589
2596
|
if (t || !e) throw Error(`Failed to fetch pack list: ${String(t)}`);
|
|
2590
2597
|
return e.packs;
|
|
2591
2598
|
}
|
|
2592
|
-
async function
|
|
2599
|
+
async function _r(e, t = {}) {
|
|
2593
2600
|
if (e.length === 0) return {};
|
|
2594
|
-
let n =
|
|
2601
|
+
let n = q.createRequest()({
|
|
2595
2602
|
endpoint: "/packs/authorize",
|
|
2596
2603
|
method: "POST"
|
|
2597
2604
|
}), r = {};
|
|
@@ -2605,35 +2612,35 @@ async function hr(e, t = {}) {
|
|
|
2605
2612
|
}
|
|
2606
2613
|
//#endregion
|
|
2607
2614
|
//#region src/core/codemods.ts
|
|
2608
|
-
var
|
|
2609
|
-
function
|
|
2610
|
-
return
|
|
2615
|
+
var vr = "@hype-stack/";
|
|
2616
|
+
function yr(e, t) {
|
|
2617
|
+
return X(e === "admin" ? "{{admin.root}}" : "{{frontend.root}}", t);
|
|
2611
2618
|
}
|
|
2612
|
-
async function
|
|
2613
|
-
let r =
|
|
2614
|
-
if (await
|
|
2615
|
-
let t = await
|
|
2616
|
-
for (let n of e) t.includes(`from "${n.from}"`) || (t =
|
|
2617
|
-
await
|
|
2619
|
+
async function br(e, t, n) {
|
|
2620
|
+
let r = X("{{backend.root}}", t), i = u.resolve(n, r, "src/config/env/env.config.ts"), a = u.resolve(n, r, ".env.example"), o = u.resolve(n, r, ".env.test");
|
|
2621
|
+
if (await Y(i)) {
|
|
2622
|
+
let t = await s.readFile(i, "utf-8");
|
|
2623
|
+
for (let n of e) t.includes(`from "${n.from}"`) || (t = xr(t, n), t = Sr(t, n));
|
|
2624
|
+
await s.writeFile(i, t, "utf-8");
|
|
2618
2625
|
}
|
|
2619
|
-
if (await
|
|
2620
|
-
let t = await
|
|
2621
|
-
for (let n of e) t =
|
|
2622
|
-
await
|
|
2626
|
+
if (await Y(a)) {
|
|
2627
|
+
let t = await s.readFile(a, "utf-8");
|
|
2628
|
+
for (let n of e) t = Cr(t, n);
|
|
2629
|
+
await s.writeFile(a, t, "utf-8");
|
|
2623
2630
|
}
|
|
2624
|
-
if (await
|
|
2625
|
-
let t = await
|
|
2626
|
-
for (let n of e) t =
|
|
2627
|
-
await
|
|
2631
|
+
if (await Y(o)) {
|
|
2632
|
+
let t = await s.readFile(o, "utf-8");
|
|
2633
|
+
for (let n of e) t = wr(t, n);
|
|
2634
|
+
await s.writeFile(o, t, "utf-8");
|
|
2628
2635
|
}
|
|
2629
2636
|
}
|
|
2630
|
-
function
|
|
2637
|
+
function xr(e, t) {
|
|
2631
2638
|
let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("import ");
|
|
2632
2639
|
if (r === -1) return n + "\n" + e;
|
|
2633
2640
|
let i = e.indexOf("\n", e.indexOf(";", r));
|
|
2634
2641
|
return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
|
|
2635
2642
|
}
|
|
2636
|
-
function
|
|
2643
|
+
function Sr(e, t) {
|
|
2637
2644
|
let n = `.extend(${t.import}.shape)`;
|
|
2638
2645
|
if (e.includes(n)) return e;
|
|
2639
2646
|
let r = e.indexOf("export const envSchema = z.object({");
|
|
@@ -2648,27 +2655,27 @@ function br(e, t) {
|
|
|
2648
2655
|
let o = a + 2;
|
|
2649
2656
|
return e.slice(0, o) + n + e.slice(o);
|
|
2650
2657
|
}
|
|
2651
|
-
function
|
|
2658
|
+
function Cr(e, t) {
|
|
2652
2659
|
for (let n of Object.keys(t.envExample.vars)) if (e.includes(`${n}=`)) return e;
|
|
2653
2660
|
let n = [];
|
|
2654
2661
|
n.push(""), n.push(`# ${t.envExample.section}`);
|
|
2655
2662
|
for (let [e, r] of Object.entries(t.envExample.vars)) n.push(`${e}=${r}`);
|
|
2656
2663
|
return e.trimEnd() + "\n" + n.join("\n") + "\n";
|
|
2657
2664
|
}
|
|
2658
|
-
function
|
|
2665
|
+
function wr(e, t) {
|
|
2659
2666
|
for (let n of Object.keys(t.envTest)) if (e.includes(`${n}=`)) return e;
|
|
2660
2667
|
let n = [""];
|
|
2661
2668
|
for (let [e, r] of Object.entries(t.envTest)) n.push(`${e}=${r}`);
|
|
2662
2669
|
return e.trimEnd() + "\n" + n.join("\n") + "\n";
|
|
2663
2670
|
}
|
|
2664
|
-
async function
|
|
2665
|
-
let r =
|
|
2666
|
-
if (!await
|
|
2667
|
-
let i = await
|
|
2668
|
-
for (let t of e) i.includes(`from "${t.from}"`) || (i =
|
|
2669
|
-
await
|
|
2671
|
+
async function Tr(e, t, n) {
|
|
2672
|
+
let r = u.resolve(n, X("{{backend.routes}}", t), "index.ts");
|
|
2673
|
+
if (!await Y(r)) return;
|
|
2674
|
+
let i = await s.readFile(r, "utf-8");
|
|
2675
|
+
for (let t of e) i.includes(`from "${t.from}"`) || (i = Er(i, t), i = Dr(i, t));
|
|
2676
|
+
await s.writeFile(r, i, "utf-8");
|
|
2670
2677
|
}
|
|
2671
|
-
function
|
|
2678
|
+
function Er(e, t) {
|
|
2672
2679
|
let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("from \"./");
|
|
2673
2680
|
if (r !== -1) {
|
|
2674
2681
|
let t = e.indexOf("\n", r);
|
|
@@ -2677,7 +2684,7 @@ function wr(e, t) {
|
|
|
2677
2684
|
let i = e.indexOf("export const registerRoutes");
|
|
2678
2685
|
return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
|
|
2679
2686
|
}
|
|
2680
|
-
function
|
|
2687
|
+
function Dr(e, t) {
|
|
2681
2688
|
let n = `.route("${t.prefix}", ${t.import})`, r = e.match(/\.route\([^)]+\);/g);
|
|
2682
2689
|
if (r) {
|
|
2683
2690
|
let t = r[r.length - 1], i = e.lastIndexOf(t) + t.length - 1;
|
|
@@ -2685,14 +2692,14 @@ function Tr(e, t) {
|
|
|
2685
2692
|
}
|
|
2686
2693
|
return e.replace("return app;", `return app\n ${n};`);
|
|
2687
2694
|
}
|
|
2688
|
-
async function
|
|
2689
|
-
let r =
|
|
2690
|
-
if (!await
|
|
2691
|
-
let i = await
|
|
2692
|
-
for (let t of e) i.includes(`export let ${t.export}`) || (i =
|
|
2693
|
-
await
|
|
2695
|
+
async function Or(e, t, n) {
|
|
2696
|
+
let r = u.resolve(n, X("{{backend.root}}", t), "src/context.ts");
|
|
2697
|
+
if (!await Y(r)) return;
|
|
2698
|
+
let i = await s.readFile(r, "utf-8");
|
|
2699
|
+
for (let t of e) i.includes(`export let ${t.export}`) || (i = kr(i, t), i = Ar(i, t), i = jr(i, t), i = Nr(i, t));
|
|
2700
|
+
await s.writeFile(r, i, "utf-8");
|
|
2694
2701
|
}
|
|
2695
|
-
function
|
|
2702
|
+
function kr(e, t) {
|
|
2696
2703
|
let n = `import { ${t.typeImport.name} } from "${t.typeImport.from}";`;
|
|
2697
2704
|
if (e.includes(`from "${t.typeImport.from}"`)) return e;
|
|
2698
2705
|
let r = e.lastIndexOf("import ");
|
|
@@ -2700,7 +2707,7 @@ function Dr(e, t) {
|
|
|
2700
2707
|
let i = e.indexOf("\n", e.indexOf(";", r));
|
|
2701
2708
|
return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
|
|
2702
2709
|
}
|
|
2703
|
-
function
|
|
2710
|
+
function Ar(e, t) {
|
|
2704
2711
|
let n = `export let ${t.export}: ${t.type};`, r = e.lastIndexOf("export let ");
|
|
2705
2712
|
if (r === -1) {
|
|
2706
2713
|
let t = e.indexOf("export const setupContext");
|
|
@@ -2709,15 +2716,15 @@ function Or(e, t) {
|
|
|
2709
2716
|
let i = e.indexOf("\n", r);
|
|
2710
2717
|
return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
|
|
2711
2718
|
}
|
|
2712
|
-
function
|
|
2719
|
+
function jr(e, t) {
|
|
2713
2720
|
let n = ` ${t.export} = ${t.init};`, r = e.match(/export const setupContext\s*=\s*async\s*\([^)]*\)\s*=>\s*\{/);
|
|
2714
2721
|
if (!r) return e;
|
|
2715
2722
|
let i = e.indexOf("{", e.indexOf(r[0]));
|
|
2716
2723
|
if (i === -1) return e;
|
|
2717
|
-
let a =
|
|
2724
|
+
let a = Mr(e, i);
|
|
2718
2725
|
return a === -1 ? e : e.slice(0, a) + n + "\n" + e.slice(a);
|
|
2719
2726
|
}
|
|
2720
|
-
function
|
|
2727
|
+
function Mr(e, t) {
|
|
2721
2728
|
let n = 0;
|
|
2722
2729
|
for (let r = t; r < e.length; r++) {
|
|
2723
2730
|
let t = e[r];
|
|
@@ -2726,20 +2733,20 @@ function Ar(e, t) {
|
|
|
2726
2733
|
}
|
|
2727
2734
|
return -1;
|
|
2728
2735
|
}
|
|
2729
|
-
function
|
|
2736
|
+
function Nr(e, t) {
|
|
2730
2737
|
let n = ` ${t.export}: ${t.type};`, r = e.indexOf("export type ContextVariables = {");
|
|
2731
2738
|
if (r === -1) return e;
|
|
2732
2739
|
let i = e.indexOf("};", r);
|
|
2733
2740
|
return i === -1 ? e : e.slice(0, i) + n + "\n" + e.slice(i);
|
|
2734
2741
|
}
|
|
2735
|
-
async function
|
|
2736
|
-
let r =
|
|
2737
|
-
if (!await
|
|
2738
|
-
let i = await
|
|
2739
|
-
for (let t of e) i.includes(`from "${t.from}"`) || (i =
|
|
2740
|
-
await
|
|
2742
|
+
async function Pr(e, t, n) {
|
|
2743
|
+
let r = u.resolve(n, X("{{enums.src}}", t), "index.ts");
|
|
2744
|
+
if (!await Y(r)) return;
|
|
2745
|
+
let i = await s.readFile(r, "utf-8");
|
|
2746
|
+
for (let t of e) i.includes(`from "${t.from}"`) || (i = Fr(i, t));
|
|
2747
|
+
await s.writeFile(r, i, "utf-8");
|
|
2741
2748
|
}
|
|
2742
|
-
function
|
|
2749
|
+
function Fr(e, t) {
|
|
2743
2750
|
let n = `export * from "${t.from}";`, r = e.lastIndexOf("export * from");
|
|
2744
2751
|
if (r !== -1) {
|
|
2745
2752
|
let t = e.indexOf("\n", r);
|
|
@@ -2747,14 +2754,14 @@ function Nr(e, t) {
|
|
|
2747
2754
|
}
|
|
2748
2755
|
return e.trim() === "" ? n + "\n" : e.trimEnd() + "\n" + n + "\n";
|
|
2749
2756
|
}
|
|
2750
|
-
async function
|
|
2751
|
-
let r =
|
|
2752
|
-
if (!await
|
|
2753
|
-
let a = await
|
|
2754
|
-
for (let t of e) a.includes(`from "${t.from}"`) || (a =
|
|
2755
|
-
await
|
|
2757
|
+
async function Ir(e, t, n) {
|
|
2758
|
+
let r = X("{{backend.root}}", t), i = u.resolve(n, r, "src/sockets/index.ts");
|
|
2759
|
+
if (!await Y(i)) return;
|
|
2760
|
+
let a = await s.readFile(i, "utf-8");
|
|
2761
|
+
for (let t of e) a.includes(`from "${t.from}"`) || (a = Lr(a, t), a = Rr(a, t));
|
|
2762
|
+
await Y(u.resolve(n, r, "src/libs/websocket/ws-authenticate.ts")) && (a = zr(a)), await s.writeFile(i, a, "utf-8");
|
|
2756
2763
|
}
|
|
2757
|
-
function
|
|
2764
|
+
function Lr(e, t) {
|
|
2758
2765
|
let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("from \"./");
|
|
2759
2766
|
if (r !== -1) {
|
|
2760
2767
|
let t = e.indexOf("\n", r);
|
|
@@ -2763,7 +2770,7 @@ function Fr(e, t) {
|
|
|
2763
2770
|
let i = e.indexOf("const sockets");
|
|
2764
2771
|
return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
|
|
2765
2772
|
}
|
|
2766
|
-
function
|
|
2773
|
+
function Rr(e, t) {
|
|
2767
2774
|
let n = `.socket("${t.prefix}", ${t.import})`, r = e.indexOf("const sockets");
|
|
2768
2775
|
if (r === -1) return e;
|
|
2769
2776
|
let i = e.indexOf("new SocketRouter", r);
|
|
@@ -2777,7 +2784,7 @@ function Ir(e, t) {
|
|
|
2777
2784
|
}
|
|
2778
2785
|
return e;
|
|
2779
2786
|
}
|
|
2780
|
-
function
|
|
2787
|
+
function zr(e) {
|
|
2781
2788
|
if (e.includes("wsAuthenticate")) return e;
|
|
2782
2789
|
let t = e.indexOf("from \"@backend/libs/websocket/socket-router\""), n = e;
|
|
2783
2790
|
if (t !== -1) {
|
|
@@ -2786,14 +2793,14 @@ function Lr(e) {
|
|
|
2786
2793
|
}
|
|
2787
2794
|
return n.replace("new SocketRouter()", "new SocketRouter({ authenticate: wsAuthenticate })");
|
|
2788
2795
|
}
|
|
2789
|
-
async function
|
|
2790
|
-
let r =
|
|
2791
|
-
if (!await
|
|
2792
|
-
let a = await
|
|
2793
|
-
for (let t of e) a.includes(`.$configure(${t.import})`) || (a =
|
|
2794
|
-
await
|
|
2796
|
+
async function Br(e, t, n) {
|
|
2797
|
+
let r = X("{{frontend.root}}", t), i = u.resolve(n, r, "src/api/sdk.ts");
|
|
2798
|
+
if (!await Y(i)) return;
|
|
2799
|
+
let a = await s.readFile(i, "utf-8");
|
|
2800
|
+
for (let t of e) a.includes(`.$configure(${t.import})`) || (a = Vr(a, t), a = Hr(a, t));
|
|
2801
|
+
await s.writeFile(i, a, "utf-8");
|
|
2795
2802
|
}
|
|
2796
|
-
function
|
|
2803
|
+
function Vr(e, t) {
|
|
2797
2804
|
let n = `import { ${t.import} } from "${t.from}";`;
|
|
2798
2805
|
if (e.includes(n)) return e;
|
|
2799
2806
|
let r = e.lastIndexOf("from \"./");
|
|
@@ -2804,57 +2811,57 @@ function zr(e, t) {
|
|
|
2804
2811
|
let i = e.indexOf("export const sdk");
|
|
2805
2812
|
return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
|
|
2806
2813
|
}
|
|
2807
|
-
function
|
|
2814
|
+
function Hr(e, t) {
|
|
2808
2815
|
let n = `.$configure(${t.import})`, r = e.indexOf("export const sdk");
|
|
2809
2816
|
if (r === -1) return e;
|
|
2810
2817
|
let i = e.indexOf(";", r);
|
|
2811
2818
|
return i === -1 ? e : e.slice(0, i) + "\n " + n + e.slice(i);
|
|
2812
2819
|
}
|
|
2813
|
-
async function
|
|
2814
|
-
let r =
|
|
2815
|
-
if (!await
|
|
2816
|
-
let i = await
|
|
2817
|
-
for (let t of e) i.includes(`"${t.path}"`) || (i =
|
|
2818
|
-
await
|
|
2820
|
+
async function Ur(e, t, n) {
|
|
2821
|
+
let r = u.resolve(n, X("{{backend.utils}}", t), "frontend-url/frontend-url.ts");
|
|
2822
|
+
if (!await Y(r)) return;
|
|
2823
|
+
let i = await s.readFile(r, "utf-8");
|
|
2824
|
+
for (let t of e) i.includes(`"${t.path}"`) || (i = Wr(i, t));
|
|
2825
|
+
await s.writeFile(r, i, "utf-8");
|
|
2819
2826
|
}
|
|
2820
|
-
function
|
|
2827
|
+
function Wr(e, t) {
|
|
2821
2828
|
let n = ` "${t.path}": ${t.search};`, r = e.indexOf("type RouteDefinitions = {");
|
|
2822
2829
|
if (r === -1) return e;
|
|
2823
2830
|
let i = e.indexOf("};", r);
|
|
2824
2831
|
return i === -1 ? e : e.slice(0, i) + n + "\n" + e.slice(i);
|
|
2825
2832
|
}
|
|
2826
|
-
var
|
|
2833
|
+
var Gr = "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", Kr = {
|
|
2827
2834
|
primary: "primaryNav",
|
|
2828
2835
|
secondary: "secondaryNav",
|
|
2829
2836
|
tertiary: "tertiaryNav",
|
|
2830
2837
|
settings: "settingsNav"
|
|
2831
2838
|
};
|
|
2832
|
-
async function
|
|
2833
|
-
let { entries: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a =
|
|
2834
|
-
await
|
|
2835
|
-
for (let e of t) c.includes(`label: "${e.label}"`) || (c =
|
|
2836
|
-
for (let e of t.toReversed()) c.includes(`label: "${e.label}"`) || (c =
|
|
2837
|
-
await
|
|
2838
|
-
}
|
|
2839
|
-
async function
|
|
2840
|
-
let { postLoginRedirect: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a =
|
|
2841
|
-
if (!await
|
|
2842
|
-
let c = await
|
|
2843
|
-
if (!
|
|
2844
|
-
let d = c.replace(
|
|
2845
|
-
await
|
|
2846
|
-
}
|
|
2847
|
-
function
|
|
2839
|
+
async function qr(e) {
|
|
2840
|
+
let { entries: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a = yr(i, n), o = u.resolve(r, a, "src/constants/nav.constants.ts"), c;
|
|
2841
|
+
await Y(o) ? c = await s.readFile(o, "utf-8") : (await s.mkdir(u.dirname(o), { recursive: !0 }), c = Gr);
|
|
2842
|
+
for (let e of t) c.includes(`label: "${e.label}"`) || (c = Xr(c, e));
|
|
2843
|
+
for (let e of t.toReversed()) c.includes(`label: "${e.label}"`) || (c = Qr(c, e));
|
|
2844
|
+
await s.writeFile(o, c, "utf-8");
|
|
2845
|
+
}
|
|
2846
|
+
async function Jr(e) {
|
|
2847
|
+
let { postLoginRedirect: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a = yr(i, n), o = u.resolve(r, a, "src/features/auth/constants/auth.constants.ts");
|
|
2848
|
+
if (!await Y(o)) return;
|
|
2849
|
+
let c = await s.readFile(o, "utf-8"), l = /export const POST_LOGIN_REDIRECT_PATH = "[^"]*";/;
|
|
2850
|
+
if (!l.test(c)) return;
|
|
2851
|
+
let d = c.replace(l, `export const POST_LOGIN_REDIRECT_PATH = "${t}";`);
|
|
2852
|
+
await s.writeFile(o, d, "utf-8");
|
|
2853
|
+
}
|
|
2854
|
+
function Yr(e) {
|
|
2848
2855
|
let t = [e.icon];
|
|
2849
2856
|
if (e.items) for (let n of e.items) t.includes(n.icon) || t.push(n.icon);
|
|
2850
2857
|
return t;
|
|
2851
2858
|
}
|
|
2852
|
-
function
|
|
2853
|
-
let n =
|
|
2854
|
-
for (let e of n) r =
|
|
2859
|
+
function Xr(e, t) {
|
|
2860
|
+
let n = Yr(t), r = e;
|
|
2861
|
+
for (let e of n) r = Zr(r, e);
|
|
2855
2862
|
return r;
|
|
2856
2863
|
}
|
|
2857
|
-
function
|
|
2864
|
+
function Zr(e, t) {
|
|
2858
2865
|
let n = e.match(/import \{([^}]+)\} from "lucide-react";/);
|
|
2859
2866
|
if (!n) return e;
|
|
2860
2867
|
let r = n[1].split(",").map((e) => e.trim()).filter(Boolean);
|
|
@@ -2862,21 +2869,21 @@ function Yr(e, t) {
|
|
|
2862
2869
|
let i = r.findIndex((e) => e.startsWith("type "));
|
|
2863
2870
|
return i === -1 ? r.push(t) : r.splice(i, 0, t), e.replace(n[0], `import { ${r.join(", ")} } from "lucide-react";`);
|
|
2864
2871
|
}
|
|
2865
|
-
function
|
|
2866
|
-
let n =
|
|
2872
|
+
function Qr(e, t) {
|
|
2873
|
+
let n = Kr[t.group];
|
|
2867
2874
|
if (!n) return e;
|
|
2868
|
-
let r =
|
|
2875
|
+
let r = ei(t), i = RegExp(`export const ${n}: NavEntry\\[\\] = \\[`), a = e.match(i);
|
|
2869
2876
|
if (!a) return e;
|
|
2870
|
-
let o = e.indexOf(a[0]) + a[0].length, s =
|
|
2877
|
+
let o = e.indexOf(a[0]) + a[0].length, s = $r(e, o - 1);
|
|
2871
2878
|
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);
|
|
2872
2879
|
}
|
|
2873
|
-
function
|
|
2880
|
+
function $r(e, t) {
|
|
2874
2881
|
let n = 0;
|
|
2875
2882
|
for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
|
|
2876
2883
|
else if (e[r] === "]" && (n--, n === 0)) return r;
|
|
2877
2884
|
return -1;
|
|
2878
2885
|
}
|
|
2879
|
-
function
|
|
2886
|
+
function ei(e) {
|
|
2880
2887
|
let t = [];
|
|
2881
2888
|
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) {
|
|
2882
2889
|
t.push(" items: [");
|
|
@@ -2892,14 +2899,14 @@ function Qr(e) {
|
|
|
2892
2899
|
} else t.push(" items: [],");
|
|
2893
2900
|
return t.push(" },"), t.join("\n");
|
|
2894
2901
|
}
|
|
2895
|
-
async function
|
|
2896
|
-
let r =
|
|
2897
|
-
if (!await
|
|
2898
|
-
let a = await
|
|
2899
|
-
for (let t of e) a.includes(`from "${t.from}"`) || (a =
|
|
2900
|
-
await
|
|
2902
|
+
async function ti(e, t, n) {
|
|
2903
|
+
let r = X("{{backend.features}}", t), i = u.resolve(n, r, "organizations/modules/setup-organization/steps/index.ts");
|
|
2904
|
+
if (!await Y(i)) return;
|
|
2905
|
+
let a = await s.readFile(i, "utf-8");
|
|
2906
|
+
for (let t of e) a.includes(`from "${t.from}"`) || (a = ni(a, t), a = ri(a, t));
|
|
2907
|
+
await s.writeFile(i, a, "utf-8");
|
|
2901
2908
|
}
|
|
2902
|
-
function
|
|
2909
|
+
function ni(e, t) {
|
|
2903
2910
|
let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("import ");
|
|
2904
2911
|
if (r !== -1) {
|
|
2905
2912
|
let t = e.indexOf("\n", e.indexOf(";", r));
|
|
@@ -2907,38 +2914,38 @@ function ei(e, t) {
|
|
|
2907
2914
|
}
|
|
2908
2915
|
return e.indexOf("type "), n + "\n\n" + e;
|
|
2909
2916
|
}
|
|
2910
|
-
function
|
|
2917
|
+
function ri(e, t) {
|
|
2911
2918
|
let n = ` { id: "${t.id}", execute: (ctx) => ${t.import}(ctx) },`, r = e.match(/export const steps:\s*Step\[\]\s*=\s*\[/);
|
|
2912
2919
|
if (!r) return e;
|
|
2913
|
-
let i = e.indexOf(r[0]) + r[0].length, a =
|
|
2920
|
+
let i = e.indexOf(r[0]) + r[0].length, a = ii(e, i - 1);
|
|
2914
2921
|
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);
|
|
2915
2922
|
}
|
|
2916
|
-
function
|
|
2923
|
+
function ii(e, t) {
|
|
2917
2924
|
let n = 0;
|
|
2918
2925
|
for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
|
|
2919
2926
|
else if (e[r] === "]" && (n--, n === 0)) return r;
|
|
2920
2927
|
return -1;
|
|
2921
2928
|
}
|
|
2922
|
-
var
|
|
2923
|
-
async function
|
|
2924
|
-
await
|
|
2929
|
+
var ai = "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";
|
|
2930
|
+
async function oi(e) {
|
|
2931
|
+
await ci({
|
|
2925
2932
|
...e,
|
|
2926
2933
|
arrayName: "navbarActions"
|
|
2927
2934
|
});
|
|
2928
2935
|
}
|
|
2929
|
-
async function
|
|
2930
|
-
await
|
|
2936
|
+
async function si(e) {
|
|
2937
|
+
await ci({
|
|
2931
2938
|
...e,
|
|
2932
2939
|
arrayName: "userMenuActions"
|
|
2933
2940
|
});
|
|
2934
2941
|
}
|
|
2935
|
-
async function
|
|
2936
|
-
let a =
|
|
2937
|
-
await
|
|
2938
|
-
for (let n of e) c =
|
|
2939
|
-
await
|
|
2942
|
+
async function ci({ actions: e, arrayName: t, paths: n, projectRoot: r, slot: i }) {
|
|
2943
|
+
let a = yr(i, n), o = u.resolve(r, a, "src/constants/navbar-actions.tsx"), c;
|
|
2944
|
+
await Y(o) ? c = await s.readFile(o, "utf-8") : (await s.mkdir(u.dirname(o), { recursive: !0 }), c = ai);
|
|
2945
|
+
for (let n of e) c = li(c, n), c = ui(c, n, t);
|
|
2946
|
+
await s.writeFile(o, c, "utf-8");
|
|
2940
2947
|
}
|
|
2941
|
-
function
|
|
2948
|
+
function li(e, t) {
|
|
2942
2949
|
let n = `import { ${t.import} } from "${t.from}";`;
|
|
2943
2950
|
if (e.includes(n)) return e;
|
|
2944
2951
|
let r = e.lastIndexOf("import ");
|
|
@@ -2946,38 +2953,38 @@ function si(e, t) {
|
|
|
2946
2953
|
let i = e.indexOf("\n", r);
|
|
2947
2954
|
return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
|
|
2948
2955
|
}
|
|
2949
|
-
function
|
|
2956
|
+
function ui(e, t, n) {
|
|
2950
2957
|
let r = e.match(RegExp(`export const ${n}:\\s*NavbarAction\\[\\]\\s*=\\s*\\[`));
|
|
2951
2958
|
if (!r) return e;
|
|
2952
|
-
let i = e.indexOf(r[0]) + r[0].length, a =
|
|
2959
|
+
let i = e.indexOf(r[0]) + r[0].length, a = di(e, i - 1);
|
|
2953
2960
|
if (a === -1) return e;
|
|
2954
2961
|
let o = e.slice(i, a);
|
|
2955
2962
|
if (o.includes(`id: "${t.id}"`)) return e;
|
|
2956
2963
|
let s = ` { id: "${t.id}", component: ${t.import} },`;
|
|
2957
2964
|
return o.trim() === "" ? e.slice(0, a) + "\n" + s + "\n" + e.slice(a) : e.slice(0, a) + s + "\n" + e.slice(a);
|
|
2958
2965
|
}
|
|
2959
|
-
function
|
|
2966
|
+
function di(e, t) {
|
|
2960
2967
|
let n = 0;
|
|
2961
2968
|
for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
|
|
2962
2969
|
else if (e[r] === "]" && (n--, n === 0)) return r;
|
|
2963
2970
|
return -1;
|
|
2964
2971
|
}
|
|
2965
|
-
var
|
|
2972
|
+
var fi = new Set([
|
|
2966
2973
|
".ts",
|
|
2967
2974
|
".tsx",
|
|
2968
2975
|
".js",
|
|
2969
2976
|
".jsx"
|
|
2970
2977
|
]);
|
|
2971
|
-
async function
|
|
2978
|
+
async function pi(e) {
|
|
2972
2979
|
let { files: t, paths: n, projectRoot: r, projectName: i } = e;
|
|
2973
2980
|
if (i === "hype-stack") return;
|
|
2974
2981
|
let a = `@${i}/`;
|
|
2975
2982
|
await Promise.all(t.map(async (e) => {
|
|
2976
|
-
let t =
|
|
2977
|
-
i?.isDirectory() ? await
|
|
2983
|
+
let t = pr(e.target, n, r), i = await s.stat(t).catch(() => null);
|
|
2984
|
+
i?.isDirectory() ? await gi(t, a) : i?.isFile() && fi.has(u.extname(t)) && await _i(t, a);
|
|
2978
2985
|
}));
|
|
2979
2986
|
}
|
|
2980
|
-
var
|
|
2987
|
+
var mi = new Set([
|
|
2981
2988
|
".git",
|
|
2982
2989
|
"node_modules",
|
|
2983
2990
|
"dist",
|
|
@@ -2986,48 +2993,48 @@ var fi = new Set([
|
|
|
2986
2993
|
".next",
|
|
2987
2994
|
"coverage"
|
|
2988
2995
|
]);
|
|
2989
|
-
async function
|
|
2990
|
-
t !== "hype-stack" && await
|
|
2996
|
+
async function hi(e, t) {
|
|
2997
|
+
t !== "hype-stack" && await gi(e, `@${t}/`);
|
|
2991
2998
|
}
|
|
2992
|
-
async function
|
|
2993
|
-
let n = await
|
|
2999
|
+
async function gi(e, t) {
|
|
3000
|
+
let n = await s.readdir(e, { withFileTypes: !0 });
|
|
2994
3001
|
await Promise.all(n.map(async (n) => {
|
|
2995
|
-
let r =
|
|
3002
|
+
let r = u.join(e, n.name);
|
|
2996
3003
|
if (n.isDirectory()) {
|
|
2997
|
-
if (
|
|
2998
|
-
await
|
|
2999
|
-
} else n.isFile() &&
|
|
3004
|
+
if (mi.has(n.name)) return;
|
|
3005
|
+
await gi(r, t);
|
|
3006
|
+
} else n.isFile() && fi.has(u.extname(n.name)) && await _i(r, t);
|
|
3000
3007
|
}));
|
|
3001
3008
|
}
|
|
3002
|
-
async function
|
|
3003
|
-
let n = await
|
|
3004
|
-
if (!n.includes(
|
|
3005
|
-
let r = n.replaceAll(
|
|
3006
|
-
await
|
|
3009
|
+
async function _i(e, t) {
|
|
3010
|
+
let n = await s.readFile(e, "utf-8");
|
|
3011
|
+
if (!n.includes(vr)) return;
|
|
3012
|
+
let r = n.replaceAll(vr, t);
|
|
3013
|
+
await s.writeFile(e, r, "utf-8");
|
|
3007
3014
|
}
|
|
3008
3015
|
//#endregion
|
|
3009
3016
|
//#region src/core/installer.ts
|
|
3010
|
-
function
|
|
3017
|
+
function vi(e, t) {
|
|
3011
3018
|
return e.slot ? t ? t.includes(e.slot) : e.slot === "frontend" : !0;
|
|
3012
3019
|
}
|
|
3013
|
-
async function
|
|
3014
|
-
if ((await
|
|
3015
|
-
await
|
|
3016
|
-
let n = await
|
|
3017
|
-
for (let r of n) await
|
|
3018
|
-
} else await
|
|
3019
|
-
}
|
|
3020
|
-
async function
|
|
3021
|
-
let { file: t, packDir: n, paths: r, projectRoot: i } = e, a =
|
|
3020
|
+
async function yi(e, t) {
|
|
3021
|
+
if ((await s.stat(e)).isDirectory()) {
|
|
3022
|
+
await s.mkdir(t, { recursive: !0 });
|
|
3023
|
+
let n = await s.readdir(e, { withFileTypes: !0 });
|
|
3024
|
+
for (let r of n) await yi(u.join(e, r.name), u.join(t, r.name));
|
|
3025
|
+
} else await s.mkdir(u.dirname(t), { recursive: !0 }), await s.copyFile(e, t);
|
|
3026
|
+
}
|
|
3027
|
+
async function bi(e) {
|
|
3028
|
+
let { file: t, packDir: n, paths: r, projectRoot: i } = e, a = mr(t.source, n), o = pr(t.target, r, i);
|
|
3022
3029
|
return {
|
|
3023
3030
|
sourcePath: a,
|
|
3024
3031
|
targetPath: o,
|
|
3025
|
-
sourceExists: await
|
|
3026
|
-
targetExists: await
|
|
3032
|
+
sourceExists: await Y(a) || await Yn(a),
|
|
3033
|
+
targetExists: await Y(o) || await Yn(o)
|
|
3027
3034
|
};
|
|
3028
3035
|
}
|
|
3029
|
-
async function
|
|
3030
|
-
let { file: t, packDir: n, paths: r, projectRoot: i } = e, { sourcePath: a, targetPath:
|
|
3036
|
+
async function xi(e) {
|
|
3037
|
+
let { file: t, packDir: n, paths: r, projectRoot: i } = e, { sourcePath: a, targetPath: o, sourceExists: c, targetExists: l } = await bi({
|
|
3031
3038
|
file: t,
|
|
3032
3039
|
packDir: n,
|
|
3033
3040
|
paths: r,
|
|
@@ -3038,12 +3045,12 @@ async function yi(e) {
|
|
|
3038
3045
|
case "create":
|
|
3039
3046
|
case "skip-if-exists":
|
|
3040
3047
|
case "override": return null;
|
|
3041
|
-
case "merge": return !l || !t.marker || (await
|
|
3048
|
+
case "merge": return !l || !t.marker || (await s.readFile(o, "utf-8")).includes(t.marker) ? null : `${t.target}: Marker "${t.marker}" not found`;
|
|
3042
3049
|
default: return `${t.target}: Unknown strategy: ${String(t.strategy)}`;
|
|
3043
3050
|
}
|
|
3044
3051
|
}
|
|
3045
|
-
async function
|
|
3046
|
-
let { file: t, packDir: n, paths: r, projectRoot: i, force: a, overwrite:
|
|
3052
|
+
async function Si(e) {
|
|
3053
|
+
let { file: t, packDir: n, paths: r, projectRoot: i, force: a, overwrite: o } = e, { sourcePath: c, targetPath: l, sourceExists: u, targetExists: d } = await bi({
|
|
3047
3054
|
file: t,
|
|
3048
3055
|
packDir: n,
|
|
3049
3056
|
paths: r,
|
|
@@ -3056,12 +3063,12 @@ async function bi(e) {
|
|
|
3056
3063
|
};
|
|
3057
3064
|
switch (t.strategy) {
|
|
3058
3065
|
case "create": {
|
|
3059
|
-
let e = a || (
|
|
3066
|
+
let e = a || (o?.has(l) ?? !1);
|
|
3060
3067
|
return d && !e ? {
|
|
3061
3068
|
status: "skipped",
|
|
3062
3069
|
path: t.target,
|
|
3063
3070
|
reason: "Already exists"
|
|
3064
|
-
} : (await
|
|
3071
|
+
} : (await yi(c, l), {
|
|
3065
3072
|
status: "installed",
|
|
3066
3073
|
path: t.target
|
|
3067
3074
|
});
|
|
@@ -3070,20 +3077,20 @@ async function bi(e) {
|
|
|
3070
3077
|
status: "skipped",
|
|
3071
3078
|
path: t.target,
|
|
3072
3079
|
reason: "Already exists (skip-if-exists)"
|
|
3073
|
-
} : (await
|
|
3080
|
+
} : (await yi(c, l), {
|
|
3074
3081
|
status: "installed",
|
|
3075
3082
|
path: t.target
|
|
3076
3083
|
});
|
|
3077
|
-
case "override": return await
|
|
3084
|
+
case "override": return await yi(c, l), {
|
|
3078
3085
|
status: "installed",
|
|
3079
3086
|
path: t.target
|
|
3080
3087
|
};
|
|
3081
3088
|
case "merge": {
|
|
3082
|
-
if (!d) return await
|
|
3089
|
+
if (!d) return await yi(c, l), {
|
|
3083
3090
|
status: "installed",
|
|
3084
3091
|
path: t.target
|
|
3085
3092
|
};
|
|
3086
|
-
let e = await
|
|
3093
|
+
let e = await s.readFile(c, "utf-8"), n = await s.readFile(l, "utf-8");
|
|
3087
3094
|
if (t.marker) {
|
|
3088
3095
|
let r = n.indexOf(t.marker);
|
|
3089
3096
|
if (r === -1) return {
|
|
@@ -3092,10 +3099,10 @@ async function bi(e) {
|
|
|
3092
3099
|
reason: `Marker "${t.marker}" not found`
|
|
3093
3100
|
};
|
|
3094
3101
|
let i = n.slice(0, r) + e + n.slice(r);
|
|
3095
|
-
await
|
|
3102
|
+
await s.writeFile(l, i);
|
|
3096
3103
|
} else {
|
|
3097
3104
|
let t = n + "\n" + e;
|
|
3098
|
-
await
|
|
3105
|
+
await s.writeFile(l, t);
|
|
3099
3106
|
}
|
|
3100
3107
|
return {
|
|
3101
3108
|
status: "installed",
|
|
@@ -3109,15 +3116,15 @@ async function bi(e) {
|
|
|
3109
3116
|
};
|
|
3110
3117
|
}
|
|
3111
3118
|
}
|
|
3112
|
-
async function
|
|
3119
|
+
async function Ci(e) {
|
|
3113
3120
|
let { packs: t, config: n, projectRoot: r, slotsByPack: i } = e, a = n.paths;
|
|
3114
3121
|
if (!a) throw Error("stack.json is missing 'paths' configuration. Run 'hype-stack init' to set it up.");
|
|
3115
3122
|
let o = [], s = /* @__PURE__ */ new Set();
|
|
3116
3123
|
for (let e of t) {
|
|
3117
3124
|
let t = i?.get(e.manifest.name);
|
|
3118
3125
|
for (let n of e.manifest.files) {
|
|
3119
|
-
if (n.strategy !== "create" || !
|
|
3120
|
-
let { targetPath: i, targetExists: c } = await
|
|
3126
|
+
if (n.strategy !== "create" || !vi(n, t)) continue;
|
|
3127
|
+
let { targetPath: i, targetExists: c } = await bi({
|
|
3121
3128
|
file: n,
|
|
3122
3129
|
packDir: e.packDir,
|
|
3123
3130
|
paths: a,
|
|
@@ -3132,13 +3139,13 @@ async function xi(e) {
|
|
|
3132
3139
|
}
|
|
3133
3140
|
return o;
|
|
3134
3141
|
}
|
|
3135
|
-
async function
|
|
3142
|
+
async function wi(e) {
|
|
3136
3143
|
let { manifest: t, config: n, projectRoot: r, force: i, packDir: a, slots: o } = e, s = n.paths;
|
|
3137
3144
|
if (!s) throw Error("stack.json is missing 'paths' configuration. Run 'hype-stack init' to set it up.");
|
|
3138
3145
|
let c = [];
|
|
3139
3146
|
for (let e of t.files) {
|
|
3140
|
-
if (!
|
|
3141
|
-
let t = await
|
|
3147
|
+
if (!vi(e, o)) continue;
|
|
3148
|
+
let t = await xi({
|
|
3142
3149
|
file: e,
|
|
3143
3150
|
packDir: a,
|
|
3144
3151
|
paths: s,
|
|
@@ -3149,16 +3156,16 @@ async function Si(e) {
|
|
|
3149
3156
|
}
|
|
3150
3157
|
return c;
|
|
3151
3158
|
}
|
|
3152
|
-
async function
|
|
3159
|
+
async function Ti(e) {
|
|
3153
3160
|
let { manifest: t, config: n, projectRoot: r, force: i, overwrite: a, packDir: o, slots: s } = e, c = n.paths;
|
|
3154
3161
|
if (!c) throw Error("stack.json is missing 'paths' configuration. Run 'hype-stack init' to set it up.");
|
|
3155
3162
|
let l = {
|
|
3156
3163
|
installed: [],
|
|
3157
3164
|
skipped: [],
|
|
3158
3165
|
errors: []
|
|
3159
|
-
}, u = t.files.filter((e) =>
|
|
3166
|
+
}, u = t.files.filter((e) => vi(e, s));
|
|
3160
3167
|
for (let e of u) {
|
|
3161
|
-
let t = await
|
|
3168
|
+
let t = await Si({
|
|
3162
3169
|
file: e,
|
|
3163
3170
|
packDir: o,
|
|
3164
3171
|
paths: c,
|
|
@@ -3178,40 +3185,40 @@ async function Ci(e) {
|
|
|
3178
3185
|
break;
|
|
3179
3186
|
}
|
|
3180
3187
|
}
|
|
3181
|
-
await
|
|
3188
|
+
await pi({
|
|
3182
3189
|
files: u,
|
|
3183
3190
|
paths: c,
|
|
3184
3191
|
projectRoot: r,
|
|
3185
3192
|
projectName: n.name
|
|
3186
|
-
}), t.env && t.env.length > 0 && await
|
|
3193
|
+
}), t.env && t.env.length > 0 && await br(t.env, c, r), t.routes && t.routes.length > 0 && await Tr(t.routes, c, r), t.context && t.context.length > 0 && await Or(t.context, c, r), t.sockets && t.sockets.length > 0 && await Ir(t.sockets, c, r), t.sdkConfigurations && t.sdkConfigurations.length > 0 && await Br(t.sdkConfigurations, c, r), t.enums && t.enums.length > 0 && await Pr(t.enums, c, r), t.frontendRoutes && t.frontendRoutes.length > 0 && await Ur(t.frontendRoutes, c, r);
|
|
3187
3194
|
let d = s && s.length > 0 ? s : ["frontend"];
|
|
3188
|
-
for (let e of d) t.nav && t.nav.length > 0 && await
|
|
3195
|
+
for (let e of d) t.nav && t.nav.length > 0 && await qr({
|
|
3189
3196
|
entries: t.nav,
|
|
3190
3197
|
paths: c,
|
|
3191
3198
|
projectRoot: r,
|
|
3192
3199
|
slot: e
|
|
3193
|
-
}), t.navbarActions && t.navbarActions.length > 0 && await
|
|
3200
|
+
}), t.navbarActions && t.navbarActions.length > 0 && await oi({
|
|
3194
3201
|
actions: t.navbarActions,
|
|
3195
3202
|
paths: c,
|
|
3196
3203
|
projectRoot: r,
|
|
3197
3204
|
slot: e
|
|
3198
|
-
}), t.userMenuActions && t.userMenuActions.length > 0 && await
|
|
3205
|
+
}), t.userMenuActions && t.userMenuActions.length > 0 && await si({
|
|
3199
3206
|
actions: t.userMenuActions,
|
|
3200
3207
|
paths: c,
|
|
3201
3208
|
projectRoot: r,
|
|
3202
3209
|
slot: e
|
|
3203
3210
|
});
|
|
3204
|
-
return t.onboardingSteps && t.onboardingSteps.length > 0 && await
|
|
3211
|
+
return t.onboardingSteps && t.onboardingSteps.length > 0 && await ti(t.onboardingSteps, c, r), t.postLoginRedirect && await Jr({
|
|
3205
3212
|
postLoginRedirect: t.postLoginRedirect,
|
|
3206
3213
|
paths: c,
|
|
3207
3214
|
projectRoot: r,
|
|
3208
3215
|
slot: d[0]
|
|
3209
3216
|
}), l;
|
|
3210
3217
|
}
|
|
3211
|
-
async function
|
|
3218
|
+
async function Ei(e) {
|
|
3212
3219
|
let { packs: t, config: n, projectRoot: r, force: i, overwrite: a, slotsByPack: o } = e, s = [];
|
|
3213
3220
|
for (let e of t) {
|
|
3214
|
-
let t = o?.get(e.manifest.name), a = await
|
|
3221
|
+
let t = o?.get(e.manifest.name), a = await wi({
|
|
3215
3222
|
manifest: e.manifest,
|
|
3216
3223
|
config: n,
|
|
3217
3224
|
projectRoot: r,
|
|
@@ -3231,7 +3238,7 @@ async function wi(e) {
|
|
|
3231
3238
|
};
|
|
3232
3239
|
let c = [], l = [], u = [], d = [], f = n;
|
|
3233
3240
|
for (let e of t) {
|
|
3234
|
-
let t = o?.get(e.manifest.name), n = await
|
|
3241
|
+
let t = o?.get(e.manifest.name), n = await Ti({
|
|
3235
3242
|
manifest: e.manifest,
|
|
3236
3243
|
config: f,
|
|
3237
3244
|
projectRoot: r,
|
|
@@ -3240,7 +3247,7 @@ async function wi(e) {
|
|
|
3240
3247
|
packDir: e.packDir,
|
|
3241
3248
|
slots: t
|
|
3242
3249
|
});
|
|
3243
|
-
c.push(...n.installed), l.push(...n.skipped), u.push(...n.errors), f = await
|
|
3250
|
+
c.push(...n.installed), l.push(...n.skipped), u.push(...n.errors), f = await Di(f, e.manifest.name, r), d.push(e.manifest.name);
|
|
3244
3251
|
}
|
|
3245
3252
|
return {
|
|
3246
3253
|
installed: c,
|
|
@@ -3251,19 +3258,19 @@ async function wi(e) {
|
|
|
3251
3258
|
config: f
|
|
3252
3259
|
};
|
|
3253
3260
|
}
|
|
3254
|
-
async function
|
|
3261
|
+
async function Di(e, t, n) {
|
|
3255
3262
|
let r = {
|
|
3256
3263
|
...e,
|
|
3257
3264
|
installedPacks: [...e.installedPacks ?? [], t]
|
|
3258
3265
|
};
|
|
3259
|
-
return await
|
|
3266
|
+
return await or(n, r), r;
|
|
3260
3267
|
}
|
|
3261
|
-
async function
|
|
3268
|
+
async function Oi(e) {
|
|
3262
3269
|
let { manifest: t, config: n, projectRoot: r, templateDir: i } = e, a = n.paths;
|
|
3263
3270
|
if (!a) throw Error("stack.json is missing 'paths' configuration. Run 'hype-stack init' to set it up.");
|
|
3264
3271
|
let o = [], s = [];
|
|
3265
3272
|
for (let e of t.files) {
|
|
3266
|
-
let t = await
|
|
3273
|
+
let t = await Si({
|
|
3267
3274
|
file: e,
|
|
3268
3275
|
packDir: i,
|
|
3269
3276
|
paths: a,
|
|
@@ -3281,11 +3288,11 @@ async function Ei(e) {
|
|
|
3281
3288
|
case "skipped": break;
|
|
3282
3289
|
}
|
|
3283
3290
|
}
|
|
3284
|
-
return t.frontendRoutes && t.frontendRoutes.length > 0 && await
|
|
3291
|
+
return t.frontendRoutes && t.frontendRoutes.length > 0 && await Ur(t.frontendRoutes, a, r), t.nav && t.nav.length > 0 && await qr({
|
|
3285
3292
|
entries: t.nav,
|
|
3286
3293
|
paths: a,
|
|
3287
3294
|
projectRoot: r
|
|
3288
|
-
}), t.postLoginRedirect && await
|
|
3295
|
+
}), t.postLoginRedirect && await Jr({
|
|
3289
3296
|
postLoginRedirect: t.postLoginRedirect,
|
|
3290
3297
|
paths: a,
|
|
3291
3298
|
projectRoot: r
|
|
@@ -3296,28 +3303,28 @@ async function Ei(e) {
|
|
|
3296
3303
|
}
|
|
3297
3304
|
//#endregion
|
|
3298
3305
|
//#region src/core/pack-categories.ts
|
|
3299
|
-
var
|
|
3306
|
+
var ki = [
|
|
3300
3307
|
"starter",
|
|
3301
3308
|
"layout",
|
|
3302
3309
|
"feature"
|
|
3303
|
-
],
|
|
3310
|
+
], Ai = {
|
|
3304
3311
|
starter: "Starter",
|
|
3305
3312
|
layout: "Layout",
|
|
3306
3313
|
feature: "Features"
|
|
3307
|
-
},
|
|
3308
|
-
function
|
|
3314
|
+
}, ji = new Set(["starter", "layout"]), Mi = "layout-basic";
|
|
3315
|
+
function Ni(e, t = {}) {
|
|
3309
3316
|
let n = [];
|
|
3310
|
-
for (let r of
|
|
3317
|
+
for (let r of ki) {
|
|
3311
3318
|
let i = e.filter((e) => e.category === r);
|
|
3312
3319
|
if (i.length === 0) continue;
|
|
3313
|
-
let a =
|
|
3320
|
+
let a = ji.has(r) ? "single" : "multiple";
|
|
3314
3321
|
if (r === "layout") {
|
|
3315
|
-
n.push(
|
|
3322
|
+
n.push(Pi("frontend", i)), t.adminAvailable && n.push(Pi("admin", i));
|
|
3316
3323
|
continue;
|
|
3317
3324
|
}
|
|
3318
3325
|
n.push({
|
|
3319
3326
|
category: r,
|
|
3320
|
-
label:
|
|
3327
|
+
label: Ai[r],
|
|
3321
3328
|
mode: a,
|
|
3322
3329
|
packs: i,
|
|
3323
3330
|
preselect: null
|
|
@@ -3325,20 +3332,20 @@ function ji(e, t = {}) {
|
|
|
3325
3332
|
}
|
|
3326
3333
|
return n;
|
|
3327
3334
|
}
|
|
3328
|
-
function
|
|
3329
|
-
let n = t.some((e) => e.name ===
|
|
3335
|
+
function Pi(e, t) {
|
|
3336
|
+
let n = t.some((e) => e.name === Mi);
|
|
3330
3337
|
return {
|
|
3331
3338
|
category: "layout",
|
|
3332
3339
|
label: e === "admin" ? "Admin Layout" : "Layout",
|
|
3333
3340
|
mode: "single",
|
|
3334
3341
|
packs: t,
|
|
3335
|
-
preselect: n ?
|
|
3342
|
+
preselect: n ? Mi : null,
|
|
3336
3343
|
slot: e
|
|
3337
3344
|
};
|
|
3338
3345
|
}
|
|
3339
3346
|
//#endregion
|
|
3340
3347
|
//#region src/core/resolve.ts
|
|
3341
|
-
function
|
|
3348
|
+
function Fi(e) {
|
|
3342
3349
|
let t = /* @__PURE__ */ new Map();
|
|
3343
3350
|
for (let n of e) t.set(n.name, {
|
|
3344
3351
|
name: n.name,
|
|
@@ -3346,7 +3353,7 @@ function Ni(e) {
|
|
|
3346
3353
|
});
|
|
3347
3354
|
return t;
|
|
3348
3355
|
}
|
|
3349
|
-
function
|
|
3356
|
+
function Ii(e, t, n = /* @__PURE__ */ new Set()) {
|
|
3350
3357
|
let r = /* @__PURE__ */ new Set();
|
|
3351
3358
|
function i(e) {
|
|
3352
3359
|
if (n.has(e)) return [];
|
|
@@ -3360,10 +3367,10 @@ function Pi(e, t, n = /* @__PURE__ */ new Set()) {
|
|
|
3360
3367
|
}
|
|
3361
3368
|
return i(e);
|
|
3362
3369
|
}
|
|
3363
|
-
function
|
|
3370
|
+
function Li(e, t, n = []) {
|
|
3364
3371
|
let r = new Set(n), i = new Set(n), a = [];
|
|
3365
3372
|
for (let n of e) {
|
|
3366
|
-
let e =
|
|
3373
|
+
let e = Ii(n, t, new Set(i));
|
|
3367
3374
|
for (let t of e) i.has(t) || (i.add(t), a.push(t));
|
|
3368
3375
|
}
|
|
3369
3376
|
return {
|
|
@@ -3371,7 +3378,7 @@ function Fi(e, t, n = []) {
|
|
|
3371
3378
|
alreadyInstalled: e.filter((e) => r.has(e))
|
|
3372
3379
|
};
|
|
3373
3380
|
}
|
|
3374
|
-
function
|
|
3381
|
+
function Ri(e) {
|
|
3375
3382
|
let { order: t, graph: n, isLocked: r, installed: i = [] } = e, a = new Set(i), o = /* @__PURE__ */ new Set();
|
|
3376
3383
|
for (let e of t) {
|
|
3377
3384
|
let t = n.get(e)?.dependencies.some((e) => !a.has(e) && o.has(e)) ?? !1;
|
|
@@ -3384,7 +3391,7 @@ function Ii(e) {
|
|
|
3384
3391
|
}
|
|
3385
3392
|
//#endregion
|
|
3386
3393
|
//#region src/core/variants.ts
|
|
3387
|
-
function
|
|
3394
|
+
function zi(e, t = {}) {
|
|
3388
3395
|
let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
|
|
3389
3396
|
for (let i of e) {
|
|
3390
3397
|
let e = t[i.family] ?? i.default;
|
|
@@ -3396,14 +3403,14 @@ function Li(e, t = {}) {
|
|
|
3396
3403
|
familyOf: r
|
|
3397
3404
|
};
|
|
3398
3405
|
}
|
|
3399
|
-
function
|
|
3406
|
+
function Bi(e, t, n) {
|
|
3400
3407
|
return [...e.map((e) => n.chosen.get(e.family) ?? e.default), ...t];
|
|
3401
3408
|
}
|
|
3402
|
-
function
|
|
3409
|
+
function Vi(e, t) {
|
|
3403
3410
|
let n = t.familyOf.get(e);
|
|
3404
3411
|
return n ? t.chosen.get(n) ?? e : e;
|
|
3405
3412
|
}
|
|
3406
|
-
function
|
|
3413
|
+
function Hi(e, t) {
|
|
3407
3414
|
let n = /* @__PURE__ */ new Map();
|
|
3408
3415
|
for (let t of e) t.family && n.set(t.name, t.family);
|
|
3409
3416
|
let r = new Set(t), i = /* @__PURE__ */ new Map();
|
|
@@ -3419,74 +3426,74 @@ function Bi(e, t) {
|
|
|
3419
3426
|
familyOf: n
|
|
3420
3427
|
};
|
|
3421
3428
|
}
|
|
3422
|
-
function
|
|
3429
|
+
function Ui(e, t) {
|
|
3423
3430
|
return e.map((e) => ({
|
|
3424
3431
|
...e,
|
|
3425
|
-
dependencies: e.dependencies.map((e) =>
|
|
3432
|
+
dependencies: e.dependencies.map((e) => Vi(e, t))
|
|
3426
3433
|
}));
|
|
3427
3434
|
}
|
|
3428
3435
|
//#endregion
|
|
3429
3436
|
//#region src/ui/banner.ts
|
|
3430
|
-
var
|
|
3437
|
+
var Wi = [
|
|
3431
3438
|
" ██╗ ██╗ ██╗ ██╗ ██████╗ ███████╗",
|
|
3432
3439
|
" ██║ ██║ ╚██╗ ██╔╝ ██╔══██╗ ██╔════╝",
|
|
3433
3440
|
" ███████║ ╚████╔╝ ██████╔╝ █████╗ ",
|
|
3434
3441
|
" ██╔══██║ ╚██╔╝ ██╔═══╝ ██╔══╝ ",
|
|
3435
3442
|
" ██║ ██║ ██║ ██║ ███████╗",
|
|
3436
3443
|
" ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝"
|
|
3437
|
-
],
|
|
3444
|
+
], Gi = [
|
|
3438
3445
|
" ███████╗ ████████╗ █████╗ ██████╗ ██╗ ██╗",
|
|
3439
3446
|
" ██╔════╝ ╚══██╔══╝ ██╔══██╗ ██╔════╝ ██║ ██╔╝",
|
|
3440
3447
|
" ███████╗ ██║ ███████║ ██║ █████╔╝ ",
|
|
3441
3448
|
" ╚════██║ ██║ ██╔══██║ ██║ ██╔═██╗ ",
|
|
3442
3449
|
" ███████║ ██║ ██║ ██║ ╚██████╗ ██║ ██╗",
|
|
3443
3450
|
" ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝"
|
|
3444
|
-
],
|
|
3451
|
+
], Ki = [
|
|
3445
3452
|
253,
|
|
3446
3453
|
176,
|
|
3447
3454
|
21
|
|
3448
|
-
],
|
|
3455
|
+
], qi = [
|
|
3449
3456
|
245,
|
|
3450
3457
|
76,
|
|
3451
3458
|
2
|
|
3452
|
-
],
|
|
3459
|
+
], Ji = 5, Yi = [
|
|
3453
3460
|
17,
|
|
3454
3461
|
103,
|
|
3455
3462
|
248
|
|
3456
|
-
],
|
|
3463
|
+
], Xi = [
|
|
3457
3464
|
42,
|
|
3458
3465
|
160,
|
|
3459
3466
|
250
|
|
3460
|
-
],
|
|
3461
|
-
function
|
|
3467
|
+
], Zi = .2;
|
|
3468
|
+
function Qi() {
|
|
3462
3469
|
console.log();
|
|
3463
|
-
for (let e of
|
|
3464
|
-
start:
|
|
3465
|
-
end:
|
|
3466
|
-
angle:
|
|
3467
|
-
})) console.log(
|
|
3468
|
-
for (let e of
|
|
3469
|
-
start:
|
|
3470
|
-
end:
|
|
3471
|
-
angle:
|
|
3472
|
-
})) console.log(
|
|
3473
|
-
console.log(), console.log(` ${
|
|
3474
|
-
}
|
|
3475
|
-
function
|
|
3476
|
-
console.log(), console.log(` ${
|
|
3470
|
+
for (let e of fe(Wi, {
|
|
3471
|
+
start: Ki,
|
|
3472
|
+
end: qi,
|
|
3473
|
+
angle: Ji
|
|
3474
|
+
})) console.log(c.bold(e));
|
|
3475
|
+
for (let e of fe(Gi, {
|
|
3476
|
+
start: Yi,
|
|
3477
|
+
end: Xi,
|
|
3478
|
+
angle: Zi
|
|
3479
|
+
})) console.log(c.bold(e));
|
|
3480
|
+
console.log(), console.log(` ${z.spark} ${c.dim("v" + C)} ${c.dim("·")} ${ue("Ship web + desktop apps from one codebase")}`), console.log();
|
|
3481
|
+
}
|
|
3482
|
+
function $i() {
|
|
3483
|
+
console.log(), console.log(` ${z.bolt} ${se.orange("Hype")}${se.skyBlue("Stack")} ${c.dim("v" + C)}`), console.log();
|
|
3477
3484
|
}
|
|
3478
3485
|
//#endregion
|
|
3479
3486
|
//#region src/ui/logger.ts
|
|
3480
|
-
function
|
|
3481
|
-
|
|
3487
|
+
function ea(e) {
|
|
3488
|
+
o.note(e.map((e) => `${z.arrow} ${e}`).join("\n"), "Next steps");
|
|
3482
3489
|
}
|
|
3483
3490
|
function Z() {
|
|
3484
|
-
|
|
3491
|
+
o.cancel(R.muted("Operation cancelled.")), process.exit(0);
|
|
3485
3492
|
}
|
|
3486
3493
|
//#endregion
|
|
3487
3494
|
//#region src/core/clone.ts
|
|
3488
|
-
async function
|
|
3489
|
-
let t = await
|
|
3495
|
+
async function ta(e) {
|
|
3496
|
+
let t = await p(w, {
|
|
3490
3497
|
dir: e,
|
|
3491
3498
|
force: !0
|
|
3492
3499
|
});
|
|
@@ -3497,7 +3504,7 @@ async function Qi(e) {
|
|
|
3497
3504
|
}
|
|
3498
3505
|
//#endregion
|
|
3499
3506
|
//#region src/core/apply-theme.ts
|
|
3500
|
-
function
|
|
3507
|
+
function na(e, t) {
|
|
3501
3508
|
let n = e.indexOf(t);
|
|
3502
3509
|
if (n === -1) return null;
|
|
3503
3510
|
let r = e.indexOf("{", n);
|
|
@@ -3512,46 +3519,46 @@ function $i(e, t) {
|
|
|
3512
3519
|
bodyEnd: a - 1
|
|
3513
3520
|
} : null;
|
|
3514
3521
|
}
|
|
3515
|
-
function
|
|
3522
|
+
function ra(e, t) {
|
|
3516
3523
|
let n = e;
|
|
3517
3524
|
for (let [e, r] of Object.entries(t)) {
|
|
3518
|
-
let t = RegExp(`(^[ \\t]*--${
|
|
3525
|
+
let t = RegExp(`(^[ \\t]*--${ia(e)}[ \\t]*:[ \\t]*)([^;\\n]*);`, "m");
|
|
3519
3526
|
n = n.replace(t, (e, t) => `${t}${r};`);
|
|
3520
3527
|
}
|
|
3521
3528
|
return n;
|
|
3522
3529
|
}
|
|
3523
|
-
function
|
|
3530
|
+
function ia(e) {
|
|
3524
3531
|
return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
3525
3532
|
}
|
|
3526
|
-
function
|
|
3527
|
-
let n =
|
|
3533
|
+
function aa(e, t) {
|
|
3534
|
+
let n = na(e, ":root"), r = na(e, ".dark"), i = e;
|
|
3528
3535
|
if (n) {
|
|
3529
3536
|
let e = i.slice(0, n.bodyStart), r = i.slice(n.bodyStart, n.bodyEnd), a = i.slice(n.bodyEnd);
|
|
3530
|
-
i = e +
|
|
3537
|
+
i = e + ra(r, t.light) + a;
|
|
3531
3538
|
}
|
|
3532
3539
|
if (r) {
|
|
3533
|
-
let e =
|
|
3540
|
+
let e = na(i, ".dark");
|
|
3534
3541
|
if (e) {
|
|
3535
3542
|
let n = i.slice(0, e.bodyStart), r = i.slice(e.bodyStart, e.bodyEnd), a = i.slice(e.bodyEnd);
|
|
3536
|
-
i = n +
|
|
3543
|
+
i = n + ra(r, t.dark) + a;
|
|
3537
3544
|
}
|
|
3538
3545
|
}
|
|
3539
3546
|
return i;
|
|
3540
3547
|
}
|
|
3541
|
-
var
|
|
3542
|
-
async function
|
|
3543
|
-
let n =
|
|
3548
|
+
var oa = "assets/styles.css";
|
|
3549
|
+
async function sa(e, t) {
|
|
3550
|
+
let n = u.resolve(e, oa), r;
|
|
3544
3551
|
try {
|
|
3545
|
-
r = await
|
|
3552
|
+
r = await s.readFile(n, "utf-8");
|
|
3546
3553
|
} catch {
|
|
3547
3554
|
return !1;
|
|
3548
3555
|
}
|
|
3549
|
-
let i =
|
|
3550
|
-
return i === r || await
|
|
3556
|
+
let i = aa(r, t);
|
|
3557
|
+
return i === r || await s.writeFile(n, i, "utf-8"), !0;
|
|
3551
3558
|
}
|
|
3552
3559
|
//#endregion
|
|
3553
3560
|
//#region src/core/editor-config.ts
|
|
3554
|
-
function
|
|
3561
|
+
function ca(e) {
|
|
3555
3562
|
let t = {
|
|
3556
3563
|
globs: [],
|
|
3557
3564
|
alwaysApply: !1
|
|
@@ -3586,10 +3593,10 @@ function aa(e) {
|
|
|
3586
3593
|
content: i
|
|
3587
3594
|
};
|
|
3588
3595
|
}
|
|
3589
|
-
function
|
|
3596
|
+
function la(e) {
|
|
3590
3597
|
return e.frontmatter.globs.length > 0 ? `---\npaths:\n${e.frontmatter.globs.map((e) => ` - "${e}"`).join("\n")}\n---\n\n${e.content}` : e.content;
|
|
3591
3598
|
}
|
|
3592
|
-
function
|
|
3599
|
+
function ua(e) {
|
|
3593
3600
|
let t;
|
|
3594
3601
|
t = e.frontmatter.alwaysApply ? "always_on" : e.frontmatter.globs.length > 0 ? "glob" : "model_decision";
|
|
3595
3602
|
let n = [`trigger: ${t}`];
|
|
@@ -3599,30 +3606,30 @@ function sa(e) {
|
|
|
3599
3606
|
}
|
|
3600
3607
|
return e.frontmatter.description && n.push(`description: ${e.frontmatter.description}`), `---\n${n.join("\n")}\n---\n\n${e.content}`;
|
|
3601
3608
|
}
|
|
3602
|
-
function
|
|
3609
|
+
function da(e) {
|
|
3603
3610
|
return e.frontmatter.globs.length > 0 ? `---\napplyTo: "${e.frontmatter.globs.join(", ")}"\n---\n\n${e.content}` : e.content;
|
|
3604
3611
|
}
|
|
3605
|
-
var
|
|
3612
|
+
var fa = {
|
|
3606
3613
|
claude: {
|
|
3607
3614
|
rulesDir: ".claude/rules",
|
|
3608
3615
|
extension: ".md",
|
|
3609
|
-
convert:
|
|
3616
|
+
convert: la
|
|
3610
3617
|
},
|
|
3611
3618
|
windsurf: {
|
|
3612
3619
|
rulesDir: ".windsurf/rules",
|
|
3613
3620
|
extension: ".md",
|
|
3614
|
-
convert:
|
|
3621
|
+
convert: ua
|
|
3615
3622
|
},
|
|
3616
3623
|
copilot: {
|
|
3617
3624
|
rulesDir: ".github/instructions",
|
|
3618
3625
|
extension: ".instructions.md",
|
|
3619
|
-
convert:
|
|
3626
|
+
convert: da
|
|
3620
3627
|
}
|
|
3621
3628
|
};
|
|
3622
|
-
async function
|
|
3623
|
-
let t =
|
|
3629
|
+
async function pa(e) {
|
|
3630
|
+
let t = u.join(e, j), n = (await s.readdir(t, { withFileTypes: !0 }).catch(() => [])).filter((e) => e.isFile() && e.name.endsWith(".mdc"));
|
|
3624
3631
|
return await Promise.all(n.map(async (e) => {
|
|
3625
|
-
let n =
|
|
3632
|
+
let n = u.join(t, e.name), { frontmatter: r, content: i } = ca(await s.readFile(n, "utf-8"));
|
|
3626
3633
|
return {
|
|
3627
3634
|
frontmatter: r,
|
|
3628
3635
|
content: i,
|
|
@@ -3630,44 +3637,44 @@ async function ua(e) {
|
|
|
3630
3637
|
};
|
|
3631
3638
|
}));
|
|
3632
3639
|
}
|
|
3633
|
-
async function
|
|
3640
|
+
async function ma(e, t) {
|
|
3634
3641
|
if (t === "cursor") return;
|
|
3635
|
-
let n =
|
|
3636
|
-
await
|
|
3642
|
+
let n = fa[t], r = await pa(e), i = u.join(e, n.rulesDir);
|
|
3643
|
+
await s.mkdir(i, { recursive: !0 }), await Promise.all(r.map((e) => {
|
|
3637
3644
|
let t = n.convert(e), r = e.filename.replace(/\.mdc$/, n.extension);
|
|
3638
|
-
return
|
|
3639
|
-
})), await
|
|
3645
|
+
return s.writeFile(u.join(i, r), t, "utf-8");
|
|
3646
|
+
})), await er(u.join(e, te)), await er(u.join(e, M));
|
|
3640
3647
|
}
|
|
3641
3648
|
//#endregion
|
|
3642
3649
|
//#region src/core/env-files.ts
|
|
3643
|
-
var
|
|
3650
|
+
var ha = [
|
|
3644
3651
|
"apps",
|
|
3645
3652
|
"packages",
|
|
3646
3653
|
"libs",
|
|
3647
3654
|
"shared"
|
|
3648
3655
|
];
|
|
3649
|
-
async function
|
|
3650
|
-
let t = await
|
|
3656
|
+
async function ga(e) {
|
|
3657
|
+
let t = await _a(e);
|
|
3651
3658
|
return (await Promise.all(t.map(async (t) => {
|
|
3652
|
-
let n =
|
|
3653
|
-
return await
|
|
3659
|
+
let n = u.join(u.dirname(t), ".env");
|
|
3660
|
+
return await Y(n) ? null : (await s.copyFile(t, n), u.relative(e, n));
|
|
3654
3661
|
}))).filter((e) => e !== null).sort();
|
|
3655
3662
|
}
|
|
3656
|
-
async function
|
|
3657
|
-
let t = [
|
|
3658
|
-
let n =
|
|
3659
|
-
return (await
|
|
3663
|
+
async function _a(e) {
|
|
3664
|
+
let t = [u.join(e, ".env.example")], n = await Promise.all(ha.map(async (t) => {
|
|
3665
|
+
let n = u.join(e, t);
|
|
3666
|
+
return (await s.readdir(n, { withFileTypes: !0 }).catch(() => [])).filter((e) => e.isDirectory()).map((e) => u.join(n, e.name, ".env.example"));
|
|
3660
3667
|
}));
|
|
3661
|
-
return t.push(...n.flat()), (await Promise.all(t.map(async (e) => await
|
|
3668
|
+
return t.push(...n.flat()), (await Promise.all(t.map(async (e) => await Y(e) ? e : null))).filter((e) => e !== null);
|
|
3662
3669
|
}
|
|
3663
3670
|
//#endregion
|
|
3664
3671
|
//#region src/core/post-clone.ts
|
|
3665
|
-
var Q = "@hype-stack/",
|
|
3666
|
-
async function
|
|
3667
|
-
await
|
|
3672
|
+
var Q = "@hype-stack/", va = "hype-stack";
|
|
3673
|
+
async function ya(e) {
|
|
3674
|
+
await er(u.join(e, ".git"));
|
|
3668
3675
|
}
|
|
3669
|
-
async function
|
|
3670
|
-
await
|
|
3676
|
+
async function ba(e) {
|
|
3677
|
+
await J("git", ["init"], { cwd: e }), await J("git", ["add", "."], { cwd: e }), await J("git", [
|
|
3671
3678
|
"-c",
|
|
3672
3679
|
"user.name=Hype Stack CLI",
|
|
3673
3680
|
"-c",
|
|
@@ -3677,22 +3684,22 @@ async function _a(e) {
|
|
|
3677
3684
|
"Initial commit from Hype Stack CLI"
|
|
3678
3685
|
], { cwd: e });
|
|
3679
3686
|
}
|
|
3680
|
-
async function
|
|
3681
|
-
let n = `@${t}/`, r = await
|
|
3687
|
+
async function xa(e, t) {
|
|
3688
|
+
let n = `@${t}/`, r = await Ta(e);
|
|
3682
3689
|
for (let e of r) {
|
|
3683
|
-
let t = await
|
|
3690
|
+
let t = await Zn(e);
|
|
3684
3691
|
if (!t) continue;
|
|
3685
3692
|
let r = !1;
|
|
3686
|
-
t.name?.startsWith(Q) && (t.name = t.name.replace(Q, n), r = !0),
|
|
3687
|
-
let i = await
|
|
3693
|
+
t.name?.startsWith(Q) && (t.name = t.name.replace(Q, n), r = !0), Sa(t.dependencies, n) && (r = !0), Sa(t.devDependencies, n) && (r = !0), t.nx && Ca(t.nx, n) && (r = !0);
|
|
3694
|
+
let i = await s.readFile(e, "utf-8");
|
|
3688
3695
|
if (i.includes(Q)) {
|
|
3689
3696
|
let t = i.replaceAll(Q, n);
|
|
3690
|
-
await
|
|
3691
|
-
} else r && await
|
|
3697
|
+
await s.writeFile(e, t, "utf-8");
|
|
3698
|
+
} else r && await Qn(e, t);
|
|
3692
3699
|
}
|
|
3693
|
-
await
|
|
3700
|
+
await hi(e, t), await wa(e, t);
|
|
3694
3701
|
}
|
|
3695
|
-
function
|
|
3702
|
+
function Sa(e, t) {
|
|
3696
3703
|
if (!e) return !1;
|
|
3697
3704
|
let n = !1;
|
|
3698
3705
|
for (let r of Object.keys(e)) if (r.startsWith(Q)) {
|
|
@@ -3701,7 +3708,7 @@ function ya(e, t) {
|
|
|
3701
3708
|
}
|
|
3702
3709
|
return n;
|
|
3703
3710
|
}
|
|
3704
|
-
function
|
|
3711
|
+
function Ca(e, t) {
|
|
3705
3712
|
if (!e) return !1;
|
|
3706
3713
|
let n = !1;
|
|
3707
3714
|
if (e.implicitDependencies &&= e.implicitDependencies.map((e) => e.startsWith(Q) ? (n = !0, e.replace(Q, t)) : e), e.targets) {
|
|
@@ -3709,54 +3716,54 @@ function ba(e, t) {
|
|
|
3709
3716
|
}
|
|
3710
3717
|
return n;
|
|
3711
3718
|
}
|
|
3712
|
-
async function
|
|
3713
|
-
let n =
|
|
3719
|
+
async function wa(e, t) {
|
|
3720
|
+
let n = u.join(e, "packages/enums/src/app/index.ts"), r = await s.readFile(n, "utf-8").catch(() => null);
|
|
3714
3721
|
if (!r) return;
|
|
3715
|
-
let i = t.split("-").map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" "), a = r.replaceAll(`id: "${
|
|
3716
|
-
await
|
|
3722
|
+
let i = t.split("-").map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" "), a = r.replaceAll(`id: "${va}"`, `id: "${t}"`).replaceAll(`name: "${va}"`, `name: "${t}"`).replace(/name: "Hype Stack"/, `name: "${i}"`).replace(/description: ".*?"/, `description: "${i} application"`);
|
|
3723
|
+
await s.writeFile(n, a, "utf-8");
|
|
3717
3724
|
}
|
|
3718
|
-
async function
|
|
3719
|
-
let t = [], n =
|
|
3720
|
-
(await
|
|
3725
|
+
async function Ta(e) {
|
|
3726
|
+
let t = [], n = u.join(e, "package.json");
|
|
3727
|
+
(await s.stat(n).catch(() => null))?.isFile() && t.push(n);
|
|
3721
3728
|
for (let n of [
|
|
3722
3729
|
"apps",
|
|
3723
3730
|
"packages",
|
|
3724
3731
|
"libs",
|
|
3725
3732
|
"shared"
|
|
3726
3733
|
]) {
|
|
3727
|
-
let r =
|
|
3734
|
+
let r = u.join(e, n), i = await s.readdir(r, { withFileTypes: !0 }).catch(() => []);
|
|
3728
3735
|
for (let e of i) {
|
|
3729
3736
|
if (!e.isDirectory()) continue;
|
|
3730
|
-
let n =
|
|
3731
|
-
(await
|
|
3737
|
+
let n = u.join(r, e.name, "package.json");
|
|
3738
|
+
(await s.stat(n).catch(() => null))?.isFile() && t.push(n);
|
|
3732
3739
|
}
|
|
3733
3740
|
}
|
|
3734
3741
|
return t;
|
|
3735
3742
|
}
|
|
3736
3743
|
//#endregion
|
|
3737
3744
|
//#region src/core/post-setup.ts
|
|
3738
|
-
async function
|
|
3739
|
-
return (await
|
|
3745
|
+
async function Ea() {
|
|
3746
|
+
return (await J("docker", ["info"], { cwd: process.cwd() })).exitCode === 0;
|
|
3740
3747
|
}
|
|
3741
|
-
async function
|
|
3742
|
-
return
|
|
3748
|
+
async function Da(e) {
|
|
3749
|
+
return Y(`${e}/apps/backend/.env`);
|
|
3743
3750
|
}
|
|
3744
|
-
async function
|
|
3745
|
-
let r = n ? `Start services with ${
|
|
3751
|
+
async function Oa(e, t, n) {
|
|
3752
|
+
let r = n ? `Start services with ${R.command("docker compose up -d")}?` : `Docker is not running. Start services with ${R.command("docker compose up -d")}?`, i = t ? !0 : await o.confirm({
|
|
3746
3753
|
message: r,
|
|
3747
3754
|
initialValue: !0
|
|
3748
3755
|
});
|
|
3749
|
-
if (
|
|
3750
|
-
let
|
|
3751
|
-
return
|
|
3756
|
+
if (o.isCancel(i) && Z(), !i) return o.log.info(R.muted("Skipping Docker services and database migrations.")), !1;
|
|
3757
|
+
let a = o.spinner();
|
|
3758
|
+
return a.start("Starting Docker services..."), (await J("docker", [
|
|
3752
3759
|
"compose",
|
|
3753
3760
|
"up",
|
|
3754
3761
|
"-d"
|
|
3755
|
-
], { cwd: `${e}/apps/backend` })).exitCode === 0 ? (
|
|
3762
|
+
], { cwd: `${e}/apps/backend` })).exitCode === 0 ? (a.stop(R.success("Docker services started")), !0) : (a.stop(R.warning("Failed to start Docker services")), o.log.warn(R.muted("Run `docker compose up -d` in apps/backend manually to start services.")), o.log.info(R.muted("Skipping database migrations.")), !1);
|
|
3756
3763
|
}
|
|
3757
|
-
async function
|
|
3764
|
+
async function ka(e, t = 15, n = 2e3) {
|
|
3758
3765
|
for (let r = 0; r < t; r++) {
|
|
3759
|
-
if ((await
|
|
3766
|
+
if ((await J("docker", [
|
|
3760
3767
|
"compose",
|
|
3761
3768
|
"exec",
|
|
3762
3769
|
"-T",
|
|
@@ -3769,50 +3776,50 @@ async function Ea(e, t = 15, n = 2e3) {
|
|
|
3769
3776
|
}
|
|
3770
3777
|
return !1;
|
|
3771
3778
|
}
|
|
3772
|
-
async function
|
|
3773
|
-
if (!await
|
|
3774
|
-
|
|
3779
|
+
async function Aa(e, t, n = {}) {
|
|
3780
|
+
if (!await Da(e)) {
|
|
3781
|
+
o.log.warn(`${R.path(".env")} not found in ${R.path("apps/backend")}. Skipping Docker and migrations - configure it first.`);
|
|
3775
3782
|
return;
|
|
3776
3783
|
}
|
|
3777
|
-
if (!await
|
|
3778
|
-
let r =
|
|
3779
|
-
if (r.start("Waiting for Postgres to be ready..."), !await
|
|
3780
|
-
r.stop(
|
|
3784
|
+
if (!await Oa(e, t, await Ea())) return;
|
|
3785
|
+
let r = o.spinner();
|
|
3786
|
+
if (r.start("Waiting for Postgres to be ready..."), !await ka(e, n.postgresMaxAttempts ?? 15, n.postgresCheckIntervalMs ?? 2e3)) {
|
|
3787
|
+
r.stop(R.warning("Postgres health check timed out")), o.log.warn(R.muted("Run migrations manually once Postgres is ready: pnpm --filter @internal/backend migration:latest"));
|
|
3781
3788
|
return;
|
|
3782
3789
|
}
|
|
3783
|
-
r.stop(
|
|
3784
|
-
let i = t ? !0 : await
|
|
3785
|
-
message: `Run database migrations with ${
|
|
3790
|
+
r.stop(R.success("Postgres is ready"));
|
|
3791
|
+
let i = t ? !0 : await o.confirm({
|
|
3792
|
+
message: `Run database migrations with ${R.command("prisma migrate deploy")}?`,
|
|
3786
3793
|
initialValue: !0
|
|
3787
3794
|
});
|
|
3788
|
-
if (
|
|
3789
|
-
|
|
3795
|
+
if (o.isCancel(i) && Z(), !i) {
|
|
3796
|
+
o.log.info(R.muted("Skipping database migrations."));
|
|
3790
3797
|
return;
|
|
3791
3798
|
}
|
|
3792
|
-
let
|
|
3793
|
-
if (
|
|
3799
|
+
let a = o.spinner();
|
|
3800
|
+
if (a.start("Running database migrations..."), (await J("pnpm", [
|
|
3794
3801
|
"--filter",
|
|
3795
3802
|
"@internal/backend",
|
|
3796
3803
|
"migration:latest"
|
|
3797
3804
|
], { cwd: e })).exitCode !== 0) {
|
|
3798
|
-
|
|
3805
|
+
a.stop(R.warning("Migrations failed")), o.log.warn(R.muted("Run `pnpm --filter @internal/backend migration:latest` manually to apply migrations."));
|
|
3799
3806
|
return;
|
|
3800
3807
|
}
|
|
3801
|
-
|
|
3802
|
-
let s =
|
|
3803
|
-
if (s.start("Generating Prisma client..."), (await
|
|
3808
|
+
a.stop(R.success("Database migrations applied"));
|
|
3809
|
+
let s = o.spinner();
|
|
3810
|
+
if (s.start("Generating Prisma client..."), (await J("pnpm", [
|
|
3804
3811
|
"--filter",
|
|
3805
3812
|
"@internal/backend",
|
|
3806
3813
|
"generate"
|
|
3807
3814
|
], { cwd: e })).exitCode !== 0) {
|
|
3808
|
-
s.stop(
|
|
3815
|
+
s.stop(R.warning("Prisma client generation failed")), o.log.warn(R.muted("Run `pnpm --filter @internal/backend generate` manually."));
|
|
3809
3816
|
return;
|
|
3810
3817
|
}
|
|
3811
|
-
s.stop(
|
|
3818
|
+
s.stop(R.success("Prisma client generated"));
|
|
3812
3819
|
}
|
|
3813
3820
|
//#endregion
|
|
3814
3821
|
//#region src/core/readme.ts
|
|
3815
|
-
var
|
|
3822
|
+
var ja = {
|
|
3816
3823
|
cursor: {
|
|
3817
3824
|
label: "Cursor",
|
|
3818
3825
|
rulesDir: ".cursor/rules"
|
|
@@ -3829,24 +3836,24 @@ var Oa = {
|
|
|
3829
3836
|
label: "GitHub Copilot",
|
|
3830
3837
|
rulesDir: ".github/instructions"
|
|
3831
3838
|
}
|
|
3832
|
-
},
|
|
3839
|
+
}, Ma = {
|
|
3833
3840
|
backend: "Hono API server (Postgres, Prisma, Kysely, Valkey cache, WorkOS auth)",
|
|
3834
3841
|
frontend: "React + Vite app talking to the backend through the typed HyperFetch SDK"
|
|
3835
|
-
},
|
|
3842
|
+
}, Na = {
|
|
3836
3843
|
enums: "Shared enums and app config used across apps",
|
|
3837
3844
|
cli: "Project tooling and code generators"
|
|
3838
3845
|
};
|
|
3839
|
-
function
|
|
3846
|
+
function Pa(e) {
|
|
3840
3847
|
return e.split(/[-_]/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ");
|
|
3841
3848
|
}
|
|
3842
|
-
function
|
|
3849
|
+
function Fa(e, t) {
|
|
3843
3850
|
return Object.entries(e).toSorted(([e], [t]) => e.localeCompare(t)).map(([e, n]) => {
|
|
3844
3851
|
let r = t[e];
|
|
3845
3852
|
return r ? `- \`${n}\` - ${r}` : `- \`${n}\``;
|
|
3846
3853
|
});
|
|
3847
3854
|
}
|
|
3848
|
-
function
|
|
3849
|
-
let { projectName: t, editor: n, workspace: r } = e, i =
|
|
3855
|
+
function Ia(e) {
|
|
3856
|
+
let { projectName: t, editor: n, workspace: r } = e, i = Pa(t), a = ja[n], o = !!r.apps.backend, s = Fa(r.apps, Ma), c = Fa(r.packages, Na), l = [];
|
|
3850
3857
|
s.length > 0 && l.push(...s), c.length > 0 && l.push(...c), l.push("- `stack.json` - Hype Stack workspace config (apps, paths, installed packs)");
|
|
3851
3858
|
let u = [];
|
|
3852
3859
|
u.push(`# ${i}`), u.push([
|
|
@@ -3954,63 +3961,119 @@ function Na(e) {
|
|
|
3954
3961
|
"stays useful."
|
|
3955
3962
|
].join("\n")), u.join("\n\n") + "\n";
|
|
3956
3963
|
}
|
|
3957
|
-
async function
|
|
3958
|
-
let n =
|
|
3959
|
-
await
|
|
3964
|
+
async function La(e, t) {
|
|
3965
|
+
let n = u.join(e, "README.md");
|
|
3966
|
+
await s.writeFile(n, Ia(t), "utf-8");
|
|
3960
3967
|
}
|
|
3961
3968
|
//#endregion
|
|
3962
3969
|
//#region src/core/tracking.ts
|
|
3963
|
-
async function
|
|
3970
|
+
async function Ra(e) {
|
|
3964
3971
|
try {
|
|
3965
3972
|
let t = {
|
|
3966
|
-
"X-Device-Id":
|
|
3967
|
-
"X-Client-Info":
|
|
3968
|
-
}, n = await
|
|
3969
|
-
n?.token && (t.Authorization = `Bearer ${n.token}`), await
|
|
3973
|
+
"X-Device-Id": Vn(),
|
|
3974
|
+
"X-Client-Info": Hn()
|
|
3975
|
+
}, n = await Ln(N()).catch(() => null);
|
|
3976
|
+
n?.token && (t.Authorization = `Bearer ${n.token}`), await q.createRequest()({
|
|
3970
3977
|
endpoint: "/cli/track",
|
|
3971
3978
|
method: "POST"
|
|
3972
3979
|
}).setPayload({ event: e }).setHeaders(t).send();
|
|
3973
3980
|
} catch {}
|
|
3974
3981
|
}
|
|
3975
3982
|
//#endregion
|
|
3983
|
+
//#region src/ui/swatch.ts
|
|
3984
|
+
function za(e) {
|
|
3985
|
+
let t = e.trim().match(/^oklch\(([^)]+)\)$/i);
|
|
3986
|
+
if (!t) return null;
|
|
3987
|
+
let n = t[1].trim().split(/\s+/);
|
|
3988
|
+
if (n.length < 3) return null;
|
|
3989
|
+
let r = n[0], i = Number(n[1]), a = Number(n[2]);
|
|
3990
|
+
if (Number.isNaN(i) || Number.isNaN(a)) return null;
|
|
3991
|
+
let o;
|
|
3992
|
+
if (r.endsWith("%")) {
|
|
3993
|
+
let e = Number(r.slice(0, -1));
|
|
3994
|
+
if (Number.isNaN(e)) return null;
|
|
3995
|
+
o = e / 100;
|
|
3996
|
+
} else if (o = Number(r), Number.isNaN(o)) return null;
|
|
3997
|
+
return {
|
|
3998
|
+
l: o,
|
|
3999
|
+
c: i,
|
|
4000
|
+
h: a
|
|
4001
|
+
};
|
|
4002
|
+
}
|
|
4003
|
+
function Ba(e) {
|
|
4004
|
+
return Math.min(255, Math.max(0, Math.round(e)));
|
|
4005
|
+
}
|
|
4006
|
+
function Va(e) {
|
|
4007
|
+
return e <= .0031308 ? 12.92 * e : 1.055 * e ** (1 / 2.4) - .055;
|
|
4008
|
+
}
|
|
4009
|
+
function Ha({ l: e, c: t, h: n }) {
|
|
4010
|
+
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;
|
|
4011
|
+
return [
|
|
4012
|
+
Ba(Va(f) * 255),
|
|
4013
|
+
Ba(Va(p) * 255),
|
|
4014
|
+
Ba(Va(m) * 255)
|
|
4015
|
+
];
|
|
4016
|
+
}
|
|
4017
|
+
var Ua = "\x1B[49m";
|
|
4018
|
+
function Wa(e, t) {
|
|
4019
|
+
let n = e[t];
|
|
4020
|
+
if (!n) return c.dim(" ");
|
|
4021
|
+
let r = za(n);
|
|
4022
|
+
if (!r) return c.dim(" ");
|
|
4023
|
+
let [i, a, o] = Ha(r);
|
|
4024
|
+
return `\x1b[48;2;${i};${a};${o}m ${Ua}`;
|
|
4025
|
+
}
|
|
4026
|
+
var Ga = [
|
|
4027
|
+
"primary",
|
|
4028
|
+
"secondary",
|
|
4029
|
+
"accent"
|
|
4030
|
+
];
|
|
4031
|
+
function Ka(e) {
|
|
4032
|
+
return Ga.map((t) => Wa(e, t)).join("");
|
|
4033
|
+
}
|
|
4034
|
+
function qa(e) {
|
|
4035
|
+
return `${Ka(e.light)} ${c.dim("·")} ${Ka(e.dark)}`;
|
|
4036
|
+
}
|
|
4037
|
+
//#endregion
|
|
3976
4038
|
//#region src/utils/validate.ts
|
|
3977
|
-
function
|
|
4039
|
+
function Ja(e) {
|
|
3978
4040
|
if (!e.trim()) return "Project name cannot be empty";
|
|
3979
|
-
if (!
|
|
4041
|
+
if (!ee.test(e)) return "Project name must be lowercase, alphanumeric, and may contain hyphens, dots, or underscores";
|
|
3980
4042
|
if (e.length > 214) return "Project name is too long (max 214 characters)";
|
|
3981
4043
|
}
|
|
3982
4044
|
//#endregion
|
|
3983
4045
|
//#region src/commands/create.ts
|
|
3984
|
-
async function
|
|
3985
|
-
|
|
3986
|
-
let
|
|
3987
|
-
if (
|
|
3988
|
-
let e =
|
|
3989
|
-
e && (
|
|
4046
|
+
async function Ya(a) {
|
|
4047
|
+
Qi(), o.intro(R.brandBold("Create a new Hype Stack project"));
|
|
4048
|
+
let s = a.yes === !0, c;
|
|
4049
|
+
if (s && a.name) {
|
|
4050
|
+
let e = Ja(a.name);
|
|
4051
|
+
e && (o.log.error(e), Z()), c = a.name;
|
|
3990
4052
|
} else {
|
|
3991
|
-
let e = await
|
|
4053
|
+
let e = await o.text({
|
|
3992
4054
|
message: "What is your project named?",
|
|
3993
4055
|
placeholder: "my-app",
|
|
3994
|
-
initialValue:
|
|
3995
|
-
validate: (e) =>
|
|
4056
|
+
initialValue: a.name ?? "",
|
|
4057
|
+
validate: (e) => Ja(e ?? "")
|
|
3996
4058
|
});
|
|
3997
|
-
|
|
4059
|
+
o.isCancel(e) && Z(), c = e;
|
|
3998
4060
|
}
|
|
3999
|
-
let
|
|
4000
|
-
if (
|
|
4061
|
+
let l;
|
|
4062
|
+
if (s) l = a.directory ?? `./${c}`;
|
|
4001
4063
|
else {
|
|
4002
|
-
let e = await
|
|
4064
|
+
let e = await o.text({
|
|
4003
4065
|
message: "Where should we create it?",
|
|
4004
|
-
placeholder: `./${
|
|
4005
|
-
initialValue:
|
|
4066
|
+
placeholder: `./${c}`,
|
|
4067
|
+
initialValue: a.directory ?? `./${c}`
|
|
4006
4068
|
});
|
|
4007
|
-
|
|
4069
|
+
o.isCancel(e) && Z(), l = e;
|
|
4008
4070
|
}
|
|
4009
|
-
|
|
4010
|
-
|
|
4011
|
-
|
|
4071
|
+
a.directory === void 0 && (l = tr(l, c));
|
|
4072
|
+
let d = a.editor && A.includes(a.editor) ? a.editor : null, f;
|
|
4073
|
+
if (d) f = d;
|
|
4074
|
+
else if (s) f = "cursor";
|
|
4012
4075
|
else {
|
|
4013
|
-
let e = await
|
|
4076
|
+
let e = await o.select({
|
|
4014
4077
|
message: "Which code editor do you use?",
|
|
4015
4078
|
options: k.map((e) => ({
|
|
4016
4079
|
value: e.value,
|
|
@@ -4019,143 +4082,147 @@ async function La(i) {
|
|
|
4019
4082
|
})),
|
|
4020
4083
|
initialValue: "cursor"
|
|
4021
4084
|
});
|
|
4022
|
-
|
|
4085
|
+
o.isCancel(e) && Z(), f = e;
|
|
4023
4086
|
}
|
|
4024
|
-
let
|
|
4025
|
-
if (
|
|
4026
|
-
else if (
|
|
4087
|
+
let p = a.theme !== void 0 && i(a.theme), m;
|
|
4088
|
+
if (p) m = a.theme;
|
|
4089
|
+
else if (s) m = e;
|
|
4027
4090
|
else {
|
|
4028
|
-
let
|
|
4091
|
+
let t = await o.select({
|
|
4029
4092
|
message: "Pick a color theme",
|
|
4030
|
-
options:
|
|
4093
|
+
options: n.map((e) => ({
|
|
4094
|
+
value: e.name,
|
|
4095
|
+
label: `${qa(e)} ${e.label}`,
|
|
4096
|
+
hint: e.hint
|
|
4097
|
+
})),
|
|
4031
4098
|
initialValue: e
|
|
4032
4099
|
});
|
|
4033
|
-
|
|
4100
|
+
o.isCancel(t) && Z(), m = t;
|
|
4034
4101
|
}
|
|
4035
|
-
if (!
|
|
4036
|
-
let e = k.find((e) => e.value ===
|
|
4037
|
-
(
|
|
4102
|
+
if (!s) {
|
|
4103
|
+
let e = k.find((e) => e.value === f)?.label ?? f, n = t.find((e) => e.value === m)?.label ?? m, r = await o.confirm({ message: `Create ${R.highlight(c)} in ${R.path(l)} with ${R.highlight(e)} config and the ${R.highlight(n)} theme?` });
|
|
4104
|
+
(o.isCancel(r) || !r) && Z();
|
|
4038
4105
|
}
|
|
4039
|
-
let
|
|
4040
|
-
if (await
|
|
4041
|
-
let e = await
|
|
4042
|
-
message: `Directory ${
|
|
4106
|
+
let h = u.resolve(l);
|
|
4107
|
+
if (await Yn(h) && !await Xn(h)) {
|
|
4108
|
+
let e = await o.confirm({
|
|
4109
|
+
message: `Directory ${R.path(h)} is not empty. Continue anyway?`,
|
|
4043
4110
|
initialValue: !1
|
|
4044
4111
|
});
|
|
4045
|
-
(
|
|
4046
|
-
}
|
|
4047
|
-
let
|
|
4048
|
-
|
|
4049
|
-
let
|
|
4050
|
-
|
|
4051
|
-
let
|
|
4052
|
-
await
|
|
4053
|
-
projectName:
|
|
4054
|
-
editor:
|
|
4055
|
-
workspace:
|
|
4056
|
-
}),
|
|
4057
|
-
let
|
|
4058
|
-
|
|
4059
|
-
let
|
|
4060
|
-
|
|
4061
|
-
let
|
|
4062
|
-
|
|
4063
|
-
let
|
|
4064
|
-
if (
|
|
4065
|
-
let e =
|
|
4066
|
-
|
|
4067
|
-
} else
|
|
4068
|
-
|
|
4069
|
-
let
|
|
4070
|
-
|
|
4071
|
-
let
|
|
4112
|
+
(o.isCancel(e) || !e) && Z();
|
|
4113
|
+
}
|
|
4114
|
+
let g = o.spinner();
|
|
4115
|
+
g.start("Cloning Hype Stack template..."), await ta(h), g.stop(R.success("Template cloned"));
|
|
4116
|
+
let _ = o.spinner();
|
|
4117
|
+
_.start("Setting up project..."), await ya(h), await xa(h, c), await ma(h, f);
|
|
4118
|
+
let v = await sr(h), y = lr(c, v);
|
|
4119
|
+
await or(h, y), await La(h, {
|
|
4120
|
+
projectName: c,
|
|
4121
|
+
editor: f,
|
|
4122
|
+
workspace: v
|
|
4123
|
+
}), i(m) && (await sa(u.resolve(h, y.paths?.frontend.root ?? "apps/frontend"), r(m)) || o.log.warn(R.muted(`Could not find ${R.path("assets/styles.css")} to apply the ${m} theme`))), _.stop(R.success("Project configured"));
|
|
4124
|
+
let b = o.spinner();
|
|
4125
|
+
b.start("Installing dependencies..."), (await J("pnpm", ["install"], { cwd: h })).exitCode === 0 ? b.stop(R.success("Dependencies installed")) : (b.stop(R.warning("Dependencies installed with warnings")), o.log.warn(R.muted("You may need to run `pnpm install` manually to resolve issues.")));
|
|
4126
|
+
let x = o.spinner();
|
|
4127
|
+
x.start("Initializing git repository..."), await ba(h), x.stop(R.success("Git repository initialized with clean history"));
|
|
4128
|
+
let S = o.spinner();
|
|
4129
|
+
S.start("Creating .env files from examples...");
|
|
4130
|
+
let C = await ga(h);
|
|
4131
|
+
if (C.length > 0) {
|
|
4132
|
+
let e = C.length;
|
|
4133
|
+
S.stop(R.success(`Created ${e} .env file${e === 1 ? "" : "s"} from examples`));
|
|
4134
|
+
} else S.stop(R.muted("No .env.example files to copy"));
|
|
4135
|
+
o.log.success(`${R.brandBold("Hype Stack")} project ${R.highlight(c)} is ready!`);
|
|
4136
|
+
let w = u.relative(process.cwd(), h) || ".", T = [`${R.command(`cd ${w}`)}`];
|
|
4137
|
+
C.length > 0 ? T.push(`Review your ${R.path(".env")} files and fill in any secrets`) : T.push(`Copy ${R.path(".env.example")} to ${R.path(".env")} and configure`), ea(T);
|
|
4138
|
+
let E = a.setup !== !1 && (s || await o.confirm({
|
|
4072
4139
|
message: "Would you like to start Docker services and run database migrations now?",
|
|
4073
4140
|
initialValue: !0
|
|
4074
4141
|
}));
|
|
4075
|
-
|
|
4076
|
-
`${
|
|
4077
|
-
`${
|
|
4078
|
-
`${
|
|
4079
|
-
])),
|
|
4142
|
+
o.isCancel(E) && Z(), E ? await Aa(h, s) : (o.log.info(R.muted("You can start services later:")), ea([
|
|
4143
|
+
`${R.command("docker compose up -d")} ${R.muted("(in apps/backend - start Postgres, Valkey, RustFS)")}`,
|
|
4144
|
+
`${R.command("pnpm --filter @internal/backend migration:latest")} ${R.muted("(apply migrations)")}`,
|
|
4145
|
+
`${R.command("pnpm run generate")} ${R.muted("(generate Prisma client)")}`
|
|
4146
|
+
])), ea([`${R.command("pnpm dev")} ${R.muted("(start frontend + backend)")}`]), await Ra("project_create"), o.outro(R.muted("Happy building!"));
|
|
4080
4147
|
}
|
|
4081
4148
|
//#endregion
|
|
4082
4149
|
//#region src/commands/init.ts
|
|
4083
|
-
async function
|
|
4150
|
+
async function Xa(e) {
|
|
4084
4151
|
let t = e.cwd ?? process.cwd(), n = e.silent ?? !1;
|
|
4085
|
-
if (n || (
|
|
4086
|
-
|
|
4152
|
+
if (n || ($i(), o.intro(R.brandBold("Initialize Hype Stack configuration"))), !await ur(t)) {
|
|
4153
|
+
o.log.error(`This doesn't look like a Hype Stack project. ${R.muted("Expected apps/ directory and package.json")}`), o.outro(R.muted(`Run ${R.command("hype-stack create")} to scaffold a new project.`));
|
|
4087
4154
|
return;
|
|
4088
4155
|
}
|
|
4089
|
-
if (await
|
|
4090
|
-
let e = await
|
|
4156
|
+
if (await ar(t)) {
|
|
4157
|
+
let e = await ir(t);
|
|
4091
4158
|
if (e && !n) {
|
|
4092
|
-
|
|
4093
|
-
let t = await
|
|
4159
|
+
o.log.info(`Found existing ${R.path("stack.json")} for project ${R.highlight(e.name)}`);
|
|
4160
|
+
let t = await o.confirm({
|
|
4094
4161
|
message: "Overwrite existing configuration?",
|
|
4095
4162
|
initialValue: !1
|
|
4096
4163
|
});
|
|
4097
|
-
if (
|
|
4098
|
-
|
|
4164
|
+
if (o.isCancel(t) || !t) {
|
|
4165
|
+
o.outro(R.muted("Keeping existing configuration."));
|
|
4099
4166
|
return;
|
|
4100
4167
|
}
|
|
4101
4168
|
}
|
|
4102
4169
|
}
|
|
4103
|
-
let r = await
|
|
4170
|
+
let r = await sr(t);
|
|
4104
4171
|
if (!n) {
|
|
4105
4172
|
let e = Object.entries(r.apps), t = Object.entries(r.packages);
|
|
4106
4173
|
if (e.length > 0) {
|
|
4107
|
-
|
|
4108
|
-
for (let [t, n] of e)
|
|
4174
|
+
o.log.info(R.bold("Detected apps:"));
|
|
4175
|
+
for (let [t, n] of e) o.log.message(` ${z.arrow} ${R.highlight(t)} ${R.muted(`→ ${n}`)}`);
|
|
4109
4176
|
}
|
|
4110
4177
|
if (t.length > 0) {
|
|
4111
|
-
|
|
4112
|
-
for (let [e, n] of t)
|
|
4178
|
+
o.log.info(R.bold("Detected packages:"));
|
|
4179
|
+
for (let [e, n] of t) o.log.message(` ${z.arrow} ${R.highlight(e)} ${R.muted(`→ ${n}`)}`);
|
|
4113
4180
|
}
|
|
4114
|
-
e.length === 0 && t.length === 0 &&
|
|
4181
|
+
e.length === 0 && t.length === 0 && o.log.warn("No apps or packages detected in the workspace.");
|
|
4115
4182
|
}
|
|
4116
|
-
let i = (await
|
|
4183
|
+
let i = (await Zn(u.join(t, "package.json")))?.name?.replace(/^@/, "").replace(/\/source$/, "") ?? "my-app", a = i;
|
|
4117
4184
|
if (!n) {
|
|
4118
|
-
let e = await
|
|
4185
|
+
let e = await o.text({
|
|
4119
4186
|
message: "Project name for stack.json?",
|
|
4120
4187
|
placeholder: i,
|
|
4121
4188
|
initialValue: i
|
|
4122
4189
|
});
|
|
4123
|
-
|
|
4190
|
+
o.isCancel(e) && Z(), a = e;
|
|
4124
4191
|
}
|
|
4125
|
-
await
|
|
4192
|
+
await or(t, lr(a, r)), n || (o.log.success(`${R.path("stack.json")} written successfully`), o.outro(R.muted("Your project is mapped and ready for Hype Stack CLI commands.")));
|
|
4126
4193
|
}
|
|
4127
|
-
async function
|
|
4128
|
-
if (await
|
|
4129
|
-
let n = t.runInit ?? ((e) =>
|
|
4194
|
+
async function Za(e, t = {}) {
|
|
4195
|
+
if (await ar(e)) return !0;
|
|
4196
|
+
let n = t.runInit ?? ((e) => Xa({
|
|
4130
4197
|
cwd: e,
|
|
4131
4198
|
silent: !0
|
|
4132
|
-
})), r = t.runCreate ?? ((e) =>
|
|
4133
|
-
if (await
|
|
4134
|
-
|
|
4135
|
-
let t = await
|
|
4136
|
-
message: `Create ${
|
|
4199
|
+
})), r = t.runCreate ?? ((e) => Ya({ directory: e }));
|
|
4200
|
+
if (await ur(e)) {
|
|
4201
|
+
o.log.warn(`No ${R.path("stack.json")} found in ${R.path(e)}.`);
|
|
4202
|
+
let t = await o.confirm({
|
|
4203
|
+
message: `Create ${R.path("stack.json")} now?`,
|
|
4137
4204
|
initialValue: !0
|
|
4138
4205
|
});
|
|
4139
|
-
if (
|
|
4206
|
+
if (o.isCancel(t) || !t) return !1;
|
|
4140
4207
|
await n(e);
|
|
4141
|
-
let r = await
|
|
4142
|
-
return r &&
|
|
4208
|
+
let r = await ar(e);
|
|
4209
|
+
return r && o.log.success(`${R.path("stack.json")} created`), r;
|
|
4143
4210
|
}
|
|
4144
|
-
|
|
4145
|
-
let i = await
|
|
4146
|
-
message: `Is ${
|
|
4211
|
+
o.log.warn(`This doesn't look like a Hype Stack project, and there's no ${R.path("stack.json")} here.`);
|
|
4212
|
+
let i = await o.confirm({
|
|
4213
|
+
message: `Is ${R.path(e)} where you want to work?`,
|
|
4147
4214
|
initialValue: !0
|
|
4148
4215
|
});
|
|
4149
|
-
if (
|
|
4150
|
-
let
|
|
4216
|
+
if (o.isCancel(i) || !i) return !1;
|
|
4217
|
+
let a = await o.confirm({
|
|
4151
4218
|
message: "Create a new Hype Stack project here?",
|
|
4152
4219
|
initialValue: !0
|
|
4153
4220
|
});
|
|
4154
|
-
return
|
|
4221
|
+
return o.isCancel(a) || !a ? !1 : (await r(e), await ar(e));
|
|
4155
4222
|
}
|
|
4156
4223
|
//#endregion
|
|
4157
4224
|
//#region src/core/npm-deps.ts
|
|
4158
|
-
function
|
|
4225
|
+
function Qa(e, t) {
|
|
4159
4226
|
let n = [], r = [];
|
|
4160
4227
|
if (!e) return {
|
|
4161
4228
|
errors: n,
|
|
@@ -4186,7 +4253,7 @@ function Ba(e, t) {
|
|
|
4186
4253
|
operations: r
|
|
4187
4254
|
};
|
|
4188
4255
|
}
|
|
4189
|
-
function
|
|
4256
|
+
function $a(e) {
|
|
4190
4257
|
let t = {};
|
|
4191
4258
|
for (let n of e) if (n) for (let [e, r] of Object.entries(n)) t[e] = {
|
|
4192
4259
|
...t[e],
|
|
@@ -4194,15 +4261,15 @@ function Va(e) {
|
|
|
4194
4261
|
};
|
|
4195
4262
|
return t;
|
|
4196
4263
|
}
|
|
4197
|
-
async function
|
|
4264
|
+
async function eo(e, t, n = J) {
|
|
4198
4265
|
let r = [];
|
|
4199
4266
|
for (let i of e) {
|
|
4200
|
-
let e =
|
|
4201
|
-
if (!await
|
|
4267
|
+
let e = u.join(t, i.relativeDir);
|
|
4268
|
+
if (!await Y(u.join(e, "package.json"))) {
|
|
4202
4269
|
r.push(`Cannot install npm dependencies under "${i.relativeDir}": package.json not found.`);
|
|
4203
4270
|
continue;
|
|
4204
4271
|
}
|
|
4205
|
-
let a =
|
|
4272
|
+
let a = u.normalize(i.relativeDir), o;
|
|
4206
4273
|
try {
|
|
4207
4274
|
o = await n("pnpm", [
|
|
4208
4275
|
"add",
|
|
@@ -4230,36 +4297,36 @@ async function Ha(e, t, n = q) {
|
|
|
4230
4297
|
function $(e) {
|
|
4231
4298
|
return e instanceof Error ? e.message : String(e);
|
|
4232
4299
|
}
|
|
4233
|
-
async function
|
|
4300
|
+
async function to(e, t, n) {
|
|
4234
4301
|
let r = e.filter((e) => e.tier === "paid" && !t.has(e.name)).map((e) => e.name);
|
|
4235
|
-
return r.length === 0 ? {} :
|
|
4302
|
+
return r.length === 0 ? {} : _r(r, n).catch(() => ({}));
|
|
4236
4303
|
}
|
|
4237
|
-
function
|
|
4238
|
-
return e === "free" ?
|
|
4304
|
+
function no(e, t) {
|
|
4305
|
+
return e === "free" ? R.success("free") : e === "owned" ? R.accent("owned") : `${R.highlight(`$${t}`)} ${R.muted("locked")}`;
|
|
4239
4306
|
}
|
|
4240
|
-
async function
|
|
4307
|
+
async function ro(e, t, n) {
|
|
4241
4308
|
let r = e.filter((e) => t(e)), i = e.filter((e) => !t(e));
|
|
4242
|
-
i.length > 0 &&
|
|
4309
|
+
i.length > 0 && o.log.warning(`Skipping ${i.join(", ")} because ${i.length === 1 ? "it depends" : "they depend"} on a pack you don't own yet.`), await Jn(r.map((e) => n.get(e)).filter((e) => e !== void 0).map((e) => ({
|
|
4243
4310
|
name: e.name,
|
|
4244
4311
|
displayName: e.displayName,
|
|
4245
4312
|
price: e.price
|
|
4246
4313
|
})));
|
|
4247
4314
|
}
|
|
4248
|
-
function
|
|
4315
|
+
function io(e, t) {
|
|
4249
4316
|
let n = e.map((e, n) => {
|
|
4250
4317
|
let r = t.get(e), i = r ? r.displayName : e;
|
|
4251
|
-
return ` ${
|
|
4318
|
+
return ` ${R.muted(`${n + 1}.`)} ${R.brand(i)}`;
|
|
4252
4319
|
});
|
|
4253
|
-
|
|
4320
|
+
o.note([
|
|
4254
4321
|
"These packs will be installed, in order:",
|
|
4255
4322
|
"",
|
|
4256
4323
|
...n
|
|
4257
4324
|
].join("\n"), "Install Plan");
|
|
4258
4325
|
}
|
|
4259
|
-
async function
|
|
4326
|
+
async function ao(e, t) {
|
|
4260
4327
|
let n = [];
|
|
4261
4328
|
for (let r of e) {
|
|
4262
|
-
let e = await
|
|
4329
|
+
let e = await dr(r), i = await fr(r, t);
|
|
4263
4330
|
if (i.status === "denied") throw Error(`Access to "${r}" was denied (${i.reason}). Try 'hype-stack login' or check your license.`);
|
|
4264
4331
|
n.push({
|
|
4265
4332
|
manifest: e,
|
|
@@ -4268,128 +4335,128 @@ async function qa(e, t) {
|
|
|
4268
4335
|
}
|
|
4269
4336
|
return n;
|
|
4270
4337
|
}
|
|
4271
|
-
async function
|
|
4272
|
-
let { prepared: t, paths: n, cwd: r, spinner: i } = e,
|
|
4273
|
-
if (
|
|
4274
|
-
for (let e of
|
|
4338
|
+
async function oo(e) {
|
|
4339
|
+
let { prepared: t, paths: n, cwd: r, spinner: i } = e, a = Qa($a(t.map((e) => e.manifest.dependencies_npm)), n);
|
|
4340
|
+
if (a.errors.length > 0) {
|
|
4341
|
+
for (let e of a.errors) o.log.error(e);
|
|
4275
4342
|
return;
|
|
4276
4343
|
}
|
|
4277
|
-
if (
|
|
4344
|
+
if (a.operations.length === 0) return;
|
|
4278
4345
|
i.start("Installing npm dependencies...");
|
|
4279
|
-
let s = await
|
|
4280
|
-
if (i.stop(s.ok ? "npm dependencies installed" : "npm dependency installation failed"), !s.ok) for (let e of s.errors)
|
|
4346
|
+
let s = await eo(a.operations, r);
|
|
4347
|
+
if (i.stop(s.ok ? "npm dependencies installed" : "npm dependency installation failed"), !s.ok) for (let e of s.errors) o.log.error(e);
|
|
4281
4348
|
}
|
|
4282
|
-
function
|
|
4349
|
+
function so(e) {
|
|
4283
4350
|
let t = e.flatMap((e) => e.manifest.postInstall ?? []), n = [...new Set(t)];
|
|
4284
|
-
n.length !== 0 &&
|
|
4351
|
+
n.length !== 0 && o.note(n.map((e) => ` ${R.muted("→")} ${e}`).join("\n"), "Next Steps");
|
|
4285
4352
|
}
|
|
4286
|
-
async function
|
|
4287
|
-
let { prepared: t, config: n, cwd: r, force: i, yes:
|
|
4353
|
+
async function co(e) {
|
|
4354
|
+
let { prepared: t, config: n, cwd: r, force: i, yes: a, slotsByPack: s } = e, c = /* @__PURE__ */ new Set();
|
|
4288
4355
|
if (i) return c;
|
|
4289
|
-
let
|
|
4356
|
+
let l = await Ci({
|
|
4290
4357
|
packs: t,
|
|
4291
4358
|
config: n,
|
|
4292
4359
|
projectRoot: r,
|
|
4293
4360
|
slotsByPack: s
|
|
4294
4361
|
});
|
|
4295
|
-
if (
|
|
4296
|
-
if (
|
|
4297
|
-
|
|
4298
|
-
for (let e of
|
|
4299
|
-
let t =
|
|
4300
|
-
message: `Overwrite ${
|
|
4362
|
+
if (l.length === 0) return c;
|
|
4363
|
+
if (a) return o.log.warning(`${l.length} existing file${l.length === 1 ? "" : "s"} kept. Pass ${R.command("--force")} to overwrite.`), c;
|
|
4364
|
+
o.log.warning(`${l.length} file${l.length === 1 ? "" : "s"} already exist in your project.`);
|
|
4365
|
+
for (let e of l) {
|
|
4366
|
+
let t = u.relative(r, e.targetPath) || e.target, n = await o.confirm({
|
|
4367
|
+
message: `Overwrite ${R.path(t)}? ${R.muted(`(${e.packName})`)}`,
|
|
4301
4368
|
initialValue: !1
|
|
4302
4369
|
});
|
|
4303
|
-
|
|
4370
|
+
o.isCancel(n) && (o.cancel("Installation cancelled."), process.exit(0)), n && c.add(e.targetPath);
|
|
4304
4371
|
}
|
|
4305
4372
|
return c;
|
|
4306
4373
|
}
|
|
4307
4374
|
//#endregion
|
|
4308
4375
|
//#region src/commands/compose.ts
|
|
4309
|
-
async function
|
|
4376
|
+
async function lo(e = {}) {
|
|
4310
4377
|
let t = e.cwd ?? process.cwd();
|
|
4311
|
-
|
|
4312
|
-
let n = await
|
|
4378
|
+
$i();
|
|
4379
|
+
let n = await Za(t), r;
|
|
4313
4380
|
try {
|
|
4314
|
-
r = await
|
|
4381
|
+
r = await ir(t);
|
|
4315
4382
|
} catch (e) {
|
|
4316
|
-
|
|
4383
|
+
o.cancel(`Could not parse ${R.path("stack.json")}: ${$(e)} Run 'hype-stack init' to regenerate it.`), process.exit(1);
|
|
4317
4384
|
}
|
|
4318
|
-
r || (
|
|
4319
|
-
let i =
|
|
4385
|
+
r || (o.cancel(n ? `Could not read ${R.path("stack.json")}. Run 'hype-stack init' to regenerate it, then run 'hype-stack compose' again.` : `No ${R.path("stack.json")}. Run 'hype-stack init' first, then 'hype-stack compose'.`), process.exit(1)), r.paths || (o.cancel(`${R.path("stack.json")} is missing ${R.path("paths")}. Run 'hype-stack init' again to regenerate it.`), process.exit(1)), o.intro(R.brandBold("Compose your stack"));
|
|
4386
|
+
let i = o.spinner();
|
|
4320
4387
|
i.start("Loading packs...");
|
|
4321
|
-
let
|
|
4388
|
+
let a;
|
|
4322
4389
|
try {
|
|
4323
|
-
|
|
4390
|
+
a = await gr();
|
|
4324
4391
|
} catch (e) {
|
|
4325
|
-
i.stop("Failed to load packs"),
|
|
4392
|
+
i.stop("Failed to load packs"), o.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
|
|
4326
4393
|
}
|
|
4327
4394
|
i.stop("Packs loaded");
|
|
4328
|
-
let c = r.installedPacks ?? [], l = new Set(c), u = new Map(
|
|
4395
|
+
let c = r.installedPacks ?? [], l = new Set(c), u = new Map(a.map((e) => [e.name, e])), d = e.licenseKey ?? r.licenseKey ?? null, f = (await Ln(N()))?.token ?? null, p = await to(a, l, {
|
|
4329
4396
|
token: f,
|
|
4330
4397
|
key: d
|
|
4331
4398
|
}), m = (e) => {
|
|
4332
4399
|
let t = u.get(e);
|
|
4333
4400
|
return !t || t.tier === "free" ? "free" : p[e]?.owned ? "owned" : "locked";
|
|
4334
|
-
}, h = (e) => !l.has(e) && m(e) === "locked", g = await
|
|
4335
|
-
packs:
|
|
4401
|
+
}, h = (e) => !l.has(e) && m(e) === "locked", g = await uo({
|
|
4402
|
+
packs: a,
|
|
4336
4403
|
installedSet: l,
|
|
4337
4404
|
stateOf: m,
|
|
4338
4405
|
options: e,
|
|
4339
4406
|
adminAvailable: !!r.apps.admin
|
|
4340
4407
|
});
|
|
4341
|
-
if (g === null && (
|
|
4342
|
-
|
|
4408
|
+
if (g === null && (o.cancel("Cancelled."), process.exit(0)), g.length === 0) {
|
|
4409
|
+
o.outro(R.muted("No packs selected. Nothing to do."));
|
|
4343
4410
|
return;
|
|
4344
4411
|
}
|
|
4345
|
-
let _ =
|
|
4412
|
+
let _ = mo(g), v = ho(g), y = Hi(a, _), b = Fi(Ui(a, y)), x;
|
|
4346
4413
|
try {
|
|
4347
|
-
x =
|
|
4414
|
+
x = Li(_, b, c);
|
|
4348
4415
|
} catch (e) {
|
|
4349
|
-
|
|
4416
|
+
o.cancel($(e)), process.exit(1);
|
|
4350
4417
|
}
|
|
4351
4418
|
if (x.order.length === 0) {
|
|
4352
|
-
|
|
4419
|
+
o.note(`${x.alreadyInstalled.join(", ")} already installed.`, "Nothing to do"), o.outro(R.muted("Your selection is already part of the project."));
|
|
4353
4420
|
return;
|
|
4354
4421
|
}
|
|
4355
|
-
let S =
|
|
4422
|
+
let S = Ri({
|
|
4356
4423
|
order: x.order,
|
|
4357
4424
|
graph: b,
|
|
4358
4425
|
isLocked: h,
|
|
4359
4426
|
installed: c
|
|
4360
4427
|
});
|
|
4361
4428
|
if (S.blocked.length > 0 && !f && !d) {
|
|
4362
|
-
let e = await
|
|
4363
|
-
e && (f = e, p = await
|
|
4429
|
+
let e = await qn();
|
|
4430
|
+
e && (f = e, p = await to(a, l, {
|
|
4364
4431
|
token: f,
|
|
4365
4432
|
key: d
|
|
4366
|
-
}), S =
|
|
4433
|
+
}), S = Ri({
|
|
4367
4434
|
order: x.order,
|
|
4368
4435
|
graph: b,
|
|
4369
4436
|
isLocked: h,
|
|
4370
4437
|
installed: c
|
|
4371
4438
|
}));
|
|
4372
4439
|
}
|
|
4373
|
-
if (S.blocked.length > 0 && await
|
|
4374
|
-
|
|
4440
|
+
if (S.blocked.length > 0 && await ro(S.blocked, h, u), S.installable.length === 0) {
|
|
4441
|
+
o.outro(R.muted("Nothing left to install once locked packs are removed."));
|
|
4375
4442
|
return;
|
|
4376
4443
|
}
|
|
4377
|
-
if (
|
|
4378
|
-
let e = await
|
|
4379
|
-
(
|
|
4444
|
+
if (io(S.installable, u), !e.yes) {
|
|
4445
|
+
let e = await o.confirm({ message: `Install ${S.installable.length} pack${S.installable.length === 1 ? "" : "s"}?` });
|
|
4446
|
+
(o.isCancel(e) || !e) && (o.cancel("Installation cancelled."), process.exit(0));
|
|
4380
4447
|
}
|
|
4381
4448
|
i.start("Downloading packs...");
|
|
4382
4449
|
let C;
|
|
4383
4450
|
try {
|
|
4384
|
-
C = await
|
|
4451
|
+
C = await ao(S.installable, {
|
|
4385
4452
|
token: f,
|
|
4386
4453
|
key: d
|
|
4387
4454
|
});
|
|
4388
4455
|
} catch (e) {
|
|
4389
|
-
i.stop("Download failed"),
|
|
4456
|
+
i.stop("Download failed"), o.cancel($(e)), process.exit(1);
|
|
4390
4457
|
}
|
|
4391
4458
|
i.stop(`Downloaded ${C.length} pack${C.length === 1 ? "" : "s"}`);
|
|
4392
|
-
let w = await
|
|
4459
|
+
let w = await co({
|
|
4393
4460
|
prepared: C,
|
|
4394
4461
|
config: r,
|
|
4395
4462
|
cwd: t,
|
|
@@ -4399,7 +4466,7 @@ async function Za(e = {}) {
|
|
|
4399
4466
|
});
|
|
4400
4467
|
try {
|
|
4401
4468
|
i.start("Installing pack files...");
|
|
4402
|
-
let n = await
|
|
4469
|
+
let n = await Ei({
|
|
4403
4470
|
packs: C,
|
|
4404
4471
|
config: r,
|
|
4405
4472
|
projectRoot: t,
|
|
@@ -4409,85 +4476,87 @@ async function Za(e = {}) {
|
|
|
4409
4476
|
});
|
|
4410
4477
|
if (n.aborted) {
|
|
4411
4478
|
i.stop("Installation aborted");
|
|
4412
|
-
for (let e of n.errors)
|
|
4413
|
-
|
|
4479
|
+
for (let e of n.errors) o.log.error(e);
|
|
4480
|
+
o.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
|
|
4414
4481
|
}
|
|
4415
|
-
i.stop("Files installed"), n.installed.length > 0 &&
|
|
4416
|
-
for (let e of n.errors)
|
|
4417
|
-
await
|
|
4482
|
+
i.stop("Files installed"), n.installed.length > 0 && o.log.success(`${R.highlight(String(n.installed.length))} files installed`), n.skipped.length > 0 && o.log.warning(`${n.skipped.length} files skipped (use --force to overwrite)`);
|
|
4483
|
+
for (let e of n.errors) o.log.error(e);
|
|
4484
|
+
await oo({
|
|
4418
4485
|
prepared: C,
|
|
4419
4486
|
paths: r.paths,
|
|
4420
4487
|
cwd: t,
|
|
4421
4488
|
spinner: i
|
|
4422
|
-
}), await
|
|
4489
|
+
}), await rr({
|
|
4423
4490
|
projectRoot: t,
|
|
4424
4491
|
paths: r.paths,
|
|
4425
4492
|
skipPrompts: e.yes ?? !1
|
|
4426
|
-
}),
|
|
4493
|
+
}), so(C), o.outro(R.brand(`Installed ${n.appliedPacks.join(", ")}.`));
|
|
4427
4494
|
} finally {
|
|
4428
|
-
await Promise.all(C.map((e) =>
|
|
4495
|
+
await Promise.all(C.map((e) => s.rm(e.packDir, {
|
|
4429
4496
|
recursive: !0,
|
|
4430
4497
|
force: !0
|
|
4431
4498
|
})));
|
|
4432
4499
|
}
|
|
4433
4500
|
}
|
|
4434
|
-
async function
|
|
4435
|
-
let { packs: t, installedSet: n, stateOf: r, options: i, adminAvailable:
|
|
4501
|
+
async function uo(e) {
|
|
4502
|
+
let { packs: t, installedSet: n, stateOf: r, options: i, adminAvailable: a } = e;
|
|
4436
4503
|
if (i.packs && i.packs.length > 0) {
|
|
4437
|
-
let e = i.packs.map(
|
|
4438
|
-
return n.length > 0 && (
|
|
4504
|
+
let e = i.packs.map(po), n = e.filter((e) => !t.some((t) => t.name === e.name));
|
|
4505
|
+
return n.length > 0 && (o.cancel(`Unknown pack${n.length === 1 ? "" : "s"}: ${n.map((e) => e.name).join(", ")}`), process.exit(1)), e;
|
|
4439
4506
|
}
|
|
4440
4507
|
let s = t.filter((e) => n.has(e.name));
|
|
4441
|
-
s.length > 0 &&
|
|
4508
|
+
s.length > 0 && o.note(s.map((e) => ` ${R.muted("✓")} ${e.displayName}`).join("\n"), "Already Installed");
|
|
4442
4509
|
let c = t.filter((e) => !n.has(e.name));
|
|
4443
|
-
if (c.length === 0) return
|
|
4444
|
-
let l =
|
|
4445
|
-
|
|
4510
|
+
if (c.length === 0) return o.outro(R.muted("Every available pack is already installed.")), [];
|
|
4511
|
+
let l = P();
|
|
4512
|
+
o.note(c.map((e) => ` ${z.arrow} ${R.highlight(e.displayName)} ${ce(`${l}/packs/${e.name}`)}`).join("\n"), "Browse packs");
|
|
4513
|
+
let u = Ni(c, { adminAvailable: a }), d = [];
|
|
4514
|
+
for (let e of u) {
|
|
4446
4515
|
let t = e.packs.map((e) => {
|
|
4447
4516
|
let t = r(e.name);
|
|
4448
4517
|
return {
|
|
4449
4518
|
value: e.name,
|
|
4450
|
-
label: `${e.displayName} ${
|
|
4519
|
+
label: `${e.displayName} ${no(t, e.price)}`,
|
|
4451
4520
|
hint: e.description
|
|
4452
4521
|
};
|
|
4453
4522
|
});
|
|
4454
4523
|
if (e.mode === "single") {
|
|
4455
|
-
let n = await
|
|
4524
|
+
let n = await o.select({
|
|
4456
4525
|
message: `Choose a ${e.label.toLowerCase()}`,
|
|
4457
4526
|
options: t,
|
|
4458
4527
|
initialValue: e.preselect ?? e.packs[0].name
|
|
4459
4528
|
});
|
|
4460
|
-
if (
|
|
4461
|
-
|
|
4529
|
+
if (o.isCancel(n)) return null;
|
|
4530
|
+
d.push({
|
|
4462
4531
|
name: n,
|
|
4463
4532
|
slot: e.slot
|
|
4464
4533
|
});
|
|
4465
4534
|
continue;
|
|
4466
4535
|
}
|
|
4467
|
-
let n = await
|
|
4536
|
+
let n = await o.multiselect({
|
|
4468
4537
|
message: `Select ${e.label.toLowerCase()} to add (optional)`,
|
|
4469
4538
|
options: t,
|
|
4470
4539
|
required: !1
|
|
4471
4540
|
});
|
|
4472
|
-
if (
|
|
4473
|
-
for (let e of n)
|
|
4541
|
+
if (o.isCancel(n)) return null;
|
|
4542
|
+
for (let e of n) d.push({ name: e });
|
|
4474
4543
|
}
|
|
4475
|
-
return
|
|
4544
|
+
return d;
|
|
4476
4545
|
}
|
|
4477
|
-
var
|
|
4478
|
-
function
|
|
4479
|
-
let t = e.match(
|
|
4546
|
+
var fo = /@(frontend|admin)$/;
|
|
4547
|
+
function po(e) {
|
|
4548
|
+
let t = e.match(fo);
|
|
4480
4549
|
return t ? {
|
|
4481
4550
|
name: e.slice(0, -t[0].length),
|
|
4482
4551
|
slot: t[1]
|
|
4483
4552
|
} : { name: e };
|
|
4484
4553
|
}
|
|
4485
|
-
function
|
|
4554
|
+
function mo(e) {
|
|
4486
4555
|
let t = /* @__PURE__ */ new Set(), n = [];
|
|
4487
4556
|
for (let r of e) t.has(r.name) || (t.add(r.name), n.push(r.name));
|
|
4488
4557
|
return n;
|
|
4489
4558
|
}
|
|
4490
|
-
function
|
|
4559
|
+
function ho(e) {
|
|
4491
4560
|
let t = /* @__PURE__ */ new Map();
|
|
4492
4561
|
for (let n of e) {
|
|
4493
4562
|
if (!n.slot) continue;
|
|
@@ -4498,42 +4567,42 @@ function no(e) {
|
|
|
4498
4567
|
}
|
|
4499
4568
|
//#endregion
|
|
4500
4569
|
//#region src/commands/login.ts
|
|
4501
|
-
async function
|
|
4502
|
-
|
|
4570
|
+
async function go() {
|
|
4571
|
+
$i(), o.intro(R.brandBold("Log in to Hype Stack")), o.log.step("Opening your browser to sign in...");
|
|
4503
4572
|
let e;
|
|
4504
4573
|
try {
|
|
4505
|
-
e = await
|
|
4506
|
-
|
|
4574
|
+
e = await Kn({ onUrl: (e) => {
|
|
4575
|
+
o.log.info(`If your browser didn't open, visit:\n ${R.path(e)}`);
|
|
4507
4576
|
} });
|
|
4508
4577
|
} catch (e) {
|
|
4509
|
-
|
|
4578
|
+
o.cancel(e instanceof Error ? e.message : String(e)), process.exit(1);
|
|
4510
4579
|
}
|
|
4511
|
-
|
|
4580
|
+
o.outro(R.brand(e.email ? `Logged in as ${e.email}. You can now install packs your organization owns.` : "Logged in. You can now install packs your organization owns."));
|
|
4512
4581
|
}
|
|
4513
4582
|
//#endregion
|
|
4514
4583
|
//#region src/commands/logout.ts
|
|
4515
|
-
async function
|
|
4516
|
-
|
|
4517
|
-
let e =
|
|
4584
|
+
async function _o() {
|
|
4585
|
+
$i(), o.intro(R.brandBold("Log out of Hype Stack"));
|
|
4586
|
+
let e = N(), t = await Ln(e);
|
|
4518
4587
|
if (!t) {
|
|
4519
|
-
|
|
4588
|
+
o.outro(R.muted("You're not logged in."));
|
|
4520
4589
|
return;
|
|
4521
4590
|
}
|
|
4522
|
-
await
|
|
4591
|
+
await kn(t.token).catch(() => null), await zn(e), o.outro(R.brand("Logged out."));
|
|
4523
4592
|
}
|
|
4524
4593
|
//#endregion
|
|
4525
4594
|
//#region src/core/templates.ts
|
|
4526
|
-
var
|
|
4595
|
+
var vo = q.createRequest()({
|
|
4527
4596
|
endpoint: "/templates/list",
|
|
4528
4597
|
method: "GET"
|
|
4529
4598
|
});
|
|
4530
|
-
async function
|
|
4531
|
-
let { data: e, error: t } = await
|
|
4599
|
+
async function yo() {
|
|
4600
|
+
let { data: e, error: t } = await vo.send();
|
|
4532
4601
|
if (t || !e) throw Error(`Failed to fetch template list: ${String(t)}`);
|
|
4533
4602
|
return e.templates;
|
|
4534
4603
|
}
|
|
4535
|
-
async function
|
|
4536
|
-
let { data: t, error: n, status: r } = await
|
|
4604
|
+
async function bo(e) {
|
|
4605
|
+
let { data: t, error: n, status: r } = await q.createRequest()({
|
|
4537
4606
|
endpoint: `/templates/${encodeURIComponent(e)}/manifest`,
|
|
4538
4607
|
method: "GET"
|
|
4539
4608
|
}).send();
|
|
@@ -4541,65 +4610,67 @@ async function so(e) {
|
|
|
4541
4610
|
if (n || !t) throw Error(`Failed to load manifest for template "${e}": ${String(n)}`);
|
|
4542
4611
|
return t;
|
|
4543
4612
|
}
|
|
4544
|
-
async function
|
|
4545
|
-
let n =
|
|
4613
|
+
async function xo(e, t = {}) {
|
|
4614
|
+
let n = q.createRequest()({
|
|
4546
4615
|
endpoint: `/templates/${encodeURIComponent(e)}/download`,
|
|
4547
4616
|
method: "POST"
|
|
4548
4617
|
}), r = {
|
|
4549
|
-
"X-Device-Id":
|
|
4550
|
-
"X-Client-Info":
|
|
4618
|
+
"X-Device-Id": Vn(),
|
|
4619
|
+
"X-Client-Info": Hn()
|
|
4551
4620
|
};
|
|
4552
4621
|
t.token && (r.Authorization = `Bearer ${t.token}`);
|
|
4553
|
-
let { data: i, error: a, success:
|
|
4554
|
-
if (!
|
|
4622
|
+
let { data: i, error: a, success: o } = await n.setPayload({ key: t.licenseKey ?? void 0 }).setHeaders(r).send();
|
|
4623
|
+
if (!o || !i) throw Error(`Failed to download template "${e}": ${String(a)}`);
|
|
4555
4624
|
if (!i.ok) return {
|
|
4556
4625
|
status: "denied",
|
|
4557
4626
|
reason: i.reason,
|
|
4558
4627
|
packs: i.packs ?? [],
|
|
4559
4628
|
expiresAt: i.expiresAt ?? null
|
|
4560
4629
|
};
|
|
4561
|
-
let
|
|
4630
|
+
let c = await s.mkdtemp(u.join(l.tmpdir(), `hype-stack-template-${e}-`));
|
|
4562
4631
|
return await Promise.all(i.files.map(async (e) => {
|
|
4563
|
-
let t =
|
|
4564
|
-
await
|
|
4632
|
+
let t = u.join(c, ...e.path.split("/"));
|
|
4633
|
+
await s.mkdir(u.dirname(t), { recursive: !0 }), await s.writeFile(t, Buffer.from(e.content, "base64"));
|
|
4565
4634
|
})), {
|
|
4566
4635
|
status: "ok",
|
|
4567
|
-
templateDir:
|
|
4636
|
+
templateDir: c
|
|
4568
4637
|
};
|
|
4569
4638
|
}
|
|
4570
4639
|
//#endregion
|
|
4571
4640
|
//#region src/commands/template.ts
|
|
4572
|
-
async function
|
|
4641
|
+
async function So(e = {}) {
|
|
4573
4642
|
let t = e.cwd ?? process.cwd();
|
|
4574
|
-
|
|
4575
|
-
let
|
|
4643
|
+
$i();
|
|
4644
|
+
let n = await Za(t), a;
|
|
4576
4645
|
try {
|
|
4577
|
-
|
|
4646
|
+
a = await ir(t);
|
|
4578
4647
|
} catch (e) {
|
|
4579
|
-
|
|
4648
|
+
o.cancel(`Could not parse ${R.path("stack.json")}: ${$(e)} Run 'hype-stack init' to regenerate it.`), process.exit(1);
|
|
4580
4649
|
}
|
|
4581
|
-
|
|
4582
|
-
let c =
|
|
4650
|
+
a || (o.cancel(n ? `Could not read ${R.path("stack.json")}. Run 'hype-stack init' to regenerate it, then run 'hype-stack template' again.` : `No ${R.path("stack.json")}. Run 'hype-stack init' first, then 'hype-stack template'.`), process.exit(1)), a.paths || (o.cancel(`${R.path("stack.json")} is missing ${R.path("paths")}. Run 'hype-stack init' again to regenerate it.`), process.exit(1)), o.intro(R.brandBold("Install a template"));
|
|
4651
|
+
let c = o.spinner();
|
|
4583
4652
|
c.start("Loading packs...");
|
|
4584
|
-
let
|
|
4653
|
+
let l;
|
|
4585
4654
|
try {
|
|
4586
|
-
|
|
4655
|
+
l = await gr();
|
|
4587
4656
|
} catch (e) {
|
|
4588
|
-
c.stop("Failed to load packs"),
|
|
4657
|
+
c.stop("Failed to load packs"), o.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
|
|
4589
4658
|
}
|
|
4590
4659
|
c.stop("Packs loaded");
|
|
4591
|
-
let d =
|
|
4660
|
+
let d = a.installedPacks ?? [], f = new Set(d), p = new Map(l.map((e) => [e.name, e])), m = e.licenseKey ?? a.licenseKey ?? null, h = (await Ln(N()))?.token ?? null;
|
|
4592
4661
|
c.start("Loading templates...");
|
|
4593
4662
|
let g;
|
|
4594
4663
|
try {
|
|
4595
|
-
g = await
|
|
4664
|
+
g = await yo();
|
|
4596
4665
|
} catch (e) {
|
|
4597
|
-
c.stop("Failed to load templates"),
|
|
4666
|
+
c.stop("Failed to load templates"), o.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
|
|
4598
4667
|
}
|
|
4599
4668
|
let _ = e.templateId;
|
|
4600
4669
|
if (!_) {
|
|
4601
|
-
e.yes && (c.stop("Template id required"),
|
|
4602
|
-
let t =
|
|
4670
|
+
e.yes && (c.stop("Template id required"), o.cancel("Pass a template id with `hype-stack template <id>` (required in --yes mode)."), process.exit(1)), g.length === 0 && (c.stop("No templates available"), o.cancel("No templates are available yet. Check back later."), process.exit(1)), c.stop("Templates loaded");
|
|
4671
|
+
let t = P();
|
|
4672
|
+
o.note(g.map((e) => ` ${z.arrow} ${R.highlight(e.name)} ${ce(`${t}/templates/${e.id}`)}`).join("\n"), "Browse templates");
|
|
4673
|
+
let n = await o.select({
|
|
4603
4674
|
message: "Choose a template",
|
|
4604
4675
|
options: g.map((e) => ({
|
|
4605
4676
|
value: e.id,
|
|
@@ -4607,130 +4678,130 @@ async function lo(e = {}) {
|
|
|
4607
4678
|
hint: e.description
|
|
4608
4679
|
}))
|
|
4609
4680
|
});
|
|
4610
|
-
|
|
4681
|
+
o.isCancel(n) && (o.cancel("Cancelled."), process.exit(0)), _ = n;
|
|
4611
4682
|
}
|
|
4612
4683
|
let v = g.find((e) => e.id === _);
|
|
4613
|
-
v || (c.stop("Template not found"),
|
|
4614
|
-
let y = await
|
|
4615
|
-
packs:
|
|
4684
|
+
v || (c.stop("Template not found"), o.cancel(`Template "${_}" not found. Available: ${g.map((e) => e.id).join(", ") || "(none)"}`), process.exit(1)), c.stop(`Template: ${v.name}`);
|
|
4685
|
+
let y = await Co(v, e.variants, e.yes ?? !1), b = zi(v.slots, y), x = Bi(v.slots, v.packs, b), S = await wo({
|
|
4686
|
+
packs: l,
|
|
4616
4687
|
templatePacks: x,
|
|
4617
4688
|
installedSet: f,
|
|
4618
4689
|
options: e
|
|
4619
4690
|
}), C = [...x, ...S.filter((e) => !x.includes(e))], w = C.filter((e) => !p.has(e));
|
|
4620
|
-
w.length > 0 && (
|
|
4621
|
-
let T =
|
|
4691
|
+
w.length > 0 && (o.cancel(`Unknown pack${w.length === 1 ? "" : "s"}: ${w.join(", ")}`), process.exit(1));
|
|
4692
|
+
let T = Ui(l, b), E = Fi(T), D;
|
|
4622
4693
|
try {
|
|
4623
|
-
D =
|
|
4694
|
+
D = Li(C, E, d);
|
|
4624
4695
|
} catch (e) {
|
|
4625
|
-
|
|
4696
|
+
o.cancel($(e)), process.exit(1);
|
|
4626
4697
|
}
|
|
4627
4698
|
if (D.order.length === 0) {
|
|
4628
|
-
|
|
4699
|
+
o.outro(R.muted("Every pack in this template is already installed."));
|
|
4629
4700
|
return;
|
|
4630
4701
|
}
|
|
4631
|
-
let O = await
|
|
4702
|
+
let O = await to(T, f, {
|
|
4632
4703
|
token: h,
|
|
4633
4704
|
key: m
|
|
4634
|
-
}),
|
|
4705
|
+
}), ee = (e) => {
|
|
4635
4706
|
let t = p.get(e);
|
|
4636
4707
|
return !t || t.tier === "free" ? "free" : O[e]?.owned ? "owned" : "locked";
|
|
4637
|
-
},
|
|
4708
|
+
}, k = (e) => !f.has(e) && ee(e) === "locked", A = Ri({
|
|
4638
4709
|
order: D.order,
|
|
4639
4710
|
graph: E,
|
|
4640
|
-
isLocked:
|
|
4711
|
+
isLocked: k,
|
|
4641
4712
|
installed: d
|
|
4642
4713
|
});
|
|
4643
4714
|
if (A.blocked.length > 0 && !h && !m) {
|
|
4644
|
-
let e = await
|
|
4645
|
-
e && (h = e, O = await
|
|
4715
|
+
let e = await qn();
|
|
4716
|
+
e && (h = e, O = await to(T, f, {
|
|
4646
4717
|
token: h,
|
|
4647
4718
|
key: m
|
|
4648
|
-
}), A =
|
|
4719
|
+
}), A = Ri({
|
|
4649
4720
|
order: D.order,
|
|
4650
4721
|
graph: E,
|
|
4651
|
-
isLocked:
|
|
4722
|
+
isLocked: k,
|
|
4652
4723
|
installed: d
|
|
4653
4724
|
}));
|
|
4654
4725
|
}
|
|
4655
|
-
if (A.blocked.length > 0 && await
|
|
4656
|
-
|
|
4726
|
+
if (A.blocked.length > 0 && await ro(A.blocked, k, p), A.installable.length === 0) {
|
|
4727
|
+
o.outro(R.muted("Nothing left to install once locked packs are removed."));
|
|
4657
4728
|
return;
|
|
4658
4729
|
}
|
|
4659
|
-
if (
|
|
4660
|
-
let e = await
|
|
4661
|
-
(
|
|
4730
|
+
if (io(A.installable, p), !e.yes) {
|
|
4731
|
+
let e = await o.confirm({ message: `Install template ${R.brandBold(v.name)} (${A.installable.length} pack${A.installable.length === 1 ? "" : "s"})?` });
|
|
4732
|
+
(o.isCancel(e) || !e) && (o.cancel("Installation cancelled."), process.exit(0));
|
|
4662
4733
|
}
|
|
4663
4734
|
c.start("Downloading packs...");
|
|
4664
4735
|
let j;
|
|
4665
4736
|
try {
|
|
4666
|
-
j = await
|
|
4737
|
+
j = await ao(A.installable, {
|
|
4667
4738
|
token: h,
|
|
4668
4739
|
key: m
|
|
4669
4740
|
});
|
|
4670
4741
|
} catch (e) {
|
|
4671
|
-
c.stop("Download failed"),
|
|
4742
|
+
c.stop("Download failed"), o.cancel($(e)), process.exit(1);
|
|
4672
4743
|
}
|
|
4673
4744
|
c.stop(`Downloaded ${j.length} pack${j.length === 1 ? "" : "s"}`);
|
|
4674
|
-
let te = await
|
|
4745
|
+
let te = await co({
|
|
4675
4746
|
prepared: j,
|
|
4676
|
-
config:
|
|
4747
|
+
config: a,
|
|
4677
4748
|
cwd: t,
|
|
4678
4749
|
force: e.force ?? !1,
|
|
4679
4750
|
yes: e.yes ?? !1
|
|
4680
|
-
}),
|
|
4751
|
+
}), M = null;
|
|
4681
4752
|
try {
|
|
4682
4753
|
c.start("Installing pack files...");
|
|
4683
|
-
let
|
|
4754
|
+
let n = await Ei({
|
|
4684
4755
|
packs: j,
|
|
4685
|
-
config:
|
|
4756
|
+
config: a,
|
|
4686
4757
|
projectRoot: t,
|
|
4687
4758
|
force: e.force ?? !1,
|
|
4688
4759
|
overwrite: te
|
|
4689
4760
|
});
|
|
4690
|
-
if (
|
|
4761
|
+
if (n.aborted) {
|
|
4691
4762
|
c.stop("Installation aborted");
|
|
4692
|
-
for (let e of
|
|
4693
|
-
|
|
4763
|
+
for (let e of n.errors) o.log.error(e);
|
|
4764
|
+
o.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
|
|
4694
4765
|
}
|
|
4695
|
-
c.stop("Files installed"),
|
|
4696
|
-
for (let e of
|
|
4766
|
+
c.stop("Files installed"), n.installed.length > 0 && o.log.success(`${R.highlight(String(n.installed.length))} files installed`), n.skipped.length > 0 && o.log.warning(`${n.skipped.length} files skipped (use --force to overwrite)`);
|
|
4767
|
+
for (let e of n.errors) o.log.error(e);
|
|
4697
4768
|
c.start("Applying template overrides...");
|
|
4698
|
-
let
|
|
4769
|
+
let s = await bo(v.id), l = await xo(v.id, {
|
|
4699
4770
|
token: h,
|
|
4700
4771
|
licenseKey: m
|
|
4701
4772
|
});
|
|
4702
|
-
|
|
4703
|
-
let d = await
|
|
4704
|
-
manifest:
|
|
4705
|
-
config:
|
|
4773
|
+
l.status === "denied" && (c.stop("Template download denied"), o.cancel(`Access to template "${v.id}" was denied (${l.reason}). Try 'hype-stack login' or check your license.`), process.exit(1)), M = l.templateDir;
|
|
4774
|
+
let d = await Oi({
|
|
4775
|
+
manifest: s,
|
|
4776
|
+
config: a,
|
|
4706
4777
|
projectRoot: t,
|
|
4707
|
-
templateDir:
|
|
4778
|
+
templateDir: M
|
|
4708
4779
|
});
|
|
4709
|
-
c.stop("Template overrides applied"), d.installed.length > 0 &&
|
|
4710
|
-
for (let e of d.errors)
|
|
4711
|
-
let f =
|
|
4712
|
-
|
|
4780
|
+
c.stop("Template overrides applied"), d.installed.length > 0 && o.log.success(`${d.installed.length} template file${d.installed.length === 1 ? "" : "s"} applied`);
|
|
4781
|
+
for (let e of d.errors) o.log.error(e);
|
|
4782
|
+
let f = s.theme ?? "zinc-mono";
|
|
4783
|
+
i(f) && (await sa(u.resolve(t, a.paths?.frontend.root ?? "apps/frontend"), r(f)) ? o.log.success(`Applied the ${r(f).label} theme`) : o.log.warning(R.muted(`Could not find ${R.path("assets/styles.css")} to apply the theme`))), await To({
|
|
4713
4784
|
prepared: j,
|
|
4714
|
-
templateNpm:
|
|
4715
|
-
paths:
|
|
4785
|
+
templateNpm: s.dependencies_npm,
|
|
4786
|
+
paths: a.paths,
|
|
4716
4787
|
cwd: t,
|
|
4717
4788
|
spinner: c
|
|
4718
|
-
}), await
|
|
4789
|
+
}), await rr({
|
|
4719
4790
|
projectRoot: t,
|
|
4720
|
-
paths:
|
|
4791
|
+
paths: a.paths,
|
|
4721
4792
|
skipPrompts: e.yes ?? !1
|
|
4722
|
-
}),
|
|
4793
|
+
}), so(j), s.postInstall && s.postInstall.length > 0 && o.note(s.postInstall.map((e) => ` ${R.muted("→")} ${e}`).join("\n"), "Template Next Steps"), o.outro(R.brand(`Installed template ${v.name}.`));
|
|
4723
4794
|
} finally {
|
|
4724
|
-
await Promise.all(j.map((e) =>
|
|
4795
|
+
await Promise.all(j.map((e) => s.rm(e.packDir, {
|
|
4725
4796
|
recursive: !0,
|
|
4726
4797
|
force: !0
|
|
4727
|
-
}))),
|
|
4798
|
+
}))), M && await s.rm(M, {
|
|
4728
4799
|
recursive: !0,
|
|
4729
4800
|
force: !0
|
|
4730
4801
|
});
|
|
4731
4802
|
}
|
|
4732
4803
|
}
|
|
4733
|
-
async function
|
|
4804
|
+
async function Co(e, t, n) {
|
|
4734
4805
|
let r = {};
|
|
4735
4806
|
for (let i of e.slots) {
|
|
4736
4807
|
if (t?.[i.family]) {
|
|
@@ -4745,25 +4816,27 @@ async function uo(e, t, n) {
|
|
|
4745
4816
|
value: e,
|
|
4746
4817
|
label: e,
|
|
4747
4818
|
hint: e === i.default ? "default" : void 0
|
|
4748
|
-
})),
|
|
4819
|
+
})), a = await o.select({
|
|
4749
4820
|
message: `Choose a ${i.family}`,
|
|
4750
4821
|
options: e,
|
|
4751
4822
|
initialValue: i.default
|
|
4752
4823
|
});
|
|
4753
|
-
|
|
4824
|
+
o.isCancel(a) && (o.cancel("Cancelled."), process.exit(0)), r[i.family] = a;
|
|
4754
4825
|
}
|
|
4755
4826
|
return r;
|
|
4756
4827
|
}
|
|
4757
|
-
async function
|
|
4758
|
-
let { packs: t, templatePacks: n, installedSet: r, options: i } = e,
|
|
4828
|
+
async function wo(e) {
|
|
4829
|
+
let { packs: t, templatePacks: n, installedSet: r, options: i } = e, a = new Set(n);
|
|
4759
4830
|
if (i.packs && i.packs.length > 0) {
|
|
4760
4831
|
let e = i.packs.filter((e) => !t.some((t) => t.name === e));
|
|
4761
|
-
return e.length > 0 && (
|
|
4832
|
+
return e.length > 0 && (o.cancel(`Unknown pack${e.length === 1 ? "" : "s"}: ${e.join(", ")}`), process.exit(1)), i.packs.filter((e) => !a.has(e));
|
|
4762
4833
|
}
|
|
4763
4834
|
if (i.yes) return [];
|
|
4764
|
-
let s = t.filter((e) => e.category === "feature" && !
|
|
4835
|
+
let s = t.filter((e) => e.category === "feature" && !a.has(e.name) && !r.has(e.name));
|
|
4765
4836
|
if (s.length === 0) return [];
|
|
4766
|
-
let c =
|
|
4837
|
+
let c = P();
|
|
4838
|
+
o.note(s.map((e) => ` ${z.arrow} ${R.highlight(e.displayName)} ${ce(`${c}/packs/${e.name}`)}`).join("\n"), "Browse packs");
|
|
4839
|
+
let l = await o.multiselect({
|
|
4767
4840
|
message: "Add extra packs on top of the template (optional)",
|
|
4768
4841
|
options: s.map((e) => ({
|
|
4769
4842
|
value: e.name,
|
|
@@ -4772,27 +4845,27 @@ async function fo(e) {
|
|
|
4772
4845
|
})),
|
|
4773
4846
|
required: !1
|
|
4774
4847
|
});
|
|
4775
|
-
return
|
|
4848
|
+
return o.isCancel(l) && (o.cancel("Cancelled."), process.exit(0)), l;
|
|
4776
4849
|
}
|
|
4777
|
-
async function
|
|
4778
|
-
let { prepared: t, templateNpm: n, paths: r, cwd: i, spinner:
|
|
4850
|
+
async function To(e) {
|
|
4851
|
+
let { prepared: t, templateNpm: n, paths: r, cwd: i, spinner: a } = e, s = $a(t.map((e) => e.manifest.dependencies_npm)), c = Qa(n ? $a([s, n]) : s, r);
|
|
4779
4852
|
if (c.errors.length > 0) {
|
|
4780
|
-
for (let e of c.errors)
|
|
4853
|
+
for (let e of c.errors) o.log.error(e);
|
|
4781
4854
|
return;
|
|
4782
4855
|
}
|
|
4783
4856
|
if (c.operations.length === 0) return;
|
|
4784
|
-
|
|
4785
|
-
let l = await
|
|
4786
|
-
if (
|
|
4857
|
+
a.start("Installing npm dependencies...");
|
|
4858
|
+
let l = await eo(c.operations, i);
|
|
4859
|
+
if (a.stop(l.ok ? "npm dependencies installed" : "npm dependency installation failed"), !l.ok) for (let e of l.errors) o.log.error(e);
|
|
4787
4860
|
}
|
|
4788
4861
|
//#endregion
|
|
4789
4862
|
//#region src/cli.ts
|
|
4790
|
-
function
|
|
4863
|
+
function Eo(e) {
|
|
4791
4864
|
if (!e) return;
|
|
4792
4865
|
let t = e.split(",").map((e) => e.trim()).filter((e) => e.length > 0);
|
|
4793
4866
|
return t.length > 0 ? t : void 0;
|
|
4794
4867
|
}
|
|
4795
|
-
function
|
|
4868
|
+
function Do(e) {
|
|
4796
4869
|
if (!e) return;
|
|
4797
4870
|
let t = {};
|
|
4798
4871
|
for (let n of e.split(",")) {
|
|
@@ -4801,10 +4874,10 @@ function ho(e) {
|
|
|
4801
4874
|
}
|
|
4802
4875
|
return Object.keys(t).length > 0 ? t : void 0;
|
|
4803
4876
|
}
|
|
4804
|
-
function
|
|
4805
|
-
let e = new
|
|
4806
|
-
return e.name("hype-stack").description("Build with Hype Stack -- templates, components, modules, and more").version(
|
|
4807
|
-
await
|
|
4877
|
+
function Oo() {
|
|
4878
|
+
let e = new a();
|
|
4879
|
+
return e.name("hype-stack").description("Build with Hype Stack -- templates, components, modules, and more").version(C, "-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) => {
|
|
4880
|
+
await Ya({
|
|
4808
4881
|
name: e.name,
|
|
4809
4882
|
directory: e.directory,
|
|
4810
4883
|
install: e.install,
|
|
@@ -4814,32 +4887,32 @@ function go() {
|
|
|
4814
4887
|
setup: e.setup
|
|
4815
4888
|
});
|
|
4816
4889
|
}), e.command("init").description("Initialize stack.json in the current project").action(async () => {
|
|
4817
|
-
await
|
|
4890
|
+
await Xa({});
|
|
4818
4891
|
}), 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) => {
|
|
4819
|
-
await
|
|
4820
|
-
packs:
|
|
4892
|
+
await lo({
|
|
4893
|
+
packs: Eo(e.packs),
|
|
4821
4894
|
force: e.force,
|
|
4822
4895
|
yes: e.yes,
|
|
4823
4896
|
licenseKey: e.key ?? e.licenseKey,
|
|
4824
4897
|
cwd: e.cwd
|
|
4825
4898
|
});
|
|
4826
|
-
}), e.command("template
|
|
4827
|
-
await
|
|
4899
|
+
}), 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) => {
|
|
4900
|
+
await So({
|
|
4828
4901
|
templateId: e,
|
|
4829
|
-
variants:
|
|
4830
|
-
packs:
|
|
4902
|
+
variants: Do(t.variants),
|
|
4903
|
+
packs: Eo(t.packs),
|
|
4831
4904
|
force: t.force,
|
|
4832
4905
|
yes: t.yes,
|
|
4833
4906
|
licenseKey: t.key ?? t.licenseKey,
|
|
4834
4907
|
cwd: t.cwd
|
|
4835
4908
|
});
|
|
4836
4909
|
}), e.command("login").description("Log in via your browser to install packs your organization owns").action(async () => {
|
|
4837
|
-
await
|
|
4910
|
+
await go();
|
|
4838
4911
|
}), e.command("logout").description("Log out and remove the saved CLI token").action(async () => {
|
|
4839
|
-
await
|
|
4912
|
+
await _o();
|
|
4840
4913
|
}), e.command("auth").description("Alias for `login`").action(async () => {
|
|
4841
|
-
await
|
|
4914
|
+
await go();
|
|
4842
4915
|
}), e;
|
|
4843
4916
|
}
|
|
4844
4917
|
//#endregion
|
|
4845
|
-
export {
|
|
4918
|
+
export { Za as a, lo as i, _o as n, Xa as o, go as r, Ya as s, Oo as t };
|