@michaelrwalker/stagehand 0.6.0 → 0.7.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/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +30 -2
- package/dist/context.js.map +1 -1
- package/dist/errors.d.ts +29 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +43 -0
- package/dist/errors.js.map +1 -1
- package/dist/flags.d.ts +30 -0
- package/dist/flags.d.ts.map +1 -0
- package/dist/flags.js +79 -0
- package/dist/flags.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/script.d.ts +103 -36
- package/dist/script.d.ts.map +1 -1
- package/dist/script.js +58 -7
- package/dist/script.js.map +1 -1
- package/dist/types.d.ts +149 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/prompt.d.ts +6 -0
- package/dist/ui/prompt.d.ts.map +1 -0
- package/dist/ui/prompt.js +346 -0
- package/dist/ui/prompt.js.map +1 -0
- package/dist/ui/renderer.d.ts +12 -0
- package/dist/ui/renderer.d.ts.map +1 -1
- package/dist/ui/renderer.js +30 -0
- package/dist/ui/renderer.js.map +1 -1
- package/package.json +1 -1
package/dist/context.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export interface ContextDeps {
|
|
|
8
8
|
phaseName: string;
|
|
9
9
|
/** Backs `context.cache`; slots declared before the current step. */
|
|
10
10
|
cache: CacheHandle<Record<string, unknown>>;
|
|
11
|
+
/** Backs `context.flags`; parsed once from argv before any phase runs. */
|
|
12
|
+
flags: Record<string, unknown>;
|
|
11
13
|
}
|
|
12
14
|
export declare function createStepContext<In, Ctx>(deps: ContextDeps, input: In, ctx: Ctx, signal: AbortSignal, attempt: number): StepContext<In, Ctx>;
|
|
13
15
|
export declare function createRollbackContext<In, Ctx, Out>(deps: ContextDeps, input: In, ctx: Ctx, output: Out, error: unknown, signal: AbortSignal): RollbackContext<In, Ctx, Out>;
|
package/dist/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAA2B,SAAS,EAAa,MAAM,YAAY,CAAC;AAEhF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAGV,eAAe,EACf,WAAW,EAGZ,MAAM,YAAY,CAAC;AA6FpB,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAgCD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,GAAG,EACvC,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,EAAE,EACT,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,GACd,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,CA8BtB;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAChD,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,EAAE,EACT,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,WAAW,GAClB,eAAe,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAoB/B"}
|
package/dist/context.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { ScriptAbortedError } from "./errors.js";
|
|
2
|
+
import { promptConfirm, promptMultiselect, promptSelect, promptText } from "./ui/prompt.js";
|
|
1
3
|
function clamp(value, min, max) {
|
|
2
4
|
return Math.max(min, Math.min(max, value));
|
|
3
5
|
}
|
|
@@ -86,8 +88,31 @@ function annotate(step, renderer, message) {
|
|
|
86
88
|
step.note = message;
|
|
87
89
|
renderer.refresh();
|
|
88
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* Suspends the live frame around each call so a prompt owns the terminal,
|
|
93
|
+
* then hands it back — resolve or reject, cancelled or not.
|
|
94
|
+
*/
|
|
95
|
+
function createPrompt(renderer, signal) {
|
|
96
|
+
const wrap = async (run) => {
|
|
97
|
+
if (signal.aborted)
|
|
98
|
+
throw signal.reason ?? new ScriptAbortedError("cancelled");
|
|
99
|
+
renderer.suspend();
|
|
100
|
+
try {
|
|
101
|
+
return await run(signal);
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
renderer.resume();
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
return {
|
|
108
|
+
text: (options) => wrap((s) => promptText(options, s)),
|
|
109
|
+
confirm: (options) => wrap((s) => promptConfirm(options, s)),
|
|
110
|
+
select: (options) => wrap((s) => promptSelect(options, s)),
|
|
111
|
+
multiselect: (options) => wrap((s) => promptMultiselect(options, s)),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
89
114
|
export function createStepContext(deps, input, ctx, signal, attempt) {
|
|
90
|
-
const { renderer, step, phaseName, cache } = deps;
|
|
115
|
+
const { renderer, step, phaseName, cache, flags } = deps;
|
|
91
116
|
// `step` is a routing hint: renderers that place logs on the step itself
|
|
92
117
|
// (rather than the scrollback) need to know which one.
|
|
93
118
|
const emit = (level) => (message) => renderer.log({ level, message }, step);
|
|
@@ -97,6 +122,7 @@ export function createStepContext(deps, input, ctx, signal, attempt) {
|
|
|
97
122
|
signal,
|
|
98
123
|
attempt,
|
|
99
124
|
cache,
|
|
125
|
+
flags,
|
|
100
126
|
phase: phaseName,
|
|
101
127
|
step: step.name,
|
|
102
128
|
log: emit("log"),
|
|
@@ -112,10 +138,11 @@ export function createStepContext(deps, input, ctx, signal, attempt) {
|
|
|
112
138
|
progress: (options) => createProgress(step, renderer, options),
|
|
113
139
|
task: (label) => createTask(step, renderer, label),
|
|
114
140
|
tasks: (labels) => createTaskList(step, renderer, labels),
|
|
141
|
+
prompt: createPrompt(renderer, signal),
|
|
115
142
|
};
|
|
116
143
|
}
|
|
117
144
|
export function createRollbackContext(deps, input, ctx, output, error, signal) {
|
|
118
|
-
const { renderer, step, phaseName, cache } = deps;
|
|
145
|
+
const { renderer, step, phaseName, cache, flags } = deps;
|
|
119
146
|
return {
|
|
120
147
|
input,
|
|
121
148
|
ctx,
|
|
@@ -123,6 +150,7 @@ export function createRollbackContext(deps, input, ctx, output, error, signal) {
|
|
|
123
150
|
error,
|
|
124
151
|
signal,
|
|
125
152
|
cache,
|
|
153
|
+
flags,
|
|
126
154
|
phase: phaseName,
|
|
127
155
|
step: step.name,
|
|
128
156
|
log: (message) => renderer.log({ level: "warn", message }, step),
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -23,9 +23,9 @@ export declare class StepDefinitionError extends Error {
|
|
|
23
23
|
* failure — so it is refused up front.
|
|
24
24
|
*/
|
|
25
25
|
export declare class DuplicateNameError extends Error {
|
|
26
|
-
readonly kind: "phase" | "step";
|
|
26
|
+
readonly kind: "phase" | "step" | "flag";
|
|
27
27
|
readonly duplicate: string;
|
|
28
|
-
constructor(kind: "phase" | "step", duplicate: string, message: string);
|
|
28
|
+
constructor(kind: "phase" | "step" | "flag", duplicate: string, message: string);
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
31
|
* A cached value was read for a field it does not have.
|
|
@@ -65,5 +65,32 @@ export declare class RollbackFailedError extends Error {
|
|
|
65
65
|
readonly rollbackError: unknown;
|
|
66
66
|
constructor(phase: string, step: string, rollbackError: unknown, cause: unknown);
|
|
67
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* `run()` saw `--foo` or `-f` on the command line, but no `defineFlag` call
|
|
70
|
+
* named it. Thrown before any phase executes, the same as a bad `defineInput`
|
|
71
|
+
* schema — parsing happens once, up front.
|
|
72
|
+
*/
|
|
73
|
+
export declare class UnknownFlagError extends Error {
|
|
74
|
+
readonly flag: string;
|
|
75
|
+
constructor(flag: string, known: readonly string[]);
|
|
76
|
+
}
|
|
77
|
+
/** A non-boolean flag was given with nothing after it — `--env` with no value. */
|
|
78
|
+
export declare class MissingFlagValueError extends Error {
|
|
79
|
+
readonly flag: string;
|
|
80
|
+
constructor(flag: string);
|
|
81
|
+
}
|
|
82
|
+
/** A `context.prompt` call was cancelled — Ctrl-C while waiting on input. */
|
|
83
|
+
export declare class PromptCancelledError extends Error {
|
|
84
|
+
constructor();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* A step called `context.prompt` but stdin isn't an interactive terminal —
|
|
88
|
+
* CI, a pipe, a non-TTY subprocess — and the prompt declared no `default` to
|
|
89
|
+
* fall back to. Thrown instead of hanging on a stream nothing will ever
|
|
90
|
+
* write to.
|
|
91
|
+
*/
|
|
92
|
+
export declare class PromptUnavailableError extends Error {
|
|
93
|
+
constructor(message: string);
|
|
94
|
+
}
|
|
68
95
|
export declare function isAbort(error: unknown): boolean;
|
|
69
96
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,oFAAoF;AACpF,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAE3C,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,KAAK,CAAC;CAgB1D;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED;;;;;;;;GAQG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,oFAAoF;AACpF,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAE3C,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,KAAK,CAAC;CAgB1D;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED;;;;;;;;GAQG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAMhF;AAED;;;;;;;;GAQG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAWvC;AAED,wEAAwE;AACxE,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAO1E;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAM5C;AAED,4EAA4E;AAC5E,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM;CAK3B;AAED,+EAA+E;AAC/E,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;gBAEpB,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;CAOhF;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE;CAQnD;AAED,kFAAkF;AAClF,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM;CAKzB;AAED,6EAA6E;AAC7E,qBAAa,oBAAqB,SAAQ,KAAK;;CAK9C;AAED;;;;;GAKG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAM/C"}
|
package/dist/errors.js
CHANGED
|
@@ -113,8 +113,51 @@ export class RollbackFailedError extends Error {
|
|
|
113
113
|
this.rollbackError = rollbackError;
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* `run()` saw `--foo` or `-f` on the command line, but no `defineFlag` call
|
|
118
|
+
* named it. Thrown before any phase executes, the same as a bad `defineInput`
|
|
119
|
+
* schema — parsing happens once, up front.
|
|
120
|
+
*/
|
|
121
|
+
export class UnknownFlagError extends Error {
|
|
122
|
+
flag;
|
|
123
|
+
constructor(flag, known) {
|
|
124
|
+
super(`Unknown flag "${flag}". ` +
|
|
125
|
+
(known.length > 0 ? `Declared flags: ${known.join(", ")}.` : "This script declares no flags."));
|
|
126
|
+
this.name = "UnknownFlagError";
|
|
127
|
+
this.flag = flag;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/** A non-boolean flag was given with nothing after it — `--env` with no value. */
|
|
131
|
+
export class MissingFlagValueError extends Error {
|
|
132
|
+
flag;
|
|
133
|
+
constructor(flag) {
|
|
134
|
+
super(`Flag "${flag}" expects a value ("${flag} <value>" or "${flag}=<value>"), but none was given.`);
|
|
135
|
+
this.name = "MissingFlagValueError";
|
|
136
|
+
this.flag = flag;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** A `context.prompt` call was cancelled — Ctrl-C while waiting on input. */
|
|
140
|
+
export class PromptCancelledError extends Error {
|
|
141
|
+
constructor() {
|
|
142
|
+
super("Prompt cancelled");
|
|
143
|
+
this.name = "PromptCancelledError";
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* A step called `context.prompt` but stdin isn't an interactive terminal —
|
|
148
|
+
* CI, a pipe, a non-TTY subprocess — and the prompt declared no `default` to
|
|
149
|
+
* fall back to. Thrown instead of hanging on a stream nothing will ever
|
|
150
|
+
* write to.
|
|
151
|
+
*/
|
|
152
|
+
export class PromptUnavailableError extends Error {
|
|
153
|
+
constructor(message) {
|
|
154
|
+
super(message);
|
|
155
|
+
this.name = "PromptUnavailableError";
|
|
156
|
+
}
|
|
157
|
+
}
|
|
116
158
|
export function isAbort(error) {
|
|
117
159
|
return (error instanceof ScriptAbortedError ||
|
|
160
|
+
error instanceof PromptCancelledError ||
|
|
118
161
|
(error instanceof Error && error.name === "AbortError"));
|
|
119
162
|
}
|
|
120
163
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,oFAAoF;AACpF,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACrC,MAAM,CAAwC;IAEvD,YAAY,MAA6C;QACvD,KAAK,CACH,MAAM;aACH,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI;gBACrB,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAChB,MAAM,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAChF;iBACA,IAAI,CAAC,GAAG,CAAC,CAAC;YACb,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;QAC5D,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CACd,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/flags.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** Recorded by `defineFlag`; type-erased, the same way step/phase defs are. */
|
|
2
|
+
export interface FlagDef {
|
|
3
|
+
name: string;
|
|
4
|
+
long: string;
|
|
5
|
+
short?: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
boolean: boolean;
|
|
8
|
+
hasDefault: boolean;
|
|
9
|
+
default: unknown;
|
|
10
|
+
}
|
|
11
|
+
/** `"dryRun"` -> `"dry-run"`. Already-kebab input passes through unchanged. */
|
|
12
|
+
export declare function kebabCase(name: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Parses `argv` (already stripped of the node binary and script path — i.e.
|
|
15
|
+
* `process.argv.slice(2)`) against the flags a script declared.
|
|
16
|
+
*
|
|
17
|
+
* `--flag value`, `--flag=value`, and `-f value` are all understood. A
|
|
18
|
+
* boolean flag never consumes the next token: its bare presence is `true`
|
|
19
|
+
* (`--flag=false` is honoured too, for the rare case of overriding a
|
|
20
|
+
* `default: true`).
|
|
21
|
+
*
|
|
22
|
+
* Every other token — anything not starting with `-`, or a bare `-` — is a
|
|
23
|
+
* positional argument and is silently ignored; this parser only cares about
|
|
24
|
+
* the flags it was told to look for.
|
|
25
|
+
*
|
|
26
|
+
* @throws {UnknownFlagError} for a `--foo`/`-f` this script never declared.
|
|
27
|
+
* @throws {MissingFlagValueError} for a non-boolean flag with nothing after it.
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseFlags(argv: readonly string[], defs: readonly FlagDef[]): Record<string, unknown>;
|
|
30
|
+
//# sourceMappingURL=flags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":"AAMA,+EAA+E;AAC/E,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuDrG"}
|
package/dist/flags.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command-line flag parsing for `Script.defineFlag` / `context.flags`.
|
|
3
|
+
* No dependency — a whitelist-driven pass over argv, nothing more.
|
|
4
|
+
*/
|
|
5
|
+
import { MissingFlagValueError, UnknownFlagError } from "./errors.js";
|
|
6
|
+
/** `"dryRun"` -> `"dry-run"`. Already-kebab input passes through unchanged. */
|
|
7
|
+
export function kebabCase(name) {
|
|
8
|
+
return name.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parses `argv` (already stripped of the node binary and script path — i.e.
|
|
12
|
+
* `process.argv.slice(2)`) against the flags a script declared.
|
|
13
|
+
*
|
|
14
|
+
* `--flag value`, `--flag=value`, and `-f value` are all understood. A
|
|
15
|
+
* boolean flag never consumes the next token: its bare presence is `true`
|
|
16
|
+
* (`--flag=false` is honoured too, for the rare case of overriding a
|
|
17
|
+
* `default: true`).
|
|
18
|
+
*
|
|
19
|
+
* Every other token — anything not starting with `-`, or a bare `-` — is a
|
|
20
|
+
* positional argument and is silently ignored; this parser only cares about
|
|
21
|
+
* the flags it was told to look for.
|
|
22
|
+
*
|
|
23
|
+
* @throws {UnknownFlagError} for a `--foo`/`-f` this script never declared.
|
|
24
|
+
* @throws {MissingFlagValueError} for a non-boolean flag with nothing after it.
|
|
25
|
+
*/
|
|
26
|
+
export function parseFlags(argv, defs) {
|
|
27
|
+
const byLong = new Map(defs.map((def) => [def.long, def]));
|
|
28
|
+
const byShort = new Map(defs.filter((def) => def.short !== undefined).map((def) => [def.short, def]));
|
|
29
|
+
const result = {};
|
|
30
|
+
for (const def of defs) {
|
|
31
|
+
if (def.hasDefault)
|
|
32
|
+
result[def.name] = def.default;
|
|
33
|
+
else if (def.boolean)
|
|
34
|
+
result[def.name] = false;
|
|
35
|
+
}
|
|
36
|
+
let i = 0;
|
|
37
|
+
while (i < argv.length) {
|
|
38
|
+
const token = argv[i];
|
|
39
|
+
i += 1;
|
|
40
|
+
let def;
|
|
41
|
+
let inlineValue;
|
|
42
|
+
let label;
|
|
43
|
+
if (token.startsWith("--")) {
|
|
44
|
+
const body = token.slice(2);
|
|
45
|
+
const eq = body.indexOf("=");
|
|
46
|
+
const key = eq === -1 ? body : body.slice(0, eq);
|
|
47
|
+
inlineValue = eq === -1 ? undefined : body.slice(eq + 1);
|
|
48
|
+
label = `--${key}`;
|
|
49
|
+
def = byLong.get(key);
|
|
50
|
+
if (!def)
|
|
51
|
+
throw new UnknownFlagError(label, [...byLong.keys()].map((long) => `--${long}`));
|
|
52
|
+
}
|
|
53
|
+
else if (token.startsWith("-") && token.length > 1) {
|
|
54
|
+
const key = token.slice(1);
|
|
55
|
+
label = `-${key}`;
|
|
56
|
+
def = byShort.get(key);
|
|
57
|
+
if (!def)
|
|
58
|
+
throw new UnknownFlagError(label, [...byShort.keys()].map((short) => `-${short}`));
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (def.boolean) {
|
|
64
|
+
result[def.name] = inlineValue === undefined ? true : inlineValue !== "false";
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (inlineValue !== undefined) {
|
|
68
|
+
result[def.name] = inlineValue;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const next = argv[i];
|
|
72
|
+
if (next === undefined)
|
|
73
|
+
throw new MissingFlagValueError(label);
|
|
74
|
+
result[def.name] = next;
|
|
75
|
+
i += 1;
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=flags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { Script, script, stepFor, routineFor, type CachedPhaseOptions, type ClosedPhase, type Commit, type MountInput, type MountOptions, type Mounted, type OpenPhase, type Routine, type RunOptions, } from "./script.js";
|
|
2
2
|
export { fileStore, memoryStore } from "./cache.js";
|
|
3
|
-
export { CacheShapeError, DuplicateNameError, RollbackFailedError, SchemaValidationError, ScriptAbortedError, StepDefinitionError, StepFailedError, StepTimeoutError, isAbort, } from "./errors.js";
|
|
4
|
-
export type { Awaitable, CacheHandle, CacheMode, CacheOptions, CacheSource, CacheStore, CachedEntry, CleanField, Cleaned, LogPlacement, Merge, PhaseOptions, PhaseStatus, Prettify, ProgressHandle, RetryPolicy, RollbackContext, RollbackData, RollbackReport, RunResult, RunStatus, ScriptOptions, SlotValue, StaleContext, StepContext, StepDef, StepReport, StepStatus, TaskHandle, TaskListHandle, UnknownSlots, WithStepFor, } from "./types.js";
|
|
3
|
+
export { CacheShapeError, DuplicateNameError, MissingFlagValueError, PromptCancelledError, PromptUnavailableError, RollbackFailedError, SchemaValidationError, ScriptAbortedError, StepDefinitionError, StepFailedError, StepTimeoutError, UnknownFlagError, isAbort, } from "./errors.js";
|
|
4
|
+
export type { Awaitable, BaseFlagOptions, BooleanFlagOptions, CacheHandle, CacheMode, CacheOptions, CacheSource, CacheStore, CachedEntry, CleanField, Cleaned, ConfirmPromptOptions, LogPlacement, Merge, MultiSelectPromptOptions, PhaseOptions, PhaseStatus, Prettify, ProgressHandle, PromptChoice, PromptHandle, RetryPolicy, RollbackContext, RollbackData, RollbackReport, RunResult, RunStatus, ScriptOptions, SelectPromptOptions, SlotValue, StaleContext, StepContext, StepDef, InheritedKeyStepDef, StepReport, StepStatus, StringFlagOptions, TaskHandle, TaskListHandle, TextPromptOptions, UnknownFlags, UnknownSlots, WithStepFor, } from "./types.js";
|
|
5
5
|
export { formatDuration } from "./state.js";
|
|
6
6
|
export { setColorEnabled, isColorEnabled } from "./ui/ansi.js";
|
|
7
7
|
export { palette, symbols } from "./ui/theme.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,UAAU,EACV,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,OAAO,GACR,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,SAAS,EACT,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,UAAU,EACV,OAAO,EACP,YAAY,EACZ,KAAK,EACL,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,cAAc,EACd,WAAW,EACX,eAAe,EACf,YAAY,EACZ,cAAc,EACd,SAAS,EACT,SAAS,EACT,aAAa,EACb,SAAS,EACT,YAAY,EACZ,WAAW,EACX,OAAO,EACP,UAAU,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,UAAU,EACV,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,OAAO,GACR,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,UAAU,EACV,OAAO,EACP,oBAAoB,EACpB,YAAY,EACZ,KAAK,EACL,wBAAwB,EACxB,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,eAAe,EACf,YAAY,EACZ,cAAc,EACd,SAAS,EACT,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,SAAS,EACT,YAAY,EACZ,WAAW,EACX,OAAO,EACP,mBAAmB,EACnB,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { Script, script, stepFor, routineFor, } from "./script.js";
|
|
2
2
|
export { fileStore, memoryStore } from "./cache.js";
|
|
3
|
-
export { CacheShapeError, DuplicateNameError, RollbackFailedError, SchemaValidationError, ScriptAbortedError, StepDefinitionError, StepFailedError, StepTimeoutError, isAbort, } from "./errors.js";
|
|
3
|
+
export { CacheShapeError, DuplicateNameError, MissingFlagValueError, PromptCancelledError, PromptUnavailableError, RollbackFailedError, SchemaValidationError, ScriptAbortedError, StepDefinitionError, StepFailedError, StepTimeoutError, UnknownFlagError, isAbort, } from "./errors.js";
|
|
4
4
|
export { formatDuration } from "./state.js";
|
|
5
5
|
export { setColorEnabled, isColorEnabled } from "./ui/ansi.js";
|
|
6
6
|
export { palette, symbols } from "./ui/theme.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,UAAU,GAUX,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,OAAO,GACR,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,UAAU,GAUX,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,OAAO,GACR,MAAM,aAAa,CAAC;AAgDrB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/script.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
|
-
import type { Awaitable, CacheMode, CacheSource, CleanField, Cleaned, Merge, PhaseOptions, RunResult, ScriptOptions, SlotValue, StepDef, UnknownSlots } from "./types.js";
|
|
2
|
+
import type { Awaitable, BooleanFlagOptions, CacheMode, CacheSource, CleanField, Cleaned, Merge, PhaseOptions, RunResult, ScriptOptions, SlotValue, StepDef, StringFlagOptions, UnknownFlags, UnknownSlots, InheritedKeyStepDef } from "./types.js";
|
|
3
3
|
/**
|
|
4
4
|
* Keys for the phantom markers on {@link Script} and {@link Routine}. Exported
|
|
5
5
|
* only because declaration emit has to name them; there is no runtime value
|
|
@@ -98,6 +98,12 @@ export interface RunOptions {
|
|
|
98
98
|
* to control caching without touching the script.
|
|
99
99
|
*/
|
|
100
100
|
cache?: CacheMode;
|
|
101
|
+
/**
|
|
102
|
+
* Argv to parse `defineFlag`'s flags out of. Default `process.argv.slice(2)`
|
|
103
|
+
* — override it in a test, or when this script is one subcommand of a
|
|
104
|
+
* larger CLI that has already sliced its own argv apart.
|
|
105
|
+
*/
|
|
106
|
+
argv?: readonly string[];
|
|
101
107
|
}
|
|
102
108
|
/**
|
|
103
109
|
* A saga-style script: phases of steps, each step optionally compensating when
|
|
@@ -126,7 +132,7 @@ export interface RunOptions {
|
|
|
126
132
|
* The third parameter is inferred too: it collects the keys steps reserved
|
|
127
133
|
* through `rollbackKeys`, which is how `clean` knows what it may not remove.
|
|
128
134
|
*/
|
|
129
|
-
export declare class Script<In = void, Ctx extends object = {}, Reserved extends PropertyKey = never, Slots = {}, Open extends OpenPhase = ClosedPhase> {
|
|
135
|
+
export declare class Script<In = void, Ctx extends object = {}, Reserved extends PropertyKey = never, Slots = {}, Open extends OpenPhase = ClosedPhase, Flags extends object = {}> {
|
|
130
136
|
/**
|
|
131
137
|
* Phantom, erased at compile time. `run` is a *method*, so its parameter
|
|
132
138
|
* compares bivariantly and `In` would otherwise carry no safety across two
|
|
@@ -142,6 +148,10 @@ export declare class Script<In = void, Ctx extends object = {}, Reserved extends
|
|
|
142
148
|
/** False right after `use()`, so a bare `addStep` cannot land in a fragment. */
|
|
143
149
|
private openPhase;
|
|
144
150
|
private _schema;
|
|
151
|
+
private readonly flagDefs;
|
|
152
|
+
private readonly flagNames;
|
|
153
|
+
private readonly flagLongs;
|
|
154
|
+
private readonly flagShorts;
|
|
145
155
|
constructor(options?: ScriptOptions | string);
|
|
146
156
|
/**
|
|
147
157
|
* Provide a [Standard Schema](https://standardschema.dev) describing the run
|
|
@@ -163,9 +173,46 @@ export declare class Script<In = void, Ctx extends object = {}, Reserved extends
|
|
|
163
173
|
* });
|
|
164
174
|
* ```
|
|
165
175
|
*/
|
|
166
|
-
defineInput<TSchema>(schema: StandardSchemaV1<unknown, TSchema>): Script<TSchema, Ctx, Reserved>;
|
|
176
|
+
defineInput<TSchema>(schema: StandardSchemaV1<unknown, TSchema>): Script<TSchema, Ctx, Reserved, {}, ClosedPhase, Flags>;
|
|
167
177
|
/** Validate `input` against the schema from `defineInput`, if any. */
|
|
168
178
|
private validateInput;
|
|
179
|
+
/**
|
|
180
|
+
* Declare a flag this script reads off the command line. `name` is both the
|
|
181
|
+
* property `context.flags` exposes it under and — kebab-cased — the default
|
|
182
|
+
* long `--` form; `short` adds a single-letter `-` alias, and `long`
|
|
183
|
+
* overrides the derived one when it should read differently from `name`.
|
|
184
|
+
*
|
|
185
|
+
* A `boolean: true` flag is present or absent (`myScript --force`) and
|
|
186
|
+
* always resolves to a `boolean`, defaulting to `false` unless
|
|
187
|
+
* `default: true`. Anything else is a string: `myScript --env prod` or
|
|
188
|
+
* `myScript -e prod`, resolving to `string` when a `default` is given, or
|
|
189
|
+
* `string | undefined` otherwise. Values are parsed from `process.argv`
|
|
190
|
+
* (or `run(input, { argv })`) once, before any phase executes.
|
|
191
|
+
*
|
|
192
|
+
* ```ts
|
|
193
|
+
* new Script({ name: "deploy" })
|
|
194
|
+
* .defineFlag({ name: "environment", long: "env", short: "e", default: "staging" })
|
|
195
|
+
* .defineFlag({ name: "force", short: "f", boolean: true })
|
|
196
|
+
* .addStep({
|
|
197
|
+
* name: "deploy",
|
|
198
|
+
* // flags.environment: string, flags.force: boolean
|
|
199
|
+
* handler: async ({ flags }) => { ... },
|
|
200
|
+
* });
|
|
201
|
+
* ```
|
|
202
|
+
*
|
|
203
|
+
* @throws {DuplicateNameError} if `name`, the resolved long flag, or `short`
|
|
204
|
+
* is already used by another flag on this script.
|
|
205
|
+
*/
|
|
206
|
+
defineFlag<const Name extends string>(options: BooleanFlagOptions<Name>): Script<In, Ctx, Reserved, Slots, Open, Flags & Record<Name, boolean>>;
|
|
207
|
+
defineFlag<const Name extends string, const Default extends string | undefined = undefined>(options: StringFlagOptions<Name, Default>): Script<In, Ctx, Reserved, Slots, Open, Flags & Record<Name, Default extends string ? string : string | undefined>>;
|
|
208
|
+
/**
|
|
209
|
+
* Flag identities have to be unique the same way phase and step names do —
|
|
210
|
+
* `name` is the property key on `context.flags`, and the long/short forms
|
|
211
|
+
* are what argv is matched against.
|
|
212
|
+
*/
|
|
213
|
+
private claimFlagIdentity;
|
|
214
|
+
/** Parse `argv` against this script's declared flags — `{}` when none are. */
|
|
215
|
+
private resolveFlags;
|
|
169
216
|
/**
|
|
170
217
|
* Open a cached phase. Its name becomes a slot addressable through
|
|
171
218
|
* `context.cache` in every step declared after it — typed as the phase's own
|
|
@@ -176,36 +223,43 @@ export declare class Script<In = void, Ctx extends object = {}, Reserved extends
|
|
|
176
223
|
phase: Name;
|
|
177
224
|
schema: Value;
|
|
178
225
|
delta: {};
|
|
179
|
-
}>;
|
|
226
|
+
}, Flags>;
|
|
180
227
|
/** Open a new phase. Subsequent `addStep` calls land in it. */
|
|
181
228
|
addPhase<const Name extends string>(name: Name, options?: PhaseOptions<In, Ctx>): Script<In, Ctx, Reserved, Commit<Slots, Open>, {
|
|
182
229
|
name: never;
|
|
183
230
|
phase: Name;
|
|
184
231
|
schema: unknown;
|
|
185
232
|
delta: {};
|
|
186
|
-
}>;
|
|
233
|
+
}, Flags>;
|
|
187
234
|
/** Open a phase and populate it inside a callback, keeping the type flow. */
|
|
188
|
-
addPhase<Next extends object, NextReserved extends PropertyKey, NextSlots, NextOpen extends OpenPhase>(name: string, build: (script: Script<In, Ctx, Reserved, Commit<Slots, Open>, ClosedPhase>) => Script<In, Next, NextReserved, NextSlots, NextOpen>): Script<In, Next, NextReserved, NextSlots, NextOpen>;
|
|
189
|
-
addPhase<Next extends object, NextReserved extends PropertyKey, NextSlots, NextOpen extends OpenPhase>(name: string, options: PhaseOptions<In, Ctx>, build: (script: Script<In, Ctx, Reserved, Commit<Slots, Open>, ClosedPhase>) => Script<In, Next, NextReserved, NextSlots, NextOpen>): Script<In, Next, NextReserved, NextSlots, NextOpen>;
|
|
235
|
+
addPhase<Next extends object, NextReserved extends PropertyKey, NextSlots, NextOpen extends OpenPhase, NextFlags extends object>(name: string, build: (script: Script<In, Ctx, Reserved, Commit<Slots, Open>, ClosedPhase, Flags>) => Script<In, Next, NextReserved, NextSlots, NextOpen, NextFlags>): Script<In, Next, NextReserved, NextSlots, NextOpen, NextFlags>;
|
|
236
|
+
addPhase<Next extends object, NextReserved extends PropertyKey, NextSlots, NextOpen extends OpenPhase, NextFlags extends object>(name: string, options: PhaseOptions<In, Ctx>, build: (script: Script<In, Ctx, Reserved, Commit<Slots, Open>, ClosedPhase, Flags>) => Script<In, Next, NextReserved, NextSlots, NextOpen, NextFlags>): Script<In, Next, NextReserved, NextSlots, NextOpen, NextFlags>;
|
|
190
237
|
/**
|
|
191
238
|
* Append a step to the current phase. Whatever the handler resolves to is
|
|
192
239
|
* merged into the context and becomes visible to every later step; whatever
|
|
193
240
|
* it lists in `clean` is dropped from both.
|
|
194
241
|
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* A step that caches. It contributes its own slot, `phase::step`, holding
|
|
242
|
+
* There are four signatures, along two independent splits.
|
|
243
|
+
*
|
|
244
|
+
* A step that caches contributes its own slot, `phase::step`, holding
|
|
200
245
|
* exactly what the handler returns — addressable through `context.cache` in
|
|
201
|
-
* every step declared after it.
|
|
246
|
+
* every step declared after it. That is split from the plain form rather
|
|
247
|
+
* than inferred from the presence of `cache`: an optional property cannot be
|
|
248
|
+
* told apart from its own default, so a single signature always resolved to
|
|
249
|
+
* "no cache" and quietly dropped the slot.
|
|
250
|
+
*
|
|
251
|
+
* Crossed with that, each form is tried first as an
|
|
252
|
+
* {@link InheritedKeyStepDef} — `rollbackKeys` naming only keys the context
|
|
253
|
+
* already has — which is what keeps the handler as the sole inference site
|
|
254
|
+
* for `Out`. A step naming one of its own output keys fails that signature's
|
|
255
|
+
* `RollbackKeys` constraint in inference's first pass and falls through to
|
|
256
|
+
* the general {@link StepDef} form below.
|
|
202
257
|
*
|
|
203
|
-
*
|
|
204
|
-
*
|
|
205
|
-
* single signature always resolved to "no cache" and quietly dropped the
|
|
206
|
-
* slot.
|
|
258
|
+
* @throws {StepDefinitionError} if `clean` names a key reserved by some
|
|
259
|
+
* step's `rollbackKeys`.
|
|
207
260
|
*/
|
|
208
|
-
|
|
261
|
+
/** Cached, `rollbackKeys` inherited. See {@link InheritedKeyStepDef}. */
|
|
262
|
+
addStep<Out extends object | void = void, const Name extends string = string, const RollbackKeys extends readonly (keyof Ctx)[] = readonly [], const CleanKeys extends readonly PropertyKey[] = readonly []>(def: Omit<InheritedKeyStepDef<In, Ctx, Out, RollbackKeys, Slots, Flags>, "name"> & CleanField<Ctx, Reserved, CleanKeys> & {
|
|
209
263
|
name: Name;
|
|
210
264
|
cache: CacheSource<In, Ctx>;
|
|
211
265
|
}): Script<In, Cleaned<Merge<Ctx, Out>, CleanKeys[number]>, Reserved | RollbackKeys[number], Slots & Record<`${Open["phase"]}::${Name}`, Out>, {
|
|
@@ -213,21 +267,31 @@ export declare class Script<In = void, Ctx extends object = {}, Reserved extends
|
|
|
213
267
|
phase: Open["phase"];
|
|
214
268
|
schema: Open["schema"];
|
|
215
269
|
delta: Cleaned<Merge<Open["delta"], Out>, CleanKeys[number]>;
|
|
216
|
-
}>;
|
|
217
|
-
/**
|
|
218
|
-
|
|
219
|
-
* merged into the context and becomes visible to every later step; whatever
|
|
220
|
-
* it lists in `clean` is dropped from both.
|
|
221
|
-
*
|
|
222
|
-
* @throws {StepDefinitionError} if `clean` names a key reserved by some
|
|
223
|
-
* step's `rollbackKeys`.
|
|
224
|
-
*/
|
|
225
|
-
addStep<Out extends object | void, const RollbackKeys extends readonly PropertyKey[] = readonly [], const CleanKeys extends readonly PropertyKey[] = readonly []>(def: StepDef<In, Ctx, Out, RollbackKeys, Slots> & CleanField<Ctx, Reserved, CleanKeys>): Script<In, Cleaned<Merge<Ctx, Out>, CleanKeys[number]>, Reserved | RollbackKeys[number], Slots, {
|
|
270
|
+
}, Flags>;
|
|
271
|
+
/** Plain, `rollbackKeys` inherited. See {@link InheritedKeyStepDef}. */
|
|
272
|
+
addStep<Out extends object | void = void, const RollbackKeys extends readonly (keyof Ctx)[] = readonly [], const CleanKeys extends readonly PropertyKey[] = readonly []>(def: InheritedKeyStepDef<In, Ctx, Out, RollbackKeys, Slots, Flags> & CleanField<Ctx, Reserved, CleanKeys>): Script<In, Cleaned<Merge<Ctx, Out>, CleanKeys[number]>, Reserved | RollbackKeys[number], Slots, {
|
|
226
273
|
name: Open["name"];
|
|
227
274
|
phase: Open["phase"];
|
|
228
275
|
schema: Open["schema"];
|
|
229
276
|
delta: Cleaned<Merge<Open["delta"], Out>, CleanKeys[number]>;
|
|
230
|
-
}>;
|
|
277
|
+
}, Flags>;
|
|
278
|
+
/** Cached, general form. See {@link StepDef}. */
|
|
279
|
+
addStep<Out extends object | void, const Name extends string, const RollbackKeys extends readonly PropertyKey[] = readonly [], const CleanKeys extends readonly PropertyKey[] = readonly []>(def: Omit<StepDef<In, Ctx, Out, RollbackKeys, Slots, Flags>, "name"> & CleanField<Ctx, Reserved, CleanKeys> & {
|
|
280
|
+
name: Name;
|
|
281
|
+
cache: CacheSource<In, Ctx>;
|
|
282
|
+
}): Script<In, Cleaned<Merge<Ctx, Out>, CleanKeys[number]>, Reserved | RollbackKeys[number], Slots & Record<`${Open["phase"]}::${Name}`, Out>, {
|
|
283
|
+
name: Open["name"];
|
|
284
|
+
phase: Open["phase"];
|
|
285
|
+
schema: Open["schema"];
|
|
286
|
+
delta: Cleaned<Merge<Open["delta"], Out>, CleanKeys[number]>;
|
|
287
|
+
}, Flags>;
|
|
288
|
+
/** Plain, general form. See {@link StepDef}. */
|
|
289
|
+
addStep<Out extends object | void, const RollbackKeys extends readonly PropertyKey[] = readonly [], const CleanKeys extends readonly PropertyKey[] = readonly []>(def: StepDef<In, Ctx, Out, RollbackKeys, Slots, Flags> & CleanField<Ctx, Reserved, CleanKeys>): Script<In, Cleaned<Merge<Ctx, Out>, CleanKeys[number]>, Reserved | RollbackKeys[number], Slots, {
|
|
290
|
+
name: Open["name"];
|
|
291
|
+
phase: Open["phase"];
|
|
292
|
+
schema: Open["schema"];
|
|
293
|
+
delta: Cleaned<Merge<Open["delta"], Out>, CleanKeys[number]>;
|
|
294
|
+
}, Flags>;
|
|
231
295
|
/**
|
|
232
296
|
* Splice a reusable fragment into this script. Its phases land here in
|
|
233
297
|
* order, and everything it produced is merged into the context — so the
|
|
@@ -257,17 +321,17 @@ export declare class Script<In = void, Ctx extends object = {}, Reserved extends
|
|
|
257
321
|
use<SubIn, Out extends object, R extends PropertyKey, RS, const As extends string | undefined = undefined>(routine: Routine<SubIn, Ctx, Out, R, RS>, options: {
|
|
258
322
|
as?: As;
|
|
259
323
|
input: MountInput<In, Ctx, SubIn>;
|
|
260
|
-
}): Script<In, Merge<Ctx, Out>, Reserved | R, Commit<Slots, Open> & Mounted<As, RS>, ClosedPhase>;
|
|
261
|
-
use<SubIn, Out extends object, R extends PropertyKey, SS, SO extends OpenPhase, const As extends string | undefined = undefined>(script: Script<SubIn, Out, R, SS, SO>, options: {
|
|
324
|
+
}): Script<In, Merge<Ctx, Out>, Reserved | R, Commit<Slots, Open> & Mounted<As, RS>, ClosedPhase, Flags>;
|
|
325
|
+
use<SubIn, Out extends object, R extends PropertyKey, SS, SO extends OpenPhase, MF extends object, const As extends string | undefined = undefined>(script: Script<SubIn, Out, R, SS, SO, MF>, options: {
|
|
262
326
|
as?: As;
|
|
263
327
|
input: MountInput<In, Ctx, SubIn>;
|
|
264
|
-
}): Script<In, Merge<Ctx, Out>, Reserved | R, Commit<Slots, Open> & Mounted<As, Commit<SS, SO>>, ClosedPhase>;
|
|
265
|
-
use<Out extends object, R extends PropertyKey, SS, SO extends OpenPhase, const As extends string | undefined = undefined>(script: Script<In, Out, R, SS, SO>, options?: {
|
|
328
|
+
}): Script<In, Merge<Ctx, Out>, Reserved | R, Commit<Slots, Open> & Mounted<As, Commit<SS, SO>>, ClosedPhase, Flags>;
|
|
329
|
+
use<Out extends object, R extends PropertyKey, SS, SO extends OpenPhase, MF extends object, const As extends string | undefined = undefined>(script: Script<In, Out, R, SS, SO, MF>, options?: {
|
|
266
330
|
as?: As;
|
|
267
|
-
}): Script<In, Merge<Ctx, Out>, Reserved | R, Commit<Slots, Open> & Mounted<As, Commit<SS, SO>>, ClosedPhase>;
|
|
331
|
+
}): Script<In, Merge<Ctx, Out>, Reserved | R, Commit<Slots, Open> & Mounted<As, Commit<SS, SO>>, ClosedPhase, Flags>;
|
|
268
332
|
use<Out extends object, R extends PropertyKey, RS, const As extends string | undefined = undefined>(routine: Routine<In, Ctx, Out, R, RS>, options?: {
|
|
269
333
|
as?: As;
|
|
270
|
-
}): Script<In, Merge<Ctx, Out>, Reserved | R, Commit<Slots, Open> & Mounted<As, RS>, ClosedPhase>;
|
|
334
|
+
}): Script<In, Merge<Ctx, Out>, Reserved | R, Commit<Slots, Open> & Mounted<As, RS>, ClosedPhase, Flags>;
|
|
271
335
|
/** Every step name, in execution order — handy for tests and docs. */
|
|
272
336
|
outline(): Array<{
|
|
273
337
|
phase: string;
|
|
@@ -306,7 +370,10 @@ export declare class Script<In = void, Ctx extends object = {}, Reserved extends
|
|
|
306
370
|
* `rollbackKeys` works the same here, and the keys it names stay reserved once
|
|
307
371
|
* the step is handed to `addStep`.
|
|
308
372
|
*/
|
|
309
|
-
export declare function stepFor<In, Ctx extends object = {}, Slots = UnknownSlots
|
|
373
|
+
export declare function stepFor<In, Ctx extends object = {}, Slots = UnknownSlots, Flags = UnknownFlags>(): {
|
|
374
|
+
<Out extends object | void = void, const RollbackKeys extends readonly (keyof Ctx)[] = readonly []>(def: InheritedKeyStepDef<In, Ctx, Out, RollbackKeys, Slots, Flags>): StepDef<In, Ctx, Out, RollbackKeys, Slots, Flags>;
|
|
375
|
+
<Out extends object | void, const RollbackKeys extends readonly PropertyKey[] = readonly []>(def: StepDef<In, Ctx, Out, RollbackKeys, Slots, Flags>): StepDef<In, Ctx, Out, RollbackKeys, Slots, Flags>;
|
|
376
|
+
};
|
|
310
377
|
/**
|
|
311
378
|
* Declare phases and steps away from any particular script, then mount them
|
|
312
379
|
* with {@link Script.use}.
|