declastruct 1.1.12 → 1.3.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/contract/cli/apply.d.ts +7 -4
- package/dist/contract/cli/apply.integration.test.js +69 -2
- package/dist/contract/cli/apply.integration.test.js.map +1 -1
- package/dist/contract/cli/apply.js +52 -23
- package/dist/contract/cli/apply.js.map +1 -1
- package/dist/contract/cli/invoke.js +3 -1
- package/dist/contract/cli/invoke.js.map +1 -1
- package/dist/domain.operations/apply/applyChanges.d.ts +4 -2
- package/dist/domain.operations/apply/applyChanges.js +30 -16
- package/dist/domain.operations/apply/applyChanges.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
/**
|
|
3
|
-
* .what = executes the apply command to apply
|
|
3
|
+
* .what = executes the apply command to apply infrastructure changes
|
|
4
4
|
* .why = provides CLI interface for applying infrastructure changes
|
|
5
|
-
* .note =
|
|
5
|
+
* .note = supports two modes:
|
|
6
|
+
* - standard: load plan from file, validate staleness, apply
|
|
7
|
+
* - yolo: plan from wish directly, skip validation, apply immediately
|
|
6
8
|
*/
|
|
7
|
-
export declare const executeApplyCommand: (
|
|
8
|
-
planFilePath
|
|
9
|
+
export declare const executeApplyCommand: (input: {
|
|
10
|
+
planFilePath?: string;
|
|
11
|
+
wishFilePath?: string;
|
|
9
12
|
}) => Promise<void>;
|
|
@@ -79,7 +79,7 @@ describe('executeApplyCommand', () => {
|
|
|
79
79
|
await (0, promises_1.writeFile)(planFilePath, JSON.stringify(invalidPlan, null, 2));
|
|
80
80
|
await expect((0, apply_1.executeApplyCommand)({ planFilePath })).rejects.toThrow();
|
|
81
81
|
});
|
|
82
|
-
it('should throw when wish file does not export
|
|
82
|
+
it('should throw when wish file does not export getResources', async () => {
|
|
83
83
|
const badWishPath = (0, path_1.resolve)(process.cwd(), 'src/.test/assets/bad-apply-wish.ts');
|
|
84
84
|
// create bad wish file
|
|
85
85
|
await (0, promises_1.writeFile)(badWishPath, 'export const foo = "bar";', 'utf-8');
|
|
@@ -91,7 +91,7 @@ describe('executeApplyCommand', () => {
|
|
|
91
91
|
changes: [],
|
|
92
92
|
};
|
|
93
93
|
await (0, promises_1.writeFile)(planFilePath, JSON.stringify(invalidPlan, null, 2));
|
|
94
|
-
await expect((0, apply_1.executeApplyCommand)({ planFilePath })).rejects.toThrow('Wish file must export
|
|
94
|
+
await expect((0, apply_1.executeApplyCommand)({ planFilePath })).rejects.toThrow('Wish file must export getResources() function');
|
|
95
95
|
// cleanup
|
|
96
96
|
await (0, promises_1.rm)(badWishPath);
|
|
97
97
|
});
|
|
@@ -144,5 +144,72 @@ describe('executeApplyCommand', () => {
|
|
|
144
144
|
// applying stale plan should throw
|
|
145
145
|
await expect((0, apply_1.executeApplyCommand)({ planFilePath })).rejects.toThrow('plan is stale');
|
|
146
146
|
});
|
|
147
|
+
describe('yolo mode (--plan yolo)', () => {
|
|
148
|
+
it('should apply changes directly from wish file without plan file', async () => {
|
|
149
|
+
// create isolated wish file for this test
|
|
150
|
+
const wishFilePath = await createIsolatedWishFile();
|
|
151
|
+
// spy on console to verify yolo logging
|
|
152
|
+
const logSpy = jest.spyOn(console, 'info');
|
|
153
|
+
// apply in yolo mode (no plan file needed)
|
|
154
|
+
await (0, apply_1.executeApplyCommand)({ planFilePath: 'yolo', wishFilePath });
|
|
155
|
+
// verify yolo mode logging occurred
|
|
156
|
+
const logCalls = logSpy.mock.calls.map((call) => call.join(' '));
|
|
157
|
+
expect(logCalls.some((log) => log.includes('yolo'))).toBe(true);
|
|
158
|
+
expect(logCalls.some((log) => log.includes('🤙'))).toBe(true);
|
|
159
|
+
// cleanup spy
|
|
160
|
+
logSpy.mockRestore();
|
|
161
|
+
});
|
|
162
|
+
it('should throw when --wish is not provided with --plan yolo', async () => {
|
|
163
|
+
await expect((0, apply_1.executeApplyCommand)({ planFilePath: 'yolo' })).rejects.toThrow('--wish required when --plan yolo');
|
|
164
|
+
});
|
|
165
|
+
it('should throw when wish file does not exist in yolo mode', async () => {
|
|
166
|
+
await expect((0, apply_1.executeApplyCommand)({
|
|
167
|
+
planFilePath: 'yolo',
|
|
168
|
+
wishFilePath: '/nonexistent/wish.ts',
|
|
169
|
+
})).rejects.toThrow('Wish file not found');
|
|
170
|
+
});
|
|
171
|
+
it('should skip staleness validation in yolo mode', async () => {
|
|
172
|
+
// create isolated wish file for this test
|
|
173
|
+
const wishFilePath = await createIsolatedWishFile();
|
|
174
|
+
// first apply to create resources
|
|
175
|
+
await (0, apply_1.executeApplyCommand)({ planFilePath: 'yolo', wishFilePath });
|
|
176
|
+
// apply again - should succeed without staleness check
|
|
177
|
+
// (in standard mode with stale plan this would fail)
|
|
178
|
+
await (0, apply_1.executeApplyCommand)({ planFilePath: 'yolo', wishFilePath });
|
|
179
|
+
});
|
|
180
|
+
it('should handle CREATE actions in yolo mode', async () => {
|
|
181
|
+
// create isolated wish file for this test
|
|
182
|
+
const wishFilePath = await createIsolatedWishFile();
|
|
183
|
+
// spy on console to verify CREATE logging
|
|
184
|
+
const logSpy = jest.spyOn(console, 'info');
|
|
185
|
+
// apply in yolo mode
|
|
186
|
+
await (0, apply_1.executeApplyCommand)({ planFilePath: 'yolo', wishFilePath });
|
|
187
|
+
// verify CREATE logging occurred (plan phase + apply phase = 4 total, 2 per phase)
|
|
188
|
+
const logCalls = logSpy.mock.calls.map((call) => call.join(' '));
|
|
189
|
+
const createLogs = logCalls.filter((log) => log.includes('CREATE'));
|
|
190
|
+
expect(createLogs.length).toBeGreaterThanOrEqual(2);
|
|
191
|
+
// cleanup spy
|
|
192
|
+
logSpy.mockRestore();
|
|
193
|
+
});
|
|
194
|
+
it('should handle KEEP actions in yolo mode', async () => {
|
|
195
|
+
// create isolated wish file for this test
|
|
196
|
+
const wishFilePath = await createIsolatedWishFile();
|
|
197
|
+
// first apply to create resources
|
|
198
|
+
await (0, apply_1.executeApplyCommand)({ planFilePath: 'yolo', wishFilePath });
|
|
199
|
+
// spy on console to verify KEEP logging
|
|
200
|
+
const logSpy = jest.spyOn(console, 'info');
|
|
201
|
+
// apply again - should show KEEP actions
|
|
202
|
+
await (0, apply_1.executeApplyCommand)({ planFilePath: 'yolo', wishFilePath });
|
|
203
|
+
// verify KEEP logging occurred (plan phase + apply phase = 4 total, 2 per phase)
|
|
204
|
+
const logCalls = logSpy.mock.calls.map((call) => call.join(' '));
|
|
205
|
+
const keepLogs = logCalls.filter((log) => log.includes('KEEP'));
|
|
206
|
+
expect(keepLogs.length).toBeGreaterThanOrEqual(2);
|
|
207
|
+
// cleanup spy
|
|
208
|
+
logSpy.mockRestore();
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
it('should throw when neither --plan nor --wish is provided', async () => {
|
|
212
|
+
await expect((0, apply_1.executeApplyCommand)({})).rejects.toThrow('--plan required');
|
|
213
|
+
});
|
|
147
214
|
});
|
|
148
215
|
//# sourceMappingURL=apply.integration.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.integration.test.js","sourceRoot":"","sources":["../../../src/contract/cli/apply.integration.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"apply.integration.test.js","sourceRoot":"","sources":["../../../src/contract/cli/apply.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,34 +37,59 @@ const DeclastructPlan_1 = require("../../domain.objects/DeclastructPlan");
|
|
|
37
37
|
const applyChanges_1 = require("../../domain.operations/apply/applyChanges");
|
|
38
38
|
const log = console;
|
|
39
39
|
/**
|
|
40
|
-
* .what = executes the apply command to apply
|
|
40
|
+
* .what = executes the apply command to apply infrastructure changes
|
|
41
41
|
* .why = provides CLI interface for applying infrastructure changes
|
|
42
|
-
* .note =
|
|
42
|
+
* .note = supports two modes:
|
|
43
|
+
* - standard: load plan from file, validate staleness, apply
|
|
44
|
+
* - yolo: plan from wish directly, skip validation, apply immediately
|
|
43
45
|
*/
|
|
44
|
-
const executeApplyCommand = async (
|
|
45
|
-
//
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
const executeApplyCommand = async (input) => {
|
|
47
|
+
// determine mode and validate input
|
|
48
|
+
const isYoloMode = input.planFilePath === 'yolo';
|
|
49
|
+
if (isYoloMode) {
|
|
50
|
+
// yolo mode requires --wish
|
|
51
|
+
if (!input.wishFilePath)
|
|
52
|
+
throw new helpful_errors_1.BadRequestError('--wish required when --plan yolo');
|
|
50
53
|
}
|
|
54
|
+
else {
|
|
55
|
+
// standard mode requires --plan (not "yolo")
|
|
56
|
+
if (!input.planFilePath)
|
|
57
|
+
throw new helpful_errors_1.BadRequestError('--plan required');
|
|
58
|
+
}
|
|
59
|
+
// resolve plan path (null for yolo mode)
|
|
60
|
+
const resolvedPlanPath = isYoloMode
|
|
61
|
+
? null
|
|
62
|
+
: (0, path_1.resolve)(process.cwd(), input.planFilePath);
|
|
63
|
+
// load plan from file (standard mode only)
|
|
64
|
+
const plan = await (async () => {
|
|
65
|
+
if (!resolvedPlanPath)
|
|
66
|
+
return null;
|
|
67
|
+
if (!(0, fs_1.existsSync)(resolvedPlanPath))
|
|
68
|
+
throw new helpful_errors_1.BadRequestError(`Plan file not found: ${resolvedPlanPath}`);
|
|
69
|
+
const planJson = await (0, promises_1.readFile)(resolvedPlanPath, 'utf-8');
|
|
70
|
+
return new DeclastructPlan_1.DeclastructPlan(JSON.parse(planJson));
|
|
71
|
+
})();
|
|
72
|
+
// resolve wish path (from input or from plan file)
|
|
73
|
+
const resolvedWishPath = isYoloMode
|
|
74
|
+
? (0, path_1.resolve)(process.cwd(), input.wishFilePath)
|
|
75
|
+
: plan.wish.uri;
|
|
76
|
+
// validate wish file exists
|
|
77
|
+
if (!(0, fs_1.existsSync)(resolvedWishPath))
|
|
78
|
+
throw new helpful_errors_1.BadRequestError(`Wish file not found: ${resolvedWishPath}`);
|
|
79
|
+
// log header
|
|
51
80
|
log.info('🌊 declastruct apply');
|
|
52
|
-
|
|
81
|
+
if (resolvedPlanPath)
|
|
82
|
+
log.info(` plan: ${resolvedPlanPath}`);
|
|
83
|
+
log.info(` wish: ${resolvedWishPath}`);
|
|
53
84
|
log.info('');
|
|
54
|
-
//
|
|
55
|
-
const
|
|
56
|
-
const plan = new DeclastructPlan_1.DeclastructPlan(JSON.parse(planJson));
|
|
57
|
-
// import wish file from plan
|
|
58
|
-
const wishPath = plan.wish.uri;
|
|
59
|
-
const wish = await Promise.resolve(`${wishPath}`).then(s => __importStar(require(s)));
|
|
85
|
+
// import wish file
|
|
86
|
+
const wish = await Promise.resolve(`${resolvedWishPath}`).then(s => __importStar(require(s)));
|
|
60
87
|
// validate exports
|
|
61
|
-
if (typeof wish.
|
|
62
|
-
throw new helpful_errors_1.BadRequestError('Wish file must export getProviders() function');
|
|
63
|
-
}
|
|
64
|
-
if (typeof wish.getResources !== 'function') {
|
|
88
|
+
if (typeof wish.getResources !== 'function')
|
|
65
89
|
throw new helpful_errors_1.BadRequestError('Wish file must export getResources() function');
|
|
66
|
-
|
|
67
|
-
|
|
90
|
+
if (typeof wish.getProviders !== 'function')
|
|
91
|
+
throw new helpful_errors_1.BadRequestError('Wish file must export getProviders() function');
|
|
92
|
+
// get resources and providers
|
|
68
93
|
const resources = await wish.getResources();
|
|
69
94
|
const providers = await wish.getProviders();
|
|
70
95
|
// initialize providers
|
|
@@ -75,8 +100,12 @@ const executeApplyCommand = async ({ planFilePath, }) => {
|
|
|
75
100
|
bottleneck: new bottleneck_1.default({ maxConcurrent: 1 }),
|
|
76
101
|
log,
|
|
77
102
|
};
|
|
78
|
-
// apply changes (
|
|
79
|
-
const result = await (0, applyChanges_1.applyChanges)({
|
|
103
|
+
// apply changes (plan=null triggers yolo mode, skipping validation)
|
|
104
|
+
const result = await (0, applyChanges_1.applyChanges)({
|
|
105
|
+
plan,
|
|
106
|
+
resources,
|
|
107
|
+
providers,
|
|
108
|
+
}, context);
|
|
80
109
|
// cleanup providers
|
|
81
110
|
log.info('');
|
|
82
111
|
log.info('✨ stop providers...');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/contract/cli/apply.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,4DAAoC;AACpC,2BAAgC;AAChC,0CAAuC;AACvC,mDAAiD;AACjD,+BAA+B;AAE/B,0EAAuE;AACvE,6EAA0E;AAE1E,MAAM,GAAG,GAAG,OAAO,CAAC;AAEpB
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/contract/cli/apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,11 +40,13 @@ const invoke = async ({ args }) => {
|
|
|
40
40
|
program
|
|
41
41
|
.command('apply')
|
|
42
42
|
.description('Apply changes from a plan file')
|
|
43
|
-
.
|
|
43
|
+
.option('--plan <file>', 'Path to plan file, or "yolo" for immediate apply')
|
|
44
|
+
.option('--wish <file>', 'Path to wish file (required when --plan yolo)')
|
|
44
45
|
.action(async (options) => {
|
|
45
46
|
try {
|
|
46
47
|
await (0, apply_1.executeApplyCommand)({
|
|
47
48
|
planFilePath: options.plan,
|
|
49
|
+
wishFilePath: options.wish,
|
|
48
50
|
});
|
|
49
51
|
}
|
|
50
52
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../../src/contract/cli/invoke.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AAEpC,yEAAwC;AACxC,mCAA8C;AAC9C,iCAA4C;AAE5C,MAAM,GAAG,GAAG,OAAO,CAAC;AAEpB;;;;GAIG;AACI,MAAM,MAAM,GAAG,KAAK,EAAE,EAAE,IAAI,EAAsB,EAAiB,EAAE;IAC1E,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,aAAa,CAAC;SACnB,WAAW,CAAC,wCAAwC,CAAC;SACrD,OAAO,CAAC,sBAAG,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yCAAyC,CAAC;SACtD,cAAc,CAAC,eAAe,EAAE,mBAAmB,CAAC;SACpD,cAAc,CAAC,eAAe,EAAE,0BAA0B,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,IAAA,yBAAkB,EAAC;gBACvB,YAAY,EAAE,OAAO,CAAC,IAAI;gBAC1B,YAAY,EAAE,OAAO,CAAC,IAAI;aAC3B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,
|
|
1
|
+
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../../src/contract/cli/invoke.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AAEpC,yEAAwC;AACxC,mCAA8C;AAC9C,iCAA4C;AAE5C,MAAM,GAAG,GAAG,OAAO,CAAC;AAEpB;;;;GAIG;AACI,MAAM,MAAM,GAAG,KAAK,EAAE,EAAE,IAAI,EAAsB,EAAiB,EAAE;IAC1E,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,aAAa,CAAC;SACnB,WAAW,CAAC,wCAAwC,CAAC;SACrD,OAAO,CAAC,sBAAG,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yCAAyC,CAAC;SACtD,cAAc,CAAC,eAAe,EAAE,mBAAmB,CAAC;SACpD,cAAc,CAAC,eAAe,EAAE,0BAA0B,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,IAAA,yBAAkB,EAAC;gBACvB,YAAY,EAAE,OAAO,CAAC,IAAI;gBAC1B,YAAY,EAAE,OAAO,CAAC,IAAI;aAC3B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,eAAe,EAAE,kDAAkD,CAAC;SAC3E,MAAM,CAAC,eAAe,EAAE,+CAA+C,CAAC;SACxE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,IAAA,2BAAmB,EAAC;gBACxB,YAAY,EAAE,OAAO,CAAC,IAAI;gBAC1B,YAAY,EAAE,OAAO,CAAC,IAAI;aAC3B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACnD,CAAC,CAAC;AA3CW,QAAA,MAAM,UA2CjB"}
|
|
@@ -5,12 +5,14 @@ import { DeclastructChange } from '../../domain.objects/DeclastructChange';
|
|
|
5
5
|
import { DeclastructPlan } from '../../domain.objects/DeclastructPlan';
|
|
6
6
|
import { DeclastructProvider } from '../../domain.objects/DeclastructProvider';
|
|
7
7
|
/**
|
|
8
|
-
* .what = applies
|
|
8
|
+
* .what = applies changes to achieve desired state
|
|
9
9
|
* .why = executes infrastructure changes in a controlled, observable manner
|
|
10
10
|
* .note = idempotent - reapplying same plan is safe (guards check if already applied)
|
|
11
|
+
* - when plan is provided, validates staleness before applying
|
|
12
|
+
* - when plan is null (yolo mode), skips validation and applies immediately
|
|
11
13
|
*/
|
|
12
14
|
export declare const applyChanges: (input: {
|
|
13
|
-
plan: DeclastructPlan;
|
|
15
|
+
plan: DeclastructPlan | null;
|
|
14
16
|
resources: DomainEntity<any>[];
|
|
15
17
|
providers: DeclastructProvider<any, any>[];
|
|
16
18
|
}, context: ContextLogTrail & ContextDeclastruct) => Promise<{
|
|
@@ -8,32 +8,41 @@ const planChanges_1 = require("../plan/planChanges");
|
|
|
8
8
|
const validate_1 = require("../plan/validate");
|
|
9
9
|
const applyChange_1 = require("./applyChange");
|
|
10
10
|
/**
|
|
11
|
-
* .what = applies
|
|
11
|
+
* .what = applies changes to achieve desired state
|
|
12
12
|
* .why = executes infrastructure changes in a controlled, observable manner
|
|
13
13
|
* .note = idempotent - reapplying same plan is safe (guards check if already applied)
|
|
14
|
+
* - when plan is provided, validates staleness before applying
|
|
15
|
+
* - when plan is null (yolo mode), skips validation and applies immediately
|
|
14
16
|
*/
|
|
15
17
|
const applyChanges = async (input, context) => {
|
|
16
|
-
// replan to
|
|
18
|
+
// replan to get current state
|
|
17
19
|
const currentPlan = await (0, planChanges_1.planChanges)({
|
|
18
20
|
resources: input.resources,
|
|
19
21
|
providers: input.providers,
|
|
20
|
-
wishFilePath: input.plan
|
|
22
|
+
wishFilePath: input.plan?.wish.uri ?? 'ignorable',
|
|
21
23
|
}, context);
|
|
22
|
-
// validate plan matches current state
|
|
23
|
-
(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
// validate plan matches current state (skip if no plan provided, i.e. yolo mode)
|
|
25
|
+
if (input.plan) {
|
|
26
|
+
(0, validate_1.assertPlanStillValid)({
|
|
27
|
+
originalPlan: input.plan,
|
|
28
|
+
currentPlan,
|
|
29
|
+
});
|
|
30
|
+
context.log.info('');
|
|
31
|
+
context.log.info('👌 plan still valid...');
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
context.log.info('');
|
|
35
|
+
context.log.info('🤙 yolo, plan not reviewed...');
|
|
36
|
+
}
|
|
37
|
+
// use current plan for apply (works for both modes)
|
|
38
|
+
const planToApply = currentPlan;
|
|
30
39
|
// log apply phase header
|
|
31
40
|
context.log.info('');
|
|
32
41
|
context.log.info('🪄 apply changes...');
|
|
33
42
|
context.log.info('');
|
|
34
43
|
// apply each change with real-time logging
|
|
35
44
|
const appliedChanges = [];
|
|
36
|
-
for (const change of
|
|
45
|
+
for (const change of planToApply.changes) {
|
|
37
46
|
// log KEEP actions and skip
|
|
38
47
|
if (change.action === DeclastructChange_1.DeclastructChangeAction.KEEP) {
|
|
39
48
|
context.log.info(`↓ [KEEP] ${change.forResource.slug}`, {});
|
|
@@ -42,15 +51,20 @@ const applyChanges = async (input, context) => {
|
|
|
42
51
|
// find the desired resource
|
|
43
52
|
const resourceFound = input.resources.find((candidate) => candidate.constructor.name === change.forResource.class &&
|
|
44
53
|
(0, domain_objects_1.getUniqueIdentifierSlug)(candidate) === change.forResource.slug) ??
|
|
45
|
-
helpful_errors_1.UnexpectedCodePathError.throw('could not find resource specified in plan. was it removed
|
|
46
|
-
//
|
|
54
|
+
helpful_errors_1.UnexpectedCodePathError.throw('could not find resource specified in plan. was it removed?', { change });
|
|
55
|
+
// log action start
|
|
56
|
+
context.log.info(`○ [${change.action}] ${change.forResource.slug}`, {});
|
|
57
|
+
// apply the change with timing
|
|
58
|
+
const startMs = Date.now();
|
|
47
59
|
const applied = await (0, applyChange_1.applyChange)({
|
|
48
60
|
change,
|
|
49
61
|
resource: resourceFound,
|
|
50
62
|
providers: input.providers,
|
|
51
63
|
});
|
|
52
|
-
|
|
53
|
-
|
|
64
|
+
const durationMs = Date.now() - startMs;
|
|
65
|
+
// log completion with duration
|
|
66
|
+
const durationSec = (durationMs / 1000).toFixed(2);
|
|
67
|
+
context.log.info(` └─ ✔ done in ${durationSec}s`, {});
|
|
54
68
|
appliedChanges.push(applied);
|
|
55
69
|
}
|
|
56
70
|
return { appliedChanges };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applyChanges.js","sourceRoot":"","sources":["../../../src/domain.operations/apply/applyChanges.ts"],"names":[],"mappings":";;;AAAA,mDAAuE;AACvE,mDAAyD;AAIzD,8EAGgD;AAGhD,qDAAkD;AAClD,+CAAwD;AACxD,+CAA4C;AAE5C
|
|
1
|
+
{"version":3,"file":"applyChanges.js","sourceRoot":"","sources":["../../../src/domain.operations/apply/applyChanges.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "declastruct",
|
|
3
3
|
"author": "ehmpathy",
|
|
4
4
|
"description": "Add declarative control to any resource constructs. Declare, plan, and apply within an observable pit-of-success.",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.3.0",
|
|
6
6
|
"repository": "ehmpathy/declastruct",
|
|
7
7
|
"homepage": "https://github.com/ehmpathy/declastruct",
|
|
8
8
|
"keywords": [
|