spliterator 6.1.0 → 6.2.0

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 (183) hide show
  1. package/README.md +18 -0
  2. package/out/index.d.ts +26 -25
  3. package/out/index.d.ts.map +1 -1
  4. package/out/index.js +26 -25
  5. package/out/index.js.map +1 -1
  6. package/out/lib/AsyncSpliterator.d.ts.map +1 -1
  7. package/out/lib/AsyncSpliterator.js +28 -0
  8. package/out/lib/AsyncSpliterator.js.map +1 -1
  9. package/out/lib/CharacterSequence.d.ts +16 -1
  10. package/out/lib/CharacterSequence.d.ts.map +1 -1
  11. package/out/lib/CharacterSequence.js +37 -0
  12. package/out/lib/CharacterSequence.js.map +1 -1
  13. package/out/lib/core/AsyncSpliterator.d.ts +227 -0
  14. package/out/lib/core/AsyncSpliterator.d.ts.map +1 -0
  15. package/out/lib/core/AsyncSpliterator.js +510 -0
  16. package/out/lib/core/AsyncSpliterator.js.map +1 -0
  17. package/out/lib/core/BufferController.d.ts +77 -0
  18. package/out/lib/core/BufferController.d.ts.map +1 -0
  19. package/out/lib/core/BufferController.js +118 -0
  20. package/out/lib/core/BufferController.js.map +1 -0
  21. package/out/lib/core/CharacterSequence.d.ts +72 -0
  22. package/out/lib/core/CharacterSequence.d.ts.map +1 -0
  23. package/out/lib/core/CharacterSequence.js +347 -0
  24. package/out/lib/core/CharacterSequence.js.map +1 -0
  25. package/out/lib/core/CompositeDataView.d.ts +111 -0
  26. package/out/lib/core/CompositeDataView.d.ts.map +1 -0
  27. package/out/lib/core/CompositeDataView.js +241 -0
  28. package/out/lib/core/CompositeDataView.js.map +1 -0
  29. package/out/lib/core/IndexQueue.d.ts +48 -0
  30. package/out/lib/core/IndexQueue.d.ts.map +1 -0
  31. package/out/lib/core/IndexQueue.js +111 -0
  32. package/out/lib/core/IndexQueue.js.map +1 -0
  33. package/out/lib/core/SlidingWindow.d.ts +47 -0
  34. package/out/lib/core/SlidingWindow.d.ts.map +1 -0
  35. package/out/lib/core/SlidingWindow.js +63 -0
  36. package/out/lib/core/SlidingWindow.js.map +1 -0
  37. package/out/lib/core/Spliterator.d.ts +96 -0
  38. package/out/lib/core/Spliterator.d.ts.map +1 -0
  39. package/out/lib/core/Spliterator.js +330 -0
  40. package/out/lib/core/Spliterator.js.map +1 -0
  41. package/out/lib/core/wasm_base64.d.ts +19 -0
  42. package/out/lib/core/wasm_base64.d.ts.map +1 -0
  43. package/out/lib/core/wasm_base64.js +19 -0
  44. package/out/lib/core/wasm_base64.js.map +1 -0
  45. package/out/lib/core/wasm_module.d.ts +57 -0
  46. package/out/lib/core/wasm_module.d.ts.map +1 -0
  47. package/out/lib/core/wasm_module.js +34 -0
  48. package/out/lib/core/wasm_module.js.map +1 -0
  49. package/out/lib/formats/CSVSpliterator.d.ts +131 -0
  50. package/out/lib/formats/CSVSpliterator.d.ts.map +1 -0
  51. package/out/lib/formats/CSVSpliterator.js +172 -0
  52. package/out/lib/formats/CSVSpliterator.js.map +1 -0
  53. package/out/lib/formats/JSONSpliterator.d.ts +44 -0
  54. package/out/lib/formats/JSONSpliterator.d.ts.map +1 -0
  55. package/out/lib/formats/JSONSpliterator.js +77 -0
  56. package/out/lib/formats/JSONSpliterator.js.map +1 -0
  57. package/out/lib/formats/PSVSpliterator.d.ts +21 -0
  58. package/out/lib/formats/PSVSpliterator.d.ts.map +1 -0
  59. package/out/lib/formats/PSVSpliterator.js +22 -0
  60. package/out/lib/formats/PSVSpliterator.js.map +1 -0
  61. package/out/lib/formats/TSVSpliterator.d.ts +21 -0
  62. package/out/lib/formats/TSVSpliterator.d.ts.map +1 -0
  63. package/out/lib/formats/TSVSpliterator.js +22 -0
  64. package/out/lib/formats/TSVSpliterator.js.map +1 -0
  65. package/out/lib/formats/TextSpliterator.d.ts +53 -0
  66. package/out/lib/formats/TextSpliterator.d.ts.map +1 -0
  67. package/out/lib/formats/TextSpliterator.js +67 -0
  68. package/out/lib/formats/TextSpliterator.js.map +1 -0
  69. package/out/lib/formats/XLSXSpliterator.d.ts +143 -0
  70. package/out/lib/formats/XLSXSpliterator.d.ts.map +1 -0
  71. package/out/lib/formats/XLSXSpliterator.js +161 -0
  72. package/out/lib/formats/XLSXSpliterator.js.map +1 -0
  73. package/out/lib/formats/casing.d.ts +27 -0
  74. package/out/lib/formats/casing.d.ts.map +1 -0
  75. package/out/lib/formats/casing.js +68 -0
  76. package/out/lib/formats/casing.js.map +1 -0
  77. package/out/lib/formats/row-emitters.d.ts +35 -0
  78. package/out/lib/formats/row-emitters.d.ts.map +1 -0
  79. package/out/lib/formats/row-emitters.js +50 -0
  80. package/out/lib/formats/row-emitters.js.map +1 -0
  81. package/out/lib/internal/shared.d.ts +155 -0
  82. package/out/lib/internal/shared.d.ts.map +1 -0
  83. package/out/lib/internal/shared.js +41 -0
  84. package/out/lib/internal/shared.js.map +1 -0
  85. package/out/lib/internal/utils.d.ts +37 -0
  86. package/out/lib/internal/utils.d.ts.map +1 -0
  87. package/out/lib/internal/utils.js +39 -0
  88. package/out/lib/internal/utils.js.map +1 -0
  89. package/out/lib/io/adaptive-source.d.ts +39 -0
  90. package/out/lib/io/adaptive-source.d.ts.map +1 -0
  91. package/out/lib/io/adaptive-source.js +95 -0
  92. package/out/lib/io/adaptive-source.js.map +1 -0
  93. package/out/lib/io/writer.d.ts +45 -0
  94. package/out/lib/io/writer.d.ts.map +1 -0
  95. package/out/lib/io/writer.js +57 -0
  96. package/out/lib/io/writer.js.map +1 -0
  97. package/out/lib/iterators/AsyncSequence.d.ts +180 -0
  98. package/out/lib/iterators/AsyncSequence.d.ts.map +1 -0
  99. package/out/lib/iterators/AsyncSequence.js +432 -0
  100. package/out/lib/iterators/AsyncSequence.js.map +1 -0
  101. package/out/lib/iterators/chunks.d.ts +20 -0
  102. package/out/lib/iterators/chunks.d.ts.map +1 -0
  103. package/out/lib/iterators/chunks.js +36 -0
  104. package/out/lib/iterators/chunks.js.map +1 -0
  105. package/out/lib/iterators/pivot.d.ts +30 -0
  106. package/out/lib/iterators/pivot.d.ts.map +1 -0
  107. package/out/lib/iterators/pivot.js +47 -0
  108. package/out/lib/iterators/pivot.js.map +1 -0
  109. package/out/lib/iterators/zip.d.ts +33 -0
  110. package/out/lib/iterators/zip.d.ts.map +1 -0
  111. package/out/lib/iterators/zip.js +59 -0
  112. package/out/lib/iterators/zip.js.map +1 -0
  113. package/out/lib/parallel/merge-async-iterators.d.ts +12 -0
  114. package/out/lib/parallel/merge-async-iterators.d.ts.map +1 -0
  115. package/out/lib/parallel/merge-async-iterators.js +39 -0
  116. package/out/lib/parallel/merge-async-iterators.js.map +1 -0
  117. package/out/lib/parallel/parallel-map-runtime.d.ts +22 -0
  118. package/out/lib/parallel/parallel-map-runtime.d.ts.map +1 -0
  119. package/out/lib/parallel/parallel-map-runtime.js +60 -0
  120. package/out/lib/parallel/parallel-map-runtime.js.map +1 -0
  121. package/out/lib/parallel/parallel-map-worker-entry.d.ts +11 -0
  122. package/out/lib/parallel/parallel-map-worker-entry.d.ts.map +1 -0
  123. package/out/lib/parallel/parallel-map-worker-entry.js +41 -0
  124. package/out/lib/parallel/parallel-map-worker-entry.js.map +1 -0
  125. package/out/lib/parallel/parallel-map-workers.d.ts +57 -0
  126. package/out/lib/parallel/parallel-map-workers.d.ts.map +1 -0
  127. package/out/lib/parallel/parallel-map-workers.js +82 -0
  128. package/out/lib/parallel/parallel-map-workers.js.map +1 -0
  129. package/out/lib/parallel/parallel-map.d.ts +28 -0
  130. package/out/lib/parallel/parallel-map.d.ts.map +1 -0
  131. package/out/lib/parallel/parallel-map.js +30 -0
  132. package/out/lib/parallel/parallel-map.js.map +1 -0
  133. package/out/lib/parallel/segment-runtime.d.ts +27 -0
  134. package/out/lib/parallel/segment-runtime.d.ts.map +1 -0
  135. package/out/lib/parallel/segment-runtime.js +41 -0
  136. package/out/lib/parallel/segment-runtime.js.map +1 -0
  137. package/out/lib/parallel/segment-worker-entry.d.ts +10 -0
  138. package/out/lib/parallel/segment-worker-entry.d.ts.map +1 -0
  139. package/out/lib/parallel/segment-worker-entry.js +59 -0
  140. package/out/lib/parallel/segment-worker-entry.js.map +1 -0
  141. package/out/lib/parallel/segment-workers.d.ts +56 -0
  142. package/out/lib/parallel/segment-workers.d.ts.map +1 -0
  143. package/out/lib/parallel/segment-workers.js +110 -0
  144. package/out/lib/parallel/segment-workers.js.map +1 -0
  145. package/out/lib/parallel/segments.d.ts +31 -0
  146. package/out/lib/parallel/segments.d.ts.map +1 -0
  147. package/out/lib/parallel/segments.js +52 -0
  148. package/out/lib/parallel/segments.js.map +1 -0
  149. package/out/lib/wasm_base64.d.ts +4 -1
  150. package/out/lib/wasm_base64.d.ts.map +1 -1
  151. package/out/lib/wasm_base64.js +4 -1
  152. package/out/lib/wasm_base64.js.map +1 -1
  153. package/out/lib/wasm_module.d.ts +15 -0
  154. package/out/lib/wasm_module.d.ts.map +1 -1
  155. package/out/lib/wasm_module.js +2 -1
  156. package/out/lib/wasm_module.js.map +1 -1
  157. package/out/node/cli/commands/csv.d.ts +113 -0
  158. package/out/node/cli/commands/csv.d.ts.map +1 -1
  159. package/out/node/cli/commands/csv.js +34 -36
  160. package/out/node/cli/commands/csv.js.map +1 -1
  161. package/out/node/cli/commands/iterate.d.ts +92 -0
  162. package/out/node/cli/commands/iterate.d.ts.map +1 -1
  163. package/out/node/cli/commands/iterate.js +26 -28
  164. package/out/node/cli/commands/iterate.js.map +1 -1
  165. package/out/node/cli/commands/parallel.d.ts +102 -0
  166. package/out/node/cli/commands/parallel.d.ts.map +1 -0
  167. package/out/node/cli/commands/parallel.js +426 -0
  168. package/out/node/cli/commands/parallel.js.map +1 -0
  169. package/out/node/cli/index.js +5 -0
  170. package/out/node/cli/index.js.map +1 -1
  171. package/out/node/cli/spec.d.ts +51 -0
  172. package/out/node/cli/spec.d.ts.map +1 -0
  173. package/out/node/cli/spec.js +78 -0
  174. package/out/node/cli/spec.js.map +1 -0
  175. package/out/node/cli/utils.d.ts +36 -18
  176. package/out/node/cli/utils.d.ts.map +1 -1
  177. package/out/node/cli/utils.js +48 -39
  178. package/out/node/cli/utils.js.map +1 -1
  179. package/out/node/fs/index.d.ts +1 -1
  180. package/out/node/fs/index.d.ts.map +1 -1
  181. package/out/node/fs/index.js +1 -1
  182. package/out/node/fs/index.js.map +1 -1
  183. package/package.json +6 -6
