@quadnix/octo 0.0.30 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +117 -8
  3. package/dist/app.type.d.ts +277 -19
  4. package/dist/app.type.js +80 -9
  5. package/dist/app.type.js.map +1 -1
  6. package/dist/decorators/action.decorator.d.ts +10 -6
  7. package/dist/decorators/action.decorator.js +19 -6
  8. package/dist/decorators/action.decorator.js.map +1 -1
  9. package/dist/decorators/anchor.decorator.d.ts +12 -5
  10. package/dist/decorators/anchor.decorator.js +12 -5
  11. package/dist/decorators/anchor.decorator.js.map +1 -1
  12. package/dist/decorators/enable-hook.decorator.d.ts +1 -1
  13. package/dist/decorators/enable-hook.decorator.js +1 -1
  14. package/dist/decorators/factory.decorator.d.ts +18 -34
  15. package/dist/decorators/factory.decorator.js +18 -34
  16. package/dist/decorators/factory.decorator.js.map +1 -1
  17. package/dist/decorators/model.decorator.d.ts +4 -6
  18. package/dist/decorators/model.decorator.js +2 -7
  19. package/dist/decorators/model.decorator.js.map +1 -1
  20. package/dist/decorators/module.decorator.d.ts +16 -10
  21. package/dist/decorators/module.decorator.js +16 -10
  22. package/dist/decorators/module.decorator.js.map +1 -1
  23. package/dist/decorators/on-event.decorator.d.ts +7 -2
  24. package/dist/decorators/on-event.decorator.js +5 -0
  25. package/dist/decorators/on-event.decorator.js.map +1 -1
  26. package/dist/decorators/resource.decorator.d.ts +50 -1
  27. package/dist/decorators/resource.decorator.js +38 -1
  28. package/dist/decorators/resource.decorator.js.map +1 -1
  29. package/dist/decorators/validate.decorator.d.ts +15 -1
  30. package/dist/decorators/validate.decorator.js +15 -1
  31. package/dist/decorators/validate.decorator.js.map +1 -1
  32. package/dist/errors/container.error.d.ts +18 -0
  33. package/dist/errors/container.error.js +18 -0
  34. package/dist/errors/container.error.js.map +1 -1
  35. package/dist/errors/index.d.ts +1 -0
  36. package/dist/errors/index.js +1 -0
  37. package/dist/errors/index.js.map +1 -1
  38. package/dist/errors/module.error.d.ts +6 -0
  39. package/dist/errors/module.error.js +6 -0
  40. package/dist/errors/module.error.js.map +1 -1
  41. package/dist/errors/node.error.d.ts +56 -0
  42. package/dist/errors/node.error.js +56 -0
  43. package/dist/errors/node.error.js.map +1 -1
  44. package/dist/errors/schema.error.d.ts +14 -1
  45. package/dist/errors/schema.error.js +11 -1
  46. package/dist/errors/schema.error.js.map +1 -1
  47. package/dist/errors/terraform.error.d.ts +20 -0
  48. package/dist/errors/terraform.error.js +24 -0
  49. package/dist/errors/terraform.error.js.map +1 -0
  50. package/dist/errors/transaction.error.d.ts +93 -2
  51. package/dist/errors/transaction.error.js +83 -0
  52. package/dist/errors/transaction.error.js.map +1 -1
  53. package/dist/events/action.event.d.ts +8 -4
  54. package/dist/events/action.event.js +2 -4
  55. package/dist/events/action.event.js.map +1 -1
  56. package/dist/events/command.event.d.ts +43 -0
  57. package/dist/events/command.event.js +33 -0
  58. package/dist/events/command.event.js.map +1 -0
  59. package/dist/events/event.model.d.ts +26 -8
  60. package/dist/events/event.model.js +15 -7
  61. package/dist/events/event.model.js.map +1 -1
  62. package/dist/events/hook/commit.hook.event.d.ts +1 -7
  63. package/dist/events/hook/commit.hook.event.js +0 -6
  64. package/dist/events/hook/commit.hook.event.js.map +1 -1
  65. package/dist/events/hook/hook.event.d.ts +1 -3
  66. package/dist/events/hook/hook.event.js +0 -2
  67. package/dist/events/hook/hook.event.js.map +1 -1
  68. package/dist/events/hook/model.hook.event.d.ts +1 -7
  69. package/dist/events/hook/model.hook.event.js +0 -6
  70. package/dist/events/hook/model.hook.event.js.map +1 -1
  71. package/dist/events/hook/resource.hook.event.d.ts +1 -7
  72. package/dist/events/hook/resource.hook.event.js +0 -6
  73. package/dist/events/hook/resource.hook.event.js.map +1 -1
  74. package/dist/events/index.d.ts +5 -0
  75. package/dist/events/index.js +5 -0
  76. package/dist/events/index.js.map +1 -1
  77. package/dist/events/mode-result.event.d.ts +57 -0
  78. package/dist/events/mode-result.event.js +24 -0
  79. package/dist/events/mode-result.event.js.map +1 -0
  80. package/dist/events/mode.event.d.ts +61 -0
  81. package/dist/events/mode.event.js +32 -0
  82. package/dist/events/mode.event.js.map +1 -0
  83. package/dist/events/module.event.d.ts +7 -5
  84. package/dist/events/module.event.js +3 -4
  85. package/dist/events/module.event.js.map +1 -1
  86. package/dist/events/registration.event.d.ts +19 -15
  87. package/dist/events/registration.event.js +18 -14
  88. package/dist/events/registration.event.js.map +1 -1
  89. package/dist/events/serialization.event.d.ts +16 -13
  90. package/dist/events/serialization.event.js +15 -12
  91. package/dist/events/serialization.event.js.map +1 -1
  92. package/dist/events/state.event.d.ts +102 -0
  93. package/dist/events/state.event.js +69 -0
  94. package/dist/events/state.event.js.map +1 -0
  95. package/dist/events/terraform.event.d.ts +78 -0
  96. package/dist/events/terraform.event.js +55 -0
  97. package/dist/events/terraform.event.js.map +1 -0
  98. package/dist/events/transaction.event.d.ts +3 -40
  99. package/dist/events/transaction.event.js +1 -29
  100. package/dist/events/transaction.event.js.map +1 -1
  101. package/dist/functions/container/container.d.ts +54 -13
  102. package/dist/functions/container/container.js +64 -19
  103. package/dist/functions/container/container.js.map +1 -1
  104. package/dist/functions/container/test-container.d.ts +43 -29
  105. package/dist/functions/container/test-container.js +71 -43
  106. package/dist/functions/container/test-container.js.map +1 -1
  107. package/dist/functions/dependency/dependency.d.ts +84 -23
  108. package/dist/functions/dependency/dependency.js +84 -14
  109. package/dist/functions/dependency/dependency.js.map +1 -1
  110. package/dist/functions/diff/aggregate-resource-actions.d.ts +19 -0
  111. package/dist/functions/diff/aggregate-resource-actions.js +41 -0
  112. package/dist/functions/diff/aggregate-resource-actions.js.map +1 -0
  113. package/dist/functions/diff/diff-metadata.d.ts +21 -3
  114. package/dist/functions/diff/diff-metadata.js +18 -0
  115. package/dist/functions/diff/diff-metadata.js.map +1 -1
  116. package/dist/functions/diff/diff.d.ts +68 -7
  117. package/dist/functions/diff/diff.js +44 -3
  118. package/dist/functions/diff/diff.js.map +1 -1
  119. package/dist/functions/hook/commit.hook.d.ts +16 -1
  120. package/dist/functions/hook/commit.hook.js +21 -6
  121. package/dist/functions/hook/commit.hook.js.map +1 -1
  122. package/dist/functions/hook/model-action.hook.d.ts +16 -1
  123. package/dist/functions/hook/model-action.hook.js +21 -6
  124. package/dist/functions/hook/model-action.hook.js.map +1 -1
  125. package/dist/functions/hook/resource-action.hook.d.ts +16 -1
  126. package/dist/functions/hook/resource-action.hook.js +21 -6
  127. package/dist/functions/hook/resource-action.hook.js.map +1 -1
  128. package/dist/functions/node/node-action.abstract.d.ts +23 -2
  129. package/dist/functions/node/node-action.abstract.js +22 -8
  130. package/dist/functions/node/node-action.abstract.js.map +1 -1
  131. package/dist/functions/node/node.abstract.d.ts +56 -5
  132. package/dist/functions/node/node.abstract.js +106 -22
  133. package/dist/functions/node/node.abstract.js.map +1 -1
  134. package/dist/functions/node/node.interface.d.ts +3 -1
  135. package/dist/functions/schema/schema.d.ts +7 -0
  136. package/dist/functions/schema/schema.js +10 -1
  137. package/dist/functions/schema/schema.js.map +1 -1
  138. package/dist/index.d.ts +12 -6
  139. package/dist/index.js +9 -4
  140. package/dist/index.js.map +1 -1
  141. package/dist/index.type.d.ts +5 -0
  142. package/dist/index.type.js +2 -0
  143. package/dist/index.type.js.map +1 -0
  144. package/dist/main.d.ts +245 -14
  145. package/dist/main.js +377 -72
  146. package/dist/main.js.map +1 -1
  147. package/dist/models/account/account.model.d.ts +43 -7
  148. package/dist/models/account/account.model.js +56 -8
  149. package/dist/models/account/account.model.js.map +1 -1
  150. package/dist/models/account/account.schema.d.ts +13 -1
  151. package/dist/models/account/account.schema.js +12 -0
  152. package/dist/models/account/account.schema.js.map +1 -1
  153. package/dist/models/app/app.model.d.ts +13 -8
  154. package/dist/models/app/app.model.js +17 -32
  155. package/dist/models/app/app.model.js.map +1 -1
  156. package/dist/models/app/app.schema.d.ts +6 -0
  157. package/dist/models/app/app.schema.js +6 -0
  158. package/dist/models/app/app.schema.js.map +1 -1
  159. package/dist/models/deployment/deployment.model.d.ts +13 -1
  160. package/dist/models/deployment/deployment.model.js +16 -4
  161. package/dist/models/deployment/deployment.model.js.map +1 -1
  162. package/dist/models/deployment/deployment.schema.d.ts +6 -0
  163. package/dist/models/deployment/deployment.schema.js +6 -0
  164. package/dist/models/deployment/deployment.schema.js.map +1 -1
  165. package/dist/models/environment/environment.model.d.ts +15 -3
  166. package/dist/models/environment/environment.model.js +22 -10
  167. package/dist/models/environment/environment.model.js.map +1 -1
  168. package/dist/models/environment/environment.schema.d.ts +2 -0
  169. package/dist/models/environment/environment.schema.js +2 -0
  170. package/dist/models/environment/environment.schema.js.map +1 -1
  171. package/dist/models/execution/execution.model.d.ts +21 -3
  172. package/dist/models/execution/execution.model.js +47 -29
  173. package/dist/models/execution/execution.model.js.map +1 -1
  174. package/dist/models/execution/execution.schema.d.ts +11 -0
  175. package/dist/models/execution/execution.schema.js +11 -0
  176. package/dist/models/execution/execution.schema.js.map +1 -1
  177. package/dist/models/filesystem/filesystem.model.d.ts +27 -1
  178. package/dist/models/filesystem/filesystem.model.js +30 -4
  179. package/dist/models/filesystem/filesystem.model.js.map +1 -1
  180. package/dist/models/filesystem/filesystem.schema.d.ts +5 -0
  181. package/dist/models/filesystem/filesystem.schema.js +5 -0
  182. package/dist/models/filesystem/filesystem.schema.js.map +1 -1
  183. package/dist/models/image/image.model.d.ts +19 -5
  184. package/dist/models/image/image.model.js +25 -11
  185. package/dist/models/image/image.model.js.map +1 -1
  186. package/dist/models/image/image.schema.d.ts +8 -0
  187. package/dist/models/image/image.schema.js +8 -0
  188. package/dist/models/image/image.schema.js.map +1 -1
  189. package/dist/models/model-action.interface.d.ts +17 -4
  190. package/dist/models/model.abstract.d.ts +96 -1
  191. package/dist/models/model.abstract.js +107 -8
  192. package/dist/models/model.abstract.js.map +1 -1
  193. package/dist/models/model.interface.d.ts +3 -0
  194. package/dist/models/pipeline/pipeline.model.d.ts +14 -2
  195. package/dist/models/pipeline/pipeline.model.js +19 -7
  196. package/dist/models/pipeline/pipeline.model.js.map +1 -1
  197. package/dist/models/pipeline/pipeline.schema.d.ts +8 -0
  198. package/dist/models/pipeline/pipeline.schema.js +8 -0
  199. package/dist/models/pipeline/pipeline.schema.js.map +1 -1
  200. package/dist/models/region/region.model.d.ts +16 -1
  201. package/dist/models/region/region.model.js +19 -4
  202. package/dist/models/region/region.model.js.map +1 -1
  203. package/dist/models/region/region.schema.d.ts +6 -0
  204. package/dist/models/region/region.schema.js +6 -0
  205. package/dist/models/region/region.schema.js.map +1 -1
  206. package/dist/models/server/server.model.d.ts +15 -3
  207. package/dist/models/server/server.model.js +18 -6
  208. package/dist/models/server/server.model.js.map +1 -1
  209. package/dist/models/server/server.schema.d.ts +3 -1
  210. package/dist/models/server/server.schema.js +3 -1
  211. package/dist/models/server/server.schema.js.map +1 -1
  212. package/dist/models/service/service.model.d.ts +37 -6
  213. package/dist/models/service/service.model.js +65 -11
  214. package/dist/models/service/service.model.js.map +1 -1
  215. package/dist/models/service/service.schema.d.ts +48 -1
  216. package/dist/models/service/service.schema.js +56 -1
  217. package/dist/models/service/service.schema.js.map +1 -1
  218. package/dist/models/subnet/subnet.model.d.ts +27 -3
  219. package/dist/models/subnet/subnet.model.js +40 -16
  220. package/dist/models/subnet/subnet.model.js.map +1 -1
  221. package/dist/models/subnet/subnet.schema.d.ts +9 -0
  222. package/dist/models/subnet/subnet.schema.js +9 -0
  223. package/dist/models/subnet/subnet.schema.js.map +1 -1
  224. package/dist/modes/apply-transaction.d.ts +23 -0
  225. package/dist/modes/apply-transaction.js +25 -0
  226. package/dist/modes/apply-transaction.js.map +1 -0
  227. package/dist/modes/commit.mode.d.ts +54 -0
  228. package/dist/modes/commit.mode.js +235 -0
  229. package/dist/modes/commit.mode.js.map +1 -0
  230. package/dist/modes/generate.mode.d.ts +30 -0
  231. package/dist/modes/generate.mode.js +50 -0
  232. package/dist/modes/generate.mode.js.map +1 -0
  233. package/dist/modes/run-action.mode.d.ts +30 -0
  234. package/dist/modes/run-action.mode.js +140 -0
  235. package/dist/modes/run-action.mode.js.map +1 -0
  236. package/dist/modes/validate.mode.d.ts +186 -0
  237. package/dist/modes/validate.mode.js +558 -0
  238. package/dist/modes/validate.mode.js.map +1 -0
  239. package/dist/modules/module.abstract.d.ts +51 -0
  240. package/dist/modules/module.abstract.js +36 -0
  241. package/dist/modules/module.abstract.js.map +1 -1
  242. package/dist/modules/module.container.d.ts +43 -1
  243. package/dist/modules/module.container.js +77 -5
  244. package/dist/modules/module.container.js.map +1 -1
  245. package/dist/modules/test-module.container.d.ts +139 -25
  246. package/dist/modules/test-module.container.js +383 -199
  247. package/dist/modules/test-module.container.js.map +1 -1
  248. package/dist/overlays/anchor.abstract.d.ts +32 -1
  249. package/dist/overlays/anchor.abstract.js +42 -11
  250. package/dist/overlays/anchor.abstract.js.map +1 -1
  251. package/dist/overlays/anchor.schema.d.ts +21 -0
  252. package/dist/overlays/anchor.schema.js +21 -0
  253. package/dist/overlays/anchor.schema.js.map +1 -1
  254. package/dist/overlays/overlay-data.repository.d.ts +18 -0
  255. package/dist/overlays/overlay-data.repository.js +18 -0
  256. package/dist/overlays/overlay-data.repository.js.map +1 -1
  257. package/dist/overlays/overlay.abstract.d.ts +56 -1
  258. package/dist/overlays/overlay.abstract.js +79 -20
  259. package/dist/overlays/overlay.abstract.js.map +1 -1
  260. package/dist/overlays/overlay.schema.d.ts +20 -0
  261. package/dist/overlays/overlay.schema.js +20 -0
  262. package/dist/overlays/overlay.schema.js.map +1 -1
  263. package/dist/resources/resource-action.interface.d.ts +29 -3
  264. package/dist/resources/resource-data.repository.d.ts +63 -1
  265. package/dist/resources/resource-data.repository.js +94 -4
  266. package/dist/resources/resource-data.repository.js.map +1 -1
  267. package/dist/resources/resource.abstract.d.ts +163 -6
  268. package/dist/resources/resource.abstract.js +223 -59
  269. package/dist/resources/resource.abstract.js.map +1 -1
  270. package/dist/resources/resource.interface.d.ts +0 -2
  271. package/dist/resources/resource.schema.d.ts +39 -1
  272. package/dist/resources/resource.schema.js +38 -0
  273. package/dist/resources/resource.schema.js.map +1 -1
  274. package/dist/resources/terraform-resource.abstract.d.ts +44 -0
  275. package/dist/resources/terraform-resource.abstract.js +45 -0
  276. package/dist/resources/terraform-resource.abstract.js.map +1 -0
  277. package/dist/services/event/event.service.d.ts +32 -5
  278. package/dist/services/event/event.service.js +58 -16
  279. package/dist/services/event/event.service.js.map +1 -1
  280. package/dist/services/input/input.service.d.ts +82 -5
  281. package/dist/services/input/input.service.js +143 -12
  282. package/dist/services/input/input.service.js.map +1 -1
  283. package/dist/services/schema-translation/schema-translation.service.d.ts +9 -0
  284. package/dist/services/schema-translation/schema-translation.service.js +9 -0
  285. package/dist/services/schema-translation/schema-translation.service.js.map +1 -1
  286. package/dist/services/serialization/model/model-serialization.service.d.ts +25 -3
  287. package/dist/services/serialization/model/model-serialization.service.js +113 -62
  288. package/dist/services/serialization/model/model-serialization.service.js.map +1 -1
  289. package/dist/services/serialization/resource/resource-serialization.service.d.ts +36 -6
  290. package/dist/services/serialization/resource/resource-serialization.service.js +77 -28
  291. package/dist/services/serialization/resource/resource-serialization.service.js.map +1 -1
  292. package/dist/services/state-management/local.state-provider.d.ts +67 -4
  293. package/dist/services/state-management/local.state-provider.js +168 -41
  294. package/dist/services/state-management/local.state-provider.js.map +1 -1
  295. package/dist/services/state-management/remote.state-provider.d.ts +216 -0
  296. package/dist/services/state-management/remote.state-provider.js +645 -0
  297. package/dist/services/state-management/remote.state-provider.js.map +1 -0
  298. package/dist/services/state-management/state-management.service.d.ts +195 -17
  299. package/dist/services/state-management/state-management.service.js +259 -10
  300. package/dist/services/state-management/state-management.service.js.map +1 -1
  301. package/dist/services/state-management/state-provider.interface.d.ts +98 -3
  302. package/dist/services/state-management/state-provider.interface.js +14 -1
  303. package/dist/services/state-management/state-provider.interface.js.map +1 -1
  304. package/dist/services/state-management/terraform-state.service.d.ts +99 -0
  305. package/dist/services/state-management/terraform-state.service.js +197 -0
  306. package/dist/services/state-management/terraform-state.service.js.map +1 -0
  307. package/dist/services/state-management/test.state-provider.d.ts +42 -4
  308. package/dist/services/state-management/test.state-provider.js +77 -25
  309. package/dist/services/state-management/test.state-provider.js.map +1 -1
  310. package/dist/services/terraform/terraform.service.d.ts +480 -0
  311. package/dist/services/terraform/terraform.service.js +1082 -0
  312. package/dist/services/terraform/terraform.service.js.map +1 -0
  313. package/dist/services/terraform/terraform.type.d.ts +387 -0
  314. package/dist/services/terraform/terraform.type.js +579 -0
  315. package/dist/services/terraform/terraform.type.js.map +1 -0
  316. package/dist/services/transaction/transaction.service.d.ts +110 -10
  317. package/dist/services/transaction/transaction.service.js +570 -251
  318. package/dist/services/transaction/transaction.service.js.map +1 -1
  319. package/dist/services/validation/validation.service.d.ts +15 -3
  320. package/dist/services/validation/validation.service.js +12 -0
  321. package/dist/services/validation/validation.service.js.map +1 -1
  322. package/dist/utilities/array/array.utility.d.ts +3 -0
  323. package/dist/utilities/array/array.utility.js +3 -0
  324. package/dist/utilities/array/array.utility.js.map +1 -1
  325. package/dist/{functions → utilities}/diff/diff.utility.d.ts +19 -3
  326. package/dist/{functions → utilities}/diff/diff.utility.js +57 -41
  327. package/dist/utilities/diff/diff.utility.js.map +1 -0
  328. package/dist/utilities/file/file.utility.d.ts +16 -2
  329. package/dist/utilities/file/file.utility.js +23 -61
  330. package/dist/utilities/file/file.utility.js.map +1 -1
  331. package/dist/utilities/hcl/hcl.utility.d.ts +128 -0
  332. package/dist/utilities/hcl/hcl.utility.js +402 -0
  333. package/dist/utilities/hcl/hcl.utility.js.map +1 -0
  334. package/dist/utilities/http/http.utility.d.ts +57 -0
  335. package/dist/utilities/http/http.utility.js +98 -0
  336. package/dist/utilities/http/http.utility.js.map +1 -0
  337. package/dist/utilities/node/node.utility.d.ts +3 -0
  338. package/dist/utilities/node/node.utility.js +3 -0
  339. package/dist/utilities/node/node.utility.js.map +1 -1
  340. package/dist/utilities/object/object.utility.d.ts +12 -0
  341. package/dist/utilities/object/object.utility.js +12 -0
  342. package/dist/utilities/object/object.utility.js.map +1 -1
  343. package/dist/utilities/project/project.utility.d.ts +28 -0
  344. package/dist/utilities/project/project.utility.js +35 -0
  345. package/dist/utilities/project/project.utility.js.map +1 -0
  346. package/dist/utilities/string/string.utility.d.ts +41 -0
  347. package/dist/utilities/string/string.utility.js +65 -0
  348. package/dist/utilities/string/string.utility.js.map +1 -0
  349. package/dist/utilities/terraform/terraform.utility.d.ts +276 -0
  350. package/dist/utilities/terraform/terraform.utility.js +623 -0
  351. package/dist/utilities/terraform/terraform.utility.js.map +1 -0
  352. package/dist/utilities/test-helpers/test-classes.d.ts +36 -30
  353. package/dist/utilities/test-helpers/test-classes.js +38 -39
  354. package/dist/utilities/test-helpers/test-classes.js.map +1 -1
  355. package/dist/utilities/test-helpers/test-models.d.ts +8 -1
  356. package/dist/utilities/test-helpers/test-models.js +37 -12
  357. package/dist/utilities/test-helpers/test-models.js.map +1 -1
  358. package/dist/utilities/test-helpers/test-modes.d.ts +315 -0
  359. package/dist/utilities/test-helpers/test-modes.js +486 -0
  360. package/dist/utilities/test-helpers/test-modes.js.map +1 -0
  361. package/dist/utilities/test-helpers/test-modules.d.ts +47 -0
  362. package/dist/utilities/test-helpers/test-modules.js +85 -0
  363. package/dist/utilities/test-helpers/test-modules.js.map +1 -0
  364. package/dist/utilities/test-helpers/test-overlays.d.ts +20 -2
  365. package/dist/utilities/test-helpers/test-overlays.js +56 -6
  366. package/dist/utilities/test-helpers/test-overlays.js.map +1 -1
  367. package/dist/utilities/test-helpers/test-resources.d.ts +23 -3
  368. package/dist/utilities/test-helpers/test-resources.js +83 -23
  369. package/dist/utilities/test-helpers/test-resources.js.map +1 -1
  370. package/dist/utilities/validation/validation.utility.d.ts +24 -0
  371. package/dist/utilities/validation/validation.utility.js +24 -0
  372. package/dist/utilities/validation/validation.utility.js.map +1 -1
  373. package/package.json +12 -6
  374. package/dist/functions/diff/diff.utility.js.map +0 -1
  375. package/dist/services/capture/capture.service.d.ts +0 -19
  376. package/dist/services/capture/capture.service.js +0 -43
  377. package/dist/services/capture/capture.service.js.map +0 -1
  378. package/dist/services/state-management/local-encryption.state-provider.d.ts +0 -20
  379. package/dist/services/state-management/local-encryption.state-provider.js +0 -90
  380. package/dist/services/state-management/local-encryption.state-provider.js.map +0 -1
  381. package/dist/utilities/cidr/cidr.utility.d.ts +0 -10
  382. package/dist/utilities/cidr/cidr.utility.js +0 -51
  383. package/dist/utilities/cidr/cidr.utility.js.map +0 -1
