@rezi-ui/node 0.1.0-alpha.4 → 0.1.0-alpha.43
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/README.md +26 -6
- package/dist/backend/emojiWidthPolicy.d.ts +15 -0
- package/dist/backend/emojiWidthPolicy.d.ts.map +1 -0
- package/dist/backend/emojiWidthPolicy.js +229 -0
- package/dist/backend/emojiWidthPolicy.js.map +1 -0
- package/dist/backend/nodeBackend.d.ts +25 -2
- package/dist/backend/nodeBackend.d.ts.map +1 -1
- package/dist/backend/nodeBackend.js +175 -16
- package/dist/backend/nodeBackend.js.map +1 -1
- package/dist/backend/nodeBackendInline.d.ts +1 -0
- package/dist/backend/nodeBackendInline.d.ts.map +1 -1
- package/dist/backend/nodeBackendInline.js +195 -27
- package/dist/backend/nodeBackendInline.js.map +1 -1
- package/dist/backend/terminalProfile.d.ts +5 -0
- package/dist/backend/terminalProfile.d.ts.map +1 -0
- package/dist/backend/terminalProfile.js +117 -0
- package/dist/backend/terminalProfile.js.map +1 -0
- package/dist/dev/hotStateReload.d.ts +65 -0
- package/dist/dev/hotStateReload.d.ts.map +1 -0
- package/dist/dev/hotStateReload.js +438 -0
- package/dist/dev/hotStateReload.js.map +1 -0
- package/dist/dev/nodeAppHotReload.d.ts +11 -0
- package/dist/dev/nodeAppHotReload.d.ts.map +1 -0
- package/dist/dev/nodeAppHotReload.js +78 -0
- package/dist/dev/nodeAppHotReload.js.map +1 -0
- package/dist/image.d.ts +4 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +43 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +188 -0
- package/dist/index.js.map +1 -1
- package/dist/repro/index.d.ts +3 -0
- package/dist/repro/index.d.ts.map +1 -0
- package/dist/repro/index.js +2 -0
- package/dist/repro/index.js.map +1 -0
- package/dist/repro/recorder.d.ts +30 -0
- package/dist/repro/recorder.d.ts.map +1 -0
- package/dist/repro/recorder.js +321 -0
- package/dist/repro/recorder.js.map +1 -0
- package/dist/streams/tail.d.ts +6 -0
- package/dist/streams/tail.d.ts.map +1 -0
- package/dist/streams/tail.js +113 -0
- package/dist/streams/tail.js.map +1 -0
- package/dist/worker/engineWorker.js +35 -13
- package/dist/worker/engineWorker.js.map +1 -1
- package/dist/worker/protocol.d.ts +3 -0
- package/dist/worker/protocol.d.ts.map +1 -1
- package/dist/worker/testShims/invalidPollBytesNative.d.ts +22 -0
- package/dist/worker/testShims/invalidPollBytesNative.d.ts.map +1 -0
- package/dist/worker/testShims/invalidPollBytesNative.js +65 -0
- package/dist/worker/testShims/invalidPollBytesNative.js.map +1 -0
- package/dist/worker/testShims/limitsExpectNative.d.ts +22 -0
- package/dist/worker/testShims/limitsExpectNative.d.ts.map +1 -0
- package/dist/worker/testShims/limitsExpectNative.js +85 -0
- package/dist/worker/testShims/limitsExpectNative.js.map +1 -0
- package/dist/worker/testShims/limitsNative.d.ts +22 -0
- package/dist/worker/testShims/limitsNative.d.ts.map +1 -0
- package/dist/worker/testShims/limitsNative.js +90 -0
- package/dist/worker/testShims/limitsNative.js.map +1 -0
- package/dist/worker/tickTiming.d.ts +7 -0
- package/dist/worker/tickTiming.d.ts.map +1 -0
- package/dist/worker/tickTiming.js +26 -0
- package/dist/worker/tickTiming.js.map +1 -0
- package/package.json +12 -8
- package/dist/__e2e__/fixtures/terminal-app.d.ts +0 -2
- package/dist/__e2e__/fixtures/terminal-app.d.ts.map +0 -1
- package/dist/__e2e__/fixtures/terminal-app.js +0 -42
- package/dist/__e2e__/fixtures/terminal-app.js.map +0 -1
- package/dist/__e2e__/terminal-render.e2e.test.d.ts +0 -2
- package/dist/__e2e__/terminal-render.e2e.test.d.ts.map +0 -1
- package/dist/__e2e__/terminal-render.e2e.test.js +0 -125
- package/dist/__e2e__/terminal-render.e2e.test.js.map +0 -1
- package/dist/__tests__/worker_integration.test.d.ts +0 -2
- package/dist/__tests__/worker_integration.test.d.ts.map +0 -1
- package/dist/__tests__/worker_integration.test.js +0 -569
- package/dist/__tests__/worker_integration.test.js.map +0 -1
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
import { mkdtempSync, readdirSync, rmSync, statSync, symlinkSync, watch, } from "node:fs";
|
|
2
|
+
import { cp } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { dirname, extname, isAbsolute, join, relative, resolve } from "node:path";
|
|
5
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
6
|
+
const DEFAULT_DEBOUNCE_MS = 40;
|
|
7
|
+
const WATCH_REFRESH_DELAY_MS = 50;
|
|
8
|
+
const PRESERVED_SNAPSHOT_REVISIONS = 2;
|
|
9
|
+
const TRACKED_EXTENSIONS = new Set([
|
|
10
|
+
".ts",
|
|
11
|
+
".tsx",
|
|
12
|
+
".mts",
|
|
13
|
+
".cts",
|
|
14
|
+
".js",
|
|
15
|
+
".jsx",
|
|
16
|
+
".mjs",
|
|
17
|
+
".cjs",
|
|
18
|
+
".json",
|
|
19
|
+
]);
|
|
20
|
+
const IGNORED_DIR_NAMES = new Set([
|
|
21
|
+
".git",
|
|
22
|
+
".hg",
|
|
23
|
+
".svn",
|
|
24
|
+
"dist",
|
|
25
|
+
"build",
|
|
26
|
+
"out",
|
|
27
|
+
"coverage",
|
|
28
|
+
"node_modules",
|
|
29
|
+
]);
|
|
30
|
+
function isViewReloadOptions(opts) {
|
|
31
|
+
return "viewModule" in opts;
|
|
32
|
+
}
|
|
33
|
+
function isRoutesReloadOptions(opts) {
|
|
34
|
+
return "routesModule" in opts;
|
|
35
|
+
}
|
|
36
|
+
function toAbsolutePath(input, label) {
|
|
37
|
+
if (input instanceof URL) {
|
|
38
|
+
if (input.protocol !== "file:") {
|
|
39
|
+
throw new Error(`${label} must be a file URL when URL is provided`);
|
|
40
|
+
}
|
|
41
|
+
return resolve(fileURLToPath(input));
|
|
42
|
+
}
|
|
43
|
+
if (typeof input !== "string" || input.trim().length === 0) {
|
|
44
|
+
throw new Error(`${label} must be a non-empty string or file URL`);
|
|
45
|
+
}
|
|
46
|
+
return isAbsolute(input) ? resolve(input) : resolve(process.cwd(), input);
|
|
47
|
+
}
|
|
48
|
+
function ensurePositiveInt(name, value) {
|
|
49
|
+
if (!Number.isInteger(value) || value <= 0) {
|
|
50
|
+
throw new Error(`${name} must be a positive integer`);
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
function isRecord(value) {
|
|
55
|
+
return typeof value === "object" && value !== null;
|
|
56
|
+
}
|
|
57
|
+
function defaultResolveView(moduleNs) {
|
|
58
|
+
if (!isRecord(moduleNs)) {
|
|
59
|
+
throw new Error("HSR module must export a named `view` function or a default function");
|
|
60
|
+
}
|
|
61
|
+
const moduleExports = moduleNs;
|
|
62
|
+
const named = moduleExports.view;
|
|
63
|
+
if (typeof named === "function")
|
|
64
|
+
return named;
|
|
65
|
+
const fallback = moduleExports.default;
|
|
66
|
+
if (typeof fallback === "function")
|
|
67
|
+
return fallback;
|
|
68
|
+
throw new Error("HSR module must export a named `view` function or a default function");
|
|
69
|
+
}
|
|
70
|
+
function coerceRoutesExport(value) {
|
|
71
|
+
if (!Array.isArray(value)) {
|
|
72
|
+
throw new Error("HSR routes module must export a named `routes` array or a default array");
|
|
73
|
+
}
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
function defaultResolveRoutes(moduleNs) {
|
|
77
|
+
if (!isRecord(moduleNs)) {
|
|
78
|
+
throw new Error("HSR routes module must export a named `routes` array or a default array");
|
|
79
|
+
}
|
|
80
|
+
const moduleExports = moduleNs;
|
|
81
|
+
if (moduleExports.routes !== undefined) {
|
|
82
|
+
return coerceRoutesExport(moduleExports.routes);
|
|
83
|
+
}
|
|
84
|
+
if (moduleExports.default !== undefined) {
|
|
85
|
+
return coerceRoutesExport(moduleExports.default);
|
|
86
|
+
}
|
|
87
|
+
throw new Error("HSR routes module must export a named `routes` array or a default array");
|
|
88
|
+
}
|
|
89
|
+
function containsIgnoredDir(absPath) {
|
|
90
|
+
const normalized = absPath.replace(/\\/g, "/");
|
|
91
|
+
for (const part of normalized.split("/")) {
|
|
92
|
+
if (IGNORED_DIR_NAMES.has(part))
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
function shouldTrackPath(absPath) {
|
|
98
|
+
if (containsIgnoredDir(absPath))
|
|
99
|
+
return false;
|
|
100
|
+
const ext = extname(absPath).toLowerCase();
|
|
101
|
+
return TRACKED_EXTENSIONS.has(ext);
|
|
102
|
+
}
|
|
103
|
+
function isWithinOrEqual(root, candidate) {
|
|
104
|
+
const rel = relative(root, candidate);
|
|
105
|
+
return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
|
|
106
|
+
}
|
|
107
|
+
function safeReadDir(dir) {
|
|
108
|
+
try {
|
|
109
|
+
return readdirSync(dir, { withFileTypes: true });
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return Object.freeze([]);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function collectWatchDirectories(root) {
|
|
116
|
+
const out = [];
|
|
117
|
+
const stack = [root];
|
|
118
|
+
while (stack.length > 0) {
|
|
119
|
+
const current = stack.pop();
|
|
120
|
+
if (!current)
|
|
121
|
+
continue;
|
|
122
|
+
out.push(current);
|
|
123
|
+
const entries = safeReadDir(current);
|
|
124
|
+
for (const entry of entries) {
|
|
125
|
+
if (!entry.isDirectory())
|
|
126
|
+
continue;
|
|
127
|
+
if (IGNORED_DIR_NAMES.has(entry.name))
|
|
128
|
+
continue;
|
|
129
|
+
stack.push(join(current, entry.name));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return Object.freeze(out);
|
|
133
|
+
}
|
|
134
|
+
function makeLogSink(log) {
|
|
135
|
+
if (typeof log === "function")
|
|
136
|
+
return log;
|
|
137
|
+
return () => { };
|
|
138
|
+
}
|
|
139
|
+
function toWatchDirectory(pathLike) {
|
|
140
|
+
try {
|
|
141
|
+
return statSync(pathLike).isDirectory() ? pathLike : dirname(pathLike);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return dirname(pathLike);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function findNearestNodeModules(startDir) {
|
|
148
|
+
let current = resolve(startDir);
|
|
149
|
+
while (true) {
|
|
150
|
+
const candidate = join(current, "node_modules");
|
|
151
|
+
try {
|
|
152
|
+
if (statSync(candidate).isDirectory())
|
|
153
|
+
return candidate;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Keep walking up.
|
|
157
|
+
}
|
|
158
|
+
const parent = dirname(current);
|
|
159
|
+
if (parent === current)
|
|
160
|
+
return null;
|
|
161
|
+
current = parent;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function createReloadAdapter(opts) {
|
|
165
|
+
if (isViewReloadOptions(opts)) {
|
|
166
|
+
const resolveView = opts.resolveView ?? (defaultResolveView);
|
|
167
|
+
return Object.freeze({
|
|
168
|
+
entryModule: opts.viewModule,
|
|
169
|
+
targetLabel: "view",
|
|
170
|
+
applyReload: (moduleNs) => {
|
|
171
|
+
const nextView = resolveView(moduleNs);
|
|
172
|
+
opts.app.replaceView(nextView);
|
|
173
|
+
opts.onReload?.(nextView);
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
if (isRoutesReloadOptions(opts)) {
|
|
178
|
+
const resolveRoutes = opts.resolveRoutes ?? (defaultResolveRoutes);
|
|
179
|
+
return Object.freeze({
|
|
180
|
+
entryModule: opts.routesModule,
|
|
181
|
+
targetLabel: "routes",
|
|
182
|
+
applyReload: (moduleNs) => {
|
|
183
|
+
const nextRoutes = resolveRoutes(moduleNs);
|
|
184
|
+
opts.app.replaceRoutes(nextRoutes);
|
|
185
|
+
opts.onReload?.(nextRoutes);
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
throw new Error("HSR options must provide either `viewModule` or `routesModule`");
|
|
190
|
+
}
|
|
191
|
+
export function createHotStateReload(opts) {
|
|
192
|
+
const reloadAdapter = createReloadAdapter(opts);
|
|
193
|
+
const entryLabel = isViewReloadOptions(opts) ? "viewModule" : "routesModule";
|
|
194
|
+
const entryPath = toAbsolutePath(reloadAdapter.entryModule, entryLabel);
|
|
195
|
+
const moduleRoot = toAbsolutePath(opts.moduleRoot ?? dirname(entryPath), "moduleRoot");
|
|
196
|
+
if (!isWithinOrEqual(moduleRoot, entryPath)) {
|
|
197
|
+
throw new Error(`${entryLabel} must be inside moduleRoot`);
|
|
198
|
+
}
|
|
199
|
+
const watchTargets = new Set([moduleRoot]);
|
|
200
|
+
for (const pathInput of opts.watchPaths ?? []) {
|
|
201
|
+
watchTargets.add(toAbsolutePath(pathInput, "watchPaths[]"));
|
|
202
|
+
}
|
|
203
|
+
const debounceMs = ensurePositiveInt("debounceMs", opts.debounceMs ?? DEFAULT_DEBOUNCE_MS);
|
|
204
|
+
const log = makeLogSink(opts.log);
|
|
205
|
+
const onError = opts.onError;
|
|
206
|
+
const targetLabel = reloadAdapter.targetLabel;
|
|
207
|
+
const hostNodeModulesPath = findNearestNodeModules(moduleRoot);
|
|
208
|
+
let sessionRoot = null;
|
|
209
|
+
const watchers = new Map();
|
|
210
|
+
let running = false;
|
|
211
|
+
let revision = 0;
|
|
212
|
+
let pendingChangePath;
|
|
213
|
+
let debounceTimer = null;
|
|
214
|
+
let refreshTimer = null;
|
|
215
|
+
let reloadChain = Promise.resolve(false);
|
|
216
|
+
function getSessionRoot() {
|
|
217
|
+
if (sessionRoot === null) {
|
|
218
|
+
sessionRoot = mkdtempSync(join(tmpdir(), "rezi-hsr-"));
|
|
219
|
+
}
|
|
220
|
+
return sessionRoot;
|
|
221
|
+
}
|
|
222
|
+
function cleanupSessionRoot() {
|
|
223
|
+
if (sessionRoot === null)
|
|
224
|
+
return;
|
|
225
|
+
rmSync(sessionRoot, { recursive: true, force: true });
|
|
226
|
+
sessionRoot = null;
|
|
227
|
+
}
|
|
228
|
+
function clearDebounce() {
|
|
229
|
+
if (debounceTimer === null)
|
|
230
|
+
return;
|
|
231
|
+
clearTimeout(debounceTimer);
|
|
232
|
+
debounceTimer = null;
|
|
233
|
+
}
|
|
234
|
+
function clearRefresh() {
|
|
235
|
+
if (refreshTimer === null)
|
|
236
|
+
return;
|
|
237
|
+
clearTimeout(refreshTimer);
|
|
238
|
+
refreshTimer = null;
|
|
239
|
+
}
|
|
240
|
+
function closeAllWatchers() {
|
|
241
|
+
for (const watcher of watchers.values()) {
|
|
242
|
+
try {
|
|
243
|
+
watcher.close();
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
// ignore watcher close races
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
watchers.clear();
|
|
250
|
+
}
|
|
251
|
+
function emitError(error, context) {
|
|
252
|
+
onError?.(error, context);
|
|
253
|
+
}
|
|
254
|
+
function copyFilter(pathToCheck) {
|
|
255
|
+
return !containsIgnoredDir(pathToCheck);
|
|
256
|
+
}
|
|
257
|
+
async function importLatestModule() {
|
|
258
|
+
const activeSessionRoot = getSessionRoot();
|
|
259
|
+
revision++;
|
|
260
|
+
const revisionDir = join(activeSessionRoot, `rev-${String(revision)}`);
|
|
261
|
+
await cp(moduleRoot, revisionDir, { recursive: true, filter: copyFilter });
|
|
262
|
+
if (hostNodeModulesPath) {
|
|
263
|
+
const snapshotNodeModules = join(revisionDir, "node_modules");
|
|
264
|
+
try {
|
|
265
|
+
symlinkSync(hostNodeModulesPath, snapshotNodeModules, "junction");
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// Best-effort: if symlink creation fails, reload may still work for relative imports.
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const relEntry = relative(moduleRoot, entryPath);
|
|
272
|
+
const snapshotEntry = join(revisionDir, relEntry);
|
|
273
|
+
const moduleUrl = `${pathToFileURL(snapshotEntry).href}?rezi_hsr_rev=${String(revision)}`;
|
|
274
|
+
const moduleNs = await import(moduleUrl);
|
|
275
|
+
const staleRevision = revision - PRESERVED_SNAPSHOT_REVISIONS;
|
|
276
|
+
if (staleRevision > 0) {
|
|
277
|
+
const staleDir = join(activeSessionRoot, `rev-${String(staleRevision)}`);
|
|
278
|
+
rmSync(staleDir, { recursive: true, force: true });
|
|
279
|
+
}
|
|
280
|
+
return moduleNs;
|
|
281
|
+
}
|
|
282
|
+
function queueReload(phase) {
|
|
283
|
+
const changedPath = pendingChangePath;
|
|
284
|
+
pendingChangePath = undefined;
|
|
285
|
+
const op = reloadChain.then(async () => {
|
|
286
|
+
if (!running)
|
|
287
|
+
return false;
|
|
288
|
+
try {
|
|
289
|
+
const moduleNs = await importLatestModule();
|
|
290
|
+
if (!running)
|
|
291
|
+
return false;
|
|
292
|
+
reloadAdapter.applyReload(moduleNs);
|
|
293
|
+
log({
|
|
294
|
+
level: "info",
|
|
295
|
+
message: phase === "manual"
|
|
296
|
+
? `HSR manual ${targetLabel} reload applied`
|
|
297
|
+
: `HSR file change ${targetLabel} reload applied`,
|
|
298
|
+
...(changedPath === undefined ? {} : { changedPath }),
|
|
299
|
+
});
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
emitError(error, { phase: "reload", ...(changedPath ? { changedPath } : {}) });
|
|
304
|
+
log({
|
|
305
|
+
level: "error",
|
|
306
|
+
message: `HSR reload failed; keeping previous ${targetLabel}`,
|
|
307
|
+
...(changedPath === undefined ? {} : { changedPath }),
|
|
308
|
+
});
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
reloadChain = op.catch(() => false);
|
|
313
|
+
return op;
|
|
314
|
+
}
|
|
315
|
+
function scheduleWatchRefresh() {
|
|
316
|
+
if (!running || refreshTimer !== null)
|
|
317
|
+
return;
|
|
318
|
+
refreshTimer = setTimeout(() => {
|
|
319
|
+
refreshTimer = null;
|
|
320
|
+
refreshWatchers();
|
|
321
|
+
}, WATCH_REFRESH_DELAY_MS);
|
|
322
|
+
}
|
|
323
|
+
function shouldReloadForPath(absPath) {
|
|
324
|
+
if (shouldTrackPath(absPath))
|
|
325
|
+
return true;
|
|
326
|
+
if (isWithinOrEqual(moduleRoot, absPath))
|
|
327
|
+
return true;
|
|
328
|
+
for (const target of watchTargets) {
|
|
329
|
+
if (isWithinOrEqual(target, absPath))
|
|
330
|
+
return true;
|
|
331
|
+
}
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
function onWatchEvent(watchDir, eventType, filename) {
|
|
335
|
+
if (!running)
|
|
336
|
+
return;
|
|
337
|
+
const changedName = filename === null || filename === undefined
|
|
338
|
+
? null
|
|
339
|
+
: typeof filename === "string"
|
|
340
|
+
? filename
|
|
341
|
+
: filename.toString("utf8");
|
|
342
|
+
const resolvedPath = changedName === null ? watchDir : resolve(watchDir, changedName);
|
|
343
|
+
if (!shouldReloadForPath(resolvedPath))
|
|
344
|
+
return;
|
|
345
|
+
pendingChangePath = resolvedPath;
|
|
346
|
+
clearDebounce();
|
|
347
|
+
debounceTimer = setTimeout(() => {
|
|
348
|
+
debounceTimer = null;
|
|
349
|
+
void queueReload("watch");
|
|
350
|
+
}, debounceMs);
|
|
351
|
+
if (eventType === "rename") {
|
|
352
|
+
scheduleWatchRefresh();
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
function refreshWatchers() {
|
|
356
|
+
if (!running)
|
|
357
|
+
return;
|
|
358
|
+
const desiredDirs = new Set();
|
|
359
|
+
for (const target of watchTargets) {
|
|
360
|
+
const root = toWatchDirectory(target);
|
|
361
|
+
if (containsIgnoredDir(root))
|
|
362
|
+
continue;
|
|
363
|
+
const dirs = collectWatchDirectories(root);
|
|
364
|
+
for (const dir of dirs) {
|
|
365
|
+
desiredDirs.add(dir);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
for (const watchedDir of watchers.keys()) {
|
|
369
|
+
if (desiredDirs.has(watchedDir))
|
|
370
|
+
continue;
|
|
371
|
+
const watcher = watchers.get(watchedDir);
|
|
372
|
+
watchers.delete(watchedDir);
|
|
373
|
+
try {
|
|
374
|
+
watcher?.close();
|
|
375
|
+
}
|
|
376
|
+
catch {
|
|
377
|
+
// ignore watcher close races
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
for (const dir of desiredDirs) {
|
|
381
|
+
if (watchers.has(dir))
|
|
382
|
+
continue;
|
|
383
|
+
try {
|
|
384
|
+
const watcher = watch(dir, { persistent: true }, (eventType, filename) => {
|
|
385
|
+
onWatchEvent(dir, eventType, filename ?? null);
|
|
386
|
+
});
|
|
387
|
+
watcher.on("error", (error) => {
|
|
388
|
+
emitError(error, { phase: "watch", changedPath: dir });
|
|
389
|
+
log({ level: "warn", message: "HSR watcher reported an error", changedPath: dir });
|
|
390
|
+
scheduleWatchRefresh();
|
|
391
|
+
});
|
|
392
|
+
watchers.set(dir, watcher);
|
|
393
|
+
}
|
|
394
|
+
catch (error) {
|
|
395
|
+
emitError(error, { phase: "watch", changedPath: dir });
|
|
396
|
+
log({ level: "warn", message: "HSR failed to watch path", changedPath: dir });
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
async function start() {
|
|
401
|
+
if (running)
|
|
402
|
+
return;
|
|
403
|
+
running = true;
|
|
404
|
+
refreshWatchers();
|
|
405
|
+
log({ level: "info", message: "HSR watcher started" });
|
|
406
|
+
}
|
|
407
|
+
async function reloadNow() {
|
|
408
|
+
if (!running)
|
|
409
|
+
return false;
|
|
410
|
+
clearDebounce();
|
|
411
|
+
return queueReload("manual");
|
|
412
|
+
}
|
|
413
|
+
async function stop() {
|
|
414
|
+
if (!running) {
|
|
415
|
+
cleanupSessionRoot();
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
running = false;
|
|
419
|
+
clearDebounce();
|
|
420
|
+
clearRefresh();
|
|
421
|
+
closeAllWatchers();
|
|
422
|
+
try {
|
|
423
|
+
await reloadChain;
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
// ignore pending reload failures during shutdown
|
|
427
|
+
}
|
|
428
|
+
cleanupSessionRoot();
|
|
429
|
+
log({ level: "info", message: "HSR watcher stopped" });
|
|
430
|
+
}
|
|
431
|
+
return Object.freeze({
|
|
432
|
+
start,
|
|
433
|
+
reloadNow,
|
|
434
|
+
stop,
|
|
435
|
+
isRunning: () => running,
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
//# sourceMappingURL=hotStateReload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hotStateReload.js","sourceRoot":"","sources":["../../src/dev/hotStateReload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { App } from "@rezi-ui/core";
|
|
2
|
+
import { type HotStateReloadController, type HotStateReloadRoutesOptions, type HotStateReloadViewOptions } from "./hotStateReload.js";
|
|
3
|
+
export type NodeAppHotReloadViewOptions<S> = Omit<HotStateReloadViewOptions<S>, "app">;
|
|
4
|
+
export type NodeAppHotReloadRoutesOptions<S> = Omit<HotStateReloadRoutesOptions<S>, "app">;
|
|
5
|
+
export type NodeAppHotReloadOptions<S> = NodeAppHotReloadViewOptions<S> | NodeAppHotReloadRoutesOptions<S>;
|
|
6
|
+
type NodeAppLifecycle<S> = Pick<App<S>, "start" | "stop" | "dispose">;
|
|
7
|
+
type NodeAppHotReloadTargets<S> = Pick<App<S>, "replaceView" | "replaceRoutes">;
|
|
8
|
+
export declare function createNodeAppHotReloadController<S>(app: NodeAppHotReloadTargets<S>, options: NodeAppHotReloadOptions<S>): HotStateReloadController;
|
|
9
|
+
export declare function attachNodeAppHotReloadLifecycle<S>(app: NodeAppLifecycle<S>, controller: HotStateReloadController): void;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=nodeAppHotReload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeAppHotReload.d.ts","sourceRoot":"","sources":["../../src/dev/nodeAppHotReload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EAE/B,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,2BAA2B,CAAC,CAAC,IAAI,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACvF,MAAM,MAAM,6BAA6B,CAAC,CAAC,IAAI,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC3F,MAAM,MAAM,uBAAuB,CAAC,CAAC,IACjC,2BAA2B,CAAC,CAAC,CAAC,GAC9B,6BAA6B,CAAC,CAAC,CAAC,CAAC;AAErC,KAAK,gBAAgB,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;AACtE,KAAK,uBAAuB,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,aAAa,GAAG,eAAe,CAAC,CAAC;AAgBhF,wBAAgB,gCAAgC,CAAC,CAAC,EAChD,GAAG,EAAE,uBAAuB,CAAC,CAAC,CAAC,EAC/B,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,GAClC,wBAAwB,CAa1B;AAED,wBAAgB,+BAA+B,CAAC,CAAC,EAC/C,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,EACxB,UAAU,EAAE,wBAAwB,GACnC,IAAI,CAkDN"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { createHotStateReload, } from "./hotStateReload.js";
|
|
2
|
+
function createViewHotReloadApp(app) {
|
|
3
|
+
return {
|
|
4
|
+
replaceView: app.replaceView.bind(app),
|
|
5
|
+
};
|
|
6
|
+
}
|
|
7
|
+
function createRoutesHotReloadApp(app) {
|
|
8
|
+
return {
|
|
9
|
+
replaceRoutes: app.replaceRoutes.bind(app),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function createNodeAppHotReloadController(app, options) {
|
|
13
|
+
if ("viewModule" in options) {
|
|
14
|
+
const opts = {
|
|
15
|
+
...options,
|
|
16
|
+
app: createViewHotReloadApp(app),
|
|
17
|
+
};
|
|
18
|
+
return createHotStateReload(opts);
|
|
19
|
+
}
|
|
20
|
+
const opts = {
|
|
21
|
+
...options,
|
|
22
|
+
app: createRoutesHotReloadApp(app),
|
|
23
|
+
};
|
|
24
|
+
return createHotStateReload(opts);
|
|
25
|
+
}
|
|
26
|
+
export function attachNodeAppHotReloadLifecycle(app, controller) {
|
|
27
|
+
const baseStart = app.start.bind(app);
|
|
28
|
+
const baseStop = app.stop.bind(app);
|
|
29
|
+
const baseDispose = app.dispose.bind(app);
|
|
30
|
+
app.start = async () => {
|
|
31
|
+
let startedByLifecycle = false;
|
|
32
|
+
if (!controller.isRunning()) {
|
|
33
|
+
await controller.start();
|
|
34
|
+
startedByLifecycle = true;
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
await baseStart();
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (startedByLifecycle && controller.isRunning()) {
|
|
41
|
+
try {
|
|
42
|
+
await controller.stop();
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Preserve app.start() failure as the primary error.
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
app.stop = async () => {
|
|
52
|
+
let failure = null;
|
|
53
|
+
try {
|
|
54
|
+
await baseStop();
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
failure = error;
|
|
58
|
+
}
|
|
59
|
+
if (controller.isRunning()) {
|
|
60
|
+
try {
|
|
61
|
+
await controller.stop();
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (failure === null)
|
|
65
|
+
failure = error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (failure !== null)
|
|
69
|
+
throw failure;
|
|
70
|
+
};
|
|
71
|
+
app.dispose = () => {
|
|
72
|
+
if (controller.isRunning()) {
|
|
73
|
+
void controller.stop().catch(() => undefined);
|
|
74
|
+
}
|
|
75
|
+
baseDispose();
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=nodeAppHotReload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeAppHotReload.js","sourceRoot":"","sources":["../../src/dev/nodeAppHotReload.ts"],"names":[],"mappings":"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"}
|
package/dist/image.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"AAwBA,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAGhE;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAelD"}
|
package/dist/image.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
const DEFAULT_IMAGE_CACHE_MAX_ENTRIES = 100;
|
|
4
|
+
const IMAGE_CACHE = new Map();
|
|
5
|
+
let imageCacheMaxEntries = DEFAULT_IMAGE_CACHE_MAX_ENTRIES;
|
|
6
|
+
function normalizeCacheMaxEntries(maxEntries) {
|
|
7
|
+
if (!Number.isFinite(maxEntries) || !Number.isInteger(maxEntries) || maxEntries < 0) {
|
|
8
|
+
throw new TypeError("setImageCacheMaxEntries(maxEntries): maxEntries must be a non-negative integer");
|
|
9
|
+
}
|
|
10
|
+
return maxEntries;
|
|
11
|
+
}
|
|
12
|
+
function evictOverflowEntries() {
|
|
13
|
+
while (IMAGE_CACHE.size > imageCacheMaxEntries) {
|
|
14
|
+
const oldest = IMAGE_CACHE.keys().next();
|
|
15
|
+
if (oldest.done)
|
|
16
|
+
return;
|
|
17
|
+
IMAGE_CACHE.delete(oldest.value);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function setImageCacheMaxEntries(maxEntries) {
|
|
21
|
+
imageCacheMaxEntries = normalizeCacheMaxEntries(maxEntries);
|
|
22
|
+
evictOverflowEntries();
|
|
23
|
+
}
|
|
24
|
+
export function clearImageCache() {
|
|
25
|
+
IMAGE_CACHE.clear();
|
|
26
|
+
}
|
|
27
|
+
export function loadImage(path) {
|
|
28
|
+
if (path.length === 0) {
|
|
29
|
+
throw new TypeError("loadImage(path): path must be a non-empty string");
|
|
30
|
+
}
|
|
31
|
+
const resolvedPath = resolve(path);
|
|
32
|
+
const cached = IMAGE_CACHE.get(resolvedPath);
|
|
33
|
+
if (cached) {
|
|
34
|
+
IMAGE_CACHE.delete(resolvedPath);
|
|
35
|
+
IMAGE_CACHE.set(resolvedPath, cached);
|
|
36
|
+
return cached;
|
|
37
|
+
}
|
|
38
|
+
const bytes = new Uint8Array(readFileSync(resolvedPath));
|
|
39
|
+
IMAGE_CACHE.set(resolvedPath, bytes);
|
|
40
|
+
evictOverflowEntries();
|
|
41
|
+
return bytes;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,+BAA+B,GAAG,GAAG,CAAC;AAC5C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;AAClD,IAAI,oBAAoB,GAAG,+BAA+B,CAAC;AAE3D,SAAS,wBAAwB,CAAC,UAAkB;IAClD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACpF,MAAM,IAAI,SAAS,CACjB,gFAAgF,CACjF,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO,WAAW,CAAC,IAAI,GAAG,oBAAoB,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO;QACxB,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,UAAkB;IACxD,oBAAoB,GAAG,wBAAwB,CAAC,UAAU,CAAC,CAAC;IAC5D,oBAAoB,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,WAAW,CAAC,KAAK,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,SAAS,CAAC,kDAAkD,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7C,IAAI,MAAM,EAAE,CAAC;QACX,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACjC,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACtC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;IACzD,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACrC,oBAAoB,EAAE,CAAC;IACvB,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,49 @@
|
|
|
1
|
+
import { type App, type AppConfig, type RouteDefinition, type Theme, type ThemeDefinition } from "@rezi-ui/core";
|
|
1
2
|
import { type NodeBackend, type NodeBackendConfig } from "./backend/nodeBackend.js";
|
|
3
|
+
import { type HotStateReloadController, createHotStateReload } from "./dev/hotStateReload.js";
|
|
4
|
+
import { type NodeAppHotReloadOptions } from "./dev/nodeAppHotReload.js";
|
|
5
|
+
import { createReproRecorder } from "./repro/index.js";
|
|
2
6
|
export type { NodeBackendConfig };
|
|
3
7
|
export type { NodeBackend };
|
|
8
|
+
export type { HotStateReloadController, HotStateReloadErrorContext, HotStateReloadLogEvent, HotStateReloadOptions, HotStateReloadRoutesOptions, HotStateReloadViewOptions, } from "./dev/hotStateReload.js";
|
|
9
|
+
export type { NodeAppHotReloadOptions, NodeAppHotReloadRoutesOptions, NodeAppHotReloadViewOptions, } from "./dev/nodeAppHotReload.js";
|
|
10
|
+
export type { CreateReproRecorderOptions, ReproRecorder, ReproRecorderBackendCapsOverrides, ReproRecorderBounds, ReproRecorderBuildResult, } from "./repro/index.js";
|
|
11
|
+
export { createHotStateReload };
|
|
12
|
+
export { createReproRecorder };
|
|
13
|
+
export { loadImage } from "./image.js";
|
|
14
|
+
export { createNodeTailSource } from "./streams/tail.js";
|
|
15
|
+
export type NodeAppConfig = Readonly<AppConfig & Omit<NodeBackendConfig, "fpsCap" | "maxEventBytes">>;
|
|
16
|
+
export type CreateNodeAppOptions<S> = Readonly<{
|
|
17
|
+
initialState: S;
|
|
18
|
+
routes?: readonly RouteDefinition<S>[];
|
|
19
|
+
initialRoute?: string;
|
|
20
|
+
config?: NodeAppConfig;
|
|
21
|
+
theme?: Theme | ThemeDefinition;
|
|
22
|
+
/**
|
|
23
|
+
* Development-only hot state-preserving reload wiring.
|
|
24
|
+
*
|
|
25
|
+
* When configured, createNodeApp automatically starts/stops the HSR watcher
|
|
26
|
+
* together with app lifecycle and exposes the controller on `app.hotReload`.
|
|
27
|
+
*/
|
|
28
|
+
hotReload?: NodeAppHotReloadOptions<S>;
|
|
29
|
+
}>;
|
|
30
|
+
export type NodeApp<S> = App<S> & Readonly<{
|
|
31
|
+
/** Node/Bun runtime backend instance. */
|
|
32
|
+
backend: NodeBackend;
|
|
33
|
+
/** True when NO_COLOR is present in the process environment. */
|
|
34
|
+
isNoColor: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Built-in HSR controller when `createNodeApp({ hotReload })` is configured.
|
|
37
|
+
* `null` when hot reload is not configured.
|
|
38
|
+
*/
|
|
39
|
+
hotReload: HotStateReloadController | null;
|
|
40
|
+
}>;
|
|
41
|
+
export declare function createNodeApp<S>(opts: CreateNodeAppOptions<S>): NodeApp<S>;
|
|
42
|
+
/**
|
|
43
|
+
* Low-level Node/Bun backend constructor.
|
|
44
|
+
*
|
|
45
|
+
* Prefer `createNodeApp()` for standard app construction so core/backend config
|
|
46
|
+
* stays aligned automatically.
|
|
47
|
+
*/
|
|
4
48
|
export declare function createNodeBackend(config?: NodeBackendConfig): NodeBackend;
|
|
5
49
|
//# sourceMappingURL=index.d.ts.map
|