anton-bakker-deploy-engine 0.5.3 → 0.6.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/index.d.ts CHANGED
@@ -6,9 +6,13 @@
6
6
  */
7
7
  export { PipelineEngine } from './engine.js';
8
8
  export { buildGates, DEFAULT_ENVIRONMENTS } from './pipeline.js';
9
- export { verifyAmplifyOutputs, verifyBuildArtifact, parseTableCount, assertTableCount, parseEcsStatus, assertCognitoGroups, assertApiHealth, deriveExpectations, summarize, promotionCheck, } from './verify.js';
9
+ export { verifyAmplifyOutputs, verifyBuildArtifact, parseTableCount, assertTableCount, parseEcsStatus, assertCognitoGroups, assertApiHealth, deriveExpectations, summarize, promotionCheck, promotionCheckHistory, getDeployHistory, getLatestDeploy, wasDeployedTo, recordDeploy, } from './verify.js';
10
10
  export { SlackNotifier } from './slack.js';
11
11
  export { secretsScan, npmAudit, sbomGenerate } from './checks.js';
12
12
  export { computeStateHash } from './types.js';
13
13
  export type { CheckResult, GateDefinition, GateResult, EnvironmentConfig, PipelineState, PipelineReport, CheckExecutor, ExecutionContext, PipelineEvent, PipelineEventType, PipelineEventListener, SlackSeverity, SlackEventConfig, SlackMessageConfig, SlackNotifierOptions, } from './types.js';
14
+ export { pitrRestore, validatePitrTimestamp } from './restore-pitr.js';
15
+ export { backupRestore } from './restore-backup.js';
16
+ export { saveManifest, listManifests, loadManifest, buildManifestKey } from './restore-manifest.js';
17
+ export type { RestoreConfig, BackupManifest, BackupTableEntry, BackupManifestSummary, ManifestListEntry, PitrRestoreOptions, BackupRestoreOptions, RestoreResult, RestoreTableResult, BackupCreateOptions, ProgressCallback, RestoreProgressEvent, } from './restore-types.js';
14
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGjE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,cAAc,GACf,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGlE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9C,YAAY,EACV,WAAW,EACX,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGjE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,YAAY,GACb,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGlE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9C,YAAY,EACV,WAAW,EACX,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAKpB,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAGvE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGpG,YAAY,EACV,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -9,11 +9,18 @@ export { PipelineEngine } from './engine.js';
9
9
  // Pipeline builder
10
10
  export { buildGates, DEFAULT_ENVIRONMENTS } from './pipeline.js';
11
11
  // Verification functions (Layer 1-3 checks)
12
- export { verifyAmplifyOutputs, verifyBuildArtifact, parseTableCount, assertTableCount, parseEcsStatus, assertCognitoGroups, assertApiHealth, deriveExpectations, summarize, promotionCheck, } from './verify.js';
12
+ export { verifyAmplifyOutputs, verifyBuildArtifact, parseTableCount, assertTableCount, parseEcsStatus, assertCognitoGroups, assertApiHealth, deriveExpectations, summarize, promotionCheck, promotionCheckHistory, getDeployHistory, getLatestDeploy, wasDeployedTo, recordDeploy, } from './verify.js';
13
13
  // Slack notifier (optional)
14
14
  export { SlackNotifier } from './slack.js';
15
15
  // Reusable check executors
16
16
  export { secretsScan, npmAudit, sbomGenerate } from './checks.js';
17
17
  // Utilities
18
18
  export { computeStateHash } from './types.js';
