@intentius/chant-lexicon-terraform 0.124.51 → 0.124.54

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 (338) hide show
  1. package/README.md +7 -6
  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/commands.d.ts +5 -0
  27. package/dist/commands.d.ts.map +1 -1
  28. package/dist/commands.js +87 -4
  29. package/dist/components/capability-plugin.d.ts +65 -3
  30. package/dist/components/capability-plugin.d.ts.map +1 -1
  31. package/dist/components/capability-plugin.js +197 -13
  32. package/dist/components/compose-group.d.ts +145 -0
  33. package/dist/components/compose-group.d.ts.map +1 -0
  34. package/dist/components/compose-group.js +407 -0
  35. package/dist/components/placeholder-preview.d.ts +78 -0
  36. package/dist/components/placeholder-preview.d.ts.map +1 -0
  37. package/dist/components/placeholder-preview.js +254 -0
  38. package/dist/compose/apply-events.d.ts +46 -0
  39. package/dist/compose/apply-events.d.ts.map +1 -0
  40. package/dist/compose/apply-events.js +77 -0
  41. package/dist/compose/estate.d.ts +194 -0
  42. package/dist/compose/estate.d.ts.map +1 -0
  43. package/dist/compose/estate.js +363 -0
  44. package/dist/compose/hcl.d.ts +99 -0
  45. package/dist/compose/hcl.d.ts.map +1 -0
  46. package/dist/compose/hcl.js +302 -0
  47. package/dist/compose/module-address.d.ts +24 -0
  48. package/dist/compose/module-address.d.ts.map +1 -0
  49. package/dist/compose/module-address.js +43 -0
  50. package/dist/compose/root.d.ts +127 -0
  51. package/dist/compose/root.d.ts.map +1 -0
  52. package/dist/compose/root.js +586 -0
  53. package/dist/compose/run.d.ts +183 -0
  54. package/dist/compose/run.d.ts.map +1 -0
  55. package/dist/compose/run.js +447 -0
  56. package/dist/compose/slice.d.ts +102 -0
  57. package/dist/compose/slice.d.ts.map +1 -0
  58. package/dist/compose/slice.js +249 -0
  59. package/dist/compose/state-address.d.ts +28 -0
  60. package/dist/compose/state-address.d.ts.map +1 -0
  61. package/dist/compose/state-address.js +154 -0
  62. package/dist/compose/state-merge.d.ts +52 -0
  63. package/dist/compose/state-merge.d.ts.map +1 -0
  64. package/dist/compose/state-merge.js +135 -0
  65. package/dist/compose.d.ts +179 -0
  66. package/dist/compose.d.ts.map +1 -0
  67. package/dist/compose.js +482 -0
  68. package/dist/composites/terraform-apply-op.d.ts.map +1 -1
  69. package/dist/composites/terraform-apply-op.js +7 -3
  70. package/dist/config.d.ts +59 -13
  71. package/dist/config.d.ts.map +1 -1
  72. package/dist/config.js +43 -9
  73. package/dist/describe-resources.d.ts +74 -12
  74. package/dist/describe-resources.d.ts.map +1 -1
  75. package/dist/describe-resources.js +374 -66
  76. package/dist/drift-read.d.ts +33 -0
  77. package/dist/drift-read.d.ts.map +1 -0
  78. package/dist/drift-read.js +243 -0
  79. package/dist/drift-record.d.ts +147 -0
  80. package/dist/drift-record.d.ts.map +1 -0
  81. package/dist/drift-record.js +383 -0
  82. package/dist/hcl/edges.d.ts.map +1 -1
  83. package/dist/hcl/edges.js +24 -1
  84. package/dist/hcl/files.d.ts +61 -0
  85. package/dist/hcl/files.d.ts.map +1 -0
  86. package/dist/hcl/files.js +221 -0
  87. package/dist/hcl/instances.d.ts +82 -0
  88. package/dist/hcl/instances.d.ts.map +1 -0
  89. package/dist/hcl/instances.js +390 -0
  90. package/dist/hcl/parse.d.ts +81 -9
  91. package/dist/hcl/parse.d.ts.map +1 -1
  92. package/dist/hcl/parse.js +114 -16
  93. package/dist/hcl/roots.d.ts.map +1 -1
  94. package/dist/hcl/roots.js +5 -0
  95. package/dist/hcl/suppressions.d.ts.map +1 -1
  96. package/dist/hcl/suppressions.js +8 -2
  97. package/dist/index.d.ts +11 -2
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +21 -2
  100. package/dist/integrity.json +3 -3
  101. package/dist/live-plan-reasons.d.ts +21 -0
  102. package/dist/live-plan-reasons.d.ts.map +1 -0
  103. package/dist/live-plan-reasons.js +47 -0
  104. package/dist/lsp/option-keys.d.ts.map +1 -1
  105. package/dist/lsp/option-keys.js +2 -0
  106. package/dist/manifest.json +1 -1
  107. package/dist/op/activities/index.d.ts +6 -2
  108. package/dist/op/activities/index.d.ts.map +1 -1
  109. package/dist/op/activities/index.js +5 -1
  110. package/dist/op/activities/live-detect.d.ts +4 -3
  111. package/dist/op/activities/live-detect.d.ts.map +1 -1
  112. package/dist/op/activities/live-detect.js +57 -32
  113. package/dist/op/activities/pin-rollout.d.ts +2 -0
  114. package/dist/op/activities/pin-rollout.d.ts.map +1 -1
  115. package/dist/op/activities/pin-rollout.js +1 -0
  116. package/dist/op/activities/terraform.d.ts +153 -5
  117. package/dist/op/activities/terraform.d.ts.map +1 -1
  118. package/dist/op/activities/terraform.js +205 -20
  119. package/dist/op/activity-contracts.d.ts +27 -0
  120. package/dist/op/activity-contracts.d.ts.map +1 -1
  121. package/dist/op/activity-contracts.js +19 -1
  122. package/dist/op/builders.d.ts +7 -1
  123. package/dist/op/builders.d.ts.map +1 -1
  124. package/dist/op/builders.js +9 -0
  125. package/dist/pin/edit.d.ts.map +1 -1
  126. package/dist/pin/edit.js +35 -0
  127. package/dist/pin/rollout.d.ts +2 -0
  128. package/dist/pin/rollout.d.ts.map +1 -1
  129. package/dist/pin/rollout.js +14 -11
  130. package/dist/plan-shape.d.ts +30 -0
  131. package/dist/plan-shape.d.ts.map +1 -0
  132. package/dist/plan-shape.js +125 -0
  133. package/dist/plugin.d.ts.map +1 -1
  134. package/dist/plugin.js +32 -18
  135. package/dist/report.d.ts +216 -0
  136. package/dist/report.d.ts.map +1 -0
  137. package/dist/report.js +666 -0
  138. package/dist/skills/chant-terraform.md +1 -1
  139. package/dist/state/azure-blob.d.ts +68 -0
  140. package/dist/state/azure-blob.d.ts.map +1 -0
  141. package/dist/state/azure-blob.js +201 -0
  142. package/dist/state/backend.d.ts +158 -0
  143. package/dist/state/backend.d.ts.map +1 -0
  144. package/dist/state/backend.js +406 -0
  145. package/dist/state/exec.d.ts +39 -0
  146. package/dist/state/exec.d.ts.map +1 -0
  147. package/dist/state/exec.js +80 -0
  148. package/dist/state/gcs.d.ts +62 -0
  149. package/dist/state/gcs.d.ts.map +1 -0
  150. package/dist/state/gcs.js +224 -0
  151. package/dist/state/index.d.ts +15 -0
  152. package/dist/state/index.d.ts.map +1 -0
  153. package/dist/state/index.js +14 -0
  154. package/dist/state/locks.d.ts +105 -0
  155. package/dist/state/locks.d.ts.map +1 -0
  156. package/dist/state/locks.js +130 -0
  157. package/dist/state/object-store.d.ts +37 -0
  158. package/dist/state/object-store.d.ts.map +1 -0
  159. package/dist/state/object-store.js +20 -0
  160. package/dist/state/root-states.d.ts +131 -0
  161. package/dist/state/root-states.d.ts.map +1 -0
  162. package/dist/state/root-states.js +241 -0
  163. package/dist/state/s3.d.ts +68 -0
  164. package/dist/state/s3.d.ts.map +1 -0
  165. package/dist/state/s3.js +170 -0
  166. package/dist/state/store.d.ts +51 -0
  167. package/dist/state/store.d.ts.map +1 -0
  168. package/dist/state/store.js +185 -0
  169. package/dist/terragrunt/affected.d.ts.map +1 -1
  170. package/dist/terragrunt/affected.js +2 -1
  171. package/package.json +7 -3
  172. package/src/__fixtures__/ACCEPTANCE.md +69 -7
  173. package/src/__fixtures__/compose/apply-failed-in-app.jsonl +12 -0
  174. package/src/__fixtures__/compose/state-app.json +66 -0
  175. package/src/__fixtures__/compose/state-edge.json +40 -0
  176. package/src/__fixtures__/compose/state-net.json +58 -0
  177. package/src/__fixtures__/compose/three-app.plan.json +184 -0
  178. package/src/__fixtures__/compose/three-composed.plan.json +509 -0
  179. package/src/__fixtures__/compose/three-edge.plan.json +144 -0
  180. package/src/__fixtures__/compose/three-net.plan.json +174 -0
  181. package/src/__fixtures__/compose/unknown-composed.plan.json +228 -0
  182. package/src/__fixtures__/compose/working-after-apply.json +145 -0
  183. package/src/__fixtures__/config-blocks/app/main.tf +61 -0
  184. package/src/__fixtures__/config-blocks/app/modules/network/main.tf +4 -0
  185. package/src/__fixtures__/config-blocks/app-json/main.tf.json +39 -0
  186. package/src/__fixtures__/config-files/shadow/main.tf +3 -0
  187. package/src/__fixtures__/config-files/shadow/main.tofu +3 -0
  188. package/src/__fixtures__/config-files/shadow/other.tf +3 -0
  189. package/src/__fixtures__/config-files/tf/main.tf +11 -0
  190. package/src/__fixtures__/config-files/tf-json/main.tf.json +18 -0
  191. package/src/__fixtures__/config-files/tofu/main.tofu +11 -0
  192. package/src/__fixtures__/config-files/tofu-json/main.tofu.json +18 -0
  193. package/src/__fixtures__/config-files/tofu-only/main.tofu +3 -0
  194. package/src/__fixtures__/drift-record/README.md +11 -0
  195. package/src/__fixtures__/drift-record/live-plan-sections.json +27 -0
  196. package/src/__fixtures__/instance-forms/app/main.tf +110 -0
  197. package/src/__fixtures__/instance-forms/app/modules/svc/main.tf +3 -0
  198. package/src/__fixtures__/instance-vars/app/main.tf +52 -0
  199. package/src/__fixtures__/instance-vars/app/modules/app/main.tf +12 -0
  200. package/src/__fixtures__/instance-vars/app/modules/edge/main.tf +3 -0
  201. package/src/__fixtures__/instance-vars/app/terraform.tfvars +1 -0
  202. package/src/__fixtures__/live-module-keyed/live-graph.json +259 -0
  203. package/src/__fixtures__/live-module-keyed/live-plan.json +87 -0
  204. package/src/__fixtures__/live-module-keyed/root/estate.chdf.hcl +1 -0
  205. package/src/__fixtures__/live-module-keyed/root/main.tf +21 -0
  206. package/src/__fixtures__/live-module-keyed/root/modules/app/main.tf +17 -0
  207. package/src/__fixtures__/live-module-keyed/root/modules/edge/main.tf +7 -0
  208. package/src/__fixtures__/live-module-keyed/root/versions.tf +30 -0
  209. package/src/__fixtures__/live-module-keyed/show-state.json +146 -0
  210. package/src/__fixtures__/pr-loop/README.md +50 -0
  211. package/src/__fixtures__/pr-loop/chant.config.json +13 -0
  212. package/src/__fixtures__/pr-loop/estate.component.ts +10 -0
  213. package/src/__fixtures__/pr-loop/roots/a/main.tf +11 -0
  214. package/src/__fixtures__/pr-loop/roots/app/main.tf +19 -0
  215. package/src/__fixtures__/pr-loop/roots/b/main.tf +7 -0
  216. package/src/__fixtures__/pr-loop/roots/dns/main.tf +3 -0
  217. package/src/__fixtures__/pr-loop/roots/net/main.tf +7 -0
  218. package/src/__fixtures__/report/applied.show.json +51 -0
  219. package/src/__fixtures__/report/generate.ts +63 -0
  220. package/src/__fixtures__/report/plan.show.json +200 -0
  221. package/src/__fixtures__/report/tf-apply/change-set.json +170 -0
  222. package/src/__fixtures__/report/tf-apply/report.json +338 -0
  223. package/src/__fixtures__/report/tf-plan/change-set.json +170 -0
  224. package/src/__fixtures__/report/tf-plan/report.json +320 -0
  225. package/src/__fixtures__/three-cloud-azure.graph.json +290 -0
  226. package/src/applied-state.ts +52 -0
  227. package/src/backend-config.test.ts +105 -0
  228. package/src/backend-config.ts +133 -0
  229. package/src/behaviour/kinds.ts +4 -0
  230. package/src/behaviour/predict.ts +5 -2
  231. package/src/behaviour/reference-catalog.plugin.test.ts +65 -0
  232. package/src/behaviour/reference-catalog.ts +16 -5
  233. package/src/behaviour/request.ts +3 -2
  234. package/src/change-set-instances.test.ts +98 -0
  235. package/src/changed-roots.ts +14 -16
  236. package/src/commands.ts +84 -4
  237. package/src/components/capability-plugin.test.ts +172 -5
  238. package/src/components/capability-plugin.ts +212 -11
  239. package/src/components/change-set-graph.e2e.test.ts +11 -5
  240. package/src/components/compose-group.test.ts +486 -0
  241. package/src/components/compose-group.ts +489 -0
  242. package/src/components/demo-composed-roots.e2e.test.ts +440 -0
  243. package/src/components/member-outputs.test.ts +76 -0
  244. package/src/components/placeholder-preview.test.ts +147 -0
  245. package/src/components/placeholder-preview.ts +257 -0
  246. package/src/components/pr-loop-compose.tofu.e2e.test.ts +363 -0
  247. package/src/components/pr-loop.tofu.test.ts +112 -56
  248. package/src/compose/apply-events.test.ts +62 -0
  249. package/src/compose/apply-events.ts +100 -0
  250. package/src/compose/estate.choudoufu.e2e.test.ts +112 -0
  251. package/src/compose/estate.test.ts +421 -0
  252. package/src/compose/estate.ts +443 -0
  253. package/src/compose/hcl.ts +311 -0
  254. package/src/compose/module-address.ts +49 -0
  255. package/src/compose/root.test.ts +416 -0
  256. package/src/compose/root.ts +592 -0
  257. package/src/compose/run.test.ts +440 -0
  258. package/src/compose/run.tofu.test.ts +176 -0
  259. package/src/compose/run.ts +527 -0
  260. package/src/compose/slice.test.ts +184 -0
  261. package/src/compose/slice.ts +290 -0
  262. package/src/compose/state-address.ts +157 -0
  263. package/src/compose/state-merge.test.ts +131 -0
  264. package/src/compose/state-merge.ts +148 -0
  265. package/src/compose.test.ts +248 -0
  266. package/src/compose.ts +627 -0
  267. package/src/composites/terraform-apply-op.test.ts +9 -0
  268. package/src/composites/terraform-apply-op.ts +7 -3
  269. package/src/composites/terraform-pin-rollout-op.test.ts +2 -2
  270. package/src/config-file-listers.test.ts +265 -0
  271. package/src/config.ts +44 -9
  272. package/src/describe-resources.engine-facts.test.ts +412 -0
  273. package/src/describe-resources.live-module-keyed.test.ts +290 -0
  274. package/src/describe-resources.ts +416 -70
  275. package/src/drift-read.ts +284 -0
  276. package/src/drift-record.test.ts +223 -0
  277. package/src/drift-record.ts +455 -0
  278. package/src/hcl/config-blocks.test.ts +174 -0
  279. package/src/hcl/edges.ts +21 -1
  280. package/src/hcl/files.ts +234 -0
  281. package/src/hcl/instance-forms.test.ts +94 -0
  282. package/src/hcl/instances.test.ts +137 -0
  283. package/src/hcl/instances.ts +422 -0
  284. package/src/hcl/parse.test.ts +139 -1
  285. package/src/hcl/parse.ts +149 -16
  286. package/src/hcl/roots.ts +6 -0
  287. package/src/hcl/suppressions.ts +8 -2
  288. package/src/index.ts +76 -0
  289. package/src/live-plan-reasons.ts +54 -0
  290. package/src/lsp/completions.test.ts +1 -1
  291. package/src/lsp/option-keys.ts +2 -0
  292. package/src/op/activities/choudoufu-plan-set-op.test.ts +111 -0
  293. package/src/op/activities/index.ts +9 -0
  294. package/src/op/activities/live-detect.ts +55 -26
  295. package/src/op/activities/pin-rollout.ts +3 -0
  296. package/src/op/activities/registry.test.ts +2 -1
  297. package/src/op/activities/terraform.test.ts +55 -0
  298. package/src/op/activities/terraform.ts +266 -22
  299. package/src/op/activity-contracts.test.ts +1 -0
  300. package/src/op/activity-contracts.ts +24 -1
  301. package/src/op/builders.ts +14 -0
  302. package/src/pin/bundle.test.ts +2 -0
  303. package/src/pin/edit.ts +30 -0
  304. package/src/pin/rollout.ts +16 -11
  305. package/src/plan-shape.test.ts +148 -0
  306. package/src/plan-shape.ts +128 -0
  307. package/src/plugin.ts +33 -19
  308. package/src/report.test.ts +423 -0
  309. package/src/report.ts +752 -0
  310. package/src/signal-only-root.test.ts +72 -0
  311. package/src/skills/chant-terraform.md +1 -1
  312. package/src/state/azure-blob.ts +223 -0
  313. package/src/state/backend-verdict.test.ts +187 -0
  314. package/src/state/backend.test.ts +127 -0
  315. package/src/state/backend.ts +488 -0
  316. package/src/state/exec.ts +111 -0
  317. package/src/state/gcs.ts +254 -0
  318. package/src/state/index.ts +15 -0
  319. package/src/state/locks.test.ts +84 -0
  320. package/src/state/locks.ts +201 -0
  321. package/src/state/object-store.ts +35 -0
  322. package/src/state/root-states-floci.e2e.test.ts +66 -0
  323. package/src/state/root-states.test.ts +462 -0
  324. package/src/state/root-states.ts +309 -0
  325. package/src/state/s3.ts +193 -0
  326. package/src/state/store.ts +225 -0
  327. package/src/terragrunt/affected.ts +2 -1
  328. package/src/workspace-kinds.test.ts +4 -17
  329. package/workspace-kinds.json +1 -24
  330. package/dist/workspace-member.d.ts +0 -30
  331. package/dist/workspace-member.d.ts.map +0 -1
  332. package/dist/workspace-member.js +0 -91
  333. package/schemas/pulumi.schema.json +0 -34
  334. package/src/testdata/pulumi-member/Pulumi.yaml +0 -2
  335. package/src/testdata/pulumi-member/stack-export.json +0 -53
  336. package/src/testdata/pulumi-unexported/Pulumi.yaml +0 -2
  337. package/src/workspace-member.test.ts +0 -89
  338. package/src/workspace-member.ts +0 -126
