@intentius/chant-lexicon-terraform 0.124.52 → 0.124.55

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 (641) hide show
  1. package/README.md +14 -10
  2. package/dist/__fixtures__/pr-loop/estate.component.d.ts +7 -0
  3. package/dist/__fixtures__/pr-loop/estate.component.d.ts.map +1 -0
  4. package/dist/__fixtures__/pr-loop/estate.component.js +7 -0
  5. package/dist/__fixtures__/report/generate.d.ts +26 -0
  6. package/dist/__fixtures__/report/generate.d.ts.map +1 -0
  7. package/dist/__fixtures__/report/generate.js +58 -0
  8. package/dist/applied-state.d.ts +27 -0
  9. package/dist/applied-state.d.ts.map +1 -0
  10. package/dist/applied-state.js +44 -0
  11. package/dist/backend-config.d.ts +53 -0
  12. package/dist/backend-config.d.ts.map +1 -0
  13. package/dist/backend-config.js +136 -0
  14. package/dist/behaviour/kinds.d.ts.map +1 -1
  15. package/dist/behaviour/kinds.js +4 -0
  16. package/dist/behaviour/predict.d.ts.map +1 -1
  17. package/dist/behaviour/predict.js +6 -2
  18. package/dist/behaviour/reference-catalog.d.ts +16 -5
  19. package/dist/behaviour/reference-catalog.d.ts.map +1 -1
  20. package/dist/behaviour/reference-catalog.js +16 -5
  21. package/dist/behaviour/request.d.ts.map +1 -1
  22. package/dist/behaviour/request.js +3 -2
  23. package/dist/changed-roots.d.ts +6 -4
  24. package/dist/changed-roots.d.ts.map +1 -1
  25. package/dist/changed-roots.js +14 -18
  26. package/dist/ci-setup.d.ts +11 -0
  27. package/dist/ci-setup.d.ts.map +1 -0
  28. package/dist/ci-setup.js +41 -0
  29. package/dist/commands.d.ts.map +1 -1
  30. package/dist/commands.js +4 -3
  31. package/dist/components/capability-plugin.d.ts +105 -9
  32. package/dist/components/capability-plugin.d.ts.map +1 -1
  33. package/dist/components/capability-plugin.js +357 -36
  34. package/dist/components/compose-group.d.ts +145 -0
  35. package/dist/components/compose-group.d.ts.map +1 -0
  36. package/dist/components/compose-group.js +407 -0
  37. package/dist/components/placeholder-preview.d.ts +78 -0
  38. package/dist/components/placeholder-preview.d.ts.map +1 -0
  39. package/dist/components/placeholder-preview.js +254 -0
  40. package/dist/components/release-inputs.d.ts +29 -0
  41. package/dist/components/release-inputs.d.ts.map +1 -0
  42. package/dist/components/release-inputs.js +57 -0
  43. package/dist/components/trace-facts.d.ts +16 -0
  44. package/dist/components/trace-facts.d.ts.map +1 -0
  45. package/dist/components/trace-facts.js +19 -0
  46. package/dist/compose/apply-events.d.ts +46 -0
  47. package/dist/compose/apply-events.d.ts.map +1 -0
  48. package/dist/compose/apply-events.js +77 -0
  49. package/dist/compose/estate.d.ts +194 -0
  50. package/dist/compose/estate.d.ts.map +1 -0
  51. package/dist/compose/estate.js +363 -0
  52. package/dist/compose/hcl.d.ts +99 -0
  53. package/dist/compose/hcl.d.ts.map +1 -0
  54. package/dist/compose/hcl.js +302 -0
  55. package/dist/compose/module-address.d.ts +24 -0
  56. package/dist/compose/module-address.d.ts.map +1 -0
  57. package/dist/compose/module-address.js +43 -0
  58. package/dist/compose/root.d.ts +127 -0
  59. package/dist/compose/root.d.ts.map +1 -0
  60. package/dist/compose/root.js +586 -0
  61. package/dist/compose/run.d.ts +183 -0
  62. package/dist/compose/run.d.ts.map +1 -0
  63. package/dist/compose/run.js +447 -0
  64. package/dist/compose/slice.d.ts +102 -0
  65. package/dist/compose/slice.d.ts.map +1 -0
  66. package/dist/compose/slice.js +249 -0
  67. package/dist/compose/state-address.d.ts +28 -0
  68. package/dist/compose/state-address.d.ts.map +1 -0
  69. package/dist/compose/state-address.js +154 -0
  70. package/dist/compose/state-merge.d.ts +52 -0
  71. package/dist/compose/state-merge.d.ts.map +1 -0
  72. package/dist/compose/state-merge.js +135 -0
  73. package/dist/compose.d.ts +179 -0
  74. package/dist/compose.d.ts.map +1 -0
  75. package/dist/compose.js +482 -0
  76. package/dist/composites/terraform-apply-op.d.ts.map +1 -1
  77. package/dist/composites/terraform-apply-op.js +7 -3
  78. package/dist/cone.d.ts +53 -0
  79. package/dist/cone.d.ts.map +1 -0
  80. package/dist/cone.js +119 -0
  81. package/dist/config.d.ts +59 -13
  82. package/dist/config.d.ts.map +1 -1
  83. package/dist/config.js +43 -9
  84. package/dist/cost-hold.d.ts +27 -0
  85. package/dist/cost-hold.d.ts.map +1 -0
  86. package/dist/cost-hold.js +21 -0
  87. package/dist/describe-resources.d.ts +74 -12
  88. package/dist/describe-resources.d.ts.map +1 -1
  89. package/dist/describe-resources.js +374 -66
  90. package/dist/drift-read.d.ts +33 -0
  91. package/dist/drift-read.d.ts.map +1 -0
  92. package/dist/drift-read.js +243 -0
  93. package/dist/drift-record.d.ts +147 -0
  94. package/dist/drift-record.d.ts.map +1 -0
  95. package/dist/drift-record.js +383 -0
  96. package/dist/drift-rows.d.ts +61 -0
  97. package/dist/drift-rows.d.ts.map +1 -0
  98. package/dist/drift-rows.js +108 -0
  99. package/dist/exit-codes.d.ts +55 -0
  100. package/dist/exit-codes.d.ts.map +1 -0
  101. package/dist/exit-codes.js +48 -0
  102. package/dist/hcl/edges.d.ts.map +1 -1
  103. package/dist/hcl/edges.js +24 -1
  104. package/dist/hcl/files.d.ts +61 -0
  105. package/dist/hcl/files.d.ts.map +1 -0
  106. package/dist/hcl/files.js +221 -0
  107. package/dist/hcl/instances.d.ts +82 -0
  108. package/dist/hcl/instances.d.ts.map +1 -0
  109. package/dist/hcl/instances.js +390 -0
  110. package/dist/hcl/parse.d.ts +81 -9
  111. package/dist/hcl/parse.d.ts.map +1 -1
  112. package/dist/hcl/parse.js +114 -16
  113. package/dist/hcl/roots.d.ts.map +1 -1
  114. package/dist/hcl/roots.js +5 -0
  115. package/dist/hcl/suppressions.d.ts.map +1 -1
  116. package/dist/hcl/suppressions.js +8 -2
  117. package/dist/index.d.ts +13 -2
  118. package/dist/index.d.ts.map +1 -1
  119. package/dist/index.js +24 -2
  120. package/dist/integrity.json +8 -5
  121. package/dist/lint/audit-catalog.d.ts.map +1 -1
  122. package/dist/lint/audit-catalog.js +27 -3
  123. package/dist/lint/audit-lineage.d.ts +14 -2
  124. package/dist/lint/audit-lineage.d.ts.map +1 -1
  125. package/dist/lint/post-synth/index.d.ts.map +1 -1
  126. package/dist/lint/post-synth/index.js +4 -0
  127. package/dist/lint/post-synth/record-store.d.ts +54 -0
  128. package/dist/lint/post-synth/record-store.d.ts.map +1 -0
  129. package/dist/lint/post-synth/record-store.js +104 -0
  130. package/dist/lint/post-synth/tf001.d.ts +2 -2
  131. package/dist/lint/post-synth/tf001.js +2 -2
  132. package/dist/lint/post-synth/tf024.d.ts +35 -11
  133. package/dist/lint/post-synth/tf024.d.ts.map +1 -1
  134. package/dist/lint/post-synth/tf024.js +92 -20
  135. package/dist/lint/post-synth/tf046.d.ts +64 -0
  136. package/dist/lint/post-synth/tf046.d.ts.map +1 -0
  137. package/dist/lint/post-synth/tf046.js +175 -0
  138. package/dist/lint/post-synth/tf047.d.ts +36 -0
  139. package/dist/lint/post-synth/tf047.d.ts.map +1 -0
  140. package/dist/lint/post-synth/tf047.js +94 -0
  141. package/dist/live-plan-reasons.d.ts +21 -0
  142. package/dist/live-plan-reasons.d.ts.map +1 -0
  143. package/dist/live-plan-reasons.js +47 -0
  144. package/dist/lock-rows.d.ts +36 -0
  145. package/dist/lock-rows.d.ts.map +1 -0
  146. package/dist/lock-rows.js +60 -0
  147. package/dist/lock-timeout.d.ts +22 -0
  148. package/dist/lock-timeout.d.ts.map +1 -0
  149. package/dist/lock-timeout.js +32 -0
  150. package/dist/lsp/option-keys.d.ts.map +1 -1
  151. package/dist/lsp/option-keys.js +2 -0
  152. package/dist/manifest.json +1 -1
  153. package/dist/module-catalog/index.d.ts +69 -0
  154. package/dist/module-catalog/index.d.ts.map +1 -0
  155. package/dist/module-catalog/index.js +110 -0
  156. package/dist/module-catalog/refresh-cli.d.ts +4 -0
  157. package/dist/module-catalog/refresh-cli.d.ts.map +1 -0
  158. package/dist/module-catalog/refresh-cli.js +64 -0
  159. package/dist/module-catalog/static-tier.d.ts +6 -0
  160. package/dist/module-catalog/static-tier.d.ts.map +1 -0
  161. package/dist/module-catalog/static-tier.js +1650 -0
  162. package/dist/module-catalog/types.d.ts +65 -0
  163. package/dist/module-catalog/types.d.ts.map +1 -0
  164. package/dist/module-catalog/types.js +33 -0
  165. package/dist/okf/index.md +3 -1
  166. package/dist/okf/rules/TF024.md +2 -2
  167. package/dist/okf/rules/TF046.md +11 -0
  168. package/dist/okf/rules/TF047.md +11 -0
  169. package/dist/op/activities/index.d.ts +6 -2
  170. package/dist/op/activities/index.d.ts.map +1 -1
  171. package/dist/op/activities/index.js +5 -1
  172. package/dist/op/activities/live-detect.d.ts +4 -3
  173. package/dist/op/activities/live-detect.d.ts.map +1 -1
  174. package/dist/op/activities/live-detect.js +57 -32
  175. package/dist/op/activities/pin-rollout.d.ts +2 -0
  176. package/dist/op/activities/pin-rollout.d.ts.map +1 -1
  177. package/dist/op/activities/pin-rollout.js +1 -0
  178. package/dist/op/activities/terraform.d.ts +182 -5
  179. package/dist/op/activities/terraform.d.ts.map +1 -1
  180. package/dist/op/activities/terraform.js +224 -24
  181. package/dist/op/activity-contracts.d.ts +27 -0
  182. package/dist/op/activity-contracts.d.ts.map +1 -1
  183. package/dist/op/activity-contracts.js +19 -1
  184. package/dist/op/builders.d.ts +7 -1
  185. package/dist/op/builders.d.ts.map +1 -1
  186. package/dist/op/builders.js +9 -0
  187. package/dist/pin/consumers.d.ts +35 -0
  188. package/dist/pin/consumers.d.ts.map +1 -0
  189. package/dist/pin/consumers.js +70 -0
  190. package/dist/pin/edit.d.ts.map +1 -1
  191. package/dist/pin/edit.js +35 -0
  192. package/dist/pin/rollout.d.ts +2 -0
  193. package/dist/pin/rollout.d.ts.map +1 -1
  194. package/dist/pin/rollout.js +14 -11
  195. package/dist/plan-shape.d.ts +30 -0
  196. package/dist/plan-shape.d.ts.map +1 -0
  197. package/dist/plan-shape.js +125 -0
  198. package/dist/plugin.d.ts.map +1 -1
  199. package/dist/plugin.js +37 -18
  200. package/dist/registry/address.d.ts +63 -0
  201. package/dist/registry/address.d.ts.map +1 -0
  202. package/dist/registry/address.js +65 -0
  203. package/dist/registry/catalog-read.d.ts +14 -0
  204. package/dist/registry/catalog-read.d.ts.map +1 -0
  205. package/dist/registry/catalog-read.js +58 -0
  206. package/dist/registry/deprecated.d.ts +37 -0
  207. package/dist/registry/deprecated.d.ts.map +1 -0
  208. package/dist/registry/deprecated.js +43 -0
  209. package/dist/registry/docs.d.ts +96 -0
  210. package/dist/registry/docs.d.ts.map +1 -0
  211. package/dist/registry/docs.js +210 -0
  212. package/dist/registry/edge/edge.d.ts +46 -0
  213. package/dist/registry/edge/edge.d.ts.map +1 -0
  214. package/dist/registry/edge/edge.js +194 -0
  215. package/dist/registry/edge/index.d.ts +11 -0
  216. package/dist/registry/edge/index.d.ts.map +1 -0
  217. package/dist/registry/edge/index.js +10 -0
  218. package/dist/registry/edge/lambda-edge.d.ts +76 -0
  219. package/dist/registry/edge/lambda-edge.d.ts.map +1 -0
  220. package/dist/registry/edge/lambda-edge.js +95 -0
  221. package/dist/registry/edge/sigv4-web.d.ts +33 -0
  222. package/dist/registry/edge/sigv4-web.d.ts.map +1 -0
  223. package/dist/registry/edge/sigv4-web.js +56 -0
  224. package/dist/registry/edge/token-source.d.ts +73 -0
  225. package/dist/registry/edge/token-source.d.ts.map +1 -0
  226. package/dist/registry/edge/token-source.js +115 -0
  227. package/dist/registry/edge/worker.d.ts +45 -0
  228. package/dist/registry/edge/worker.d.ts.map +1 -0
  229. package/dist/registry/edge/worker.js +26 -0
  230. package/dist/registry/handler.d.ts +25 -0
  231. package/dist/registry/handler.d.ts.map +1 -0
  232. package/dist/registry/handler.js +75 -0
  233. package/dist/registry/headers-file.d.ts +21 -0
  234. package/dist/registry/headers-file.d.ts.map +1 -0
  235. package/dist/registry/headers-file.js +57 -0
  236. package/dist/registry/index.d.ts +31 -0
  237. package/dist/registry/index.d.ts.map +1 -0
  238. package/dist/registry/index.js +30 -0
  239. package/dist/registry/mirror-paths.d.ts +9 -0
  240. package/dist/registry/mirror-paths.d.ts.map +1 -0
  241. package/dist/registry/mirror-paths.js +8 -0
  242. package/dist/registry/mirror.d.ts +130 -0
  243. package/dist/registry/mirror.d.ts.map +1 -0
  244. package/dist/registry/mirror.js +319 -0
  245. package/dist/registry/proxies.d.ts +73 -0
  246. package/dist/registry/proxies.d.ts.map +1 -0
  247. package/dist/registry/proxies.js +111 -0
  248. package/dist/registry/reader.d.ts +57 -0
  249. package/dist/registry/reader.d.ts.map +1 -0
  250. package/dist/registry/reader.js +198 -0
  251. package/dist/registry/semver.d.ts +16 -0
  252. package/dist/registry/semver.d.ts.map +1 -0
  253. package/dist/registry/semver.js +24 -0
  254. package/dist/registry/serve.d.ts +24 -0
  255. package/dist/registry/serve.d.ts.map +1 -0
  256. package/dist/registry/serve.js +64 -0
  257. package/dist/registry/source-forms.d.ts +79 -0
  258. package/dist/registry/source-forms.d.ts.map +1 -0
  259. package/dist/registry/source-forms.js +202 -0
  260. package/dist/registry/targets/artifactory.d.ts +28 -0
  261. package/dist/registry/targets/artifactory.d.ts.map +1 -0
  262. package/dist/registry/targets/artifactory.js +206 -0
  263. package/dist/registry/targets/fake-artifactory.d.ts +30 -0
  264. package/dist/registry/targets/fake-artifactory.d.ts.map +1 -0
  265. package/dist/registry/targets/fake-artifactory.js +142 -0
  266. package/dist/registry/targets/fake-gitlab.d.ts +39 -0
  267. package/dist/registry/targets/fake-gitlab.d.ts.map +1 -0
  268. package/dist/registry/targets/fake-gitlab.js +136 -0
  269. package/dist/registry/targets/fake-hcp.d.ts +50 -0
  270. package/dist/registry/targets/fake-hcp.d.ts.map +1 -0
  271. package/dist/registry/targets/fake-hcp.js +202 -0
  272. package/dist/registry/targets/fake-http.d.ts +31 -0
  273. package/dist/registry/targets/fake-http.d.ts.map +1 -0
  274. package/dist/registry/targets/fake-http.js +87 -0
  275. package/dist/registry/targets/fake-nexus.d.ts +27 -0
  276. package/dist/registry/targets/fake-nexus.d.ts.map +1 -0
  277. package/dist/registry/targets/fake-nexus.js +137 -0
  278. package/dist/registry/targets/gitlab.d.ts +53 -0
  279. package/dist/registry/targets/gitlab.d.ts.map +1 -0
  280. package/dist/registry/targets/gitlab.js +187 -0
  281. package/dist/registry/targets/hcp.d.ts +29 -0
  282. package/dist/registry/targets/hcp.d.ts.map +1 -0
  283. package/dist/registry/targets/hcp.js +310 -0
  284. package/dist/registry/targets/hosted.d.ts +62 -0
  285. package/dist/registry/targets/hosted.d.ts.map +1 -0
  286. package/dist/registry/targets/hosted.js +74 -0
  287. package/dist/registry/targets/index.d.ts +18 -0
  288. package/dist/registry/targets/index.d.ts.map +1 -0
  289. package/dist/registry/targets/index.js +17 -0
  290. package/dist/registry/targets/module-target.d.ts +68 -0
  291. package/dist/registry/targets/module-target.d.ts.map +1 -0
  292. package/dist/registry/targets/module-target.js +63 -0
  293. package/dist/registry/targets/nexus.d.ts +43 -0
  294. package/dist/registry/targets/nexus.d.ts.map +1 -0
  295. package/dist/registry/targets/nexus.js +250 -0
  296. package/dist/registry/targets/zip.d.ts +55 -0
  297. package/dist/registry/targets/zip.d.ts.map +1 -0
  298. package/dist/registry/targets/zip.js +278 -0
  299. package/dist/registry/writer.d.ts +101 -0
  300. package/dist/registry/writer.d.ts.map +1 -0
  301. package/dist/registry/writer.js +109 -0
  302. package/dist/report.d.ts +15 -6
  303. package/dist/report.d.ts.map +1 -1
  304. package/dist/report.js +28 -55
  305. package/dist/rules/record-store.ts +122 -0
  306. package/dist/rules/tf001.ts +2 -2
  307. package/dist/rules/tf024.ts +105 -22
  308. package/dist/rules/tf046.ts +204 -0
  309. package/dist/rules/tf047.ts +114 -0
  310. package/dist/skills/chant-terraform.md +1 -1
  311. package/dist/state/azure-blob.d.ts +9 -0
  312. package/dist/state/azure-blob.d.ts.map +1 -0
  313. package/dist/state/azure-blob.js +8 -0
  314. package/dist/state/backend.d.ts +158 -0
  315. package/dist/state/backend.d.ts.map +1 -0
  316. package/dist/state/backend.js +406 -0
  317. package/dist/state/exec.d.ts +39 -0
  318. package/dist/state/exec.d.ts.map +1 -0
  319. package/dist/state/exec.js +80 -0
  320. package/dist/state/gcs.d.ts +8 -0
  321. package/dist/state/gcs.d.ts.map +1 -0
  322. package/dist/state/gcs.js +7 -0
  323. package/dist/state/index.d.ts +15 -0
  324. package/dist/state/index.d.ts.map +1 -0
  325. package/dist/state/index.js +14 -0
  326. package/dist/state/locks.d.ts +105 -0
  327. package/dist/state/locks.d.ts.map +1 -0
  328. package/dist/state/locks.js +130 -0
  329. package/dist/state/object-store.d.ts +8 -0
  330. package/dist/state/object-store.d.ts.map +1 -0
  331. package/dist/state/object-store.js +7 -0
  332. package/dist/state/root-states.d.ts +131 -0
  333. package/dist/state/root-states.d.ts.map +1 -0
  334. package/dist/state/root-states.js +241 -0
  335. package/dist/state/s3.d.ts +21 -0
  336. package/dist/state/s3.d.ts.map +1 -0
  337. package/dist/state/s3.js +19 -0
  338. package/dist/state/store.d.ts +51 -0
  339. package/dist/state/store.d.ts.map +1 -0
  340. package/dist/state/store.js +185 -0
  341. package/dist/state-ops.d.ts +255 -0
  342. package/dist/state-ops.d.ts.map +1 -0
  343. package/dist/state-ops.js +305 -0
  344. package/dist/state-reads.d.ts +57 -0
  345. package/dist/state-reads.d.ts.map +1 -0
  346. package/dist/state-reads.js +104 -0
  347. package/dist/terragrunt/affected.d.ts.map +1 -1
  348. package/dist/terragrunt/affected.js +2 -1
  349. package/dist/used-sources.d.ts +54 -0
  350. package/dist/used-sources.d.ts.map +1 -0
  351. package/dist/used-sources.js +157 -0
  352. package/package.json +24 -4
  353. package/src/__fixtures__/ACCEPTANCE.md +69 -7
  354. package/src/__fixtures__/compose/apply-failed-in-app.jsonl +12 -0
  355. package/src/__fixtures__/compose/state-app.json +66 -0
  356. package/src/__fixtures__/compose/state-edge.json +40 -0
  357. package/src/__fixtures__/compose/state-net.json +58 -0
  358. package/src/__fixtures__/compose/three-app.plan.json +184 -0
  359. package/src/__fixtures__/compose/three-composed.plan.json +509 -0
  360. package/src/__fixtures__/compose/three-edge.plan.json +144 -0
  361. package/src/__fixtures__/compose/three-net.plan.json +174 -0
  362. package/src/__fixtures__/compose/unknown-composed.plan.json +228 -0
  363. package/src/__fixtures__/compose/working-after-apply.json +145 -0
  364. package/src/__fixtures__/config-blocks/app/main.tf +61 -0
  365. package/src/__fixtures__/config-blocks/app/modules/network/main.tf +4 -0
  366. package/src/__fixtures__/config-blocks/app-json/main.tf.json +39 -0
  367. package/src/__fixtures__/config-files/shadow/main.tf +3 -0
  368. package/src/__fixtures__/config-files/shadow/main.tofu +3 -0
  369. package/src/__fixtures__/config-files/shadow/other.tf +3 -0
  370. package/src/__fixtures__/config-files/tf/main.tf +11 -0
  371. package/src/__fixtures__/config-files/tf-json/main.tf.json +18 -0
  372. package/src/__fixtures__/config-files/tofu/main.tofu +11 -0
  373. package/src/__fixtures__/config-files/tofu-json/main.tofu.json +18 -0
  374. package/src/__fixtures__/config-files/tofu-only/main.tofu +3 -0
  375. package/src/__fixtures__/drift-record/README.md +16 -0
  376. package/src/__fixtures__/drift-record/live-plan-sections.json +27 -0
  377. package/src/__fixtures__/drift-rows/live-root-plan.json +70 -0
  378. package/src/__fixtures__/drift-rows/refresh-plan.json +61 -0
  379. package/src/__fixtures__/instance-forms/app/main.tf +110 -0
  380. package/src/__fixtures__/instance-forms/app/modules/svc/main.tf +3 -0
  381. package/src/__fixtures__/instance-vars/app/main.tf +52 -0
  382. package/src/__fixtures__/instance-vars/app/modules/app/main.tf +12 -0
  383. package/src/__fixtures__/instance-vars/app/modules/edge/main.tf +3 -0
  384. package/src/__fixtures__/instance-vars/app/terraform.tfvars +1 -0
  385. package/src/__fixtures__/live-module-keyed/live-graph.json +259 -0
  386. package/src/__fixtures__/live-module-keyed/live-plan.json +87 -0
  387. package/src/__fixtures__/live-module-keyed/root/estate.chdf.hcl +1 -0
  388. package/src/__fixtures__/live-module-keyed/root/main.tf +21 -0
  389. package/src/__fixtures__/live-module-keyed/root/modules/app/main.tf +17 -0
  390. package/src/__fixtures__/live-module-keyed/root/modules/edge/main.tf +7 -0
  391. package/src/__fixtures__/live-module-keyed/root/versions.tf +30 -0
  392. package/src/__fixtures__/live-module-keyed/show-state.json +146 -0
  393. package/src/__fixtures__/pr-loop/README.md +50 -0
  394. package/src/__fixtures__/pr-loop/chant.config.json +13 -0
  395. package/src/__fixtures__/pr-loop/estate.component.ts +10 -0
  396. package/src/__fixtures__/pr-loop/roots/a/main.tf +11 -0
  397. package/src/__fixtures__/pr-loop/roots/app/main.tf +19 -0
  398. package/src/__fixtures__/pr-loop/roots/b/main.tf +7 -0
  399. package/src/__fixtures__/pr-loop/roots/dns/main.tf +3 -0
  400. package/src/__fixtures__/pr-loop/roots/net/main.tf +7 -0
  401. package/src/__fixtures__/report/applied.show.json +51 -0
  402. package/src/__fixtures__/report/generate.ts +63 -0
  403. package/src/__fixtures__/report/plan.show.json +200 -0
  404. package/src/__fixtures__/report/tf-apply/change-set.json +170 -0
  405. package/src/__fixtures__/report/tf-apply/report.json +338 -0
  406. package/src/__fixtures__/report/tf-plan/change-set.json +170 -0
  407. package/src/__fixtures__/report/tf-plan/report.json +320 -0
  408. package/src/__fixtures__/three-cloud-azure.graph.json +290 -0
  409. package/src/__fixtures__/used-sources/root/extra.tofu +1 -0
  410. package/src/__fixtures__/used-sources/root/main.tf +31 -0
  411. package/src/__fixtures__/used-sources/root/modules/net/main.tf +14 -0
  412. package/src/__fixtures__/used-sources/root/modules/net/versions.tf.json +7 -0
  413. package/src/__fixtures__/used-sources/unit/terragrunt.hcl +3 -0
  414. package/src/applied-state.ts +52 -0
  415. package/src/backend-config.test.ts +105 -0
  416. package/src/backend-config.ts +133 -0
  417. package/src/behaviour/kinds.ts +4 -0
  418. package/src/behaviour/predict.ts +5 -2
  419. package/src/behaviour/reference-catalog.plugin.test.ts +65 -0
  420. package/src/behaviour/reference-catalog.ts +16 -5
  421. package/src/behaviour/request.ts +3 -2
  422. package/src/change-set-instances.test.ts +98 -0
  423. package/src/changed-roots.ts +14 -16
  424. package/src/ci-setup.ts +42 -0
  425. package/src/commands.ts +4 -3
  426. package/src/components/capability-plugin.test.ts +198 -19
  427. package/src/components/capability-plugin.ts +383 -35
  428. package/src/components/change-set-graph.e2e.test.ts +11 -5
  429. package/src/components/compose-group.test.ts +486 -0
  430. package/src/components/compose-group.ts +489 -0
  431. package/src/components/demo-composed-roots.e2e.test.ts +440 -0
  432. package/src/components/member-outputs.test.ts +76 -0
  433. package/src/components/placeholder-preview.test.ts +147 -0
  434. package/src/components/placeholder-preview.ts +257 -0
  435. package/src/components/pr-loop-compose.tofu.e2e.test.ts +363 -0
  436. package/src/components/pr-loop.tofu.test.ts +113 -57
  437. package/src/components/release-inputs.ts +69 -0
  438. package/src/components/trace-facts.test.ts +21 -0
  439. package/src/components/trace-facts.ts +27 -0
  440. package/src/compose/apply-events.test.ts +62 -0
  441. package/src/compose/apply-events.ts +100 -0
  442. package/src/compose/estate.choudoufu.e2e.test.ts +112 -0
  443. package/src/compose/estate.test.ts +421 -0
  444. package/src/compose/estate.ts +443 -0
  445. package/src/compose/hcl.ts +311 -0
  446. package/src/compose/module-address.ts +49 -0
  447. package/src/compose/root.test.ts +416 -0
  448. package/src/compose/root.ts +592 -0
  449. package/src/compose/run.test.ts +440 -0
  450. package/src/compose/run.tofu.test.ts +176 -0
  451. package/src/compose/run.ts +527 -0
  452. package/src/compose/slice.test.ts +184 -0
  453. package/src/compose/slice.ts +290 -0
  454. package/src/compose/state-address.ts +157 -0
  455. package/src/compose/state-merge.test.ts +131 -0
  456. package/src/compose/state-merge.ts +148 -0
  457. package/src/compose.test.ts +248 -0
  458. package/src/compose.ts +627 -0
  459. package/src/composites/terraform-apply-op.test.ts +9 -0
  460. package/src/composites/terraform-apply-op.ts +7 -3
  461. package/src/cone.ts +138 -0
  462. package/src/config-file-listers.test.ts +265 -0
  463. package/src/config.ts +44 -9
  464. package/src/cost-hold.ts +29 -0
  465. package/src/describe-resources.engine-facts.test.ts +411 -0
  466. package/src/describe-resources.live-module-keyed.test.ts +290 -0
  467. package/src/describe-resources.ts +416 -70
  468. package/src/drift-read.ts +284 -0
  469. package/src/drift-record.test.ts +223 -0
  470. package/src/drift-record.ts +455 -0
  471. package/src/drift-rows.test.ts +135 -0
  472. package/src/drift-rows.ts +137 -0
  473. package/src/exit-codes.test.ts +23 -0
  474. package/src/exit-codes.ts +59 -0
  475. package/src/hcl/config-blocks.test.ts +174 -0
  476. package/src/hcl/edges.ts +21 -1
  477. package/src/hcl/files.ts +234 -0
  478. package/src/hcl/instance-forms.test.ts +94 -0
  479. package/src/hcl/instances.test.ts +137 -0
  480. package/src/hcl/instances.ts +422 -0
  481. package/src/hcl/parse.test.ts +139 -1
  482. package/src/hcl/parse.ts +149 -16
  483. package/src/hcl/roots.ts +6 -0
  484. package/src/hcl/suppressions.ts +8 -2
  485. package/src/index.ts +79 -0
  486. package/src/lint/audit-catalog.ts +29 -3
  487. package/src/lint/audit-lineage.ts +14 -2
  488. package/src/lint/post-synth/fixtures/TF024/live-with-record-store/main.tf +18 -0
  489. package/src/lint/post-synth/fixtures/TF024/sidecar-with-backend/estate.chdf.hcl +1 -0
  490. package/src/lint/post-synth/fixtures/TF024/sidecar-with-backend/main.tf +10 -0
  491. package/src/lint/post-synth/fixtures/TF046/azurerm-no-resource-group/main.tf +15 -0
  492. package/src/lint/post-synth/fixtures/TF046/backend-config-only/main.tf +14 -0
  493. package/src/lint/post-synth/fixtures/TF046/derived-s3/backend.tf +7 -0
  494. package/src/lint/post-synth/fixtures/TF046/derived-s3/main.tf +9 -0
  495. package/src/lint/post-synth/fixtures/TF046/explicit-local/main.tf +16 -0
  496. package/src/lint/post-synth/fixtures/TF046/explicit-s3-beside-local-backend/main.tf +15 -0
  497. package/src/lint/post-synth/fixtures/TF046/implied-local/main.tf +9 -0
  498. package/src/lint/post-synth/fixtures/TF046/sidecar-implied/estate.chdf.hcl +1 -0
  499. package/src/lint/post-synth/fixtures/TF046/sidecar-implied/main.tf +5 -0
  500. package/src/lint/post-synth/fixtures/TF047/clear/main.tf +12 -0
  501. package/src/lint/post-synth/fixtures/TF047/refused/main.tf +12 -0
  502. package/src/lint/post-synth/fixtures/TF047/unknown-module/main.tf +12 -0
  503. package/src/lint/post-synth/fixtures/TF047/unknown-version/main.tf +12 -0
  504. package/src/lint/post-synth/index.ts +4 -0
  505. package/src/lint/post-synth/record-store.ts +122 -0
  506. package/src/lint/post-synth/tf001.ts +2 -2
  507. package/src/lint/post-synth/tf024.test.ts +26 -5
  508. package/src/lint/post-synth/tf024.ts +105 -22
  509. package/src/lint/post-synth/tf046.test.ts +137 -0
  510. package/src/lint/post-synth/tf046.ts +204 -0
  511. package/src/lint/post-synth/tf047.test.ts +56 -0
  512. package/src/lint/post-synth/tf047.ts +114 -0
  513. package/src/live-plan-reasons.ts +54 -0
  514. package/src/lock-rows.test.ts +70 -0
  515. package/src/lock-rows.ts +82 -0
  516. package/src/lock-timeout.ts +34 -0
  517. package/src/lsp/completions.test.ts +1 -1
  518. package/src/lsp/option-keys.ts +2 -0
  519. package/src/module-catalog/index.test.ts +93 -0
  520. package/src/module-catalog/index.ts +159 -0
  521. package/src/module-catalog/refresh-cli.ts +68 -0
  522. package/src/module-catalog/static-tier.ts +1659 -0
  523. package/src/module-catalog/types.ts +88 -0
  524. package/src/op/activities/choudoufu-plan-set-op.test.ts +111 -0
  525. package/src/op/activities/index.ts +9 -0
  526. package/src/op/activities/live-detect.ts +55 -26
  527. package/src/op/activities/pin-rollout.ts +3 -0
  528. package/src/op/activities/registry.test.ts +2 -1
  529. package/src/op/activities/terraform.test.ts +55 -0
  530. package/src/op/activities/terraform.ts +312 -27
  531. package/src/op/activity-contracts.test.ts +1 -0
  532. package/src/op/activity-contracts.ts +24 -1
  533. package/src/op/builders.ts +14 -0
  534. package/src/op-wave-step.test.ts +109 -0
  535. package/src/pin/__fixtures__/consumers/live/dev/main.tf +4 -0
  536. package/src/pin/__fixtures__/consumers/live/prod/main.tf +21 -0
  537. package/src/pin/__fixtures__/consumers/units/vpc/terragrunt.hcl +7 -0
  538. package/src/pin/bundle.test.ts +2 -0
  539. package/src/pin/consumers.test.ts +57 -0
  540. package/src/pin/consumers.ts +95 -0
  541. package/src/pin/edit.ts +30 -0
  542. package/src/pin/rollout.ts +16 -11
  543. package/src/plan-shape.test.ts +148 -0
  544. package/src/plan-shape.ts +128 -0
  545. package/src/plugin.ts +39 -19
  546. package/src/registry/__fixtures__/docs/documented/.terraform-docs.yml +3 -0
  547. package/src/registry/__fixtures__/docs/documented/README.md +1 -0
  548. package/src/registry/__fixtures__/docs/documented/main.tf +8 -0
  549. package/src/registry/__fixtures__/docs/json/main.tf.json +14 -0
  550. package/src/registry/__fixtures__/docs/vpc/README.md +3 -0
  551. package/src/registry/__fixtures__/docs/vpc/examples/complete/main.tf +5 -0
  552. package/src/registry/__fixtures__/docs/vpc/examples/simple/README.md +1 -0
  553. package/src/registry/__fixtures__/docs/vpc/examples/simple/main.tf +4 -0
  554. package/src/registry/__fixtures__/docs/vpc/main.tf +14 -0
  555. package/src/registry/__fixtures__/docs/vpc/outputs.tf +9 -0
  556. package/src/registry/__fixtures__/docs/vpc/variables.tf +16 -0
  557. package/src/registry/__fixtures__/proxied-root/main.tf +12 -0
  558. package/src/registry/address.ts +100 -0
  559. package/src/registry/catalog-read.ts +56 -0
  560. package/src/registry/deprecated.test.ts +139 -0
  561. package/src/registry/deprecated.ts +76 -0
  562. package/src/registry/docs.test.ts +140 -0
  563. package/src/registry/docs.ts +299 -0
  564. package/src/registry/edge/bundle.test.ts +50 -0
  565. package/src/registry/edge/edge.test.ts +176 -0
  566. package/src/registry/edge/edge.ts +211 -0
  567. package/src/registry/edge/index.ts +10 -0
  568. package/src/registry/edge/lambda-edge.ts +127 -0
  569. package/src/registry/edge/sigv4-web.ts +79 -0
  570. package/src/registry/edge/token-source.test.ts +258 -0
  571. package/src/registry/edge/token-source.ts +169 -0
  572. package/src/registry/edge/worker.ts +61 -0
  573. package/src/registry/handler.ts +89 -0
  574. package/src/registry/headers-file.ts +61 -0
  575. package/src/registry/index.ts +31 -0
  576. package/src/registry/mirror-paths.ts +10 -0
  577. package/src/registry/mirror.test.ts +198 -0
  578. package/src/registry/mirror.ts +395 -0
  579. package/src/registry/proxies.test.ts +153 -0
  580. package/src/registry/proxies.ts +132 -0
  581. package/src/registry/reader.ts +225 -0
  582. package/src/registry/registry.test.ts +262 -0
  583. package/src/registry/semver.ts +34 -0
  584. package/src/registry/serve.ts +82 -0
  585. package/src/registry/source-forms.test.ts +87 -0
  586. package/src/registry/source-forms.ts +216 -0
  587. package/src/registry/targets/artifactory.test.ts +248 -0
  588. package/src/registry/targets/artifactory.ts +257 -0
  589. package/src/registry/targets/fake-artifactory.ts +158 -0
  590. package/src/registry/targets/fake-gitlab.ts +161 -0
  591. package/src/registry/targets/fake-hcp.ts +233 -0
  592. package/src/registry/targets/fake-http.ts +97 -0
  593. package/src/registry/targets/fake-nexus.ts +152 -0
  594. package/src/registry/targets/gitlab.test.ts +208 -0
  595. package/src/registry/targets/gitlab.ts +223 -0
  596. package/src/registry/targets/hcp.test.ts +230 -0
  597. package/src/registry/targets/hcp.ts +360 -0
  598. package/src/registry/targets/hosted.ts +117 -0
  599. package/src/registry/targets/index.ts +17 -0
  600. package/src/registry/targets/module-target.ts +131 -0
  601. package/src/registry/targets/nexus.test.ts +220 -0
  602. package/src/registry/targets/nexus.ts +314 -0
  603. package/src/registry/targets/zip.test.ts +65 -0
  604. package/src/registry/targets/zip.ts +287 -0
  605. package/src/registry/writer.ts +155 -0
  606. package/src/report.test.ts +82 -1
  607. package/src/report.ts +31 -54
  608. package/src/signal-only-root.test.ts +72 -0
  609. package/src/skills/chant-terraform.md +1 -1
  610. package/src/state/azure-blob.ts +8 -0
  611. package/src/state/backend-verdict.test.ts +187 -0
  612. package/src/state/backend.test.ts +127 -0
  613. package/src/state/backend.ts +488 -0
  614. package/src/state/exec.ts +111 -0
  615. package/src/state/gcs.ts +7 -0
  616. package/src/state/index.ts +15 -0
  617. package/src/state/locks.test.ts +84 -0
  618. package/src/state/locks.ts +201 -0
  619. package/src/state/object-store.ts +7 -0
  620. package/src/state/root-states-floci.e2e.test.ts +66 -0
  621. package/src/state/root-states.test.ts +462 -0
  622. package/src/state/root-states.ts +309 -0
  623. package/src/state/s3.ts +21 -0
  624. package/src/state/store.ts +225 -0
  625. package/src/state-ops.test.ts +182 -0
  626. package/src/state-ops.ts +462 -0
  627. package/src/state-reads.ts +116 -0
  628. package/src/terragrunt/affected.ts +2 -1
  629. package/src/used-sources.test.ts +75 -0
  630. package/src/used-sources.ts +204 -0
  631. package/src/workspace-kinds.test.ts +4 -17
  632. package/workspace-kinds.json +1 -24
  633. package/dist/workspace-member.d.ts +0 -30
  634. package/dist/workspace-member.d.ts.map +0 -1
  635. package/dist/workspace-member.js +0 -91
  636. package/schemas/pulumi.schema.json +0 -34
  637. package/src/testdata/pulumi-member/Pulumi.yaml +0 -2
  638. package/src/testdata/pulumi-member/stack-export.json +0 -53
  639. package/src/testdata/pulumi-unexported/Pulumi.yaml +0 -2
  640. package/src/workspace-member.test.ts +0 -89
  641. package/src/workspace-member.ts +0 -126
