@sponson/core 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/engine/action.d.ts +22 -0
  2. package/dist/engine/action.js +55 -0
  3. package/dist/engine/action.js.map +1 -0
  4. package/dist/engine/apply.js +203 -22
  5. package/dist/engine/apply.js.map +1 -1
  6. package/dist/engine/destroy.js +42 -10
  7. package/dist/engine/destroy.js.map +1 -1
  8. package/dist/engine/index.d.ts +1 -1
  9. package/dist/engine/inspect.d.ts +7 -1
  10. package/dist/engine/inspect.js +68 -8
  11. package/dist/engine/inspect.js.map +1 -1
  12. package/dist/engine/lease.d.ts +39 -7
  13. package/dist/engine/lease.js +85 -20
  14. package/dist/engine/lease.js.map +1 -1
  15. package/dist/engine/manual.d.ts +47 -0
  16. package/dist/engine/manual.js +124 -0
  17. package/dist/engine/manual.js.map +1 -0
  18. package/dist/engine/once.d.ts +26 -0
  19. package/dist/engine/once.js +48 -0
  20. package/dist/engine/once.js.map +1 -0
  21. package/dist/engine/plan.js +24 -5
  22. package/dist/engine/plan.js.map +1 -1
  23. package/dist/engine/prepare.d.ts +1 -1
  24. package/dist/engine/prepare.js +71 -11
  25. package/dist/engine/prepare.js.map +1 -1
  26. package/dist/engine/run-context.d.ts +8 -2
  27. package/dist/engine/run-context.js +11 -2
  28. package/dist/engine/run-context.js.map +1 -1
  29. package/dist/engine/types.d.ts +33 -2
  30. package/dist/errors.d.ts +11 -1
  31. package/dist/errors.js +10 -0
  32. package/dist/errors.js.map +1 -1
  33. package/dist/receipts/git-workdir.d.ts +5 -0
  34. package/dist/receipts/git-workdir.js +9 -2
  35. package/dist/receipts/git-workdir.js.map +1 -1
  36. package/dist/receipts/git.d.ts +4 -0
  37. package/dist/receipts/git.js +35 -1
  38. package/dist/receipts/git.js.map +1 -1
  39. package/dist/receipts/layout.d.ts +8 -0
  40. package/dist/receipts/layout.js +11 -0
  41. package/dist/receipts/layout.js.map +1 -1
  42. package/dist/receipts/local.d.ts +4 -0
  43. package/dist/receipts/local.js +15 -1
  44. package/dist/receipts/local.js.map +1 -1
  45. package/dist/resolve.d.ts +19 -2
  46. package/dist/resolve.js +12 -3
  47. package/dist/resolve.js.map +1 -1
  48. package/dist/testing/fake.d.ts +15 -2
  49. package/dist/testing/fake.js +69 -3
  50. package/dist/testing/fake.js.map +1 -1
  51. package/dist/types.d.ts +184 -8
  52. package/dist/types.js.map +1 -1
  53. package/package.json +5 -1
