@hewliyang/headless-spreadjs 0.0.3 → 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 +11 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +188 -159
- package/dist/cli/main.js.map +1 -1
- 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/package.json +9 -1
package/README.md
CHANGED
|
@@ -1,103 +1,130 @@
|
|
|
1
1
|
# headless-spreadjs
|
|
2
2
|
|
|
3
|
-
Headless Excel
|
|
3
|
+
Headless Excel engine for Node.js using [SpreadJS](https://developer.mescius.com/spreadjs).
|
|
4
|
+
Runs without a browser or Excel.
|
|
4
5
|
|
|
5
6
|
## Features
|
|
6
7
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
8
|
+
- Read/write `.xlsx` and `.xlsm`
|
|
9
|
+
- High-fidelity formulas, styles, tables, charts, pivots
|
|
10
|
+
- SpreadJS JSON roundtrip (`toJSON` / `fromJSON`)
|
|
11
|
+
- CLI (`hsx`) for quick workbook ops
|
|
10
12
|
|
|
11
|
-
## System
|
|
13
|
+
## System dependencies
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
`canvas` requires Cairo/Pango.
|
|
14
16
|
|
|
15
17
|
```bash
|
|
16
18
|
# macOS
|
|
17
19
|
brew install pkg-config cairo pango libpng jpeg giflib librsvg
|
|
18
20
|
|
|
19
|
-
#
|
|
21
|
+
# Debian/Ubuntu
|
|
20
22
|
sudo apt-get install build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev
|
|
21
23
|
```
|
|
22
24
|
|
|
23
25
|
## Install
|
|
24
26
|
|
|
25
27
|
```bash
|
|
26
|
-
npm install headless-spreadjs
|
|
28
|
+
npm install @hewliyang/headless-spreadjs
|
|
27
29
|
```
|
|
28
30
|
|
|
29
|
-
##
|
|
31
|
+
## SDK quick start
|
|
30
32
|
|
|
31
33
|
```js
|
|
32
|
-
import { init } from "headless-spreadjs";
|
|
34
|
+
import { init } from "@hewliyang/headless-spreadjs";
|
|
33
35
|
|
|
34
|
-
|
|
35
|
-
// If you use this for commercial purposes, please get a license from the madlads!
|
|
36
|
-
const { ExcelFile, GC, dispose } = await init({ licenseKey: "xxx" });
|
|
36
|
+
const { ExcelFile, dispose } = await init({ licenseKey: "xxx" });
|
|
37
37
|
|
|
38
|
-
// Create a workbook from scratch
|
|
39
38
|
const file = new ExcelFile();
|
|
40
39
|
const sheet = file.workbook.getActiveSheet();
|
|
41
40
|
sheet.setValue(0, 0, "Name");
|
|
42
41
|
sheet.setValue(0, 1, "Score");
|
|
43
42
|
sheet.setValue(1, 0, "Alice");
|
|
44
43
|
sheet.setValue(1, 1, 95);
|
|
45
|
-
sheet.setValue(2, 0, "Bob");
|
|
46
|
-
sheet.setValue(2, 1, 87);
|
|
47
|
-
sheet.setValue(3, 0, "Average");
|
|
48
|
-
sheet.setFormula(3, 1, "AVERAGE(B2:B3)");
|
|
49
44
|
await file.save("output.xlsx");
|
|
50
45
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const val = file2.workbook.getActiveSheet().getValue(0, 0);
|
|
54
|
-
console.log(val);
|
|
46
|
+
dispose();
|
|
47
|
+
```
|
|
55
48
|
|
|
56
|
-
|
|
57
|
-
const workbook = file.workbook; // GC.Spread.Sheets.Workbook instance
|
|
49
|
+
## CLI quick start
|
|
58
50
|
|
|
59
|
-
|
|
60
|
-
|
|
51
|
+
```bash
|
|
52
|
+
hsx create scores.xlsx
|
|
53
|
+
hsx set scores.xlsx A1:B3 '[["Name","Score"],["Alice",95],["Bob",87]]'
|
|
54
|
+
hsx get scores.xlsx A1:B3
|
|
55
|
+
hsx csv scores.xlsx A1:B3
|
|
56
|
+
hsx search scores.xlsx "Alice"
|
|
57
|
+
hsx diff before.xlsx after.xlsx
|
|
58
|
+
hsx deps scores.xlsx Sheet1!A1
|
|
61
59
|
```
|
|
62
60
|
|
|
63
|
-
|
|
61
|
+
Run `hsx --help` for all commands.
|
|
62
|
+
|
|
63
|
+
## Daemon (CLI)
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
`hsx` uses a background daemon by default to avoid re-initializing SpreadJS on each command.
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
- Auto-starts on first use
|
|
68
|
+
- Caches open workbooks
|
|
69
|
+
- Auto-exits after 5 minutes idle
|
|
70
|
+
- Falls back to direct mode if daemon is unavailable
|
|
71
|
+
|
|
72
|
+
Useful commands:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
hsx daemon start
|
|
76
|
+
hsx daemon status
|
|
77
|
+
hsx daemon flush
|
|
78
|
+
hsx daemon stop
|
|
79
|
+
hsx --no-daemon get file.xlsx A1
|
|
80
|
+
hsx --timeout 120 eval file.xlsx '/* script */'
|
|
81
|
+
```
|
|
68
82
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
|
83
|
+
Environment variables:
|
|
84
|
+
|
|
85
|
+
| Variable | Default | Purpose |
|
|
86
|
+
| ------------------- | ---------------- | ---------------------------- |
|
|
87
|
+
| `HSX_SOCKET_PATH` | platform default | Custom daemon socket/pipe |
|
|
88
|
+
| `HSX_CACHE_SIZE` | `10` | LRU workbook cache size |
|
|
89
|
+
| `HSX_WRITE_THROUGH` | `0` | Immediate writes when truthy |
|
|
90
|
+
|
|
91
|
+
## SDK API
|
|
92
|
+
|
|
93
|
+
### `init(options?)`
|
|
94
|
+
|
|
95
|
+
Initializes runtime and returns `{ GC, ExcelFile, dispose }`.
|
|
96
|
+
|
|
97
|
+
- `licenseKey?: string` — SpreadJS license key (omit for trial)
|
|
72
98
|
|
|
73
99
|
### `ExcelFile`
|
|
74
100
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
101
|
+
- `new ExcelFile()`
|
|
102
|
+
- `ExcelFile.open(path)`
|
|
103
|
+
- `ExcelFile.openFromBuffer(buf)`
|
|
104
|
+
- `file.save(path)`
|
|
105
|
+
- `file.saveToBuffer()`
|
|
106
|
+
- `file.toJSON()`
|
|
107
|
+
- `file.fromJSON(json)`
|
|
108
|
+
- `file.batch(fn)`
|
|
109
|
+
- `file.workbook` (raw `GC.Spread.Sheets.Workbook`)
|
|
110
|
+
|
|
111
|
+
### `GC`
|
|
112
|
+
|
|
113
|
+
Full SpreadJS namespace (`GC.Spread.Sheets.*`) for advanced APIs (styles, enums, tables, formatting, etc).
|
|
86
114
|
|
|
87
115
|
### `dispose()`
|
|
88
116
|
|
|
89
|
-
|
|
117
|
+
Closes the DOM shim runtime. Call when all workbook work is done.
|
|
90
118
|
|
|
91
|
-
## Concurrency
|
|
119
|
+
## Concurrency notes
|
|
92
120
|
|
|
93
|
-
|
|
121
|
+
A process supports one active `init()`/`dispose()` lifecycle at a time.
|
|
122
|
+
Multiple `ExcelFile` instances are fine within that lifecycle.
|
|
94
123
|
|
|
95
|
-
|
|
124
|
+
For isolation, use child processes (not worker threads).
|
|
96
125
|
|
|
97
126
|
## Docker
|
|
98
127
|
|
|
99
|
-
`headless-spreadjs` will run in an image as simple as follows
|
|
100
|
-
|
|
101
128
|
```dockerfile
|
|
102
129
|
FROM node:20-slim
|
|
103
130
|
RUN apt-get update && apt-get install -y \
|
|
@@ -108,4 +135,5 @@ RUN apt-get update && apt-get install -y \
|
|
|
108
135
|
|
|
109
136
|
## License
|
|
110
137
|
|
|
111
|
-
MIT
|
|
138
|
+
MIT for this package.
|
|
139
|
+
SpreadJS requires a separate commercial license from [MESCIUS](https://developer.mescius.com/spreadjs).
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare class CommandAbortedError extends Error {
|
|
2
|
+
constructor(message?: string);
|
|
3
|
+
}
|
|
4
|
+
export declare function registerSignalTimeout(signal: AbortSignal, timeoutMs: number, message?: string): void;
|
|
5
|
+
export declare function throwIfAborted(signal?: AbortSignal | null): void;
|
|
6
|
+
export declare function isAbortError(err: unknown): boolean;
|
|
7
|
+
//# sourceMappingURL=abort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abort.d.ts","sourceRoot":"","sources":["../../src/cli/abort.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,SAAoB;CAIxC;AAaD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAMN;AAED,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAWhE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAElD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export class CommandAbortedError extends Error {
|
|
2
|
+
constructor(message = "Command aborted") {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = "CommandAbortedError";
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
const signalTimeouts = new WeakMap();
|
|
8
|
+
function reasonToMessage(reason) {
|
|
9
|
+
if (reason instanceof Error)
|
|
10
|
+
return reason.message;
|
|
11
|
+
if (typeof reason === "string" && reason.trim())
|
|
12
|
+
return reason;
|
|
13
|
+
return "Command aborted";
|
|
14
|
+
}
|
|
15
|
+
export function registerSignalTimeout(signal, timeoutMs, message) {
|
|
16
|
+
signalTimeouts.set(signal, {
|
|
17
|
+
deadlineAt: Date.now() + timeoutMs,
|
|
18
|
+
message: message ?? `Command timed out after ${Math.ceil(timeoutMs / 1000)}s`,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export function throwIfAborted(signal) {
|
|
22
|
+
if (!signal)
|
|
23
|
+
return;
|
|
24
|
+
if (signal.aborted) {
|
|
25
|
+
throw new CommandAbortedError(reasonToMessage(signal.reason));
|
|
26
|
+
}
|
|
27
|
+
const timeout = signalTimeouts.get(signal);
|
|
28
|
+
if (timeout && Date.now() >= timeout.deadlineAt) {
|
|
29
|
+
throw new CommandAbortedError(timeout.message);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function isAbortError(err) {
|
|
33
|
+
return err instanceof CommandAbortedError;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=abort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abort.js","sourceRoot":"","sources":["../../src/cli/abort.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAO,GAAG,iBAAiB;QACrC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,cAAc,GAAG,IAAI,OAAO,EAG/B,CAAC;AAEJ,SAAS,eAAe,CAAC,MAAe;IACtC,IAAI,MAAM,YAAY,KAAK;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC;IACnD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAC/D,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAAmB,EACnB,SAAiB,EACjB,OAAgB;IAEhB,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE;QACzB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;QAClC,OAAO,EACL,OAAO,IAAI,2BAA2B,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG;KACvE,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAA2B;IACxD,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,IAAI,mBAAmB,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QAChD,MAAM,IAAI,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,GAAG,YAAY,mBAAmB,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type DaemonCommandResult = {
|
|
2
|
+
stdout: string;
|
|
3
|
+
stderr: string;
|
|
4
|
+
exitCode: number;
|
|
5
|
+
};
|
|
6
|
+
export declare function spawnDaemon(timeoutMs?: number): Promise<void>;
|
|
7
|
+
export declare function tryExistingDaemon(argv: string[], cwd: string, stdin?: string, timeoutMs?: number): Promise<DaemonCommandResult | null>;
|
|
8
|
+
export declare function tryDaemon(argv: string[], cwd: string, stdin?: string, timeoutMs?: number): Promise<DaemonCommandResult | null>;
|
|
9
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cli/client.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAkDF,wBAAsB,WAAW,CAAC,SAAS,SAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC7E;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,SAAoB,GAC5B,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAUrC;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,SAAoB,GAC5B,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAsBrC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { closeSync, openSync } from "node:fs";
|
|
3
|
+
import { connect } from "node:net";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { getLogPath, getSocketPath } from "./daemon.js";
|
|
7
|
+
const CLIENT_TIMEOUT_MS = 30_000;
|
|
8
|
+
const SPAWN_TIMEOUT_MS = 15_000;
|
|
9
|
+
function isDaemonUnavailableError(err) {
|
|
10
|
+
if (!(err instanceof Error))
|
|
11
|
+
return false;
|
|
12
|
+
const code = err.code;
|
|
13
|
+
return code === "ENOENT" || code === "ECONNREFUSED";
|
|
14
|
+
}
|
|
15
|
+
async function sendCommand(socketPath, argv, cwd, stdin, timeoutMs = CLIENT_TIMEOUT_MS) {
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
const socket = connect({ path: socketPath }, () => {
|
|
18
|
+
const request = JSON.stringify({ argv, cwd, stdin, timeoutMs });
|
|
19
|
+
socket.write(`${request}\n`);
|
|
20
|
+
});
|
|
21
|
+
let buffer = "";
|
|
22
|
+
const timeout = setTimeout(() => {
|
|
23
|
+
socket.destroy();
|
|
24
|
+
reject(new Error("Daemon request timed out"));
|
|
25
|
+
}, timeoutMs);
|
|
26
|
+
socket.on("data", (data) => {
|
|
27
|
+
buffer += data.toString();
|
|
28
|
+
const newlineIdx = buffer.indexOf("\n");
|
|
29
|
+
if (newlineIdx !== -1) {
|
|
30
|
+
clearTimeout(timeout);
|
|
31
|
+
const line = buffer.slice(0, newlineIdx);
|
|
32
|
+
socket.end();
|
|
33
|
+
try {
|
|
34
|
+
resolve(JSON.parse(line));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
reject(new Error("Invalid response from daemon"));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
socket.on("error", (err) => {
|
|
42
|
+
clearTimeout(timeout);
|
|
43
|
+
reject(err);
|
|
44
|
+
});
|
|
45
|
+
socket.on("close", () => {
|
|
46
|
+
clearTimeout(timeout);
|
|
47
|
+
if (!buffer.includes("\n")) {
|
|
48
|
+
reject(new Error("Connection closed before response"));
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
export async function spawnDaemon(timeoutMs = SPAWN_TIMEOUT_MS) {
|
|
54
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
55
|
+
const cliDir = dirname(thisFile);
|
|
56
|
+
const daemonEntry = join(cliDir, "daemon-entry.js");
|
|
57
|
+
const logFd = openSync(getLogPath(), "a");
|
|
58
|
+
return new Promise((resolve, reject) => {
|
|
59
|
+
const child = spawn(process.execPath, [daemonEntry], {
|
|
60
|
+
detached: true,
|
|
61
|
+
stdio: ["ignore", "ignore", logFd, "ipc"],
|
|
62
|
+
env: { ...process.env },
|
|
63
|
+
});
|
|
64
|
+
closeSync(logFd);
|
|
65
|
+
const timeout = setTimeout(() => {
|
|
66
|
+
child.kill();
|
|
67
|
+
reject(new Error("Daemon failed to start within timeout"));
|
|
68
|
+
}, timeoutMs);
|
|
69
|
+
child.on("message", (msg) => {
|
|
70
|
+
const m = msg;
|
|
71
|
+
if (m?.ready) {
|
|
72
|
+
clearTimeout(timeout);
|
|
73
|
+
child.disconnect();
|
|
74
|
+
child.unref();
|
|
75
|
+
resolve();
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
child.on("error", (err) => {
|
|
79
|
+
clearTimeout(timeout);
|
|
80
|
+
reject(err);
|
|
81
|
+
});
|
|
82
|
+
child.on("exit", (code) => {
|
|
83
|
+
clearTimeout(timeout);
|
|
84
|
+
reject(new Error(`Daemon exited with code ${code}`));
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
export async function tryExistingDaemon(argv, cwd, stdin, timeoutMs = CLIENT_TIMEOUT_MS) {
|
|
89
|
+
const socketPath = getSocketPath();
|
|
90
|
+
try {
|
|
91
|
+
return await sendCommand(socketPath, argv, cwd, stdin, timeoutMs);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
if (isDaemonUnavailableError(err)) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
throw err;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export async function tryDaemon(argv, cwd, stdin, timeoutMs = CLIENT_TIMEOUT_MS) {
|
|
101
|
+
const existing = await tryExistingDaemon(argv, cwd, stdin, timeoutMs);
|
|
102
|
+
if (existing) {
|
|
103
|
+
return existing;
|
|
104
|
+
}
|
|
105
|
+
const socketPath = getSocketPath();
|
|
106
|
+
try {
|
|
107
|
+
await spawnDaemon(timeoutMs);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
return await sendCommand(socketPath, argv, cwd, stdin, timeoutMs);
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
if (isDaemonUnavailableError(err)) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
throw err;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/cli/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
export declare function clear(filePath: string, ref: string, clearType?: "values" | "styles" | "all"
|
|
1
|
+
export declare function clear(filePath: string, ref: string, clearType?: "values" | "styles" | "all", options?: {
|
|
2
|
+
signal?: AbortSignal | null;
|
|
3
|
+
}): Promise<void>;
|
|
2
4
|
//# sourceMappingURL=clear.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clear.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/clear.ts"],"names":[],"mappings":"AAIA,wBAAsB,KAAK,CACzB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,QAAQ,GAAG,QAAQ,GAAG,KAAgB,
|
|
1
|
+
{"version":3,"file":"clear.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/clear.ts"],"names":[],"mappings":"AAIA,wBAAsB,KAAK,CACzB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,QAAQ,GAAG,QAAQ,GAAG,KAAgB,EACjD,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,GACxC,OAAO,CAAC,IAAI,CAAC,CAiDf"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { parseRef, rangeDimensions } from "../a1.js";
|
|
2
2
|
import { withFile } from "../context.js";
|
|
3
3
|
import { fail, ok } from "../output.js";
|
|
4
|
-
export async function clear(filePath, ref, clearType = "values") {
|
|
4
|
+
export async function clear(filePath, ref, clearType = "values", options) {
|
|
5
5
|
const parsed = parseRef(ref);
|
|
6
|
-
await withFile(filePath, ({ workbook, GC }) => {
|
|
6
|
+
await withFile(filePath, ({ file, workbook, GC }) => {
|
|
7
7
|
const sheet = parsed.sheet
|
|
8
8
|
? workbook.getSheetFromName(parsed.sheet)
|
|
9
9
|
: workbook.getActiveSheet();
|
|
@@ -12,13 +12,15 @@ export async function clear(filePath, ref, clearType = "values") {
|
|
|
12
12
|
}
|
|
13
13
|
const { rows, cols } = rangeDimensions(parsed);
|
|
14
14
|
const range = new GC.Spread.Sheets.Range(parsed.start.row, parsed.start.col, rows, cols);
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
file.batch(() => {
|
|
16
|
+
if (clearType === "values" || clearType === "all") {
|
|
17
|
+
sheet.clear(range.row, range.col, range.rowCount, range.colCount, GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.StorageType.data);
|
|
18
|
+
}
|
|
19
|
+
if (clearType === "styles" || clearType === "all") {
|
|
20
|
+
sheet.clear(range.row, range.col, range.rowCount, range.colCount, GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.StorageType.style);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
21
23
|
ok({ cleared: ref, type: clearType });
|
|
22
|
-
}, { save: true });
|
|
24
|
+
}, { save: true, signal: options?.signal });
|
|
23
25
|
}
|
|
24
26
|
//# sourceMappingURL=clear.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clear.js","sourceRoot":"","sources":["../../../src/cli/commands/clear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,QAAgB,EAChB,GAAW,EACX,YAAyC,QAAQ;
|
|
1
|
+
{"version":3,"file":"clear.js","sourceRoot":"","sources":["../../../src/cli/commands/clear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,QAAgB,EAChB,GAAW,EACX,YAAyC,QAAQ,EACjD,OAAyC;IAEzC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE7B,MAAM,QAAQ,CACZ,QAAQ,EACR,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK;YACxB,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC;YACzC,CAAC,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;QAE9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,oBAAoB,MAAM,CAAC,KAAK,IAAI,UAAU,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CACtC,MAAM,CAAC,KAAK,CAAC,GAAG,EAChB,MAAM,CAAC,KAAK,CAAC,GAAG,EAChB,IAAI,EACJ,IAAI,CACL,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;YACd,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;gBAClD,KAAK,CAAC,KAAK,CACT,KAAK,CAAC,GAAG,EACT,KAAK,CAAC,GAAG,EACT,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,QAAQ,EACd,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EACnC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAClC,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;gBAClD,KAAK,CAAC,KAAK,CACT,KAAK,CAAC,GAAG,EACT,KAAK,CAAC,GAAG,EACT,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,QAAQ,EACd,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EACnC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CACnC,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACxC,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CACxC,CAAC;AACJ,CAAC"}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
export declare function copy(filePath: string, srcRef: string, dstRef: string
|
|
1
|
+
export declare function copy(filePath: string, srcRef: string, dstRef: string, options?: {
|
|
2
|
+
signal?: AbortSignal | null;
|
|
3
|
+
}): Promise<void>;
|
|
2
4
|
//# sourceMappingURL=copy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/copy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/copy.ts"],"names":[],"mappings":"AAKA,wBAAsB,IAAI,CACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,GACxC,OAAO,CAAC,IAAI,CAAC,CAwDf"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { parseRef, rangeDimensions } from "../a1.js";
|
|
2
|
+
import { throwIfAborted } from "../abort.js";
|
|
2
3
|
import { withFile } from "../context.js";
|
|
3
4
|
import { fail, ok } from "../output.js";
|
|
4
|
-
export async function copy(filePath, srcRef, dstRef) {
|
|
5
|
+
export async function copy(filePath, srcRef, dstRef, options) {
|
|
5
6
|
const src = parseRef(srcRef);
|
|
6
7
|
const dst = parseRef(dstRef);
|
|
8
|
+
const signal = options?.signal;
|
|
7
9
|
await withFile(filePath, ({ file, workbook }) => {
|
|
8
10
|
const srcSheet = src.sheet
|
|
9
11
|
? workbook.getSheetFromName(src.sheet)
|
|
@@ -19,6 +21,7 @@ export async function copy(filePath, srcRef, dstRef) {
|
|
|
19
21
|
const { rows: dstRows, cols: dstCols } = rangeDimensions(dst);
|
|
20
22
|
file.batch(() => {
|
|
21
23
|
for (let r = 0; r < dstRows; r++) {
|
|
24
|
+
throwIfAborted(signal);
|
|
22
25
|
for (let c = 0; c < dstCols; c++) {
|
|
23
26
|
const sr = src.start.row + (r % srcRows);
|
|
24
27
|
const sc = src.start.col + (c % srcCols);
|
|
@@ -46,6 +49,6 @@ export async function copy(filePath, srcRef, dstRef) {
|
|
|
46
49
|
destination: dstRef,
|
|
47
50
|
cellsCopied: dstRows * dstCols,
|
|
48
51
|
});
|
|
49
|
-
}, { save: true });
|
|
52
|
+
}, { save: true, signal });
|
|
50
53
|
}
|
|
51
54
|
//# sourceMappingURL=copy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../src/cli/commands/copy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,QAAgB,EAChB,MAAc,EACd,MAAc;
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../src/cli/commands/copy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,GACxC,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { withNewFile } from "../context.js";
|
|
2
2
|
import { ok } from "../output.js";
|
|
3
|
-
export async function create(filePath) {
|
|
4
|
-
await withNewFile(filePath);
|
|
3
|
+
export async function create(filePath, options) {
|
|
4
|
+
await withNewFile(filePath, undefined, { signal: options?.signal });
|
|
5
5
|
ok({ created: filePath });
|
|
6
6
|
}
|
|
7
7
|
//# sourceMappingURL=create.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,MAAM,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,QAAgB,EAChB,OAAyC;IAEzC,MAAM,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IACpE,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
export
|
|
1
|
+
export type CsvMode = "value" | "formula" | "both";
|
|
2
|
+
export declare function csv(filePath: string, ref: string, options?: {
|
|
3
|
+
signal?: AbortSignal | null;
|
|
4
|
+
mode?: CsvMode;
|
|
5
|
+
}): Promise<void>;
|
|
2
6
|
//# sourceMappingURL=csv.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/csv.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/csv.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEnD,wBAAsB,GAAG,CACvB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5D,OAAO,CAAC,IAAI,CAAC,CAkCf"}
|
package/dist/cli/commands/csv.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { parseRef, rangeDimensions } from "../a1.js";
|
|
2
|
+
import { throwIfAborted } from "../abort.js";
|
|
2
3
|
import { withFile } from "../context.js";
|
|
3
|
-
import { fail } from "../output.js";
|
|
4
|
-
export async function csv(filePath, ref) {
|
|
4
|
+
import { fail, writeStdout } from "../output.js";
|
|
5
|
+
export async function csv(filePath, ref, options = {}) {
|
|
5
6
|
const parsed = parseRef(ref);
|
|
7
|
+
const signal = options?.signal;
|
|
8
|
+
const mode = options.mode ?? "value";
|
|
6
9
|
await withFile(filePath, ({ workbook }) => {
|
|
7
10
|
const sheet = parsed.sheet
|
|
8
11
|
? workbook.getSheetFromName(parsed.sheet)
|
|
@@ -13,21 +16,43 @@ export async function csv(filePath, ref) {
|
|
|
13
16
|
const { rows, cols } = rangeDimensions(parsed);
|
|
14
17
|
const lines = [];
|
|
15
18
|
for (let r = 0; r < rows; r++) {
|
|
19
|
+
throwIfAborted(signal);
|
|
16
20
|
const row = [];
|
|
17
21
|
for (let c = 0; c < cols; c++) {
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
row.push(`"${str.replace(/"/g, '""')}"`);
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
row.push(str);
|
|
25
|
-
}
|
|
22
|
+
const rowIndex = parsed.start.row + r;
|
|
23
|
+
const colIndex = parsed.start.col + c;
|
|
24
|
+
row.push(toCsvCell(sheet, rowIndex, colIndex, mode));
|
|
26
25
|
}
|
|
27
26
|
lines.push(row.join(","));
|
|
28
27
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
writeStdout(`${lines.join("\n")}\n`);
|
|
29
|
+
}, { signal });
|
|
30
|
+
}
|
|
31
|
+
function toCsvCell(sheet, row, col, mode) {
|
|
32
|
+
const value = sheet.getValue(row, col);
|
|
33
|
+
const formula = sheet.getFormula(row, col);
|
|
34
|
+
const valueText = value === null || value === undefined ? "" : String(value);
|
|
35
|
+
const formulaText = formula ? `=${formula}` : "";
|
|
36
|
+
let text = "";
|
|
37
|
+
if (mode === "formula") {
|
|
38
|
+
text = formulaText || valueText;
|
|
39
|
+
}
|
|
40
|
+
else if (mode === "both") {
|
|
41
|
+
text = formulaText
|
|
42
|
+
? valueText
|
|
43
|
+
? `${valueText} | ${formulaText}`
|
|
44
|
+
: formulaText
|
|
45
|
+
: valueText;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
text = valueText;
|
|
49
|
+
}
|
|
50
|
+
return escapeCsv(text);
|
|
51
|
+
}
|
|
52
|
+
function escapeCsv(text) {
|
|
53
|
+
if (text.includes(",") || text.includes('"') || text.includes("\n")) {
|
|
54
|
+
return `"${text.replace(/"/g, '""')}"`;
|
|
55
|
+
}
|
|
56
|
+
return text;
|
|
32
57
|
}
|
|
33
58
|
//# sourceMappingURL=csv.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csv.js","sourceRoot":"","sources":["../../../src/cli/commands/csv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"csv.js","sourceRoot":"","sources":["../../../src/cli/commands/csv.ts"],"names":[],"mappings":"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"}
|