@telorun/cli 0.2.2 → 0.2.4
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.js +86 -1
- package/dist/cli.js.map +1 -1
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { Kernel } from "@telorun/
|
|
2
|
+
import { Kernel } from "@telorun/kernel";
|
|
3
|
+
import * as fs from "fs";
|
|
3
4
|
import * as path from "path";
|
|
4
5
|
import yargs from "yargs";
|
|
5
6
|
import { hideBin } from "yargs/helpers";
|
|
@@ -15,6 +16,64 @@ function createLogger(verbose) {
|
|
|
15
16
|
verbose,
|
|
16
17
|
};
|
|
17
18
|
}
|
|
19
|
+
function setupWatchMode(kernel, log) {
|
|
20
|
+
const watchers = new Map();
|
|
21
|
+
const debounceTimers = new Map();
|
|
22
|
+
let active = true;
|
|
23
|
+
function watchFile(filePath) {
|
|
24
|
+
if (!active || watchers.has(filePath))
|
|
25
|
+
return;
|
|
26
|
+
let watcher;
|
|
27
|
+
try {
|
|
28
|
+
watcher = fs.watch(filePath, { persistent: false }, () => {
|
|
29
|
+
const existing = debounceTimers.get(filePath);
|
|
30
|
+
if (existing)
|
|
31
|
+
clearTimeout(existing);
|
|
32
|
+
debounceTimers.set(filePath, setTimeout(() => {
|
|
33
|
+
debounceTimers.delete(filePath);
|
|
34
|
+
watchers.get(filePath)?.close();
|
|
35
|
+
watchers.delete(filePath);
|
|
36
|
+
void handleChange(filePath);
|
|
37
|
+
}, 150));
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return; // file may not exist yet
|
|
42
|
+
}
|
|
43
|
+
watcher.on("error", () => watchers.delete(filePath));
|
|
44
|
+
watchers.set(filePath, watcher);
|
|
45
|
+
}
|
|
46
|
+
async function handleChange(filePath) {
|
|
47
|
+
log.info(`[watch] reloading ${filePath}`);
|
|
48
|
+
try {
|
|
49
|
+
await kernel.reloadSource(filePath);
|
|
50
|
+
// Refresh watchers — new files may have been loaded after reload
|
|
51
|
+
for (const f of kernel.getSourceFiles())
|
|
52
|
+
watchFile(f);
|
|
53
|
+
log.info(log.ok(`[watch] complete`));
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
log.info(log.error(`[watch] error: ${err instanceof Error ? err.message : String(err)}`));
|
|
57
|
+
}
|
|
58
|
+
// Re-establish watcher regardless of outcome (handles atomic rename saves)
|
|
59
|
+
setTimeout(() => {
|
|
60
|
+
if (active)
|
|
61
|
+
watchFile(filePath);
|
|
62
|
+
}, 50);
|
|
63
|
+
}
|
|
64
|
+
function cleanup() {
|
|
65
|
+
active = false;
|
|
66
|
+
for (const t of debounceTimers.values())
|
|
67
|
+
clearTimeout(t);
|
|
68
|
+
debounceTimers.clear();
|
|
69
|
+
for (const w of watchers.values())
|
|
70
|
+
w.close();
|
|
71
|
+
watchers.clear();
|
|
72
|
+
}
|
|
73
|
+
for (const f of kernel.getSourceFiles())
|
|
74
|
+
watchFile(f);
|
|
75
|
+
return { cleanup };
|
|
76
|
+
}
|
|
18
77
|
async function run(argv) {
|
|
19
78
|
const log = createLogger(argv.verbose);
|
|
20
79
|
try {
|
|
@@ -30,6 +89,26 @@ async function run(argv) {
|
|
|
30
89
|
await kernel.enableEventStream(eventStreamPath);
|
|
31
90
|
log.info(`Event stream enabled: ${eventStreamPath}`);
|
|
32
91
|
}
|
|
92
|
+
let watchHandle = null;
|
|
93
|
+
if (argv.watch) {
|
|
94
|
+
// Acquire a hold BEFORE start() to keep the kernel alive for apps that
|
|
95
|
+
// don't have their own holds (e.g. script-only manifests).
|
|
96
|
+
// shutdown() will force-resolve waitForIdle() on Ctrl+C regardless of
|
|
97
|
+
// how many holds are active (e.g. Http.Server may hold its own).
|
|
98
|
+
kernel.acquireHold("watch-mode");
|
|
99
|
+
kernel.on("Runtime.Started", () => {
|
|
100
|
+
const files = kernel.getSourceFiles();
|
|
101
|
+
log.info(`[watch] watching ${files.length} file(s)`);
|
|
102
|
+
watchHandle = setupWatchMode(kernel, log);
|
|
103
|
+
});
|
|
104
|
+
const shutdown = () => {
|
|
105
|
+
log.info("\n[watch] stopping...");
|
|
106
|
+
watchHandle?.cleanup();
|
|
107
|
+
kernel.shutdown();
|
|
108
|
+
};
|
|
109
|
+
process.once("SIGINT", shutdown);
|
|
110
|
+
process.once("SIGTERM", shutdown);
|
|
111
|
+
}
|
|
33
112
|
await kernel.loadFromConfig(argv.path);
|
|
34
113
|
await kernel.start();
|
|
35
114
|
if (kernel.exitCode !== 0) {
|
|
@@ -65,6 +144,12 @@ yargs(hideBin(process.argv))
|
|
|
65
144
|
type: "boolean",
|
|
66
145
|
default: false,
|
|
67
146
|
describe: "Capture a snapshot on exit",
|
|
147
|
+
})
|
|
148
|
+
.option("watch", {
|
|
149
|
+
alias: "w",
|
|
150
|
+
type: "boolean",
|
|
151
|
+
default: false,
|
|
152
|
+
describe: "Watch manifest files and reload on change",
|
|
68
153
|
})
|
|
69
154
|
.demandCommand(1, "Please specify a command or path to run")
|
|
70
155
|
.strict()
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@telorun/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.4",
|
|
4
4
|
"description": "Telo CLI - Command-line interface for the Telo runtime.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
],
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"yargs": "^17.7.2",
|
|
24
|
-
"@telorun/
|
|
24
|
+
"@telorun/kernel": "0.2.4"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/node": "^20.0.0",
|