declastruct 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.test/assets/providers/demo.provider.d.ts +32 -0
- package/dist/.test/assets/providers/demo.provider.js +101 -0
- package/dist/.test/assets/providers/demo.provider.js.map +1 -0
- package/dist/contract/cli/apply.d.ts +9 -0
- package/dist/contract/cli/apply.integration.test.js +148 -0
- package/dist/contract/cli/apply.integration.test.js.map +1 -0
- package/dist/contract/cli/apply.js +90 -0
- package/dist/contract/cli/apply.js.map +1 -0
- package/dist/contract/cli/invoke.d.ts +8 -0
- package/dist/contract/cli/invoke.js +58 -0
- package/dist/contract/cli/invoke.js.map +1 -0
- package/dist/contract/cli/plan.d.ts +10 -0
- package/dist/contract/cli/plan.integration.test.js +107 -0
- package/dist/contract/cli/plan.integration.test.js.map +1 -0
- package/dist/contract/cli/plan.js +94 -0
- package/dist/contract/cli/plan.js.map +1 -0
- package/dist/contract/sdk/index.d.ts +15 -3
- package/dist/contract/sdk/index.js +31 -17
- package/dist/contract/sdk/index.js.map +1 -1
- package/dist/domain.objects/ContextDeclastruct.d.ts +15 -0
- package/dist/{domain/DeclastructContext.js → domain.objects/ContextDeclastruct.js} +1 -1
- package/dist/domain.objects/ContextDeclastruct.js.map +1 -0
- package/dist/domain.objects/ContextDeclastruct.test.js +41 -0
- package/dist/domain.objects/ContextDeclastruct.test.js.map +1 -0
- package/dist/domain.objects/DeclastructChange.d.ts +73 -0
- package/dist/domain.objects/DeclastructChange.js +35 -0
- package/dist/domain.objects/DeclastructChange.js.map +1 -0
- package/dist/domain.objects/DeclastructChange.test.js +59 -0
- package/dist/domain.objects/DeclastructChange.test.js.map +1 -0
- package/dist/domain.objects/DeclastructDao.d.ts +39 -0
- package/dist/domain.objects/DeclastructDao.js +8 -0
- package/dist/domain.objects/DeclastructDao.js.map +1 -0
- package/dist/domain.objects/DeclastructDao.test.js +42 -0
- package/dist/domain.objects/DeclastructDao.test.js.map +1 -0
- package/dist/domain.objects/DeclastructPlan.d.ts +35 -0
- package/dist/domain.objects/DeclastructPlan.js +11 -0
- package/dist/domain.objects/DeclastructPlan.js.map +1 -0
- package/dist/domain.objects/DeclastructPlan.test.js +31 -0
- package/dist/domain.objects/DeclastructPlan.test.js.map +1 -0
- package/dist/domain.objects/DeclastructProvider.d.ts +30 -0
- package/dist/domain.objects/DeclastructProvider.js +8 -0
- package/dist/domain.objects/DeclastructProvider.js.map +1 -0
- package/dist/domain.objects/DeclastructProvider.test.js +35 -0
- package/dist/domain.objects/DeclastructProvider.test.js.map +1 -0
- package/dist/domain.objects/IsoTimestamp.d.ts +6 -0
- package/dist/{domain/DeclaredResource.js → domain.objects/IsoTimestamp.js} +1 -1
- package/dist/domain.objects/IsoTimestamp.js.map +1 -0
- package/dist/domain.objects/IsoTimestamp.test.js +10 -0
- package/dist/domain.objects/IsoTimestamp.test.js.map +1 -0
- package/dist/domain.operations/apply/applyChange.d.ts +14 -0
- package/dist/domain.operations/apply/applyChange.js +64 -0
- package/dist/domain.operations/apply/applyChange.js.map +1 -0
- package/dist/domain.operations/apply/applyChange.test.d.ts +1 -0
- package/dist/domain.operations/apply/applyChange.test.js +247 -0
- package/dist/domain.operations/apply/applyChange.test.js.map +1 -0
- package/dist/domain.operations/apply/applyChanges.d.ts +18 -0
- package/dist/domain.operations/apply/applyChanges.integration.test.d.ts +1 -0
- package/dist/domain.operations/apply/applyChanges.integration.test.js +291 -0
- package/dist/domain.operations/apply/applyChanges.integration.test.js.map +1 -0
- package/dist/domain.operations/apply/applyChanges.js +53 -0
- package/dist/domain.operations/apply/applyChanges.js.map +1 -0
- package/dist/domain.operations/plan/computeChange.d.ts +11 -0
- package/dist/domain.operations/plan/computeChange.js +78 -0
- package/dist/domain.operations/plan/computeChange.js.map +1 -0
- package/dist/domain.operations/plan/computeChange.test.d.ts +1 -0
- package/dist/domain.operations/plan/computeChange.test.js +67 -0
- package/dist/domain.operations/plan/computeChange.test.js.map +1 -0
- package/dist/domain.operations/plan/extractResourcesFromPlan.d.ts +8 -0
- package/dist/domain.operations/plan/extractResourcesFromPlan.js +17 -0
- package/dist/domain.operations/plan/extractResourcesFromPlan.js.map +1 -0
- package/dist/domain.operations/plan/getDaoByResource.d.ts +12 -0
- package/dist/domain.operations/plan/getDaoByResource.js +41 -0
- package/dist/domain.operations/plan/getDaoByResource.js.map +1 -0
- package/dist/domain.operations/plan/getDaoByResource.test.d.ts +1 -0
- package/dist/domain.operations/plan/getDaoByResource.test.js +99 -0
- package/dist/domain.operations/plan/getDaoByResource.test.js.map +1 -0
- package/dist/domain.operations/plan/hashChanges.d.ts +7 -0
- package/dist/domain.operations/plan/hashChanges.js +18 -0
- package/dist/domain.operations/plan/hashChanges.js.map +1 -0
- package/dist/domain.operations/plan/planChanges.d.ts +15 -0
- package/dist/domain.operations/plan/planChanges.integration.test.d.ts +1 -0
- package/dist/domain.operations/plan/planChanges.integration.test.js +197 -0
- package/dist/domain.operations/plan/planChanges.integration.test.js.map +1 -0
- package/dist/domain.operations/plan/planChanges.js +50 -0
- package/dist/domain.operations/plan/planChanges.js.map +1 -0
- package/dist/domain.operations/plan/validate.d.ts +10 -0
- package/dist/domain.operations/plan/validate.js +21 -0
- package/dist/domain.operations/plan/validate.js.map +1 -0
- package/dist/infra/asIsoTimestamp.d.ts +6 -0
- package/dist/infra/asIsoTimestamp.js +12 -0
- package/dist/infra/asIsoTimestamp.js.map +1 -0
- package/package.json +8 -15
- package/readme.md +225 -29
- package/dist/__test_assets__/getExampleContext.d.ts +0 -33
- package/dist/__test_assets__/getExampleContext.js +0 -87
- package/dist/__test_assets__/getExampleContext.js.map +0 -1
- package/dist/contract/commands/command.apply.d.ts +0 -6
- package/dist/contract/commands/command.apply.js +0 -20
- package/dist/contract/commands/command.apply.js.map +0 -1
- package/dist/contract/commands/command.plan.d.ts +0 -6
- package/dist/contract/commands/command.plan.js +0 -20
- package/dist/contract/commands/command.plan.js.map +0 -1
- package/dist/contract/commands/utils/resolveCommandInputs.d.ts +0 -17
- package/dist/contract/commands/utils/resolveCommandInputs.js +0 -23
- package/dist/contract/commands/utils/resolveCommandInputs.js.map +0 -1
- package/dist/contract/sdk/refs.d.ts +0 -2
- package/dist/contract/sdk/refs.js +0 -19
- package/dist/contract/sdk/refs.js.map +0 -1
- package/dist/contract/sdk/sync/apply.d.ts +0 -22
- package/dist/contract/sdk/sync/apply.js +0 -29
- package/dist/contract/sdk/sync/apply.js.map +0 -1
- package/dist/contract/sdk/sync/plan.d.ts +0 -22
- package/dist/contract/sdk/sync/plan.js +0 -30
- package/dist/contract/sdk/sync/plan.js.map +0 -1
- package/dist/domain/DeclaredResource.d.ts +0 -2
- package/dist/domain/DeclaredResource.js.map +0 -1
- package/dist/domain/DeclaredResourceReference.d.ts +0 -66
- package/dist/domain/DeclaredResourceReference.js +0 -42
- package/dist/domain/DeclaredResourceReference.js.map +0 -1
- package/dist/domain/DeclastructChangeProposal.d.ts +0 -61
- package/dist/domain/DeclastructChangeProposal.js +0 -37
- package/dist/domain/DeclastructChangeProposal.js.map +0 -1
- package/dist/domain/DeclastructContext.d.ts +0 -24
- package/dist/domain/DeclastructContext.js.map +0 -1
- package/dist/domain/DeclastructProvider.d.ts +0 -58
- package/dist/domain/DeclastructProvider.js +0 -3
- package/dist/domain/DeclastructProvider.js.map +0 -1
- package/dist/domain/DeclastructProviderContext.d.ts +0 -30
- package/dist/domain/DeclastructProviderContext.js +0 -3
- package/dist/domain/DeclastructProviderContext.js.map +0 -1
- package/dist/domain/DeclastructProviderResourceRemoteStateInterface.d.ts +0 -156
- package/dist/domain/DeclastructProviderResourceRemoteStateInterface.js +0 -3
- package/dist/domain/DeclastructProviderResourceRemoteStateInterface.js.map +0 -1
- package/dist/logic/actions/execute/canUpdateResource.d.ts +0 -5
- package/dist/logic/actions/execute/canUpdateResource.js +0 -12
- package/dist/logic/actions/execute/canUpdateResource.js.map +0 -1
- package/dist/logic/actions/execute/executeProposal.d.ts +0 -5
- package/dist/logic/actions/execute/executeProposal.js +0 -52
- package/dist/logic/actions/execute/executeProposal.js.map +0 -1
- package/dist/logic/actions/propose/getColoredActionToken.d.ts +0 -4
- package/dist/logic/actions/propose/getColoredActionToken.js +0 -22
- package/dist/logic/actions/propose/getColoredActionToken.js.map +0 -1
- package/dist/logic/actions/propose/getColoredProposalTitle.d.ts +0 -4
- package/dist/logic/actions/propose/getColoredProposalTitle.js +0 -34
- package/dist/logic/actions/propose/getColoredProposalTitle.js.map +0 -1
- package/dist/logic/actions/propose/proposeChangeForResource.d.ts +0 -7
- package/dist/logic/actions/propose/proposeChangeForResource.js +0 -65
- package/dist/logic/actions/propose/proposeChangeForResource.js.map +0 -1
- package/dist/logic/actions/propose/proposeChangeForResource.test.js +0 -48
- package/dist/logic/actions/propose/proposeChangeForResource.test.js.map +0 -1
- package/dist/logic/commands/command.apply.d.ts +0 -8
- package/dist/logic/commands/command.apply.js +0 -77
- package/dist/logic/commands/command.apply.js.map +0 -1
- package/dist/logic/commands/command.plan.d.ts +0 -13
- package/dist/logic/commands/command.plan.js +0 -155
- package/dist/logic/commands/command.plan.js.map +0 -1
- package/dist/logic/commands/execute.d.ts +0 -15
- package/dist/logic/commands/execute.js +0 -63
- package/dist/logic/commands/execute.js.map +0 -1
- package/dist/logic/tools/compare/castReferenceToGrokableString.d.ts +0 -16
- package/dist/logic/tools/compare/castReferenceToGrokableString.js +0 -66
- package/dist/logic/tools/compare/castReferenceToGrokableString.js.map +0 -1
- package/dist/logic/tools/compare/castReferenceToGrokableString.test.js +0 -111
- package/dist/logic/tools/compare/castReferenceToGrokableString.test.js.map +0 -1
- package/dist/logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.d.ts +0 -11
- package/dist/logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.js +0 -61
- package/dist/logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.js.map +0 -1
- package/dist/logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.test.js +0 -31
- package/dist/logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.test.js.map +0 -1
- package/dist/logic/tools/compare/resolveReferenceToCommonComparableForm.d.ts +0 -21
- package/dist/logic/tools/compare/resolveReferenceToCommonComparableForm.js +0 -53
- package/dist/logic/tools/compare/resolveReferenceToCommonComparableForm.js.map +0 -1
- package/dist/logic/tools/compare/resolveReferenceToCommonComparableForm.test.js +0 -31
- package/dist/logic/tools/compare/resolveReferenceToCommonComparableForm.test.js.map +0 -1
- package/dist/logic/tools/compare/resolveReferencesToCommonComparableForm.d.ts +0 -10
- package/dist/logic/tools/compare/resolveReferencesToCommonComparableForm.js +0 -41
- package/dist/logic/tools/compare/resolveReferencesToCommonComparableForm.js.map +0 -1
- package/dist/logic/tools/compare/resolveReferencesToCommonComparableForm.test.js +0 -174
- package/dist/logic/tools/compare/resolveReferencesToCommonComparableForm.test.js.map +0 -1
- package/dist/logic/tools/context/createDeclastructContext.d.ts +0 -10
- package/dist/logic/tools/context/createDeclastructContext.js +0 -12
- package/dist/logic/tools/context/createDeclastructContext.js.map +0 -1
- package/dist/logic/tools/context/destroyDeclastructContext.d.ts +0 -4
- package/dist/logic/tools/context/destroyDeclastructContext.js +0 -10
- package/dist/logic/tools/context/destroyDeclastructContext.js.map +0 -1
- package/dist/logic/tools/provider/castProviderContextToGlobalContext.d.ts +0 -4
- package/dist/logic/tools/provider/castProviderContextToGlobalContext.js +0 -10
- package/dist/logic/tools/provider/castProviderContextToGlobalContext.js.map +0 -1
- package/dist/logic/tools/provider/getProviderContextFromGlobalContextForResourceClass.d.ts +0 -13
- package/dist/logic/tools/provider/getProviderContextFromGlobalContextForResourceClass.js +0 -29
- package/dist/logic/tools/provider/getProviderContextFromGlobalContextForResourceClass.js.map +0 -1
- package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource.d.ts +0 -13
- package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource.js +0 -24
- package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource.js.map +0 -1
- package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceFromContextForResourceClass.d.ts +0 -10
- package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceFromContextForResourceClass.js +0 -21
- package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceFromContextForResourceClass.js.map +0 -1
- package/dist/logic/tools/reference/buildPrimaryKeyTo.d.ts +0 -5
- package/dist/logic/tools/reference/buildPrimaryKeyTo.js +0 -40
- package/dist/logic/tools/reference/buildPrimaryKeyTo.js.map +0 -1
- package/dist/logic/tools/reference/buildReferenceTo.d.ts +0 -28
- package/dist/logic/tools/reference/buildReferenceTo.js +0 -92
- package/dist/logic/tools/reference/buildReferenceTo.js.map +0 -1
- package/dist/logic/tools/reference/buildReferenceTo.test.js +0 -119
- package/dist/logic/tools/reference/buildReferenceTo.test.js.map +0 -1
- package/dist/logic/tools/reference/buildUniqueKeyTo.d.ts +0 -5
- package/dist/logic/tools/reference/buildUniqueKeyTo.js +0 -40
- package/dist/logic/tools/reference/buildUniqueKeyTo.js.map +0 -1
- package/dist/logic/tools/reference/defineReferenceClassOf.d.ts +0 -5
- package/dist/logic/tools/reference/defineReferenceClassOf.js +0 -25
- package/dist/logic/tools/reference/defineReferenceClassOf.js.map +0 -1
- package/dist/logic/tools/reference/defineReferenceKeyConstituentsOf.d.ts +0 -13
- package/dist/logic/tools/reference/defineReferenceKeyConstituentsOf.js +0 -36
- package/dist/logic/tools/reference/defineReferenceKeyConstituentsOf.js.map +0 -1
- package/dist/logic/tools/reference/getByReference.d.ts +0 -15
- package/dist/logic/tools/reference/getByReference.js +0 -55
- package/dist/logic/tools/reference/getByReference.js.map +0 -1
- package/dist/logic/tools/reference/getByReference.test.js +0 -92
- package/dist/logic/tools/reference/getByReference.test.js.map +0 -1
- package/dist/logic/tools/reference/getByReferencedPrimaryKey.d.ts +0 -6
- package/dist/logic/tools/reference/getByReferencedPrimaryKey.js +0 -17
- package/dist/logic/tools/reference/getByReferencedPrimaryKey.js.map +0 -1
- package/dist/logic/tools/reference/getByReferencedUniqueKey.d.ts +0 -7
- package/dist/logic/tools/reference/getByReferencedUniqueKey.js +0 -42
- package/dist/logic/tools/reference/getByReferencedUniqueKey.js.map +0 -1
- package/dist/logic/tools/reference/getPrimaryKeyByReference.d.ts +0 -15
- package/dist/logic/tools/reference/getPrimaryKeyByReference.js +0 -36
- package/dist/logic/tools/reference/getPrimaryKeyByReference.js.map +0 -1
- package/dist/logic/tools/reference/getReferenceTo.d.ts +0 -18
- package/dist/logic/tools/reference/getReferenceTo.js +0 -55
- package/dist/logic/tools/reference/getReferenceTo.js.map +0 -1
- package/dist/logic/tools/reference/getReferenceTo.test.js +0 -95
- package/dist/logic/tools/reference/getReferenceTo.test.js.map +0 -1
- package/dist/logic/tools/reference/getUniqueKeyByReference.d.ts +0 -15
- package/dist/logic/tools/reference/getUniqueKeyByReference.js +0 -36
- package/dist/logic/tools/reference/getUniqueKeyByReference.js.map +0 -1
- package/dist/logic/tools/reference/isPrimaryKeyReference.d.ts +0 -6
- package/dist/logic/tools/reference/isPrimaryKeyReference.js +0 -7
- package/dist/logic/tools/reference/isPrimaryKeyReference.js.map +0 -1
- package/dist/logic/tools/reference/isUniqueKeyReference.d.ts +0 -6
- package/dist/logic/tools/reference/isUniqueKeyReference.js +0 -7
- package/dist/logic/tools/reference/isUniqueKeyReference.js.map +0 -1
- /package/dist/{logic/actions/propose/proposeChangeForResource.test.d.ts → contract/cli/apply.integration.test.d.ts} +0 -0
- /package/dist/{logic/tools/compare/castReferenceToGrokableString.test.d.ts → contract/cli/plan.integration.test.d.ts} +0 -0
- /package/dist/{logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.test.d.ts → domain.objects/ContextDeclastruct.test.d.ts} +0 -0
- /package/dist/{logic/tools/compare/resolveReferenceToCommonComparableForm.test.d.ts → domain.objects/DeclastructChange.test.d.ts} +0 -0
- /package/dist/{logic/tools/compare/resolveReferencesToCommonComparableForm.test.d.ts → domain.objects/DeclastructDao.test.d.ts} +0 -0
- /package/dist/{logic/tools/reference/buildReferenceTo.test.d.ts → domain.objects/DeclastructPlan.test.d.ts} +0 -0
- /package/dist/{logic/tools/reference/getByReference.test.d.ts → domain.objects/DeclastructProvider.test.d.ts} +0 -0
- /package/dist/{logic/tools/reference/getReferenceTo.test.d.ts → domain.objects/IsoTimestamp.test.d.ts} +0 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const domain_objects_1 = require("domain-objects");
|
|
4
|
+
const helpful_errors_1 = require("helpful-errors");
|
|
5
|
+
const DeclastructProvider_1 = require("../../domain.objects/DeclastructProvider");
|
|
6
|
+
const getDaoByResource_1 = require("./getDaoByResource");
|
|
7
|
+
describe('getDaoByResource', () => {
|
|
8
|
+
class DemoResource extends domain_objects_1.DomainEntity {
|
|
9
|
+
}
|
|
10
|
+
DemoResource.unique = ['id'];
|
|
11
|
+
it('should return DAO when exactly one provider matches', () => {
|
|
12
|
+
const demoDao = {
|
|
13
|
+
get: {
|
|
14
|
+
byUnique: async () => null,
|
|
15
|
+
byRef: async () => null,
|
|
16
|
+
},
|
|
17
|
+
set: {
|
|
18
|
+
finsert: async (input) => input,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
const provider = new DeclastructProvider_1.DeclastructProvider({
|
|
22
|
+
name: 'test-provider',
|
|
23
|
+
daos: { DemoResource: demoDao },
|
|
24
|
+
context: {},
|
|
25
|
+
hooks: {
|
|
26
|
+
beforeAll: async () => { },
|
|
27
|
+
afterAll: async () => { },
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
const resource = new DemoResource({ id: 'test-1', name: 'Test' });
|
|
31
|
+
const result = (0, getDaoByResource_1.getDaoByResource)({
|
|
32
|
+
resource,
|
|
33
|
+
providers: [provider],
|
|
34
|
+
});
|
|
35
|
+
expect(result).toBe(demoDao);
|
|
36
|
+
});
|
|
37
|
+
it('should throw UnexpectedCodePathError when multiple providers support same resource', () => {
|
|
38
|
+
const dao1 = {
|
|
39
|
+
get: {
|
|
40
|
+
byUnique: async () => null,
|
|
41
|
+
byRef: async () => null,
|
|
42
|
+
},
|
|
43
|
+
set: {
|
|
44
|
+
finsert: async (input) => input,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
const dao2 = {
|
|
48
|
+
get: {
|
|
49
|
+
byUnique: async () => null,
|
|
50
|
+
byRef: async () => null,
|
|
51
|
+
},
|
|
52
|
+
set: {
|
|
53
|
+
finsert: async (input) => input,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
const provider1 = new DeclastructProvider_1.DeclastructProvider({
|
|
57
|
+
name: 'provider-1',
|
|
58
|
+
daos: { DemoResource: dao1 },
|
|
59
|
+
context: {},
|
|
60
|
+
hooks: {
|
|
61
|
+
beforeAll: async () => { },
|
|
62
|
+
afterAll: async () => { },
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
const provider2 = new DeclastructProvider_1.DeclastructProvider({
|
|
66
|
+
name: 'provider-2',
|
|
67
|
+
daos: { DemoResource: dao2 },
|
|
68
|
+
context: {},
|
|
69
|
+
hooks: {
|
|
70
|
+
beforeAll: async () => { },
|
|
71
|
+
afterAll: async () => { },
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
const resource = new DemoResource({ id: 'test-1', name: 'Test' });
|
|
75
|
+
const error = (0, helpful_errors_1.getError)(() => (0, getDaoByResource_1.getDaoByResource)({
|
|
76
|
+
resource,
|
|
77
|
+
providers: [provider1, provider2],
|
|
78
|
+
}));
|
|
79
|
+
expect(error.message).toContain('multiple providers support same resource');
|
|
80
|
+
});
|
|
81
|
+
it('should throw UnexpectedCodePathError when no provider supports resource', () => {
|
|
82
|
+
const provider = new DeclastructProvider_1.DeclastructProvider({
|
|
83
|
+
name: 'empty-provider',
|
|
84
|
+
daos: {},
|
|
85
|
+
context: {},
|
|
86
|
+
hooks: {
|
|
87
|
+
beforeAll: async () => { },
|
|
88
|
+
afterAll: async () => { },
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
const resource = new DemoResource({ id: 'test-1', name: 'Test' });
|
|
92
|
+
const error = (0, helpful_errors_1.getError)(() => (0, getDaoByResource_1.getDaoByResource)({
|
|
93
|
+
resource,
|
|
94
|
+
providers: [provider],
|
|
95
|
+
}));
|
|
96
|
+
expect(error.message).toContain('no DAO found for resource');
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=getDaoByResource.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getDaoByResource.test.js","sourceRoot":"","sources":["../../../src/domain.operations/plan/getDaoByResource.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { DeclastructChange } from '../../domain.objects/DeclastructChange';
|
|
2
|
+
/**
|
|
3
|
+
* .what = computes deterministic hash of changes
|
|
4
|
+
* .why = enables plan comparison and staleness detection
|
|
5
|
+
* .note = uses SHA-256 for consistency
|
|
6
|
+
*/
|
|
7
|
+
export declare const hashChanges: (changes: DeclastructChange[]) => string;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hashChanges = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
/**
|
|
6
|
+
* .what = computes deterministic hash of changes
|
|
7
|
+
* .why = enables plan comparison and staleness detection
|
|
8
|
+
* .note = uses SHA-256 for consistency
|
|
9
|
+
*/
|
|
10
|
+
const hashChanges = (changes) => {
|
|
11
|
+
// serialize changes to deterministic JSON
|
|
12
|
+
const serialized = JSON.stringify(changes, null, 0);
|
|
13
|
+
// compute SHA-256 hash
|
|
14
|
+
const hash = (0, crypto_1.createHash)('sha256').update(serialized).digest('hex');
|
|
15
|
+
return hash;
|
|
16
|
+
};
|
|
17
|
+
exports.hashChanges = hashChanges;
|
|
18
|
+
//# sourceMappingURL=hashChanges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hashChanges.js","sourceRoot":"","sources":["../../../src/domain.operations/plan/hashChanges.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AAIpC;;;;GAIG;AACI,MAAM,WAAW,GAAG,CAAC,OAA4B,EAAU,EAAE;IAClE,0CAA0C;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEpD,uBAAuB;IACvB,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEnE,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AARW,QAAA,WAAW,eAQtB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { DomainEntity } from 'domain-objects';
|
|
2
|
+
import { ContextLogTrail } from 'simple-log-methods';
|
|
3
|
+
import { ContextDeclastruct } from '../../domain.objects/ContextDeclastruct';
|
|
4
|
+
import { DeclastructPlan } from '../../domain.objects/DeclastructPlan';
|
|
5
|
+
import { DeclastructProvider } from '../../domain.objects/DeclastructProvider';
|
|
6
|
+
/**
|
|
7
|
+
* .what = generates a plan of changes required to achieve desired state
|
|
8
|
+
* .why = enables users to review infrastructure changes before applying them
|
|
9
|
+
* .note = idempotent - calling multiple times produces the same plan
|
|
10
|
+
*/
|
|
11
|
+
export declare const planChanges: (input: {
|
|
12
|
+
resources: DomainEntity<any>[];
|
|
13
|
+
providers: DeclastructProvider<any, any>[];
|
|
14
|
+
wishFilePath: string;
|
|
15
|
+
}, context: ContextLogTrail & ContextDeclastruct) => Promise<DeclastructPlan>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,197 @@
|
|
|
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
|
+
const bottleneck_1 = __importDefault(require("bottleneck"));
|
|
7
|
+
const path_1 = require("path");
|
|
8
|
+
const demo_provider_1 = require("../../.test/assets/providers/demo.provider");
|
|
9
|
+
const DeclastructChange_1 = require("../../domain.objects/DeclastructChange");
|
|
10
|
+
const planChanges_1 = require("./planChanges");
|
|
11
|
+
describe('planChanges', () => {
|
|
12
|
+
const wishFilePath = (0, path_1.resolve)(process.cwd(), 'src/.test/assets/wish.fixture.ts');
|
|
13
|
+
beforeAll(async () => {
|
|
14
|
+
// initialize provider (creates temp directory)
|
|
15
|
+
await demo_provider_1.demoProvider.hooks.beforeAll();
|
|
16
|
+
});
|
|
17
|
+
const createContext = () => ({
|
|
18
|
+
bottleneck: new bottleneck_1.default({ maxConcurrent: 10 }),
|
|
19
|
+
log: {
|
|
20
|
+
info: jest.fn(),
|
|
21
|
+
error: jest.fn(),
|
|
22
|
+
warn: jest.fn(),
|
|
23
|
+
debug: jest.fn(),
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
it('should plan CREATE actions for resources that do not exist remotely', async () => {
|
|
27
|
+
// define desired resources
|
|
28
|
+
const resources = [
|
|
29
|
+
(0, demo_provider_1.genSampleDemoResource)({ name: 'First Test' }),
|
|
30
|
+
(0, demo_provider_1.genSampleDemoResource)({ name: 'Second Test' }),
|
|
31
|
+
];
|
|
32
|
+
// plan changes
|
|
33
|
+
const plan = await (0, planChanges_1.planChanges)({
|
|
34
|
+
resources,
|
|
35
|
+
providers: [demo_provider_1.demoProvider],
|
|
36
|
+
wishFilePath,
|
|
37
|
+
}, createContext());
|
|
38
|
+
// verify plan structure
|
|
39
|
+
expect(plan.hash).toBeDefined();
|
|
40
|
+
expect(plan.createdAt).toBeDefined();
|
|
41
|
+
expect(plan.wish.uri).toBe(wishFilePath);
|
|
42
|
+
expect(plan.changes.length).toBe(2);
|
|
43
|
+
// verify all changes are CREATE
|
|
44
|
+
plan.changes.forEach((change) => {
|
|
45
|
+
expect(change.action).toBe(DeclastructChange_1.DeclastructChangeAction.CREATE);
|
|
46
|
+
expect(change.forResource.class).toBe('DemoResource');
|
|
47
|
+
expect(change.state.desired).toBeDefined();
|
|
48
|
+
expect(change.state.remote).toBeNull();
|
|
49
|
+
});
|
|
50
|
+
// verify specific resources (slug includes full format with hash)
|
|
51
|
+
const slugs = plan.changes.map((c) => c.forResource.slug);
|
|
52
|
+
expect(slugs[0]).toContain(resources[0].exid);
|
|
53
|
+
expect(slugs[1]).toContain(resources[1].exid);
|
|
54
|
+
});
|
|
55
|
+
it('should plan KEEP actions for resources that exist unchanged remotely', async () => {
|
|
56
|
+
// define resources
|
|
57
|
+
const resources = [
|
|
58
|
+
(0, demo_provider_1.genSampleDemoResource)({ name: 'First Test' }),
|
|
59
|
+
(0, demo_provider_1.genSampleDemoResource)({ name: 'Second Test' }),
|
|
60
|
+
];
|
|
61
|
+
// create remote state
|
|
62
|
+
const dao = demo_provider_1.demoProvider.daos.DemoResource;
|
|
63
|
+
await dao.set.finsert(resources[0], {});
|
|
64
|
+
await dao.set.finsert(resources[1], {});
|
|
65
|
+
// plan changes
|
|
66
|
+
const plan = await (0, planChanges_1.planChanges)({
|
|
67
|
+
resources,
|
|
68
|
+
providers: [demo_provider_1.demoProvider],
|
|
69
|
+
wishFilePath,
|
|
70
|
+
}, createContext());
|
|
71
|
+
// verify all changes are KEEP
|
|
72
|
+
expect(plan.changes.length).toBe(2);
|
|
73
|
+
plan.changes.forEach((change) => {
|
|
74
|
+
expect(change.action).toBe(DeclastructChange_1.DeclastructChangeAction.KEEP);
|
|
75
|
+
expect(change.forResource.class).toBe('DemoResource');
|
|
76
|
+
expect(change.state.desired).toBeDefined();
|
|
77
|
+
expect(change.state.remote).toBeDefined();
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
it('should plan UPDATE actions for resources that changed remotely', async () => {
|
|
81
|
+
// create remote state
|
|
82
|
+
const remoteResource = (0, demo_provider_1.genSampleDemoResource)({ name: 'Old Name' });
|
|
83
|
+
const dao = demo_provider_1.demoProvider.daos.DemoResource;
|
|
84
|
+
await dao.set.finsert(remoteResource, {});
|
|
85
|
+
// define desired resource with new name (same exid)
|
|
86
|
+
const resources = [remoteResource.clone({ name: 'New Name' })];
|
|
87
|
+
// plan changes
|
|
88
|
+
const plan = await (0, planChanges_1.planChanges)({
|
|
89
|
+
resources,
|
|
90
|
+
providers: [demo_provider_1.demoProvider],
|
|
91
|
+
wishFilePath,
|
|
92
|
+
}, createContext());
|
|
93
|
+
// verify UPDATE action
|
|
94
|
+
expect(plan.changes.length).toBe(1);
|
|
95
|
+
const change = plan.changes[0];
|
|
96
|
+
expect(change.action).toBe(DeclastructChange_1.DeclastructChangeAction.UPDATE);
|
|
97
|
+
expect(change.forResource.class).toBe('DemoResource');
|
|
98
|
+
expect(change.forResource.slug).toContain(remoteResource.exid);
|
|
99
|
+
expect(change.state.desired.name).toBe('New Name');
|
|
100
|
+
expect(change.state.remote?.name).toBe('Old Name');
|
|
101
|
+
expect(change.toString()).toBeDefined();
|
|
102
|
+
});
|
|
103
|
+
it('should plan DELETE actions for resources that exist remotely but not in desired state', async () => {
|
|
104
|
+
// create remote state
|
|
105
|
+
const resource1 = (0, demo_provider_1.genSampleDemoResource)({ name: 'To Delete' });
|
|
106
|
+
const resource2 = (0, demo_provider_1.genSampleDemoResource)({ name: 'To Keep' });
|
|
107
|
+
const dao = demo_provider_1.demoProvider.daos.DemoResource;
|
|
108
|
+
await dao.set.finsert(resource1, {});
|
|
109
|
+
await dao.set.finsert(resource2, {});
|
|
110
|
+
// define desired resources (only resource2)
|
|
111
|
+
const resources = [resource2];
|
|
112
|
+
// Note: planChanges only looks at desired resources, not remote state
|
|
113
|
+
// DELETE actions would need to be detected by comparing remote state to desired
|
|
114
|
+
// This is a design limitation - planChanges only processes desired resources
|
|
115
|
+
const plan = await (0, planChanges_1.planChanges)({
|
|
116
|
+
resources,
|
|
117
|
+
providers: [demo_provider_1.demoProvider],
|
|
118
|
+
wishFilePath,
|
|
119
|
+
}, createContext());
|
|
120
|
+
// verify only resource2 is in plan
|
|
121
|
+
expect(plan.changes.length).toBe(1);
|
|
122
|
+
expect(plan.changes[0].forResource.slug).toContain(resource2.exid);
|
|
123
|
+
expect(plan.changes[0].action).toBe(DeclastructChange_1.DeclastructChangeAction.KEEP);
|
|
124
|
+
});
|
|
125
|
+
it('should emit real-time logs as resources are planned', async () => {
|
|
126
|
+
// define resources
|
|
127
|
+
const resources = [
|
|
128
|
+
(0, demo_provider_1.genSampleDemoResource)({ name: 'First Test' }),
|
|
129
|
+
(0, demo_provider_1.genSampleDemoResource)({ name: 'Second Test' }),
|
|
130
|
+
];
|
|
131
|
+
// plan with spy on log
|
|
132
|
+
const context = createContext();
|
|
133
|
+
await (0, planChanges_1.planChanges)({
|
|
134
|
+
resources,
|
|
135
|
+
providers: [demo_provider_1.demoProvider],
|
|
136
|
+
wishFilePath,
|
|
137
|
+
}, context);
|
|
138
|
+
// verify logs were emitted (logs include the full slug with hash)
|
|
139
|
+
expect(context.log.info).toHaveBeenCalledWith(expect.stringContaining(`[CREATE] DemoResource.`), {});
|
|
140
|
+
expect(context.log.info).toHaveBeenCalled();
|
|
141
|
+
});
|
|
142
|
+
it('should handle mixed actions in single plan', async () => {
|
|
143
|
+
// create remote resources
|
|
144
|
+
const resource1 = (0, demo_provider_1.genSampleDemoResource)({ name: 'Unchanged' });
|
|
145
|
+
const resource2 = (0, demo_provider_1.genSampleDemoResource)({ name: 'Old Name' });
|
|
146
|
+
// create remote state for some resources
|
|
147
|
+
const dao = demo_provider_1.demoProvider.daos.DemoResource;
|
|
148
|
+
await dao.set.finsert(resource1, {});
|
|
149
|
+
await dao.set.finsert(resource2, {});
|
|
150
|
+
// define desired resources
|
|
151
|
+
const resources = [
|
|
152
|
+
resource1, // KEEP
|
|
153
|
+
resource2.clone({ name: 'New Name' }), // UPDATE
|
|
154
|
+
(0, demo_provider_1.genSampleDemoResource)({ name: 'Brand New' }), // CREATE
|
|
155
|
+
];
|
|
156
|
+
// plan changes
|
|
157
|
+
const plan = await (0, planChanges_1.planChanges)({
|
|
158
|
+
resources,
|
|
159
|
+
providers: [demo_provider_1.demoProvider],
|
|
160
|
+
wishFilePath,
|
|
161
|
+
}, createContext());
|
|
162
|
+
// verify mixed actions
|
|
163
|
+
expect(plan.changes.length).toBe(3);
|
|
164
|
+
// verify we have one of each action
|
|
165
|
+
const actions = plan.changes.map((c) => c.action);
|
|
166
|
+
expect(actions).toContain(DeclastructChange_1.DeclastructChangeAction.KEEP);
|
|
167
|
+
expect(actions).toContain(DeclastructChange_1.DeclastructChangeAction.UPDATE);
|
|
168
|
+
expect(actions).toContain(DeclastructChange_1.DeclastructChangeAction.CREATE);
|
|
169
|
+
// verify exids are in slugs
|
|
170
|
+
const slugString = plan.changes.map((c) => c.forResource.slug).join(',');
|
|
171
|
+
expect(slugString).toContain(resource1.exid);
|
|
172
|
+
expect(slugString).toContain(resource2.exid);
|
|
173
|
+
expect(slugString).toContain(resources[2].exid);
|
|
174
|
+
});
|
|
175
|
+
it('should produce deterministic plans for same input', async () => {
|
|
176
|
+
// define resources
|
|
177
|
+
const resources = [
|
|
178
|
+
(0, demo_provider_1.genSampleDemoResource)({ name: 'First Test' }),
|
|
179
|
+
(0, demo_provider_1.genSampleDemoResource)({ name: 'Second Test' }),
|
|
180
|
+
];
|
|
181
|
+
// plan twice
|
|
182
|
+
const plan1 = await (0, planChanges_1.planChanges)({
|
|
183
|
+
resources,
|
|
184
|
+
providers: [demo_provider_1.demoProvider],
|
|
185
|
+
wishFilePath,
|
|
186
|
+
}, createContext());
|
|
187
|
+
const plan2 = await (0, planChanges_1.planChanges)({
|
|
188
|
+
resources,
|
|
189
|
+
providers: [demo_provider_1.demoProvider],
|
|
190
|
+
wishFilePath,
|
|
191
|
+
}, createContext());
|
|
192
|
+
// verify plans have same hash (deterministic)
|
|
193
|
+
expect(plan1.hash).toBe(plan2.hash);
|
|
194
|
+
expect(plan1.changes.length).toBe(plan2.changes.length);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
//# sourceMappingURL=planChanges.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planChanges.integration.test.js","sourceRoot":"","sources":["../../../src/domain.operations/plan/planChanges.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.planChanges = void 0;
|
|
4
|
+
const DeclastructChange_1 = require("../../domain.objects/DeclastructChange");
|
|
5
|
+
const DeclastructPlan_1 = require("../../domain.objects/DeclastructPlan");
|
|
6
|
+
const asIsoTimestamp_1 = require("../../infra/asIsoTimestamp");
|
|
7
|
+
const computeChange_1 = require("./computeChange");
|
|
8
|
+
const getDaoByResource_1 = require("./getDaoByResource");
|
|
9
|
+
const hashChanges_1 = require("./hashChanges");
|
|
10
|
+
/**
|
|
11
|
+
* .what = generates a plan of changes required to achieve desired state
|
|
12
|
+
* .why = enables users to review infrastructure changes before applying them
|
|
13
|
+
* .note = idempotent - calling multiple times produces the same plan
|
|
14
|
+
*/
|
|
15
|
+
const planChanges = async (input, context) => {
|
|
16
|
+
// extract bottleneck for planning
|
|
17
|
+
const bottleneck = 'onPlan' in context.bottleneck
|
|
18
|
+
? context.bottleneck.onPlan
|
|
19
|
+
: context.bottleneck;
|
|
20
|
+
// compute change for each resource with real-time logging
|
|
21
|
+
const changes = await Promise.all(input.resources.map((resource) => bottleneck.schedule(async () => {
|
|
22
|
+
// find DAO for this resource
|
|
23
|
+
const dao = (0, getDaoByResource_1.getDaoByResource)({
|
|
24
|
+
resource,
|
|
25
|
+
providers: input.providers,
|
|
26
|
+
});
|
|
27
|
+
// fetch current remote state
|
|
28
|
+
const remoteState = await dao.get.byUnique(resource, context);
|
|
29
|
+
// compute change
|
|
30
|
+
const change = (0, computeChange_1.computeChange)({
|
|
31
|
+
desired: resource,
|
|
32
|
+
remote: remoteState,
|
|
33
|
+
});
|
|
34
|
+
// log change as it's computed
|
|
35
|
+
const symbol = change.action === DeclastructChange_1.DeclastructChangeAction.KEEP ? '↓' : '○';
|
|
36
|
+
context.log.info(`${symbol} [${change.action}] ${change.forResource.slug}`, {});
|
|
37
|
+
return change;
|
|
38
|
+
})));
|
|
39
|
+
// return plan
|
|
40
|
+
return new DeclastructPlan_1.DeclastructPlan({
|
|
41
|
+
hash: (0, hashChanges_1.hashChanges)(changes),
|
|
42
|
+
createdAt: (0, asIsoTimestamp_1.asIsoTimestamp)(new Date()),
|
|
43
|
+
wish: {
|
|
44
|
+
uri: input.wishFilePath,
|
|
45
|
+
},
|
|
46
|
+
changes,
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
exports.planChanges = planChanges;
|
|
50
|
+
//# sourceMappingURL=planChanges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planChanges.js","sourceRoot":"","sources":["../../../src/domain.operations/plan/planChanges.ts"],"names":[],"mappings":";;;AAIA,8EAAiF;AACjF,0EAAuE;AAEvE,+DAA4D;AAC5D,mDAAgD;AAChD,yDAAsD;AACtD,+CAA4C;AAE5C;;;;GAIG;AACI,MAAM,WAAW,GAAG,KAAK,EAC9B,KAIC,EACD,OAA6C,EACnB,EAAE;IAC5B,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,MAAM,OAAO,CAAC,GAAG,CAC/B,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC/B,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;QAC7B,6BAA6B;QAC7B,MAAM,GAAG,GAAG,IAAA,mCAAgB,EAAC;YAC3B,QAAQ;YACR,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC,CAAC;QAEH,6BAA6B;QAC7B,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE9D,iBAAiB;QACjB,MAAM,MAAM,GAAG,IAAA,6BAAa,EAAC;YAC3B,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;QAEH,8BAA8B;QAC9B,MAAM,MAAM,GACV,MAAM,CAAC,MAAM,KAAK,2CAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,IAAI,CACd,GAAG,MAAM,KAAK,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,EACzD,EAAE,CACH,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CACH,CACF,CAAC;IAEF,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;AAvDW,QAAA,WAAW,eAuDtB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DeclastructPlan } from '../../domain.objects/DeclastructPlan';
|
|
2
|
+
/**
|
|
3
|
+
* .what = validates that a plan hasn't become stale
|
|
4
|
+
* .why = prevents applying outdated changes to infrastructure
|
|
5
|
+
* .note = compares plan hashes to detect drift
|
|
6
|
+
*/
|
|
7
|
+
export declare const assertPlanStillValid: ({ originalPlan, currentPlan, }: {
|
|
8
|
+
originalPlan: DeclastructPlan;
|
|
9
|
+
currentPlan: DeclastructPlan;
|
|
10
|
+
}) => void;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assertPlanStillValid = void 0;
|
|
4
|
+
const helpful_errors_1 = require("helpful-errors");
|
|
5
|
+
/**
|
|
6
|
+
* .what = validates that a plan hasn't become stale
|
|
7
|
+
* .why = prevents applying outdated changes to infrastructure
|
|
8
|
+
* .note = compares plan hashes to detect drift
|
|
9
|
+
*/
|
|
10
|
+
const assertPlanStillValid = ({ originalPlan, currentPlan, }) => {
|
|
11
|
+
// reject if plan hashes differ
|
|
12
|
+
if (originalPlan.hash !== currentPlan.hash) {
|
|
13
|
+
throw new helpful_errors_1.BadRequestError('plan is stale', {
|
|
14
|
+
originalHash: originalPlan.hash,
|
|
15
|
+
currentHash: currentPlan.hash,
|
|
16
|
+
message: 'The infrastructure state has changed since this plan was created. Please review and create a new plan.',
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
exports.assertPlanStillValid = assertPlanStillValid;
|
|
21
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/domain.operations/plan/validate.ts"],"names":[],"mappings":";;;AAAA,mDAAiD;AAIjD;;;;GAIG;AACI,MAAM,oBAAoB,GAAG,CAAC,EACnC,YAAY,EACZ,WAAW,GAIZ,EAAQ,EAAE;IACT,+BAA+B;IAC/B,IAAI,YAAY,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,IAAI,gCAAe,CAAC,eAAe,EAAE;YACzC,YAAY,EAAE,YAAY,CAAC,IAAI;YAC/B,WAAW,EAAE,WAAW,CAAC,IAAI;YAC7B,OAAO,EACL,wGAAwG;SAC3G,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AAhBW,QAAA,oBAAoB,wBAgB/B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.asIsoTimestamp = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* .what = converts a Date to ISO 8601 timestamp string
|
|
6
|
+
* .why = ensures consistent timestamp format across the system
|
|
7
|
+
*/
|
|
8
|
+
const asIsoTimestamp = (date) => {
|
|
9
|
+
return date.toISOString();
|
|
10
|
+
};
|
|
11
|
+
exports.asIsoTimestamp = asIsoTimestamp;
|
|
12
|
+
//# sourceMappingURL=asIsoTimestamp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asIsoTimestamp.js","sourceRoot":"","sources":["../../src/infra/asIsoTimestamp.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACI,MAAM,cAAc,GAAG,CAAC,IAAU,EAAgB,EAAE;IACzD,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,CAAC,CAAC;AAFW,QAAA,cAAc,kBAEzB"}
|
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.1.1",
|
|
6
6
|
"repository": "ehmpathy/declastruct",
|
|
7
7
|
"homepage": "https://github.com/ehmpathy/declastruct",
|
|
8
8
|
"keywords": [
|
|
@@ -49,22 +49,14 @@
|
|
|
49
49
|
"prepare:husky": "npx husky install && chmod ug+x .husky/*"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@ehmpathy/error-fns": "1.3.7",
|
|
53
|
-
"@ehmpathy/number-fns": "1.0.1",
|
|
54
52
|
"bottleneck": "2.19.5",
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"flattie": "1.1.1",
|
|
59
|
-
"indent-string": "5.0.0",
|
|
53
|
+
"commander": "14.0.2",
|
|
54
|
+
"domain-objects": "0.25.7",
|
|
55
|
+
"helpful-errors": "1.4.0",
|
|
60
56
|
"jest-diff": "30.0.2",
|
|
61
|
-
"
|
|
62
|
-
"ora": "5.4.1",
|
|
63
|
-
"simple-in-memory-cache": "0.4.0",
|
|
57
|
+
"simple-log-methods": "0.6.1",
|
|
64
58
|
"type-fns": "1.19.0",
|
|
65
|
-
"uuid-fns": "1.0.
|
|
66
|
-
"visualogic": "1.3.2",
|
|
67
|
-
"with-simple-caching": "0.14.1"
|
|
59
|
+
"uuid-fns": "1.0.2"
|
|
68
60
|
},
|
|
69
61
|
"devDependencies": {
|
|
70
62
|
"@commitlint/cli": "19.3.0",
|
|
@@ -87,7 +79,8 @@
|
|
|
87
79
|
"husky": "8.0.3",
|
|
88
80
|
"jest": "29.3.1",
|
|
89
81
|
"prettier": "2.8.1",
|
|
90
|
-
"
|
|
82
|
+
"rhachet": "1.12.1",
|
|
83
|
+
"rhachet-roles-ehmpathy": "1.9.1",
|
|
91
84
|
"ts-jest": "29.1.3",
|
|
92
85
|
"ts-node": "10.9.2",
|
|
93
86
|
"typescript": "5.4.5"
|