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.25",
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.25"
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 { createApp } from "@rezi-ui/core";
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 createApp<typeof initialState>>;
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 = createApp({
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 { createApp } from "@rezi-ui/core";
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
- const app = createApp({
17
- backend: createNodeBackend({
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 { createApp } from "@rezi-ui/core";
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
  }