@osdlc/command-seam 0.0.0-stage → 0.0.1-stage

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 (54) hide show
  1. package/CHANGELOG.md +328 -0
  2. package/CONTRIBUTING.md +58 -0
  3. package/LICENSE +21 -0
  4. package/README.md +741 -2
  5. package/SECURITY.md +23 -0
  6. package/async.ts +466 -0
  7. package/defaults.ts +83 -0
  8. package/dist/async.d.ts +146 -0
  9. package/dist/async.d.ts.map +1 -0
  10. package/dist/async.js +368 -0
  11. package/dist/defaults.d.ts +52 -0
  12. package/dist/defaults.d.ts.map +1 -0
  13. package/dist/defaults.js +51 -0
  14. package/dist/groups.d.ts +155 -0
  15. package/dist/groups.d.ts.map +1 -0
  16. package/dist/groups.js +331 -0
  17. package/dist/index.d.ts +30 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +29 -0
  20. package/dist/process.d.ts +146 -0
  21. package/dist/process.d.ts.map +1 -0
  22. package/dist/process.js +175 -0
  23. package/dist/process.test.d.ts +1 -0
  24. package/dist/process.test.d.ts.map +1 -0
  25. package/dist/process.test.js +1 -0
  26. package/dist/quote.d.ts +18 -0
  27. package/dist/quote.d.ts.map +1 -0
  28. package/dist/quote.js +28 -0
  29. package/dist/result.d.ts +211 -0
  30. package/dist/result.d.ts.map +1 -0
  31. package/dist/result.js +219 -0
  32. package/dist/shell.d.ts +84 -0
  33. package/dist/shell.d.ts.map +1 -0
  34. package/dist/shell.js +83 -0
  35. package/dist/stream.d.ts +90 -0
  36. package/dist/stream.d.ts.map +1 -0
  37. package/dist/stream.js +73 -0
  38. package/dist/sync.d.ts +311 -0
  39. package/dist/sync.d.ts.map +1 -0
  40. package/dist/sync.js +406 -0
  41. package/dist/testing.d.ts +158 -0
  42. package/dist/testing.d.ts.map +1 -0
  43. package/dist/testing.js +173 -0
  44. package/groups.ts +360 -0
  45. package/index.ts +98 -0
  46. package/package.json +94 -3
  47. package/process.ts +270 -0
  48. package/quote.ts +31 -0
  49. package/result.ts +403 -0
  50. package/shell.ts +131 -0
  51. package/smoke.mjs +61 -0
  52. package/stream.ts +134 -0
  53. package/sync.ts +604 -0
  54. package/testing.ts +263 -0
