@hewliyang/headless-spreadjs 0.0.3 → 0.0.5

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.
Files changed (111) hide show
  1. package/README.md +78 -50
  2. package/dist/cli/abort.d.ts +7 -0
  3. package/dist/cli/abort.d.ts.map +1 -0
  4. package/dist/cli/abort.js +35 -0
  5. package/dist/cli/abort.js.map +1 -0
  6. package/dist/cli/client.d.ts +9 -0
  7. package/dist/cli/client.d.ts.map +1 -0
  8. package/dist/cli/client.js +122 -0
  9. package/dist/cli/client.js.map +1 -0
  10. package/dist/cli/commands/clear.d.ts +3 -1
  11. package/dist/cli/commands/clear.d.ts.map +1 -1
  12. package/dist/cli/commands/clear.js +11 -9
  13. package/dist/cli/commands/clear.js.map +1 -1
  14. package/dist/cli/commands/copy.d.ts +3 -1
  15. package/dist/cli/commands/copy.d.ts.map +1 -1
  16. package/dist/cli/commands/copy.js +5 -2
  17. package/dist/cli/commands/copy.js.map +1 -1
  18. package/dist/cli/commands/create.d.ts +3 -1
  19. package/dist/cli/commands/create.d.ts.map +1 -1
  20. package/dist/cli/commands/create.js +2 -2
  21. package/dist/cli/commands/create.js.map +1 -1
  22. package/dist/cli/commands/csv.d.ts +5 -1
  23. package/dist/cli/commands/csv.d.ts.map +1 -1
  24. package/dist/cli/commands/csv.js +38 -13
  25. package/dist/cli/commands/csv.js.map +1 -1
  26. package/dist/cli/commands/deps.d.ts +11 -0
  27. package/dist/cli/commands/deps.d.ts.map +1 -0
  28. package/dist/cli/commands/deps.js +329 -0
  29. package/dist/cli/commands/deps.js.map +1 -0
  30. package/dist/cli/commands/diff.d.ts +7 -0
  31. package/dist/cli/commands/diff.d.ts.map +1 -0
  32. package/dist/cli/commands/diff.js +235 -0
  33. package/dist/cli/commands/diff.js.map +1 -0
  34. package/dist/cli/commands/eval.d.ts +3 -1
  35. package/dist/cli/commands/eval.d.ts.map +1 -1
  36. package/dist/cli/commands/eval.js +23 -8
  37. package/dist/cli/commands/eval.js.map +1 -1
  38. package/dist/cli/commands/get.d.ts +1 -0
  39. package/dist/cli/commands/get.d.ts.map +1 -1
  40. package/dist/cli/commands/get.js +5 -2
  41. package/dist/cli/commands/get.js.map +1 -1
  42. package/dist/cli/commands/info.d.ts +3 -1
  43. package/dist/cli/commands/info.d.ts.map +1 -1
  44. package/dist/cli/commands/info.js +5 -2
  45. package/dist/cli/commands/info.js.map +1 -1
  46. package/dist/cli/commands/objects.d.ts +3 -1
  47. package/dist/cli/commands/objects.d.ts.map +1 -1
  48. package/dist/cli/commands/objects.js +5 -6
  49. package/dist/cli/commands/objects.js.map +1 -1
  50. package/dist/cli/commands/resize.d.ts +1 -0
  51. package/dist/cli/commands/resize.d.ts.map +1 -1
  52. package/dist/cli/commands/resize.js +67 -29
  53. package/dist/cli/commands/resize.js.map +1 -1
  54. package/dist/cli/commands/rows-cols.d.ts +1 -0
  55. package/dist/cli/commands/rows-cols.d.ts.map +1 -1
  56. package/dist/cli/commands/rows-cols.js +101 -45
  57. package/dist/cli/commands/rows-cols.js.map +1 -1
  58. package/dist/cli/commands/screenshot.d.ts +8 -0
  59. package/dist/cli/commands/screenshot.d.ts.map +1 -0
  60. package/dist/cli/commands/screenshot.js +260 -0
  61. package/dist/cli/commands/screenshot.js.map +1 -0
  62. package/dist/cli/commands/search.d.ts +1 -0
  63. package/dist/cli/commands/search.d.ts.map +1 -1
  64. package/dist/cli/commands/search.js +16 -8
  65. package/dist/cli/commands/search.js.map +1 -1
  66. package/dist/cli/commands/set.d.ts +3 -1
  67. package/dist/cli/commands/set.d.ts.map +1 -1
  68. package/dist/cli/commands/set.js +72 -25
  69. package/dist/cli/commands/set.js.map +1 -1
  70. package/dist/cli/commands/sheet.d.ts +3 -1
  71. package/dist/cli/commands/sheet.d.ts.map +1 -1
  72. package/dist/cli/commands/sheet.js +20 -10
  73. package/dist/cli/commands/sheet.js.map +1 -1
  74. package/dist/cli/context.d.ts +18 -6
  75. package/dist/cli/context.d.ts.map +1 -1
  76. package/dist/cli/context.js +93 -8
  77. package/dist/cli/context.js.map +1 -1
  78. package/dist/cli/daemon-entry.d.ts +3 -0
  79. package/dist/cli/daemon-entry.d.ts.map +1 -0
  80. package/dist/cli/daemon-entry.js +4 -0
  81. package/dist/cli/daemon-entry.js.map +1 -0
  82. package/dist/cli/daemon.d.ts +4 -0
  83. package/dist/cli/daemon.d.ts.map +1 -0
  84. package/dist/cli/daemon.js +330 -0
  85. package/dist/cli/daemon.js.map +1 -0
  86. package/dist/cli/dispatch.d.ts +5 -0
  87. package/dist/cli/dispatch.d.ts.map +1 -0
  88. package/dist/cli/dispatch.js +353 -0
  89. package/dist/cli/dispatch.js.map +1 -0
  90. package/dist/cli/file-cache.d.ts +23 -0
  91. package/dist/cli/file-cache.d.ts.map +1 -0
  92. package/dist/cli/file-cache.js +102 -0
  93. package/dist/cli/file-cache.js.map +1 -0
  94. package/dist/cli/index.js +11 -0
  95. package/dist/cli/index.js.map +1 -1
  96. package/dist/cli/main.d.ts.map +1 -1
  97. package/dist/cli/main.js +188 -159
  98. package/dist/cli/main.js.map +1 -1
  99. package/dist/cli/output.d.ts +9 -6
  100. package/dist/cli/output.d.ts.map +1 -1
  101. package/dist/cli/output.js +36 -8
  102. package/dist/cli/output.js.map +1 -1
  103. package/dist/cli/styles.d.ts +14 -19
  104. package/dist/cli/styles.d.ts.map +1 -1
  105. package/dist/cli/styles.js +65 -39
  106. package/dist/cli/styles.js.map +1 -1
  107. package/dist/excel-file.d.ts +3 -1
  108. package/dist/excel-file.d.ts.map +1 -1
  109. package/dist/excel-file.js +50 -6
  110. package/dist/excel-file.js.map +1 -1
  111. package/package.json +9 -1
