spliterator 6.0.1 → 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.
- package/README.md +70 -0
- package/out/index.d.ts +26 -23
- package/out/index.d.ts.map +1 -1
- package/out/index.js +26 -23
- package/out/index.js.map +1 -1
- package/out/lib/AsyncSpliterator.d.ts.map +1 -1
- package/out/lib/AsyncSpliterator.js +28 -0
- package/out/lib/AsyncSpliterator.js.map +1 -1
- package/out/lib/CSVSpliterator.d.ts +8 -18
- package/out/lib/CSVSpliterator.d.ts.map +1 -1
- package/out/lib/CSVSpliterator.js +4 -47
- package/out/lib/CSVSpliterator.js.map +1 -1
- package/out/lib/CharacterSequence.d.ts +16 -1
- package/out/lib/CharacterSequence.d.ts.map +1 -1
- package/out/lib/CharacterSequence.js +37 -0
- package/out/lib/CharacterSequence.js.map +1 -1
- package/out/lib/XLSXSpliterator.d.ts +143 -0
- package/out/lib/XLSXSpliterator.d.ts.map +1 -0
- package/out/lib/XLSXSpliterator.js +161 -0
- package/out/lib/XLSXSpliterator.js.map +1 -0
- package/out/lib/core/AsyncSpliterator.d.ts +227 -0
- package/out/lib/core/AsyncSpliterator.d.ts.map +1 -0
- package/out/lib/core/AsyncSpliterator.js +510 -0
- package/out/lib/core/AsyncSpliterator.js.map +1 -0
- package/out/lib/core/BufferController.d.ts +77 -0
- package/out/lib/core/BufferController.d.ts.map +1 -0
- package/out/lib/core/BufferController.js +118 -0
- package/out/lib/core/BufferController.js.map +1 -0
- package/out/lib/core/CharacterSequence.d.ts +72 -0
- package/out/lib/core/CharacterSequence.d.ts.map +1 -0
- package/out/lib/core/CharacterSequence.js +347 -0
- package/out/lib/core/CharacterSequence.js.map +1 -0
- package/out/lib/core/CompositeDataView.d.ts +111 -0
- package/out/lib/core/CompositeDataView.d.ts.map +1 -0
- package/out/lib/core/CompositeDataView.js +241 -0
- package/out/lib/core/CompositeDataView.js.map +1 -0
- package/out/lib/core/IndexQueue.d.ts +48 -0
- package/out/lib/core/IndexQueue.d.ts.map +1 -0
- package/out/lib/core/IndexQueue.js +111 -0
- package/out/lib/core/IndexQueue.js.map +1 -0
- package/out/lib/core/SlidingWindow.d.ts +47 -0
- package/out/lib/core/SlidingWindow.d.ts.map +1 -0
- package/out/lib/core/SlidingWindow.js +63 -0
- package/out/lib/core/SlidingWindow.js.map +1 -0
- package/out/lib/core/Spliterator.d.ts +96 -0
- package/out/lib/core/Spliterator.d.ts.map +1 -0
- package/out/lib/core/Spliterator.js +330 -0
- package/out/lib/core/Spliterator.js.map +1 -0
- package/out/lib/core/wasm_base64.d.ts +19 -0
- package/out/lib/core/wasm_base64.d.ts.map +1 -0
- package/out/lib/core/wasm_base64.js +19 -0
- package/out/lib/core/wasm_base64.js.map +1 -0
- package/out/lib/core/wasm_module.d.ts +57 -0
- package/out/lib/core/wasm_module.d.ts.map +1 -0
- package/out/lib/core/wasm_module.js +34 -0
- package/out/lib/core/wasm_module.js.map +1 -0
- package/out/lib/formats/CSVSpliterator.d.ts +131 -0
- package/out/lib/formats/CSVSpliterator.d.ts.map +1 -0
- package/out/lib/formats/CSVSpliterator.js +172 -0
- package/out/lib/formats/CSVSpliterator.js.map +1 -0
- package/out/lib/formats/JSONSpliterator.d.ts +44 -0
- package/out/lib/formats/JSONSpliterator.d.ts.map +1 -0
- package/out/lib/formats/JSONSpliterator.js +77 -0
- package/out/lib/formats/JSONSpliterator.js.map +1 -0
- package/out/lib/formats/PSVSpliterator.d.ts +21 -0
- package/out/lib/formats/PSVSpliterator.d.ts.map +1 -0
- package/out/lib/formats/PSVSpliterator.js +22 -0
- package/out/lib/formats/PSVSpliterator.js.map +1 -0
- package/out/lib/formats/TSVSpliterator.d.ts +21 -0
- package/out/lib/formats/TSVSpliterator.d.ts.map +1 -0
- package/out/lib/formats/TSVSpliterator.js +22 -0
- package/out/lib/formats/TSVSpliterator.js.map +1 -0
- package/out/lib/formats/TextSpliterator.d.ts +53 -0
- package/out/lib/formats/TextSpliterator.d.ts.map +1 -0
- package/out/lib/formats/TextSpliterator.js +67 -0
- package/out/lib/formats/TextSpliterator.js.map +1 -0
- package/out/lib/formats/XLSXSpliterator.d.ts +143 -0
- package/out/lib/formats/XLSXSpliterator.d.ts.map +1 -0
- package/out/lib/formats/XLSXSpliterator.js +161 -0
- package/out/lib/formats/XLSXSpliterator.js.map +1 -0
- package/out/lib/formats/casing.d.ts +27 -0
- package/out/lib/formats/casing.d.ts.map +1 -0
- package/out/lib/formats/casing.js +68 -0
- package/out/lib/formats/casing.js.map +1 -0
- package/out/lib/formats/row-emitters.d.ts +35 -0
- package/out/lib/formats/row-emitters.d.ts.map +1 -0
- package/out/lib/formats/row-emitters.js +50 -0
- package/out/lib/formats/row-emitters.js.map +1 -0
- package/out/lib/internal/shared.d.ts +155 -0
- package/out/lib/internal/shared.d.ts.map +1 -0
- package/out/lib/internal/shared.js +41 -0
- package/out/lib/internal/shared.js.map +1 -0
- package/out/lib/internal/utils.d.ts +37 -0
- package/out/lib/internal/utils.d.ts.map +1 -0
- package/out/lib/internal/utils.js +39 -0
- package/out/lib/internal/utils.js.map +1 -0
- package/out/lib/io/adaptive-source.d.ts +39 -0
- package/out/lib/io/adaptive-source.d.ts.map +1 -0
- package/out/lib/io/adaptive-source.js +95 -0
- package/out/lib/io/adaptive-source.js.map +1 -0
- package/out/lib/io/writer.d.ts +45 -0
- package/out/lib/io/writer.d.ts.map +1 -0
- package/out/lib/io/writer.js +57 -0
- package/out/lib/io/writer.js.map +1 -0
- package/out/lib/iterators/AsyncSequence.d.ts +180 -0
- package/out/lib/iterators/AsyncSequence.d.ts.map +1 -0
- package/out/lib/iterators/AsyncSequence.js +432 -0
- package/out/lib/iterators/AsyncSequence.js.map +1 -0
- package/out/lib/iterators/chunks.d.ts +20 -0
- package/out/lib/iterators/chunks.d.ts.map +1 -0
- package/out/lib/iterators/chunks.js +36 -0
- package/out/lib/iterators/chunks.js.map +1 -0
- package/out/lib/iterators/pivot.d.ts +30 -0
- package/out/lib/iterators/pivot.d.ts.map +1 -0
- package/out/lib/iterators/pivot.js +47 -0
- package/out/lib/iterators/pivot.js.map +1 -0
- package/out/lib/iterators/zip.d.ts +33 -0
- package/out/lib/iterators/zip.d.ts.map +1 -0
- package/out/lib/iterators/zip.js +59 -0
- package/out/lib/iterators/zip.js.map +1 -0
- package/out/lib/parallel/merge-async-iterators.d.ts +12 -0
- package/out/lib/parallel/merge-async-iterators.d.ts.map +1 -0
- package/out/lib/parallel/merge-async-iterators.js +39 -0
- package/out/lib/parallel/merge-async-iterators.js.map +1 -0
- package/out/lib/parallel/parallel-map-runtime.d.ts +22 -0
- package/out/lib/parallel/parallel-map-runtime.d.ts.map +1 -0
- package/out/lib/parallel/parallel-map-runtime.js +60 -0
- package/out/lib/parallel/parallel-map-runtime.js.map +1 -0
- package/out/lib/parallel/parallel-map-worker-entry.d.ts +11 -0
- package/out/lib/parallel/parallel-map-worker-entry.d.ts.map +1 -0
- package/out/lib/parallel/parallel-map-worker-entry.js +41 -0
- package/out/lib/parallel/parallel-map-worker-entry.js.map +1 -0
- package/out/lib/parallel/parallel-map-workers.d.ts +57 -0
- package/out/lib/parallel/parallel-map-workers.d.ts.map +1 -0
- package/out/lib/parallel/parallel-map-workers.js +82 -0
- package/out/lib/parallel/parallel-map-workers.js.map +1 -0
- package/out/lib/parallel/parallel-map.d.ts +28 -0
- package/out/lib/parallel/parallel-map.d.ts.map +1 -0
- package/out/lib/parallel/parallel-map.js +30 -0
- package/out/lib/parallel/parallel-map.js.map +1 -0
- package/out/lib/parallel/segment-runtime.d.ts +27 -0
- package/out/lib/parallel/segment-runtime.d.ts.map +1 -0
- package/out/lib/parallel/segment-runtime.js +41 -0
- package/out/lib/parallel/segment-runtime.js.map +1 -0
- package/out/lib/parallel/segment-worker-entry.d.ts +10 -0
- package/out/lib/parallel/segment-worker-entry.d.ts.map +1 -0
- package/out/lib/parallel/segment-worker-entry.js +59 -0
- package/out/lib/parallel/segment-worker-entry.js.map +1 -0
- package/out/lib/parallel/segment-workers.d.ts +56 -0
- package/out/lib/parallel/segment-workers.d.ts.map +1 -0
- package/out/lib/parallel/segment-workers.js +110 -0
- package/out/lib/parallel/segment-workers.js.map +1 -0
- package/out/lib/parallel/segments.d.ts +31 -0
- package/out/lib/parallel/segments.d.ts.map +1 -0
- package/out/lib/parallel/segments.js +52 -0
- package/out/lib/parallel/segments.js.map +1 -0
- package/out/lib/row-emitters.d.ts +35 -0
- package/out/lib/row-emitters.d.ts.map +1 -0
- package/out/lib/row-emitters.js +50 -0
- package/out/lib/row-emitters.js.map +1 -0
- package/out/lib/wasm_base64.d.ts +4 -1
- package/out/lib/wasm_base64.d.ts.map +1 -1
- package/out/lib/wasm_base64.js +4 -1
- package/out/lib/wasm_base64.js.map +1 -1
- package/out/lib/wasm_module.d.ts +15 -0
- package/out/lib/wasm_module.d.ts.map +1 -1
- package/out/lib/wasm_module.js +2 -1
- package/out/lib/wasm_module.js.map +1 -1
- package/out/node/cli/commands/csv.d.ts +113 -0
- package/out/node/cli/commands/csv.d.ts.map +1 -1
- package/out/node/cli/commands/csv.js +34 -36
- package/out/node/cli/commands/csv.js.map +1 -1
- package/out/node/cli/commands/iterate.d.ts +92 -0
- package/out/node/cli/commands/iterate.d.ts.map +1 -1
- package/out/node/cli/commands/iterate.js +26 -28
- package/out/node/cli/commands/iterate.js.map +1 -1
- package/out/node/cli/commands/parallel.d.ts +102 -0
- package/out/node/cli/commands/parallel.d.ts.map +1 -0
- package/out/node/cli/commands/parallel.js +426 -0
- package/out/node/cli/commands/parallel.js.map +1 -0
- package/out/node/cli/index.js +5 -0
- package/out/node/cli/index.js.map +1 -1
- package/out/node/cli/spec.d.ts +51 -0
- package/out/node/cli/spec.d.ts.map +1 -0
- package/out/node/cli/spec.js +78 -0
- package/out/node/cli/spec.js.map +1 -0
- package/out/node/cli/utils.d.ts +36 -18
- package/out/node/cli/utils.d.ts.map +1 -1
- package/out/node/cli/utils.js +48 -39
- package/out/node/cli/utils.js.map +1 -1
- package/out/node/fs/index.d.ts +1 -1
- package/out/node/fs/index.d.ts.map +1 -1
- package/out/node/fs/index.js +1 -1
- package/out/node/fs/index.js.map +1 -1
- package/package.json +18 -8
|
@@ -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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"}
|
package/out/node/cli/index.js
CHANGED
|
@@ -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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"}
|