@staticforge/iac 0.0.0-stage → 0.1.1

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.
@@ -0,0 +1,314 @@
1
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { ErrorCode, SforgeError, getTarget } from '@staticforge/core';
4
+ import { resolveEngine } from './engine.js';
5
+ import { apply, hasLocalState, init, outputs, plan, publicOutputs, refreshState, } from './operations.js';
6
+ import { runEngine } from './runner.js';
7
+ import { extraHclDir, workspaceDir, writeWorkspace } from './workspace.js';
8
+ /** `.sforge/state/<target>.json`: the non-secret outputs of the last apply. */
9
+ export function stateCachePath(rootDir, targetName) {
10
+ return join(rootDir, '.sforge', 'state', `${targetName}.json`);
11
+ }
12
+ export function readCachedOutputs(rootDir, targetName) {
13
+ const path = stateCachePath(rootDir, targetName);
14
+ if (!existsSync(path))
15
+ return undefined;
16
+ try {
17
+ return JSON.parse(readFileSync(path, 'utf8'));
18
+ }
19
+ catch {
20
+ return undefined;
21
+ }
22
+ }
23
+ function writeCachedOutputs(rootDir, cache) {
24
+ const path = stateCachePath(rootDir, cache.target);
25
+ mkdirSync(dirname(path), { recursive: true });
26
+ const temp = `${path}.tmp`;
27
+ writeFileSync(temp, `${JSON.stringify(cache, null, 2)}\n`);
28
+ renameSync(temp, path);
29
+ }
30
+ /** Resolve the engine and prepare the target's spec. */
31
+ async function open(options) {
32
+ const env = options.env ?? process.env;
33
+ const target = getTarget(options.config, options.targetName);
34
+ if (target.provider !== options.profile.provider) {
35
+ throw new SforgeError(ErrorCode.Internal, `Profile ${options.profile.provider} used for ${target.provider}`);
36
+ }
37
+ const engine = options.engine ??
38
+ (await resolveEngine({
39
+ engine: options.config.iac.engine,
40
+ ...(options.config.iac.version !== undefined && { version: options.config.iac.version }),
41
+ env,
42
+ logger: options.logger,
43
+ }));
44
+ options.logger.debug(`Using ${engine.name} ${engine.version} (${engine.path})`);
45
+ const prepared = await options.profile.prepare({
46
+ rootDir: options.rootDir,
47
+ config: options.config,
48
+ targetName: options.targetName,
49
+ target,
50
+ env,
51
+ logger: options.logger,
52
+ ...(options.inputs && { inputs: options.inputs }),
53
+ ...(options.purpose && { purpose: options.purpose }),
54
+ });
55
+ if (options.localState)
56
+ prepared.spec = { ...prepared.spec, backend: { type: 'local', config: {} } };
57
+ const ws = {
58
+ engine,
59
+ dir: workspaceDir(options.rootDir, options.targetName),
60
+ env: { ...env, ...prepared.spec.env },
61
+ logger: options.logger,
62
+ };
63
+ return { engine, prepared, ws };
64
+ }
65
+ function write(options, ws, spec) {
66
+ writeWorkspace({
67
+ dir: ws.dir,
68
+ spec,
69
+ vendor: options.config.iac.vendor,
70
+ extraDir: extraHclDir(options.rootDir, options.targetName),
71
+ });
72
+ }
73
+ function withoutExpectedDrift(planned, prepared) {
74
+ const expected = new Set(prepared.expectedDrift ?? []);
75
+ return { ...planned, drift: planned.drift.filter((d) => !expected.has(d.address)) };
76
+ }
77
+ function requireState(state, targetName) {
78
+ if (state.exists)
79
+ return;
80
+ throw new SforgeError(ErrorCode.StateMissing, `The state backend for "${targetName}" (${state.description}) does not exist yet`, {
81
+ details: { backend: state.id },
82
+ hint: `Create it with \`sforge provision ${targetName} --bootstrap-state\` (or use --local-state for an experiment).`,
83
+ });
84
+ }
85
+ /**
86
+ * Create the remote state backend: apply the bootstrap module with local
87
+ * state, then migrate that state into the backend it created. An existing
88
+ * backend is left alone, so bootstrapping is safe to repeat.
89
+ */
90
+ export async function bootstrapState(options) {
91
+ const { state, logger } = options;
92
+ const ws = {
93
+ engine: options.engine,
94
+ dir: workspaceDir(options.rootDir, join('_state', state.id)),
95
+ env: { ...(options.env ?? process.env), ...state.bootstrap.env },
96
+ logger,
97
+ };
98
+ const result = { backend: state.id, description: state.description };
99
+ // A previous run may have created the storage but failed to migrate its state.
100
+ const pending = hasLocalState(ws.dir);
101
+ if (state.exists && !pending) {
102
+ logger.info(`State backend ${state.description} already exists`);
103
+ return { ...result, created: false };
104
+ }
105
+ if (!pending) {
106
+ logger.info(`Creating state backend ${state.description}`);
107
+ writeWorkspace({
108
+ dir: ws.dir,
109
+ spec: { ...state.bootstrap, backend: { type: 'local', config: {} } },
110
+ });
111
+ await init(ws);
112
+ const planned = await plan(ws);
113
+ if (planned.planFile !== undefined) {
114
+ if (options.confirm &&
115
+ !(await options.confirm(`Create the state backend ${state.description}?`, planned))) {
116
+ throw new SforgeError(ErrorCode.Aborted, 'Bootstrap cancelled');
117
+ }
118
+ await apply(ws, planned.planFile);
119
+ }
120
+ }
121
+ logger.info(`Moving the bootstrap state into ${state.description}`);
122
+ writeWorkspace({ dir: ws.dir, spec: state.bootstrap });
123
+ await init(ws, { migrateState: true });
124
+ for (const file of ['terraform.tfstate', 'terraform.tfstate.backup', 'tfplan']) {
125
+ rmSync(join(ws.dir, file), { force: true });
126
+ }
127
+ return { ...result, created: true };
128
+ }
129
+ /** `sforge provision`: plan, and unless `diff`, apply after confirmation. */
130
+ export async function provision(options) {
131
+ const { engine, prepared, ws } = await open(options);
132
+ const { spec, state } = prepared;
133
+ const result = {
134
+ target: options.targetName,
135
+ provider: options.profile.provider,
136
+ engine: { name: engine.name, version: engine.version },
137
+ workspace: ws.dir,
138
+ };
139
+ let bootstrap;
140
+ if (!options.localState) {
141
+ if (options.bootstrapState && !options.diff) {
142
+ bootstrap = await bootstrapState({
143
+ ...options,
144
+ engine,
145
+ state,
146
+ ...(options.confirm && { confirm: options.confirm }),
147
+ });
148
+ }
149
+ else {
150
+ requireState(state, options.targetName);
151
+ }
152
+ }
153
+ write(options, ws, spec);
154
+ await init(ws);
155
+ const notices = [];
156
+ if (prepared.prePhase !== undefined && !options.diff) {
157
+ const first = await plan(ws, { targets: prepared.prePhase.targets });
158
+ if (first.planFile !== undefined) {
159
+ if (options.confirm &&
160
+ !(await options.confirm(`Create ${prepared.prePhase.targets.join(', ')} first?`, first))) {
161
+ throw new SforgeError(ErrorCode.Aborted, 'Provisioning cancelled; nothing was changed');
162
+ }
163
+ await apply(ws, first.planFile);
164
+ }
165
+ const notice = prepared.prePhase.describe(publicOutputs(await outputs(ws)));
166
+ if (notice !== undefined) {
167
+ notices.push(notice);
168
+ options.logger.info(notice);
169
+ }
170
+ if (options.noWait) {
171
+ rmSync(join(ws.dir, 'tfplan'), { force: true });
172
+ return {
173
+ ...result,
174
+ ...(bootstrap && { bootstrap }),
175
+ plan: first,
176
+ applied: first.planFile !== undefined,
177
+ notices,
178
+ pending: true,
179
+ };
180
+ }
181
+ }
182
+ const planned = withoutExpectedDrift(await plan(ws), prepared);
183
+ const base = { ...result, ...(bootstrap && { bootstrap }), plan: planned, notices };
184
+ if (options.diff || planned.planFile === undefined) {
185
+ if (!options.diff) {
186
+ const values = publicOutputs(await outputs(ws));
187
+ cache(options, engine, values);
188
+ return { ...base, applied: false, outputs: values };
189
+ }
190
+ return { ...base, applied: false };
191
+ }
192
+ if (options.confirm &&
193
+ !(await options.confirm(`Apply these changes to "${options.targetName}"?`, planned))) {
194
+ throw new SforgeError(ErrorCode.Aborted, 'Provisioning cancelled; nothing was changed');
195
+ }
196
+ const applied = await apply(ws, planned.planFile);
197
+ rmSync(join(ws.dir, planned.planFile), { force: true });
198
+ await refreshState(ws);
199
+ const values = publicOutputs(await outputs(ws));
200
+ cache(options, engine, values);
201
+ return { ...base, applied: true, apply: applied, outputs: values };
202
+ }
203
+ function cache(options, engine, values) {
204
+ writeCachedOutputs(options.rootDir, {
205
+ target: options.targetName,
206
+ provider: options.profile.provider,
207
+ engine: engine.name,
208
+ updatedAt: new Date().toISOString(),
209
+ outputs: values,
210
+ });
211
+ }
212
+ /**
213
+ * The target's non-secret outputs: from `.sforge/state/<target>.json`, or
214
+ * (e.g. in CI, where that cache is not committed) read from the state.
215
+ */
216
+ export async function targetOutputs(options) {
217
+ const cached = readCachedOutputs(options.rootDir, options.targetName);
218
+ if (cached !== undefined)
219
+ return cached.outputs;
220
+ const { engine, prepared, ws } = await open({ ...options, purpose: 'outputs' });
221
+ if (!options.localState)
222
+ requireState(prepared.state, options.targetName);
223
+ write(options, ws, prepared.spec);
224
+ await init(ws);
225
+ const values = publicOutputs(await outputs(ws));
226
+ if (Object.keys(values).length === 0) {
227
+ throw new SforgeError(ErrorCode.NotProvisioned, `Target "${options.targetName}" has not been provisioned`, { hint: `Run \`sforge provision ${options.targetName}\` first.` });
228
+ }
229
+ cache(options, engine, values);
230
+ return values;
231
+ }
232
+ /** `sforge status`: a refresh-only plan, reporting drift and the current outputs. */
233
+ export async function detectDrift(options) {
234
+ const { engine, prepared, ws } = await open(options);
235
+ if (!options.localState)
236
+ requireState(prepared.state, options.targetName);
237
+ write(options, ws, prepared.spec);
238
+ await init(ws);
239
+ const planned = await plan(ws, { refreshOnly: true });
240
+ rmSync(join(ws.dir, 'tfplan'), { force: true });
241
+ const expected = new Set(prepared.expectedDrift ?? []);
242
+ const drift = planned.drift.filter((d) => !expected.has(d.address));
243
+ const values = publicOutputs(await outputs(ws));
244
+ return {
245
+ target: options.targetName,
246
+ provider: options.profile.provider,
247
+ engine: { name: engine.name, version: engine.version },
248
+ drift,
249
+ // A refresh-only plan has changes exactly when something drifted.
250
+ drifted: drift.length > 0,
251
+ outputs: values,
252
+ };
253
+ }
254
+ /** `sforge destroy`: remove every resource of the target (the state backend stays). */
255
+ export async function destroy(options) {
256
+ const { prepared, ws } = await open(options);
257
+ if (!options.localState)
258
+ requireState(prepared.state, options.targetName);
259
+ const base = { target: options.targetName, provider: options.profile.provider };
260
+ write(options, ws, prepared.spec);
261
+ await init(ws);
262
+ const planned = await plan(ws, { destroy: true });
263
+ if (planned.planFile === undefined)
264
+ return { ...base, plan: planned, destroyed: false };
265
+ if (options.confirm &&
266
+ !(await options.confirm(`Destroy every resource of "${options.targetName}"?`, planned))) {
267
+ throw new SforgeError(ErrorCode.Aborted, 'Destroy cancelled; nothing was changed');
268
+ }
269
+ if (prepared.preDestroyInputs !== undefined) {
270
+ // E.g. allow non-empty buckets to be deleted: this must be in state before destroying.
271
+ write(options, ws, {
272
+ ...prepared.spec,
273
+ module: {
274
+ ...prepared.spec.module,
275
+ inputs: { ...prepared.spec.module.inputs, ...prepared.preDestroyInputs },
276
+ },
277
+ });
278
+ const unlock = await plan(ws);
279
+ if (unlock.planFile !== undefined)
280
+ await apply(ws, unlock.planFile);
281
+ const replanned = await plan(ws, { destroy: true });
282
+ if (replanned.planFile !== undefined)
283
+ await apply(ws, replanned.planFile);
284
+ }
285
+ else {
286
+ await apply(ws, planned.planFile);
287
+ }
288
+ rmSync(join(ws.dir, 'tfplan'), { force: true });
289
+ rmSync(stateCachePath(options.rootDir, options.targetName), { force: true });
290
+ return { ...base, plan: planned, destroyed: true };
291
+ }
292
+ /** Generate the workspace and return it, for `sforge iac path` and the passthrough commands. */
293
+ export async function prepareWorkspace(options) {
294
+ const opened = await open(options);
295
+ write(options, opened.ws, opened.prepared.spec);
296
+ return opened;
297
+ }
298
+ /** `sforge iac <command> <target> [-- args]`: run the engine directly in the workspace. */
299
+ export async function passthrough(options) {
300
+ const { prepared, ws } = await prepareWorkspace(options);
301
+ if (!options.localState && options.command !== 'init')
302
+ requireState(prepared.state, options.targetName);
303
+ if (options.command !== 'init' && !existsSync(join(ws.dir, '.terraform')))
304
+ await init(ws);
305
+ const result = await runEngine(ws.engine, [options.command, ...options.args], {
306
+ cwd: ws.dir,
307
+ env: ws.env,
308
+ onStdout: options.onStdout,
309
+ onStderr: options.onStderr,
310
+ interactive: options.interactive,
311
+ });
312
+ return { ...result, workspace: ws.dir };
313
+ }
314
+ //# sourceMappingURL=provision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.js","sourceRoot":"","sources":["../src/provision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { type Engine } from './engine.js';
2
+ /** One line of the engine's machine-readable UI (`-json`). */
3
+ export interface EngineEvent {
4
+ type: string;
5
+ level: string;
6
+ message: string;
7
+ raw: Record<string, unknown>;
8
+ }
9
+ export interface EngineDiagnostic {
10
+ severity: 'error' | 'warning';
11
+ summary: string;
12
+ detail?: string;
13
+ /** Resource address the diagnostic is about. */
14
+ address?: string;
15
+ file?: string;
16
+ line?: number;
17
+ }
18
+ export interface RunResult {
19
+ exitCode: number;
20
+ events: EngineEvent[];
21
+ diagnostics: EngineDiagnostic[];
22
+ /** Non-JSON output (all of stdout without `-json`), for parsing or error messages. */
23
+ stdout: string;
24
+ stderr: string;
25
+ }
26
+ export interface RunOptions {
27
+ cwd: string;
28
+ env?: NodeJS.ProcessEnv;
29
+ /** Parse stdout as `-json` event lines (the caller adds `-json` to args). */
30
+ json?: boolean;
31
+ onEvent?: (event: EngineEvent) => void;
32
+ /** Raw output chunks, for passthrough commands. */
33
+ onStdout?: (chunk: string) => void;
34
+ onStderr?: (chunk: string) => void;
35
+ /** Inherit stdin so the engine can prompt (passthrough commands only). */
36
+ interactive?: boolean;
37
+ }
38
+ /** Environment for every engine run: non-interactive, no update checks, shared plugin cache. */
39
+ export declare function engineEnv(engine: Engine, env: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
40
+ /** Run the engine with `args`. Never throws for a non-zero exit: see {@link assertSucceeded}. */
41
+ export declare function runEngine(engine: Engine, args: string[], options: RunOptions): Promise<RunResult>;
42
+ /**
43
+ * Throw an SforgeError describing a failed run. Credential problems become
44
+ * SF_CLOUD_AUTH (with a login hint), everything else SF_IAC_FAILED.
45
+ */
46
+ export declare function assertSucceeded(result: RunResult, what: string, okCodes?: number[]): void;
47
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,aAAa,CAAC;AAErD,8DAA8D;AAC9D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,sFAAsF;IACtF,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACvC,mDAAmD;IACnD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,0EAA0E;IAC1E,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAUnF;AA8CD,iGAAiG;AACjG,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAkEjG;AAWD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,WAAM,GAAG,IAAI,CAiBpF"}
package/dist/runner.js ADDED
@@ -0,0 +1,151 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { mkdirSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { ErrorCode, SforgeError } from '@staticforge/core';
5
+ import { cacheRoot } from './engine.js';
6
+ /** Environment for every engine run: non-interactive, no update checks, shared plugin cache. */
7
+ export function engineEnv(engine, env) {
8
+ const pluginCache = env.TF_PLUGIN_CACHE_DIR || join(cacheRoot(env), 'plugins', engine.name);
9
+ mkdirSync(pluginCache, { recursive: true });
10
+ return {
11
+ ...env,
12
+ TF_IN_AUTOMATION: '1',
13
+ TF_INPUT: '0',
14
+ CHECKPOINT_DISABLE: '1',
15
+ TF_PLUGIN_CACHE_DIR: pluginCache,
16
+ };
17
+ }
18
+ function toDiagnostic(raw) {
19
+ const d = raw.diagnostic;
20
+ if (d === undefined || typeof d.summary !== 'string')
21
+ return undefined;
22
+ return {
23
+ severity: d.severity === 'warning' ? 'warning' : 'error',
24
+ summary: d.summary,
25
+ ...(d.detail && { detail: d.detail }),
26
+ ...(d.address && { address: d.address }),
27
+ ...(d.range?.filename && { file: d.range.filename }),
28
+ ...(d.range?.start?.line !== undefined && { line: d.range.start.line }),
29
+ };
30
+ }
31
+ /** Text diagnostics ("Error: ...") from runs without `-json`, such as `init`. */
32
+ function textDiagnostics(output) {
33
+ const result = [];
34
+ // eslint-disable-next-line no-control-regex
35
+ const lines = output.replace(/\x1b\[[0-9;]*m/g, '').split('\n');
36
+ for (let i = 0; i < lines.length; i++) {
37
+ const match = /^\s*[│|]?\s*(Error|Warning): (.+)$/.exec(lines[i]);
38
+ if (match === null)
39
+ continue;
40
+ const detail = [];
41
+ for (let j = i + 1; j < lines.length; j++) {
42
+ const text = lines[j].replace(/^\s*[│╵|]\s?/, '');
43
+ if (/^\s*(Error|Warning): /.test(text) || /^\s*╵/.test(lines[j]))
44
+ break;
45
+ detail.push(text);
46
+ }
47
+ result.push({
48
+ severity: match[1] === 'Warning' ? 'warning' : 'error',
49
+ summary: match[2].trim(),
50
+ ...(detail.join('\n').trim() !== '' && { detail: detail.join('\n').trim() }),
51
+ });
52
+ }
53
+ return result;
54
+ }
55
+ /** Run the engine with `args`. Never throws for a non-zero exit: see {@link assertSucceeded}. */
56
+ export function runEngine(engine, args, options) {
57
+ return new Promise((resolve, reject) => {
58
+ const child = spawn(engine.path, args, {
59
+ cwd: options.cwd,
60
+ env: engineEnv(engine, options.env ?? process.env),
61
+ stdio: [options.interactive ? 'inherit' : 'ignore', 'pipe', 'pipe'],
62
+ });
63
+ const events = [];
64
+ const diagnostics = [];
65
+ let stdout = '';
66
+ let stderr = '';
67
+ let pending = '';
68
+ const handleLine = (line) => {
69
+ if (line.trim() === '')
70
+ return;
71
+ let raw;
72
+ try {
73
+ raw = JSON.parse(line);
74
+ }
75
+ catch {
76
+ stdout += `${line}\n`;
77
+ return;
78
+ }
79
+ const event = {
80
+ type: typeof raw.type === 'string' ? raw.type : 'log',
81
+ level: typeof raw['@level'] === 'string' ? raw['@level'] : 'info',
82
+ message: typeof raw['@message'] === 'string' ? raw['@message'] : '',
83
+ raw,
84
+ };
85
+ events.push(event);
86
+ if (event.type === 'diagnostic') {
87
+ const diagnostic = toDiagnostic(raw);
88
+ if (diagnostic !== undefined)
89
+ diagnostics.push(diagnostic);
90
+ }
91
+ options.onEvent?.(event);
92
+ };
93
+ child.stdout.setEncoding('utf8').on('data', (chunk) => {
94
+ options.onStdout?.(chunk);
95
+ if (!options.json) {
96
+ stdout += chunk;
97
+ return;
98
+ }
99
+ pending += chunk;
100
+ const lines = pending.split('\n');
101
+ pending = lines.pop() ?? '';
102
+ lines.forEach(handleLine);
103
+ });
104
+ child.stderr.setEncoding('utf8').on('data', (chunk) => {
105
+ options.onStderr?.(chunk);
106
+ stderr += chunk;
107
+ });
108
+ child.on('error', (error) => reject(new SforgeError(ErrorCode.EngineMissing, `Could not run ${engine.path}: ${error.message}`, {
109
+ cause: error,
110
+ })));
111
+ child.on('close', (code) => {
112
+ if (options.json)
113
+ handleLine(pending);
114
+ if (!options.json || diagnostics.length === 0) {
115
+ diagnostics.push(...textDiagnostics(`${stdout}\n${stderr}`));
116
+ }
117
+ resolve({ exitCode: code ?? 1, events, diagnostics, stdout, stderr });
118
+ });
119
+ });
120
+ }
121
+ const AUTH_PATTERNS = [
122
+ /no valid credential sources/i,
123
+ /expiredtoken|token (has )?expired|sso session .* expired/i,
124
+ /failed to refresh cached credentials/i,
125
+ /invalidclienttokenid|signaturedoesnotmatch|unrecognizedclientexception/i,
126
+ /could not load credentials|no credentials/i,
127
+ /please run 'az login'|az login|AADSTS\d+/i,
128
+ ];
129
+ /**
130
+ * Throw an SforgeError describing a failed run. Credential problems become
131
+ * SF_CLOUD_AUTH (with a login hint), everything else SF_IAC_FAILED.
132
+ */
133
+ export function assertSucceeded(result, what, okCodes = [0]) {
134
+ if (okCodes.includes(result.exitCode))
135
+ return;
136
+ const errors = result.diagnostics.filter((d) => d.severity === 'error');
137
+ const summary = errors.length > 0
138
+ ? errors.map((d) => `${d.summary}${d.address ? ` (${d.address})` : ''}`).join('; ')
139
+ : result.stderr.trim().split('\n').slice(-3).join(' ') || `exit code ${result.exitCode}`;
140
+ const text = errors.map((d) => `${d.summary} ${d.detail ?? ''}`).join('\n') + result.stderr;
141
+ if (AUTH_PATTERNS.some((pattern) => pattern.test(text))) {
142
+ throw new SforgeError(ErrorCode.CloudAuth, `${what} failed: ${summary}`, {
143
+ details: { diagnostics: result.diagnostics },
144
+ hint: 'Sign in to the cloud provider (e.g. `aws sso login`, `az login`) and try again.',
145
+ });
146
+ }
147
+ throw new SforgeError(ErrorCode.IacFailed, `${what} failed: ${summary}`, {
148
+ details: { exitCode: result.exitCode, diagnostics: result.diagnostics },
149
+ });
150
+ }
151
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
package/dist/spec.d.ts ADDED
@@ -0,0 +1,87 @@
1
+ import type { Logger, SforgeConfig, TargetConfig } from '@staticforge/core';
2
+ /** Where OpenTofu/Terraform keeps a workspace's state. */
3
+ export interface IacBackend {
4
+ /** `local` writes `terraform.tfstate` into the workspace (experiments only). */
5
+ type: 's3' | 'azurerm' | 'local';
6
+ config: Record<string, unknown>;
7
+ }
8
+ /**
9
+ * Everything needed to generate a root workspace around one packaged module:
10
+ * providers, the module and its inputs, outputs and the backend.
11
+ */
12
+ export interface IacSpec {
13
+ requiredProviders: Record<string, {
14
+ source: string;
15
+ version: string;
16
+ }>;
17
+ /** Root provider configurations; several per name for aliases. */
18
+ providers: Record<string, Record<string, unknown>[]>;
19
+ module: {
20
+ /** Name of the module block (and of the vendored copy). */
21
+ name: string;
22
+ /** Absolute directory of the packaged HCL module. */
23
+ dir: string;
24
+ inputs: Record<string, unknown>;
25
+ /** Aliased providers passed to the module, e.g. `{ "aws.us_east_1": "aws.us_east_1" }`. */
26
+ providers?: Record<string, string>;
27
+ };
28
+ /** Module outputs re-exported as root outputs (and cached after apply). */
29
+ outputs: string[];
30
+ backend: IacBackend;
31
+ /** Extra environment variables for the engine. */
32
+ env?: Record<string, string>;
33
+ }
34
+ /** The remote state backend of a target, and how to create it. */
35
+ export interface StateBackend {
36
+ /** Stable id of the backend, e.g. "aws-123456789012-eu-central-1"; names the bootstrap workspace. */
37
+ id: string;
38
+ /** Human description, e.g. "s3://sforge-state-123456789012-eu-central-1". */
39
+ description: string;
40
+ /** Whether the backend's storage exists already. */
41
+ exists: boolean;
42
+ /** Workspace that creates the backend storage (with its own state stored in it once created). */
43
+ bootstrap: IacSpec;
44
+ }
45
+ export interface ProfileInput {
46
+ rootDir: string;
47
+ config: SforgeConfig;
48
+ targetName: string;
49
+ target: TargetConfig;
50
+ env: NodeJS.ProcessEnv;
51
+ logger: Logger;
52
+ /** Extra module inputs for this run. */
53
+ inputs?: Record<string, unknown>;
54
+ /**
55
+ * `outputs`: the workspace is only used to read outputs (e.g. a deploy in
56
+ * CI), so lookups that only affect inputs can be skipped.
57
+ */
58
+ purpose?: 'provision' | 'outputs';
59
+ }
60
+ export interface PreparedTarget {
61
+ spec: IacSpec;
62
+ state: StateBackend;
63
+ /**
64
+ * Resources that sforge itself changes outside OpenTofu/Terraform (e.g. the
65
+ * KVS key a deploy switches). Their refresh changes are not reported as drift.
66
+ */
67
+ expectedDrift?: string[];
68
+ /** Module inputs to apply before destroying (e.g. allowing non-empty buckets to be deleted). */
69
+ preDestroyInputs?: Record<string, unknown>;
70
+ /**
71
+ * Resources applied first, on their own (`-target`), e.g. a certificate
72
+ * whose DNS validation records the user must create before the rest can
73
+ * be applied. `describe` turns the outputs into instructions to print.
74
+ */
75
+ prePhase?: {
76
+ targets: string[];
77
+ describe(outputs: Record<string, unknown>): string | undefined;
78
+ };
79
+ }
80
+ /** Provider-specific IaC knowledge: modules, backends and credentials. */
81
+ export interface IacProfile {
82
+ provider: TargetConfig['provider'];
83
+ prepare(input: ProfileInput): Promise<PreparedTarget>;
84
+ }
85
+ /** `iac.name`, or the host of site.baseUrl as a resource-name-safe slug. */
86
+ export declare function projectName(config: SforgeConfig): string;
87
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../src/spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE5E,0DAA0D;AAC1D,MAAM,WAAW,UAAU;IACzB,gFAAgF;IAChF,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACrD,MAAM,EAAE;QACN,2DAA2D;QAC3D,IAAI,EAAE,MAAM,CAAC;QACb,qDAAqD;QACrD,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,2FAA2F;QAC3F,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACpC,CAAC;IACF,2EAA2E;IAC3E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,UAAU,CAAC;IACpB,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,kEAAkE;AAClE,MAAM,WAAW,YAAY;IAC3B,qGAAqG;IACrG,EAAE,EAAE,MAAM,CAAC;IACX,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,MAAM,EAAE,OAAO,CAAC;IAChB,iGAAiG;IACjG,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,YAAY,CAAC;IACpB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,gGAAgG;IAChG,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,EAAE;QACT,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC;KAChE,CAAC;CACH;AAED,0EAA0E;AAC1E,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IACnC,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACvD;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CASxD"}