declastruct 1.3.1 → 1.4.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.js +4 -3
- package/dist/contract/cli/apply.js.map +1 -1
- package/dist/contract/cli/plan.js +4 -3
- package/dist/contract/cli/plan.js.map +1 -1
- package/dist/domain.operations/apply/applyChanges.d.ts +6 -6
- package/dist/domain.operations/apply/applyChanges.js +24 -14
- package/dist/domain.operations/apply/applyChanges.js.map +1 -1
- package/dist/domain.operations/plan/planChanges.d.ts +4 -4
- package/dist/domain.operations/plan/planChanges.js +40 -23
- package/dist/domain.operations/plan/planChanges.js.map +1 -1
- package/dist/infra/colorizeAction.d.ts +7 -0
- package/dist/infra/colorizeAction.js +31 -0
- package/dist/infra/colorizeAction.js.map +1 -0
- package/dist/infra/withSpinner.d.ts +12 -0
- package/dist/infra/withSpinner.js +90 -0
- package/dist/infra/withSpinner.js.map +1 -0
- package/package.json +2 -1
|
@@ -77,6 +77,7 @@ const executeApplyCommand = async (input) => {
|
|
|
77
77
|
if (!(0, fs_1.existsSync)(resolvedWishPath))
|
|
78
78
|
throw new helpful_errors_1.BadRequestError(`Wish file not found: ${resolvedWishPath}`);
|
|
79
79
|
// log header
|
|
80
|
+
log.info('');
|
|
80
81
|
log.info('🌊 declastruct apply');
|
|
81
82
|
if (resolvedPlanPath)
|
|
82
83
|
log.info(` plan: ${resolvedPlanPath}`);
|
|
@@ -93,7 +94,7 @@ const executeApplyCommand = async (input) => {
|
|
|
93
94
|
const resources = await wish.getResources();
|
|
94
95
|
const providers = await wish.getProviders();
|
|
95
96
|
// initialize providers
|
|
96
|
-
log.info('✨ start providers...');
|
|
97
|
+
// log.info('✨ start providers...');
|
|
97
98
|
await Promise.all(providers.map((p) => p.hooks.beforeAll()));
|
|
98
99
|
// create context
|
|
99
100
|
const context = {
|
|
@@ -107,8 +108,8 @@ const executeApplyCommand = async (input) => {
|
|
|
107
108
|
providers,
|
|
108
109
|
}, context);
|
|
109
110
|
// cleanup providers
|
|
110
|
-
log.info('');
|
|
111
|
-
log.info('✨ stop providers...');
|
|
111
|
+
// log.info('');
|
|
112
|
+
// log.info('✨ stop providers...');
|
|
112
113
|
await Promise.all(providers.map((p) => p.hooks.afterAll()));
|
|
113
114
|
// log summary
|
|
114
115
|
log.info('');
|
|
@@ -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;;;;;;GAMG;AACI,MAAM,mBAAmB,GAAG,KAAK,EAAE,KAGzC,EAAiB,EAAE;IAClB,oCAAoC;IACpC,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,KAAK,MAAM,CAAC;IACjD,IAAI,UAAU,EAAE,CAAC;QACf,4BAA4B;QAC5B,IAAI,CAAC,KAAK,CAAC,YAAY;YACrB,MAAM,IAAI,gCAAe,CAAC,kCAAkC,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,6CAA6C;QAC7C,IAAI,CAAC,KAAK,CAAC,YAAY;YAAE,MAAM,IAAI,gCAAe,CAAC,iBAAiB,CAAC,CAAC;IACxE,CAAC;IAED,yCAAyC;IACzC,MAAM,gBAAgB,GAAG,UAAU;QACjC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,IAAA,cAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,YAAa,CAAC,CAAC;IAEhD,2CAA2C;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,IAAqC,EAAE;QAC9D,IAAI,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC;QACnC,IAAI,CAAC,IAAA,eAAU,EAAC,gBAAgB,CAAC;YAC/B,MAAM,IAAI,gCAAe,CAAC,wBAAwB,gBAAgB,EAAE,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,MAAM,IAAA,mBAAQ,EAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,IAAI,iCAAe,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,EAAE,CAAC;IAEL,mDAAmD;IACnD,MAAM,gBAAgB,GAAG,UAAU;QACjC,CAAC,CAAC,IAAA,cAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,YAAa,CAAC;QAC7C,CAAC,CAAC,IAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IAEnB,4BAA4B;IAC5B,IAAI,CAAC,IAAA,eAAU,EAAC,gBAAgB,CAAC;QAC/B,MAAM,IAAI,gCAAe,CAAC,wBAAwB,gBAAgB,EAAE,CAAC,CAAC;IAExE,aAAa;IACb,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACjC,IAAI,gBAAgB;QAAE,GAAG,CAAC,IAAI,CAAC,YAAY,gBAAgB,EAAE,CAAC,CAAC;IAC/D,GAAG,CAAC,IAAI,CAAC,YAAY,gBAAgB,EAAE,CAAC,CAAC;IACzC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEb,mBAAmB;IACnB,MAAM,IAAI,GAAG,yBAAa,gBAAgB,uCAAC,CAAC;IAE5C,mBAAmB;IACnB,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,UAAU;QACzC,MAAM,IAAI,gCAAe,CAAC,+CAA+C,CAAC,CAAC;IAC7E,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,UAAU;QACzC,MAAM,IAAI,gCAAe,CAAC,+CAA+C,CAAC,CAAC;IAE7E,8BAA8B;IAC9B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC5C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAE5C,uBAAuB;IACvB,
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/contract/cli/apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,6 +48,7 @@ const executePlanCommand = async ({ wishFilePath, planFilePath, }) => {
|
|
|
48
48
|
if (!(0, fs_1.existsSync)(resolvedWishPath)) {
|
|
49
49
|
throw new helpful_errors_1.BadRequestError(`Wish file not found: ${resolvedWishPath}`);
|
|
50
50
|
}
|
|
51
|
+
log.info('');
|
|
51
52
|
log.info('🌊 declastruct plan');
|
|
52
53
|
log.info(` wish: ${resolvedWishPath}`);
|
|
53
54
|
log.info(` plan: ${resolvedPlanPath}`);
|
|
@@ -65,7 +66,7 @@ const executePlanCommand = async ({ wishFilePath, planFilePath, }) => {
|
|
|
65
66
|
const resources = await wish.getResources();
|
|
66
67
|
const providers = await wish.getProviders();
|
|
67
68
|
// initialize providers
|
|
68
|
-
log.info('✨ start providers...');
|
|
69
|
+
// log.info('✨ start providers...');
|
|
69
70
|
await Promise.all(providers.map((p) => p.hooks.beforeAll()));
|
|
70
71
|
// create context
|
|
71
72
|
const context = {
|
|
@@ -84,8 +85,8 @@ const executePlanCommand = async ({ wishFilePath, planFilePath, }) => {
|
|
|
84
85
|
// write plan to file
|
|
85
86
|
await (0, promises_1.writeFile)(resolvedPlanPath, JSON.stringify(plan, null, 2), 'utf-8');
|
|
86
87
|
// cleanup providers
|
|
87
|
-
log.info('');
|
|
88
|
-
log.info('✨ stop providers...');
|
|
88
|
+
// log.info('');
|
|
89
|
+
// log.info('✨ stop providers...');
|
|
89
90
|
await Promise.all(providers.map((p) => p.hooks.afterAll()));
|
|
90
91
|
// log summary
|
|
91
92
|
log.info('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/contract/cli/plan.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,4DAAoC;AACpC,2BAAgC;AAChC,0CAA+C;AAC/C,mDAAiD;AACjD,+BAAwC;AAExC,0EAAuE;AAEvE,MAAM,GAAG,GAAG,OAAO,CAAC;AAEpB;;;;GAIG;AACI,MAAM,kBAAkB,GAAG,KAAK,EAAE,EACvC,YAAY,EACZ,YAAY,GAIb,EAAiB,EAAE;IAClB,gBAAgB;IAChB,MAAM,gBAAgB,GAAG,IAAA,cAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;IAC9D,MAAM,gBAAgB,GAAG,IAAA,cAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;IAE9D,4BAA4B;IAC5B,IAAI,CAAC,IAAA,eAAU,EAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,gCAAe,CAAC,wBAAwB,gBAAgB,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAChC,GAAG,CAAC,IAAI,CAAC,YAAY,gBAAgB,EAAE,CAAC,CAAC;IACzC,GAAG,CAAC,IAAI,CAAC,YAAY,gBAAgB,EAAE,CAAC,CAAC;IACzC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEb,mBAAmB;IACnB,MAAM,IAAI,GAAG,yBAAa,gBAAgB,uCAAC,CAAC;IAE5C,mBAAmB;IACnB,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QAC5C,MAAM,IAAI,gCAAe,CAAC,+CAA+C,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QAC5C,MAAM,IAAI,gCAAe,CAAC,+CAA+C,CAAC,CAAC;IAC7E,CAAC;IAED,8BAA8B;IAC9B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC5C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAE5C,uBAAuB;IACvB,
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/contract/cli/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { DomainEntity } from 'domain-objects';
|
|
2
|
-
import { ContextLogTrail } from 'simple-log-methods';
|
|
3
|
-
import { ContextDeclastruct } from '../../domain.objects/ContextDeclastruct';
|
|
4
|
-
import { DeclastructChange } from '../../domain.objects/DeclastructChange';
|
|
5
|
-
import { DeclastructPlan } from '../../domain.objects/DeclastructPlan';
|
|
6
|
-
import { DeclastructProvider } from '../../domain.objects/DeclastructProvider';
|
|
1
|
+
import { type DomainEntity } from 'domain-objects';
|
|
2
|
+
import { type ContextLogTrail } from 'simple-log-methods';
|
|
3
|
+
import { type ContextDeclastruct } from '../../domain.objects/ContextDeclastruct';
|
|
4
|
+
import { type DeclastructChange } from '../../domain.objects/DeclastructChange';
|
|
5
|
+
import { type DeclastructPlan } from '../../domain.objects/DeclastructPlan';
|
|
6
|
+
import { type DeclastructProvider } from '../../domain.objects/DeclastructProvider';
|
|
7
7
|
/**
|
|
8
8
|
* .what = applies changes to achieve desired state
|
|
9
9
|
* .why = executes infrastructure changes in a controlled, observable manner
|
|
@@ -4,6 +4,8 @@ exports.applyChanges = void 0;
|
|
|
4
4
|
const domain_objects_1 = require("domain-objects");
|
|
5
5
|
const helpful_errors_1 = require("helpful-errors");
|
|
6
6
|
const DeclastructChange_1 = require("../../domain.objects/DeclastructChange");
|
|
7
|
+
const colorizeAction_1 = require("../../infra/colorizeAction");
|
|
8
|
+
const withSpinner_1 = require("../../infra/withSpinner");
|
|
7
9
|
const planChanges_1 = require("../plan/planChanges");
|
|
8
10
|
const validate_1 = require("../plan/validate");
|
|
9
11
|
const applyChange_1 = require("./applyChange");
|
|
@@ -21,6 +23,13 @@ const applyChanges = async (input, context) => {
|
|
|
21
23
|
providers: input.providers,
|
|
22
24
|
wishFilePath: input.plan?.wish.uri ?? 'ignorable',
|
|
23
25
|
}, context);
|
|
26
|
+
// use current plan for apply (works for both modes)
|
|
27
|
+
const planToApply = currentPlan;
|
|
28
|
+
// check if there are any actionable changes (non-KEEP)
|
|
29
|
+
const hasActionableChanges = planToApply.changes.some((change) => change.action !== DeclastructChange_1.DeclastructChangeAction.KEEP);
|
|
30
|
+
// skip apply phase if everything is in sync
|
|
31
|
+
if (!hasActionableChanges)
|
|
32
|
+
return { appliedChanges: [] };
|
|
24
33
|
// validate plan matches current state (skip if no plan provided, i.e. yolo mode)
|
|
25
34
|
if (input.plan) {
|
|
26
35
|
(0, validate_1.assertPlanStillValid)({
|
|
@@ -32,10 +41,8 @@ const applyChanges = async (input, context) => {
|
|
|
32
41
|
}
|
|
33
42
|
else {
|
|
34
43
|
context.log.info('');
|
|
35
|
-
context.log.info('🤙 yolo, plan
|
|
44
|
+
context.log.info('🤙 yolo, plan auto approved...');
|
|
36
45
|
}
|
|
37
|
-
// use current plan for apply (works for both modes)
|
|
38
|
-
const planToApply = currentPlan;
|
|
39
46
|
// log apply phase header
|
|
40
47
|
context.log.info('');
|
|
41
48
|
context.log.info('🪄 apply changes...');
|
|
@@ -45,26 +52,29 @@ const applyChanges = async (input, context) => {
|
|
|
45
52
|
for (const change of planToApply.changes) {
|
|
46
53
|
// log KEEP actions and skip
|
|
47
54
|
if (change.action === DeclastructChange_1.DeclastructChangeAction.KEEP) {
|
|
48
|
-
context.log.info(`↓
|
|
55
|
+
context.log.info(`↓ ${(0, colorizeAction_1.colorizeAction)(change.action)} ${change.forResource.slug}`);
|
|
49
56
|
continue;
|
|
50
57
|
}
|
|
51
58
|
// find the desired resource
|
|
52
59
|
const resourceFound = input.resources.find((candidate) => candidate.constructor.name === change.forResource.class &&
|
|
53
60
|
(0, domain_objects_1.getUniqueIdentifierSlug)(candidate) === change.forResource.slug) ??
|
|
54
61
|
helpful_errors_1.UnexpectedCodePathError.throw('could not find resource specified in plan. was it removed?', { change });
|
|
55
|
-
// log action
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const applied = await (0,
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
// log the action line (stays fixed)
|
|
63
|
+
const actionLabel = (0, colorizeAction_1.colorizeAction)(change.action);
|
|
64
|
+
context.log.info(`○ ${actionLabel} ${change.forResource.slug}`);
|
|
65
|
+
// apply the change with spinner on line below
|
|
66
|
+
const { result: applied, durationMs } = await (0, withSpinner_1.withSpinner)({
|
|
67
|
+
message: 'inflight',
|
|
68
|
+
operation: () => (0, applyChange_1.applyChange)({
|
|
69
|
+
change,
|
|
70
|
+
resource: resourceFound,
|
|
71
|
+
providers: input.providers,
|
|
72
|
+
}),
|
|
63
73
|
});
|
|
64
|
-
const durationMs = Date.now() - startMs;
|
|
65
74
|
// log completion with duration
|
|
66
75
|
const durationSec = (durationMs / 1000).toFixed(2);
|
|
67
|
-
context.log.info(` └─ ✔ done in ${durationSec}s
|
|
76
|
+
context.log.info(` └─ ✔ done in ${durationSec}s`);
|
|
77
|
+
context.log.info('');
|
|
68
78
|
appliedChanges.push(applied);
|
|
69
79
|
}
|
|
70
80
|
return { appliedChanges };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applyChanges.js","sourceRoot":"","sources":["../../../src/domain.operations/apply/applyChanges.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"applyChanges.js","sourceRoot":"","sources":["../../../src/domain.operations/apply/applyChanges.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { DomainEntity } from 'domain-objects';
|
|
2
|
-
import { ContextLogTrail } from 'simple-log-methods';
|
|
3
|
-
import { ContextDeclastruct } from '../../domain.objects/ContextDeclastruct';
|
|
1
|
+
import { type DomainEntity } from 'domain-objects';
|
|
2
|
+
import { type ContextLogTrail } from 'simple-log-methods';
|
|
3
|
+
import { type ContextDeclastruct } from '../../domain.objects/ContextDeclastruct';
|
|
4
4
|
import { DeclastructPlan } from '../../domain.objects/DeclastructPlan';
|
|
5
|
-
import { DeclastructProvider } from '../../domain.objects/DeclastructProvider';
|
|
5
|
+
import { type DeclastructProvider } from '../../domain.objects/DeclastructProvider';
|
|
6
6
|
/**
|
|
7
7
|
* .what = generates a plan of changes required to achieve desired state
|
|
8
8
|
* .why = enables users to review infrastructure changes before applying them
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.planChanges = void 0;
|
|
4
|
+
const domain_objects_1 = require("domain-objects");
|
|
4
5
|
const DeclastructChange_1 = require("../../domain.objects/DeclastructChange");
|
|
5
6
|
const DeclastructPlan_1 = require("../../domain.objects/DeclastructPlan");
|
|
6
7
|
const asIsoTimestamp_1 = require("../../infra/asIsoTimestamp");
|
|
8
|
+
const colorizeAction_1 = require("../../infra/colorizeAction");
|
|
9
|
+
const withSpinner_1 = require("../../infra/withSpinner");
|
|
7
10
|
const computeChange_1 = require("./computeChange");
|
|
8
11
|
const getDaoByResource_1 = require("./getDaoByResource");
|
|
9
12
|
const hashChanges_1 = require("./hashChanges");
|
|
@@ -14,7 +17,6 @@ const hashChanges_1 = require("./hashChanges");
|
|
|
14
17
|
*/
|
|
15
18
|
const planChanges = async (input, context) => {
|
|
16
19
|
// log plan phase header
|
|
17
|
-
context.log.info('');
|
|
18
20
|
context.log.info('🔮 plan changes...');
|
|
19
21
|
context.log.info('');
|
|
20
22
|
// extract bottleneck for planning
|
|
@@ -22,29 +24,44 @@ const planChanges = async (input, context) => {
|
|
|
22
24
|
? context.bottleneck.onPlan
|
|
23
25
|
: context.bottleneck;
|
|
24
26
|
// compute change for each resource with real-time logging
|
|
25
|
-
const changes =
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
resource
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
27
|
+
const changes = [];
|
|
28
|
+
for (const resource of input.resources) {
|
|
29
|
+
const change = await bottleneck.schedule(async () => {
|
|
30
|
+
// find DAO and provider context for this resource
|
|
31
|
+
const { dao, context: providerContext } = (0, getDaoByResource_1.getDaoByResource)({
|
|
32
|
+
resource,
|
|
33
|
+
providers: input.providers,
|
|
34
|
+
});
|
|
35
|
+
// log the resource being planned
|
|
36
|
+
context.log.info(`○ ${(0, domain_objects_1.getUniqueIdentifierSlug)(resource)}`);
|
|
37
|
+
// fetch current remote state using provider context with spinner
|
|
38
|
+
const { result: remoteState, durationMs } = await (0, withSpinner_1.withSpinner)({
|
|
39
|
+
message: 'inflight',
|
|
40
|
+
operation: () => dao.get.byUnique(resource, providerContext),
|
|
41
|
+
});
|
|
42
|
+
// log done (replaces spinner)
|
|
43
|
+
const durationSec = (durationMs / 1000).toFixed(2);
|
|
44
|
+
context.log.info(` ├─ ✔ done in ${durationSec}s`);
|
|
45
|
+
// compute change
|
|
46
|
+
const computed = (0, computeChange_1.computeChange)({
|
|
47
|
+
desired: resource,
|
|
48
|
+
remote: remoteState,
|
|
49
|
+
});
|
|
50
|
+
// log decision
|
|
51
|
+
context.log.info(` └─ decision ${(0, colorizeAction_1.colorizeAction)(computed.action)}`);
|
|
52
|
+
// and the diff too, indented to align with tree
|
|
53
|
+
if (computed.state.difference) {
|
|
54
|
+
const indentedDiff = computed.state.difference
|
|
55
|
+
.split('\n')
|
|
56
|
+
.map((line) => ` ${line}`)
|
|
57
|
+
.join('\n');
|
|
58
|
+
context.log.info(indentedDiff);
|
|
59
|
+
}
|
|
44
60
|
context.log.info('');
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
61
|
+
return computed;
|
|
62
|
+
});
|
|
63
|
+
changes.push(change);
|
|
64
|
+
}
|
|
48
65
|
// log success message if everything is in sync
|
|
49
66
|
const allInSync = changes.every((change) => change.action === DeclastructChange_1.DeclastructChangeAction.KEEP);
|
|
50
67
|
if (allInSync) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planChanges.js","sourceRoot":"","sources":["../../../src/domain.operations/plan/planChanges.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"planChanges.js","sourceRoot":"","sources":["../../../src/domain.operations/plan/planChanges.ts"],"names":[],"mappings":";;;AAAA,mDAA4E;AAI5E,8EAAiF;AACjF,0EAAuE;AAEvE,+DAA4D;AAC5D,+DAA4D;AAC5D,yDAAsD;AACtD,mDAAgD;AAChD,yDAAsD;AACtD,+CAA4C;AAE5C;;;;GAIG;AACI,MAAM,WAAW,GAAG,KAAK,EAC9B,KAIC,EACD,OAA6C,EACnB,EAAE;IAC5B,wBAAwB;IACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAErB,kCAAkC;IAClC,MAAM,UAAU,GACd,QAAQ,IAAI,OAAO,CAAC,UAAU;QAC5B,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM;QAC3B,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IAEzB,0DAA0D;IAC1D,MAAM,OAAO,GAAG,EAAE,CAAC;IACnB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAClD,kDAAkD;YAClD,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,IAAA,mCAAgB,EAAC;gBACzD,QAAQ;gBACR,SAAS,EAAE,KAAK,CAAC,SAAS;aAC3B,CAAC,CAAC;YAEH,iCAAiC;YACjC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAA,wCAAuB,EAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAE3D,iEAAiE;YACjE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,IAAA,yBAAW,EAAC;gBAC5D,OAAO,EAAE,UAAU;gBACnB,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;aAC7D,CAAC,CAAC;YAEH,8BAA8B;YAC9B,MAAM,WAAW,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,WAAW,GAAG,CAAC,CAAC;YAEpD,iBAAiB;YACjB,MAAM,QAAQ,GAAG,IAAA,6BAAa,EAAC;gBAC7B,OAAO,EAAE,QAAQ;gBACjB,MAAM,EAAE,WAAW;aACpB,CAAC,CAAC;YAEH,eAAe;YACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAA,+BAAc,EAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAEtE,gDAAgD;YAChD,IAAI,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBAC9B,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU;qBAC3C,KAAK,CAAC,IAAI,CAAC;qBACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC;qBAC9B,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAErB,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,+CAA+C;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAC7B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,2CAAuB,CAAC,IAAI,CAC3D,CAAC;IACF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAChD,CAAC;IAED,cAAc;IACd,OAAO,IAAI,iCAAe,CAAC;QACzB,IAAI,EAAE,IAAA,yBAAW,EAAC,OAAO,CAAC;QAC1B,SAAS,EAAE,IAAA,+BAAc,EAAC,IAAI,IAAI,EAAE,CAAC;QACrC,IAAI,EAAE;YACJ,GAAG,EAAE,KAAK,CAAC,YAAY;SACxB;QACD,OAAO;KACR,CAAC,CAAC;AACL,CAAC,CAAC;AAnFW,QAAA,WAAW,eAmFtB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { DeclastructChangeAction } from '../domain.objects/DeclastructChange';
|
|
2
|
+
/**
|
|
3
|
+
* .what = returns a colorized action label for CLI output
|
|
4
|
+
* .why = improves visual distinction between action types
|
|
5
|
+
* .note = uses pastel colors for a softer, zen aesthetic
|
|
6
|
+
*/
|
|
7
|
+
export declare const colorizeAction: (action: DeclastructChangeAction) => string;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.colorizeAction = void 0;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const DeclastructChange_1 = require("../domain.objects/DeclastructChange");
|
|
9
|
+
/**
|
|
10
|
+
* .what = returns a colorized action label for CLI output
|
|
11
|
+
* .why = improves visual distinction between action types
|
|
12
|
+
* .note = uses pastel colors for a softer, zen aesthetic
|
|
13
|
+
*/
|
|
14
|
+
const colorizeAction = (action) => {
|
|
15
|
+
switch (action) {
|
|
16
|
+
case DeclastructChange_1.DeclastructChangeAction.KEEP:
|
|
17
|
+
return chalk_1.default.hex('#9ca3af')('[KEEP]'); // pastel gray
|
|
18
|
+
case DeclastructChange_1.DeclastructChangeAction.CREATE:
|
|
19
|
+
return chalk_1.default.hex('#86efac')('[CREATE]'); // pastel green
|
|
20
|
+
case DeclastructChange_1.DeclastructChangeAction.UPDATE:
|
|
21
|
+
return chalk_1.default.hex('#fde047')('[UPDATE]'); // pastel yellow
|
|
22
|
+
case DeclastructChange_1.DeclastructChangeAction.DESTROY:
|
|
23
|
+
return chalk_1.default.hex('#fca5a5')('[DESTROY]'); // pastel red
|
|
24
|
+
case DeclastructChange_1.DeclastructChangeAction.REPLACE:
|
|
25
|
+
return chalk_1.default.hex('#fca5a5')('[REPLACE]'); // pastel red, since it includes a destroy
|
|
26
|
+
default:
|
|
27
|
+
return `[${action}]`;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
exports.colorizeAction = colorizeAction;
|
|
31
|
+
//# sourceMappingURL=colorizeAction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colorizeAction.js","sourceRoot":"","sources":["../../src/infra/colorizeAction.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,2EAA8E;AAE9E;;;;GAIG;AACI,MAAM,cAAc,GAAG,CAAC,MAA+B,EAAU,EAAE;IACxE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,2CAAuB,CAAC,IAAI;YAC/B,OAAO,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc;QACvD,KAAK,2CAAuB,CAAC,MAAM;YACjC,OAAO,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe;QAC1D,KAAK,2CAAuB,CAAC,MAAM;YACjC,OAAO,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB;QAC3D,KAAK,2CAAuB,CAAC,OAAO;YAClC,OAAO,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa;QACzD,KAAK,2CAAuB,CAAC,OAAO;YAClC,OAAO,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,0CAA0C;QACtF;YACE,OAAO,IAAI,MAAM,GAAG,CAAC;IACzB,CAAC;AACH,CAAC,CAAC;AAfW,QAAA,cAAc,kBAezB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* .what = wraps an async operation with a CLI spinner showing elapsed time
|
|
3
|
+
* .why = provides visual feedback during long-running operations
|
|
4
|
+
* .note = spinner renders on its own line below the action, cleared on completion
|
|
5
|
+
*/
|
|
6
|
+
export declare const withSpinner: <T>(input: {
|
|
7
|
+
message: string;
|
|
8
|
+
operation: () => Promise<T>;
|
|
9
|
+
}) => Promise<{
|
|
10
|
+
result: T;
|
|
11
|
+
durationMs: number;
|
|
12
|
+
}>;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withSpinner = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* .what = wraps an async operation with a CLI spinner showing elapsed time
|
|
6
|
+
* .why = provides visual feedback during long-running operations
|
|
7
|
+
* .note = spinner renders on its own line below the action, cleared on completion
|
|
8
|
+
*/
|
|
9
|
+
const withSpinner = async (input) => {
|
|
10
|
+
// spinner frames (braille pattern)
|
|
11
|
+
const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
12
|
+
let frameIndex = 0;
|
|
13
|
+
const startMs = Date.now();
|
|
14
|
+
// track if we own the current line (no other output since last render)
|
|
15
|
+
let ownsCurrentLine = false; // start false since we haven't rendered yet
|
|
16
|
+
let isSpinnerWriting = false;
|
|
17
|
+
// intercept stdout to detect if other output occurred
|
|
18
|
+
const originalWrite = process.stdout.write.bind(process.stdout);
|
|
19
|
+
process.stdout.write = ((chunk, ...args) => {
|
|
20
|
+
// if this write is not from the spinner, mark that we lost ownership
|
|
21
|
+
if (!isSpinnerWriting) {
|
|
22
|
+
ownsCurrentLine = false;
|
|
23
|
+
}
|
|
24
|
+
return originalWrite(chunk, ...args);
|
|
25
|
+
});
|
|
26
|
+
// format elapsed time as human readable
|
|
27
|
+
const formatElapsed = (ms) => {
|
|
28
|
+
const seconds = ms / 1000;
|
|
29
|
+
if (seconds < 60)
|
|
30
|
+
return `${seconds.toFixed(1)}s`;
|
|
31
|
+
const minutes = Math.floor(seconds / 60);
|
|
32
|
+
const remainingSeconds = seconds % 60;
|
|
33
|
+
return `${minutes}m ${remainingSeconds.toFixed(0)}s`;
|
|
34
|
+
};
|
|
35
|
+
// render the current spinner state
|
|
36
|
+
const render = () => {
|
|
37
|
+
const elapsed = formatElapsed(Date.now() - startMs);
|
|
38
|
+
const frame = frames[frameIndex % frames.length];
|
|
39
|
+
const line = ` └─ ${frame} ${input.message} ${elapsed}`;
|
|
40
|
+
// mark that we're the ones writing
|
|
41
|
+
isSpinnerWriting = true;
|
|
42
|
+
if (ownsCurrentLine) {
|
|
43
|
+
// move up, clear line, write new frame, newline
|
|
44
|
+
process.stdout.write(`\x1b[A\r\x1b[K${line}\n`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// first render with trailing newline for whitespace
|
|
48
|
+
process.stdout.write(`${line}\n`);
|
|
49
|
+
ownsCurrentLine = true;
|
|
50
|
+
}
|
|
51
|
+
isSpinnerWriting = false;
|
|
52
|
+
frameIndex++;
|
|
53
|
+
};
|
|
54
|
+
// start spinner interval (80ms for smooth animation)
|
|
55
|
+
const interval = setInterval(render, 80);
|
|
56
|
+
render(); // render immediately
|
|
57
|
+
try {
|
|
58
|
+
// execute the operation
|
|
59
|
+
const result = await input.operation();
|
|
60
|
+
const durationMs = Date.now() - startMs;
|
|
61
|
+
// stop spinner
|
|
62
|
+
clearInterval(interval);
|
|
63
|
+
// restore original stdout.write
|
|
64
|
+
process.stdout.write = originalWrite;
|
|
65
|
+
// move up to spinner line, clear it
|
|
66
|
+
if (ownsCurrentLine) {
|
|
67
|
+
originalWrite('\x1b[A\r\x1b[K'); // move up + clear line
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
originalWrite('\n'); // newline if other output occurred
|
|
71
|
+
}
|
|
72
|
+
return { result, durationMs };
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
// stop spinner on error
|
|
76
|
+
clearInterval(interval);
|
|
77
|
+
// restore original stdout.write
|
|
78
|
+
process.stdout.write = originalWrite;
|
|
79
|
+
// move up to spinner line, clear it
|
|
80
|
+
if (ownsCurrentLine) {
|
|
81
|
+
originalWrite('\x1b[A\r\x1b[K');
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
originalWrite('\n');
|
|
85
|
+
}
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
exports.withSpinner = withSpinner;
|
|
90
|
+
//# sourceMappingURL=withSpinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withSpinner.js","sourceRoot":"","sources":["../../src/infra/withSpinner.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.4.0",
|
|
6
6
|
"repository": "ehmpathy/declastruct",
|
|
7
7
|
"homepage": "https://github.com/ehmpathy/declastruct",
|
|
8
8
|
"keywords": [
|
|
@@ -55,6 +55,7 @@
|
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"bottleneck": "2.19.5",
|
|
58
|
+
"chalk": "5.4.1",
|
|
58
59
|
"commander": "14.0.2",
|
|
59
60
|
"helpful-errors": "1.5.3",
|
|
60
61
|
"jest-diff": "30.0.2",
|