@@ -0,0 +1,278 @@
1
+ /**
2
+ * The zip of an attested module archive (chant#4605, terragucci#1299 ruling
3
+ * A). Artifactory takes a module only as a zip and Nexus recommends one, so
4
+ * their targets upload the same files the bucket registry's `.tar.gz`
5
+ * carries, at the same paths with the same modes, repacked as a zip. Nothing
6
+ * is added to or dropped from the module.
7
+ *
8
+ * The repack is deterministic: entries keep the tarball's order and mtimes,
9
+ * so one archive always gives the same zip bytes. The zip's archive comment
10
+ * carries the attested content digest and the revision
11
+ * (`chant-module content=sha256:<hex> revision=<sha>`), which is how a
12
+ * target's `held` tells, from the zip a host gives back, which attested
13
+ * archive it was made from. A zip with no such comment (one uploaded by
14
+ * hand) is judged by its own digest, so it never passes for the release's.
15
+ *
16
+ * No zip64: an archive past 4 GiB or 65535 entries is refused, far above
17
+ * either host's limit (Nexus takes 100 MB per module).
18
+ */
19
+ import { deflateRawSync, gunzipSync, inflateRawSync } from "node:zlib";
20
+ import { PublishTargetError } from "@intentius/chant/lifecycle/release-publish";
21
+ const field = (b, at, len) => {
22
+ const raw = b.subarray(at, at + len);
23
+ const end = raw.indexOf(0);
24
+ return raw.subarray(0, end < 0 ? raw.length : end).toString("utf-8");
25
+ };
26
+ const octal = (b, at, len) => parseInt(field(b, at, len).trim() || "0", 8);
27
+ function paxRecords(data) {
28
+ const out = {};
29
+ let at = 0;
30
+ while (at < data.length) {
31
+ const space = data.indexOf(0x20, at);
32
+ if (space < 0)
33
+ break;
34
+ const len = parseInt(data.subarray(at, space).toString("utf-8"), 10);
35
+ if (!Number.isFinite(len) || len <= 0)
36
+ break;
37
+ const record = data.subarray(space + 1, at + len - 1).toString("utf-8");
38
+ const eq = record.indexOf("=");
39
+ if (eq > 0)
40
+ out[record.slice(0, eq)] = record.slice(eq + 1);
41
+ at += len;
42
+ }
43
+ return out;
44
+ }
45
+ const invalid = (message) => new PublishTargetError("publish-archive-invalid", message, "Publish the .tar.gz the bucket registry serves, with the module's files at its root.");
46
+ /**
47
+ * The entries of a module's gzip tarball (ustar, pax and GNU long names), with
48
+ * `./` cut from each path. A link or a device in the archive is refused: a
49
+ * zip of the module could not carry it as the tarball does.
50
+ */
51
+ export function moduleArchiveEntries(archive) {
52
+ let tar;
53
+ try {
54
+ tar = gunzipSync(archive);
55
+ }
56
+ catch {
57
+ throw invalid("the module archive is not a gzip tarball");
58
+ }
59
+ const out = [];
60
+ let at = 0;
61
+ let pax = {};
62
+ let longName;
63
+ while (at + 512 <= tar.length) {
64
+ const header = tar.subarray(at, at + 512);
65
+ if (header.every((b) => b === 0))
66
+ break;
67
+ const size = octal(header, 124, 12);
68
+ const flag = String.fromCharCode(header[156] || 0x30);
69
+ const data = tar.subarray(at + 512, at + 512 + size);
70
+ at += 512 + Math.ceil(size / 512) * 512;
71
+ if (flag === "x") {
72
+ pax = paxRecords(data);
73
+ continue;
74
+ }
75
+ if (flag === "L") {
76
+ longName = field(data, 0, data.length);
77
+ continue;
78
+ }
79
+ if (flag === "g")
80
+ continue;
81
+ const prefix = field(header, 345, 155);
82
+ const raw = pax.path ?? longName ?? (prefix ? `${prefix}/${field(header, 0, 100)}` : field(header, 0, 100));
83
+ const mtime = pax.mtime ? Math.floor(Number(pax.mtime)) : octal(header, 136, 12);
84
+ pax = {};
85
+ longName = undefined;
86
+ const path = raw.replace(/^(\.\/)+/, "").replace(/\/+$/, "");
87
+ if (!path || path === ".")
88
+ continue;
89
+ if (path.startsWith("/") || path.split("/").includes(".."))
90
+ throw invalid(`the module archive holds ${raw}, outside its root`);
91
+ const type = flag === "0" || flag === "\0" || flag === "7" ? "file" : flag === "5" ? "dir" : undefined;
92
+ if (!type)
93
+ throw invalid(`the module archive holds ${path}, which is not a regular file or a directory; a zip of the module cannot carry it`);
94
+ out.push({ path, type, mode: octal(header, 100, 8) & 0o7777, mtime, data: type === "file" ? Buffer.from(data) : Buffer.alloc(0) });
95
+ }
96
+ return out;
97
+ }
98
+ const CRC_TABLE = (() => {
99
+ const t = new Uint32Array(256);
100
+ for (let n = 0; n < 256; n++) {
101
+ let c = n;
102
+ for (let k = 0; k < 8; k++)
103
+ c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
104
+ t[n] = c >>> 0;
105
+ }
106
+ return t;
107
+ })();
108
+ /** The CRC-32 a zip entry carries. */
109
+ export function crc32(data) {
110
+ let c = 0xffffffff;
111
+ for (let i = 0; i < data.length; i++)
112
+ c = CRC_TABLE[(c ^ data[i]) & 0xff] ^ (c >>> 8);
113
+ return (c ^ 0xffffffff) >>> 0;
114
+ }
115
+ /** MS-DOS date and time, as a zip entry keeps them, in UTC and clamped to 1980. */
116
+ function dosTime(seconds) {
117
+ const d = new Date(Math.max(seconds * 1000, Date.UTC(1980, 0, 1)));
118
+ return {
119
+ time: (d.getUTCHours() << 11) | (d.getUTCMinutes() << 5) | Math.floor(d.getUTCSeconds() / 2),
120
+ date: ((d.getUTCFullYear() - 1980) << 9) | ((d.getUTCMonth() + 1) << 5) | d.getUTCDate(),
121
+ };
122
+ }
123
+ /** The archive comment that names the attested archive a zip was made from. */
124
+ export const ZIP_COMMENT_PREFIX = "chant-module";
125
+ export const moduleZipComment = (content, revision) => `${ZIP_COMMENT_PREFIX} content=${content}${revision ? ` revision=${revision}` : ""}`;
126
+ /** The content and revision a zip's archive comment names, when it is one {@link moduleZipComment} wrote. */
127
+ export function readModuleZipComment(comment) {
128
+ if (!comment.startsWith(`${ZIP_COMMENT_PREFIX} `))
129
+ return undefined;
130
+ const content = /(?:^| )content=(sha256:[0-9a-f]{64})(?: |$)/.exec(comment)?.[1];
131
+ if (!content)
132
+ return undefined;
133
+ const revision = /(?:^| )revision=([^ ]+)(?: |$)/.exec(comment)?.[1];
134
+ return { content, ...(revision ? { revision } : {}) };
135
+ }
136
+ /** A zip of the given entries, with `comment` as its archive comment. Files are deflated. */
137
+ export function zipOf(entries, comment = "") {
138
+ if (entries.length > 0xffff)
139
+ throw invalid(`the module archive holds ${entries.length} entries; a zip without zip64 holds 65535`);
140
+ const locals = [];
141
+ const centrals = [];
142
+ let offset = 0;
143
+ for (const e of entries) {
144
+ const name = Buffer.from(e.type === "dir" ? `${e.path}/` : e.path, "utf-8");
145
+ const data = e.type === "file" ? e.data : Buffer.alloc(0);
146
+ const packed = e.type === "file" ? deflateRawSync(data, { level: 9 }) : Buffer.alloc(0);
147
+ const method = e.type === "file" ? 8 : 0;
148
+ const crc = crc32(data);
149
+ const { time, date } = dosTime(e.mtime);
150
+ if (packed.length > 0xfffffffe || data.length > 0xfffffffe || offset > 0xfffffffe)
151
+ throw invalid("the module archive is past 4 GiB; a zip without zip64 holds less");
152
+ const local = Buffer.alloc(30);
153
+ local.writeUInt32LE(0x04034b50, 0);
154
+ local.writeUInt16LE(20, 4);
155
+ local.writeUInt16LE(0x0800, 6);
156
+ local.writeUInt16LE(method, 8);
157
+ local.writeUInt16LE(time, 10);
158
+ local.writeUInt16LE(date, 12);
159
+ local.writeUInt32LE(crc, 14);
160
+ local.writeUInt32LE(packed.length, 18);
161
+ local.writeUInt32LE(data.length, 22);
162
+ local.writeUInt16LE(name.length, 26);
163
+ local.writeUInt16LE(0, 28);
164
+ locals.push(local, name, packed);
165
+ const unixMode = (e.type === "dir" ? 0o040000 : 0o100000) | (e.mode & 0o7777 || (e.type === "dir" ? 0o755 : 0o644));
166
+ const central = Buffer.alloc(46);
167
+ central.writeUInt32LE(0x02014b50, 0);
168
+ central.writeUInt16LE((3 << 8) | 20, 4);
169
+ central.writeUInt16LE(20, 6);
170
+ central.writeUInt16LE(0x0800, 8);
171
+ central.writeUInt16LE(method, 10);
172
+ central.writeUInt16LE(time, 12);
173
+ central.writeUInt16LE(date, 14);
174
+ central.writeUInt32LE(crc, 16);
175
+ central.writeUInt32LE(packed.length, 20);
176
+ central.writeUInt32LE(data.length, 24);
177
+ central.writeUInt16LE(name.length, 28);
178
+ central.writeUInt16LE(0, 30);
179
+ central.writeUInt16LE(0, 32);
180
+ central.writeUInt16LE(0, 34);
181
+ central.writeUInt16LE(0, 36);
182
+ central.writeUInt32LE(((unixMode << 16) | (e.type === "dir" ? 0x10 : 0)) >>> 0, 38);
183
+ central.writeUInt32LE(offset, 42);
184
+ centrals.push(central, name);
185
+ offset += local.length + name.length + packed.length;
186
+ }
187
+ const cd = Buffer.concat(centrals);
188
+ const note = Buffer.from(comment, "utf-8");
189
+ if (note.length > 0xffff)
190
+ throw invalid("the zip comment is longer than a zip carries");
191
+ const end = Buffer.alloc(22);
192
+ end.writeUInt32LE(0x06054b50, 0);
193
+ end.writeUInt16LE(0, 4);
194
+ end.writeUInt16LE(0, 6);
195
+ end.writeUInt16LE(entries.length, 8);
196
+ end.writeUInt16LE(entries.length, 10);
197
+ end.writeUInt32LE(cd.length, 12);
198
+ end.writeUInt32LE(offset, 16);
199
+ end.writeUInt16LE(note.length, 20);
200
+ return Buffer.concat([...locals, cd, end, note]);
201
+ }
202
+ /**
203
+ * The zip a hosted target uploads for an attested archive: its entries,
204
+ * repacked, with the content digest and revision in the archive comment.
205
+ */
206
+ export function moduleZip(archive, content, revision) {
207
+ return zipOf(moduleArchiveEntries(archive), moduleZipComment(content, revision));
208
+ }
209
+ /** Reads a zip's central directory and entries. Throws on bytes that are not a zip. */
210
+ export function readZip(bytes) {
211
+ const b = Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
212
+ let end = -1;
213
+ for (let i = b.length - 22; i >= Math.max(0, b.length - 22 - 0xffff); i--) {
214
+ if (b.readUInt32LE(i) === 0x06054b50) {
215
+ end = i;
216
+ break;
217
+ }
218
+ }
219
+ if (end < 0)
220
+ throw new Error("not a zip archive: no end of central directory");
221
+ const count = b.readUInt16LE(end + 10);
222
+ const cdOffset = b.readUInt32LE(end + 16);
223
+ const comment = b.subarray(end + 22, end + 22 + b.readUInt16LE(end + 20)).toString("utf-8");
224
+ const entries = [];
225
+ let at = cdOffset;
226
+ for (let n = 0; n < count; n++) {
227
+ if (b.readUInt32LE(at) !== 0x02014b50)
228
+ throw new Error("not a zip archive: a bad central directory entry");
229
+ const method = b.readUInt16LE(at + 10);
230
+ const csize = b.readUInt32LE(at + 20);
231
+ const nameLen = b.readUInt16LE(at + 28);
232
+ const extraLen = b.readUInt16LE(at + 30);
233
+ const commentLen = b.readUInt16LE(at + 32);
234
+ const external = b.readUInt32LE(at + 38);
235
+ const local = b.readUInt32LE(at + 42);
236
+ const name = b.subarray(at + 46, at + 46 + nameLen).toString("utf-8");
237
+ at += 46 + nameLen + extraLen + commentLen;
238
+ if (b.readUInt32LE(local) !== 0x04034b50)
239
+ throw new Error(`not a zip archive: no local header for ${name}`);
240
+ const start = local + 30 + b.readUInt16LE(local + 26) + b.readUInt16LE(local + 28);
241
+ const packed = b.subarray(start, start + csize);
242
+ const data = method === 0 ? Buffer.from(packed) : method === 8 ? inflateRawSync(packed) : undefined;
243
+ if (!data)
244
+ throw new Error(`${name}: zip method ${method} is not read here`);
245
+ const dir = name.endsWith("/");
246
+ entries.push({ path: dir ? name.slice(0, -1) : name, dir, mode: (external >>> 16) & 0o7777, data });
247
+ }
248
+ return { comment, entries };
249
+ }
250
+ const isGzip = (b) => b.length >= 2 && b[0] === 0x1f && b[1] === 0x8b;
251
+ const isZip = (b) => b.length >= 4 && b[0] === 0x50 && b[1] === 0x4b;
252
+ /**
253
+ * The content a module archive a host gave back carries, as `held` reports
254
+ * it: the attested digest a chant zip's comment names; for a gzip tarball,
255
+ * the digest of its uncompressed bytes, as the bucket registry keeps it; for
256
+ * any other bytes, their own digest.
257
+ */
258
+ export function heldContentOf(bytes, digest) {
259
+ if (isZip(bytes)) {
260
+ try {
261
+ const named = readModuleZipComment(readZip(bytes).comment);
262
+ if (named)
263
+ return named;
264
+ }
265
+ catch {
266
+ // Not a zip after all: judged by its own digest below.
267
+ }
268
+ }
269
+ else if (isGzip(bytes)) {
270
+ try {
271
+ return { content: digest(gunzipSync(bytes)) };
272
+ }
273
+ catch {
274
+ // A broken gzip: judged by its own digest below.
275
+ }
276
+ }
277
+ return { content: digest(bytes) };
278
+ }
@@ -0,0 +1,101 @@
1
+ /**
2
+ * The module registry protocol, written as files a bucket, a directory or a
3
+ * Pages site holds (https://opentofu.org/docs/internals/module-registry-protocol/):
4
+ *
5
+ * .well-known/terraform.json {"modules.v1": "/v1/modules/"}
6
+ * v1/modules/<ns>/<name>/<system>/versions every version, oldest first
7
+ * v1/modules/<ns>/<name>/<system>/<v>/download {"location": ...}
8
+ * v1/modules/<ns>/<name>/<system>/<v>/<name>-<v>.tar.gz a tarball download
9
+ * v1/modules/<ns>/<name>/<system>/<v>/release.json the commit and content digest
10
+ *
11
+ * The download answer the two CLIs need is a 200 with the JSON body and an
12
+ * `X-Terraform-Get` header naming the same location (terragucci#1287).
13
+ * Terraform reads only the header (hashicorp/terraform
14
+ * internal/registry/client.go:237-250 at v1.14.9 and v1.15.8). OpenTofu reads
15
+ * the body's `location` first and the header when it is empty
16
+ * (opentofu/opentofu internal/registry/client.go:205-237 at v1.12.5 and
17
+ * v1.13.1). A stored file carries no header, so the stored `download` file is
18
+ * the body, and whatever serves it (`downloadAnswer`, the loopback handler in
19
+ * ./serve, an edge function) adds the header from that body.
20
+ *
21
+ * The writer takes the store it writes to, so the bucket clients stay with
22
+ * whoever owns them (chant#4554 moves terragucci's into core).
23
+ */
24
+ import { type StoreCondition } from "@intentius/chant/object-store/errors";
25
+ import { type RegistryAddress } from "./address.js";
26
+ import { type Semver } from "./semver.js";
27
+ /** The header Terraform takes a module's location from. */
28
+ export declare const DOWNLOAD_HEADER = "X-Terraform-Get";
29
+ /** The files a registry is written to: a bucket client, a directory, or a test's map. */
30
+ export interface RegistryWriteStore {
31
+ /** Writes one object. With `when`, the write must fail with a conflict when the condition no longer holds. */
32
+ put(key: string, body: string | Buffer, contentType?: string, when?: StoreCondition): Promise<unknown>;
33
+ /** One object's body and version tag, or `{}` when there is none. */
34
+ read(key: string): Promise<{
35
+ body?: string;
36
+ etag?: string;
37
+ }>;
38
+ }
39
+ /** The service discovery document. */
40
+ export declare const discoveryDoc: () => string;
41
+ /** The protocol's versions answer, oldest first, duplicates and non-versions dropped. */
42
+ export declare function versionsDoc(versions: string[]): string;
43
+ /** The versions a versions answer lists, or none when it is missing or not the protocol's JSON. */
44
+ export declare function readVersions(text: string | undefined): string[];
45
+ /** A version's download answer body: the JSON OpenTofu reads. */
46
+ export declare function downloadDoc(location: string): string;
47
+ /** The location a download body names, or undefined when it names none. */
48
+ export declare function downloadLocation(body: string | undefined): string | undefined;
49
+ /** A download answer as a server sends it. */
50
+ export interface DownloadAnswer {
51
+ status: 200;
52
+ headers: Record<string, string>;
53
+ body: string;
54
+ }
55
+ /**
56
+ * The download answer both CLIs install from: status 200, the JSON body with
57
+ * `location`, and `X-Terraform-Get` naming the same location.
58
+ */
59
+ export declare function downloadAnswer(location: string): DownloadAnswer;
60
+ /** The headers a stored download body is served with, or undefined when the body names no location. */
61
+ export declare function downloadHeaders(body: string | undefined): Record<string, string> | undefined;
62
+ /** True for a `.../v1/modules/<ns>/<name>/<system>/<version>/download` path, with or without a leading prefix. */
63
+ export declare const isDownloadPath: (path: string) => boolean;
64
+ /** What the registry keeps beside a version, so the next publish knows what it holds. */
65
+ export interface ReleaseMeta {
66
+ module: string;
67
+ version: string;
68
+ revision: string;
69
+ content: string;
70
+ location: string;
71
+ }
72
+ /** The registry's files for one version, written in this order: the version is listed last, once all it points at is there. */
73
+ export interface VersionFiles {
74
+ tarball?: {
75
+ key: string;
76
+ body: Buffer;
77
+ };
78
+ download: {
79
+ key: string;
80
+ body: string;
81
+ };
82
+ meta: {
83
+ key: string;
84
+ body: string;
85
+ };
86
+ }
87
+ export interface WriteVersionOptions {
88
+ /** The registry's prefix in its store. */
89
+ prefix?: string;
90
+ /**
91
+ * Whether an error from `put` is a lost conditional write, to be retried.
92
+ * By default chant's `StoreConflict`, or any error named `StoreConflict`
93
+ * (a store from another package with a class of its own).
94
+ */
95
+ isConflict?: (e: unknown) => boolean;
96
+ /** Conditional retries on the versions file before the conflict is thrown. Default 3. */
97
+ retries?: number;
98
+ }
99
+ /** Writes one version: discovery when it differs, the tarball, the download answer, release.json, then the versions list. */
100
+ export declare function writeVersion(store: RegistryWriteStore, addr: RegistryAddress, version: Semver, files: VersionFiles, options?: WriteVersionOptions): Promise<void>;
101
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/registry/writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * The module registry protocol, written as files a bucket, a directory or a
3
+ * Pages site holds (https://opentofu.org/docs/internals/module-registry-protocol/):
4
+ *
5
+ * .well-known/terraform.json {"modules.v1": "/v1/modules/"}
6
+ * v1/modules/<ns>/<name>/<system>/versions every version, oldest first
7
+ * v1/modules/<ns>/<name>/<system>/<v>/download {"location": ...}
8
+ * v1/modules/<ns>/<name>/<system>/<v>/<name>-<v>.tar.gz a tarball download
9
+ * v1/modules/<ns>/<name>/<system>/<v>/release.json the commit and content digest
10
+ *
11
+ * The download answer the two CLIs need is a 200 with the JSON body and an
12
+ * `X-Terraform-Get` header naming the same location (terragucci#1287).
13
+ * Terraform reads only the header (hashicorp/terraform
14
+ * internal/registry/client.go:237-250 at v1.14.9 and v1.15.8). OpenTofu reads
15
+ * the body's `location` first and the header when it is empty
16
+ * (opentofu/opentofu internal/registry/client.go:205-237 at v1.12.5 and
17
+ * v1.13.1). A stored file carries no header, so the stored `download` file is
18
+ * the body, and whatever serves it (`downloadAnswer`, the loopback handler in
19
+ * ./serve, an edge function) adds the header from that body.
20
+ *
21
+ * The writer takes the store it writes to, so the bucket clients stay with
22
+ * whoever owns them (chant#4554 moves terragucci's into core).
23
+ */
24
+ // The errors module alone, never the object-store index: its clients import Node built-ins, and the
25
+ // edge function (./edge) reaches this file for the download answer (chant#4589).
26
+ import { isStoreConflict } from "@intentius/chant/object-store/errors";
27
+ import { DISCOVERY, MODULES_V1, keyFor } from "./address.js";
28
+ import { compareSemver, formatSemver, parseSemver } from "./semver.js";
29
+ /** The header Terraform takes a module's location from. */
30
+ export const DOWNLOAD_HEADER = "X-Terraform-Get";
31
+ /** The service discovery document. */
32
+ export const discoveryDoc = () => `${JSON.stringify({ "modules.v1": MODULES_V1 })}\n`;
33
+ /** The protocol's versions answer, oldest first, duplicates and non-versions dropped. */
34
+ export function versionsDoc(versions) {
35
+ // Dedupe after formatting, so "v1.0.0" and "1.0.0" are one version.
36
+ const parsed = versions.map((v) => parseSemver(v)).filter((v) => !!v);
37
+ const sorted = [...new Set(parsed.sort(compareSemver).map(formatSemver))];
38
+ return `${JSON.stringify({ modules: [{ versions: sorted.map((version) => ({ version })) }] }, null, 2)}\n`;
39
+ }
40
+ /** The versions a versions answer lists, or none when it is missing or not the protocol's JSON. */
41
+ export function readVersions(text) {
42
+ if (!text)
43
+ return [];
44
+ try {
45
+ const doc = JSON.parse(text);
46
+ return (doc.modules?.[0]?.versions ?? []).map((v) => v.version).filter((v) => typeof v === "string");
47
+ }
48
+ catch {
49
+ return [];
50
+ }
51
+ }
52
+ /** A version's download answer body: the JSON OpenTofu reads. */
53
+ export function downloadDoc(location) {
54
+ return `${JSON.stringify({ location })}\n`;
55
+ }
56
+ /** The location a download body names, or undefined when it names none. */
57
+ export function downloadLocation(body) {
58
+ if (!body)
59
+ return undefined;
60
+ try {
61
+ const location = JSON.parse(body).location;
62
+ return typeof location === "string" && location ? location : undefined;
63
+ }
64
+ catch {
65
+ return undefined;
66
+ }
67
+ }
68
+ /**
69
+ * The download answer both CLIs install from: status 200, the JSON body with
70
+ * `location`, and `X-Terraform-Get` naming the same location.
71
+ */
72
+ export function downloadAnswer(location) {
73
+ return { status: 200, headers: { "content-type": "application/json", [DOWNLOAD_HEADER]: location }, body: downloadDoc(location) };
74
+ }
75
+ /** The headers a stored download body is served with, or undefined when the body names no location. */
76
+ export function downloadHeaders(body) {
77
+ const location = downloadLocation(body);
78
+ return location ? downloadAnswer(location).headers : undefined;
79
+ }
80
+ /** True for a `.../v1/modules/<ns>/<name>/<system>/<version>/download` path, with or without a leading prefix. */
81
+ export const isDownloadPath = (path) => /(^|\/)v1\/modules\/[^/]+\/[^/]+\/[^/]+\/[^/]+\/download$/.test(path.split("?")[0]);
82
+ /** Writes one version: discovery when it differs, the tarball, the download answer, release.json, then the versions list. */
83
+ export async function writeVersion(store, addr, version, files, options = {}) {
84
+ const discovery = discoveryDoc();
85
+ const discoKey = keyFor(options.prefix, DISCOVERY);
86
+ const disco = await store.read(discoKey);
87
+ if (disco.body !== discovery)
88
+ await store.put(discoKey, discovery, "application/json");
89
+ if (files.tarball)
90
+ await store.put(files.tarball.key, files.tarball.body, "application/gzip");
91
+ await store.put(files.download.key, files.download.body, "application/json");
92
+ await store.put(files.meta.key, files.meta.body, "application/json");
93
+ const key = keyFor(options.prefix, `${addr.path}/versions`);
94
+ const isConflict = options.isConflict ?? isStoreConflict;
95
+ const retries = options.retries ?? 3;
96
+ // Read, add, write only over the copy read: two publishes at once cannot drop each other's version.
97
+ for (let attempt = 0;; attempt++) {
98
+ const held = await store.read(key);
99
+ const when = held.body === undefined ? { ifNoneMatch: "*" } : held.etag ? { ifMatch: held.etag } : undefined;
100
+ try {
101
+ await store.put(key, versionsDoc([...readVersions(held.body), formatSemver(version)]), "application/json", when);
102
+ return;
103
+ }
104
+ catch (e) {
105
+ if (!isConflict(e) || attempt >= retries)
106
+ throw e;
107
+ }
108
+ }
109
+ }
package/dist/report.d.ts CHANGED
@@ -27,6 +27,8 @@
27
27
  * chant's `groupChangeSet`, so a report here and one from terragucci agree on
28
28
  * what changed.
29
29
  */
30
+ import { type ChangeSetDocument } from "@intentius/chant/change-set";
31
+ export { topModule } from "./compose/module-address.js";
30
32
  type Json = Record<string, unknown>;
31
33
  export declare const REPORT_SCHEMA = "terragucci.report/v1";
32
34
  export declare const INDEX_SCHEMA = "terragucci.report-index/v1";
@@ -113,8 +115,6 @@ export interface IndexRow {
113
115
  pull_request_url?: string;
114
116
  job_url?: string;
115
117
  }
116
- /** The top-level module an address or module address is in, or undefined for the composed root's own. */
117
- export declare function topModule(address: string): string | undefined;
118
118
  /** The plan's `resource_changes` that belong to module `m` (undefined: the root's own), each with the module taken off its address. */
119
119
  export declare function slicePlan(plan: unknown, m: string | undefined): Json;
120
120
  /** One `read` of the report schema's `reads`, as a composed run writes it. */
@@ -127,8 +127,15 @@ export interface ReportRead {
127
127
  why?: string;
128
128
  composed: true;
129
129
  }
130
- /** The estate named by the first `live { estate = "..." }` block in a directory's `.tf` files, or undefined. */
131
- export declare function estateOfDir(dir: string): string | undefined;
130
+ /**
131
+ * The estate named by the first `live { estate = "..." }` block in a
132
+ * directory's configuration files, in filename order, or undefined. A `live`
133
+ * block takes effect only under choudoufu, so the files are the ones
134
+ * choudoufu reads (`.tf`, `.tf.json`, `.tofu` and `.tofu.json`, chant#4457)
135
+ * unless `binary` names another. A JSON-syntax file's `live` block is the one
136
+ * nested in its `terraform` block (chant#4504).
137
+ */
138
+ export declare function estateOfDir(dir: string, binary?: string): string | undefined;
132
139
  /** Each module's estate, read from `<repo>/<rootDir>/<module>`. A module whose directory has no `live` block is left out. */
133
140
  export declare function moduleEstates(repo: string, rootDir: string, modules: readonly string[]): Record<string, string>;
134
141
  /**
@@ -164,6 +171,8 @@ export declare function atmosStackReads(repo: string): ComponentReads;
164
171
  export declare function componentOutputReads(plan: Json, m: string, componentReads: ComponentReads, modules: readonly string[], rootOf: (m: string | undefined) => string): ReportRead[];
165
172
  export interface TerraformReport {
166
173
  report: Json;
174
+ /** The change set whose digest `report.change_set` names: what behold reads beside the report. */
175
+ changeSet: ChangeSetDocument;
167
176
  /** The run's directory, relative to the project's own index: `yyyy/mm/<commit>/<stage>`. */
168
177
  path: string;
169
178
  row: IndexRow;
@@ -188,7 +197,8 @@ export interface ReportStore {
188
197
  put(key: string, body: string): Promise<void>;
189
198
  }
190
199
  /**
191
- * Write the run's `report.json` and add its row to the project's index
200
+ * Write the run's `report.json` and `change-set.json` (the document whose
201
+ * digest the report names, as `chant change-set` writes it), and add its row to the project's index
192
202
  * (`<project>/index.json`, paths relative to it) and to the prefix's
193
203
  * (`index.json`, paths starting at the project), the two places terragucci
194
204
  * writes. Returns the keys written.
@@ -203,5 +213,4 @@ export declare function dirStore(dir: string): ReportStore;
203
213
  * for credentials. A 404 on read is no object.
204
214
  */
205
215
  export declare function httpStore(base: string, fetcher?: typeof fetch): ReportStore;
206
- export {};
207
216
  //# sourceMappingURL=report.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}