@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,94 @@
1
+ /**
2
+ * TF047: a live root pins a registry module version the known-module catalog
3
+ * has no row for, or one whose row carries refusals.
4
+ *
5
+ * The catalog is choudoufu's module compatibility table, vendored in
6
+ * `../../module-catalog/` (chant#4560, choudoufu#2292). It has one static
7
+ * row per terraform-aws-modules example at one tag, measured offline in the
8
+ * onboarded form. A module call on a root whose binary is choudoufu (the
9
+ * root's `mode` is `live`) with an exact `version` is looked up there:
10
+ *
11
+ * - no row for the module, or none at the pinned version: `info`, naming the
12
+ * versions the static tier did measure;
13
+ * - at least one example at that version refused: `warning`, with each
14
+ * refusal ID, its site count, the examples that carry it and its
15
+ * `live/LIMITATIONS.md` link;
16
+ * - every example clear: quiet.
17
+ *
18
+ * Every message names the tier. The catalog holds the static tier only, and
19
+ * no figure here counts a gauntlet run (choudoufu#2292 ruling: two tiers,
20
+ * never mixed).
21
+ *
22
+ * A stock root (`mode: "state"`) is skipped: the table measures choudoufu.
23
+ * A range is TF039's finding and a missing `version` TF004's, so both are
24
+ * skipped here. A `//subdir` source is looked up by its module repository.
25
+ *
26
+ * Off by default: `report-only` in the audit catalog, as TF039 is.
27
+ * terragucci turns it on and holds the product wording (terragucci#1286).
28
+ *
29
+ * Scope: root and child modules of a live root alike.
30
+ */
31
+ import { isResourceDeclarable } from "@intentius/chant/declarable";
32
+ import { MODULE_TYPE } from "../../hcl/parse.js";
33
+ import { classifyModuleSource, isExactVersionConstraint } from "./module-source.js";
34
+ import { MODULE_CATALOG_SOURCE, MODULE_COMPATIBILITY_PAGE, moduleCompatibility, } from "../../module-catalog/index.js";
35
+ const tierNote = () => `static tier of choudoufu's module table, measured ${MODULE_CATALOG_SOURCE.date} with hashicorp/aws ${MODULE_CATALOG_SOURCE.awsProvider}`;
36
+ /** The TF047 message for one module call, or undefined when the call is clear. */
37
+ export function catalogMessage(address, c) {
38
+ const pin = `${c.module} ${c.version}`;
39
+ switch (c.status) {
40
+ case "clear":
41
+ return undefined;
42
+ case "unknown-module":
43
+ return (`Module "${address}" pins ${pin}, and the ${tierNote()} has no row for this module. ` +
44
+ `Run \`choudoufu live-check\` on the root to see whether it plans. The table: ${MODULE_COMPATIBILITY_PAGE}`);
45
+ case "unknown-version":
46
+ return (`Module "${address}" pins ${pin}, and the ${tierNote()} has no row at this version. ` +
47
+ `It measured ${c.measuredVersions.join(", ")}. ` +
48
+ `Run \`choudoufu live-check\` on the root, or pin a measured version. The table: ${MODULE_COMPATIBILITY_PAGE}`);
49
+ case "refused": {
50
+ const ids = c.refusals
51
+ .map((r) => `${r.id} (${r.sites} site${r.sites === 1 ? "" : "s"} in ${r.examples.join(", ")}; ${r.docsUrl})`)
52
+ .join("; ");
53
+ return (`Module "${address}" pins ${pin}. In the ${tierNote()}, ${c.refusedExamples} of ${c.examples} ` +
54
+ `examples at this version are refused: ${ids}. ` +
55
+ "A call that uses the same features is refused the same way; `choudoufu live-check` names each site in this root.");
56
+ }
57
+ }
58
+ }
59
+ export const tf047 = {
60
+ id: "TF047",
61
+ description: "Live root pins a module version the known-module catalog has no row for, or one with refusals",
62
+ check(ctx) {
63
+ const diagnostics = [];
64
+ for (const [key, entity] of ctx.entities) {
65
+ if (entity.entityType !== MODULE_TYPE || !isResourceDeclarable(entity))
66
+ continue;
67
+ const props = entity.props;
68
+ if (props.mode !== "live")
69
+ continue;
70
+ const body = (typeof props.body === "object" && props.body !== null ? props.body : {});
71
+ const source = typeof body.source === "string" ? body.source : undefined;
72
+ if (source === undefined || classifyModuleSource(source).kind !== "registry")
73
+ continue;
74
+ const version = body.version;
75
+ if (typeof version !== "string" || !isExactVersionConstraint(version))
76
+ continue;
77
+ const compat = moduleCompatibility(source, version);
78
+ if (compat === undefined)
79
+ continue;
80
+ const address = typeof props.address === "string" ? props.address : key;
81
+ const message = catalogMessage(address, compat);
82
+ if (message === undefined)
83
+ continue;
84
+ diagnostics.push({
85
+ checkId: "TF047",
86
+ severity: compat.status === "refused" ? "warning" : "info",
87
+ message,
88
+ entity: key,
89
+ lexicon: "terraform",
90
+ });
91
+ }
92
+ return diagnostics;
93
+ },
94
+ };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * choudoufu's live-plan omission codes, in chant's vocabulary.
3
+ *
4
+ * Its own module so the observation reader (`./describe-resources.ts`) and
5
+ * the drift adapters (`./drift-record.ts`) read one table, and the drift
6
+ * adapters bundle without the reader's process and file-system imports.
7
+ */
8
+ import type { UnobservedReason } from "@intentius/chant/observation";
9
+ /**
10
+ * choudoufu's omission reason codes, mapped onto chant's total vocabulary
11
+ * (`internal/live/projection/result.go`). `"absent"` is not an
12
+ * {@link UnobservedReason}: it is the tri-state's OBSERVED-ABSENT, the one
13
+ * omission that is a claim of knowledge rather than of ignorance.
14
+ *
15
+ * A code this table does not know maps to `read-failed`, which is the safe
16
+ * direction: no NOT-OBSERVED verdict ever becomes a create or a delete.
17
+ */
18
+ export declare const LIVE_PLAN_OMISSION_REASONS: Readonly<Record<string, UnobservedReason | "absent">>;
19
+ /** Does this text name a credentials or authorization failure rather than any other error? */
20
+ export declare function readsAsCredentials(text: string): boolean;
21
+ //# sourceMappingURL=live-plan-reasons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-plan-reasons.d.ts","sourceRoot":"","sources":["../src/live-plan-reasons.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,QAAQ,CAAC,CA0B5F,CAAC;AAEF,8FAA8F;AAC9F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIxD"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * choudoufu's live-plan omission codes, in chant's vocabulary.
3
+ *
4
+ * Its own module so the observation reader (`./describe-resources.ts`) and
5
+ * the drift adapters (`./drift-record.ts`) read one table, and the drift
6
+ * adapters bundle without the reader's process and file-system imports.
7
+ */
8
+ /**
9
+ * choudoufu's omission reason codes, mapped onto chant's total vocabulary
10
+ * (`internal/live/projection/result.go`). `"absent"` is not an
11
+ * {@link UnobservedReason}: it is the tri-state's OBSERVED-ABSENT, the one
12
+ * omission that is a claim of knowledge rather than of ignorance.
13
+ *
14
+ * A code this table does not know maps to `read-failed`, which is the safe
15
+ * direction: no NOT-OBSERVED verdict ever becomes a create or a delete.
16
+ */
17
+ export const LIVE_PLAN_OMISSION_REASONS = {
18
+ // The provider was asked and reported, normally, that nothing is there.
19
+ ABSENT: "absent",
20
+ // The provider errored, or could not be reached in a usable order.
21
+ FAILED: "read-failed",
22
+ PARENT_UNAVAILABLE: "read-failed",
23
+ CYCLE: "read-failed",
24
+ INCOMPLETE_BLOCK: "read-failed",
25
+ LISTED_NOT_IMPORTABLE: "read-failed",
26
+ // Something exists at the identity and does not carry this estate's marker.
27
+ // Normally answered by the `unowned[]` section before this table is read;
28
+ // this entry is what happens if a document ever carries the omission alone.
29
+ UNOWNED: "read-failed",
30
+ // The mode cannot name, list or tag this instance at all: a server-assigned
31
+ // identity with no marker to find it by, a resource with no cloud object to
32
+ // read, or an address another declared instance has taken over.
33
+ NEEDS_DISCOVERY: "unsupported-kind",
34
+ UNREADABLE: "unsupported-kind",
35
+ SUPERSEDED: "unsupported-kind",
36
+ // The run's own tag index saw an object at the identity and the import
37
+ // read could not confirm it (choudoufu #1043). The read failed; the
38
+ // object is not proposed for creation.
39
+ VERIFIED_NOT_IMPORTABLE: "read-failed",
40
+ // -target or -exclude left the block out of the plan graph (choudoufu
41
+ // #1176): nothing was read because the caller asked for it not to be.
42
+ OUT_OF_SCOPE: "filtered",
43
+ };
44
+ /** Does this text name a credentials or authorization failure rather than any other error? */
45
+ export function readsAsCredentials(text) {
46
+ return /\b(no valid credential|credentials?|not authorized|unauthorized|accessdenied|access denied|expiredtoken|invalidclienttokenid|signature)\b/i.test(text);
47
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * The terraform lexicon's lock grain (#4552) and the rows a choudoufu apply
3
+ * holds on the resource grain, in terragucci's format (`planRows` in
4
+ * terragucci's `apply-rows.ts` at 18f6431), unchanged:
5
+ *
6
+ * - `estate <estate> <address>` for every resource instance the apply acts
7
+ * on (a create, update, delete, replace or forget), or `root <root>
8
+ * <address>` when the root has no estate;
9
+ * - the same for `previous_address` on a moved instance;
10
+ * - `object <id>` for anything but a create, from the object's id before,
11
+ * so two estates that meet on one object meet on its row.
12
+ *
13
+ * Data reads and no-ops hold nothing.
14
+ *
15
+ * The grain: `resource` for choudoufu, which keeps one record per resource,
16
+ * writes each conditionally and refuses a plan one of whose changes moved;
17
+ * `target` (the root, or the Terragrunt unit) for Terraform, tofu and
18
+ * Terragrunt, whose state is one file the backend's lock keeps whole. Those
19
+ * three refuse `resource` by name, since nothing in their state is per
20
+ * resource.
21
+ */
22
+ import type { ChangeSetPart, ChangeSetPlanner } from "@intentius/chant/change-set";
23
+ import { type LockGrain, type LockRow } from "@intentius/chant/lifecycle/lock-rows";
24
+ /** The rows a plan's changes key, from `show -json`'s `resource_changes` (terragucci's `planRows`). */
25
+ export declare function terraformLockRows(root: string, estate: string | undefined, plan: unknown): LockRow[];
26
+ /**
27
+ * The rows from a member's change-set part, when the plan document is not
28
+ * at hand: the same keys, less the previous address of a moved instance,
29
+ * which the part does not carry. The part's `scope` is the estate.
30
+ */
31
+ export declare function terraformLockRowsFromPart(root: string, part: ChangeSetPart): LockRow[];
32
+ /** The grain a root takes by default: `resource` under choudoufu, `target` under every other binary. */
33
+ export declare function terraformDefaultLockGrain(planner: ChangeSetPlanner | undefined): LockGrain;
34
+ /** Why a root cannot take `grain`, by engine name, or undefined when it can. */
35
+ export declare function terraformLockGrainRefusal(grain: LockGrain, planner: ChangeSetPlanner | undefined, binary?: string): string | undefined;
36
+ //# sourceMappingURL=lock-rows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock-rows.d.ts","sourceRoot":"","sources":["../src/lock-rows.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAgC,KAAK,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,sCAAsC,CAAC;AASlH,uGAAuG;AACvG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,CAgBpG;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,EAAE,CAStF;AAOD,wGAAwG;AACxG,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,GAAG,SAAS,CAE1F;AAED,gFAAgF;AAChF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAItI"}
@@ -0,0 +1,60 @@
1
+ import { objectRowKey, sortedLockRows } from "@intentius/chant/lifecycle/lock-rows";
2
+ const CHANGING = new Set(["create", "update", "delete", "forget"]);
3
+ /** The scope a root's rows are keyed in: its estate, else its path. */
4
+ function rowScope(root, estate) {
5
+ return estate ? `estate ${estate}` : `root ${root}`;
6
+ }
7
+ /** The rows a plan's changes key, from `show -json`'s `resource_changes` (terragucci's `planRows`). */
8
+ export function terraformLockRows(root, estate, plan) {
9
+ const scope = rowScope(root, estate);
10
+ const rows = [];
11
+ const changes = plan?.resource_changes ?? [];
12
+ for (const c of changes) {
13
+ if (c?.mode === "data" || typeof c?.address !== "string")
14
+ continue;
15
+ const actions = Array.isArray(c.change?.actions) ? c.change.actions : [];
16
+ if (!actions.some((a) => CHANGING.has(a)))
17
+ continue;
18
+ const address = c.address;
19
+ rows.push({ key: `${scope} ${address}`, target: root, address });
20
+ if (typeof c.previous_address === "string" && c.previous_address !== address)
21
+ rows.push({ key: `${scope} ${c.previous_address}`, target: root, address });
22
+ // The live object an update or a delete acts on: two estates that meet on one object meet here.
23
+ const id = c.change?.before?.id;
24
+ if (actions.some((a) => a !== "create") && (typeof id === "string" || typeof id === "number") && String(id) !== "")
25
+ rows.push({ key: objectRowKey(String(id)), target: root, address });
26
+ }
27
+ return sortedLockRows(rows);
28
+ }
29
+ /**
30
+ * The rows from a member's change-set part, when the plan document is not
31
+ * at hand: the same keys, less the previous address of a moved instance,
32
+ * which the part does not carry. The part's `scope` is the estate.
33
+ */
34
+ export function terraformLockRowsFromPart(root, part) {
35
+ const scope = rowScope(root, part.member.planner === "choudoufu" ? part.member.scope : undefined);
36
+ const rows = [];
37
+ for (const e of part.entries) {
38
+ if (e.action === "no-op" || e.action === "read")
39
+ continue;
40
+ rows.push({ key: `${scope} ${e.address}`, target: root, address: e.address });
41
+ if (e.action !== "create" && e.id)
42
+ rows.push({ key: objectRowKey(e.id), target: root, address: e.address });
43
+ }
44
+ return sortedLockRows(rows);
45
+ }
46
+ /** Whether a binary's name is Terragrunt's. */
47
+ function isTerragrunt(binary) {
48
+ return /^terragrunt(\.exe)?$/.test((binary ?? "").split(/[\\/]/).pop() ?? "");
49
+ }
50
+ /** The grain a root takes by default: `resource` under choudoufu, `target` under every other binary. */
51
+ export function terraformDefaultLockGrain(planner) {
52
+ return planner === "choudoufu" ? "resource" : "target";
53
+ }
54
+ /** Why a root cannot take `grain`, by engine name, or undefined when it can. */
55
+ export function terraformLockGrainRefusal(grain, planner, binary) {
56
+ if (grain !== "resource" || planner === "choudoufu")
57
+ return undefined;
58
+ const engine = isTerragrunt(binary) ? "Terragrunt" : planner === "tofu" ? "tofu" : "Terraform";
59
+ return `${engine} keeps a root's state in one file that its backend's lock keeps whole, so nothing in it is per resource; the resource grain needs choudoufu (ci.lockGrain: target)`;
60
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * State-lock waits for a plan or an apply (#4545): how long `plan` and
3
+ * `apply` wait for another run's state lock before failing. Taken from
4
+ * terragucci's waves, where two jobs of one pipeline can reach the same
5
+ * backend a moment apart and a failed lock fails the wave for nothing.
6
+ *
7
+ * A job that already sets `-lock-timeout` through `TF_CLI_ARGS` or
8
+ * `TF_CLI_ARGS_<command>` keeps its own: the flag is added only when neither
9
+ * names one. Terragrunt waves pass the same flag after `--`
10
+ * (`./terragrunt/wave.ts`, `extra`).
11
+ */
12
+ /** How long a plan or an apply waits for a state lock unless the job set a `-lock-timeout` of its own. */
13
+ export declare const DEFAULT_LOCK_TIMEOUT = "5m";
14
+ /** Whether `value` is a `-lock-timeout` duration. */
15
+ export declare function isLockTimeout(value: unknown): value is string;
16
+ /**
17
+ * The `-lock-timeout` flag a `command` takes: `-lock-timeout=<timeout>`, or
18
+ * nothing when `TF_CLI_ARGS` or `TF_CLI_ARGS_<command>` in `env` already
19
+ * names one, or `timeout` is `false`. Throws on a duration terraform refuses.
20
+ */
21
+ export declare function lockTimeoutArgs(command: "plan" | "apply", timeout?: string | false, env?: Record<string, string | undefined>): string[];
22
+ //# sourceMappingURL=lock-timeout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock-timeout.d.ts","sourceRoot":"","sources":["../src/lock-timeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,0GAA0G;AAC1G,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAKzC,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,OAAO,GAAE,MAAM,GAAG,KAA4B,EAAE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,MAAM,EAAE,CAK1K"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * State-lock waits for a plan or an apply (#4545): how long `plan` and
3
+ * `apply` wait for another run's state lock before failing. Taken from
4
+ * terragucci's waves, where two jobs of one pipeline can reach the same
5
+ * backend a moment apart and a failed lock fails the wave for nothing.
6
+ *
7
+ * A job that already sets `-lock-timeout` through `TF_CLI_ARGS` or
8
+ * `TF_CLI_ARGS_<command>` keeps its own: the flag is added only when neither
9
+ * names one. Terragrunt waves pass the same flag after `--`
10
+ * (`./terragrunt/wave.ts`, `extra`).
11
+ */
12
+ /** How long a plan or an apply waits for a state lock unless the job set a `-lock-timeout` of its own. */
13
+ export const DEFAULT_LOCK_TIMEOUT = "5m";
14
+ /** A duration terraform's `-lock-timeout` takes: `0s`, `30s`, `5m`, `1h30m`. */
15
+ const DURATION = /^(\d+(ms|s|m|h))+$/;
16
+ /** Whether `value` is a `-lock-timeout` duration. */
17
+ export function isLockTimeout(value) {
18
+ return typeof value === "string" && DURATION.test(value);
19
+ }
20
+ /**
21
+ * The `-lock-timeout` flag a `command` takes: `-lock-timeout=<timeout>`, or
22
+ * nothing when `TF_CLI_ARGS` or `TF_CLI_ARGS_<command>` in `env` already
23
+ * names one, or `timeout` is `false`. Throws on a duration terraform refuses.
24
+ */
25
+ export function lockTimeoutArgs(command, timeout = DEFAULT_LOCK_TIMEOUT, env = process.env) {
26
+ if (timeout === false)
27
+ return [];
28
+ if (!isLockTimeout(timeout))
29
+ throw new Error(`lockTimeout "${timeout}" is not a duration terraform takes, such as "5m" or "30s"`);
30
+ const set = `${env.TF_CLI_ARGS ?? ""} ${env[`TF_CLI_ARGS_${command}`] ?? ""}`;
31
+ return /(^|\s)-{1,2}lock-timeout[=\s]/.test(set) ? [] : [`-lock-timeout=${timeout}`];
32
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"option-keys.d.ts","sourceRoot":"","sources":["../../src/lsp/option-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,EAAE,SAAS,EAG5C,CAAC;AAEF,wFAAwF;AACxF,eAAO,MAAM,eAAe,EAAE,SAAS,EAMtC,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,aAAa,EAAE,SAAS,EAYpC,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,eAAe,EAAE,SAAS,EAEtC,CAAC;AAQF,mGAAmG;AACnG,eAAO,MAAM,cAAc,EAAE,SAAS,EAKrC,CAAC;AAEF,mGAAmG;AACnG,eAAO,MAAM,cAAc,EAAE,SAAS,EAKrC,CAAC;AAEF,qGAAqG;AACrG,eAAO,MAAM,eAAe,EAAE,SAAS,EAStC,CAAC;AAEF,mGAAmG;AACnG,eAAO,MAAM,cAAc,EAAE,SAAS,EAIrC,CAAC;AAEF,oGAAoG;AACpG,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAK5D,CAAC;AAEF,iPAAiP;AACjP,eAAO,MAAM,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAW/C,CAAC"}
1
+ {"version":3,"file":"option-keys.d.ts","sourceRoot":"","sources":["../../src/lsp/option-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,EAAE,SAAS,EAG5C,CAAC;AAEF,wFAAwF;AACxF,eAAO,MAAM,eAAe,EAAE,SAAS,EAQtC,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,aAAa,EAAE,SAAS,EAYpC,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,eAAe,EAAE,SAAS,EAEtC,CAAC;AAQF,mGAAmG;AACnG,eAAO,MAAM,cAAc,EAAE,SAAS,EAKrC,CAAC;AAEF,mGAAmG;AACnG,eAAO,MAAM,cAAc,EAAE,SAAS,EAKrC,CAAC;AAEF,qGAAqG;AACrG,eAAO,MAAM,eAAe,EAAE,SAAS,EAStC,CAAC;AAEF,mGAAmG;AACnG,eAAO,MAAM,cAAc,EAAE,SAAS,EAIrC,CAAC;AAEF,oGAAoG;AACpG,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAK5D,CAAC;AAEF,iPAAiP;AACjP,eAAO,MAAM,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAW/C,CAAC"}
@@ -18,7 +18,9 @@ export const ROOT_ENTRY_KEYS = [
18
18
  { key: "workspace", detail: "Terraform workspace to select for this root. Omitted means `default`." },
19
19
  { key: "varFiles", detail: "`-var-file` arguments, in order, relative to `dir`." },
20
20
  { key: "backendConfig", detail: "`-backend-config` key/value pairs handed to `init`." },
21
+ { key: "backendConfigFiles", detail: "Backend-config files handed to `init` as `-backend-config=<path>`, before the pairs, relative to `dir`." },
21
22
  { key: "delete", detail: '"never" | "owned-only" | "gated" — this root\'s delete mode, mapped onto choudoufu\'s policy block on a live root.' },
23
+ { key: "signalOnly", detail: "`true` when the root is declared only so a change to it brings this project into the change. The build and live reads skip it." },
22
24
  ];
23
25
  /** `TerraformApplyOpConfig`'s keys (`TerraformApplyOp({ <here> })`). */
24
26
  export const APPLY_OP_KEYS = [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "terraform",
3
- "version": "0.124.52",
3
+ "version": "0.124.55",
4
4
  "chantVersion": ">=0.1.0",
5
5
  "namespace": "Terraform"
6
6
  }
@@ -0,0 +1,69 @@
1
+ import type { StaticRow } from "./types.js";
2
+ export type { StaticRefusal, StaticRow, StaticMeasurement, StaticSource } from "./types.js";
3
+ /** Where the vendored rows came from. */
4
+ export declare const MODULE_CATALOG_SOURCE: {
5
+ readonly repo: "INTENTIUS/choudoufu";
6
+ readonly path: "live/module-compat.json";
7
+ readonly commit: "39a143679a6f5ffeae7dc186190049e8b55f7149";
8
+ /** The static tier's measurement date. */
9
+ readonly date: string;
10
+ /** The choudoufu commit the static tier was measured at. */
11
+ readonly measuredAt: string;
12
+ /** The hashicorp/aws provider version the static tier was measured with. */
13
+ readonly awsProvider: string;
14
+ };
15
+ /** choudoufu's site page that renders both tiers. */
16
+ export declare const MODULE_COMPATIBILITY_PAGE = "https://intentius.io/choudoufu/aws/compatibility/#modules";
17
+ /** The tiers this catalog holds. */
18
+ export type ModuleCatalogTier = "static";
19
+ /** Every static row, as vendored. */
20
+ export declare const staticRows: readonly StaticRow[];
21
+ /** One refusal ID across the examples of a module version that carry it. */
22
+ export interface ModuleRefusalSummary {
23
+ id: string;
24
+ /** Sites summed across the examples that carry it. */
25
+ sites: number;
26
+ docsUrl: string;
27
+ /** Example directories that carry it, sorted. */
28
+ examples: string[];
29
+ }
30
+ /**
31
+ * What the catalog says about one pinned module version.
32
+ *
33
+ * - `unknown-module`: no static row for this module at any version.
34
+ * - `unknown-version`: rows for the module, none measured at this version
35
+ * (`measuredVersions` lists the ones there are).
36
+ * - `refused`: at least one example at this version is refused.
37
+ * - `clear`: every measured example at this version is clear.
38
+ */
39
+ export interface ModuleCompatibility {
40
+ module: string;
41
+ /** The pinned version, without a leading `v` or `=`. */
42
+ version: string;
43
+ tier: ModuleCatalogTier;
44
+ status: "unknown-module" | "unknown-version" | "clear" | "refused";
45
+ /** Static rows measured at this version (an `unmeasured` row is left out). */
46
+ examples: number;
47
+ clearExamples: number;
48
+ refusedExamples: number;
49
+ /** Refusal IDs at this version, most refused examples first, then by ID. */
50
+ refusals: ModuleRefusalSummary[];
51
+ /** Versions the static tier measured for this module, without a leading `v`. */
52
+ measuredVersions: string[];
53
+ }
54
+ /**
55
+ * The registry address of a module source, without a registry host, a
56
+ * `//subdir` or a query, lowercased: `registry.terraform.io/terraform-aws-modules/iam/aws//modules/iam-role`
57
+ * gives `terraform-aws-modules/iam/aws`. Undefined when the source is not a
58
+ * three-part registry address.
59
+ */
60
+ export declare function registryModuleAddress(source: string): string | undefined;
61
+ /** `= 1.4.0`, `v1.4.0` and `1.4.0` all give `1.4.0`; a range gives undefined. */
62
+ export declare function exactModuleVersion(version: string): string | undefined;
63
+ /**
64
+ * The catalog's answer for a module `source` pinned at `version`, or
65
+ * undefined when the source is not a registry address or the version is not
66
+ * exact (a range is TF039's finding, and the catalog has no row for one).
67
+ */
68
+ export declare function moduleCompatibility(source: string, version: string): ModuleCompatibility | undefined;
69
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/module-catalog/index.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEzF,yCAAyC;AACzC,eAAO,MAAM,qBAAqB;aAChC,IAAI,EAAE,qBAAqB;aAC3B,IAAI;aACJ,MAAM;IACN,0CAA0C;aAC1C,IAAI;IACJ,4DAA4D;aAC5D,UAAU;IACV,4EAA4E;aAC5E,WAAW;CACH,CAAC;AAEX,qDAAqD;AACrD,eAAO,MAAM,yBAAyB,8DAA8D,CAAC;AAErG,oCAAoC;AACpC,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAEzC,qCAAqC;AACrC,eAAO,MAAM,UAAU,EAAE,SAAS,SAAS,EAAgB,CAAC;AAE5D,4EAA4E;AAC5E,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,iBAAiB,CAAC;IACxB,MAAM,EAAE,gBAAgB,GAAG,iBAAiB,GAAG,OAAO,GAAG,SAAS,CAAC;IACnE,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,4EAA4E;IAC5E,QAAQ,EAAE,oBAAoB,EAAE,CAAC;IACjC,gFAAgF;IAChF,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQxE;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGtE;AAiBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAoCpG"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * The known-module catalog (chant#4560): choudoufu's module compatibility
3
+ * table (choudoufu#2292, `live/module-compat.json`), vendored in
4
+ * `./static-tier.ts` and read by TF047 and by terragucci's tip and estate
5
+ * column (terragucci#1286).
6
+ *
7
+ * The catalog holds the static tier only. A static row is one
8
+ * terraform-aws-modules example at one tag, measured offline by choudoufu's
9
+ * refusal probe in the onboarded form: `clear` means `choudoufu live-check`
10
+ * plans it, `refused` lists choudoufu refusal IDs with site counts. The
11
+ * gauntlet tier (end-to-end runs against an emulator) is a separate table in
12
+ * choudoufu, has no rows until choudoufu#2291's run, and is never folded into
13
+ * these numbers: every result here carries `tier: "static"`, and a figure in
14
+ * it counts static rows only.
15
+ *
16
+ * This subpath, `@intentius/chant-lexicon-terraform/module-catalog`, imports
17
+ * nothing but its own data, so a consumer can load it on its own.
18
+ */
19
+ import { SOURCE_COMMIT, SOURCE_PATH, STATIC_MEASUREMENT, STATIC_ROWS } from "./static-tier.js";
20
+ /** Where the vendored rows came from. */
21
+ export const MODULE_CATALOG_SOURCE = {
22
+ repo: "INTENTIUS/choudoufu",
23
+ path: SOURCE_PATH,
24
+ commit: SOURCE_COMMIT,
25
+ /** The static tier's measurement date. */
26
+ date: STATIC_MEASUREMENT.date,
27
+ /** The choudoufu commit the static tier was measured at. */
28
+ measuredAt: STATIC_MEASUREMENT.commit,
29
+ /** The hashicorp/aws provider version the static tier was measured with. */
30
+ awsProvider: STATIC_MEASUREMENT.aws_provider,
31
+ };
32
+ /** choudoufu's site page that renders both tiers. */
33
+ export const MODULE_COMPATIBILITY_PAGE = "https://intentius.io/choudoufu/aws/compatibility/#modules";
34
+ /** Every static row, as vendored. */
35
+ export const staticRows = STATIC_ROWS;
36
+ /**
37
+ * The registry address of a module source, without a registry host, a
38
+ * `//subdir` or a query, lowercased: `registry.terraform.io/terraform-aws-modules/iam/aws//modules/iam-role`
39
+ * gives `terraform-aws-modules/iam/aws`. Undefined when the source is not a
40
+ * three-part registry address.
41
+ */
42
+ export function registryModuleAddress(source) {
43
+ let s = source.trim().split("?")[0];
44
+ const sub = s.indexOf("//");
45
+ if (sub >= 0)
46
+ s = s.slice(0, sub);
47
+ const parts = s.split("/");
48
+ if (parts.length === 4 && parts[0].includes("."))
49
+ parts.shift();
50
+ if (parts.length !== 3 || parts.some((p) => !/^[A-Za-z0-9][A-Za-z0-9_.-]*$/.test(p)))
51
+ return undefined;
52
+ return parts.join("/").toLowerCase();
53
+ }
54
+ /** `= 1.4.0`, `v1.4.0` and `1.4.0` all give `1.4.0`; a range gives undefined. */
55
+ export function exactModuleVersion(version) {
56
+ const v = version.trim().replace(/^=\s*/, "").replace(/^v/, "");
57
+ return /^\d+(?:\.\d+){0,2}(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(v) ? v : undefined;
58
+ }
59
+ const bare = (version) => version.replace(/^v/, "");
60
+ function byModule() {
61
+ const out = new Map();
62
+ for (const row of STATIC_ROWS) {
63
+ const key = row.module.toLowerCase();
64
+ const list = out.get(key) ?? [];
65
+ list.push(row);
66
+ out.set(key, list);
67
+ }
68
+ return out;
69
+ }
70
+ let index;
71
+ /**
72
+ * The catalog's answer for a module `source` pinned at `version`, or
73
+ * undefined when the source is not a registry address or the version is not
74
+ * exact (a range is TF039's finding, and the catalog has no row for one).
75
+ */
76
+ export function moduleCompatibility(source, version) {
77
+ const module = registryModuleAddress(source);
78
+ const pinned = exactModuleVersion(version);
79
+ if (module === undefined || pinned === undefined)
80
+ return undefined;
81
+ index ?? (index = byModule());
82
+ const rows = index.get(module) ?? [];
83
+ const measuredVersions = [...new Set(rows.map((r) => bare(r.version)))].sort();
84
+ const at = rows.filter((r) => bare(r.version) === pinned && r.verdict !== "unmeasured");
85
+ const refusedRows = at.filter((r) => r.verdict === "refused");
86
+ const refusals = new Map();
87
+ for (const row of refusedRows) {
88
+ for (const r of row.refusals) {
89
+ const s = refusals.get(r.id) ?? { id: r.id, sites: 0, docsUrl: r.docs_url, examples: [] };
90
+ s.sites += r.sites;
91
+ if (!s.examples.includes(row.example))
92
+ s.examples.push(row.example);
93
+ refusals.set(r.id, s);
94
+ }
95
+ }
96
+ for (const s of refusals.values())
97
+ s.examples.sort();
98
+ const status = rows.length === 0 ? "unknown-module" : at.length === 0 ? "unknown-version" : refusedRows.length > 0 ? "refused" : "clear";
99
+ return {
100
+ module,
101
+ version: pinned,
102
+ tier: "static",
103
+ status,
104
+ examples: at.length,
105
+ clearExamples: at.filter((r) => r.verdict === "clear").length,
106
+ refusedExamples: refusedRows.length,
107
+ refusals: [...refusals.values()].sort((a, b) => b.examples.length - a.examples.length || a.id.localeCompare(b.id)),
108
+ measuredVersions,
109
+ };
110
+ }
@@ -0,0 +1,4 @@
1
+ import { type StaticMeasurement, type StaticRow } from "./types.js";
2
+ /** The TypeScript source of `static-tier.ts` for one snapshot. */
3
+ export declare function renderStaticTier(commit: string, measurement: StaticMeasurement, rows: readonly StaticRow[]): string;
4
+ //# sourceMappingURL=refresh-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-cli.d.ts","sourceRoot":"","sources":["../../src/module-catalog/refresh-cli.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAqB,KAAK,iBAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AASpF,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAiBnH"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Refresh the vendored known-module catalog (chant#4560) from choudoufu's
3
+ * module compatibility table.
4
+ *
5
+ * npm run --prefix lexicons/terraform module-catalog:refresh -- <choudoufu checkout> [ref]
6
+ *
7
+ * It reads `live/module-compat.json` at `ref` (default `origin/main`) with
8
+ * `git show`, so the checkout's working tree is never read and a local edit
9
+ * cannot leak into the snapshot. The header of the written file names the
10
+ * source path and the choudoufu commit that last changed the table at that
11
+ * ref, so a reader can check the snapshot against its source with
12
+ * `git -C <choudoufu> show <commit>:live/module-compat.json`.
13
+ *
14
+ * Only the static tier is vendored. choudoufu keeps the gauntlet tier in a
15
+ * separate array and the two tiers share no figure (choudoufu#2292 ruling);
16
+ * the gauntlet array stays out until it has rows (choudoufu#2291), and then
17
+ * comes in as its own export, never folded into the static rows.
18
+ */
19
+ import { execFileSync } from "node:child_process";
20
+ import { writeFileSync } from "node:fs";
21
+ import { dirname, join } from "node:path";
22
+ import { fileURLToPath } from "node:url";
23
+ import { parseModuleCompat } from "./types.js";
24
+ const SOURCE_PATH = "live/module-compat.json";
25
+ const OUT = join(dirname(fileURLToPath(import.meta.url)), "static-tier.ts");
26
+ function git(dir, ...args) {
27
+ return execFileSync("git", ["-C", dir, ...args], { encoding: "utf8", maxBuffer: 64 * 1024 * 1024 });
28
+ }
29
+ /** The TypeScript source of `static-tier.ts` for one snapshot. */
30
+ export function renderStaticTier(commit, measurement, rows) {
31
+ return [
32
+ "// Code generated by src/module-catalog/refresh-cli.ts. DO NOT EDIT.",
33
+ "//",
34
+ `// Vendored from INTENTIUS/choudoufu ${SOURCE_PATH} at commit`,
35
+ `// ${commit}, static tier only (chant#4560).`,
36
+ "// The gauntlet tier is a separate array in that file and is not vendored here.",
37
+ "import type { StaticMeasurement, StaticRow } from \"./types\";",
38
+ "",
39
+ `export const SOURCE_PATH = ${JSON.stringify(SOURCE_PATH)};`,
40
+ `export const SOURCE_COMMIT = ${JSON.stringify(commit)};`,
41
+ "",
42
+ `export const STATIC_MEASUREMENT: StaticMeasurement = ${JSON.stringify(measurement, null, 2)};`,
43
+ "",
44
+ `export const STATIC_ROWS: readonly StaticRow[] = ${JSON.stringify(rows, null, 2)};`,
45
+ "",
46
+ ].join("\n");
47
+ }
48
+ function main(argv) {
49
+ const [dir, ref = "origin/main"] = argv;
50
+ if (!dir) {
51
+ console.error("usage: refresh-cli.ts <choudoufu checkout> [ref]");
52
+ process.exit(2);
53
+ }
54
+ const commit = git(dir, "log", "-1", "--format=%H", ref, "--", SOURCE_PATH).trim();
55
+ if (!/^[0-9a-f]{40}$/.test(commit)) {
56
+ console.error(`${SOURCE_PATH} has no history at ${ref} in ${dir}`);
57
+ process.exit(1);
58
+ }
59
+ const file = parseModuleCompat(JSON.parse(git(dir, "show", `${commit}:${SOURCE_PATH}`)));
60
+ writeFileSync(OUT, renderStaticTier(commit, file.static_measurement, file.static));
61
+ console.log(`module catalog: ${file.static.length} static rows from ${SOURCE_PATH} at ${commit}`);
62
+ }
63
+ if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1])
64
+ main(process.argv.slice(2));
@@ -0,0 +1,6 @@
1
+ import type { StaticMeasurement, StaticRow } from "./types.js";
2
+ export declare const SOURCE_PATH = "live/module-compat.json";
3
+ export declare const SOURCE_COMMIT = "39a143679a6f5ffeae7dc186190049e8b55f7149";
4
+ export declare const STATIC_MEASUREMENT: StaticMeasurement;
5
+ export declare const STATIC_ROWS: readonly StaticRow[];
6
+ //# sourceMappingURL=static-tier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-tier.d.ts","sourceRoot":"","sources":["../../src/module-catalog/static-tier.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE5D,eAAO,MAAM,WAAW,4BAA4B,CAAC;AACrD,eAAO,MAAM,aAAa,6CAA6C,CAAC;AAExE,eAAO,MAAM,kBAAkB,EAAE,iBAkHhC,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EA4/C3C,CAAC"}