@hewliyang/headless-spreadjs 0.0.2 → 0.0.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/README.md +78 -50
- package/dist/cli/abort.d.ts +7 -0
- package/dist/cli/abort.d.ts.map +1 -0
- package/dist/cli/abort.js +35 -0
- package/dist/cli/abort.js.map +1 -0
- package/dist/cli/client.d.ts +9 -0
- package/dist/cli/client.d.ts.map +1 -0
- package/dist/cli/client.js +122 -0
- package/dist/cli/client.js.map +1 -0
- package/dist/cli/commands/clear.d.ts +3 -1
- package/dist/cli/commands/clear.d.ts.map +1 -1
- package/dist/cli/commands/clear.js +11 -9
- package/dist/cli/commands/clear.js.map +1 -1
- package/dist/cli/commands/copy.d.ts +3 -1
- package/dist/cli/commands/copy.d.ts.map +1 -1
- package/dist/cli/commands/copy.js +5 -2
- package/dist/cli/commands/copy.js.map +1 -1
- package/dist/cli/commands/create.d.ts +3 -1
- package/dist/cli/commands/create.d.ts.map +1 -1
- package/dist/cli/commands/create.js +2 -2
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/csv.d.ts +5 -1
- package/dist/cli/commands/csv.d.ts.map +1 -1
- package/dist/cli/commands/csv.js +38 -13
- package/dist/cli/commands/csv.js.map +1 -1
- package/dist/cli/commands/deps.d.ts +11 -0
- package/dist/cli/commands/deps.d.ts.map +1 -0
- package/dist/cli/commands/deps.js +329 -0
- package/dist/cli/commands/deps.js.map +1 -0
- package/dist/cli/commands/diff.d.ts +7 -0
- package/dist/cli/commands/diff.d.ts.map +1 -0
- package/dist/cli/commands/diff.js +235 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/eval.d.ts +3 -1
- package/dist/cli/commands/eval.d.ts.map +1 -1
- package/dist/cli/commands/eval.js +23 -8
- package/dist/cli/commands/eval.js.map +1 -1
- package/dist/cli/commands/get.d.ts +1 -0
- package/dist/cli/commands/get.d.ts.map +1 -1
- package/dist/cli/commands/get.js +5 -2
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/info.d.ts +3 -1
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +5 -2
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/objects.d.ts +3 -1
- package/dist/cli/commands/objects.d.ts.map +1 -1
- package/dist/cli/commands/objects.js +5 -6
- package/dist/cli/commands/objects.js.map +1 -1
- package/dist/cli/commands/resize.d.ts +1 -0
- package/dist/cli/commands/resize.d.ts.map +1 -1
- package/dist/cli/commands/resize.js +67 -29
- package/dist/cli/commands/resize.js.map +1 -1
- package/dist/cli/commands/rows-cols.d.ts +1 -0
- package/dist/cli/commands/rows-cols.d.ts.map +1 -1
- package/dist/cli/commands/rows-cols.js +101 -45
- package/dist/cli/commands/rows-cols.js.map +1 -1
- package/dist/cli/commands/screenshot.d.ts +8 -0
- package/dist/cli/commands/screenshot.d.ts.map +1 -0
- package/dist/cli/commands/screenshot.js +260 -0
- package/dist/cli/commands/screenshot.js.map +1 -0
- package/dist/cli/commands/search.d.ts +1 -0
- package/dist/cli/commands/search.d.ts.map +1 -1
- package/dist/cli/commands/search.js +16 -8
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/set.d.ts +3 -1
- package/dist/cli/commands/set.d.ts.map +1 -1
- package/dist/cli/commands/set.js +72 -25
- package/dist/cli/commands/set.js.map +1 -1
- package/dist/cli/commands/sheet.d.ts +3 -1
- package/dist/cli/commands/sheet.d.ts.map +1 -1
- package/dist/cli/commands/sheet.js +20 -10
- package/dist/cli/commands/sheet.js.map +1 -1
- package/dist/cli/context.d.ts +18 -6
- package/dist/cli/context.d.ts.map +1 -1
- package/dist/cli/context.js +93 -8
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/daemon-entry.d.ts +3 -0
- package/dist/cli/daemon-entry.d.ts.map +1 -0
- package/dist/cli/daemon-entry.js +4 -0
- package/dist/cli/daemon-entry.js.map +1 -0
- package/dist/cli/daemon.d.ts +4 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +330 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/dispatch.d.ts +5 -0
- package/dist/cli/dispatch.d.ts.map +1 -0
- package/dist/cli/dispatch.js +353 -0
- package/dist/cli/dispatch.js.map +1 -0
- package/dist/cli/file-cache.d.ts +23 -0
- package/dist/cli/file-cache.d.ts.map +1 -0
- package/dist/cli/file-cache.js +102 -0
- package/dist/cli/file-cache.js.map +1 -0
- package/dist/cli/index.js +34 -175
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +210 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/output.d.ts +9 -6
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +36 -8
- package/dist/cli/output.js.map +1 -1
- package/dist/cli/styles.d.ts +14 -19
- package/dist/cli/styles.d.ts.map +1 -1
- package/dist/cli/styles.js +65 -39
- package/dist/cli/styles.js.map +1 -1
- package/dist/excel-file.d.ts +3 -1
- package/dist/excel-file.d.ts.map +1 -1
- package/dist/excel-file.js +50 -6
- package/dist/excel-file.js.map +1 -1
- package/dist/shims.d.ts.map +1 -1
- package/dist/shims.js +52 -0
- package/dist/shims.js.map +1 -1
- package/package.json +9 -1
package/dist/cli/index.js
CHANGED
|
@@ -1,183 +1,42 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
Commands:
|
|
18
|
-
create <file> Create a new Excel file
|
|
19
|
-
info <file> Show workbook metadata
|
|
20
|
-
get <file> <ref> Read cells (Sheet1!A1:C10)
|
|
21
|
-
csv <file> <ref> Read range as CSV
|
|
22
|
-
set <file> <ref> [json] Write cells (JSON from arg or stdin)
|
|
23
|
-
clear <file> <ref> [--type all|styles] Clear a range (default: values only)
|
|
24
|
-
search <file> <term> [--sheet S] [--regex] Search for values across sheets
|
|
25
|
-
copy <file> <src> <dst> Copy range (formulas + styles)
|
|
26
|
-
sheet <file> <op> [args] list | create | delete | rename
|
|
27
|
-
rc <file> <op> <dim> [--ref R] [--count N] Insert/delete/hide/freeze rows or columns
|
|
28
|
-
resize <file> [--columns A:D] [--width N] Resize column widths or row heights
|
|
29
|
-
objects <file> [--sheet <name>] List charts, tables, pivots
|
|
30
|
-
eval <file> [code] Execute arbitrary JS (code from arg or stdin)
|
|
31
|
-
|
|
32
|
-
Reference format:
|
|
33
|
-
Sheet1!A1:C10 range on named sheet
|
|
34
|
-
A1:C10 range on active sheet
|
|
35
|
-
A1 single cell
|
|
36
|
-
|
|
37
|
-
Globals available in eval:
|
|
38
|
-
workbook SpreadJS Workbook instance
|
|
39
|
-
sheet Active worksheet
|
|
40
|
-
GC GC.Spread.Sheets namespace
|
|
41
|
-
file ExcelFile wrapper (batch, save, toJSON)`;
|
|
42
|
-
function flag(args, name) {
|
|
43
|
-
const idx = args.indexOf(name);
|
|
44
|
-
return idx !== -1 ? args[idx + 1] : undefined;
|
|
45
|
-
}
|
|
46
|
-
function hasFlag(args, name) {
|
|
47
|
-
return args.includes(name);
|
|
48
|
-
}
|
|
49
|
-
async function main() {
|
|
50
|
-
const args = process.argv.slice(2);
|
|
51
|
-
if (args.length === 0 || args[0] === "--help" || args[0] === "-h") {
|
|
52
|
-
console.log(USAGE);
|
|
53
|
-
process.exit(0);
|
|
2
|
+
const MAX_ERROR_MESSAGE_LENGTH = 500;
|
|
3
|
+
const UNSUPPORTED_SPREADJS_FEATURE_ERROR = "SpreadJS failed (the file may contain unsupported features such as form controls)";
|
|
4
|
+
function toErrorMessage(reason) {
|
|
5
|
+
const message = reason instanceof Error ? reason.message : String(reason ?? "");
|
|
6
|
+
const lower = message.toLowerCase();
|
|
7
|
+
const looksLikeUnsupportedSpreadJsFeature = lower.includes("form control") ||
|
|
8
|
+
lower.includes("shape") ||
|
|
9
|
+
lower.includes("chart") ||
|
|
10
|
+
lower.includes("canvas") ||
|
|
11
|
+
lower.includes("getcontext") ||
|
|
12
|
+
lower.includes("todataurl");
|
|
13
|
+
if (looksLikeUnsupportedSpreadJsFeature &&
|
|
14
|
+
message.length > MAX_ERROR_MESSAGE_LENGTH) {
|
|
15
|
+
return UNSUPPORTED_SPREADJS_FEATURE_ERROR;
|
|
54
16
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
try {
|
|
58
|
-
switch (command) {
|
|
59
|
-
case "create": {
|
|
60
|
-
const file = requireArg(rest, 0, "create <file>");
|
|
61
|
-
await create(file);
|
|
62
|
-
break;
|
|
63
|
-
}
|
|
64
|
-
case "info": {
|
|
65
|
-
const file = requireArg(rest, 0, "info <file>");
|
|
66
|
-
await info(file);
|
|
67
|
-
break;
|
|
68
|
-
}
|
|
69
|
-
case "get": {
|
|
70
|
-
const file = requireArg(rest, 0, "get <file> <ref>");
|
|
71
|
-
const ref = requireArg(rest, 1, "get <file> <ref>");
|
|
72
|
-
const styles = !hasFlag(rest, "--no-styles");
|
|
73
|
-
await get(file, ref, { styles });
|
|
74
|
-
break;
|
|
75
|
-
}
|
|
76
|
-
case "csv": {
|
|
77
|
-
const file = requireArg(rest, 0, "csv <file> <ref>");
|
|
78
|
-
const ref = requireArg(rest, 1, "csv <file> <ref>");
|
|
79
|
-
await csv(file, ref);
|
|
80
|
-
break;
|
|
81
|
-
}
|
|
82
|
-
case "set": {
|
|
83
|
-
const file = requireArg(rest, 0, "set <file> <ref> [json]");
|
|
84
|
-
const ref = requireArg(rest, 1, "set <file> <ref> [json]");
|
|
85
|
-
const json = rest[2]; // optional, reads stdin if missing
|
|
86
|
-
await set(file, ref, json);
|
|
87
|
-
break;
|
|
88
|
-
}
|
|
89
|
-
case "clear": {
|
|
90
|
-
const file = requireArg(rest, 0, "clear <file> <ref>");
|
|
91
|
-
const ref = requireArg(rest, 1, "clear <file> <ref>");
|
|
92
|
-
const clearType = (flag(rest, "--type") ?? "values");
|
|
93
|
-
await clear(file, ref, clearType);
|
|
94
|
-
break;
|
|
95
|
-
}
|
|
96
|
-
case "search": {
|
|
97
|
-
const file = requireArg(rest, 0, "search <file> <term>");
|
|
98
|
-
const term = requireArg(rest, 1, "search <file> <term>");
|
|
99
|
-
await search(file, term, {
|
|
100
|
-
sheet: flag(rest, "--sheet"),
|
|
101
|
-
matchCase: hasFlag(rest, "--match-case"),
|
|
102
|
-
regex: hasFlag(rest, "--regex"),
|
|
103
|
-
maxResults: flag(rest, "--max")
|
|
104
|
-
? parseInt(flag(rest, "--max"), 10)
|
|
105
|
-
: undefined,
|
|
106
|
-
});
|
|
107
|
-
break;
|
|
108
|
-
}
|
|
109
|
-
case "copy": {
|
|
110
|
-
const file = requireArg(rest, 0, "copy <file> <src> <dst>");
|
|
111
|
-
const src = requireArg(rest, 1, "copy <file> <src> <dst>");
|
|
112
|
-
const dst = requireArg(rest, 2, "copy <file> <src> <dst>");
|
|
113
|
-
await copy(file, src, dst);
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
116
|
-
case "sheet": {
|
|
117
|
-
const file = requireArg(rest, 0, "sheet <file> <op> [args]");
|
|
118
|
-
const op = requireArg(rest, 1, "sheet <file> <op> [args]");
|
|
119
|
-
const opArgs = rest.slice(2);
|
|
120
|
-
await sheet(file, op, opArgs);
|
|
121
|
-
break;
|
|
122
|
-
}
|
|
123
|
-
case "rc": {
|
|
124
|
-
const file = requireArg(rest, 0, "rc <file> <op> <dim>");
|
|
125
|
-
const op = requireArg(rest, 1, "rc <file> <op> <dim>");
|
|
126
|
-
const dim = requireArg(rest, 2, "rc <file> <op> <dim>");
|
|
127
|
-
await rowsCols(file, op, dim, {
|
|
128
|
-
sheet: flag(rest, "--sheet"),
|
|
129
|
-
ref: flag(rest, "--ref"),
|
|
130
|
-
count: flag(rest, "--count")
|
|
131
|
-
? parseInt(flag(rest, "--count"), 10)
|
|
132
|
-
: undefined,
|
|
133
|
-
});
|
|
134
|
-
break;
|
|
135
|
-
}
|
|
136
|
-
case "resize": {
|
|
137
|
-
const file = requireArg(rest, 0, "resize <file> [options]");
|
|
138
|
-
await resize(file, flag(rest, "--sheet"), {
|
|
139
|
-
columns: flag(rest, "--columns"),
|
|
140
|
-
rows: flag(rest, "--rows"),
|
|
141
|
-
width: flag(rest, "--width")
|
|
142
|
-
? parseFloat(flag(rest, "--width"))
|
|
143
|
-
: undefined,
|
|
144
|
-
height: flag(rest, "--height")
|
|
145
|
-
? parseFloat(flag(rest, "--height"))
|
|
146
|
-
: undefined,
|
|
147
|
-
});
|
|
148
|
-
break;
|
|
149
|
-
}
|
|
150
|
-
case "objects": {
|
|
151
|
-
const file = requireArg(rest, 0, "objects <file>");
|
|
152
|
-
await objects(file, flag(rest, "--sheet"));
|
|
153
|
-
break;
|
|
154
|
-
}
|
|
155
|
-
case "eval": {
|
|
156
|
-
const file = requireArg(rest, 0, "eval <file> [code]");
|
|
157
|
-
const code = rest[1]; // optional, reads stdin if missing
|
|
158
|
-
await evalCode(file, code);
|
|
159
|
-
break;
|
|
160
|
-
}
|
|
161
|
-
default:
|
|
162
|
-
console.error(`Unknown command: ${command}\n`);
|
|
163
|
-
console.log(USAGE);
|
|
164
|
-
process.exit(1);
|
|
165
|
-
}
|
|
166
|
-
process.exit(0);
|
|
17
|
+
if (message.length > MAX_ERROR_MESSAGE_LENGTH) {
|
|
18
|
+
return `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}...`;
|
|
167
19
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
20
|
+
return message;
|
|
21
|
+
}
|
|
22
|
+
function reportFatalError(reason) {
|
|
23
|
+
const err = reason;
|
|
24
|
+
if (err?.code === "EPIPE") {
|
|
25
|
+
process.exit(0);
|
|
172
26
|
}
|
|
27
|
+
process.stderr.write(`${JSON.stringify({ error: toErrorMessage(reason) })}\n`);
|
|
28
|
+
process.exit(1);
|
|
173
29
|
}
|
|
174
|
-
function
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
console.error(`Usage: hsx ${usage}`);
|
|
178
|
-
process.exit(1);
|
|
30
|
+
function handlePipeError(err) {
|
|
31
|
+
if (err.code === "EPIPE") {
|
|
32
|
+
process.exit(0);
|
|
179
33
|
}
|
|
180
|
-
return value;
|
|
181
34
|
}
|
|
182
|
-
|
|
35
|
+
process.stdout.on("error", handlePipeError);
|
|
36
|
+
process.stderr.on("error", handlePipeError);
|
|
37
|
+
process.on("uncaughtException", reportFatalError);
|
|
38
|
+
process.on("unhandledRejection", reportFatalError);
|
|
39
|
+
const { main } = await import("./main.js");
|
|
40
|
+
await main().catch(reportFatalError);
|
|
41
|
+
export {};
|
|
183
42
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,MAAM,wBAAwB,GAAG,GAAG,CAAC;AACrC,MAAM,kCAAkC,GACtC,mFAAmF,CAAC;AAEtF,SAAS,cAAc,CAAC,MAAe;IACrC,MAAM,OAAO,GACX,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,mCAAmC,GACvC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC9B,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;QACvB,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;QACvB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC5B,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAE9B,IACE,mCAAmC;QACnC,OAAO,CAAC,MAAM,GAAG,wBAAwB,EACzC,CAAC;QACD,OAAO,kCAAkC,CAAC;IAC5C,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,wBAAwB,EAAE,CAAC;QAC9C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,KAAK,CAAC;IAC5D,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAe;IACvC,MAAM,GAAG,GAAG,MAA+B,CAAC;IAC5C,IAAI,GAAG,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CACzD,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,GAA0B;IACjD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAC5C,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAE5C,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;AAClD,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAAC;AAEnD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;AAC3C,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AA8IA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAoI1C"}
|
package/dist/cli/main.js
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { registerSignalTimeout } from "./abort.js";
|
|
3
|
+
import { spawnDaemon, tryDaemon, tryExistingDaemon } from "./client.js";
|
|
4
|
+
import { dispatch, USAGE } from "./dispatch.js";
|
|
5
|
+
import { createIoContext, runWithIo } from "./output.js";
|
|
6
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
7
|
+
function hasFlag(args, name) {
|
|
8
|
+
return args.includes(name);
|
|
9
|
+
}
|
|
10
|
+
function parseTimeoutValue(raw) {
|
|
11
|
+
const value = raw.trim();
|
|
12
|
+
if (!/^\d+(\.\d+)?$/.test(value)) {
|
|
13
|
+
throw new Error("Invalid --timeout value (expected seconds)");
|
|
14
|
+
}
|
|
15
|
+
const seconds = Number.parseFloat(value);
|
|
16
|
+
if (!Number.isFinite(seconds) || seconds <= 0) {
|
|
17
|
+
throw new Error("Invalid --timeout value (expected seconds)");
|
|
18
|
+
}
|
|
19
|
+
return Math.floor(seconds * 1000);
|
|
20
|
+
}
|
|
21
|
+
function parseGlobalOptions(args) {
|
|
22
|
+
const out = [];
|
|
23
|
+
let timeoutMs = DEFAULT_TIMEOUT_MS;
|
|
24
|
+
for (let i = 0; i < args.length; i++) {
|
|
25
|
+
const arg = args[i];
|
|
26
|
+
if (arg === "--timeout") {
|
|
27
|
+
const raw = args[i + 1];
|
|
28
|
+
if (!raw || raw.startsWith("--")) {
|
|
29
|
+
throw new Error("Usage: --timeout <seconds>");
|
|
30
|
+
}
|
|
31
|
+
timeoutMs = parseTimeoutValue(raw);
|
|
32
|
+
i++;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (arg.startsWith("--timeout=")) {
|
|
36
|
+
timeoutMs = parseTimeoutValue(arg.slice("--timeout=".length));
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
out.push(arg);
|
|
40
|
+
}
|
|
41
|
+
return { args: out, timeoutMs };
|
|
42
|
+
}
|
|
43
|
+
async function runWithTimeout(fn, timeoutMs) {
|
|
44
|
+
const controller = new AbortController();
|
|
45
|
+
registerSignalTimeout(controller.signal, timeoutMs, `Command timed out after ${Math.ceil(timeoutMs / 1000)}s`);
|
|
46
|
+
let timer = null;
|
|
47
|
+
try {
|
|
48
|
+
return await Promise.race([
|
|
49
|
+
fn(controller.signal),
|
|
50
|
+
new Promise((_, reject) => {
|
|
51
|
+
timer = setTimeout(() => {
|
|
52
|
+
const message = `Command timed out after ${Math.ceil(timeoutMs / 1000)}s`;
|
|
53
|
+
controller.abort(new Error(message));
|
|
54
|
+
reject(new Error(message));
|
|
55
|
+
}, timeoutMs);
|
|
56
|
+
}),
|
|
57
|
+
]);
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
if (timer)
|
|
61
|
+
clearTimeout(timer);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function writeTo(stream, data) {
|
|
65
|
+
await new Promise((resolve, reject) => {
|
|
66
|
+
let settled = false;
|
|
67
|
+
const finish = (err) => {
|
|
68
|
+
if (settled)
|
|
69
|
+
return;
|
|
70
|
+
settled = true;
|
|
71
|
+
stream.off("error", onError);
|
|
72
|
+
if (err?.code === "EPIPE" ||
|
|
73
|
+
err?.message?.toUpperCase().includes("EPIPE")) {
|
|
74
|
+
resolve();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (err) {
|
|
78
|
+
reject(err);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
resolve();
|
|
82
|
+
};
|
|
83
|
+
const onError = (err) => finish(err);
|
|
84
|
+
stream.once("error", onError);
|
|
85
|
+
try {
|
|
86
|
+
stream.write(data, (err) => {
|
|
87
|
+
finish(err ?? null);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
finish(err);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
async function flushStdStreams() {
|
|
96
|
+
await Promise.all([writeTo(process.stdout, ""), writeTo(process.stderr, "")]);
|
|
97
|
+
}
|
|
98
|
+
async function exitWith(code, output) {
|
|
99
|
+
if (output?.stdout) {
|
|
100
|
+
await writeTo(process.stdout, output.stdout);
|
|
101
|
+
}
|
|
102
|
+
if (output?.stderr) {
|
|
103
|
+
await writeTo(process.stderr, output.stderr);
|
|
104
|
+
}
|
|
105
|
+
await flushStdStreams();
|
|
106
|
+
process.exit(code);
|
|
107
|
+
}
|
|
108
|
+
export async function main() {
|
|
109
|
+
let args;
|
|
110
|
+
let timeoutMs;
|
|
111
|
+
try {
|
|
112
|
+
const parsed = parseGlobalOptions(process.argv.slice(2));
|
|
113
|
+
args = parsed.args;
|
|
114
|
+
timeoutMs = parsed.timeoutMs;
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
118
|
+
return exitWith(1, { stderr: `${JSON.stringify({ error: message })}\n` });
|
|
119
|
+
}
|
|
120
|
+
if (args.length === 0 || args[0] === "--help" || args[0] === "-h") {
|
|
121
|
+
return exitWith(0, { stdout: `${USAGE}\n` });
|
|
122
|
+
}
|
|
123
|
+
if (args[0] === "--version" || args[0] === "-v") {
|
|
124
|
+
const require = createRequire(import.meta.url);
|
|
125
|
+
const { version } = require("../../package.json");
|
|
126
|
+
return exitWith(0, { stdout: `${version}\n` });
|
|
127
|
+
}
|
|
128
|
+
const noDaemon = hasFlag(args, "--no-daemon");
|
|
129
|
+
const filteredArgs = args.filter((a) => a !== "--no-daemon");
|
|
130
|
+
if (filteredArgs[0] === "daemon") {
|
|
131
|
+
const sub = filteredArgs[1];
|
|
132
|
+
if (sub === "start") {
|
|
133
|
+
try {
|
|
134
|
+
await spawnDaemon(timeoutMs);
|
|
135
|
+
return exitWith(0, {
|
|
136
|
+
stdout: `${JSON.stringify({ daemon: "started" })}\n`,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
141
|
+
return exitWith(1, {
|
|
142
|
+
stderr: `${JSON.stringify({ error: message })}\n`,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (sub === "stop" || sub === "status" || sub === "flush") {
|
|
147
|
+
const result = await tryExistingDaemon(filteredArgs, process.cwd(), undefined, timeoutMs);
|
|
148
|
+
if (result) {
|
|
149
|
+
return exitWith(result.exitCode, {
|
|
150
|
+
stdout: result.stdout,
|
|
151
|
+
stderr: result.stderr,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
if (sub === "status") {
|
|
155
|
+
return exitWith(0, {
|
|
156
|
+
stdout: `${JSON.stringify({ running: false })}\n`,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
return exitWith(1, {
|
|
160
|
+
stdout: `${JSON.stringify({ error: "No daemon running" })}\n`,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
return exitWith(1, {
|
|
164
|
+
stderr: "Usage: hsx daemon start|stop|status|flush\n",
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
if (!noDaemon) {
|
|
168
|
+
let stdin;
|
|
169
|
+
const command = filteredArgs[0];
|
|
170
|
+
const setJsonArg = filteredArgs[3];
|
|
171
|
+
const evalCodeArg = filteredArgs[2];
|
|
172
|
+
const needsStdin = (command === "set" && (!setJsonArg || setJsonArg === "-")) ||
|
|
173
|
+
(command === "eval" && (!evalCodeArg || evalCodeArg === "-"));
|
|
174
|
+
if (needsStdin && !process.stdin.isTTY) {
|
|
175
|
+
const chunks = [];
|
|
176
|
+
for await (const chunk of process.stdin) {
|
|
177
|
+
chunks.push(chunk);
|
|
178
|
+
}
|
|
179
|
+
stdin = Buffer.concat(chunks).toString("utf-8").trim();
|
|
180
|
+
}
|
|
181
|
+
const result = await tryDaemon(filteredArgs, process.cwd(), stdin, timeoutMs);
|
|
182
|
+
if (result) {
|
|
183
|
+
return exitWith(result.exitCode, {
|
|
184
|
+
stdout: result.stdout,
|
|
185
|
+
stderr: result.stderr,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
if (stdin !== undefined) {
|
|
189
|
+
const io = createIoContext(stdin);
|
|
190
|
+
try {
|
|
191
|
+
await runWithTimeout((signal) => Promise.resolve(runWithIo(io, () => dispatch(filteredArgs, { signal }))), timeoutMs);
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
195
|
+
io.stderr += `${JSON.stringify({ error: message })}\n`;
|
|
196
|
+
return exitWith(1, { stdout: io.stdout, stderr: io.stderr });
|
|
197
|
+
}
|
|
198
|
+
return exitWith(0, { stdout: io.stdout, stderr: io.stderr });
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
try {
|
|
202
|
+
await runWithTimeout((signal) => dispatch(filteredArgs, { signal }), timeoutMs);
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
206
|
+
return exitWith(1, { stderr: `${JSON.stringify({ error: message })}\n` });
|
|
207
|
+
}
|
|
208
|
+
return exitWith(0);
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/output.d.ts
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
export interface IoContext {
|
|
2
|
+
stdout: string;
|
|
3
|
+
stderr: string;
|
|
4
|
+
stdin: string | null;
|
|
5
|
+
}
|
|
6
|
+
export declare function runWithIo<T>(io: IoContext, fn: () => T | Promise<T>): T | Promise<T>;
|
|
7
|
+
export declare function createIoContext(stdin?: string): IoContext;
|
|
8
|
+
export declare function writeStdout(data: string): void;
|
|
9
|
+
export declare function writeStderr(data: string): void;
|
|
4
10
|
export declare function ok(data: unknown): void;
|
|
5
11
|
export declare function fail(message: string): never;
|
|
6
|
-
/**
|
|
7
|
-
* Read input from last positional arg or stdin.
|
|
8
|
-
*/
|
|
9
12
|
export declare function readInput(argValue: string | undefined): Promise<string>;
|
|
10
13
|
//# sourceMappingURL=output.d.ts.map
|
package/dist/cli/output.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAID,wBAAgB,SAAS,CAAC,CAAC,EACzB,EAAE,EAAE,SAAS,EACb,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACvB,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEhB;AAED,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAEzD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAO9C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAO9C;AAED,wBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAEtC;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAE3C;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB7E"}
|
package/dist/cli/output.js
CHANGED
|
@@ -1,20 +1,48 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
const ioStore = new AsyncLocalStorage();
|
|
3
|
+
export function runWithIo(io, fn) {
|
|
4
|
+
return ioStore.run(io, fn);
|
|
5
|
+
}
|
|
6
|
+
export function createIoContext(stdin) {
|
|
7
|
+
return { stdout: "", stderr: "", stdin: stdin ?? null };
|
|
8
|
+
}
|
|
9
|
+
export function writeStdout(data) {
|
|
10
|
+
const io = ioStore.getStore();
|
|
11
|
+
if (io) {
|
|
12
|
+
io.stdout += data;
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
process.stdout.write(data);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function writeStderr(data) {
|
|
19
|
+
const io = ioStore.getStore();
|
|
20
|
+
if (io) {
|
|
21
|
+
io.stderr += data;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
process.stderr.write(data);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
4
27
|
export function ok(data) {
|
|
5
|
-
|
|
28
|
+
writeStdout(`${JSON.stringify(data)}\n`);
|
|
6
29
|
}
|
|
7
30
|
export function fail(message) {
|
|
8
31
|
throw new Error(message);
|
|
9
32
|
}
|
|
10
|
-
/**
|
|
11
|
-
* Read input from last positional arg or stdin.
|
|
12
|
-
*/
|
|
13
33
|
export async function readInput(argValue) {
|
|
14
34
|
if (argValue && argValue !== "-") {
|
|
15
35
|
return argValue;
|
|
16
36
|
}
|
|
17
|
-
|
|
37
|
+
const io = ioStore.getStore();
|
|
38
|
+
if (io?.stdin != null) {
|
|
39
|
+
const text = io.stdin;
|
|
40
|
+
io.stdin = null;
|
|
41
|
+
if (!text) {
|
|
42
|
+
fail("No input provided. Pass as argument or pipe via stdin.");
|
|
43
|
+
}
|
|
44
|
+
return text;
|
|
45
|
+
}
|
|
18
46
|
const chunks = [];
|
|
19
47
|
for await (const chunk of process.stdin) {
|
|
20
48
|
chunks.push(chunk);
|
package/dist/cli/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAQrD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAa,CAAC;AAEnD,MAAM,UAAU,SAAS,CACvB,EAAa,EACb,EAAwB;IAExB,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC9B,IAAI,EAAE,EAAE,CAAC;QACP,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC9B,IAAI,EAAE,EAAE,CAAC;QACP,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,EAAE,CAAC,IAAa;IAC9B,WAAW,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAA4B;IAC1D,IAAI,QAAQ,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC9B,IAAI,EAAE,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC;QACtB,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,CAAC,wDAAwD,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/cli/styles.d.ts
CHANGED
|
@@ -1,27 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* SpreadJS-style cell style serialization and application for CLI I/O.
|
|
3
3
|
*/
|
|
4
|
+
import type { Spread } from "@mescius/spread-sheets";
|
|
4
5
|
import type { GCNamespace, SpreadStyle, SpreadWorksheet } from "../types.js";
|
|
5
|
-
export interface
|
|
6
|
-
fontWeight?: "normal" | "bold";
|
|
7
|
-
fontStyle?: "normal" | "italic";
|
|
8
|
-
fontSize?: number;
|
|
9
|
-
fontFamily?: string;
|
|
10
|
-
fontColor?: string;
|
|
11
|
-
backgroundColor?: string;
|
|
12
|
-
horizontalAlignment?: "left" | "center" | "right";
|
|
13
|
-
numberFormat?: string;
|
|
14
|
-
}
|
|
15
|
-
export interface SerializedStyle {
|
|
6
|
+
export interface FontStyleObject {
|
|
16
7
|
bold?: boolean;
|
|
17
8
|
italic?: boolean;
|
|
18
|
-
|
|
9
|
+
underline?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface CellStyle {
|
|
12
|
+
fontStyle?: FontStyleObject;
|
|
13
|
+
fontSize?: string;
|
|
19
14
|
fontFamily?: string;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
hAlign?:
|
|
23
|
-
|
|
15
|
+
foreColor?: string;
|
|
16
|
+
backColor?: string;
|
|
17
|
+
hAlign?: Spread.Sheets.HorizontalAlign;
|
|
18
|
+
formatter?: string;
|
|
24
19
|
}
|
|
25
|
-
export declare function serializeStyle(style: SpreadStyle):
|
|
26
|
-
export declare function applyStyles(sheet: SpreadWorksheet, row: number, col: number, styles:
|
|
20
|
+
export declare function serializeStyle(style: SpreadStyle): CellStyle | null;
|
|
21
|
+
export declare function applyStyles(sheet: SpreadWorksheet, row: number, col: number, styles: CellStyle, GC: GCNamespace): void;
|
|
27
22
|
//# sourceMappingURL=styles.d.ts.map
|
package/dist/cli/styles.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/cli/styles.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/cli/styles.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7E,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8CD,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAoDnE;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,SAAS,EACjB,EAAE,EAAE,WAAW,GACd,IAAI,CAoDN"}
|