create-rezi 0.1.0-alpha.25 → 0.1.0-alpha.26
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-rezi",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.26",
|
|
4
4
|
"description": "Scaffold a Rezi terminal UI app.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://rezitui.dev",
|
|
@@ -28,6 +28,6 @@
|
|
|
28
28
|
"bun": ">=1.3.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@rezi-ui/testkit": "0.1.0-alpha.
|
|
31
|
+
"@rezi-ui/testkit": "0.1.0-alpha.26"
|
|
32
32
|
}
|
|
33
33
|
}
|
|
@@ -64,4 +64,4 @@ bun run dev
|
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
`npm run dev` / `bun run dev` starts the app with `--hsr` so route edits hot-swap via
|
|
67
|
-
`app.replaceRoutes(...)` while preserving app state, focus, and form input.
|
|
67
|
+
`createNodeApp({ hotReload: ... })` + `app.replaceRoutes(...)` while preserving app state, focus, and form input.
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { exit } from "node:process";
|
|
2
|
-
import {
|
|
3
|
-
import { createHotStateReload, createNodeBackend } from "@rezi-ui/node";
|
|
2
|
+
import { createNodeApp } from "@rezi-ui/node";
|
|
4
3
|
import { resolveCliCommand } from "./helpers/keybindings.js";
|
|
5
4
|
import { createInitialState, reduceCliState } from "./helpers/state.js";
|
|
6
5
|
import { createCliRoutes } from "./screens/index.js";
|
|
@@ -12,9 +11,8 @@ const LOG_TICK_MS = 1000;
|
|
|
12
11
|
|
|
13
12
|
const initialState = createInitialState();
|
|
14
13
|
|
|
15
|
-
let app!: ReturnType<typeof
|
|
14
|
+
let app!: ReturnType<typeof createNodeApp<typeof initialState>>;
|
|
16
15
|
const enableHsr = process.argv.includes("--hsr") || process.env.REZI_HSR === "1";
|
|
17
|
-
let hsrController: ReturnType<typeof createHotStateReload<typeof initialState>> | null = null;
|
|
18
16
|
let stopping = false;
|
|
19
17
|
let logTimer: ReturnType<typeof setInterval> | null = null;
|
|
20
18
|
|
|
@@ -61,11 +59,6 @@ async function stopApp(): Promise<void> {
|
|
|
61
59
|
if (stopping) return;
|
|
62
60
|
stopping = true;
|
|
63
61
|
|
|
64
|
-
if (hsrController) {
|
|
65
|
-
await hsrController.stop();
|
|
66
|
-
hsrController = null;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
62
|
if (logTimer) {
|
|
70
63
|
clearInterval(logTimer);
|
|
71
64
|
logTimer = null;
|
|
@@ -116,13 +109,27 @@ function applyCommand(command: ReturnType<typeof resolveCliCommand>): void {
|
|
|
116
109
|
|
|
117
110
|
const routes = buildCliRoutes(createCliRoutes);
|
|
118
111
|
|
|
119
|
-
app =
|
|
120
|
-
backend: createNodeBackend({ fpsCap: UI_FPS_CAP }),
|
|
112
|
+
app = createNodeApp({
|
|
121
113
|
initialState,
|
|
122
114
|
routes,
|
|
123
115
|
initialRoute: "home",
|
|
124
116
|
config: { fpsCap: UI_FPS_CAP },
|
|
125
117
|
theme: themeSpec(initialState.themeName).theme,
|
|
118
|
+
...(enableHsr
|
|
119
|
+
? {
|
|
120
|
+
hotReload: {
|
|
121
|
+
routesModule: new URL("./screens/index.ts", import.meta.url),
|
|
122
|
+
moduleRoot: new URL("./", import.meta.url),
|
|
123
|
+
resolveRoutes: (moduleNs: unknown) => {
|
|
124
|
+
const createRoutes = (moduleNs as CliRoutesModule).createCliRoutes;
|
|
125
|
+
if (typeof createRoutes !== "function") {
|
|
126
|
+
throw new Error("HSR: ./screens/index.ts must export createCliRoutes(deps)");
|
|
127
|
+
}
|
|
128
|
+
return buildCliRoutes(createRoutes);
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
}
|
|
132
|
+
: {}),
|
|
126
133
|
});
|
|
127
134
|
|
|
128
135
|
app.keys({
|
|
@@ -159,29 +166,8 @@ logTimer = setInterval(() => {
|
|
|
159
166
|
}, LOG_TICK_MS);
|
|
160
167
|
|
|
161
168
|
try {
|
|
162
|
-
if (enableHsr) {
|
|
163
|
-
hsrController = createHotStateReload<typeof initialState>({
|
|
164
|
-
app,
|
|
165
|
-
routesModule: new URL("./screens/index.ts", import.meta.url),
|
|
166
|
-
moduleRoot: new URL("./", import.meta.url),
|
|
167
|
-
resolveRoutes: (moduleNs) => {
|
|
168
|
-
const createRoutes = (moduleNs as CliRoutesModule).createCliRoutes;
|
|
169
|
-
if (typeof createRoutes !== "function") {
|
|
170
|
-
throw new Error("HSR: ./screens/index.ts must export createCliRoutes(deps)");
|
|
171
|
-
}
|
|
172
|
-
return buildCliRoutes(createRoutes);
|
|
173
|
-
},
|
|
174
|
-
});
|
|
175
|
-
await hsrController.start();
|
|
176
|
-
}
|
|
177
|
-
|
|
178
169
|
await app.start();
|
|
179
170
|
} finally {
|
|
180
|
-
if (hsrController) {
|
|
181
|
-
await hsrController.stop();
|
|
182
|
-
hsrController = null;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
171
|
if (logTimer) {
|
|
186
172
|
clearInterval(logTimer);
|
|
187
173
|
logTimer = null;
|
|
@@ -58,4 +58,4 @@ bun run dev
|
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
`npm run dev` / `bun run dev` starts the app with `--hsr` so view edits hot-swap via
|
|
61
|
-
`app.replaceView(...)` while preserving app state, focus, and form/input context.
|
|
61
|
+
`createNodeApp({ hotReload: ... })` + `app.replaceView(...)` while preserving app state, focus, and form/input context.
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { exit } from "node:process";
|
|
2
|
-
import {
|
|
3
|
-
import { createHotStateReload, createNodeBackend } from "@rezi-ui/node";
|
|
2
|
+
import { createNodeApp } from "@rezi-ui/node";
|
|
4
3
|
import { resolveDashboardCommand } from "./helpers/keybindings.js";
|
|
5
4
|
import { reduceDashboardState, selectedService } from "./helpers/state.js";
|
|
6
5
|
import { createInitialState } from "./helpers/state.js";
|
|
@@ -12,24 +11,39 @@ const UI_FPS_CAP = 30;
|
|
|
12
11
|
const TICK_MS = 900;
|
|
13
12
|
|
|
14
13
|
const initialState = createInitialState();
|
|
14
|
+
const enableHsr = process.argv.includes("--hsr") || process.env.REZI_HSR === "1";
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
type OverviewRenderer = typeof renderOverviewScreen;
|
|
17
|
+
type OverviewModule = Readonly<{
|
|
18
|
+
renderOverviewScreen?: OverviewRenderer;
|
|
19
|
+
}>;
|
|
20
|
+
|
|
21
|
+
const app = createNodeApp({
|
|
22
|
+
config: {
|
|
18
23
|
fpsCap: UI_FPS_CAP,
|
|
19
24
|
emojiWidthPolicy: "auto",
|
|
20
25
|
executionMode: "worker",
|
|
21
|
-
}
|
|
22
|
-
config: { fpsCap: UI_FPS_CAP },
|
|
26
|
+
},
|
|
23
27
|
initialState,
|
|
24
28
|
theme: themeSpec(initialState.themeName).theme,
|
|
29
|
+
...(enableHsr
|
|
30
|
+
? {
|
|
31
|
+
hotReload: {
|
|
32
|
+
viewModule: new URL("./screens/overview.ts", import.meta.url),
|
|
33
|
+
moduleRoot: new URL("./", import.meta.url),
|
|
34
|
+
resolveView: (moduleNs: unknown) => {
|
|
35
|
+
const render = (moduleNs as OverviewModule).renderOverviewScreen;
|
|
36
|
+
if (typeof render !== "function") {
|
|
37
|
+
throw new Error(
|
|
38
|
+
"HSR: ./screens/overview.ts must export renderOverviewScreen(state, actions)",
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
return buildOverviewView(render);
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
}
|
|
45
|
+
: {}),
|
|
25
46
|
});
|
|
26
|
-
const enableHsr = process.argv.includes("--hsr") || process.env.REZI_HSR === "1";
|
|
27
|
-
let hsrController: ReturnType<typeof createHotStateReload<DashboardState>> | null = null;
|
|
28
|
-
|
|
29
|
-
type OverviewRenderer = typeof renderOverviewScreen;
|
|
30
|
-
type OverviewModule = Readonly<{
|
|
31
|
-
renderOverviewScreen?: OverviewRenderer;
|
|
32
|
-
}>;
|
|
33
47
|
|
|
34
48
|
function buildOverviewView(renderer: OverviewRenderer) {
|
|
35
49
|
return (state: DashboardState) =>
|
|
@@ -67,11 +81,6 @@ async function stopApp(): Promise<void> {
|
|
|
67
81
|
if (stopping) return;
|
|
68
82
|
stopping = true;
|
|
69
83
|
|
|
70
|
-
if (hsrController) {
|
|
71
|
-
await hsrController.stop();
|
|
72
|
-
hsrController = null;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
84
|
if (telemetryTimer) {
|
|
76
85
|
clearInterval(telemetryTimer);
|
|
77
86
|
telemetryTimer = null;
|
|
@@ -166,29 +175,8 @@ telemetryTimer = setInterval(() => {
|
|
|
166
175
|
}, TICK_MS);
|
|
167
176
|
|
|
168
177
|
try {
|
|
169
|
-
if (enableHsr) {
|
|
170
|
-
hsrController = createHotStateReload<DashboardState>({
|
|
171
|
-
app,
|
|
172
|
-
viewModule: new URL("./screens/overview.ts", import.meta.url),
|
|
173
|
-
moduleRoot: new URL("./", import.meta.url),
|
|
174
|
-
resolveView: (moduleNs) => {
|
|
175
|
-
const render = (moduleNs as OverviewModule).renderOverviewScreen;
|
|
176
|
-
if (typeof render !== "function") {
|
|
177
|
-
throw new Error(
|
|
178
|
-
"HSR: ./screens/overview.ts must export renderOverviewScreen(state, actions)",
|
|
179
|
-
);
|
|
180
|
-
}
|
|
181
|
-
return buildOverviewView(render);
|
|
182
|
-
},
|
|
183
|
-
});
|
|
184
|
-
await hsrController.start();
|
|
185
|
-
}
|
|
186
178
|
await app.start();
|
|
187
179
|
} finally {
|
|
188
|
-
if (hsrController) {
|
|
189
|
-
await hsrController.stop();
|
|
190
|
-
hsrController = null;
|
|
191
|
-
}
|
|
192
180
|
if (telemetryTimer) {
|
|
193
181
|
clearInterval(telemetryTimer);
|
|
194
182
|
telemetryTimer = null;
|
|
@@ -42,7 +42,7 @@ bun run dev
|
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
`npm run dev` / `bun run dev` starts the app with `--hsr` so view edits hot-swap via
|
|
45
|
-
`app.replaceView(...)` while preserving app state, focus, and form/input context.
|
|
45
|
+
`createNodeApp({ hotReload: ... })` + `app.replaceView(...)` while preserving app state, focus, and form/input context.
|
|
46
46
|
|
|
47
47
|
## Controls
|
|
48
48
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { exit } from "node:process";
|
|
2
|
-
import {
|
|
3
|
-
import { createHotStateReload, createNodeBackend } from "@rezi-ui/node";
|
|
2
|
+
import { createNodeApp } from "@rezi-ui/node";
|
|
4
3
|
import { resolveMinimalCommand } from "./helpers/keybindings.js";
|
|
5
4
|
import { createInitialState, reduceMinimalState } from "./helpers/state.js";
|
|
6
5
|
import { renderMainScreen } from "./screens/main-screen.js";
|
|
@@ -8,21 +7,36 @@ import { themeSpec } from "./theme.js";
|
|
|
8
7
|
import type { MinimalAction, MinimalState } from "./types.js";
|
|
9
8
|
|
|
10
9
|
const initialState = createInitialState();
|
|
11
|
-
|
|
12
|
-
const app = createApp({
|
|
13
|
-
backend: createNodeBackend({ fpsCap: 30 }),
|
|
14
|
-
initialState,
|
|
15
|
-
config: { fpsCap: 30 },
|
|
16
|
-
theme: themeSpec(initialState.themeName).theme,
|
|
17
|
-
});
|
|
18
10
|
const enableHsr = process.argv.includes("--hsr") || process.env.REZI_HSR === "1";
|
|
19
|
-
let hsrController: ReturnType<typeof createHotStateReload<MinimalState>> | null = null;
|
|
20
11
|
|
|
21
12
|
type MainScreenRenderer = typeof renderMainScreen;
|
|
22
13
|
type MainScreenModule = Readonly<{
|
|
23
14
|
renderMainScreen?: MainScreenRenderer;
|
|
24
15
|
}>;
|
|
25
16
|
|
|
17
|
+
const app = createNodeApp({
|
|
18
|
+
initialState,
|
|
19
|
+
config: { fpsCap: 30 },
|
|
20
|
+
theme: themeSpec(initialState.themeName).theme,
|
|
21
|
+
...(enableHsr
|
|
22
|
+
? {
|
|
23
|
+
hotReload: {
|
|
24
|
+
viewModule: new URL("./screens/main-screen.ts", import.meta.url),
|
|
25
|
+
moduleRoot: new URL("./", import.meta.url),
|
|
26
|
+
resolveView: (moduleNs: unknown) => {
|
|
27
|
+
const render = (moduleNs as MainScreenModule).renderMainScreen;
|
|
28
|
+
if (typeof render !== "function") {
|
|
29
|
+
throw new Error(
|
|
30
|
+
"HSR: ./screens/main-screen.ts must export renderMainScreen(state, actions)",
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
return buildMainView(render);
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
}
|
|
37
|
+
: {}),
|
|
38
|
+
});
|
|
39
|
+
|
|
26
40
|
function buildMainView(renderer: MainScreenRenderer) {
|
|
27
41
|
return (state: MinimalState) =>
|
|
28
42
|
renderer(state, {
|
|
@@ -58,11 +72,6 @@ async function shutdown(): Promise<void> {
|
|
|
58
72
|
if (stopping) return;
|
|
59
73
|
stopping = true;
|
|
60
74
|
|
|
61
|
-
if (hsrController) {
|
|
62
|
-
await hsrController.stop();
|
|
63
|
-
hsrController = null;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
75
|
try {
|
|
67
76
|
await app.stop();
|
|
68
77
|
} catch {
|
|
@@ -134,29 +143,8 @@ process.once("SIGINT", onSignal);
|
|
|
134
143
|
process.once("SIGTERM", onSignal);
|
|
135
144
|
|
|
136
145
|
try {
|
|
137
|
-
if (enableHsr) {
|
|
138
|
-
hsrController = createHotStateReload<MinimalState>({
|
|
139
|
-
app,
|
|
140
|
-
viewModule: new URL("./screens/main-screen.ts", import.meta.url),
|
|
141
|
-
moduleRoot: new URL("./", import.meta.url),
|
|
142
|
-
resolveView: (moduleNs) => {
|
|
143
|
-
const render = (moduleNs as MainScreenModule).renderMainScreen;
|
|
144
|
-
if (typeof render !== "function") {
|
|
145
|
-
throw new Error(
|
|
146
|
-
"HSR: ./screens/main-screen.ts must export renderMainScreen(state, actions)",
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
return buildMainView(render);
|
|
150
|
-
},
|
|
151
|
-
});
|
|
152
|
-
await hsrController.start();
|
|
153
|
-
}
|
|
154
146
|
await app.start();
|
|
155
147
|
} finally {
|
|
156
|
-
if (hsrController) {
|
|
157
|
-
await hsrController.stop();
|
|
158
|
-
hsrController = null;
|
|
159
|
-
}
|
|
160
148
|
process.off("SIGINT", onSignal);
|
|
161
149
|
process.off("SIGTERM", onSignal);
|
|
162
150
|
}
|