@@ -0,0 +1,558 @@
1
+ import { Container } from '../functions/container/container.js';
2
+ import { aggregateResourceActions, } from '../functions/diff/aggregate-resource-actions.js';
3
+ import { DiffAction } from '../functions/diff/diff.js';
4
+ import { ResourceDataRepository } from '../resources/resource-data.repository.js';
5
+ import { TerraformService } from '../services/terraform/terraform.service.js';
6
+ /**
7
+ * Renders what terraform said when a folder could not be planned.
8
+ *
9
+ * The captured output is the whole terragrunt run, which is mostly provider initialization and
10
+ * carries the terminal's escape codes. The one line a reader needs is somewhere in the middle of
11
+ * it, so the error lines are lifted to the top and the full log is kept underneath.
12
+ */
13
+ function renderPlanFailure(moduleId, cause) {
14
+ // eslint-disable-next-line no-control-regex
15
+ const plain = cause.replace(/\u001B\[[0-9;]*m/g, '');
16
+ // Duplicates are dropped after normalizing, because terraform prints the same error once on
17
+ // stderr and again in its summary, behind different prefixes.
18
+ const errorLines = [
19
+ ...new Set(plain
20
+ .split('\n')
21
+ .filter((line) => /\bError:/.test(line))
22
+ .map((line) => line.replace(/^.*?\bError:/, 'Error:').trim())),
23
+ ];
24
+ // Only worth lifting when there is noise to lift them out of. A log that is already just the
25
+ // error reads worse repeated than it does left alone.
26
+ const isBuried = errorLines.length > 0 && plain.trim().split('\n').length > errorLines.length;
27
+ return isBuried
28
+ ? `Terraform failed to plan module "${moduleId}":\n${errorLines.join('\n')}\n\nThe full terraform output follows.\n${plain}`
29
+ : `Terraform failed to plan module "${moduleId}":\n${plain}`;
30
+ }
31
+ const MAX_RENDERED_VALUE_LENGTH = 80;
32
+ const MAX_REPORTED_FIELDS = 12;
33
+ /**
34
+ * Renders one terraform value as a short, readable string.
35
+ */
36
+ function renderPlanValue(value) {
37
+ if (value === null || value === undefined) {
38
+ return '(none)';
39
+ }
40
+ const truncate = (rendered) => rendered.length > MAX_RENDERED_VALUE_LENGTH ? `${rendered.slice(0, MAX_RENDERED_VALUE_LENGTH)}…` : rendered;
41
+ if (Array.isArray(value)) {
42
+ if (value.length === 0) {
43
+ return 'none';
44
+ }
45
+ // Terraform's list-typed blocks (indexes, rules, listeners) are the ones worth naming: "2 items
46
+ // -> 1 item" does not answer *which* index went away, which is the whole question.
47
+ const names = value
48
+ .map((element) => typeof element === 'object' && element !== null
49
+ ? (element.name ?? element.index_name)
50
+ : element)
51
+ .filter((name) => typeof name === 'string' && name.length > 0);
52
+ return names.length === value.length ? truncate(names.join(', ')) : `${value.length} item(s)`;
53
+ }
54
+ return truncate(typeof value === 'string' ? value : JSON.stringify(value));
55
+ }
56
+ /**
57
+ * True when any leaf of a terraform sensitive/unknown mark is `true`.
58
+ *
59
+ * These maps mirror the *shape* of the value they describe, so a list of five blocks with nothing
60
+ * sensitive in it is `[{}, {}, {}, {}, {}]` — structure, not a signal. Only a literal `true`
61
+ * anywhere in that structure marks something, which is why "non-empty object" is the wrong test: it
62
+ * reported every list-typed argument on a DynamoDB table as sensitive.
63
+ */
64
+ function hasMark(mark) {
65
+ if (mark === true) {
66
+ return true;
67
+ }
68
+ if (typeof mark !== 'object' || mark === null) {
69
+ return false;
70
+ }
71
+ return Object.values(mark).some(hasMark);
72
+ }
73
+ /**
74
+ * True when terraform's sensitive/unknown map marks `key`.
75
+ */
76
+ function isMarked(marks, key) {
77
+ if (marks === true) {
78
+ return true;
79
+ }
80
+ if (!marks || typeof marks !== 'object') {
81
+ return false;
82
+ }
83
+ return hasMark(marks[key]);
84
+ }
85
+ /**
86
+ * The arguments that differ between `before` and `after`.
87
+ *
88
+ * Terraform already hands us both sides — `readPlan` parses the whole `show -json` payload — so this
89
+ * costs nothing but the comparison. Without it an added index and a removed index render as the
90
+ * same sentence: "1 update".
91
+ */
92
+ function describeFieldChanges(change) {
93
+ const actions = new Set(change.actions ?? []);
94
+ // A plain create or delete needs no field list: the address and the action are the whole story.
95
+ const isUpdate = actions.has('update');
96
+ const isReplace = actions.has('create') && actions.has('delete');
97
+ if (!isUpdate && !isReplace) {
98
+ return { fields: [], omittedFieldCount: 0 };
99
+ }
100
+ const before = (change.before ?? {});
101
+ const after = (change.after ?? {});
102
+ const fields = [];
103
+ let omittedFieldCount = 0;
104
+ for (const key of [...new Set([...Object.keys(before), ...Object.keys(after)])].sort()) {
105
+ const unknownAfter = isMarked(change.after_unknown, key);
106
+ if (!unknownAfter && JSON.stringify(before[key]) === JSON.stringify(after[key])) {
107
+ continue;
108
+ }
109
+ // Past the cap the field is still counted, so the report can say how many it left out rather
110
+ // than ending on a list the reader cannot tell is complete.
111
+ if (fields.length === MAX_REPORTED_FIELDS) {
112
+ omittedFieldCount++;
113
+ continue;
114
+ }
115
+ fields.push({
116
+ field: key,
117
+ from: isMarked(change.before_sensitive, key) ? '(sensitive)' : renderPlanValue(before[key]),
118
+ to: unknownAfter
119
+ ? '(known after apply)'
120
+ : isMarked(change.after_sensitive, key)
121
+ ? '(sensitive)'
122
+ : renderPlanValue(after[key]),
123
+ });
124
+ }
125
+ return { fields, omittedFieldCount };
126
+ }
127
+ /**
128
+ * Read-only correlation of `terraform plan` against intent. Never writes state or folders.
129
+ *
130
+ * `plans` maps each module folder's id to its parsed terraform plan, and `planErrors` maps a folder
131
+ * terraform *failed* to plan to the reason why. The two are disjoint, and a folder in neither was
132
+ * never inspected.
133
+ *
134
+ * `persistedMappings` is the octo→terraform mapping captured by the last commit. It supplies the
135
+ * addresses of resources deleted since (absent from this boot's generated files), and identifies
136
+ * producers that have never been applied, whose outputs terragrunt can only supply as a mock.
137
+ *
138
+ * Plans are partitioned by the tracked set (intent ∪ the committed folder record,
139
+ * `previousFolders`): a plan for a module the sweep filled is demanded and correlated; a plan for a
140
+ * committed-then-deleted (emptied) folder is read when supplied; a plan for a folder octo does
141
+ * **not** track is noted and excluded from all correlation, and re-declaring its module in intent
142
+ * re-adopts it.
143
+ *
144
+ * `externalResourceStateIds` names every external resource a `run-action` published and no commit
145
+ * has recorded yet, from `StateManagementService.listExternalResourceStateIds()`. Each one is
146
+ * reported as a note.
147
+ *
148
+ * By-design limit: correlation is resource-level, not field-level.
149
+ *
150
+ * @internal
151
+ */
152
+ export async function validate({ externalResourceStateIds = [], persistedMappings, planErrors = new Map(), plans, previousFolders = [], transaction, }) {
153
+ const container = Container.getInstance();
154
+ const [resourceDataRepository, terraformService] = await Promise.all([
155
+ container.get(ResourceDataRepository),
156
+ container.get(TerraformService),
157
+ ]);
158
+ const allDiffs = transaction.resourceDiffs.flat();
159
+ const mappings = terraformService.getOctoTerraformResourceMappings();
160
+ const report = {
161
+ attributedChanges: [],
162
+ confidence: allDiffs.length === 0 ? 'exact' : 'approximate',
163
+ dataLoss: [],
164
+ drift: [],
165
+ failures: [],
166
+ intentChanges: [],
167
+ moves: terraformService
168
+ .getFolderRecords()
169
+ .flatMap(({ moduleId, moves = [] }) => moves.map(({ fromModuleId, resourceId }) => ({ fromModuleId, moduleId, resourceId }))),
170
+ notes: [],
171
+ uncertain: [],
172
+ };
173
+ // Report what an external resource published and no commit has recorded. Octo reaches that record
174
+ // only by the resource id terraform asks for, so one whose resource has left both graphs is
175
+ // published infrastructure nothing will ever ask about again - the only place a user can be told
176
+ // is here.
177
+ if (externalResourceStateIds.length > 0) {
178
+ const heldResourceIds = new Set([
179
+ ...resourceDataRepository.getNewResourcesByProperties(),
180
+ ...resourceDataRepository.getActualResourcesByProperties(),
181
+ ].map((resource) => resource.resourceId));
182
+ for (const resourceId of [...externalResourceStateIds].sort()) {
183
+ report.notes.push({
184
+ message: heldResourceIds.has(resourceId)
185
+ ? `External resource "${resourceId}" is published but not recorded in octo state; the next successful ` +
186
+ 'commit records it.'
187
+ : `External resource "${resourceId}" is published but not recorded in octo state, and neither intent nor ` +
188
+ 'the committed graph declares it any more, so octo will never delete it.',
189
+ });
190
+ }
191
+ }
192
+ // Aggregate octo diffs to one action per resource.
193
+ const octoActions = aggregateResourceActions(allDiffs);
194
+ const parsePlanChanges = (plan) => {
195
+ const changes = new Map();
196
+ for (const resourceChange of plan.resource_changes ?? []) {
197
+ if (resourceChange.mode === 'data') {
198
+ continue;
199
+ }
200
+ const described = resourceChange.change
201
+ ? describeFieldChanges(resourceChange.change)
202
+ : { fields: [], omittedFieldCount: 0 };
203
+ changes.set(resourceChange.address, {
204
+ changedFields: described.fields,
205
+ omittedFieldCount: described.omittedFieldCount,
206
+ tfActions: resourceChange.change?.actions ?? [],
207
+ });
208
+ }
209
+ return changes;
210
+ };
211
+ const sweptModuleIds = new Set(terraformService.getModuleIds());
212
+ const trackedModuleIds = new Set([...sweptModuleIds, ...previousFolders.map((folder) => folder.moduleId)]);
213
+ const planChangesByModule = new Map();
214
+ const NO_PLAN_CHANGE = { changedFields: [], omittedFieldCount: 0, tfActions: [] };
215
+ // Every module the sweep filled must have a plan. `getModuleIds()` only lists modules that
216
+ // contributed a resource, so a missing plan means terraform ran on a real folder and failed.
217
+ for (const moduleId of sweptModuleIds) {
218
+ const plan = plans.get(moduleId);
219
+ if (!plan) {
220
+ const cause = planErrors.get(moduleId);
221
+ report.failures.push({
222
+ message: cause
223
+ ? renderPlanFailure(moduleId, cause)
224
+ : `No terraform plan was supplied for module "${moduleId}", so octo cannot report on it.`,
225
+ moduleId,
226
+ });
227
+ continue;
228
+ }
229
+ planChangesByModule.set(moduleId, parsePlanChanges(plan));
230
+ }
231
+ // Remaining plans belong either to an emptied folder octo still tracks, or to a folder it does not
232
+ // own at all.
233
+ for (const [moduleId, plan] of plans.entries()) {
234
+ if (sweptModuleIds.has(moduleId)) {
235
+ continue;
236
+ }
237
+ if (trackedModuleIds.has(moduleId)) {
238
+ planChangesByModule.set(moduleId, parsePlanChanges(plan));
239
+ }
240
+ else {
241
+ report.notes.push({
242
+ message: `Terraform plan supplied for folder "${moduleId}", which octo does not track (not in intent or committed ` +
243
+ 'state); excluding it from this report. Re-declare its module in intent to re-adopt it.',
244
+ moduleId,
245
+ });
246
+ }
247
+ }
248
+ const isNoop = (actions) => actions.length === 0 || (actions.length === 1 && (actions[0] === 'no-op' || actions[0] === 'read'));
249
+ const claimedAddresses = new Map();
250
+ const claim = (moduleId, address) => {
251
+ if (!claimedAddresses.has(moduleId)) {
252
+ claimedAddresses.set(moduleId, new Set());
253
+ }
254
+ claimedAddresses.get(moduleId).add(address);
255
+ };
256
+ const referrers = terraformService.getResourceReferrers();
257
+ const mappingByResourceId = new Map(mappings.map((mapping) => [mapping.resourceId, mapping]));
258
+ // Terraform changes everything that transitively references a resource whose identity moved, while
259
+ // octo's diff carries only the moved resource itself. Walking the same reference graph terraform
260
+ // cascades along recovers the rest.
261
+ //
262
+ // An identity moves on REPLACE (force-new recreates the referrer too), and on ADD or DELETE of a
263
+ // resourceId — a referrer that kept its own id then renders a different terraform address. Renaming
264
+ // an execution, for instance, replaces `alb-target-group-<old>` with `alb-target-group-<new>`, and
265
+ // the untouched alb-listener's `default_action.forward.target_group.arn` moves with it.
266
+ const identityChangedResourceIds = new Set([...octoActions.values()]
267
+ .filter((a) => a.action === DiffAction.REPLACE || a.action === DiffAction.ADD || a.action === DiffAction.DELETE)
268
+ .map((a) => a.resourceId));
269
+ // Each affected referrer maps to the moved resource it references, so the report can name the cause.
270
+ const cascadeCauseByResourceId = new Map();
271
+ const cascadeQueue = [...identityChangedResourceIds];
272
+ while (cascadeQueue.length > 0) {
273
+ const referentId = cascadeQueue.shift();
274
+ for (const referrerId of referrers.get(referentId) ?? []) {
275
+ if (!cascadeCauseByResourceId.has(referrerId) && !identityChangedResourceIds.has(referrerId)) {
276
+ cascadeCauseByResourceId.set(referrerId, referentId);
277
+ cascadeQueue.push(referrerId);
278
+ }
279
+ }
280
+ }
281
+ // Resources that may have been planned against a `mock_outputs` placeholder rather than a real
282
+ // value. Terragrunt substitutes a mock for any output name the producer folder's state lacks, and
283
+ // that happens two ways: the producer has never been applied, so it has no outputs at all; or it
284
+ // has been applied and now declares an output it did not declare then, because its response gained
285
+ // a key. Same-module references use no dependency block and cannot be mocked.
286
+ //
287
+ // The second case is read off the committed graph rather than the persisted mapping, which records
288
+ // addresses and not output names. A commit demands every declared output resolve before it records
289
+ // a resource, so a key the committed response does not hold is an output that was not there.
290
+ const mockFedCauseByResourceId = new Map();
291
+ const mockQueue = [];
292
+ const markMockFed = (resourceId, cause) => {
293
+ if (!mockFedCauseByResourceId.has(resourceId)) {
294
+ mockFedCauseByResourceId.set(resourceId, cause);
295
+ mockQueue.push(resourceId);
296
+ }
297
+ };
298
+ /**
299
+ * Why a producer's outputs would be mocked, or `undefined` when every one of them is in state.
300
+ */
301
+ const describeProducerMocking = (referent) => {
302
+ if (!persistedMappings.has(referent.resourceContext)) {
303
+ return 'never-applied';
304
+ }
305
+ // An external resource publishes its whole response under one output name, so a response that
306
+ // gained a key adds no output name for terragrunt to miss.
307
+ if (referent.entireResponseOutput !== undefined) {
308
+ return undefined;
309
+ }
310
+ const committed = resourceDataRepository.getActualResourceByContext(referent.resourceContext);
311
+ if (!committed) {
312
+ return 'never-applied';
313
+ }
314
+ return referent.outputMappings.some(({ key }) => !(key in committed.response)) ? 'new-output' : undefined;
315
+ };
316
+ for (const [referentId, referrerIds] of referrers.entries()) {
317
+ const referent = mappingByResourceId.get(referentId);
318
+ if (!referent) {
319
+ continue;
320
+ }
321
+ const kind = describeProducerMocking(referent);
322
+ if (!kind) {
323
+ continue;
324
+ }
325
+ for (const referrerId of referrerIds) {
326
+ const referrer = mappingByResourceId.get(referrerId);
327
+ if (referrer && referrer.moduleId !== referent.moduleId) {
328
+ markMockFed(referrerId, { kind, resourceId: referentId });
329
+ }
330
+ }
331
+ }
332
+ // A mocked value propagates: anything reading it is planned on it too.
333
+ while (mockQueue.length > 0) {
334
+ const resourceId = mockQueue.shift();
335
+ const cause = mockFedCauseByResourceId.get(resourceId);
336
+ for (const referrerId of referrers.get(resourceId) ?? []) {
337
+ markMockFed(referrerId, cause);
338
+ }
339
+ }
340
+ const mockFedModuleIds = new Set([...mockFedCauseByResourceId.keys()]
341
+ .map((resourceId) => mappingByResourceId.get(resourceId)?.moduleId)
342
+ .filter((moduleId) => moduleId !== undefined));
343
+ const describeMockCause = (cause) => `planned against a "mock_outputs" placeholder: it consumes an output of "${cause.resourceId}", which has ` +
344
+ (cause.kind === 'never-applied' ? 'never been applied' : 'gained an output since it was last applied') +
345
+ ', so the value terraform compared against is not the value it will get';
346
+ /**
347
+ * Classifies a terraform change on a resource octo did not flag: attributed if octo explains it,
348
+ * uncertain if the plan itself may be wrong, drift otherwise.
349
+ */
350
+ const classifyChangeWithNoOctoDiff = (moduleId, resourceId, change) => {
351
+ const cascadeCause = cascadeCauseByResourceId.get(resourceId);
352
+ if (cascadeCause) {
353
+ report.attributedChanges.push({
354
+ address: change.address,
355
+ causeKind: 'identity-changed',
356
+ causeResourceId: cascadeCause,
357
+ moduleId,
358
+ tfActions: change.tfActions,
359
+ });
360
+ return;
361
+ }
362
+ const mockCause = mockFedCauseByResourceId.get(resourceId);
363
+ if (mockCause) {
364
+ report.uncertain.push({
365
+ address: change.address,
366
+ moduleId,
367
+ reason: describeMockCause(mockCause),
368
+ tfActions: change.tfActions,
369
+ });
370
+ return;
371
+ }
372
+ report.drift.push({ address: change.address, moduleId, tfActions: change.tfActions });
373
+ };
374
+ // Forward: correlate every address this sweep rendered with the plan.
375
+ for (const mapping of mappings) {
376
+ const octoAction = octoActions.get(mapping.resourceContext);
377
+ // The folder failed to plan and is already a `failure`. Reporting an empty terraform side here
378
+ // would read as "no infrastructure change" for a folder nobody could read.
379
+ const planChanges = planChangesByModule.get(mapping.moduleId);
380
+ if (!planChanges) {
381
+ continue;
382
+ }
383
+ const addressActions = mapping.terraformAddresses.map((address) => {
384
+ claim(mapping.moduleId, address);
385
+ const planChange = planChanges.get(address) ?? NO_PLAN_CHANGE;
386
+ return {
387
+ address,
388
+ changedFields: planChange.changedFields,
389
+ // Omitted entirely when nothing was left out, so a report payload only carries the key
390
+ // where it has something to say.
391
+ ...(planChange.omittedFieldCount ? { omittedFieldCount: planChange.omittedFieldCount } : {}),
392
+ tfActions: planChange.tfActions,
393
+ };
394
+ });
395
+ // A resource can render a variable number of addresses — one rule resource per security group
396
+ // rule, one object per s3 website file. When it survives but renders fewer, the dropped address
397
+ // is in no current mapping, so its destroy belongs to the resource that stopped rendering it.
398
+ const persisted = persistedMappings.get(mapping.resourceContext);
399
+ const currentAddresses = new Set(mapping.terraformAddresses);
400
+ for (const address of persisted?.terraformAddresses ?? []) {
401
+ if (currentAddresses.has(address)) {
402
+ continue;
403
+ }
404
+ claim(mapping.moduleId, address);
405
+ const { tfActions } = planChanges.get(address) ?? NO_PLAN_CHANGE;
406
+ if (!isNoop(tfActions)) {
407
+ report.attributedChanges.push({
408
+ address,
409
+ causeKind: 'address-no-longer-rendered',
410
+ causeResourceId: mapping.resourceId,
411
+ moduleId: mapping.moduleId,
412
+ tfActions,
413
+ });
414
+ }
415
+ }
416
+ const changed = addressActions.filter((a) => !isNoop(a.tfActions));
417
+ // Record what octo said and what terraform said, without requiring the two to agree.
418
+ if (octoAction) {
419
+ report.intentChanges.push({
420
+ moduleId: mapping.moduleId,
421
+ octoAction: octoAction.action,
422
+ reason: octoAction.reason,
423
+ resourceContext: mapping.resourceContext,
424
+ resourceId: mapping.resourceId,
425
+ terraformChanges: changed,
426
+ });
427
+ continue;
428
+ }
429
+ for (const change of changed) {
430
+ classifyChangeWithNoOctoDiff(mapping.moduleId, mapping.resourceId, change);
431
+ }
432
+ }
433
+ // Deleted octo resources are absent from this boot's generated files, so their addresses come from
434
+ // the mapping persisted at the last commit.
435
+ let hasUnverifiableDelete = false;
436
+ for (const [context, octoAction] of octoActions.entries()) {
437
+ if (octoAction.action !== DiffAction.DELETE) {
438
+ continue;
439
+ }
440
+ // Never committed through the terraform flow, so its addresses were never recorded.
441
+ const persisted = persistedMappings.get(context);
442
+ if (!persisted) {
443
+ report.notes.push({
444
+ message: `Deleted resource "${octoAction.resourceId}" is not in the persisted terraform mapping ` +
445
+ '(deleted before it was ever committed?); its terraform addresses are unknown.',
446
+ });
447
+ report.intentChanges.push({
448
+ octoAction: DiffAction.DELETE,
449
+ reason: octoAction.reason,
450
+ resourceContext: context,
451
+ resourceId: octoAction.resourceId,
452
+ terraformChanges: [],
453
+ });
454
+ hasUnverifiableDelete = true;
455
+ continue;
456
+ }
457
+ // The owning folder is emptied and no plan was supplied for it, so its destroys cannot be
458
+ // correlated.
459
+ const planChanges = planChangesByModule.get(persisted.moduleId);
460
+ if (!planChanges) {
461
+ report.notes.push({
462
+ message: `Deleted resource "${octoAction.resourceId}" lived in module "${persisted.moduleId}", whose ` +
463
+ 'plan was not supplied; its terraform deletes are not in this report.',
464
+ moduleId: persisted.moduleId,
465
+ });
466
+ report.intentChanges.push({
467
+ moduleId: persisted.moduleId,
468
+ octoAction: DiffAction.DELETE,
469
+ reason: octoAction.reason,
470
+ resourceContext: context,
471
+ resourceId: octoAction.resourceId,
472
+ terraformChanges: [],
473
+ });
474
+ continue;
475
+ }
476
+ const terraformChanges = [];
477
+ for (const address of persisted.terraformAddresses) {
478
+ const { changedFields, omittedFieldCount, tfActions } = planChanges.get(address) ?? NO_PLAN_CHANGE;
479
+ claim(persisted.moduleId, address);
480
+ if (!isNoop(tfActions)) {
481
+ terraformChanges.push({
482
+ address,
483
+ changedFields,
484
+ ...(omittedFieldCount ? { omittedFieldCount } : {}),
485
+ tfActions,
486
+ });
487
+ }
488
+ }
489
+ // No terraform change means the resource is already gone from the cloud and intent has caught up.
490
+ report.intentChanges.push({
491
+ moduleId: persisted.moduleId,
492
+ octoAction: DiffAction.DELETE,
493
+ reason: octoAction.reason,
494
+ resourceContext: context,
495
+ resourceId: octoAction.resourceId,
496
+ terraformChanges,
497
+ });
498
+ }
499
+ // Reverse: whatever terraform plans that no octo resource has claimed.
500
+ for (const [moduleId, planChanges] of planChangesByModule.entries()) {
501
+ for (const [address, { tfActions }] of planChanges.entries()) {
502
+ if (claimedAddresses.get(moduleId)?.has(address) || isNoop(tfActions)) {
503
+ continue;
504
+ }
505
+ const joined = [...tfActions].sort().join(',');
506
+ if (joined === 'delete' && hasUnverifiableDelete) {
507
+ report.notes.push({
508
+ message: `Terraform plans a delete on "${address}", which is unclaimed — an octo delete with no persisted ` +
509
+ 'mapping may own it.',
510
+ moduleId,
511
+ });
512
+ }
513
+ else if (mockFedModuleIds.has(moduleId)) {
514
+ report.uncertain.push({
515
+ address,
516
+ moduleId,
517
+ reason: 'no octo resource renders this address, and this folder was planned with at least one ' +
518
+ '"mock_outputs" placeholder substituted',
519
+ tfActions,
520
+ });
521
+ }
522
+ else {
523
+ report.drift.push({ address, moduleId, tfActions });
524
+ }
525
+ }
526
+ }
527
+ // Find the addresses of every resource whose destroy loses data, deleted ones by their committed class.
528
+ const dataLossResourceIds = new Map();
529
+ for (const mapping of mappings.filter((m) => m.destroyLosesData)) {
530
+ for (const address of mapping.terraformAddresses) {
531
+ dataLossResourceIds.set(`${mapping.moduleId} ${address}`, mapping.resourceId);
532
+ }
533
+ }
534
+ for (const persisted of persistedMappings.values()) {
535
+ const committed = resourceDataRepository.getActualResourceByContext(persisted.resourceContext);
536
+ if (committed && committed.constructor.DESTROY_LOSES_DATA) {
537
+ for (const address of persisted.terraformAddresses) {
538
+ dataLossResourceIds.set(`${persisted.moduleId} ${address}`, persisted.resourceId);
539
+ }
540
+ }
541
+ }
542
+ // Mark each planned destroy of one.
543
+ for (const [moduleId, planChanges] of planChangesByModule.entries()) {
544
+ for (const [address, { tfActions }] of planChanges.entries()) {
545
+ const resourceId = dataLossResourceIds.get(`${moduleId} ${address}`);
546
+ if (resourceId !== undefined && tfActions.includes('delete')) {
547
+ report.dataLoss.push({
548
+ address,
549
+ message: `Terraform plans to destroy "${address}", and the data resource "${resourceId}" holds is lost with it.`,
550
+ moduleId,
551
+ resourceId,
552
+ });
553
+ }
554
+ }
555
+ }
556
+ return report;
557
+ }
558
+ //# sourceMappingURL=validate.mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.mode.js","sourceRoot":"","sources":["../../src/modes/validate.mode.ts"],"names":[],"mappings":"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"}
@@ -4,14 +4,57 @@ import type { ModelActionHook } from '../functions/hook/model-action.hook.js';
4
4
  import type { ResourceActionHook } from '../functions/hook/resource-action.hook.js';
5
5
  import type { IModule } from './module.interface.js';
6
6
  /**
7
+ * The base class of every module - the unit you actually assemble infrastructure from.
8
+ *
9
+ * A module takes typed inputs, and produces models, overlays, and anchors. It is the reusable piece:
10
+ * you publish one, someone else loads it with {@link Octo.loadModule} and their own inputs, and the
11
+ * models it built become available to the modules that run after it.
12
+ *
13
+ * Everything a module needs from another module it finds by schema - see
14
+ * {@link AModel.getAnchorsMatchingSchema} - so modules compose without importing each other's classes.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * @Module<MyModule>('@example', MyModuleSchema)
19
+ * export class MyModule extends AModule<MyModuleSchema, MyRegion> {
20
+ * async onInit(inputs: MyModuleSchema): Promise<MyRegion> { ... }
21
+ * }
22
+ * ```
23
+ *
7
24
  * @group Modules
25
+ *
26
+ * @see Definition of [Modules](/docs/fundamentals/modules).
8
27
  */
9
28
  export declare abstract class AModule<S, T extends UnknownModel> implements IModule<S, T> {
10
29
  static readonly MODULE_PACKAGE: string;
11
30
  static readonly MODULE_SCHEMA: ModuleSchema<AModule<any, any>>;
31
+ /**
32
+ * The ID this module was loaded under. It scopes everything the module produces, so the same
33
+ * module class can be loaded more than once.
34
+ */
12
35
  readonly moduleId: string;
36
+ /**
37
+ * @param moduleId The ID this module is loaded under.
38
+ */
13
39
  constructor(moduleId: string);
40
+ /**
41
+ * Builds this module's infrastructure. It is where you construct models, attach anchors,
42
+ * and create overlays.
43
+ *
44
+ * Validate inputs here and throw a [ModuleError](/api/octo/class/ModuleError) on anything you
45
+ * cannot satisfy - failing in `onInit` costs nothing, while failing later costs a half-built stack.
46
+ *
47
+ * @param inputs The inputs this module was loaded with, already validated against its schema.
48
+ * @returns The nodes this module produced. Return them all, including overlays - they are what
49
+ * later modules resolve against.
50
+ */
14
51
  abstract onInit(inputs: S): Promise<T | UnknownModel[]>;
52
+ /**
53
+ * To hook custom behavior into Octo's lifecycle for the duration of this module.
54
+ * Override it to return the callbacks you want run.
55
+ *
56
+ * @see Techniques for [Hooks](/docs/techniques/hooks).
57
+ */
15
58
  registerHooks(): {
16
59
  postCommitHooks?: Parameters<CommitHook['collectHooks']>[0]['postHooks'];
17
60
  postModelActionHooks?: Parameters<ModelActionHook['collectHooks']>[0]['postHooks'];
@@ -20,5 +63,13 @@ export declare abstract class AModule<S, T extends UnknownModel> implements IMod
20
63
  preModelActionHooks?: Parameters<ModelActionHook['collectHooks']>[0]['preHooks'];
21
64
  preResourceActionHooks?: Parameters<ResourceActionHook['collectHooks']>[0]['preHooks'];
22
65
  };
66
+ /**
67
+ * To derive values that both {@link AModule.onInit} and this module's actions need - typically
68
+ * facts resolved from another module's anchors, such as an account ID or a region's availability
69
+ * zones. Override it, and the returned object is handed to every action of this module as
70
+ * `actionInputs.metadata`.
71
+ *
72
+ * @param inputs The inputs this module was loaded with.
73
+ */
23
74
  registerMetadata(inputs: S): Promise<Record<string, unknown>>;
24
75
  }