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.
Files changed (250) hide show
  1. package/dist/.test/assets/providers/demo.provider.d.ts +32 -0
  2. package/dist/.test/assets/providers/demo.provider.js +101 -0
  3. package/dist/.test/assets/providers/demo.provider.js.map +1 -0
  4. package/dist/contract/cli/apply.d.ts +9 -0
  5. package/dist/contract/cli/apply.integration.test.js +148 -0
  6. package/dist/contract/cli/apply.integration.test.js.map +1 -0
  7. package/dist/contract/cli/apply.js +90 -0
  8. package/dist/contract/cli/apply.js.map +1 -0
  9. package/dist/contract/cli/invoke.d.ts +8 -0
  10. package/dist/contract/cli/invoke.js +58 -0
  11. package/dist/contract/cli/invoke.js.map +1 -0
  12. package/dist/contract/cli/plan.d.ts +10 -0
  13. package/dist/contract/cli/plan.integration.test.js +107 -0
  14. package/dist/contract/cli/plan.integration.test.js.map +1 -0
  15. package/dist/contract/cli/plan.js +94 -0
  16. package/dist/contract/cli/plan.js.map +1 -0
  17. package/dist/contract/sdk/index.d.ts +15 -3
  18. package/dist/contract/sdk/index.js +31 -17
  19. package/dist/contract/sdk/index.js.map +1 -1
  20. package/dist/domain.objects/ContextDeclastruct.d.ts +15 -0
  21. package/dist/{domain/DeclastructContext.js → domain.objects/ContextDeclastruct.js} +1 -1
  22. package/dist/domain.objects/ContextDeclastruct.js.map +1 -0
  23. package/dist/domain.objects/ContextDeclastruct.test.js +41 -0
  24. package/dist/domain.objects/ContextDeclastruct.test.js.map +1 -0
  25. package/dist/domain.objects/DeclastructChange.d.ts +73 -0
  26. package/dist/domain.objects/DeclastructChange.js +35 -0
  27. package/dist/domain.objects/DeclastructChange.js.map +1 -0
  28. package/dist/domain.objects/DeclastructChange.test.js +59 -0
  29. package/dist/domain.objects/DeclastructChange.test.js.map +1 -0
  30. package/dist/domain.objects/DeclastructDao.d.ts +39 -0
  31. package/dist/domain.objects/DeclastructDao.js +8 -0
  32. package/dist/domain.objects/DeclastructDao.js.map +1 -0
  33. package/dist/domain.objects/DeclastructDao.test.js +42 -0
  34. package/dist/domain.objects/DeclastructDao.test.js.map +1 -0
  35. package/dist/domain.objects/DeclastructPlan.d.ts +35 -0
  36. package/dist/domain.objects/DeclastructPlan.js +11 -0
  37. package/dist/domain.objects/DeclastructPlan.js.map +1 -0
  38. package/dist/domain.objects/DeclastructPlan.test.js +31 -0
  39. package/dist/domain.objects/DeclastructPlan.test.js.map +1 -0
  40. package/dist/domain.objects/DeclastructProvider.d.ts +30 -0
  41. package/dist/domain.objects/DeclastructProvider.js +8 -0
  42. package/dist/domain.objects/DeclastructProvider.js.map +1 -0
  43. package/dist/domain.objects/DeclastructProvider.test.js +35 -0
  44. package/dist/domain.objects/DeclastructProvider.test.js.map +1 -0
  45. package/dist/domain.objects/IsoTimestamp.d.ts +6 -0
  46. package/dist/{domain/DeclaredResource.js → domain.objects/IsoTimestamp.js} +1 -1
  47. package/dist/domain.objects/IsoTimestamp.js.map +1 -0
  48. package/dist/domain.objects/IsoTimestamp.test.js +10 -0
  49. package/dist/domain.objects/IsoTimestamp.test.js.map +1 -0
  50. package/dist/domain.operations/apply/applyChange.d.ts +14 -0
  51. package/dist/domain.operations/apply/applyChange.js +64 -0
  52. package/dist/domain.operations/apply/applyChange.js.map +1 -0
  53. package/dist/domain.operations/apply/applyChange.test.d.ts +1 -0
  54. package/dist/domain.operations/apply/applyChange.test.js +247 -0
  55. package/dist/domain.operations/apply/applyChange.test.js.map +1 -0
  56. package/dist/domain.operations/apply/applyChanges.d.ts +18 -0
  57. package/dist/domain.operations/apply/applyChanges.integration.test.d.ts +1 -0
  58. package/dist/domain.operations/apply/applyChanges.integration.test.js +291 -0
  59. package/dist/domain.operations/apply/applyChanges.integration.test.js.map +1 -0
  60. package/dist/domain.operations/apply/applyChanges.js +53 -0
  61. package/dist/domain.operations/apply/applyChanges.js.map +1 -0
  62. package/dist/domain.operations/plan/computeChange.d.ts +11 -0
  63. package/dist/domain.operations/plan/computeChange.js +78 -0
  64. package/dist/domain.operations/plan/computeChange.js.map +1 -0
  65. package/dist/domain.operations/plan/computeChange.test.d.ts +1 -0
  66. package/dist/domain.operations/plan/computeChange.test.js +67 -0
  67. package/dist/domain.operations/plan/computeChange.test.js.map +1 -0
  68. package/dist/domain.operations/plan/extractResourcesFromPlan.d.ts +8 -0
  69. package/dist/domain.operations/plan/extractResourcesFromPlan.js +17 -0
  70. package/dist/domain.operations/plan/extractResourcesFromPlan.js.map +1 -0
  71. package/dist/domain.operations/plan/getDaoByResource.d.ts +12 -0
  72. package/dist/domain.operations/plan/getDaoByResource.js +41 -0
  73. package/dist/domain.operations/plan/getDaoByResource.js.map +1 -0
  74. package/dist/domain.operations/plan/getDaoByResource.test.d.ts +1 -0
  75. package/dist/domain.operations/plan/getDaoByResource.test.js +99 -0
  76. package/dist/domain.operations/plan/getDaoByResource.test.js.map +1 -0
  77. package/dist/domain.operations/plan/hashChanges.d.ts +7 -0
  78. package/dist/domain.operations/plan/hashChanges.js +18 -0
  79. package/dist/domain.operations/plan/hashChanges.js.map +1 -0
  80. package/dist/domain.operations/plan/planChanges.d.ts +15 -0
  81. package/dist/domain.operations/plan/planChanges.integration.test.d.ts +1 -0
  82. package/dist/domain.operations/plan/planChanges.integration.test.js +197 -0
  83. package/dist/domain.operations/plan/planChanges.integration.test.js.map +1 -0
  84. package/dist/domain.operations/plan/planChanges.js +50 -0
  85. package/dist/domain.operations/plan/planChanges.js.map +1 -0
  86. package/dist/domain.operations/plan/validate.d.ts +10 -0
  87. package/dist/domain.operations/plan/validate.js +21 -0
  88. package/dist/domain.operations/plan/validate.js.map +1 -0
  89. package/dist/infra/asIsoTimestamp.d.ts +6 -0
  90. package/dist/infra/asIsoTimestamp.js +12 -0
  91. package/dist/infra/asIsoTimestamp.js.map +1 -0
  92. package/package.json +8 -15
  93. package/readme.md +225 -29
  94. package/dist/__test_assets__/getExampleContext.d.ts +0 -33
  95. package/dist/__test_assets__/getExampleContext.js +0 -87
  96. package/dist/__test_assets__/getExampleContext.js.map +0 -1
  97. package/dist/contract/commands/command.apply.d.ts +0 -6
  98. package/dist/contract/commands/command.apply.js +0 -20
  99. package/dist/contract/commands/command.apply.js.map +0 -1
  100. package/dist/contract/commands/command.plan.d.ts +0 -6
  101. package/dist/contract/commands/command.plan.js +0 -20
  102. package/dist/contract/commands/command.plan.js.map +0 -1
  103. package/dist/contract/commands/utils/resolveCommandInputs.d.ts +0 -17
  104. package/dist/contract/commands/utils/resolveCommandInputs.js +0 -23
  105. package/dist/contract/commands/utils/resolveCommandInputs.js.map +0 -1
  106. package/dist/contract/sdk/refs.d.ts +0 -2
  107. package/dist/contract/sdk/refs.js +0 -19
  108. package/dist/contract/sdk/refs.js.map +0 -1
  109. package/dist/contract/sdk/sync/apply.d.ts +0 -22
  110. package/dist/contract/sdk/sync/apply.js +0 -29
  111. package/dist/contract/sdk/sync/apply.js.map +0 -1
  112. package/dist/contract/sdk/sync/plan.d.ts +0 -22
  113. package/dist/contract/sdk/sync/plan.js +0 -30
  114. package/dist/contract/sdk/sync/plan.js.map +0 -1
  115. package/dist/domain/DeclaredResource.d.ts +0 -2
  116. package/dist/domain/DeclaredResource.js.map +0 -1
  117. package/dist/domain/DeclaredResourceReference.d.ts +0 -66
  118. package/dist/domain/DeclaredResourceReference.js +0 -42
  119. package/dist/domain/DeclaredResourceReference.js.map +0 -1
  120. package/dist/domain/DeclastructChangeProposal.d.ts +0 -61
  121. package/dist/domain/DeclastructChangeProposal.js +0 -37
  122. package/dist/domain/DeclastructChangeProposal.js.map +0 -1
  123. package/dist/domain/DeclastructContext.d.ts +0 -24
  124. package/dist/domain/DeclastructContext.js.map +0 -1
  125. package/dist/domain/DeclastructProvider.d.ts +0 -58
  126. package/dist/domain/DeclastructProvider.js +0 -3
  127. package/dist/domain/DeclastructProvider.js.map +0 -1
  128. package/dist/domain/DeclastructProviderContext.d.ts +0 -30
  129. package/dist/domain/DeclastructProviderContext.js +0 -3
  130. package/dist/domain/DeclastructProviderContext.js.map +0 -1
  131. package/dist/domain/DeclastructProviderResourceRemoteStateInterface.d.ts +0 -156
  132. package/dist/domain/DeclastructProviderResourceRemoteStateInterface.js +0 -3
  133. package/dist/domain/DeclastructProviderResourceRemoteStateInterface.js.map +0 -1
  134. package/dist/logic/actions/execute/canUpdateResource.d.ts +0 -5
  135. package/dist/logic/actions/execute/canUpdateResource.js +0 -12
  136. package/dist/logic/actions/execute/canUpdateResource.js.map +0 -1
  137. package/dist/logic/actions/execute/executeProposal.d.ts +0 -5
  138. package/dist/logic/actions/execute/executeProposal.js +0 -52
  139. package/dist/logic/actions/execute/executeProposal.js.map +0 -1
  140. package/dist/logic/actions/propose/getColoredActionToken.d.ts +0 -4
  141. package/dist/logic/actions/propose/getColoredActionToken.js +0 -22
  142. package/dist/logic/actions/propose/getColoredActionToken.js.map +0 -1
  143. package/dist/logic/actions/propose/getColoredProposalTitle.d.ts +0 -4
  144. package/dist/logic/actions/propose/getColoredProposalTitle.js +0 -34
  145. package/dist/logic/actions/propose/getColoredProposalTitle.js.map +0 -1
  146. package/dist/logic/actions/propose/proposeChangeForResource.d.ts +0 -7
  147. package/dist/logic/actions/propose/proposeChangeForResource.js +0 -65
  148. package/dist/logic/actions/propose/proposeChangeForResource.js.map +0 -1
  149. package/dist/logic/actions/propose/proposeChangeForResource.test.js +0 -48
  150. package/dist/logic/actions/propose/proposeChangeForResource.test.js.map +0 -1
  151. package/dist/logic/commands/command.apply.d.ts +0 -8
  152. package/dist/logic/commands/command.apply.js +0 -77
  153. package/dist/logic/commands/command.apply.js.map +0 -1
  154. package/dist/logic/commands/command.plan.d.ts +0 -13
  155. package/dist/logic/commands/command.plan.js +0 -155
  156. package/dist/logic/commands/command.plan.js.map +0 -1
  157. package/dist/logic/commands/execute.d.ts +0 -15
  158. package/dist/logic/commands/execute.js +0 -63
  159. package/dist/logic/commands/execute.js.map +0 -1
  160. package/dist/logic/tools/compare/castReferenceToGrokableString.d.ts +0 -16
  161. package/dist/logic/tools/compare/castReferenceToGrokableString.js +0 -66
  162. package/dist/logic/tools/compare/castReferenceToGrokableString.js.map +0 -1
  163. package/dist/logic/tools/compare/castReferenceToGrokableString.test.js +0 -111
  164. package/dist/logic/tools/compare/castReferenceToGrokableString.test.js.map +0 -1
  165. package/dist/logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.d.ts +0 -11
  166. package/dist/logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.js +0 -61
  167. package/dist/logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.js.map +0 -1
  168. package/dist/logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.test.js +0 -31
  169. package/dist/logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.test.js.map +0 -1
  170. package/dist/logic/tools/compare/resolveReferenceToCommonComparableForm.d.ts +0 -21
  171. package/dist/logic/tools/compare/resolveReferenceToCommonComparableForm.js +0 -53
  172. package/dist/logic/tools/compare/resolveReferenceToCommonComparableForm.js.map +0 -1
  173. package/dist/logic/tools/compare/resolveReferenceToCommonComparableForm.test.js +0 -31
  174. package/dist/logic/tools/compare/resolveReferenceToCommonComparableForm.test.js.map +0 -1
  175. package/dist/logic/tools/compare/resolveReferencesToCommonComparableForm.d.ts +0 -10
  176. package/dist/logic/tools/compare/resolveReferencesToCommonComparableForm.js +0 -41
  177. package/dist/logic/tools/compare/resolveReferencesToCommonComparableForm.js.map +0 -1
  178. package/dist/logic/tools/compare/resolveReferencesToCommonComparableForm.test.js +0 -174
  179. package/dist/logic/tools/compare/resolveReferencesToCommonComparableForm.test.js.map +0 -1
  180. package/dist/logic/tools/context/createDeclastructContext.d.ts +0 -10
  181. package/dist/logic/tools/context/createDeclastructContext.js +0 -12
  182. package/dist/logic/tools/context/createDeclastructContext.js.map +0 -1
  183. package/dist/logic/tools/context/destroyDeclastructContext.d.ts +0 -4
  184. package/dist/logic/tools/context/destroyDeclastructContext.js +0 -10
  185. package/dist/logic/tools/context/destroyDeclastructContext.js.map +0 -1
  186. package/dist/logic/tools/provider/castProviderContextToGlobalContext.d.ts +0 -4
  187. package/dist/logic/tools/provider/castProviderContextToGlobalContext.js +0 -10
  188. package/dist/logic/tools/provider/castProviderContextToGlobalContext.js.map +0 -1
  189. package/dist/logic/tools/provider/getProviderContextFromGlobalContextForResourceClass.d.ts +0 -13
  190. package/dist/logic/tools/provider/getProviderContextFromGlobalContextForResourceClass.js +0 -29
  191. package/dist/logic/tools/provider/getProviderContextFromGlobalContextForResourceClass.js.map +0 -1
  192. package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource.d.ts +0 -13
  193. package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource.js +0 -24
  194. package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceExecutionDependenciesForResource.js.map +0 -1
  195. package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceFromContextForResourceClass.d.ts +0 -10
  196. package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceFromContextForResourceClass.js +0 -21
  197. package/dist/logic/tools/provider/getProviderResourceRemoteStateInterfaceFromContextForResourceClass.js.map +0 -1
  198. package/dist/logic/tools/reference/buildPrimaryKeyTo.d.ts +0 -5
  199. package/dist/logic/tools/reference/buildPrimaryKeyTo.js +0 -40
  200. package/dist/logic/tools/reference/buildPrimaryKeyTo.js.map +0 -1
  201. package/dist/logic/tools/reference/buildReferenceTo.d.ts +0 -28
  202. package/dist/logic/tools/reference/buildReferenceTo.js +0 -92
  203. package/dist/logic/tools/reference/buildReferenceTo.js.map +0 -1
  204. package/dist/logic/tools/reference/buildReferenceTo.test.js +0 -119
  205. package/dist/logic/tools/reference/buildReferenceTo.test.js.map +0 -1
  206. package/dist/logic/tools/reference/buildUniqueKeyTo.d.ts +0 -5
  207. package/dist/logic/tools/reference/buildUniqueKeyTo.js +0 -40
  208. package/dist/logic/tools/reference/buildUniqueKeyTo.js.map +0 -1
  209. package/dist/logic/tools/reference/defineReferenceClassOf.d.ts +0 -5
  210. package/dist/logic/tools/reference/defineReferenceClassOf.js +0 -25
  211. package/dist/logic/tools/reference/defineReferenceClassOf.js.map +0 -1
  212. package/dist/logic/tools/reference/defineReferenceKeyConstituentsOf.d.ts +0 -13
  213. package/dist/logic/tools/reference/defineReferenceKeyConstituentsOf.js +0 -36
  214. package/dist/logic/tools/reference/defineReferenceKeyConstituentsOf.js.map +0 -1
  215. package/dist/logic/tools/reference/getByReference.d.ts +0 -15
  216. package/dist/logic/tools/reference/getByReference.js +0 -55
  217. package/dist/logic/tools/reference/getByReference.js.map +0 -1
  218. package/dist/logic/tools/reference/getByReference.test.js +0 -92
  219. package/dist/logic/tools/reference/getByReference.test.js.map +0 -1
  220. package/dist/logic/tools/reference/getByReferencedPrimaryKey.d.ts +0 -6
  221. package/dist/logic/tools/reference/getByReferencedPrimaryKey.js +0 -17
  222. package/dist/logic/tools/reference/getByReferencedPrimaryKey.js.map +0 -1
  223. package/dist/logic/tools/reference/getByReferencedUniqueKey.d.ts +0 -7
  224. package/dist/logic/tools/reference/getByReferencedUniqueKey.js +0 -42
  225. package/dist/logic/tools/reference/getByReferencedUniqueKey.js.map +0 -1
  226. package/dist/logic/tools/reference/getPrimaryKeyByReference.d.ts +0 -15
  227. package/dist/logic/tools/reference/getPrimaryKeyByReference.js +0 -36
  228. package/dist/logic/tools/reference/getPrimaryKeyByReference.js.map +0 -1
  229. package/dist/logic/tools/reference/getReferenceTo.d.ts +0 -18
  230. package/dist/logic/tools/reference/getReferenceTo.js +0 -55
  231. package/dist/logic/tools/reference/getReferenceTo.js.map +0 -1
  232. package/dist/logic/tools/reference/getReferenceTo.test.js +0 -95
  233. package/dist/logic/tools/reference/getReferenceTo.test.js.map +0 -1
  234. package/dist/logic/tools/reference/getUniqueKeyByReference.d.ts +0 -15
  235. package/dist/logic/tools/reference/getUniqueKeyByReference.js +0 -36
  236. package/dist/logic/tools/reference/getUniqueKeyByReference.js.map +0 -1
  237. package/dist/logic/tools/reference/isPrimaryKeyReference.d.ts +0 -6
  238. package/dist/logic/tools/reference/isPrimaryKeyReference.js +0 -7
  239. package/dist/logic/tools/reference/isPrimaryKeyReference.js.map +0 -1
  240. package/dist/logic/tools/reference/isUniqueKeyReference.d.ts +0 -6
  241. package/dist/logic/tools/reference/isUniqueKeyReference.js +0 -7
  242. package/dist/logic/tools/reference/isUniqueKeyReference.js.map +0 -1
  243. /package/dist/{logic/actions/propose/proposeChangeForResource.test.d.ts → contract/cli/apply.integration.test.d.ts} +0 -0
  244. /package/dist/{logic/tools/compare/castReferenceToGrokableString.test.d.ts → contract/cli/plan.integration.test.d.ts} +0 -0
  245. /package/dist/{logic/tools/compare/detectDifferenceBetweenDesiredAndRemoteStateOfResource.test.d.ts → domain.objects/ContextDeclastruct.test.d.ts} +0 -0
  246. /package/dist/{logic/tools/compare/resolveReferenceToCommonComparableForm.test.d.ts → domain.objects/DeclastructChange.test.d.ts} +0 -0
  247. /package/dist/{logic/tools/compare/resolveReferencesToCommonComparableForm.test.d.ts → domain.objects/DeclastructDao.test.d.ts} +0 -0
  248. /package/dist/{logic/tools/reference/buildReferenceTo.test.d.ts → domain.objects/DeclastructPlan.test.d.ts} +0 -0
  249. /package/dist/{logic/tools/reference/getByReference.test.d.ts → domain.objects/DeclastructProvider.test.d.ts} +0 -0
  250. /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,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":";;;;;AAAA,4DAAoC;AACpC,+BAA+B;AAE/B,8EAGoD;AACpD,8EAAiF;AACjF,+CAA4C;AAE5C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,MAAM,YAAY,GAAG,IAAA,cAAO,EAC1B,OAAO,CAAC,GAAG,EAAE,EACb,kCAAkC,CACnC,CAAC;IAEF,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,+CAA+C;QAC/C,MAAM,4BAAY,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,CAAC;QAC3B,UAAU,EAAE,IAAI,oBAAU,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;QACjD,GAAG,EAAE;YACH,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;YACf,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;YAChB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;YACf,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;SACjB;KACF,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,2BAA2B;QAC3B,MAAM,SAAS,GAAG;YAChB,IAAA,qCAAqB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;YAC7C,IAAA,qCAAqB,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;SAC/C,CAAC;QAEF,eAAe;QACf,MAAM,IAAI,GAAG,MAAM,IAAA,yBAAW,EAC5B;YACE,SAAS;YACT,SAAS,EAAE,CAAC,4BAAY,CAAC;YACzB,YAAY;SACb,EACD,aAAa,EAAE,CAChB,CAAC;QAEF,wBAAwB;QACxB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpC,gCAAgC;QAChC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2CAAuB,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,kEAAkE;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,mBAAmB;QACnB,MAAM,SAAS,GAAG;YAChB,IAAA,qCAAqB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;YAC7C,IAAA,qCAAqB,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;SAC/C,CAAC;QAEF,sBAAsB;QACtB,MAAM,GAAG,GAAG,4BAAY,CAAC,IAAI,CAAC,YAAY,CAAC;QAC3C,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QAEzC,eAAe;QACf,MAAM,IAAI,GAAG,MAAM,IAAA,yBAAW,EAC5B;YACE,SAAS;YACT,SAAS,EAAE,CAAC,4BAAY,CAAC;YACzB,YAAY;SACb,EACD,aAAa,EAAE,CAChB,CAAC;QAEF,8BAA8B;QAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2CAAuB,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,sBAAsB;QACtB,MAAM,cAAc,GAAG,IAAA,qCAAqB,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,4BAAY,CAAC,IAAI,CAAC,YAAY,CAAC;QAC3C,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAE1C,oDAAoD;QACpD,MAAM,SAAS,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QAE/D,eAAe;QACf,MAAM,IAAI,GAAG,MAAM,IAAA,yBAAW,EAC5B;YACE,SAAS;YACT,SAAS,EAAE,CAAC,4BAAY,CAAC;YACzB,YAAY;SACb,EACD,aAAa,EAAE,CAChB,CAAC;QAEF,uBAAuB;QACvB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2CAAuB,CAAC,MAAM,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,CAAE,MAAM,CAAC,KAAK,CAAC,OAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5D,MAAM,CAAE,MAAM,CAAC,KAAK,CAAC,MAAc,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;QACrG,sBAAsB;QACtB,MAAM,SAAS,GAAG,IAAA,qCAAqB,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,IAAA,qCAAqB,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,4BAAY,CAAC,IAAI,CAAC,YAAY,CAAC;QAC3C,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAErC,4CAA4C;QAC5C,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC;QAE9B,sEAAsE;QACtE,gFAAgF;QAChF,6EAA6E;QAC7E,MAAM,IAAI,GAAG,MAAM,IAAA,yBAAW,EAC5B;YACE,SAAS;YACT,SAAS,EAAE,CAAC,4BAAY,CAAC;YACzB,YAAY;SACb,EACD,aAAa,EAAE,CAChB,CAAC;QAEF,mCAAmC;QACnC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2CAAuB,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,mBAAmB;QACnB,MAAM,SAAS,GAAG;YAChB,IAAA,qCAAqB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;YAC7C,IAAA,qCAAqB,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;SAC/C,CAAC;QAEF,uBAAuB;QACvB,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;QAChC,MAAM,IAAA,yBAAW,EACf;YACE,SAAS;YACT,SAAS,EAAE,CAAC,4BAAY,CAAC;YACzB,YAAY;SACb,EACD,OAAO,CACR,CAAC;QAEF,kEAAkE;QAClE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAC3C,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,EACjD,EAAE,CACH,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,0BAA0B;QAC1B,MAAM,SAAS,GAAG,IAAA,qCAAqB,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,IAAA,qCAAqB,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAE9D,yCAAyC;QACzC,MAAM,GAAG,GAAG,4BAAY,CAAC,IAAI,CAAC,YAAY,CAAC;QAC3C,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAErC,2BAA2B;QAC3B,MAAM,SAAS,GAAG;YAChB,SAAS,EAAE,OAAO;YAClB,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS;YAChD,IAAA,qCAAqB,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS;SACxD,CAAC;QAEF,eAAe;QACf,MAAM,IAAI,GAAG,MAAM,IAAA,yBAAW,EAC5B;YACE,SAAS;YACT,SAAS,EAAE,CAAC,4BAAY,CAAC;YACzB,YAAY;SACb,EACD,aAAa,EAAE,CAChB,CAAC;QAEF,uBAAuB;QACvB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpC,oCAAoC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,2CAAuB,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,2CAAuB,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,2CAAuB,CAAC,MAAM,CAAC,CAAC;QAE1D,4BAA4B;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzE,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,mBAAmB;QACnB,MAAM,SAAS,GAAG;YAChB,IAAA,qCAAqB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;YAC7C,IAAA,qCAAqB,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;SAC/C,CAAC;QAEF,aAAa;QACb,MAAM,KAAK,GAAG,MAAM,IAAA,yBAAW,EAC7B;YACE,SAAS;YACT,SAAS,EAAE,CAAC,4BAAY,CAAC;YACzB,YAAY;SACb,EACD,aAAa,EAAE,CAChB,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,IAAA,yBAAW,EAC7B;YACE,SAAS;YACT,SAAS,EAAE,CAAC,4BAAY,CAAC;YACzB,YAAY;SACb,EACD,aAAa,EAAE,CAChB,CAAC;QAEF,8CAA8C;QAC9C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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,6 @@
1
+ import { IsoTimestamp } from '../domain.objects/IsoTimestamp';
2
+ /**
3
+ * .what = converts a Date to ISO 8601 timestamp string
4
+ * .why = ensures consistent timestamp format across the system
5
+ */
6
+ export declare const asIsoTimestamp: (date: Date) => IsoTimestamp;
@@ -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.0.0",
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
- "chalk": "5.4.1",
56
- "deep-object-diff": "1.1.9",
57
- "domain-objects": "0.24.3",
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
- "joi": "17.13.3",
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.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
- "simple-leveled-log-methods": "0.4.1",
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"