@@ -0,0 +1,426 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license MIT
4
+ * @author Teffen Ellis, et al.
5
+ * @file Run commands concurrently over delimited records or record-aligned blocks.
6
+ */
7
+ import { spawn } from "node:child_process";
8
+ import { createReadStream as createNodeReadStream, createWriteStream } from "node:fs";
9
+ import { mkdtemp, rm } from "node:fs/promises";
10
+ import { availableParallelism, tmpdir } from "node:os";
11
+ import { join } from "node:path";
12
+ import { pipeline } from "node:stream/promises";
13
+ import { CharacterSequence, Spliterator } from "spliterator";
14
+ import { createReadStream } from "spliterator/node/fs";
15
+ import { parseCommand, renderCommandHelp } from "../spec.js";
16
+ import { usageError } from "../utils.js";
17
+ const haltModes = ["never", "soon", "now"];
18
+ export const spec = {
19
+ name: "parallel",
20
+ usage: "parallel [options] -- <command> [arguments...]",
21
+ description: "Run a command concurrently over delimited input. Record mode substitutes {} in arguments, or appends the record when {} is absent. Pipe mode sends record-aligned blocks to each command's standard input.",
22
+ options: {
23
+ jobs: {
24
+ type: "number",
25
+ short: "j",
26
+ hint: "count",
27
+ default: availableParallelism(),
28
+ description: "Maximum concurrent jobs.",
29
+ validate: (value) => Number.isInteger(value) && value >= 1,
30
+ validationMessage: "Option --jobs must be a positive integer.",
31
+ },
32
+ split: {
33
+ type: "string",
34
+ short: "s",
35
+ hint: "delimiter",
36
+ default: "\n",
37
+ description: "Delimiter to split records on.",
38
+ },
39
+ null: { type: "boolean", short: "0", default: false, description: "Use NUL-delimited input." },
40
+ pipe: { type: "boolean", default: false, description: "Send record-aligned blocks to child stdin." },
41
+ block: { type: "string", hint: "size", default: "1MiB", description: "Target pipe block size." },
42
+ "keep-order": { type: "boolean", short: "k", default: false, description: "Emit output in input order." },
43
+ group: { type: "boolean", default: true, description: "Keep each job's output together." },
44
+ "line-buffer": {
45
+ type: "boolean",
46
+ default: false,
47
+ description: "Emit complete lines without mixing partial lines.",
48
+ },
49
+ halt: { type: "string", hint: "mode", choices: haltModes, default: "never", description: "Failure policy." },
50
+ tag: { type: "boolean", default: false, description: "Prefix output lines with the input sequence number." },
51
+ "dry-run": { type: "boolean", default: false, description: "Print commands without executing them." },
52
+ source: { type: "string", short: "i", hint: "path", description: "Read input from a file instead of stdin." },
53
+ "skip-empty": { type: "boolean", short: "e", description: "Skip empty records (the record-mode default)." },
54
+ "reader-high-water-mark": {
55
+ type: "number",
56
+ short: "w",
57
+ hint: "bytes",
58
+ default: 64 * 1024,
59
+ description: "Input stream buffer size.",
60
+ validate: (value) => Number.isInteger(value) && value >= 1,
61
+ validationMessage: "Option --reader-high-water-mark must be a positive integer.",
62
+ },
63
+ },
64
+ };
65
+ export const help = renderCommandHelp(spec);
66
+ function parseByteSize(input) {
67
+ const match = /^(\d+(?:\.\d+)?)\s*(B|K|KB|KIB|M|MB|MIB|G|GB|GIB)?$/i.exec(input);
68
+ if (!match) {
69
+ usageError(`Option --block expects a byte size, received "${input}".`);
70
+ }
71
+ const value = Number(match[1]);
72
+ const unit = match[2]?.toUpperCase() ?? "B";
73
+ const multiplier = unit === "K" || unit === "KB" || unit === "KIB"
74
+ ? 1024
75
+ : unit === "M" || unit === "MB" || unit === "MIB"
76
+ ? 1024 ** 2
77
+ : unit === "G" || unit === "GB" || unit === "GIB"
78
+ ? 1024 ** 3
79
+ : 1;
80
+ const bytes = Math.floor(value * multiplier);
81
+ if (!Number.isSafeInteger(bytes) || bytes < 1) {
82
+ usageError(`Option --block must be at least one byte.`);
83
+ }
84
+ return bytes;
85
+ }
86
+ function shellQuote(value) {
87
+ if (/^[\w@%+=:,./-]+$/.test(value))
88
+ return value;
89
+ return `'${value.replaceAll("'", `'\\''`)}'`;
90
+ }
91
+ async function writeOutput(stream, chunk) {
92
+ if (stream.write(chunk))
93
+ return;
94
+ await new Promise((resolve, reject) => {
95
+ const cleanup = () => {
96
+ stream.off("drain", onDrain);
97
+ stream.off("error", onError);
98
+ };
99
+ const onDrain = () => {
100
+ cleanup();
101
+ resolve();
102
+ };
103
+ const onError = (error) => {
104
+ cleanup();
105
+ reject(error);
106
+ };
107
+ stream.once("drain", onDrain);
108
+ stream.once("error", onError);
109
+ });
110
+ }
111
+ function taggedChunk(index, chunk) {
112
+ const prefix = Buffer.from(`${index}\t`);
113
+ const output = Buffer.allocUnsafe(prefix.length + chunk.length);
114
+ output.set(prefix);
115
+ output.set(chunk, prefix.length);
116
+ return output;
117
+ }
118
+ async function pumpLines(stream, destination, index, tag) {
119
+ let pending = new Uint8Array();
120
+ for await (const input of stream) {
121
+ const chunk = Buffer.isBuffer(input) ? input : Buffer.from(input);
122
+ const bytes = pending.length ? Buffer.concat([pending, chunk]) : chunk;
123
+ let start = 0;
124
+ for (let cursor = bytes.indexOf(10); cursor !== -1; cursor = bytes.indexOf(10, start)) {
125
+ const line = bytes.subarray(start, cursor + 1);
126
+ await writeOutput(destination, tag ? taggedChunk(index, line) : line);
127
+ start = cursor + 1;
128
+ }
129
+ pending = start < bytes.length ? bytes.subarray(start) : new Uint8Array();
130
+ }
131
+ if (pending.length) {
132
+ await writeOutput(destination, tag ? taggedChunk(index, pending) : pending);
133
+ }
134
+ }
135
+ async function pumpRaw(stream, destination) {
136
+ for await (const chunk of stream) {
137
+ await writeOutput(destination, chunk);
138
+ }
139
+ }
140
+ async function publishFile(path, destination, index, tag) {
141
+ await (tag
142
+ ? pumpLines(createNodeReadStream(path), destination, index, true)
143
+ : pumpRaw(createNodeReadStream(path), destination));
144
+ }
145
+ async function waitForChild(child) {
146
+ return new Promise((resolve, reject) => {
147
+ child.once("error", reject);
148
+ child.once("close", (code, signal) => resolve({ code, signal }));
149
+ });
150
+ }
151
+ async function writeChildInput(child, input) {
152
+ await new Promise((resolve, reject) => {
153
+ const cleanup = () => child.stdin.off("error", onError);
154
+ const onError = (error) => {
155
+ cleanup();
156
+ reject(error);
157
+ };
158
+ const end = () => {
159
+ child.stdin.end(() => {
160
+ cleanup();
161
+ resolve();
162
+ });
163
+ };
164
+ child.stdin.once("error", onError);
165
+ if (!input?.length || child.stdin.write(input)) {
166
+ end();
167
+ }
168
+ else {
169
+ child.stdin.once("drain", end);
170
+ }
171
+ });
172
+ }
173
+ async function captureToFile(stream, path) {
174
+ await pipeline(stream, createWriteStream(path));
175
+ }
176
+ async function* recordJobs(source, command, commandArgs, delimiter, skipEmpty, readerHighWaterMark) {
177
+ const input = await createReadStream(source, readerHighWaterMark);
178
+ const records = Spliterator.from(input, { delimiter, skipEmpty });
179
+ const decoder = new TextDecoder();
180
+ let index = 1;
181
+ for await (const recordBytes of records) {
182
+ const record = decoder.decode(recordBytes);
183
+ if (record.includes("\0"))
184
+ throw new TypeError("A command-line argument cannot contain a NUL byte.");
185
+ const hasPlaceholder = commandArgs.some((argument) => argument.includes("{}"));
186
+ const args = hasPlaceholder
187
+ ? commandArgs.map((argument) => argument.replaceAll("{}", record))
188
+ : [...commandArgs, record];
189
+ yield { index: index++, command, args };
190
+ }
191
+ }
192
+ async function* pipeJobs(source, command, commandArgs, delimiter, skipEmpty, blockSize, readerHighWaterMark) {
193
+ const input = await createReadStream(source, readerHighWaterMark);
194
+ if (!skipEmpty) {
195
+ let buffer = new Uint8Array(Math.max(blockSize + readerHighWaterMark, 1024));
196
+ let bytesWritten = 0;
197
+ let index = 1;
198
+ const encoder = new TextEncoder();
199
+ for await (const chunkValue of input) {
200
+ const chunk = typeof chunkValue === "string" ? encoder.encode(chunkValue) : chunkValue;
201
+ const required = bytesWritten + chunk.length;
202
+ if (required > buffer.length) {
203
+ const grown = new Uint8Array(Math.max(required, buffer.length * 2));
204
+ grown.set(buffer.subarray(0, bytesWritten));
205
+ buffer = grown;
206
+ }
207
+ buffer.set(chunk, bytesWritten);
208
+ bytesWritten = required;
209
+ while (bytesWritten >= blockSize) {
210
+ // Include a delimiter that starts just before the target but ends at/after it.
211
+ const searchStart = Math.max(0, blockSize - delimiter.length);
212
+ const delimiterOffset = delimiter.search(buffer, searchStart, bytesWritten);
213
+ if (delimiterOffset === -1)
214
+ break;
215
+ const blockEnd = delimiterOffset + delimiter.length;
216
+ const stdin = buffer.slice(0, blockEnd);
217
+ const remaining = bytesWritten - blockEnd;
218
+ buffer.copyWithin(0, blockEnd, bytesWritten);
219
+ bytesWritten = remaining;
220
+ yield { index: index++, command, args: [...commandArgs], stdin };
221
+ }
222
+ }
223
+ if (bytesWritten) {
224
+ yield { index, command, args: [...commandArgs], stdin: buffer.slice(0, bytesWritten) };
225
+ }
226
+ return;
227
+ }
228
+ const records = Spliterator.from(input, { delimiter, skipEmpty });
229
+ let chunks = [];
230
+ let byteLength = 0;
231
+ let index = 1;
232
+ let pendingRecord;
233
+ const flush = () => {
234
+ if (!chunks.length)
235
+ return;
236
+ const stdin = new Uint8Array(byteLength);
237
+ let offset = 0;
238
+ for (const chunk of chunks) {
239
+ stdin.set(chunk, offset);
240
+ offset += chunk.length;
241
+ }
242
+ chunks = [];
243
+ byteLength = 0;
244
+ return { index: index++, command, args: [...commandArgs], stdin };
245
+ };
246
+ for await (const recordView of records) {
247
+ const currentRecord = recordView.slice();
248
+ if (!pendingRecord) {
249
+ pendingRecord = currentRecord;
250
+ continue;
251
+ }
252
+ const record = new Uint8Array(pendingRecord.length + delimiter.length);
253
+ record.set(pendingRecord);
254
+ record.set(delimiter, pendingRecord.length);
255
+ if (byteLength && byteLength + record.length > blockSize) {
256
+ yield flush();
257
+ }
258
+ chunks.push(record);
259
+ byteLength += record.length;
260
+ pendingRecord = currentRecord;
261
+ }
262
+ if (pendingRecord?.length) {
263
+ if (byteLength && byteLength + pendingRecord.length > blockSize) {
264
+ yield flush();
265
+ }
266
+ chunks.push(pendingRecord);
267
+ byteLength += pendingRecord.length;
268
+ }
269
+ const finalJob = flush();
270
+ if (finalJob) {
271
+ yield finalJob;
272
+ }
273
+ }
274
+ async function runScheduler(jobs, options) {
275
+ const temporaryDirectory = (options.group && !options.lineBuffer) || options.keepOrder
276
+ ? await mkdtemp(join(tmpdir(), "spliterator-"))
277
+ : undefined;
278
+ const active = new Set();
279
+ const children = new Set();
280
+ const ordered = new Map();
281
+ let nextOutput = 1;
282
+ let publishQueue = Promise.resolve();
283
+ let failed = false;
284
+ let stopping = false;
285
+ const publish = async (result) => {
286
+ if (result.stdoutPath) {
287
+ await publishFile(result.stdoutPath, process.stdout, result.job.index, options.tag);
288
+ }
289
+ if (result.stderrPath) {
290
+ await publishFile(result.stderrPath, process.stderr, result.job.index, options.tag);
291
+ }
292
+ };
293
+ const accept = (result) => {
294
+ if (!options.keepOrder) {
295
+ publishQueue = publishQueue.then(() => publish(result));
296
+ return;
297
+ }
298
+ ordered.set(result.job.index, result);
299
+ publishQueue = publishQueue.then(async () => {
300
+ while (ordered.has(nextOutput)) {
301
+ const ready = ordered.get(nextOutput);
302
+ ordered.delete(nextOutput++);
303
+ await publish(ready);
304
+ }
305
+ return undefined;
306
+ });
307
+ };
308
+ const stopChildren = (signal) => {
309
+ for (const child of children) {
310
+ child.kill(signal);
311
+ }
312
+ };
313
+ const onSignal = (signal) => {
314
+ stopping = true;
315
+ failed = true;
316
+ stopChildren(signal);
317
+ };
318
+ const onSigint = () => onSignal("SIGINT");
319
+ const onSigterm = () => onSignal("SIGTERM");
320
+ process.once("SIGINT", onSigint);
321
+ process.once("SIGTERM", onSigterm);
322
+ const launch = async (job) => {
323
+ if (options.dryRun) {
324
+ await writeOutput(process.stdout, `${[job.command, ...job.args].map(shellQuote).join(" ")}\n`);
325
+ return;
326
+ }
327
+ const child = spawn(job.command, job.args, { stdio: ["pipe", "pipe", "pipe"] });
328
+ children.add(child);
329
+ const stdoutPath = temporaryDirectory ? join(temporaryDirectory, `${job.index}.stdout`) : undefined;
330
+ const stderrPath = temporaryDirectory ? join(temporaryDirectory, `${job.index}.stderr`) : undefined;
331
+ const outputTasks = stdoutPath
332
+ ? [captureToFile(child.stdout, stdoutPath), captureToFile(child.stderr, stderrPath)]
333
+ : options.lineBuffer || options.tag
334
+ ? [
335
+ pumpLines(child.stdout, process.stdout, job.index, options.tag),
336
+ pumpLines(child.stderr, process.stderr, job.index, options.tag),
337
+ ]
338
+ : [pumpRaw(child.stdout, process.stdout), pumpRaw(child.stderr, process.stderr)];
339
+ try {
340
+ const [{ code, signal }] = await Promise.all([
341
+ waitForChild(child),
342
+ writeChildInput(child, job.stdin),
343
+ ...outputTasks,
344
+ ]);
345
+ const result = { job, code, signal, stdoutPath, stderrPath };
346
+ if (code !== 0 || signal) {
347
+ failed = true;
348
+ if (options.halt !== "never") {
349
+ stopping = true;
350
+ }
351
+ if (options.halt === "now") {
352
+ stopChildren("SIGTERM");
353
+ }
354
+ }
355
+ if (stdoutPath) {
356
+ accept(result);
357
+ }
358
+ }
359
+ catch (error) {
360
+ failed = true;
361
+ stopping = options.halt !== "never";
362
+ await writeOutput(process.stderr, `spliterator: job ${job.index} failed: ${String(error)}\n`);
363
+ if (options.halt === "now") {
364
+ stopChildren("SIGTERM");
365
+ }
366
+ }
367
+ finally {
368
+ children.delete(child);
369
+ }
370
+ };
371
+ try {
372
+ for await (const job of jobs) {
373
+ if (stopping)
374
+ break;
375
+ while (active.size >= options.concurrency) {
376
+ await Promise.race(active);
377
+ }
378
+ if (stopping)
379
+ break;
380
+ const task = launch(job).finally(() => active.delete(task));
381
+ active.add(task);
382
+ }
383
+ await Promise.all(active);
384
+ await publishQueue;
385
+ }
386
+ finally {
387
+ process.off("SIGINT", onSigint);
388
+ process.off("SIGTERM", onSigterm);
389
+ if (temporaryDirectory) {
390
+ await rm(temporaryDirectory, { recursive: true, force: true });
391
+ }
392
+ }
393
+ return failed ? 1 : 0;
394
+ }
395
+ export async function run(args) {
396
+ const separator = args.indexOf("--");
397
+ const { values, positionals: commandArgs } = parseCommand(spec, args);
398
+ if (values.help) {
399
+ console.log(help);
400
+ return;
401
+ }
402
+ if (separator === -1 || !commandArgs.length) {
403
+ usageError("Missing command after `--`.");
404
+ }
405
+ const concurrency = values.jobs;
406
+ const delimiter = new CharacterSequence(values.null ? 0 : values.split);
407
+ const [command, ...childArgs] = commandArgs;
408
+ const skipEmpty = values["skip-empty"] ?? !values.pipe;
409
+ const readerHighWaterMark = values["reader-high-water-mark"];
410
+ const jobs = values.pipe
411
+ ? pipeJobs(values.source, command, childArgs, delimiter, Boolean(skipEmpty), parseByteSize(values.block), readerHighWaterMark)
412
+ : recordJobs(values.source, command, childArgs, delimiter, Boolean(skipEmpty), readerHighWaterMark);
413
+ const exitCode = await runScheduler(jobs, {
414
+ concurrency,
415
+ group: Boolean(values.group),
416
+ keepOrder: Boolean(values["keep-order"]),
417
+ lineBuffer: Boolean(values["line-buffer"]),
418
+ halt: values.halt,
419
+ tag: Boolean(values.tag),
420
+ dryRun: Boolean(values["dry-run"]),
421
+ });
422
+ if (exitCode) {
423
+ process.exitCode = exitCode;
424
+ }
425
+ }
426
+ //# sourceMappingURL=parallel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel.js","sourceRoot":"","sources":["../../../../node/cli/commands/parallel.ts"],"names":[],"mappings":"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"}
@@ -8,12 +8,14 @@
8
8
  import { createRequire } from "node:module";
9
9
  import * as csv from "./commands/csv.js";
10
10
  import * as iterate from "./commands/iterate.js";
11
+ import * as parallel from "./commands/parallel.js";
11
12
  import { usageError } from "./utils.js";
12
13
  const rootHelp = [
13
14
  iterate.help,
14
15
  "",
15
16
  "Commands:",
16
17
  " csv Split a CSV file into JSONL format.",
18
+ " parallel Run commands concurrently over delimited input.",
17
19
  "",
18
20
  "Sister Software, AGPL-3.0",
19
21
  "https://sister.software",
@@ -25,6 +27,9 @@ try {
25
27
  case "csv":
26
28
  await csv.run(rest);
27
29
  break;
30
+ case "parallel":
31
+ await parallel.run(rest);
32
+ break;
28
33
  case "--version":
29
34
  console.log(createRequire(import.meta.url)("../../../package.json").version);
30
35
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../node/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,KAAK,GAAG,MAAM,mBAAmB,CAAA;AACxC,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,QAAQ,GAAG;IAChB,OAAO,CAAC,IAAI;IACZ,EAAE;IACF,WAAW;IACX,qEAAqE;IACrE,EAAE;IACF,2BAA2B;IAC3B,yBAAyB;CACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAClC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;AAE7B,IAAI,CAAC;IACJ,QAAQ,KAAK,EAAE,CAAC;QACf,KAAK,KAAK;YACT,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACnB,MAAK;QAEN,KAAK,WAAW;YACf,OAAO,CAAC,GAAG,CAAE,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,uBAAuB,CAAyB,CAAC,OAAO,CAAC,CAAA;YACrG,MAAK;QAEN,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACR,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACrB,MAAK;QAEN;YACC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;AACF,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IAChB,8FAA8F;IAC9F,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,CAAE,KAA+B,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1G,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC;IAED,MAAM,KAAK,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../node/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,KAAK,GAAG,MAAM,mBAAmB,CAAA;AACxC,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAA;AAChD,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,QAAQ,GAAG;IAChB,OAAO,CAAC,IAAI;IACZ,EAAE;IACF,WAAW;IACX,qEAAqE;IACrE,iFAAiF;IACjF,EAAE;IACF,2BAA2B;IAC3B,yBAAyB;CACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAClC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;AAE7B,IAAI,CAAC;IACJ,QAAQ,KAAK,EAAE,CAAC;QACf,KAAK,KAAK;YACT,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACnB,MAAK;QAEN,KAAK,UAAU;YACd,MAAM,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACxB,MAAK;QAEN,KAAK,WAAW;YACf,OAAO,CAAC,GAAG,CAAE,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,uBAAuB,CAAyB,CAAC,OAAO,CAAC,CAAA;YACrG,MAAK;QAEN,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACR,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACrB,MAAK;QAEN;YACC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;AACF,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IAChB,8FAA8F;IAC9F,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,CAAE,KAA+B,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1G,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC;IAED,MAAM,KAAK,CAAA;AACZ,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license MIT
4
+ * @author Teffen Ellis, et al.
5
+ * @file Declarative command metadata, parsing, validation, and help rendering.
6
+ */
7
+ type OptionValue = boolean | number | string;
8
+ interface OptionSpecBase {
9
+ description: string;
10
+ short?: string;
11
+ default?: OptionValue;
12
+ hint?: string;
13
+ }
14
+ interface BooleanOptionSpec extends OptionSpecBase {
15
+ type: "boolean";
16
+ default?: boolean;
17
+ }
18
+ interface NumberOptionSpec extends OptionSpecBase {
19
+ type: "number";
20
+ default?: number;
21
+ validate?: (value: number) => boolean;
22
+ validationMessage?: string;
23
+ }
24
+ interface StringOptionSpec extends OptionSpecBase {
25
+ type: "string";
26
+ default?: string;
27
+ choices?: readonly string[];
28
+ validate?: (value: string) => boolean;
29
+ validationMessage?: string;
30
+ }
31
+ export type OptionSpec = BooleanOptionSpec | NumberOptionSpec | StringOptionSpec;
32
+ export interface CommandSpec {
33
+ name: string;
34
+ description: string;
35
+ usage?: string;
36
+ options?: Readonly<Record<string, OptionSpec>>;
37
+ }
38
+ export interface ParsedCommand {
39
+ positionals: string[];
40
+ values: Record<string, OptionValue | undefined>;
41
+ }
42
+ /**
43
+ * Parse and validate a command from the same metadata used to render its help.
44
+ */
45
+ export declare function parseCommand(spec: CommandSpec, args: readonly string[]): ParsedCommand;
46
+ /**
47
+ * Render command help without loading a UI framework.
48
+ */
49
+ export declare function renderCommandHelp(spec: CommandSpec): string;
50
+ export {};
51
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../../node/cli/spec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,KAAK,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAE5C,UAAU,cAAc;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;CACb;AAED,UAAU,iBAAkB,SAAQ,cAAc;IACjD,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,UAAU,gBAAiB,SAAQ,cAAc;IAChD,IAAI,EAAE,QAAQ,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,UAAU,gBAAiB,SAAQ,cAAc;IAChD,IAAI,EAAE,QAAQ,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,MAAM,UAAU,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,gBAAgB,CAAA;AAEhF,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;CAC9C;AAED,MAAM,WAAW,aAAa;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC,CAAA;CAC/C;AAgBD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,aAAa,CAmCtF;AAaD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAiB3D"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license MIT
4
+ * @author Teffen Ellis, et al.
5
+ * @file Declarative command metadata, parsing, validation, and help rendering.
6
+ */
7
+ import { parseArgs } from "node:util";
8
+ import { usageError } from "./utils.js";
9
+ function parseNumber(name, input, spec) {
10
+ const value = Number(input);
11
+ if (!Number.isFinite(value)) {
12
+ usageError(`Option --${name} expects a finite number, received ${JSON.stringify(input)}.`);
13
+ }
14
+ if (spec.validate && !spec.validate(value)) {
15
+ usageError(spec.validationMessage ?? `Invalid value for --${name}: ${input}.`);
16
+ }
17
+ return value;
18
+ }
19
+ /**
20
+ * Parse and validate a command from the same metadata used to render its help.
21
+ */
22
+ export function parseCommand(spec, args) {
23
+ const definitions = {
24
+ help: { type: "boolean", short: "h", default: false },
25
+ };
26
+ for (const [name, option] of Object.entries(spec.options ?? {})) {
27
+ definitions[name] = {
28
+ type: option.type === "boolean" ? "boolean" : "string",
29
+ ...(option.short ? { short: option.short } : {}),
30
+ ...(option.default !== undefined && option.type !== "number" ? { default: option.default } : {}),
31
+ };
32
+ }
33
+ const parsed = parseArgs({ args, allowNegative: true, allowPositionals: true, options: definitions, strict: true });
34
+ const values = { ...parsed.values };
35
+ for (const [name, option] of Object.entries(spec.options ?? {})) {
36
+ const input = values[name];
37
+ if (option.type === "number") {
38
+ values[name] = input === undefined ? option.default : parseNumber(name, String(input), option);
39
+ }
40
+ else if (option.type === "string" && input !== undefined) {
41
+ const value = String(input);
42
+ if (option.choices && !option.choices.includes(value)) {
43
+ usageError(`Option --${name} expects one of: ${option.choices.join(", ")}.`);
44
+ }
45
+ if (option.validate && !option.validate(value)) {
46
+ usageError(option.validationMessage ?? `Invalid value for --${name}: ${value}.`);
47
+ }
48
+ }
49
+ }
50
+ return { positionals: parsed.positionals, values };
51
+ }
52
+ function optionLabel(name, option) {
53
+ const longName = option.type === "boolean" && option.default === true ? `[no-]${name}` : name;
54
+ const long = `--${longName}${option.type === "boolean" ? "" : ` <${option.hint ?? option.type}>`}`;
55
+ return option.short ? `-${option.short}, ${long}` : long;
56
+ }
57
+ function formatDefault(value) {
58
+ return typeof value === "string" && (!value || /\s/.test(value)) ? JSON.stringify(value) : String(value);
59
+ }
60
+ /**
61
+ * Render command help without loading a UI framework.
62
+ */
63
+ export function renderCommandHelp(spec) {
64
+ const options = [
65
+ { label: "-h, --help", description: "Show command help." },
66
+ ...Object.entries(spec.options ?? {}).map(([name, option]) => ({
67
+ label: optionLabel(name, option),
68
+ description: `${option.description}${option.default === undefined ? "" : ` (default: ${formatDefault(option.default)})`}`,
69
+ })),
70
+ ];
71
+ const labelWidth = Math.min(46, Math.max(...options.map(({ label }) => label.length)) + 4);
72
+ const lines = [`Usage: spliterator ${spec.usage ?? `${spec.name} [options]`}`, "", spec.description, "", "Options:"];
73
+ for (const option of options) {
74
+ lines.push(` ${option.label.padEnd(labelWidth)}${option.description}`);
75
+ }
76
+ return lines.join("\n");
77
+ }
78
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../node/cli/spec.ts"],"names":[],"mappings":"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"}