@@ -0,0 +1,47 @@
1
+ import type { ResolveResult } from "../resolve.js";
2
+ import type { Change, LedgerEntry, ManualStep, OpSpec, ReceiptLine } from "../types.js";
3
+ import type { Inspection } from "./inspect.js";
4
+ import type { RunContext } from "./run-context.js";
5
+ import type { ManualTodo, RunOptions } from "./types.js";
6
+ /** What inspection found out about a manual line whose inputs are all known. */
7
+ export interface ManualState {
8
+ step: ManualStep;
9
+ /** Done: seen by its verify request, or confirmed by a person for these instructions. */
10
+ done: boolean;
11
+ /** Seen done by its verify request in this inspection. */
12
+ verified: boolean;
13
+ }
14
+ /** The receipt's `waitingFor` of a manual step (and of the lines that depend on it) until it is confirmed. */
15
+ export declare const CONFIRMATION = "confirmation";
16
+ /** The label a manual step's resource and diff carry. */
17
+ export declare function manualLabel(step: Pick<ManualStep, "title">): string;
18
+ /**
19
+ * Inspect a manual line: read its verify request (if any), and judge it against the ledger instead of the generic
20
+ * drift rules (`judge`): a step has no provider object another scope could own or a console could edit.
21
+ */
22
+ export declare function inspectManual(rc: RunContext, change: Change, op: OpSpec, provider: Record<string, unknown>, resolved: ResolveResult): Promise<Inspection>;
23
+ /** The step as shown to the person who must do it. Text is masked like every output. */
24
+ export declare function todoOf(rc: RunContext, line: string, step: ManualStep, action: ManualTodo["action"]): ManualTodo;
25
+ /** The waiting receipt line of a manual step nobody confirmed yet. */
26
+ export declare function pendingLine(line: ReceiptLine, title: string, action: ManualTodo["action"]): void;
27
+ /**
28
+ * The ledger entry that records a done step: who confirmed it and when, or when a verify request first saw it.
29
+ * Keeps the previous record when nothing about the step changed, so the first confirmation stays on file.
30
+ */
31
+ export declare function manualEntry(rc: RunContext, change: Change, provider: Record<string, unknown>, state: ManualState, confirmedNow: boolean, at: string): {
32
+ entry: LedgerEntry;
33
+ changed: boolean;
34
+ };
35
+ /** `confirm` needs a person's name, and may name only manual lines active in this run. */
36
+ export declare function checkConfirm(opts: RunOptions, lines: Array<{
37
+ id: string;
38
+ op: OpSpec;
39
+ }>): void;
40
+ /**
41
+ * Destroy a manual step's record: there is nothing to delete at a provider, but a person may have to undo it. With
42
+ * no `undo`, or once confirmed, the record is forgotten; otherwise the line waits for that confirmation and the undo
43
+ * instructions are returned for the person.
44
+ */
45
+ export declare function destroyManual(rc: RunContext, line: ReceiptLine, entries: LedgerEntry[], at: string): ManualTodo[];
46
+ /** Lines `confirm` named that this run did not confirm (still waiting on an input, or done already). */
47
+ export declare function unusedConfirmations(opts: RunOptions, used: Set<string>): string | undefined;
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Manual steps (ADR 0021): lines a person does by hand, for state no API can change (a Google OAuth client's
3
+ * redirect URIs). The op describes the step (`OpSpec.manual`); the engine owns its state:
4
+ *
5
+ * - done when its verify request sees it (`observable` steps: `read` returns its resource), or when the ledger
6
+ * records a person's confirmation of these very instructions; otherwise a `todo`;
7
+ * - apply records a todo only when the run confirms it (`RunOptions.confirm`), and otherwise leaves the line waiting
8
+ * for a confirmation with MANUAL_STEP_PENDING (its dependents wait too, nothing is rolled back);
9
+ * - a step a verify request saw done and no longer sees is `missing` drift, and a todo again;
10
+ * - rollback never undoes one (a person did it); destroy shows its `undo` and forgets it only once confirmed.
11
+ */
12
+ import { SponsonError } from "../errors.js";
13
+ /** The receipt's `waitingFor` of a manual step (and of the lines that depend on it) until it is confirmed. */
14
+ export const CONFIRMATION = "confirmation";
15
+ /** The label a manual step's resource and diff carry. */
16
+ export function manualLabel(step) {
17
+ return `manual step: ${step.title}`;
18
+ }
19
+ /** The ledger entry of the step, unless it is only an intent (never written for manual steps, but be strict). */
20
+ function recorded(rc, change, provider, key) {
21
+ const e = rc.ledger.get(change.adapter, provider, key);
22
+ return e && e.createdBy !== "intent" ? e : undefined;
23
+ }
24
+ /**
25
+ * Inspect a manual line: read its verify request (if any), and judge it against the ledger instead of the generic
26
+ * drift rules (`judge`): a step has no provider object another scope could own or a console could edit.
27
+ */
28
+ export async function inspectManual(rc, change, op, provider, resolved) {
29
+ const step = op.manual(resolved.params, rc.opts.ctx);
30
+ const base = { change, op, provider, resolved, drift: [] };
31
+ if (!step)
32
+ return { ...base, live: null, diffs: op.diff(null, resolved.params), desired: new Set() };
33
+ const e = recorded(rc, change, provider, step.key);
34
+ const verified = step.observable && (await op.read(rc.adapterContext(change.adapter, provider), resolved.params)) !== null;
35
+ const confirmed = e?.manual?.how === "confirmed" && e.hash === rc.ledger.keyed(step.hash);
36
+ const done = verified || confirmed;
37
+ const label = manualLabel(step);
38
+ const live = done ? { resources: [{ key: step.key, id: "manual", hash: step.hash, label }], outputs: {} } : null;
39
+ const inspection = { ...base, live, diffs: [manualDiff(step, e, done)], desired: new Set([step.key]), manual: { step, done, verified } };
40
+ if (e?.manual?.how === "verified" && !verified) {
41
+ inspection.drift.push({ kind: "missing", adapter: change.adapter, line: change.id, resource: { key: step.key, id: e.id, label }, message: `${label} was seen done by its verify request, which no longer sees it. It is a step to do again.` });
42
+ }
43
+ return inspection;
44
+ }
45
+ function manualDiff(step, e, done) {
46
+ const label = manualLabel(step);
47
+ if (done)
48
+ return { key: step.key, kind: "unchanged", label };
49
+ // Recorded before with other instructions (or seen done before): to do again, as an update of the step.
50
+ const before = e?.manual ? { state: "literal", value: e.manual.title } : { state: "absent" };
51
+ return { key: step.key, kind: e ? "update" : "create", label, before, after: { state: "literal", value: step.title } };
52
+ }
53
+ /** The step as shown to the person who must do it. Text is masked like every output. */
54
+ export function todoOf(rc, line, step, action) {
55
+ const instructions = action === "do" ? step.instructions : (step.undo ?? "");
56
+ return { line, title: rc.redactor.redact(step.title), action, instructions: rc.redactor.redact(instructions), observable: step.observable };
57
+ }
58
+ /** The waiting receipt line of a manual step nobody confirmed yet. */
59
+ export function pendingLine(line, title, action) {
60
+ Object.assign(line, {
61
+ status: "waiting",
62
+ waitingFor: CONFIRMATION,
63
+ errorCode: "MANUAL_STEP_PENDING",
64
+ error: `manual step \`${title}\` ${action === "do" ? "is not done" : "must be undone"}; a person does it, then confirms it`,
65
+ });
66
+ }
67
+ /**
68
+ * The ledger entry that records a done step: who confirmed it and when, or when a verify request first saw it.
69
+ * Keeps the previous record when nothing about the step changed, so the first confirmation stays on file.
70
+ */
71
+ export function manualEntry(rc, change, provider, state, confirmedNow, at) {
72
+ const { step } = state;
73
+ const prev = recorded(rc, change, provider, step.key);
74
+ const hash = rc.ledger.keyed(step.hash);
75
+ const how = confirmedNow ? "confirmed" : state.verified ? "verified" : (prev?.manual?.how ?? "confirmed");
76
+ const kept = prev?.manual && prev.hash === hash && prev.manual.how === how && !confirmedNow;
77
+ const redact = (t) => rc.redactor.redact(t);
78
+ const manual = kept
79
+ ? prev.manual
80
+ : { title: redact(step.title), ...(step.undo ? { undo: redact(step.undo) } : {}), how, ...(confirmedNow ? { by: rc.opts.confirmedBy.trim() } : {}), at };
81
+ const entry = { adapter: change.adapter, op: change.op, provider, key: step.key, id: "manual", hash, label: manualLabel(step), createdBy: "sponson", line: change.id, manual };
82
+ return { entry, changed: !kept || prev.line !== change.id };
83
+ }
84
+ /** `confirm` needs a person's name, and may name only manual lines active in this run. */
85
+ export function checkConfirm(opts, lines) {
86
+ const confirm = opts.confirm ?? [];
87
+ if (confirm.length === 0)
88
+ return;
89
+ if (!(opts.confirmedBy ?? "").trim())
90
+ throw new SponsonError("USAGE", `Confirming ${confirm.map((l) => `\`${l}\``).join(", ")} needs the name of the person who did it (confirmedBy).`, { confirm });
91
+ const manual = new Set(lines.filter((l) => l.op.manual).map((l) => l.id));
92
+ const wrong = confirm.filter((id) => !manual.has(id));
93
+ if (wrong.length) {
94
+ throw new SponsonError("USAGE", `Cannot confirm ${wrong.map((id) => `\`${id}\``).join(", ")}: only manual steps can be confirmed. Manual steps here: ${[...manual].join(", ") || "(none)"}`, { confirm: wrong });
95
+ }
96
+ }
97
+ /**
98
+ * Destroy a manual step's record: there is nothing to delete at a provider, but a person may have to undo it. With
99
+ * no `undo`, or once confirmed, the record is forgotten; otherwise the line waits for that confirmation and the undo
100
+ * instructions are returned for the person.
101
+ */
102
+ export function destroyManual(rc, line, entries, at) {
103
+ const todos = [];
104
+ const confirmed = (rc.opts.confirm ?? []).includes(line.id);
105
+ for (const e of entries) {
106
+ const m = e.manual;
107
+ if (m.undo && !confirmed) {
108
+ pendingLine(line, m.title, "undo");
109
+ todos.push({ line: line.id, title: m.title, action: "undo", instructions: m.undo, observable: false });
110
+ continue;
111
+ }
112
+ rc.ledger.delete(e);
113
+ line.notes = { ...line.notes, manual: m.undo ? { undoneBy: rc.opts.confirmedBy.trim(), undoneAt: at } : { nothingToUndo: true } };
114
+ }
115
+ return todos;
116
+ }
117
+ /** Lines `confirm` named that this run did not confirm (still waiting on an input, or done already). */
118
+ export function unusedConfirmations(opts, used) {
119
+ const unused = (opts.confirm ?? []).filter((id) => !used.has(id));
120
+ if (unused.length === 0)
121
+ return undefined;
122
+ return `Not confirmed: ${unused.map((id) => `\`${id}\``).join(", ")} (done already, or still waiting on an input, so there was nothing to confirm yet).`;
123
+ }
124
+ //# sourceMappingURL=manual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manual.js","sourceRoot":"","sources":["../../src/engine/manual.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { LineOutputs, ResolveResult } from "../resolve.js";
2
+ import type { ApplyResult, LedgerEntry, Literal, OpSpec } from "../types.js";
3
+ /**
4
+ * Once-only outputs (ADR 0018): a value only the create response carries. The ledger never holds the value, only
5
+ * keyed fingerprints of it: on the producer, the one its create returned (`onceFingerprints`); on each dependent, the
6
+ * one it was last written with (`onceInputs`). Equal fingerprints mean the dependent still holds the current value,
7
+ * so a later run that cannot know the value may leave it alone (`{ keep: true }`); anything else is refused.
8
+ */
9
+ /** Keyed fingerprint of a value: never reversible, keyed per scope like every hash in the ledger. */
10
+ export type Fingerprint = (value: Literal) => string;
11
+ /**
12
+ * The producer's fingerprints after a write: those of the once outputs `result` returned, over the previous
13
+ * resource's unless the write created something (a create starts a new value).
14
+ */
15
+ export declare function producedFingerprints(op: OpSpec, result: ApplyResult, before: LedgerEntry[], fp: Fingerprint): Record<string, string>;
16
+ /**
17
+ * A dependent's fingerprints after a write: the once values it was resolved with in this run, and, for references
18
+ * that stood as `{ keep: true }`, the fingerprints it already had.
19
+ */
20
+ export declare function consumedFingerprints(resolved: ResolveResult, before: LedgerEntry[], outputs: Map<string, LineOutputs>, fp: Fingerprint): Record<string, string>;
21
+ /**
22
+ * True when every resource of line `lineId` was last written with the once value `line.output` that the producer's
23
+ * current resource returned. False for a dependent added later, an adopted producer (no fingerprint), or a dependent
24
+ * that never held it.
25
+ */
26
+ export declare function holdsCurrentValue(ledger: LedgerEntry[], lineId: string, ref: string, line: string, output: string): boolean;
@@ -0,0 +1,48 @@
1
+ /**
2
+ * The producer's fingerprints after a write: those of the once outputs `result` returned, over the previous
3
+ * resource's unless the write created something (a create starts a new value).
4
+ */
5
+ export function producedFingerprints(op, result, before, fp) {
6
+ const out = result.created.length ? {} : { ...before.find((e) => e.onceFingerprints)?.onceFingerprints };
7
+ for (const [name, spec] of Object.entries(op.outputs)) {
8
+ const v = result.outputs[name];
9
+ if (spec.once && v !== undefined)
10
+ out[name] = fp(v);
11
+ }
12
+ return out;
13
+ }
14
+ /**
15
+ * A dependent's fingerprints after a write: the once values it was resolved with in this run, and, for references
16
+ * that stood as `{ keep: true }`, the fingerprints it already had.
17
+ */
18
+ export function consumedFingerprints(resolved, before, outputs, fp) {
19
+ const out = {};
20
+ const had = before.find((e) => e.onceInputs)?.onceInputs ?? {};
21
+ for (const s of resolved.spent) {
22
+ const was = had[s.ref];
23
+ if (s.kept && was)
24
+ out[s.ref] = was;
25
+ }
26
+ for (const input of Object.values(resolved.inputs)) {
27
+ if (input.state !== "resolved" || !input.dependsOn || !input.ref)
28
+ continue;
29
+ const lo = outputs.get(input.dependsOn);
30
+ const output = input.ref.slice(input.dependsOn.length + 1);
31
+ const value = lo?.values[output];
32
+ if (lo?.specs[output]?.once && value !== undefined)
33
+ out[input.ref] = fp(value);
34
+ }
35
+ return out;
36
+ }
37
+ /**
38
+ * True when every resource of line `lineId` was last written with the once value `line.output` that the producer's
39
+ * current resource returned. False for a dependent added later, an adopted producer (no fingerprint), or a dependent
40
+ * that never held it.
41
+ */
42
+ export function holdsCurrentValue(ledger, lineId, ref, line, output) {
43
+ const entries = ledger.filter((e) => e.createdBy !== "intent");
44
+ const current = entries.find((e) => e.line === line && e.onceFingerprints?.[output])?.onceFingerprints?.[output];
45
+ const mine = entries.filter((e) => e.line === lineId);
46
+ return current !== undefined && mine.length > 0 && mine.every((e) => e.onceInputs?.[ref] === current);
47
+ }
48
+ //# sourceMappingURL=once.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"once.js","sourceRoot":"","sources":["../../src/engine/once.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { dependenciesOf } from "../plan.js";
2
2
  import { scopeDrift } from "./drift.js";
3
3
  import { staleness } from "./history.js";
4
4
  import { inspectLine, waitingOn } from "./inspect.js";
5
+ import { todoOf } from "./manual.js";
5
6
  import { hasExternalOutputs, planOutputs } from "./outputs.js";
6
7
  import { prepare } from "./prepare.js";
7
8
  import { RunContext } from "./run-context.js";
@@ -93,12 +94,28 @@ async function planLine(rc, prepared, walk, c) {
93
94
  if (wait.event)
94
95
  line.waitingFor = wait.event;
95
96
  }
96
- else if (inspection.diffs.some((d) => d.kind === "create"))
97
- line.status = "create";
98
- else if (inspection.diffs.some((d) => d.kind === "update"))
99
- line.status = "update";
97
+ else if (inspection.manual && !inspection.manual.done) {
98
+ line.status = "todo";
99
+ line.manual = todoOf(rc, c.id, inspection.manual.step, "do");
100
+ }
101
+ else
102
+ line.status = writeStatus(rc, inspection);
100
103
  return line;
101
104
  }
105
+ /** What apply would write for an inspected line that is neither refused, waiting nor a manual step to do. */
106
+ function writeStatus(rc, inspection) {
107
+ if (inspection.action)
108
+ return inspection.action.run ? "run" : "unchanged";
109
+ if (inspection.diffs.some((d) => d.kind === "create") || recreating(rc, inspection))
110
+ return "create";
111
+ if (inspection.diffs.some((d) => d.kind === "update"))
112
+ return "update";
113
+ return "unchanged";
114
+ }
115
+ /** The run recreates this existing line (`recreate`), so its `once` outputs will flow again. */
116
+ function recreating(rc, inspection) {
117
+ return inspection.live !== null && (rc.opts.recreate ?? []).includes(inspection.change.id);
118
+ }
102
119
  /** The line's outputs as they are live right now, including external ones whose event already happened. */
103
120
  async function knownOutputs(rc, walk, inspection) {
104
121
  const { change: c, op, live } = inspection;
@@ -110,7 +127,9 @@ async function knownOutputs(rc, walk, inspection) {
110
127
  values = { ...values, ...ext };
111
128
  }
112
129
  rc.guardOutputs(values, op.outputs);
113
- walk.outputs.set(c.id, { values: values, specs: op.outputs });
130
+ // A resource that exists and that apply would not create again has shown its `once` outputs already.
131
+ const spent = live !== null && !inspection.diffs.some((d) => d.kind === "create") && !recreating(rc, inspection);
132
+ walk.outputs.set(c.id, { values: values, specs: op.outputs, spent });
114
133
  return planOutputs(values, op.outputs);
115
134
  }
116
135
  //# sourceMappingURL=plan.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/engine/plan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/engine/plan.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { Change, OpSpec } from "../types.js";
1
+ import { type Change, type OpSpec } from "../types.js";
2
2
  import type { RunOptions } from "./types.js";
3
3
  /** Everything about a run that follows from the plan and context alone, before touching any provider. */
4
4
  export interface Prepared {
@@ -3,6 +3,8 @@ import { SponsonError } from "../errors.js";
3
3
  import { orderChanges, outputRefs } from "../graph.js";
4
4
  import { changesFor } from "../plan.js";
5
5
  import { secretRefs } from "../resolve.js";
6
+ import { isFromRef, isSecretRef } from "../types.js";
7
+ import { providerOf } from "./run-context.js";
6
8
  export function prepare(opts) {
7
9
  const { plan, ctx, registry } = opts;
8
10
  if (!plan.environments.includes(ctx.env)) {
@@ -12,29 +14,29 @@ export function prepare(opts) {
12
14
  });
13
15
  }
14
16
  const ordered = orderChanges(changesFor(plan, ctx.env), plan.changes);
17
+ checkRecreate(opts.recreate ?? [], ordered, ctx.env, registry);
15
18
  const ops = new Map();
19
+ const providers = new Map();
16
20
  const params = new Map();
17
21
  const refs = new Set();
18
22
  const productionLines = [];
19
- for (const c of ordered)
20
- ops.set(c.id, registry.op(c.adapter, c.op));
23
+ for (const c of ordered) {
24
+ const op = specialize(registry.op(c.adapter, c.op), c);
25
+ // A provider block the op cannot use (an unknown API name) must fail here, before any provider call.
26
+ providers.set(c.id, providerOf(plan.providers[c.adapter] ?? {}, op, c));
27
+ ops.set(c.id, op);
28
+ }
21
29
  for (const c of ordered) {
22
30
  const op = ops.get(c.id);
23
- // Output names are static: a typo must fail at plan time, not after half an apply.
24
- for (const ref of outputRefs(c)) {
25
- const target = ordered.find((x) => x.id === ref.line);
26
- const known = Object.keys(ops.get(target.id).outputs);
27
- if (!known.includes(ref.output)) {
28
- throw new SponsonError("REF_OUTPUT_UNKNOWN", `Line \`${c.id}\` reads \`${ref.line}.${ref.output}\`, but ${target.adapter}.${target.op} has no output \`${ref.output}\`. Known: ${known.join(", ") || "(none)"}`, { id: c.id, ref: `${ref.line}.${ref.output}`, known });
29
- }
30
- }
31
+ checkRefs(c, ordered, ops);
31
32
  let p = interpolate(c.params, ctx, `line \`${c.id}\``);