package/README.md CHANGED
@@ -1,103 +1,130 @@
1
1
  # headless-spreadjs
2
2
 
3
- Headless Excel workbook engine for Node.js powered by [SpreadJS](https://developer.mescius.com/spreadjs) with DOM shims. No browser, no Excel, any platform including Linux.
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
- - **Full Excel fidelity** — 500+ formula functions, charts, pivot tables, tables, cell styling, merging, number formatting
8
- - **XLSX I/O** read and write `.xlsx, .xlsm` files with full roundtrip support
9
- - **JSON serialization** `toJSON()` / `fromJSON()` preserves everything (formulas, styles, charts, pivots)
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 Dependencies
13
+ ## System dependencies
12
14
 
13
- Cairo/Pango are required by the `canvas` npm package:
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
- # Linux (Debian/Ubuntu)
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
- ## Usage
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
- // Initialize (with optional SpreadJS license key)
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
- // Open an existing workbook
52
- const file2 = await ExcelFile.open("input.xlsx");
53
- const val = file2.workbook.getActiveSheet().getValue(0, 0);
54
- console.log(val);
46
+ dispose();
47
+ ```
55
48
 
56
- // Access raw SpreadJS API
57
- const workbook = file.workbook; // GC.Spread.Sheets.Workbook instance
49
+ ## CLI quick start
58
50
 
59
- // Clean up when done
60
- dispose();
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
- ## API
61
+ Run `hsx --help` for all commands.
62
+
63
+ ## Daemon (CLI)
64
64
 
65
- ### `init(options?): { GC, ExcelFile, dispose }`
65
+ `hsx` uses a background daemon by default to avoid re-initializing SpreadJS on each command.
66
66
 
67
- Initialize the headless runtime. Must be called before creating ExcelFiles.
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
- | Option | Type | Description |
70
- | ------------ | --------- | ------------------------------------------ |
71
- | `licenseKey` | `string?` | SpreadJS license key. Omit for trial mode. |
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
- | Method | Description |
76
- | ----------------------------------- | ---------------------------------------------- |
77
- | `new ExcelFile()` | Create an empty workbook |
78
- | `ExcelFile.open(path)` | Open an xlsx file → `Promise<ExcelFile>` |
79
- | `ExcelFile.openFromBuffer(buf)` | Open xlsx from a Buffer → `Promise<ExcelFile>` |
80
- | `file.save(path)` | Save to xlsx file → `Promise<void>` |
81
- | `file.saveToBuffer()` | Save to Buffer → `Promise<Buffer>` |
82
- | `file.toJSON()` | Serialize to SpreadJS JSON |
83
- | `file.fromJSON(json)` | Load from SpreadJS JSON |
84
- | `file.batch(fn)` | Suspend calc during `fn`, resume after |
85
- | `file.workbook` | Raw `GC.Spread.Sheets.Workbook` instance |
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
- Close the happy-dom window to prevent memory leaks. Call when done with all workbooks.
117
+ Closes the DOM shim runtime. Call when all workbook work is done.
90
118
 
91
- ## Concurrency
119
+ ## Concurrency notes
92
120
 
93
- `headless-spreadjs` installs DOM shims on `globalThis` (e.g. `window`, `document`, `navigator`), so a single Node.js process supports **one `init()` / `dispose()` lifecycle at a time**. You cannot safely run multiple workbook operations concurrently within the same process.
121
+ A process supports one active `init()`/`dispose()` lifecycle at a time.
122
+ Multiple `ExcelFile` instances are fine within that lifecycle.
94
123
 
95
- If you need parallelism, use separate processes (e.g. worker threads or child processes) — each gets its own global scope so the shims don't collide.
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 (this package). SpreadJS requires a separate commercial license from [MESCIUS](https://developer.mescius.com/spreadjs).
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"): Promise<void>;
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,GAChD,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
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
- if (clearType === "values" || clearType === "all") {
16
- sheet.clear(range.row, range.col, range.rowCount, range.colCount, GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.StorageType.data);
17
- }
18
- if (clearType === "styles" || clearType === "all") {
19
- sheet.clear(range.row, range.col, range.rowCount, range.colCount, GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.StorageType.style);
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;IAEjD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE7B,MAAM,QAAQ,CACZ,QAAQ,EACR,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE;QACnB,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,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YAClD,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;QACJ,CAAC;QACD,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YAClD,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;QACJ,CAAC;QAED,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACxC,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;AACJ,CAAC"}
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): Promise<void>;
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":"AAIA,wBAAsB,IAAI,CACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAsDf"}
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":"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"}
1
+ {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../src/cli/commands/copy.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,4 @@
1
- export declare function create(filePath: string): Promise<void>;
1
+ export declare function create(filePath: string, options?: {
2
+ signal?: AbortSignal | null;
3
+ }): Promise<void>;
2
4
  //# sourceMappingURL=create.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5D"}
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,CAAC,QAAgB;IAC3C,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC5B,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC5B,CAAC"}
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 declare function csv(filePath: string, ref: string): Promise<void>;
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":"AAIA,wBAAsB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCtE"}
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"}
@@ -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 value = sheet.getValue(parsed.start.row + r, parsed.start.col + c);
19
- const str = value === null || value === undefined ? "" : String(value);
20
- if (str.includes(",") || str.includes('"') || str.includes("\n")) {
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
- process.stdout.write(`${lines.join("\n")}\n`);
30
- process.exit(0);
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;AAEpC,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,QAAgB,EAAE,GAAW;IACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE7B,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;QACxC,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,GAAa,EAAE,CAAC;QAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAa,EAAE,CAAC;YACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAC1B,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,EACpB,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CACrB,CAAC;gBACF,MAAM,GAAG,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjE,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3C,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../../src/cli/commands/csv.ts"],"names":[],"mappings":"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"}