@@ -0,0 +1,302 @@
1
+ /**
2
+ * The HCL a composition reads from a root's files (chant#4438): its backend
3
+ * and the state that backend names, its `terraform_remote_state` and
4
+ * `terraform_estate_outputs` reads, its `live` estate, the providers its lock
5
+ * file pins, and the local modules it calls.
6
+ *
7
+ * Lifted from terragucci at c493e0e (`compose.ts` `blankComments`,
8
+ * `lockedProviders`, `localModules`, `importLiteral`, `jsonBlocks`;
9
+ * `detect.ts` `blockBody`, `hclAttr`, `stateOf`, `estateOf`,
10
+ * `estateOutputReads`, `liveRoots`; `linked.ts` `configFiles`), reading a
11
+ * root's `-backend-config` from `terraform.roots.<name>.backendConfig` where
12
+ * terragucci read `TF_CLI_ARGS_init`. Regex over text with comments blanked,
13
+ * as there: no HCL parse runs.
14
+ */
15
+ import { existsSync, readFileSync } from "node:fs";
16
+ import { join, relative, resolve } from "node:path";
17
+ import { isJsonConfigFile, listConfigFilesSafe } from "../hcl/files.js";
18
+ import { literal, stateAddress } from "./state-address.js";
19
+ import { readBackend } from "../state/backend.js";
20
+ /**
21
+ * HCL text with its comments blanked to spaces, newlines kept, so every
22
+ * position in it is the same position in the text as written. Strings and
23
+ * their escapes are read through, so a `#` or `//` in one stays.
24
+ */
25
+ export function blankComments(text) {
26
+ const out = text.split("");
27
+ let inString = false;
28
+ for (let i = 0; i < text.length; i++) {
29
+ const c = text[i];
30
+ if (inString) {
31
+ if (c === "\\")
32
+ i++;
33
+ else if (c === '"')
34
+ inString = false;
35
+ continue;
36
+ }
37
+ if (c === '"')
38
+ inString = true;
39
+ else if (c === "#" || (c === "/" && text[i + 1] === "/")) {
40
+ for (; i < text.length && text[i] !== "\n"; i++)
41
+ out[i] = " ";
42
+ }
43
+ else if (c === "/" && text[i + 1] === "*") {
44
+ const end = text.indexOf("*/", i + 2);
45
+ const stop = end < 0 ? text.length : end + 2;
46
+ for (; i < stop; i++)
47
+ if (text[i] !== "\n")
48
+ out[i] = " ";
49
+ i--;
50
+ }
51
+ }
52
+ return out.join("");
53
+ }
54
+ /** The text of the block that starts at `start`: up to the brace that closes its first `{`. */
55
+ export function blockBody(text, start) {
56
+ let depth = 0;
57
+ for (let i = text.indexOf("{", start); i >= 0 && i < text.length; i++) {
58
+ if (text[i] === "{")
59
+ depth++;
60
+ else if (text[i] === "}" && --depth === 0)
61
+ return text.slice(start, i + 1);
62
+ }
63
+ return text.slice(start);
64
+ }
65
+ /**
66
+ * An HCL block's attribute: its string, `null` when it is written as anything
67
+ * but a plain string, undefined when it is not written.
68
+ */
69
+ export const hclAttr = (body) => (name) => {
70
+ const m = body.match(new RegExp(`(?<![\\w.-])${name}\\s*=(?!=)\\s*(.)`));
71
+ if (!m)
72
+ return undefined;
73
+ if (m[1] !== '"')
74
+ return null;
75
+ const start = m.index + m[0].length;
76
+ let out = "";
77
+ for (let i = start; i < body.length; i++) {
78
+ if (body[i] === "\\") {
79
+ out += body[++i] ?? "";
80
+ continue;
81
+ }
82
+ if (body[i] === '"')
83
+ return literal(out) ?? null;
84
+ out += body[i];
85
+ }
86
+ return null;
87
+ };
88
+ /**
89
+ * A root's own configuration files, not its modules', as paths: the set the
90
+ * root's `binary` reads (`.tf` and `.tf.json`, plus `.tofu` and `.tofu.json`
91
+ * for tofu or choudoufu), from the lexicon's one lister (chant#4457).
92
+ */
93
+ export function configFiles(dir, binary) {
94
+ return listConfigFilesSafe(dir, binary).map((n) => join(dir, n));
95
+ }
96
+ /** The text of a root's own configuration files, comments blanked so positions still match. */
97
+ export function rootTexts(dir, binary) {
98
+ return configFiles(dir, binary).map((f) => {
99
+ const raw = readFileSync(f, "utf-8");
100
+ const json = isJsonConfigFile(f);
101
+ return { file: f, text: json ? raw : blankComments(raw), json };
102
+ });
103
+ }
104
+ const objectOf = (v) => (v && typeof v === "object" && !Array.isArray(v) ? v : undefined);
105
+ /** A block in Terraform's JSON syntax: an object, or a list of objects whose first is taken. */
106
+ const firstOf = (v) => objectOf(Array.isArray(v) ? v[0] : v);
107
+ const parseJson = (text) => {
108
+ try {
109
+ return JSON.parse(text);
110
+ }
111
+ catch {
112
+ return undefined;
113
+ }
114
+ };
115
+ /** The blocks of a kind in a JSON-syntax file: `{"import": [...]}` or `{"import": {...}}`. */
116
+ export function jsonBlocks(doc, kind) {
117
+ const v = objectOf(doc)?.[kind];
118
+ if (Array.isArray(v))
119
+ return v.filter((x) => !!x && typeof x === "object");
120
+ return v && typeof v === "object" ? [v] : [];
121
+ }
122
+ const asKey = (a) => ("unresolved" in a ? undefined : a);
123
+ /** A backend configuration value as an address part: a plain string, `null` for anything else written, undefined for none. */
124
+ const configValue = (v) => {
125
+ if (v === undefined || v === null)
126
+ return undefined;
127
+ if (typeof v === "number" || typeof v === "boolean")
128
+ return String(v);
129
+ return literal(v) ?? null;
130
+ };
131
+ /**
132
+ * The state the root at `dir` keeps, and the states its
133
+ * `terraform_remote_state` blocks read. `rel` is the root's directory
134
+ * relative to the project, which a `local` path resolves against.
135
+ *
136
+ * Which backend and which configuration name the root's own state is
137
+ * state/backend.ts's {@link readBackend} verdict (chant#4478): the code with
138
+ * the `-backend-config` flags of `TF_CLI_ARGS`, `TF_CLI_ARGS_init`,
139
+ * `backendConfigFiles` and `backendConfig` over it, and what `init` recorded
140
+ * once it has run. A key neither gives is read from the code's own block,
141
+ * which still names nested ones (a `cloud` or `remote` backend's
142
+ * `workspaces`). An address the code does not spell in plain strings is left
143
+ * out, so nothing lines up with it.
144
+ */
145
+ export function rootState(dir, rel, input = {}) {
146
+ const out = { reads: [] };
147
+ // The code's own backend block, the first one as declaredBackend reads it: its type and attributes.
148
+ let code;
149
+ for (const { text, json } of rootTexts(dir, input.binary)) {
150
+ if (json) {
151
+ const doc = parseJson(text);
152
+ for (const t of jsonBlocks(doc, "terraform")) {
153
+ if (code)
154
+ break;
155
+ if (t.cloud !== undefined) {
156
+ const b = firstOf(t.cloud);
157
+ code = { type: "cloud", get: (n) => literal(b?.[n] ?? firstOf(b?.workspaces)?.[n]) };
158
+ break;
159
+ }
160
+ const [type, v] = Object.entries(objectOf(t.backend) ?? {})[0] ?? [];
161
+ if (!type)
162
+ continue;
163
+ const b = firstOf(v);
164
+ code = { type, get: (n) => literal(b?.[n] ?? firstOf(b?.workspaces)?.[n]) };
165
+ }
166
+ for (const d of jsonBlocks(doc, "data")) {
167
+ for (const [name, v] of Object.entries(objectOf(d.terraform_remote_state) ?? {})) {
168
+ const b = firstOf(v);
169
+ const config = objectOf(b?.config);
170
+ const type = literal(b?.backend);
171
+ if (!config || typeof type !== "string")
172
+ continue;
173
+ const key = asKey(stateAddress(type, (n) => literal(config[n] ?? firstOf(config.workspaces)?.[n]), rel));
174
+ if (key)
175
+ out.reads.push({ name, ...key, repeated: b?.count !== undefined || b?.for_each !== undefined });
176
+ }
177
+ }
178
+ continue;
179
+ }
180
+ if (!code) {
181
+ const m = text.match(/\bbackend\s+"([^"]+)"\s*\{/);
182
+ if (m)
183
+ code = { type: m[1], get: hclAttr(blockBody(text, m.index)) };
184
+ else {
185
+ const c = /^\s*cloud\s*\{/m.exec(text);
186
+ if (c)
187
+ code = { type: "cloud", get: hclAttr(blockBody(text, c.index)) };
188
+ }
189
+ }
190
+ for (const m of text.matchAll(/\bdata\s+"terraform_remote_state"\s+"([^"]+)"\s*\{/g)) {
191
+ const body = blockBody(text, m.index);
192
+ const type = hclAttr(body)("backend");
193
+ if (typeof type !== "string")
194
+ continue;
195
+ const config = /\bconfig\s*=\s*\{/.exec(body);
196
+ const get = config ? hclAttr(blockBody(body, config.index)) : () => undefined;
197
+ const key = asKey(stateAddress(type, get, rel));
198
+ if (key)
199
+ out.reads.push({ name: m[1], ...key, repeated: /^\s*(count|for_each)\s*=/m.test(body) });
200
+ }
201
+ }
202
+ const { backend } = readBackend(dir, input);
203
+ const fromCode = code?.type === backend.type ? code.get : () => undefined;
204
+ const get = (n) => configValue(backend.config[n] ?? objectOf(backend.config.workspaces)?.[n]) ?? fromCode(n);
205
+ out.own = asKey(stateAddress(backend.type, get, rel));
206
+ return out;
207
+ }
208
+ /** Two addresses name one state: the same key, and the same bucket where both name one. */
209
+ export const sameState = (a, b) => a.key === b.key && (!a.bucket || !b.bucket || a.bucket === b.bucket);
210
+ const LIVE_SIDECAR = "estate.chdf.hcl";
211
+ /**
212
+ * A choudoufu root's estate, from its `estate.chdf.hcl` or the `live` block in
213
+ * its `terraform` block; undefined when it declares none. A `live` block takes
214
+ * effect only under choudoufu, so the files read are the ones choudoufu reads
215
+ * unless `binary` names another.
216
+ */
217
+ export function liveEstate(dir, binary = "choudoufu") {
218
+ const sidecar = join(dir, LIVE_SIDECAR);
219
+ if (existsSync(sidecar)) {
220
+ const estate = hclAttr(blankComments(readFileSync(sidecar, "utf-8")))("estate");
221
+ return { live: true, ...(typeof estate === "string" ? { estate } : {}) };
222
+ }
223
+ for (const { text, json } of rootTexts(dir, binary)) {
224
+ if (json)
225
+ continue;
226
+ for (const t of text.matchAll(/^\s*terraform\s*\{/gm)) {
227
+ const body = blockBody(text, t.index);
228
+ const live = body.match(/\blive\s*\{/);
229
+ if (!live)
230
+ continue;
231
+ const estate = hclAttr(blockBody(body, live.index))("estate");
232
+ return { live: true, ...(typeof estate === "string" ? { estate } : {}) };
233
+ }
234
+ }
235
+ return { live: false };
236
+ }
237
+ /** Each `data "terraform_estate_outputs"` block of a root: its label and the estate whose outputs it reads. */
238
+ export function estateOutputReads(dir, binary) {
239
+ const out = [];
240
+ for (const { text, json } of rootTexts(dir, binary)) {
241
+ if (json)
242
+ continue;
243
+ for (const m of text.matchAll(/\bdata\s+"terraform_estate_outputs"\s+"([^"]+)"\s*\{/g)) {
244
+ const e = hclAttr(blockBody(text, m.index))("estate");
245
+ if (typeof e === "string")
246
+ out.push({ name: m[1], estate: e });
247
+ }
248
+ }
249
+ return out;
250
+ }
251
+ /** The provider versions a root's lock file pins, by provider address. */
252
+ export function lockedProviders(dir) {
253
+ const out = new Map();
254
+ let text = "";
255
+ try {
256
+ text = readFileSync(join(dir, ".terraform.lock.hcl"), "utf-8");
257
+ }
258
+ catch {
259
+ return out;
260
+ }
261
+ for (const m of text.matchAll(/^provider\s+"([^"]+)"\s*\{/gm)) {
262
+ const v = blockBody(text, m.index).match(/\bversion\s*=\s*"([^"]+)"/)?.[1];
263
+ if (v)
264
+ out.set(m[1], v);
265
+ }
266
+ return out;
267
+ }
268
+ /** Local module directories the root at `dir` calls (`source = "./..."` or `"../..."`), followed through, absolute. */
269
+ export function localModules(dir, binary) {
270
+ const seen = new Set();
271
+ const queue = [resolve(dir)];
272
+ while (queue.length > 0) {
273
+ const at = queue.pop();
274
+ for (const { text, json } of rootTexts(at, binary)) {
275
+ if (json)
276
+ continue;
277
+ for (const m of text.matchAll(/\bmodule\s+"[^"]+"\s*\{/g)) {
278
+ const src = blockBody(text, m.index).match(/\bsource\s*=\s*"(\.{1,2}\/[^"]*)"/)?.[1];
279
+ if (!src)
280
+ continue;
281
+ const abs = resolve(at, src);
282
+ if (seen.has(abs) || abs === resolve(dir))
283
+ continue;
284
+ seen.add(abs);
285
+ queue.push(abs);
286
+ }
287
+ }
288
+ }
289
+ return [...seen].sort();
290
+ }
291
+ /** `abs` relative to `from`, with `/` between parts, `.` for `from` itself. */
292
+ export const relPath = (from, abs) => relative(from, abs).split("\\").join("/") || ".";
293
+ /** An `import` block the composed root can take as it is: a literal string id, no for_each, no provider of the root's own. */
294
+ export function importLiteral(body) {
295
+ if (/^\s*(for_each|provider)\s*=/m.test(body))
296
+ return false;
297
+ return /^\s*id\s*=\s*"(?:[^"\\$%]|\\.)*"\s*$/m.test(body);
298
+ }
299
+ /** Whether a JSON-syntax `import` block takes no literal string id (or has for_each or a provider). */
300
+ export function jsonImportRefused(text) {
301
+ return jsonBlocks(parseJson(text), "import").some((b) => typeof b.id !== "string" || /\$\{|%\{/.test(b.id) || b.for_each !== undefined || b.provider !== undefined);
302
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Addresses in a composed root (chant#4442): each member a top-level
3
+ * `module.<m>` call, so a member's addresses are the composed root's with
4
+ * `module.<m>.` taken off. `chant terraform report` (../report.ts) and the
5
+ * composed run's slicer (./slice.ts) and state split (./state-merge.ts) all
6
+ * strip with these functions, so there is one implementation.
7
+ */
8
+ type Json = Record<string, unknown>;
9
+ /** The top-level module an address or module address is in, or undefined for the composed root's own. */
10
+ export declare function topModule(address: string): string | undefined;
11
+ /** `address` with its leading `module.<m>` (and index) taken off. An address in no module is returned as it is. */
12
+ export declare function stripModule(address: string): string;
13
+ /** Whether `address` is `module.<m>` or inside it. */
14
+ export declare const inModule: (address: string | undefined, m: string) => boolean;
15
+ /**
16
+ * A `resource_changes` (or `resource_drift`) entry with its top module taken
17
+ * off `address`, `previous_address` and `module_address`. A module address
18
+ * that was the top module itself is dropped, as a root planned alone has none.
19
+ */
20
+ export declare function stripChange(rc: Json): Json;
21
+ /** The entries of a `resource_changes` list in module `m` (undefined: the composed root's own), each stripped. */
22
+ export declare function moduleChanges(list: unknown, m: string | undefined): Json[];
23
+ export {};
24
+ //# sourceMappingURL=module-address.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-address.d.ts","sourceRoot":"","sources":["../../src/compose/module-address.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAMpC,yGAAyG;AACzG,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE7D;AAED,mHAAmH;AACnH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,sDAAsD;AACtD,eAAO,MAAM,QAAQ,YAAa,MAAM,GAAG,SAAS,KAAK,MAAM,KAAG,OAA4D,CAAC;AAE/H;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,IAAI,GAAG,IAAI,CAS1C;AAED,kHAAkH;AAClH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE,CAG1E"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Addresses in a composed root (chant#4442): each member a top-level
3
+ * `module.<m>` call, so a member's addresses are the composed root's with
4
+ * `module.<m>.` taken off. `chant terraform report` (../report.ts) and the
5
+ * composed run's slicer (./slice.ts) and state split (./state-merge.ts) all
6
+ * strip with these functions, so there is one implementation.
7
+ */
8
+ const isObject = (v) => v !== null && typeof v === "object" && !Array.isArray(v);
9
+ const TOP_MODULE = /^module\.([^.[\]]+)(?:\[(?:"(?:[^"\\]|\\.)*"|\d+)\])?(?:\.|$)/;
10
+ /** The top-level module an address or module address is in, or undefined for the composed root's own. */
11
+ export function topModule(address) {
12
+ return TOP_MODULE.exec(address)?.[1];
13
+ }
14
+ /** `address` with its leading `module.<m>` (and index) taken off. An address in no module is returned as it is. */
15
+ export function stripModule(address) {
16
+ const m = TOP_MODULE.exec(address);
17
+ return m ? address.slice(m[0].length) : address;
18
+ }
19
+ /** Whether `address` is `module.<m>` or inside it. */
20
+ export const inModule = (address, m) => address !== undefined && topModule(address) === m;
21
+ /**
22
+ * A `resource_changes` (or `resource_drift`) entry with its top module taken
23
+ * off `address`, `previous_address` and `module_address`. A module address
24
+ * that was the top module itself is dropped, as a root planned alone has none.
25
+ */
26
+ export function stripChange(rc) {
27
+ const out = { ...rc, address: stripModule(String(rc.address)) };
28
+ if (typeof rc.previous_address === "string")
29
+ out.previous_address = stripModule(rc.previous_address);
30
+ if (typeof rc.module_address === "string") {
31
+ const rest = stripModule(rc.module_address);
32
+ if (rest === "" || rest === rc.module_address)
33
+ delete out.module_address;
34
+ else
35
+ out.module_address = rest;
36
+ }
37
+ return out;
38
+ }
39
+ /** The entries of a `resource_changes` list in module `m` (undefined: the composed root's own), each stripped. */
40
+ export function moduleChanges(list, m) {
41
+ const changes = Array.isArray(list) ? list : [];
42
+ return changes.filter((r) => isObject(r) && topModule(String(r.module_address ?? r.address ?? "")) === m).map(stripChange);
43
+ }
@@ -0,0 +1,127 @@
1
+ /**
2
+ * The composed root (chant#4441, epic #4419): the temporary root a composed
3
+ * run plans, one `module` call per member, written into the checkout under
4
+ * `.chant-compose/`, and every file put back once the run ends.
5
+ *
6
+ * Lifted from terragucci's `packages/terragucci/src/compose.ts` at c493e0e
7
+ * (the composed root section: `writeComposedRoot`, `writeEstateRoot`,
8
+ * `unionLock`, `liftBlock`, `rewriteJson`, `hclAttributes`, `cliVarFiles`,
9
+ * `withoutVarFiles`, `rootVarValues`, `declaredVariables`,
10
+ * `declaredOutputs`; `linked.ts` `refRe`, `hclValue`), taking the
11
+ * {@link Composition} of `../compose.ts` (#4438). What changed:
12
+ *
13
+ * - The directory is `.chant-compose/` and the file each root gains is
14
+ * `chant_compose.tf`; a read becomes `var.chant_read_<label>` (#4419
15
+ * ruling 5).
16
+ * - A member is a component; its root's directory is `Composition.dirs`, so a
17
+ * module's `source` is that directory relative to the composed root.
18
+ * - A root's var files are `terraform.roots.<name>.varFiles` as well as its
19
+ * tfvars, auto tfvars and `TF_CLI_ARGS` `-var-file`s, and its step's
20
+ * `vars` win over all of them, as `-var` does today.
21
+ * - A `stackOutput()` in a member's `vars` that names another member becomes
22
+ * `module.<upstream>.<output>`; one that names a component outside the
23
+ * group stays the literal value the step would pass.
24
+ * - A write that throws partway puts back what it changed before it throws,
25
+ * and each root file is kept as bytes, so `restore()` leaves it identical.
26
+ *
27
+ * While a root is composed its `backend` block, its `terraform_remote_state`
28
+ * blocks that read another member, and its `import` and `removed` blocks are
29
+ * cut from its files. `moved` blocks stay: a module takes them.
30
+ */
31
+ import { type DriverComponent } from "@intentius/chant/components/driver";
32
+ import type { Composition } from "../compose.js";
33
+ import type { TerraformConfig } from "../config.js";
34
+ import { type RootText } from "./hcl.js";
35
+ /** Where the composed root is written, in the checkout (#4419 ruling 5). */
36
+ export declare const COMPOSE_DIR = ".chant-compose";
37
+ /** The file a composed run adds to each root it composes, declaring the variables its reads become. */
38
+ export declare const COMPOSE_FILE = "chant_compose.tf";
39
+ /** The prefix of the variable a member's read of another member becomes. */
40
+ export declare const READ_VAR_PREFIX = "chant_read_";
41
+ /** The top-level `name = expression` attributes of an HCL attribute file (a `.tfvars`), comments blanked. */
42
+ export declare function hclAttributes(text: string): Map<string, string>;
43
+ /** A JSON value as an HCL expression. */
44
+ export declare function hclValue(value: unknown): string;
45
+ /** A reference to the `terraform_remote_state` block `name`, not to one whose label starts with it. */
46
+ export declare const refRe: (name: string, flags?: string) => RegExp;
47
+ /** A root's declared variables: the type expression and whether it is sensitive. */
48
+ export declare function declaredVariables(texts: readonly Pick<RootText, "text" | "json">[]): Map<string, {
49
+ type?: string;
50
+ sensitive: boolean;
51
+ }>;
52
+ /** A root's outputs and whether each is sensitive. */
53
+ export declare function declaredOutputs(texts: readonly Pick<RootText, "text" | "json">[]): Map<string, boolean>;
54
+ /** The `-var-file` paths `TF_CLI_ARGS` and `TF_CLI_ARGS_plan` name, as the binary reads them, relative to the root. */
55
+ export declare function cliVarFiles(env: NodeJS.ProcessEnv): string[];
56
+ /** `env` with the `-var-file` flags taken out of `TF_CLI_ARGS` and `TF_CLI_ARGS_plan`: the composed run passes those files' values as module arguments. */
57
+ export declare function withoutVarFiles(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
58
+ /**
59
+ * A root's variable values as the binary would read them, by name, each an
60
+ * HCL expression: its tfvars files, its auto tfvars files, the `TF_CLI_ARGS`
61
+ * `-var-file`s, then `varFiles` (the `-var-file`s chant passes), later over
62
+ * earlier.
63
+ */
64
+ export declare function rootVarValues(dir: string, env: NodeJS.ProcessEnv, varFiles?: readonly string[]): Map<string, string>;
65
+ /** Each member's `terraform-apply` step `vars`, as written, for {@link ComposedRootInput.vars}. */
66
+ export declare function memberVars(components: readonly DriverComponent[], c: Pick<Composition, "members">): Record<string, Record<string, unknown>>;
67
+ /** The composed root as written: what to put back, and the generated files that join its digest. */
68
+ export interface ComposedRoot {
69
+ /** The composed root's directory, absolute. */
70
+ dir: string;
71
+ /** The root files rewritten while the run lasts, relative to the project, sorted. {@link restore} puts each back. */
72
+ rewritten: string[];
73
+ /** sha256 of each generated file, by its path relative to the project, sorted. The run binds them (#4440, #4444). */
74
+ generated: [string, string][];
75
+ /** Each member's outputs, by component, and whether each is sensitive. The composed root re-exports each as `<module>__<name>`. */
76
+ outputs: Map<string, Map<string, boolean>>;
77
+ /** Put every root file back as it was and take the generated files away. Safe to call more than once. */
78
+ restore: () => void;
79
+ }
80
+ export interface ComposedRootInput {
81
+ /** The checkout's root: where `chant.config.*` was loaded from. `.chant-compose/` is written here. */
82
+ projectRoot: string;
83
+ /** What `compositionFor` answered, with members. */
84
+ composition: Composition;
85
+ /** The config's `terraform` namespace: each root's `varFiles`. */
86
+ terraform: TerraformConfig;
87
+ /** The environment the run has: `TF_CLI_ARGS*` `-var-file`s and `TF_VAR_*` are read from it. */
88
+ env: NodeJS.ProcessEnv;
89
+ /** Each member's step `vars` as written, by component ({@link memberVars}). `$env.*` strings are taken as they are. */
90
+ vars?: Readonly<Record<string, Record<string, unknown> | undefined>>;
91
+ /** The outputs of components outside the group that a member's `vars` read. */
92
+ componentOutputs?: Record<string, Record<string, unknown>>;
93
+ /** How a file is written. Default `writeFileSync`; a test injects a failure here. Putting files back always uses `writeFileSync`. */
94
+ write?: (file: string, text: string) => void;
95
+ }
96
+ /**
97
+ * Write the composed root of `composition` into `.chant-compose/` and rewrite
98
+ * each member: its backend block cut, its `terraform_remote_state` reads of
99
+ * other members cut and their references turned into a variable the composed
100
+ * root fills with `{ outputs = module.<upstream> }`, and its `import` and
101
+ * `removed` blocks lifted into the composed root with `module.<m>.` in front
102
+ * of their addresses. Each root's variable values, then its step's `vars`,
103
+ * become the module's arguments. Throws, changing nothing, when a root
104
+ * already has a `chant_compose.tf`; throws after putting everything back
105
+ * when a write fails partway.
106
+ */
107
+ export declare function writeComposedRoot(input: ComposedRootInput): ComposedRoot;
108
+ /** An `import` or `removed` block of module `m`, lifted into the composed root: its address with `module.<m>.` in front. */
109
+ export declare function liftBlock(body: string, kind: "import" | "removed", m: string): string;
110
+ /** A JSON-syntax file rewritten as {@link writeComposedRoot} rewrites HCL: its backend, its reads of members, and its import and removed blocks out. */
111
+ export declare function rewriteJson(raw: string, reads: readonly {
112
+ name: string;
113
+ }[], m: string, lifted: string[]): string;
114
+ /** The union of the roots' `.terraform.lock.hcl`: one block per provider, with every hash any root's file holds for it. */
115
+ export declare function unionLock(dirs: readonly string[]): string | undefined;
116
+ /**
117
+ * The composed root of an estate run (`Composition.estate`), written into
118
+ * `.chant-compose/`: one `module` call per estate whose `source` is the
119
+ * estate's own directory and nothing else, and each estate's outputs
120
+ * re-exported as `<module>__<name>`, which is where the plan shows what an
121
+ * estate's output will be. No estate file is changed, so `restore()` only
122
+ * takes the generated files away. choudoufu reads each called directory's
123
+ * own `live` block, and resolves a `terraform_estate_outputs` read of
124
+ * another estate inside the run.
125
+ */
126
+ export declare function writeEstateRoot(input: Pick<ComposedRootInput, "projectRoot" | "composition" | "write">): ComposedRoot;
127
+ //# sourceMappingURL=root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/compose/root.ts"],"names":[],"mappings":"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"}