package/dist/sync.d.ts ADDED
@@ -0,0 +1,311 @@
1
+ /**
2
+ * The synchronous capture runner: the {@link CommandRunner} interface and its
3
+ * `spawnSync`-backed default, {@link spawnRunner}. Code that runs commands
4
+ * takes a `CommandRunner`; tests pass a fake. Live output and long-lived
5
+ * processes have their own runners (`stream.ts`, `process.ts`).
6
+ *
7
+ * Two ways to call it, like zod's `safeParse` and `parse`:
8
+ * - `runner.run(...)` never throws for a failed command; the caller reads
9
+ * `exitCode`.
10
+ * - `runChecked(runner, ...)` throws {@link CommandFailed} on a non-zero
11
+ * exit, for callers whose only sensible response to failure is to stop.
12
+ */
13
+ /** Result of running an external command through a `CommandRunner`. */
14
+ export interface CommandResult {
15
+ /** The child's exit code, or `1` when it never reported one (see `neverExited`). */
16
+ exitCode: number;
17
+ /** Everything the child wrote to stdout, decoded as UTF-8. */
18
+ stdout: string;
19
+ /**
20
+ * Everything the child wrote to stderr, decoded as UTF-8. Only the child's
21
+ * output: the runner's own message, such as a failed spawn or a timeout, is
22
+ * in `error`. `failureText` reads both.
23
+ */
24
+ stderr: string;
25
+ /**
26
+ * `true` when the child never reported an exit status: the spawn failed, a
27
+ * timeout or an abort killed it, a signal took it down, or the sync runner
28
+ * killed it at the output cap. `exitCode` is
29
+ * then a stand-in `1`, not the command's answer. Absent otherwise.
30
+ *
31
+ * Check this before reading an exit code as an answer. `grep` exits 1 for
32
+ * "no matches" and `git config --get` exits 1 for an unset key; without
33
+ * this check, a binary missing from `PATH` reads as a confident "no".
34
+ * `reason` says which of those causes it was.
35
+ */
36
+ neverExited?: boolean | undefined;
37
+ /**
38
+ * Why the child never reported an exit status. Set whenever `neverExited`
39
+ * is, absent otherwise. See {@link NeverExitedReason}.
40
+ */
41
+ reason?: NeverExitedReason | undefined;
42
+ /**
43
+ * The signal that ended the child, when the runner knows it: always for
44
+ * `reason: 'signal'`, and for a sync `'timeout'` or `'output'` (`SIGKILL`).
45
+ * The async runner settles a timeout or abort before the child is gone, so
46
+ * it leaves this unset there.
47
+ */
48
+ signal?: NodeJS.Signals | undefined;
49
+ /**
50
+ * The runner's own message, when it has one: a failed spawn, a timeout, an
51
+ * abort, an `onSpawn` that threw, a refused `processGroup` run, the output
52
+ * cap, or a failed write to the child's stdin. It is never copied into
53
+ * `stderr`. Absent otherwise.
54
+ *
55
+ * It can also be set when the child did exit: a failed stdin write (Bun's
56
+ * `spawnSync` does not report one), or, under Bun, a child that exits right
57
+ * at the output cap. `exitCode` is then the child's own and `reason` is
58
+ * absent.
59
+ */
60
+ error?: string | undefined;
61
+ }
62
+ /**
63
+ * Why a child never reported an exit status (`neverExited: true`):
64
+ *
65
+ * - `spawn`: it never started: a missing binary, no permission, a bad `cwd`.
66
+ * Retrying will not help.
67
+ * - `timeout`: `timeoutMs` ran out and the runner killed it.
68
+ * - `abort`: the caller stopped it: an `AbortSignal` (async runner), an
69
+ * `onSpawn` that threw, or `kill()` on a managed process. Or a
70
+ * `processGroup` run was refused because signal forwarding is stopping the
71
+ * host; it never started, and `error` carries the refusal message.
72
+ * - `signal`: a signal from elsewhere ended it.
73
+ * - `output`: the sync runner killed it for passing its 256 MB output cap
74
+ * (`spawnSync`'s `ENOBUFS`). The same run will fail the same way. The async
75
+ * runner has no cap, and the `bun test` capture path writes to files, so
76
+ * neither reports this.
77
+ */
78
+ export type NeverExitedReason = 'spawn' | 'timeout' | 'abort' | 'signal' | 'output';
79
+ /** Per-call options for a {@link CommandRunner}. */
80
+ export interface CommandRunOptions {
81
+ /** Working directory for the child. Required: the runner has no default. */
82
+ cwd: string;
83
+ /**
84
+ * Kill the child with `SIGKILL` after this many milliseconds. The result
85
+ * then has a non-zero `exitCode`, `neverExited: true` and
86
+ * `reason: 'timeout'`.
87
+ *
88
+ * The same rule on every runner: `undefined` and `Infinity` mean no cap,
89
+ * and a fraction rounds up (`1.2` is `2`). A value above 2^31 - 1 (about
90
+ * 24.8 days), the largest timer delay, is clamped to it. `0`, a negative
91
+ * value and `NaN` are a caller error: `RangeError`, thrown by the sync
92
+ * runners and rejected by the async ones. A value that is not a number is
93
+ * a `TypeError`, the same way.
94
+ *
95
+ * The sync runners (`spawnRunner`, `runShell`, `shellRunner`) and
96
+ * `streamRunner` kill the direct child only. Processes it started keep
97
+ * running. Only the async runners (`spawnRunnerAsync`, `runShellAsync`,
98
+ * `shellRunnerAsync`) can kill the whole process group, with
99
+ * `processGroup`.
100
+ */
101
+ timeoutMs?: number | undefined;
102
+ /** Text written to the child's stdin. Stdin is closed after it, or at once when omitted. */
103
+ input?: string | undefined;
104
+ /**
105
+ * Variables merged over the parent's environment. An `undefined` value
106
+ * removes that variable from the child's environment.
107
+ */
108
+ env?: EnvOverrides | undefined;
109
+ }
110
+ /** Env vars to set on a child, merged over the parent's; an `undefined` value unsets that var. */
111
+ export type EnvOverrides = Record<string, string | undefined>;
112
+ /**
113
+ * Runs one external binary (`git`, `gh`, …) and captures its output. Code that
114
+ * shells out takes one of these; tests pass a fake.
115
+ *
116
+ * @example
117
+ * ```ts
118
+ * const fake: CommandRunner = {
119
+ * run: (argv) => ({ exitCode: 0, stdout: `ran ${argv.join(' ')}`, stderr: '' }),
120
+ * }
121
+ * ```
122
+ */
123
+ export interface CommandRunner {
124
+ /**
125
+ * Run the binary with `argv` (the arguments, without the binary name) and
126
+ * wait for it to exit. Never throws for a failed command: a non-zero exit,
127
+ * a missing binary or a timeout all come back as a {@link CommandResult}.
128
+ * Programmer errors throw: an invalid `timeoutMs` (see its doc) or a NUL
129
+ * byte in argv or env.
130
+ */
131
+ run(argv: string[], opts: CommandRunOptions): CommandResult;
132
+ }
133
+ /**
134
+ * `{ env }`: `process.env` merged with `opts.env`, minus any key whose
135
+ * override is `undefined`. Always an explicit object built from the current
136
+ * `process.env` at call time — never `undefined`, never an omitted key, and
137
+ * never `process.env` handed through verbatim either.
138
+ *
139
+ * Node's `child_process.spawnSync` inherits live `process.env` whether
140
+ * `env` is omitted, `undefined`, or `process.env` itself. Bun's does not:
141
+ * all three instead take a snapshot — of exactly when is unclear, but
142
+ * empirically it misses anything set on `process.env` after the process
143
+ * started, even as the very first spawn — so a test that points an env var
144
+ * at a fresh temp dir right before spawning would silently see the real,
145
+ * unwritten default instead. Only spreading `process.env`'s current
146
+ * key/values into a brand-new plain object at the call site sidesteps
147
+ * whatever Bun is snapshotting.
148
+ */
149
+ export declare function mergedEnv(opts: Pick<CommandRunOptions, 'env'>): {
150
+ env: NodeJS.ProcessEnv;
151
+ };
152
+ /**
153
+ * `timeoutMs` as every runner applies it: `undefined` for no cap, else a whole
154
+ * number of milliseconds, at most {@link MAX_TIMER_MS}. See
155
+ * {@link CommandRunOptions.timeoutMs}.
156
+ *
157
+ * @throws `TypeError` for a value that is not a number.
158
+ * @throws `RangeError` for `0`, a negative value or `NaN`.
159
+ */
160
+ export declare function normalizeTimeout(timeoutMs: number | undefined): number | undefined;
161
+ /**
162
+ * A delay option as a timer takes it: `undefined` for `Infinity`, else a whole
163
+ * number of milliseconds, at most {@link MAX_TIMER_MS}. `min` says whether `0`
164
+ * is allowed. `name` is the option's name, for the error message.
165
+ *
166
+ * @throws `TypeError` for a value that is not a number.
167
+ * @throws `RangeError` for a value below `min`, or `NaN`.
168
+ */
169
+ export declare function timerMs(name: string, ms: number, min: 'positive' | 'zero'): number | undefined;
170
+ /**
171
+ * A spawn error message when `cwd` is missing or not a directory, else
172
+ * `undefined`. Checked before spawning: a spawn reports a missing `cwd` as
173
+ * `spawn <binary> ENOENT`, which reads as a missing binary, and Node's async
174
+ * `spawn` throws for a `cwd` that is a file.
175
+ *
176
+ * @param spawnName - The message prefix: `spawn` or `spawnSync`, then the binary.
177
+ * @throws `TypeError` for a NUL byte in `binary`, `argv` or `opts.env`, as the
178
+ * spawn would, so a bad `cwd` does not hide it.
179
+ */
180
+ export declare function cwdError(spawnName: string, binary: string, argv: readonly string[], opts: {
181
+ cwd: string;
182
+ env?: EnvOverrides | undefined;
183
+ }): string | undefined;
184
+ /** The stand-in result for a child that never started. */
185
+ export declare function spawnFailure(message: string): CommandResult;
186
+ /**
187
+ * How a `spawnSync` that reported no exit status ended. Shared by the sync
188
+ * capture and streaming runners.
189
+ */
190
+ export declare function syncStop(proc: {
191
+ error?: Error | undefined;
192
+ signal: NodeJS.Signals | null;
193
+ }): {
194
+ reason: Exclude<NeverExitedReason, 'abort'>;
195
+ signal?: NodeJS.Signals;
196
+ };
197
+ /**
198
+ * Thrown by {@link runChecked} and `runCheckedAsync` on a non-zero exit.
199
+ * Carries the argv and the full {@link CommandResult}, so a caller can report
200
+ * the output without running the command again.
201
+ *
202
+ * `message` is `command failed (exit N): <argv>`, with argv quoted by
203
+ * `shellJoin`, followed on a new line by the trimmed stderr, or the trimmed
204
+ * `error` when stderr is empty. Nothing follows when both are empty. The argv
205
+ * appears in full, so error logs and reports carry it: pass secrets through
206
+ * `env` or `input`, not argv. Use `detail` to show a person
207
+ * why it failed.
208
+ */
209
+ export declare class CommandFailed extends Error {
210
+ /** The arguments the command ran with, without the binary name. */
211
+ readonly argv: string[];
212
+ /** The full result of the failed run. */
213
+ readonly result: CommandResult;
214
+ /**
215
+ * The failure text to show a human: both streams, trimmed, newline-joined,
216
+ * empty ones dropped, with the runner's `error` standing in for an empty
217
+ * stderr. Empty when there is no text at all. The same as
218
+ * `failureText(e.result, { both: true })`.
219
+ *
220
+ * `message` interpolates stderr only, and several commands write the
221
+ * sentence that explains the failure to stdout instead — a rejecting git
222
+ * hook, `git commit` on a clean tree, `git apply --check`. Read this rather
223
+ * than picking a stream at the call site.
224
+ *
225
+ * Both are joined rather than one preferred, because a rejecting hook is
226
+ * the case where both carry a distinct half: git's own "commit failed" on
227
+ * stderr, the hook's reason on stdout. Preferring either drops the half
228
+ * the reader needs.
229
+ */
230
+ get detail(): string;
231
+ /**
232
+ * @param argv - The arguments the command ran with.
233
+ * @param result - The result of the failed run.
234
+ */
235
+ constructor(argv: string[], result: CommandResult);
236
+ }
237
+ /**
238
+ * Run a command and throw if it fails. Use it where the only sensible
239
+ * response to failure is to stop, instead of writing
240
+ * `if (r.exitCode !== 0) throw` after each `run`.
241
+ *
242
+ * Takes any runner whose `run` returns a {@link CommandResult}, with that
243
+ * runner's own options: a `withDefaults` runner needs only the options it
244
+ * did not bind.
245
+ *
246
+ * @param runner - Runs the command; pass a fake in tests.
247
+ * @param argv - Arguments, without the binary name.
248
+ * @param opts - Per-call options, as `runner.run` takes them.
249
+ * @returns The result, when `exitCode` is 0.
250
+ * @throws {@link CommandFailed} when `exitCode` is not 0, including a missing
251
+ * binary or a timeout.
252
+ *
253
+ * @example
254
+ * ```ts
255
+ * const git = spawnRunner('git')
256
+ * const head = runChecked(git, ['rev-parse', 'HEAD'], { cwd: '.' }).stdout.trim()
257
+ * ```
258
+ */
259
+ export declare function runChecked(runner: CommandRunner, argv: string[], opts: CommandRunOptions): CommandResult;
260
+ export declare function runChecked<P extends unknown[]>(runner: {
261
+ run(argv: string[], ...opts: P): CommandResult;
262
+ }, argv: string[], ...opts: NoInfer<P>): CommandResult;
263
+ /**
264
+ * Run `fn`; if it throws {@link CommandFailed}, throw `mapper(e)` instead.
265
+ * Any other error propagates untouched, as does `fn`'s return value. Replaces
266
+ * `catch (e) { if (e instanceof CommandFailed) throw new X(...); throw e }`.
267
+ *
268
+ * `mapper` may have side effects (print the output, say) before returning the
269
+ * error to throw. Async version: `mapFailedAsync`.
270
+ *
271
+ * @param fn - The code to run, usually a `runChecked` call.
272
+ * @param mapper - Turns the failure into the error to throw.
273
+ * @returns What `fn` returns.
274
+ * @throws The error `mapper` returns, when `fn` throws `CommandFailed`.
275
+ */
276
+ export declare function mapFailed<T>(fn: () => T, mapper: (failed: CommandFailed) => Error): T;
277
+ /**
278
+ * Run `fn`; if it throws {@link CommandFailed}, return `onFailed(e)` instead.
279
+ * Any other error propagates untouched. Async version: `catchFailedAsync`.
280
+ *
281
+ * @param fn - The code to run, usually a `runChecked` call.
282
+ * @param onFailed - Turns the failure into a value.
283
+ * @returns What `fn` returns, or what `onFailed` returns.
284
+ */
285
+ export declare function catchFailed<T, R>(fn: () => T, onFailed: (failed: CommandFailed) => R): T | R;
286
+ /**
287
+ * The injected runner when there is one, else `spawnRunner(binary)`.
288
+ *
289
+ * @param binary - The binary for the default runner.
290
+ * @param injected - A runner to use instead, such as a test fake.
291
+ */
292
+ export declare function resolveRunner(binary: string, injected?: CommandRunner | undefined): CommandRunner;
293
+ /**
294
+ * The default {@link CommandRunner}: runs `binary` with `spawnSync`, so each
295
+ * call blocks until the child exits. On timeout the child gets `SIGKILL`.
296
+ * Captured output is capped at 256 MB per stream. Under `bun test` (the Bun
297
+ * runtime with `NODE_ENV=test`) it captures through `/bin/sh` and temp files
298
+ * instead of pipes (see `runViaChildRedirect`).
299
+ *
300
+ * @param binary - A name looked up on `PATH`, or a path.
301
+ * @returns A runner for that binary.
302
+ *
303
+ * @example
304
+ * ```ts
305
+ * const git = spawnRunner('git')
306
+ * const r = git.run(['status', '--porcelain'], { cwd: '.', timeoutMs: 10_000 })
307
+ * if (r.exitCode === 0) console.log(r.stdout)
308
+ * ```
309
+ */
310
+ export declare function spawnRunner(binary: string): CommandRunner;
311
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../sync.ts"],"names":[],"mappings":"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"}