19
+ // ── Restore / Backup ──────────────────────────────────────────────────
20
+ // PITR restore engine
21
+ export { pitrRestore, validatePitrTimestamp } from './restore-pitr.js';
22
+ // On-demand backup restore engine
23
+ export { backupRestore } from './restore-backup.js';
24
+ // Manifest CRUD (S3 storage)
25
+ export { saveManifest, listManifests, loadManifest, buildManifestKey } from './restore-manifest.js';
19
26
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc;AACd,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,mBAAmB;AACnB,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAEjE,4CAA4C;AAC5C,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,4BAA4B;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,2BAA2B;AAC3B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAElE,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc;AACd,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,mBAAmB;AACnB,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAEjE,4CAA4C;AAC5C,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,YAAY,GACb,MAAM,aAAa,CAAC;AAErB,4BAA4B;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,2BAA2B;AAC3B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAElE,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAqB9C,yEAAyE;AAEzE,sBAAsB;AACtB,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAEvE,kCAAkC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,6BAA6B;AAC7B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { RestoreConfig, BackupRestoreOptions, RestoreResult, ProgressCallback } from './restore-types.js';
2
+ /**
3
+ * Restore tables from on-demand backup manifest.
4
+ *
5
+ * ⚠️ WARNING: On-demand backup restore CONSUMES the backup ARN.
6
+ * After restore, that specific backup may no longer be available.
7
+ * Prefer PITR when possible — it preserves all history.
8
+ *
9
+ * @param config - Project-level configuration
10
+ * @param options - Restore options (environment, manifest timestamp, filters)
11
+ * @param onProgress - Optional progress callback
12
+ * @returns Aggregate restore result
13
+ */
14
+ export declare function backupRestore(config: RestoreConfig, options: BackupRestoreOptions, onProgress?: ProgressCallback): Promise<RestoreResult>;
15
+ //# sourceMappingURL=restore-backup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore-backup.d.ts","sourceRoot":"","sources":["../src/restore-backup.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EAEpB,aAAa,EAEb,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAqG5B;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,oBAAoB,EAC7B,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,aAAa,CAAC,CAyDxB"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * src/restore-backup.ts — On-demand backup restore engine for DynamoDB.
3
+ *
4
+ * Restores tables from on-demand backup ARNs stored in a manifest.
5
+ * Headless, configurable — no readline, no process.exit.
6
+ */
7
+ import { DynamoDBClient, RestoreTableFromBackupCommand, DeleteTableCommand, ScanCommand, BatchWriteItemCommand, } from '@aws-sdk/client-dynamodb';
8
+ import { fromIni } from '@aws-sdk/credential-providers';
9
+ import { loadManifest } from './restore-manifest.js';
10
+ function createDynamoClient(config) {
11
+ return new DynamoDBClient({
12
+ region: config.region,
13
+ ...(config.profile ? { credentials: fromIni({ profile: config.profile }) } : {}),
14
+ });
15
+ }
16
+ /** Real-time empty check via Scan. */
17
+ async function isTableEmpty(client, tableName) {
18
+ try {
19
+ const resp = await client.send(new ScanCommand({ TableName: tableName, Select: 'COUNT', Limit: 1 }));
20
+ return (resp.Count ?? 0) === 0;
21
+ }
22
+ catch {
23
+ return true;
24
+ }
25
+ }
26
+ /** Wait for a table to reach ACTIVE status. */
27
+ async function waitForTable(client, tableName, maxWaitMs = 1800_000) {
28
+ const { DescribeTableCommand } = await import('@aws-sdk/client-dynamodb');
29
+ const start = Date.now();
30
+ while (Date.now() - start < maxWaitMs) {
31
+ try {
32
+ const resp = await client.send(new DescribeTableCommand({ TableName: tableName }));
33
+ if (resp.Table?.TableStatus === 'ACTIVE')
34
+ return;
35
+ }
36
+ catch { /* table might not exist yet */ }
37
+ await new Promise(r => setTimeout(r, 10_000));
38
+ }
39
+ throw new Error(`Table ${tableName} did not become ACTIVE within ${maxWaitMs / 1000}s`);
40
+ }
41
+ /** Restore a single table from an on-demand backup ARN. */
42
+ async function restoreTableFromBackup(client, tableName, modelName, backupArn, options, onProgress) {
43
+ const tempTableName = `${modelName}-restore-${Date.now()}`;
44
+ if (options.dryRun) {
45
+ onProgress?.({ type: 'table-skip', tableName, modelName });
46
+ return { tableName, modelName, status: 'dry-run', itemsRestored: 0 };
47
+ }
48
+ try {
49
+ // Check if target has data
50
+ const empty = await isTableEmpty(client, tableName);
51
+ if (!empty && !options.overwrite) {
52
+ onProgress?.({ type: 'table-skip', tableName, modelName });
53
+ return { tableName, modelName, status: 'skipped', itemsRestored: 0 };
54
+ }
55
+ onProgress?.({ type: 'table-start', tableName, modelName });
56
+ // Restore to temp table from backup ARN
57
+ await client.send(new RestoreTableFromBackupCommand({
58
+ TargetTableName: tempTableName,
59
+ BackupArn: backupArn,
60
+ }));
61
+ // Wait for ACTIVE
62
+ await waitForTable(client, tempTableName);
63
+ // Scan temp → batch write to target
64
+ let itemsRestored = 0;
65
+ let lastKey;
66
+ do {
67
+ const scanResp = await client.send(new ScanCommand({
68
+ TableName: tempTableName,
69
+ ExclusiveStartKey: lastKey,
70
+ Limit: 25,
71
+ }));
72
+ if (scanResp.Items && scanResp.Items.length > 0) {
73
+ await client.send(new BatchWriteItemCommand({
74
+ RequestItems: {
75
+ [tableName]: scanResp.Items.map(item => ({ PutRequest: { Item: item } })),
76
+ },
77
+ }));
78
+ itemsRestored += scanResp.Items.length;
79
+ }
80
+ lastKey = scanResp.LastEvaluatedKey;
81
+ } while (lastKey);
82
+ // Delete temp table
83
+ await client.send(new DeleteTableCommand({ TableName: tempTableName })).catch(() => { });
84
+ onProgress?.({ type: 'table-complete', tableName, modelName, itemCount: itemsRestored });
85
+ return { tableName, modelName, status: 'restored', itemsRestored };
86
+ }
87
+ catch (error) {
88
+ await client.send(new DeleteTableCommand({ TableName: tempTableName })).catch(() => { });
89
+ const msg = error.message;
90
+ onProgress?.({ type: 'table-fail', tableName, modelName, error: msg });
91
+ return { tableName, modelName, status: 'failed', itemsRestored: 0, error: msg };
92
+ }
93
+ }
94
+ /**
95
+ * Restore tables from on-demand backup manifest.
96
+ *
97
+ * ⚠️ WARNING: On-demand backup restore CONSUMES the backup ARN.
98
+ * After restore, that specific backup may no longer be available.
99
+ * Prefer PITR when possible — it preserves all history.
100
+ *
101
+ * @param config - Project-level configuration
102
+ * @param options - Restore options (environment, manifest timestamp, filters)
103
+ * @param onProgress - Optional progress callback
104
+ * @returns Aggregate restore result
105
+ */
106
+ export async function backupRestore(config, options, onProgress) {
107
+ const envConfig = config.environments[options.environment];
108
+ if (!envConfig)
109
+ throw new Error(`Unknown environment: ${options.environment}`);
110
+ // Load manifest
111
+ const manifest = await loadManifest(config, options.environment, options.manifestTimestamp);
112
+ if (!manifest) {
113
+ throw new Error(`No backup manifest found for ${options.environment}${options.manifestTimestamp ? ` at ${options.manifestTimestamp}` : ''}`);
114
+ }
115
+ const client = createDynamoClient(config);
116
+ const maxConcurrent = config.maxConcurrent ?? 10;
117
+ const overwrite = options.overwrite ?? false; // Default: false for backup restore (safer)
118
+ // Filter tables with valid backup ARNs and items
119
+ let tablesToRestore = manifest.tables.filter(t => t.backupArn && t.itemCount > 0);
120
+ if (options.tableFilter?.length) {
121
+ tablesToRestore = tablesToRestore.filter(t => options.tableFilter.includes(t.modelName) || options.tableFilter.includes(t.tableName));
122
+ if (tablesToRestore.length === 0) {
123
+ throw new Error(`None of the specified tables found in manifest: ${options.tableFilter.join(', ')}`);
124
+ }
125
+ }
126
+ // Process in batches
127
+ const results = [];
128
+ for (let i = 0; i < tablesToRestore.length; i += maxConcurrent) {
129
+ const batch = tablesToRestore.slice(i, i + maxConcurrent);
130
+ const batchResults = await Promise.all(batch.map(entry => restoreTableFromBackup(client, entry.tableName, entry.modelName, entry.backupArn, {
131
+ dryRun: options.dryRun,
132
+ overwrite,
133
+ }, onProgress)));
134
+ results.push(...batchResults);
135
+ }
136
+ const summary = {
137
+ restored: results.filter(r => r.status === 'restored').length,
138
+ skipped: results.filter(r => r.status === 'skipped').length,
139
+ failed: results.filter(r => r.status === 'failed').length,
140
+ totalItems: results.reduce((sum, r) => sum + r.itemsRestored, 0),
141
+ };
142
+ onProgress?.({ type: 'summary', summary });
143
+ return {
144
+ environment: options.environment,
145
+ method: 'backup',
146
+ timestamp: manifest.timestamp,
147
+ tables: results,
148
+ summary,
149
+ };
150
+ }
151
+ //# sourceMappingURL=restore-backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore-backup.js","sourceRoot":"","sources":["../src/restore-backup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { RestoreConfig, BackupManifest, ManifestListEntry } from './restore-types.js';
2
+ /**
3
+ * Build the S3 key for a manifest file.
4
+ */
5
+ export declare function buildManifestKey(config: RestoreConfig, env: string, timestamp: string): string;
6
+ /**
7
+ * Save a backup manifest to S3.
8
+ */
9
+ export declare function saveManifest(config: RestoreConfig, manifest: BackupManifest): Promise<string>;
10
+ /**
11
+ * List all backup manifests for an environment, sorted newest-first.
12
+ */
13
+ export declare function listManifests(config: RestoreConfig, env: string): Promise<ManifestListEntry[]>;
14
+ /**
15
+ * Load a backup manifest from S3.
16
+ * Without a timestamp, finds the most recent manifest via listing.
17
+ * Returns null when no manifests exist for the environment.
18
+ */
19
+ export declare function loadManifest(config: RestoreConfig, env: string, timestamp?: string): Promise<BackupManifest | null>;
20
+ //# sourceMappingURL=restore-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore-manifest.d.ts","sourceRoot":"","sources":["../src/restore-manifest.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAS3F;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG9F;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAUnG;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA6BpG;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAyBzH"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * src/restore-manifest.ts — Backup manifest storage and retrieval.
3
+ *
4
+ * Handles S3 CRUD operations for backup manifests. All operations are
5
+ * configured via RestoreConfig — no hardcoded bucket names or prefixes.
6
+ */
7
+ import { S3Client, GetObjectCommand, PutObjectCommand, ListObjectsV2Command } from '@aws-sdk/client-s3';
8
+ import { fromIni } from '@aws-sdk/credential-providers';
9
+ function createS3Client(config) {
10
+ return new S3Client({
11
+ region: config.region,
12
+ ...(config.profile ? { credentials: fromIni({ profile: config.profile }) } : {}),
13
+ });
14
+ }
15
+ /**
16
+ * Build the S3 key for a manifest file.
17
+ */
18
+ export function buildManifestKey(config, env, timestamp) {
19
+ const prefix = config.manifestPrefix ?? 'backup-manifests';
20
+ return `${prefix}/${env}-${timestamp}.json`;
21
+ }
22
+ /**
23
+ * Save a backup manifest to S3.
24
+ */
25
+ export async function saveManifest(config, manifest) {
26
+ const client = createS3Client(config);
27
+ const key = buildManifestKey(config, manifest.environment, manifest.timestamp);
28
+ await client.send(new PutObjectCommand({
29
+ Bucket: config.bucket,
30
+ Key: key,
31
+ Body: JSON.stringify(manifest, null, 2),
32
+ ContentType: 'application/json',
33
+ }));
34
+ return key;
35
+ }
36
+ /**
37
+ * List all backup manifests for an environment, sorted newest-first.
38
+ */
39
+ export async function listManifests(config, env) {
40
+ const client = createS3Client(config);
41
+ const prefix = `${config.manifestPrefix ?? 'backup-manifests'}/${env}-`;
42
+ const entries = [];
43
+ let continuationToken;
44
+ do {
45
+ const resp = await client.send(new ListObjectsV2Command({
46
+ Bucket: config.bucket,
47
+ Prefix: prefix,
48
+ ContinuationToken: continuationToken,
49
+ }));
50
+ for (const obj of resp.Contents ?? []) {
51
+ if (!obj.Key)
52
+ continue;
53
+ const match = obj.Key.match(new RegExp(`^${prefix.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/-$/, '-')}(.+)\\.json$`));
54
+ if (match) {
55
+ entries.push({
56
+ key: obj.Key,
57
+ timestamp: match[1],
58
+ lastModified: obj.LastModified,
59
+ });
60
+ }
61
+ }
62
+ continuationToken = resp.NextContinuationToken;
63
+ } while (continuationToken);
64
+ // Sort newest first (ISO timestamps sort lexicographically)
65
+ entries.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
66
+ return entries;
67
+ }
68
+ /**
69
+ * Load a backup manifest from S3.
70
+ * Without a timestamp, finds the most recent manifest via listing.
71
+ * Returns null when no manifests exist for the environment.
72
+ */
73
+ export async function loadManifest(config, env, timestamp) {
74
+ const client = createS3Client(config);
75
+ let key;
76
+ if (timestamp) {
77
+ key = buildManifestKey(config, env, timestamp);
78
+ }
79
+ else {
80
+ const entries = await listManifests(config, env);
81
+ if (entries.length === 0)
82
+ return null;
83
+ key = entries[0].key;
84
+ }
85
+ try {
86
+ const response = await client.send(new GetObjectCommand({
87
+ Bucket: config.bucket,
88
+ Key: key,
89
+ }));
90
+ if (!response.Body)
91
+ return null;
92
+ const content = await response.Body.transformToString();
93
+ return JSON.parse(content);
94
+ }
95
+ catch (error) {
96
+ const err = error;
97
+ if (err.name === 'NoSuchKey')
98
+ return null;
99
+ throw error; // Propagate credential/permission errors
100
+ }
101
+ }
102
+ //# sourceMappingURL=restore-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore-manifest.js","sourceRoot":"","sources":["../src/restore-manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { RestoreConfig, PitrRestoreOptions, RestoreResult, ProgressCallback } from './restore-types.js';
2
+ /**
3
+ * Validate that a timestamp is within the PITR retention window.
4
+ */
5
+ export declare function validatePitrTimestamp(timestamp: Date, retentionDays?: number): {
6
+ valid: boolean;
7
+ error?: string;
8
+ };
9
+ /**
10
+ * Restore tables to a point in time.
11
+ *
12
+ * @param config - Project-level configuration (bucket, region, environments)
13
+ * @param options - Restore options (environment, timestamp, filters)
14
+ * @param onProgress - Optional progress callback for UI updates
15
+ * @returns Aggregate restore result
16
+ */
17
+ export declare function pitrRestore(config: RestoreConfig, options: PitrRestoreOptions, onProgress?: ProgressCallback): Promise<RestoreResult>;
18
+ //# sourceMappingURL=restore-pitr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore-pitr.d.ts","sourceRoot":"","sources":["../src/restore-pitr.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,aAAa,EAEb,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAS5B;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,SAAK,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAM7G;AA0KD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,kBAAkB,EAC3B,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,aAAa,CAAC,CA0DxB"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * src/restore-pitr.ts — Point-in-Time Recovery engine for DynamoDB.
3
+ *
4
+ * Headless, configurable engine. No readline, no process.exit.
5
+ * Consumers provide config + options, engine returns results.
6
+ */
7
+ import { DynamoDBClient, ListTablesCommand, DescribeContinuousBackupsCommand, RestoreTableToPointInTimeCommand, DeleteTableCommand, ScanCommand, BatchWriteItemCommand, } from '@aws-sdk/client-dynamodb';
8
+ import { fromIni } from '@aws-sdk/credential-providers';
9
+ function createDynamoClient(config) {
10
+ return new DynamoDBClient({
11
+ region: config.region,
12
+ ...(config.profile ? { credentials: fromIni({ profile: config.profile }) } : {}),
13
+ });
14
+ }
15
+ /**
16
+ * Validate that a timestamp is within the PITR retention window.
17
+ */
18
+ export function validatePitrTimestamp(timestamp, retentionDays = 35) {
19
+ const now = new Date();
20
+ const oldestAllowed = new Date(now.getTime() - retentionDays * 24 * 60 * 60 * 1000);
21
+ if (timestamp > now)
22
+ return { valid: false, error: 'Timestamp is in the future' };
23
+ if (timestamp < oldestAllowed)
24
+ return { valid: false, error: `Timestamp is older than ${retentionDays} days (oldest allowed: ${oldestAllowed.toISOString()})` };
25
+ return { valid: true };
26
+ }
27
+ /** Discover all tables matching the environment prefix. */
28
+ async function discoverTables(client, tablePrefix) {
29
+ const tables = [];
30
+ let lastTable;
31
+ do {
32
+ const resp = await client.send(new ListTablesCommand({ ExclusiveStartTableName: lastTable }));
33
+ for (const name of resp.TableNames ?? []) {
34
+ if (name.startsWith(tablePrefix + '-'))
35
+ tables.push(name);
36
+ }
37
+ lastTable = resp.LastEvaluatedTableName;
38
+ } while (lastTable);
39
+ return tables;
40
+ }
41
+ /** Extract model name from full table name. */
42
+ function modelNameFromTable(tableName, tablePrefix) {
43
+ return tableName.startsWith(tablePrefix + '-')
44
+ ? tableName.slice(tablePrefix.length + 1)
45
+ : tableName;
46
+ }
47
+ /** Check if PITR is enabled on a table. */
48
+ async function isPitrEnabled(client, tableName) {
49
+ try {
50
+ const resp = await client.send(new DescribeContinuousBackupsCommand({ TableName: tableName }));
51
+ return resp.ContinuousBackupsDescription?.PointInTimeRecoveryDescription?.PointInTimeRecoveryStatus === 'ENABLED';
52
+ }
53
+ catch {
54
+ return false;
55
+ }
56
+ }
57
+ /** Real-time empty check via Scan (DescribeTable.ItemCount is cached ~6h). */
58
+ async function isTableEmpty(client, tableName) {
59
+ try {
60
+ const resp = await client.send(new ScanCommand({ TableName: tableName, Select: 'COUNT', Limit: 1 }));
61
+ return (resp.Count ?? 0) === 0;
62
+ }
63
+ catch {
64
+ return true;
65
+ }
66
+ }
67
+ /** Clear all items from a table. */
68
+ async function clearTable(client, tableName) {
69
+ let deleted = 0;
70
+ let lastKey;
71
+ // Discover key schema via a single scan item
72
+ const sample = await client.send(new ScanCommand({ TableName: tableName, Limit: 1 }));
73
+ if (!sample.Items?.length)
74
+ return 0;
75
+ // We need to know the key attributes — scan items and delete by their full key
76
+ do {
77
+ const scanResp = await client.send(new ScanCommand({
78
+ TableName: tableName,
79
+ ExclusiveStartKey: lastKey,
80
+ Limit: 25,
81
+ }));
82
+ if (scanResp.Items && scanResp.Items.length > 0) {
83
+ // For delete we need only the key attributes — 'id' is always the partition key
84
+ await client.send(new BatchWriteItemCommand({
85
+ RequestItems: {
86
+ [tableName]: scanResp.Items.map(item => ({
87
+ DeleteRequest: { Key: { id: item.id } },
88
+ })),
89
+ },
90
+ }));
91
+ deleted += scanResp.Items.length;
92
+ }
93
+ lastKey = scanResp.LastEvaluatedKey;
94
+ } while (lastKey);
95
+ return deleted;
96
+ }
97
+ /** Wait for a table to reach ACTIVE status. */
98
+ async function waitForTable(client, tableName, maxWaitMs = 1800_000) {
99
+ const { DescribeTableCommand } = await import('@aws-sdk/client-dynamodb');
100
+ const start = Date.now();
101
+ while (Date.now() - start < maxWaitMs) {
102
+ try {
103
+ const resp = await client.send(new DescribeTableCommand({ TableName: tableName }));
104
+ if (resp.Table?.TableStatus === 'ACTIVE')
105
+ return;
106
+ }
107
+ catch { /* table might not exist yet */ }
108
+ await new Promise(r => setTimeout(r, 10_000));
109
+ }
110
+ throw new Error(`Table ${tableName} did not become ACTIVE within ${maxWaitMs / 1000}s`);
111
+ }
112
+ /** Restore a single table via PITR. */
113
+ async function restoreTable(client, tableName, tablePrefix, restoreTimestamp, options, onProgress) {
114
+ const modelName = modelNameFromTable(tableName, tablePrefix);
115
+ const tempTableName = `${modelName}-pitr-${Date.now()}`;
116
+ if (options.dryRun) {
117
+ onProgress?.({ type: 'table-skip', tableName, modelName });
118
+ return { tableName, modelName, status: 'dry-run', itemsRestored: 0 };
119
+ }
120
+ try {
121
+ // Check PITR enabled
122
+ if (!(await isPitrEnabled(client, tableName))) {
123
+ onProgress?.({ type: 'table-skip', tableName, modelName, error: 'PITR not enabled' });
124
+ return { tableName, modelName, status: 'skipped', itemsRestored: 0, error: 'PITR not enabled' };
125
+ }
126
+ // Check if target has data
127
+ const empty = await isTableEmpty(client, tableName);
128
+ if (!empty && !options.overwrite) {
129
+ onProgress?.({ type: 'table-skip', tableName, modelName });
130
+ return { tableName, modelName, status: 'skipped', itemsRestored: 0 };
131
+ }
132
+ // Clear target if overwriting
133
+ if (!empty && options.overwrite) {
134
+ await clearTable(client, tableName);
135
+ }
136
+ onProgress?.({ type: 'table-start', tableName, modelName });
137
+ // Restore to temp table
138
+ await client.send(new RestoreTableToPointInTimeCommand({
139
+ SourceTableName: tableName,
140
+ TargetTableName: tempTableName,
141
+ RestoreDateTime: restoreTimestamp,
142
+ }));
143
+ // Wait for ACTIVE
144
+ await waitForTable(client, tempTableName);
145
+ // Scan temp → batch write to target
146
+ let itemsRestored = 0;
147
+ let lastKey;
148
+ do {
149
+ const scanResp = await client.send(new ScanCommand({
150
+ TableName: tempTableName,
151
+ ExclusiveStartKey: lastKey,
152
+ Limit: 25,
153
+ }));
154
+ if (scanResp.Items && scanResp.Items.length > 0) {
155
+ await client.send(new BatchWriteItemCommand({
156
+ RequestItems: {
157
+ [tableName]: scanResp.Items.map(item => ({ PutRequest: { Item: item } })),
158
+ },
159
+ }));
160
+ itemsRestored += scanResp.Items.length;
161
+ }
162
+ lastKey = scanResp.LastEvaluatedKey;
163
+ } while (lastKey);
164
+ // Delete temp table
165
+ await client.send(new DeleteTableCommand({ TableName: tempTableName })).catch(() => { });
166
+ onProgress?.({ type: 'table-complete', tableName, modelName, itemCount: itemsRestored });
167
+ return { tableName, modelName, status: 'restored', itemsRestored };
168
+ }
169
+ catch (error) {
170
+ // Cleanup temp table
171
+ await client.send(new DeleteTableCommand({ TableName: tempTableName })).catch(() => { });
172
+ const msg = error.message;
173
+ onProgress?.({ type: 'table-fail', tableName, modelName, error: msg });
174
+ return { tableName, modelName, status: 'failed', itemsRestored: 0, error: msg };
175
+ }
176
+ }
177
+ /**
178
+ * Restore tables to a point in time.
179
+ *
180
+ * @param config - Project-level configuration (bucket, region, environments)
181
+ * @param options - Restore options (environment, timestamp, filters)
182
+ * @param onProgress - Optional progress callback for UI updates
183
+ * @returns Aggregate restore result
184
+ */
185
+ export async function pitrRestore(config, options, onProgress) {
186
+ const envConfig = config.environments[options.environment];
187
+ if (!envConfig)
188
+ throw new Error(`Unknown environment: ${options.environment}`);
189
+ const retentionDays = config.pitrRetentionDays ?? 35;
190
+ const validation = validatePitrTimestamp(options.restoreTimestamp, retentionDays);
191
+ if (!validation.valid)
192
+ throw new Error(validation.error);
193
+ const client = createDynamoClient(config);
194
+ const tablePrefix = envConfig.tablePrefix;
195
+ const maxConcurrent = config.maxConcurrent ?? 10;
196
+ const overwrite = options.overwrite !== false; // Default: true for PITR
197
+ // Discover tables
198
+ const allTables = await discoverTables(client, tablePrefix);
199
+ if (allTables.length === 0)
200
+ throw new Error(`No tables found with prefix '${tablePrefix}'`);
201
+ // Filter
202
+ let tables = allTables;
203
+ if (options.tableFilter?.length) {
204
+ tables = allTables.filter(t => {
205
+ const model = modelNameFromTable(t, tablePrefix);
206
+ return options.tableFilter.includes(model) || options.tableFilter.includes(t);
207
+ });
208
+ if (tables.length === 0)
209
+ throw new Error(`None of the specified tables found: ${options.tableFilter.join(', ')}`);
210
+ }
211
+ // Process in batches
212
+ const results = [];
213
+ for (let i = 0; i < tables.length; i += maxConcurrent) {
214
+ const batch = tables.slice(i, i + maxConcurrent);
215
+ const batchResults = await Promise.all(batch.map(tableName => restoreTable(client, tableName, tablePrefix, options.restoreTimestamp, {
216
+ dryRun: options.dryRun,
217
+ overwrite,
218
+ }, onProgress)));
219
+ results.push(...batchResults);
220
+ }
221
+ const summary = {
222
+ restored: results.filter(r => r.status === 'restored').length,
223
+ skipped: results.filter(r => r.status === 'skipped').length,
224
+ failed: results.filter(r => r.status === 'failed').length,
225
+ totalItems: results.reduce((sum, r) => sum + r.itemsRestored, 0),
226
+ };
227
+ onProgress?.({ type: 'summary', summary });
228
+ return {
229
+ environment: options.environment,
230
+ method: 'pitr',
231
+ timestamp: options.restoreTimestamp.toISOString(),
232
+ tables: results,
233
+ summary,
234
+ };
235
+ }
236
+ //# sourceMappingURL=restore-pitr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore-pitr.js","sourceRoot":"","sources":["../src/restore-pitr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * src/restore-types.ts — Generic types for backup/restore operations.
3
+ *
4
+ * These types are decoupled from any specific project. Consumers configure
5
+ * their bucket, prefix, environments, and table discovery.
6
+ */
7
+ /** Configuration for the restore engine — provided by the consuming project */
8
+ export interface RestoreConfig {
9
+ /** S3 bucket for storing backup manifests */
10
+ bucket: string;
11
+ /** S3 key prefix for manifest files (default: 'backup-manifests') */
12
+ manifestPrefix?: string;
13
+ /** AWS region */
14
+ region: string;
15
+ /** AWS profile (optional — uses default credential chain if not set) */
16
+ profile?: string;
17
+ /** Environment definitions: name → table prefix mapping */
18
+ environments: Record<string, {
19
+ tablePrefix: string;
20
+ }>;
21
+ /** Maximum concurrent restore operations (default: 10) */
22
+ maxConcurrent?: number;
23
+ /** PITR retention window in days (default: 35) */
24
+ pitrRetentionDays?: number;
25
+ }
26
+ /** Per-table entry in a backup manifest */
27
+ export interface BackupTableEntry {
28
+ tableName: string;
29
+ modelName: string;
30
+ backupArn: string;
31
+ itemCount: number;
32
+ tableSizeBytes?: number;
33
+ pitrEnabled?: boolean;
34
+ error?: string;
35
+ }
36
+ /** Summary statistics for a backup manifest */
37
+ export interface BackupManifestSummary {
38
+ tableCount: number;
39
+ totalItems: number;
40
+ totalSizeBytes?: number;
41
+ }
42
+ /** Complete backup manifest — one per backup run */
43
+ export interface BackupManifest {
44
+ environment: string;
45
+ timestamp: string;
46
+ tablePrefix: string;
47
+ creator?: string;
48
+ deployVersion?: string;
49
+ pitrEnabled?: boolean;
50
+ summary?: BackupManifestSummary;
51
+ tables: BackupTableEntry[];
52
+ error?: string;
53
+ }
54
+ /** Lightweight listing entry returned by listManifests */
55
+ export interface ManifestListEntry {
56
+ key: string;
57
+ timestamp: string;
58
+ lastModified?: Date;
59
+ }
60
+ /** Options for PITR restore */
61
+ export interface PitrRestoreOptions {
62
+ environment: string;
63
+ restoreTimestamp: Date;
64
+ /** Only restore these tables (model names). If omitted, all tables are restored. */
65
+ tableFilter?: string[];
66
+ /** Preview mode — no changes made */
67
+ dryRun?: boolean;
68
+ /** If true (default), clears target tables before restoring. If false, skips non-empty tables. */
69
+ overwrite?: boolean;
70
+ }
71
+ /** Options for on-demand backup restore */
72
+ export interface BackupRestoreOptions {
73
+ environment: string;
74
+ /** Specific manifest timestamp. If omitted, uses the most recent manifest. */
75
+ manifestTimestamp?: string;
76
+ /** Only restore these tables (model names). If omitted, all tables with backup ARNs are restored. */
77
+ tableFilter?: string[];
78
+ /** Preview mode — no changes made */
79
+ dryRun?: boolean;
80
+ /** If true, clears target tables before restoring. If false (default), skips non-empty tables. */
81
+ overwrite?: boolean;
82
+ }
83
+ /** Result for a single table restore operation */
84
+ export interface RestoreTableResult {
85
+ tableName: string;
86
+ modelName: string;
87
+ status: 'restored' | 'skipped' | 'failed' | 'dry-run';
88
+ itemsRestored: number;
89
+ error?: string;
90
+ }
91
+ /** Aggregate result for a restore operation */
92
+ export interface RestoreResult {
93
+ environment: string;
94
+ method: 'pitr' | 'backup';
95
+ timestamp: string;
96
+ tables: RestoreTableResult[];
97
+ summary: {
98
+ restored: number;
99
+ skipped: number;
100
+ failed: number;
101
+ totalItems: number;
102
+ };
103
+ }
104
+ /** Options for creating on-demand backups */
105
+ export interface BackupCreateOptions {
106
+ environment: string;
107
+ /** Creator identifier (e.g. 'deploy-pipeline', 'manual') */
108
+ creator?: string;
109
+ /** Deploy version string to tag on the manifest */
110
+ deployVersion?: string;
111
+ /** Only back up these tables (model names). If omitted, all tables are backed up. */
112
+ tableFilter?: string[];
113
+ }
114
+ /** Progress callback — consumers can use this for UI updates */
115
+ export type ProgressCallback = (event: RestoreProgressEvent) => void;
116
+ export interface RestoreProgressEvent {
117
+ type: 'table-start' | 'table-complete' | 'table-skip' | 'table-fail' | 'summary';
118
+ tableName?: string;
119
+ modelName?: string;
120
+ itemCount?: number;
121
+ error?: string;
122
+ summary?: RestoreResult['summary'];
123
+ }
124
+ //# sourceMappingURL=restore-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore-types.d.ts","sourceRoot":"","sources":["../src/restore-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * src/restore-types.ts — Generic types for backup/restore operations.
3
+ *
4
+ * These types are decoupled from any specific project. Consumers configure
5
+ * their bucket, prefix, environments, and table discovery.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=restore-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore-types.js","sourceRoot":"","sources":["../src/restore-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
package/dist/verify.d.ts CHANGED
@@ -70,6 +70,9 @@ export declare function summarize(checks: CheckResult[]): {
70
70
  * 1. State file exists
71
71
  * 2. Result is 'passed'
72
72
  * 3. Commit matches (exact or ancestor)
73
+ *
74
+ * @deprecated Use promotionCheckHistory for history-based promotion (supports deploying
75
+ * any previously-deployed commit, not just the latest).
73
76
  */
74
77
  export declare function promotionCheck(opts: {
75
78
  commit: string;
@@ -80,4 +83,48 @@ export declare function promotionCheck(opts: {
80
83
  stateDir: string;
81
84
  exec: (cmd: string) => string | null;
82
85
  }): CheckResult;
86
+ export interface DeployHistoryEntry {
87
+ commit: string;
88
+ timestamp: string;
89
+ }
90
+ /**
91
+ * Read deploy history for an environment from deploy-history.json.
92
+ * Returns all successfully deployed commits (newest last).
93
+ * Handles both legacy single-object format and new array format.
94
+ */
95
+ export declare function getDeployHistory(stateDir: string, env: string): DeployHistoryEntry[];
96
+ /**
97
+ * Get the latest successfully deployed commit for an environment.
98
+ */
99
+ export declare function getLatestDeploy(stateDir: string, env: string): DeployHistoryEntry | null;
100
+ /**
101
+ * Check if a specific commit was ever successfully deployed to an environment.
102
+ * Matches by prefix (short hash) or full hash.
103
+ */
104
+ export declare function wasDeployedTo(stateDir: string, env: string, commit: string): boolean;
105
+ /**
106
+ * Record a successful deployment in deploy-history.json.
107
+ * Appends to the array for the given environment.
108
+ */
109
+ export declare function recordDeploy(stateDir: string, env: string, commit: string): void;
110
+ /**
111
+ * History-based promotion check.
112
+ *
113
+ * Verifies that the commit was previously deployed to all required predecessor
114
+ * environments. Unlike promotionCheck (which only checks the latest deploy),
115
+ * this checks the full deploy history — allowing any previously-deployed commit
116
+ * to be promoted.
117
+ *
118
+ * Usage:
119
+ * promotionCheckHistory({ commit: 'abc123', requiresPassed: ['development'], stateDir })
120
+ *
121
+ * Auto-promotion (no --commit):
122
+ * const latest = getLatestDeploy(stateDir, 'development');
123
+ * // deploy latest.commit to staging
124
+ */
125
+ export declare function promotionCheckHistory(opts: {
126
+ commit: string;
127
+ requiresPassed: string[];
128
+ stateDir: string;
129
+ }): CheckResult;
83
130
  //# sourceMappingURL=verify.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAwDvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAyClE;AAID;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAsBzG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAQ9E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAmBpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,WAAW,CASjG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAOpE;AAID,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,kBAAkB,CA4CrB;AAID;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAQrH;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE;QAAE,cAAc,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CACtC,GAAG,WAAW,CAgEd"}
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAwDvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAyClE;AAID;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAsBzG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAQ9E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAmBpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,WAAW,CASjG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAOpE;AAID,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,kBAAkB,CA4CrB;AAID;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAQrH;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE;QAAE,cAAc,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CACtC,GAAG,WAAW,CAgEd;AAID,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAiBpF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAGxF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAIpF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAkBhF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,WAAW,CA4Bd"}
package/dist/verify.js CHANGED
@@ -6,7 +6,7 @@
6
6
  * Validates amplify_outputs.json, build artifacts, DynamoDB, ECS, Cognito, and API health.
7
7
  * Project-agnostic — works with any AWS CDK project.
8
8
  */
9
- import { readFileSync, readdirSync, existsSync } from 'fs';
9
+ import { readFileSync, writeFileSync, readdirSync, existsSync } from 'fs';
10
10
  import { join } from 'path';
11
11
  /**
12
12
  * Verify amplify_outputs.json has all required fields.
@@ -254,6 +254,9 @@ export function summarize(checks) {
254
254
  * 1. State file exists
255
255
  * 2. Result is 'passed'
256
256
  * 3. Commit matches (exact or ancestor)
257
+ *
258
+ * @deprecated Use promotionCheckHistory for history-based promotion (supports deploying
259
+ * any previously-deployed commit, not just the latest).
257
260
  */
258
261
  export function promotionCheck(opts) {
259
262
  const { commit, requirements, stateDir, exec } = opts;
@@ -312,4 +315,111 @@ export function promotionCheck(opts) {
312
315
  error: failures.join('; '),
313
316
  };
314
317
  }
318
+ /**
319
+ * Read deploy history for an environment from deploy-history.json.
320
+ * Returns all successfully deployed commits (newest last).
321
+ * Handles both legacy single-object format and new array format.
322
+ */
323
+ export function getDeployHistory(stateDir, env) {
324
+ const historyPath = join(stateDir, 'deploy-history.json');
325
+ if (!existsSync(historyPath))
326
+ return [];
327
+ let history;
328
+ try {
329
+ history = JSON.parse(readFileSync(historyPath, 'utf-8'));
330
+ }
331
+ catch {
332
+ return [];
333
+ }
334
+ const entries = history[env];
335
+ if (!entries)
336
+ return [];
337
+ // Legacy format: single object { commit, timestamp }
338
+ if (!Array.isArray(entries) && typeof entries === 'object' && entries !== null && 'commit' in entries) {
339
+ return [entries];
340
+ }
341
+ if (Array.isArray(entries))
342
+ return entries;
343
+ return [];
344
+ }
345
+ /**
346
+ * Get the latest successfully deployed commit for an environment.
347
+ */
348
+ export function getLatestDeploy(stateDir, env) {
349
+ const entries = getDeployHistory(stateDir, env);
350
+ return entries.length > 0 ? entries[entries.length - 1] : null;
351
+ }
352
+ /**
353
+ * Check if a specific commit was ever successfully deployed to an environment.
354
+ * Matches by prefix (short hash) or full hash.
355
+ */
356
+ export function wasDeployedTo(stateDir, env, commit) {
357
+ return getDeployHistory(stateDir, env).some(e => e.commit === commit || e.commit.startsWith(commit) || commit.startsWith(e.commit));
358
+ }
359
+ /**
360
+ * Record a successful deployment in deploy-history.json.
361
+ * Appends to the array for the given environment.
362
+ */
363
+ export function recordDeploy(stateDir, env, commit) {
364
+ const historyPath = join(stateDir, 'deploy-history.json');
365
+ let history = {};
366
+ if (existsSync(historyPath)) {
367
+ try {
368
+ const raw = JSON.parse(readFileSync(historyPath, 'utf-8'));
369
+ // Migrate legacy format
370
+ for (const [k, v] of Object.entries(raw)) {
371
+ if (v && !Array.isArray(v) && typeof v === 'object' && 'commit' in v) {
372
+ raw[k] = [v];
373
+ }
374
+ }
375
+ history = raw;
376
+ }
377
+ catch { /* start fresh */ }
378
+ }
379
+ if (!history[env])
380
+ history[env] = [];
381
+ history[env].push({ commit, timestamp: new Date().toISOString() });
382
+ writeFileSync(historyPath, JSON.stringify(history, null, 2));
383
+ }
384
+ /**
385
+ * History-based promotion check.
386
+ *
387
+ * Verifies that the commit was previously deployed to all required predecessor
388
+ * environments. Unlike promotionCheck (which only checks the latest deploy),
389
+ * this checks the full deploy history — allowing any previously-deployed commit
390
+ * to be promoted.
391
+ *
392
+ * Usage:
393
+ * promotionCheckHistory({ commit: 'abc123', requiresPassed: ['development'], stateDir })
394
+ *
395
+ * Auto-promotion (no --commit):
396
+ * const latest = getLatestDeploy(stateDir, 'development');
397
+ * // deploy latest.commit to staging
398
+ */
399
+ export function promotionCheckHistory(opts) {
400
+ const { commit, requiresPassed, stateDir } = opts;
401
+ const failures = [];
402
+ for (const env of requiresPassed) {
403
+ if (!wasDeployedTo(stateDir, env, commit)) {
404
+ const history = getDeployHistory(stateDir, env);
405
+ const recent = history.slice(-5).map(e => `${e.commit} (${e.timestamp})`).join(', ');
406
+ failures.push(`${env}: commit ${commit.substring(0, 7)} was never deployed to ${env}. Recent: ${recent || 'none'}`);
407
+ }
408
+ }
409
+ if (failures.length === 0) {
410
+ return {
411
+ name: 'promotion-check-history',
412
+ passed: true,
413
+ expected: `deployed to: ${requiresPassed.join(', ')}`,
414
+ actual: 'all requirements met',
415
+ };
416
+ }
417
+ return {
418
+ name: 'promotion-check-history',
419
+ passed: false,
420
+ expected: `deployed to: ${requiresPassed.join(', ')}`,
421
+ actual: `${failures.length} requirement(s) failed`,
422
+ error: failures.join('; '),
423
+ };
424
+ }
315
425
  //# sourceMappingURL=verify.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,IAAI,OAAgC,CAAC;IACrC,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,EAAE,IAAI,EAAE,+BAA+B,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAiB,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACrH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,uBAAuB;QAC7B,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO;QACzB,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9D,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,OAAO,CAAC,OAAO,KAAK,KAAK;QACjC,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC;KAC7C,CAAC,CAAC;IAEH,MAAM,OAAO,GAAI,OAAO,CAAC,IAAgC,EAAE,GAAyB,CAAC;IACrF,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,CAAC,CAAC,OAAO;QACjB,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,OAAO,IAAI,SAAS;KAC7B,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC;QACzC,QAAQ,EAAE,sBAAsB;QAChC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;KACvD,CAAC,CAAC;IAEH,MAAM,UAAU,GAAI,OAAO,CAAC,IAAgC,EAAE,YAAkC,CAAC;IACjG,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,2BAA2B;QACjC,MAAM,EAAE,CAAC,CAAC,UAAU;QACpB,QAAQ,EAAE,kBAAkB;QAC5B,MAAM,EAAE,UAAU,IAAI,SAAS;KAChC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAI,OAAO,CAAC,IAAgC,EAAE,mBAAyC,CAAC;IAC1G,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,kCAAkC;QACxC,MAAM,EAAE,CAAC,CAAC,YAAY;QACtB,QAAQ,EAAE,kBAAkB;QAC5B,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;KACxE,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE1C,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,SAAS,EAAE,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAC;IAC1G,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAEhE,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,4BAA4B;QAClC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC3C,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,QAAQ;KACpF,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,4BAA4B;QAClC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC3C,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;KAChE,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAC1E,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,2BAA2B;QACjC,MAAM,EAAE,CAAC,YAAY;QACrB,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,UAAU,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;KAC9D,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,2EAA2E;AAE3E;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAwB,EAAE,MAAc;IACtE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IACpG,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAa,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO;YACL,IAAI,EAAE,sBAAsB;YAC5B,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,QAAQ,CAAC,MAAM;YACtB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;SAChC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7C,OAAO;YACL,IAAI,EAAE,sBAAsB;YAC5B,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;YACrB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;YAC/B,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE;SACzB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,QAAgB;IAC/D,OAAO;QACL,IAAI,EAAE,qBAAqB,QAAQ,EAAE;QACrC,MAAM,EAAE,MAAM,IAAI,QAAQ;QAC1B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,MAAM,iBAAiB,CAAC,CAAC,CAAC,SAAS;KAC7E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAwB;IACrD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IACxF,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,SAAS,CAAC;QACvC,OAAO;YACL,IAAI,EAAE,qBAAqB;YAC3B,MAAM,EAAE,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,GAAG,CAAC;YAChE,QAAQ,EAAE,qBAAqB,OAAO,EAAE;YACxC,MAAM,EAAE,GAAG,MAAM,aAAa,OAAO,aAAa,OAAO,EAAE;YAC3D,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,OAAO,oBAAoB,CAAC,CAAC,CAAC,SAAS;SAChF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;IAC9G,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAAsB,EAAE,cAAwB;IAClF,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;QAC5B,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QACnC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B,KAAK,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;KACzE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC;QAC1C,QAAQ,EAAE,qBAAqB;QAC/B,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa;KAC9D,CAAC;AACJ,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAKlC;IACC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAElE,IAAI,UAAoB,CAAC;IACzB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAC/D,UAAU,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/F,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC/B,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;YACjD,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC9C,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CACpD,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,IAAI,aAAa,GAAa,EAAE,CAAC;IACjC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAC5D,4CAA4C;YAC5C,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/E,sEAAsE;YACtE,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,qCAAqC,CAAC;mBACnE,SAAS,CAAC,KAAK,CAAC,qCAAqC,CAAC;mBACtD,SAAS,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACvD,MAAM,QAAQ,GAAG,SAAS;gBACxB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvD,CAAC,CAAC,EAAE,CAAC;YACP,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC,CAAC,kCAAkC,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,YAAY,IAAI,KAAK,IAAI,MAAM,CAAC,GAAG,EAAE,QAAQ,IAAI,aAAa,EAAE,CAAC;IAElG,OAAO;QACL,UAAU,EAAE,UAAU,CAAC,MAAM;QAC7B,UAAU;QACV,aAAa;QACb,SAAS;KACV,CAAC;AACJ,CAAC;AAED,2EAA2E;AAE3E;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,MAAqB;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC3B,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,QAAQ,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;KACzF,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,IAK9B;IACC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACtD,MAAM,aAAa,GAAG,YAAY,CAAC,aAAa,IAAI,IAAI,CAAC;IACzD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,cAAc,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC;QAE7D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,6BAA6B,CAAC,CAAC;YACnD,SAAS;QACX,CAAC;QAED,IAAI,KAA2C,CAAC;QAChD,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,yBAAyB,CAAC,CAAC;YAC/C,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,qBAAqB,KAAK,CAAC,MAAM,IAAI,SAAS,qBAAqB,CAAC,CAAC;YACzF,SAAS;QACX,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,+BAA+B,CAAC,CAAC;YACrD,SAAS;QACX,CAAC;QAED,8EAA8E;QAC9E,IAAI,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAClG,SAAS;QACX,CAAC;QAED,wFAAwF;QACxF,4FAA4F;QAC5F,2FAA2F;QAC3F,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,IAAI,CAAC,gCAAgC,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9E,IAAI,MAAM,KAAK,IAAI;gBAAE,SAAS;QAChC,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,oBAAoB,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,wBAAwB,GAAG,oBAAoB,KAAK,GAAG,CAAC,CAAC;IACzH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,IAAI,EAAE,iBAAiB;YACvB,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,WAAW,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC7D,MAAM,EAAE,sBAAsB;SAC/B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,WAAW,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC7D,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,wBAAwB;QAClD,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;KAC3B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "anton-bakker-deploy-engine",
3
- "version": "0.5.3",
3
+ "version": "0.6.0",
4
4
  "description": "Self-validating AWS deployment engine with 4-layer verification: exists, configured, functional, project-specific",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -36,5 +36,10 @@
36
36
  "typescript-eslint": ">=8.58.2",
37
37
  "vitest": "^4.1.2"
38
38
  },
39
- "dependencies": {}
39
+ "dependencies": {
40
+ "@aws-sdk/client-dynamodb": ">=3.600.0",
41
+ "@aws-sdk/client-s3": ">=3.600.0",
42
+ "@aws-sdk/credential-providers": ">=3.600.0",
43
+ "@aws-sdk/lib-dynamodb": ">=3.600.0"
44
+ }
40
45
  }