32
33
  if (op.defaults)
33
34
  p = op.defaults(p, ctx);
34
35
  params.set(c.id, p);
35
36
  for (const r of secretRefs(p))
36
37
  refs.add(r);
37
- if (ctx.env !== "production" && op.writesEnvironment?.(p, ctx) === "production")
38
+ // The provider block counts too: a LaunchDarkly block naming a production environment writes production.
39
+ if (ctx.env !== "production" && op.writesEnvironment?.(p, ctx, providers.get(c.id)) === "production")
38
40
  productionLines.push(c.id);
39
41
  }
40
42
  return {
@@ -46,6 +48,51 @@ export function prepare(opts) {
46
48
  productionLines,
47
49
  };
48
50
  }
51
+ /** A line's references, before any provider call: every output it reads exists, every credential it takes is masked. */
52
+ function checkRefs(c, ordered, ops) {
53
+ // Output names are static: a typo must fail at plan time, not after half an apply.
54
+ for (const ref of outputRefs(c)) {
55
+ const target = ordered.find((x) => x.id === ref.line);
56
+ const known = Object.keys(ops.get(target.id).outputs);
57
+ if (!known.includes(ref.output)) {
58
+ throw new SponsonError("REF_OUTPUT_UNKNOWN", `Line \`${c.id}\` reads \`${ref.line}.${ref.output}\`, but ${target.adapter}.${target.op} has no output \`${ref.output}\`. Known: ${known.join(", ") || "(none)"}`, { id: c.id, ref: `${ref.line}.${ref.output}`, known });
59
+ }
60
+ }
61
+ for (const name of ops.get(c.id).credentialInputs?.(c.params) ?? [])
62
+ checkCredentialInput(c, name, ordered, ops);
63
+ }
64
+ /**
65
+ * A param that carries a credential (`OpSpec.credentialInputs`) must be a reference whose value Sponson masks: a
66
+ * `{ secret }`, or a `{ from }` naming a sensitive output that later runs can read again (not `once`, ADR 0018).
67
+ * A literal would put the credential in the plan file; a non-sensitive output would show it in receipts.
68
+ */
69
+ function checkCredentialInput(c, name, ordered, ops) {
70
+ const v = c.params[name];
71
+ if (isSecretRef(v))
72
+ return;
73
+ const fail = (why) => new SponsonError("PARAM_INVALID", `${c.adapter}: line \`${c.id}\`: \`${name}\` ${why}`, { adapter: c.adapter, id: c.id, param: name });
74
+ if (!isFromRef(v) || Object.keys(v).length !== 1)
75
+ throw fail("must be `{ secret: <reference> }` or `{ from: <line>.<output> }` naming a sensitive output, never a literal credential");
76
+ const [line, ...rest] = v.from.split(".");
77
+ const target = ordered.find((x) => x.id === line);
78
+ const spec = target ? ops.get(target.id).outputs[rest.join(".")] : undefined;
79
+ if (!spec)
80
+ return; // an unknown line or output is reported as REF_UNKNOWN / REF_OUTPUT_UNKNOWN
81
+ if (spec.sensitive !== true)
82
+ throw fail(`reads \`${v.from}\`, which is not a sensitive output: a credential must never reach receipts or output`);
83
+ if (spec.once === true)
84
+ throw fail(`reads \`${v.from}\`, which the provider shows only when it is created (once): later runs could not authenticate with it`);
85
+ }
86
+ /**
87
+ * The op as this line uses it: with the outputs the line declares when the op derives them from its params
88
+ * (`OpSpec.outputsFor`), so references to them are checked here like any other output. The prototype keeps every
89
+ * other member of the op.
90
+ */
91
+ function specialize(op, c) {
92
+ if (!op.outputsFor)
93
+ return op;
94
+ return Object.assign(Object.create(op), { outputs: op.outputsFor(c.params) });
95
+ }
49
96
  /**
50
97
  * Approval is a non-empty name; whitespace is not a person. Only `opts.approvedBy` counts: where it comes from
51
98
  * (a flag, an environment variable, an approval workflow) is the caller's business.
@@ -66,4 +113,17 @@ export function requireApproval(opts, prepared) {
66
113
  }
67
114
  return approvedBy;
68
115
  }
116
+ /** `recreate` may name only lines active in this environment, and never a manual step (a person did it). */
117
+ function checkRecreate(recreate, ordered, env, registry) {
118
+ const unknown = recreate.filter((id) => !ordered.some((c) => c.id === id));
119
+ if (unknown.length) {
120
+ throw new SponsonError("USAGE", `Cannot recreate ${unknown.map((id) => `\`${id}\``).join(", ")}: no such line in environment ${env}. Lines: ${ordered.map((c) => c.id).join(", ")}`, {
121
+ recreate: unknown,
122
+ });
123
+ }
124
+ const manual = ordered.filter((c) => recreate.includes(c.id) && registry.op(c.adapter, c.op).manual);
125
+ if (manual.length) {
126
+ throw new SponsonError("USAGE", `Cannot recreate ${manual.map((c) => `\`${c.id}\``).join(", ")}: a manual step is done by a person; change its instructions to make it a step to do again.`, { recreate: manual.map((c) => c.id) });
127
+ }
128
+ }
69
129
  //# sourceMappingURL=prepare.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../src/engine/prepare.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../src/engine/prepare.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { type ErrorCode } from "../errors.js";
2
2
  import { Redactor } from "../redact.js";
3
- import type { AdapterContext, LedgerEntry, Receipt } from "../types.js";
3
+ import type { AdapterContext, Change, LedgerEntry, OpSpec, Receipt } from "../types.js";
4
4
  import { Ledger } from "./ledger.js";
5
5
  import type { Prepared } from "./prepare.js";
6
6
  import type { RunOptions } from "./types.js";
@@ -40,7 +40,11 @@ export declare class RunContext {
40
40
  guardOutputs(values: Record<string, unknown>, specs: Record<string, {
41
41
  sensitive?: boolean;
42
42
  }>): void;
43
- provider(adapter: string): Record<string, unknown>;
43
+ /**
44
+ * The provider block a line's resources live in: `providers.<adapter>`, narrowed by the op's `providerFor` when it
45
+ * has one (the generic `http` adapter keeps one block per API there). It is part of every ledger identity.
46
+ */
47
+ provider(change: Change): Record<string, unknown>;
44
48
  foreignScopeOf(entry: Pick<LedgerEntry, "adapter" | "provider" | "key">): string | undefined;
45
49
  adapterContext(adapter: string, provider: Record<string, unknown>, intend?: (keys: string[]) => Promise<void>): AdapterContext;
46
50
  /** What was thrown, redacted, with its code when it is a SponsonError. Anything may be thrown, not only Errors. */
@@ -49,3 +53,5 @@ export declare class RunContext {
49
53
  code?: ErrorCode;
50
54
  };
51
55
  }
56
+ /** `block` as the op narrows it for `change` (see `OpSpec.providerFor`); the whole block when the op does not. */
57
+ export declare function providerOf(block: Record<string, unknown>, op: OpSpec, change: Change): Record<string, unknown>;
@@ -101,8 +101,12 @@ export class RunContext {
101
101
  if (specs[k]?.sensitive && typeof v === "string")
102
102
  this.redactor.register(v);
103
103
  }
104
- provider(adapter) {
105
- return this.opts.plan.providers[adapter] ?? {};
104
+ /**
105
+ * The provider block a line's resources live in: `providers.<adapter>`, narrowed by the op's `providerFor` when it
106
+ * has one (the generic `http` adapter keeps one block per API there). It is part of every ledger identity.
107
+ */
108
+ provider(change) {
109
+ return providerOf(this.opts.plan.providers[change.adapter] ?? {}, this.opts.registry.op(change.adapter, change.op), change);
106
110
  }
107
111
  foreignScopeOf(entry) {
108
112
  return this.foreign.get(identity(entry.adapter, entry.provider, entry.key));
@@ -116,6 +120,7 @@ export class RunContext {
116
120
  log: (m) => log(this.redactor.redact(`[${adapter}] ${m}`)),
117
121
  intend,
118
122
  redact: (t) => this.redactor.redact(t),
123
+ secret: (v) => this.redactor.register(v),
119
124
  };
120
125
  }
121
126
  /** What was thrown, redacted, with its code when it is a SponsonError. Anything may be thrown, not only Errors. */
@@ -125,4 +130,8 @@ export class RunContext {
125
130
  return isSponsonError(e) ? { message, code: e.code } : { message };
126
131
  }
127
132
  }
133
+ /** `block` as the op narrows it for `change` (see `OpSpec.providerFor`); the whole block when the op does not. */
134
+ export function providerOf(block, op, change) {
135
+ return op.providerFor ? op.providerFor(block, change.params) : block;
136
+ }
128
137
  //# sourceMappingURL=run-context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-context.js","sourceRoot":"","sources":["../../src/engine/run-context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-context.js","sourceRoot":"","sources":["../../src/engine/run-context.ts"],"names":[],"mappings":"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"}