@intentius/behold 0.8.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/AGENTS.md +85 -0
  2. package/README.md +124 -2
  3. package/demos.json +17 -1
  4. package/dist/cli.js +2553 -315
  5. package/example-argo-estate/README.md +43 -18
  6. package/example-argo-estate/app-a/chant.config.ts +10 -2
  7. package/example-argo-estate/app-a/package.json +2 -2
  8. package/example-argo-estate/app-b/chant.config.ts +11 -2
  9. package/example-argo-estate/app-b/package.json +2 -2
  10. package/example-argo-estate/control-plane/chant.config.ts +20 -5
  11. package/example-argo-estate/control-plane/package.json +2 -2
  12. package/example-argo-estate/package-lock.json +20 -20
  13. package/example-carve/README.md +221 -0
  14. package/example-carve/app/chant.config.ts +6 -0
  15. package/example-carve/app/package-lock.json +1075 -0
  16. package/example-carve/app/package.json +13 -0
  17. package/example-carve/app/src/carved.ts +30 -0
  18. package/example-carve/app/tsconfig.json +1 -0
  19. package/example-carve/carve-report.json +962 -0
  20. package/example-carve/legacy-tf/cdn.tf +23 -0
  21. package/example-carve/legacy-tf/compute.tf +63 -0
  22. package/example-carve/legacy-tf/floci-override.tf.disabled +61 -0
  23. package/example-carve/legacy-tf/modules/cdn/main.tf +72 -0
  24. package/example-carve/legacy-tf/naming.tf +10 -0
  25. package/example-carve/legacy-tf/network.tf +119 -0
  26. package/example-carve/legacy-tf/observability.tf +18 -0
  27. package/example-carve/legacy-tf/outputs.tf +21 -0
  28. package/example-carve/legacy-tf/storage.tf +33 -0
  29. package/example-carve/legacy-tf/terraform.tfstate +602 -0
  30. package/example-carve/legacy-tf/versions.tf +40 -0
  31. package/example-flux-estate/README.md +9 -4
  32. package/example-flux-estate/app-a/package.json +2 -2
  33. package/example-flux-estate/app-a/src/app.ts +2 -1
  34. package/example-flux-estate/app-b/chant.config.ts +4 -3
  35. package/example-flux-estate/app-b/package.json +2 -2
  36. package/example-flux-estate/app-b/src/app.ts +5 -3
  37. package/example-flux-estate/control-plane/package.json +2 -2
  38. package/example-flux-estate/control-plane/src/flux.ts +4 -2
  39. package/example-flux-estate/package-lock.json +20 -20
  40. package/example-k8s/package-lock.json +21 -21
  41. package/example-k8s/package.json +3 -3
  42. package/example-writes/package-lock.json +14 -14
  43. package/example-writes/package.json +3 -3
  44. package/package.json +8 -6
  45. package/web/app.js +714 -57
  46. package/web/carve-steps.js +621 -0
  47. package/web/carve-steps.test.js +248 -0
  48. package/web/demos.js +71 -0
  49. package/web/demos.test.js +83 -0
  50. package/web/index.html +93 -1
  51. package/web/json-view.js +334 -0
  52. package/web/json-view.test.js +218 -0
  53. package/web/layout-store.js +164 -4
  54. package/web/layout-store.test.js +226 -1
  55. package/web/panel.js +28 -0
  56. package/web/theme.js +57 -1
@@ -0,0 +1,962 @@
1
+ {
2
+ "version": 1,
3
+ "from": "example-carve/legacy-tf",
4
+ "advisory": "read-only — emits nothing, patches nothing, touches no live resource",
5
+ "count": 12,
6
+ "bands": {
7
+ "clean leaf": 2,
8
+ "carvable w/ edits": 4,
9
+ "leave in Terraform": 6
10
+ },
11
+ "resources": [
12
+ {
13
+ "address": "aws_cloudwatch_log_group.worker",
14
+ "kind": "resource",
15
+ "score": 100,
16
+ "band": "clean leaf",
17
+ "mapsTo": "AWS::Logs::LogGroup",
18
+ "breakdown": {
19
+ "inbound": 0,
20
+ "outbound": 0,
21
+ "outputs": 0,
22
+ "tier": 1,
23
+ "hasDynamic": false,
24
+ "instances": 1,
25
+ "penalties": {
26
+ "inbound": 0,
27
+ "outbound": 0,
28
+ "outputs": 0,
29
+ "tier": 0,
30
+ "dynamic": 0,
31
+ "instances": 0
32
+ }
33
+ },
34
+ "boundary": {
35
+ "inbound": [],
36
+ "outbound": []
37
+ }
38
+ },
39
+ {
40
+ "address": "aws_s3_bucket.assets",
41
+ "kind": "resource",
42
+ "score": 84,
43
+ "band": "clean leaf",
44
+ "mapsTo": "AWS::S3::Bucket",
45
+ "breakdown": {
46
+ "inbound": 1,
47
+ "outbound": 0,
48
+ "outputs": 1,
49
+ "tier": 1,
50
+ "hasDynamic": false,
51
+ "instances": 1,
52
+ "penalties": {
53
+ "inbound": -12,
54
+ "outbound": 0,
55
+ "outputs": -4,
56
+ "tier": 0,
57
+ "dynamic": 0,
58
+ "instances": 0
59
+ }
60
+ },
61
+ "boundary": {
62
+ "inbound": [
63
+ {
64
+ "direction": "inbound",
65
+ "survivor": "aws_lambda_function.api",
66
+ "carved": "aws_s3_bucket.assets",
67
+ "attrs": [
68
+ "bucket"
69
+ ],
70
+ "via": [
71
+ "environment"
72
+ ],
73
+ "bridge": "tf-data-source",
74
+ "required": "immediately"
75
+ },
76
+ {
77
+ "direction": "inbound",
78
+ "survivor": "output.assets_bucket",
79
+ "carved": "aws_s3_bucket.assets",
80
+ "attrs": [
81
+ "bucket"
82
+ ],
83
+ "via": [
84
+ "value"
85
+ ],
86
+ "bridge": "tf-output-rewrite",
87
+ "required": "immediately"
88
+ }
89
+ ],
90
+ "outbound": []
91
+ }
92
+ },
93
+ {
94
+ "address": "module.cdn",
95
+ "kind": "module",
96
+ "score": 71,
97
+ "band": "carvable w/ edits",
98
+ "breakdown": {
99
+ "inbound": 0,
100
+ "outbound": 1,
101
+ "outputs": 0,
102
+ "tier": 2,
103
+ "hasDynamic": true,
104
+ "instances": 1,
105
+ "penalties": {
106
+ "inbound": 0,
107
+ "outbound": -4,
108
+ "outputs": 0,
109
+ "tier": -15,
110
+ "dynamic": -10,
111
+ "instances": 0
112
+ }
113
+ },
114
+ "boundary": {
115
+ "inbound": [],
116
+ "outbound": [
117
+ {
118
+ "direction": "outbound",
119
+ "survivor": "random_pet.suffix",
120
+ "carved": "module.cdn",
121
+ "attrs": [
122
+ "id"
123
+ ],
124
+ "via": [
125
+ "name_suffix"
126
+ ],
127
+ "bridge": "deferred-input",
128
+ "required": "at-apply"
129
+ }
130
+ ]
131
+ }
132
+ },
133
+ {
134
+ "address": "aws_iam_role.api",
135
+ "kind": "resource",
136
+ "score": 69,
137
+ "band": "carvable w/ edits",
138
+ "mapsTo": "AWS::IAM::Role",
139
+ "breakdown": {
140
+ "inbound": 1,
141
+ "outbound": 1,
142
+ "outputs": 0,
143
+ "tier": 2,
144
+ "hasDynamic": false,
145
+ "instances": 1,
146
+ "penalties": {
147
+ "inbound": -12,
148
+ "outbound": -4,
149
+ "outputs": 0,
150
+ "tier": -15,
151
+ "dynamic": 0,
152
+ "instances": 0
153
+ }
154
+ },
155
+ "boundary": {
156
+ "inbound": [
157
+ {
158
+ "direction": "inbound",
159
+ "survivor": "aws_lambda_function.api",
160
+ "carved": "aws_iam_role.api",
161
+ "attrs": [
162
+ "arn"
163
+ ],
164
+ "via": [
165
+ "role"
166
+ ],
167
+ "bridge": "tf-data-source",
168
+ "required": "immediately"
169
+ }
170
+ ],
171
+ "outbound": [
172
+ {
173
+ "direction": "outbound",
174
+ "survivor": "random_pet.suffix",
175
+ "carved": "aws_iam_role.api",
176
+ "attrs": [
177
+ "id"
178
+ ],
179
+ "via": [
180
+ "name"
181
+ ],
182
+ "bridge": "deferred-input",
183
+ "required": "at-apply"
184
+ }
185
+ ]
186
+ }
187
+ },
188
+ {
189
+ "address": "aws_vpc_endpoint.ssm",
190
+ "kind": "resource",
191
+ "score": 69,
192
+ "band": "carvable w/ edits",
193
+ "mapsTo": "AWS::EC2::VPCEndpoint",
194
+ "breakdown": {
195
+ "inbound": 0,
196
+ "outbound": 4,
197
+ "outputs": 0,
198
+ "tier": 2,
199
+ "hasDynamic": false,
200
+ "instances": 1,
201
+ "penalties": {
202
+ "inbound": 0,
203
+ "outbound": -16,
204
+ "outputs": 0,
205
+ "tier": -15,
206
+ "dynamic": 0,
207
+ "instances": 0
208
+ }
209
+ },
210
+ "boundary": {
211
+ "inbound": [],
212
+ "outbound": [
213
+ {
214
+ "direction": "outbound",
215
+ "survivor": "aws_security_group.lambda",
216
+ "carved": "aws_vpc_endpoint.ssm",
217
+ "attrs": [
218
+ "id"
219
+ ],
220
+ "via": [
221
+ "security_group_ids"
222
+ ],
223
+ "bridge": "deferred-input",
224
+ "required": "at-apply"
225
+ },
226
+ {
227
+ "direction": "outbound",
228
+ "survivor": "aws_subnet.private_a",
229
+ "carved": "aws_vpc_endpoint.ssm",
230
+ "attrs": [
231
+ "id"
232
+ ],
233
+ "via": [
234
+ "subnet_ids"
235
+ ],
236
+ "bridge": "deferred-input",
237
+ "required": "at-apply"
238
+ },
239
+ {
240
+ "direction": "outbound",
241
+ "survivor": "aws_subnet.private_b",
242
+ "carved": "aws_vpc_endpoint.ssm",
243
+ "attrs": [
244
+ "id"
245
+ ],
246
+ "via": [
247
+ "subnet_ids"
248
+ ],
249
+ "bridge": "deferred-input",
250
+ "required": "at-apply"
251
+ },
252
+ {
253
+ "direction": "outbound",
254
+ "survivor": "aws_vpc.main",
255
+ "carved": "aws_vpc_endpoint.ssm",
256
+ "attrs": [
257
+ "id"
258
+ ],
259
+ "via": [
260
+ "vpc_id"
261
+ ],
262
+ "bridge": "deferred-input",
263
+ "required": "at-apply"
264
+ }
265
+ ]
266
+ }
267
+ },
268
+ {
269
+ "address": "aws_lambda_function.api",
270
+ "kind": "resource",
271
+ "score": 61,
272
+ "band": "carvable w/ edits",
273
+ "mapsTo": "AWS::Lambda::Function",
274
+ "breakdown": {
275
+ "inbound": 0,
276
+ "outbound": 5,
277
+ "outputs": 1,
278
+ "tier": 2,
279
+ "hasDynamic": false,
280
+ "instances": 1,
281
+ "penalties": {
282
+ "inbound": 0,
283
+ "outbound": -20,
284
+ "outputs": -4,
285
+ "tier": -15,
286
+ "dynamic": 0,
287
+ "instances": 0
288
+ }
289
+ },
290
+ "boundary": {
291
+ "inbound": [
292
+ {
293
+ "direction": "inbound",
294
+ "survivor": "output.api_function_name",
295
+ "carved": "aws_lambda_function.api",
296
+ "attrs": [
297
+ "function_name"
298
+ ],
299
+ "via": [
300
+ "value"
301
+ ],
302
+ "bridge": "tf-output-rewrite",
303
+ "required": "immediately"
304
+ }
305
+ ],
306
+ "outbound": [
307
+ {
308
+ "direction": "outbound",
309
+ "survivor": "aws_iam_role.api",
310
+ "carved": "aws_lambda_function.api",
311
+ "attrs": [
312
+ "arn"
313
+ ],
314
+ "via": [
315
+ "role"
316
+ ],
317
+ "bridge": "deferred-input",
318
+ "required": "at-apply"
319
+ },
320
+ {
321
+ "direction": "outbound",
322
+ "survivor": "aws_s3_bucket.assets",
323
+ "carved": "aws_lambda_function.api",
324
+ "attrs": [
325
+ "bucket"
326
+ ],
327
+ "via": [
328
+ "environment"
329
+ ],
330
+ "bridge": "deferred-input",
331
+ "required": "at-apply"
332
+ },
333
+ {
334
+ "direction": "outbound",
335
+ "survivor": "aws_security_group.lambda",
336
+ "carved": "aws_lambda_function.api",
337
+ "attrs": [
338
+ "id"
339
+ ],
340
+ "via": [
341
+ "vpc_config"
342
+ ],
343
+ "bridge": "deferred-input",
344
+ "required": "at-apply"
345
+ },
346
+ {
347
+ "direction": "outbound",
348
+ "survivor": "aws_subnet.private_a",
349
+ "carved": "aws_lambda_function.api",
350
+ "attrs": [
351
+ "id"
352
+ ],
353
+ "via": [
354
+ "vpc_config"
355
+ ],
356
+ "bridge": "deferred-input",
357
+ "required": "at-apply"
358
+ },
359
+ {
360
+ "direction": "outbound",
361
+ "survivor": "aws_subnet.private_b",
362
+ "carved": "aws_lambda_function.api",
363
+ "attrs": [
364
+ "id"
365
+ ],
366
+ "via": [
367
+ "vpc_config"
368
+ ],
369
+ "bridge": "deferred-input",
370
+ "required": "at-apply"
371
+ }
372
+ ]
373
+ }
374
+ },
375
+ {
376
+ "address": "aws_security_group.lambda",
377
+ "kind": "resource",
378
+ "score": 43,
379
+ "band": "leave in Terraform",
380
+ "mapsTo": "AWS::EC2::SecurityGroup",
381
+ "breakdown": {
382
+ "inbound": 2,
383
+ "outbound": 2,
384
+ "outputs": 0,
385
+ "tier": 2,
386
+ "hasDynamic": true,
387
+ "instances": 1,
388
+ "penalties": {
389
+ "inbound": -24,
390
+ "outbound": -8,
391
+ "outputs": 0,
392
+ "tier": -15,
393
+ "dynamic": -10,
394
+ "instances": 0
395
+ }
396
+ },
397
+ "boundary": {
398
+ "inbound": [
399
+ {
400
+ "direction": "inbound",
401
+ "survivor": "aws_lambda_function.api",
402
+ "carved": "aws_security_group.lambda",
403
+ "attrs": [
404
+ "id"
405
+ ],
406
+ "via": [
407
+ "vpc_config"
408
+ ],
409
+ "bridge": "tf-data-source",
410
+ "required": "immediately"
411
+ },
412
+ {
413
+ "direction": "inbound",
414
+ "survivor": "aws_vpc_endpoint.ssm",
415
+ "carved": "aws_security_group.lambda",
416
+ "attrs": [
417
+ "id"
418
+ ],
419
+ "via": [
420
+ "security_group_ids"
421
+ ],
422
+ "bridge": "tf-data-source",
423
+ "required": "immediately"
424
+ }
425
+ ],
426
+ "outbound": [
427
+ {
428
+ "direction": "outbound",
429
+ "survivor": "aws_vpc.main",
430
+ "carved": "aws_security_group.lambda",
431
+ "attrs": [
432
+ "id"
433
+ ],
434
+ "via": [
435
+ "vpc_id"
436
+ ],
437
+ "bridge": "deferred-input",
438
+ "required": "at-apply"
439
+ },
440
+ {
441
+ "direction": "outbound",
442
+ "survivor": "random_pet.suffix",
443
+ "carved": "aws_security_group.lambda",
444
+ "attrs": [
445
+ "id"
446
+ ],
447
+ "via": [
448
+ "name"
449
+ ],
450
+ "bridge": "deferred-input",
451
+ "required": "at-apply"
452
+ }
453
+ ]
454
+ }
455
+ },
456
+ {
457
+ "address": "aws_subnet.private_a",
458
+ "kind": "resource",
459
+ "score": 42,
460
+ "band": "leave in Terraform",
461
+ "mapsTo": "AWS::EC2::Subnet",
462
+ "breakdown": {
463
+ "inbound": 3,
464
+ "outbound": 2,
465
+ "outputs": 1,
466
+ "tier": 1,
467
+ "hasDynamic": true,
468
+ "instances": 1,
469
+ "penalties": {
470
+ "inbound": -36,
471
+ "outbound": -8,
472
+ "outputs": -4,
473
+ "tier": 0,
474
+ "dynamic": -10,
475
+ "instances": 0
476
+ }
477
+ },
478
+ "boundary": {
479
+ "inbound": [
480
+ {
481
+ "direction": "inbound",
482
+ "survivor": "aws_lambda_function.api",
483
+ "carved": "aws_subnet.private_a",
484
+ "attrs": [
485
+ "id"
486
+ ],
487
+ "via": [
488
+ "vpc_config"
489
+ ],
490
+ "bridge": "tf-data-source",
491
+ "required": "immediately"
492
+ },
493
+ {
494
+ "direction": "inbound",
495
+ "survivor": "aws_network_acl.private",
496
+ "carved": "aws_subnet.private_a",
497
+ "attrs": [
498
+ "id"
499
+ ],
500
+ "via": [
501
+ "subnet_ids"
502
+ ],
503
+ "bridge": "tf-data-source",
504
+ "required": "immediately"
505
+ },
506
+ {
507
+ "direction": "inbound",
508
+ "survivor": "aws_vpc_endpoint.ssm",
509
+ "carved": "aws_subnet.private_a",
510
+ "attrs": [
511
+ "id"
512
+ ],
513
+ "via": [
514
+ "subnet_ids"
515
+ ],
516
+ "bridge": "tf-data-source",
517
+ "required": "immediately"
518
+ },
519
+ {
520
+ "direction": "inbound",
521
+ "survivor": "output.private_subnet_ids",
522
+ "carved": "aws_subnet.private_a",
523
+ "attrs": [
524
+ "id"
525
+ ],
526
+ "via": [
527
+ "value"
528
+ ],
529
+ "bridge": "tf-output-rewrite",
530
+ "required": "immediately"
531
+ }
532
+ ],
533
+ "outbound": [
534
+ {
535
+ "direction": "outbound",
536
+ "survivor": "aws_vpc.main",
537
+ "carved": "aws_subnet.private_a",
538
+ "attrs": [
539
+ "id"
540
+ ],
541
+ "via": [
542
+ "vpc_id"
543
+ ],
544
+ "bridge": "deferred-input",
545
+ "required": "at-apply"
546
+ },
547
+ {
548
+ "direction": "outbound",
549
+ "survivor": "random_pet.suffix",
550
+ "carved": "aws_subnet.private_a",
551
+ "attrs": [
552
+ "id"
553
+ ],
554
+ "via": [
555
+ "tags"
556
+ ],
557
+ "bridge": "deferred-input",
558
+ "required": "at-apply"
559
+ }
560
+ ]
561
+ }
562
+ },
563
+ {
564
+ "address": "aws_subnet.private_b",
565
+ "kind": "resource",
566
+ "score": 42,
567
+ "band": "leave in Terraform",
568
+ "mapsTo": "AWS::EC2::Subnet",
569
+ "breakdown": {
570
+ "inbound": 3,
571
+ "outbound": 2,
572
+ "outputs": 1,
573
+ "tier": 1,
574
+ "hasDynamic": true,
575
+ "instances": 1,
576
+ "penalties": {
577
+ "inbound": -36,
578
+ "outbound": -8,
579
+ "outputs": -4,
580
+ "tier": 0,
581
+ "dynamic": -10,
582
+ "instances": 0
583
+ }
584
+ },
585
+ "boundary": {
586
+ "inbound": [
587
+ {
588
+ "direction": "inbound",
589
+ "survivor": "aws_lambda_function.api",
590
+ "carved": "aws_subnet.private_b",
591
+ "attrs": [
592
+ "id"
593
+ ],
594
+ "via": [
595
+ "vpc_config"
596
+ ],
597
+ "bridge": "tf-data-source",
598
+ "required": "immediately"
599
+ },
600
+ {
601
+ "direction": "inbound",
602
+ "survivor": "aws_network_acl.private",
603
+ "carved": "aws_subnet.private_b",
604
+ "attrs": [
605
+ "id"
606
+ ],
607
+ "via": [
608
+ "subnet_ids"
609
+ ],
610
+ "bridge": "tf-data-source",
611
+ "required": "immediately"
612
+ },
613
+ {
614
+ "direction": "inbound",
615
+ "survivor": "aws_vpc_endpoint.ssm",
616
+ "carved": "aws_subnet.private_b",
617
+ "attrs": [
618
+ "id"
619
+ ],
620
+ "via": [
621
+ "subnet_ids"
622
+ ],
623
+ "bridge": "tf-data-source",
624
+ "required": "immediately"
625
+ },
626
+ {
627
+ "direction": "inbound",
628
+ "survivor": "output.private_subnet_ids",
629
+ "carved": "aws_subnet.private_b",
630
+ "attrs": [
631
+ "id"
632
+ ],
633
+ "via": [
634
+ "value"
635
+ ],
636
+ "bridge": "tf-output-rewrite",
637
+ "required": "immediately"
638
+ }
639
+ ],
640
+ "outbound": [
641
+ {
642
+ "direction": "outbound",
643
+ "survivor": "aws_vpc.main",
644
+ "carved": "aws_subnet.private_b",
645
+ "attrs": [
646
+ "id"
647
+ ],
648
+ "via": [
649
+ "vpc_id"
650
+ ],
651
+ "bridge": "deferred-input",
652
+ "required": "at-apply"
653
+ },
654
+ {
655
+ "direction": "outbound",
656
+ "survivor": "random_pet.suffix",
657
+ "carved": "aws_subnet.private_b",
658
+ "attrs": [
659
+ "id"
660
+ ],
661
+ "via": [
662
+ "tags"
663
+ ],
664
+ "bridge": "deferred-input",
665
+ "required": "at-apply"
666
+ }
667
+ ]
668
+ }
669
+ },
670
+ {
671
+ "address": "aws_vpc.main",
672
+ "kind": "resource",
673
+ "score": 32,
674
+ "band": "leave in Terraform",
675
+ "mapsTo": "AWS::EC2::VPC",
676
+ "breakdown": {
677
+ "inbound": 5,
678
+ "outbound": 1,
679
+ "outputs": 1,
680
+ "tier": 1,
681
+ "hasDynamic": false,
682
+ "instances": 1,
683
+ "penalties": {
684
+ "inbound": -60,
685
+ "outbound": -4,
686
+ "outputs": -4,
687
+ "tier": 0,
688
+ "dynamic": 0,
689
+ "instances": 0
690
+ }
691
+ },
692
+ "boundary": {
693
+ "inbound": [
694
+ {
695
+ "direction": "inbound",
696
+ "survivor": "aws_network_acl.private",
697
+ "carved": "aws_vpc.main",
698
+ "attrs": [
699
+ "id"
700
+ ],
701
+ "via": [
702
+ "vpc_id"
703
+ ],
704
+ "bridge": "tf-data-source",
705
+ "required": "immediately"
706
+ },
707
+ {
708
+ "direction": "inbound",
709
+ "survivor": "aws_security_group.lambda",
710
+ "carved": "aws_vpc.main",
711
+ "attrs": [
712
+ "id"
713
+ ],
714
+ "via": [
715
+ "vpc_id"
716
+ ],
717
+ "bridge": "tf-data-source",
718
+ "required": "immediately"
719
+ },
720
+ {
721
+ "direction": "inbound",
722
+ "survivor": "aws_subnet.private_a",
723
+ "carved": "aws_vpc.main",
724
+ "attrs": [
725
+ "id"
726
+ ],
727
+ "via": [
728
+ "vpc_id"
729
+ ],
730
+ "bridge": "tf-data-source",
731
+ "required": "immediately"
732
+ },
733
+ {
734
+ "direction": "inbound",
735
+ "survivor": "aws_subnet.private_b",
736
+ "carved": "aws_vpc.main",
737
+ "attrs": [
738
+ "id"
739
+ ],
740
+ "via": [
741
+ "vpc_id"
742
+ ],
743
+ "bridge": "tf-data-source",
744
+ "required": "immediately"
745
+ },
746
+ {
747
+ "direction": "inbound",
748
+ "survivor": "aws_vpc_endpoint.ssm",
749
+ "carved": "aws_vpc.main",
750
+ "attrs": [
751
+ "id"
752
+ ],
753
+ "via": [
754
+ "vpc_id"
755
+ ],
756
+ "bridge": "tf-data-source",
757
+ "required": "immediately"
758
+ },
759
+ {
760
+ "direction": "inbound",
761
+ "survivor": "output.vpc_id",
762
+ "carved": "aws_vpc.main",
763
+ "attrs": [
764
+ "id"
765
+ ],
766
+ "via": [
767
+ "value"
768
+ ],
769
+ "bridge": "tf-output-rewrite",
770
+ "required": "immediately"
771
+ }
772
+ ],
773
+ "outbound": [
774
+ {
775
+ "direction": "outbound",
776
+ "survivor": "random_pet.suffix",
777
+ "carved": "aws_vpc.main",
778
+ "attrs": [
779
+ "id"
780
+ ],
781
+ "via": [
782
+ "tags"
783
+ ],
784
+ "bridge": "deferred-input",
785
+ "required": "at-apply"
786
+ }
787
+ ]
788
+ }
789
+ },
790
+ {
791
+ "address": "aws_network_acl.private",
792
+ "kind": "resource",
793
+ "score": 0,
794
+ "band": "leave in Terraform",
795
+ "breakdown": {
796
+ "inbound": 0,
797
+ "outbound": 3,
798
+ "outputs": 0,
799
+ "tier": null,
800
+ "hasDynamic": false,
801
+ "instances": 1,
802
+ "penalties": {
803
+ "inbound": 0,
804
+ "outbound": 0,
805
+ "outputs": 0,
806
+ "tier": 0,
807
+ "dynamic": 0,
808
+ "instances": 0
809
+ }
810
+ },
811
+ "boundary": {
812
+ "inbound": [],
813
+ "outbound": [
814
+ {
815
+ "direction": "outbound",
816
+ "survivor": "aws_subnet.private_a",
817
+ "carved": "aws_network_acl.private",
818
+ "attrs": [
819
+ "id"
820
+ ],
821
+ "via": [
822
+ "subnet_ids"
823
+ ],
824
+ "bridge": "deferred-input",
825
+ "required": "at-apply"
826
+ },
827
+ {
828
+ "direction": "outbound",
829
+ "survivor": "aws_subnet.private_b",
830
+ "carved": "aws_network_acl.private",
831
+ "attrs": [
832
+ "id"
833
+ ],
834
+ "via": [
835
+ "subnet_ids"
836
+ ],
837
+ "bridge": "deferred-input",
838
+ "required": "at-apply"
839
+ },
840
+ {
841
+ "direction": "outbound",
842
+ "survivor": "aws_vpc.main",
843
+ "carved": "aws_network_acl.private",
844
+ "attrs": [
845
+ "id"
846
+ ],
847
+ "via": [
848
+ "vpc_id"
849
+ ],
850
+ "bridge": "deferred-input",
851
+ "required": "at-apply"
852
+ }
853
+ ]
854
+ }
855
+ },
856
+ {
857
+ "address": "random_pet.suffix",
858
+ "kind": "resource",
859
+ "score": 0,
860
+ "band": "leave in Terraform",
861
+ "breakdown": {
862
+ "inbound": 6,
863
+ "outbound": 0,
864
+ "outputs": 0,
865
+ "tier": null,
866
+ "hasDynamic": false,
867
+ "instances": 1,
868
+ "penalties": {
869
+ "inbound": 0,
870
+ "outbound": 0,
871
+ "outputs": 0,
872
+ "tier": 0,
873
+ "dynamic": 0,
874
+ "instances": 0
875
+ }
876
+ },
877
+ "boundary": {
878
+ "inbound": [
879
+ {
880
+ "direction": "inbound",
881
+ "survivor": "aws_iam_role.api",
882
+ "carved": "random_pet.suffix",
883
+ "attrs": [
884
+ "id"
885
+ ],
886
+ "via": [
887
+ "name"
888
+ ],
889
+ "bridge": "tf-data-source",
890
+ "required": "immediately"
891
+ },
892
+ {
893
+ "direction": "inbound",
894
+ "survivor": "aws_security_group.lambda",
895
+ "carved": "random_pet.suffix",
896
+ "attrs": [
897
+ "id"
898
+ ],
899
+ "via": [
900
+ "name"
901
+ ],
902
+ "bridge": "tf-data-source",
903
+ "required": "immediately"
904
+ },
905
+ {
906
+ "direction": "inbound",
907
+ "survivor": "aws_subnet.private_a",
908
+ "carved": "random_pet.suffix",
909
+ "attrs": [
910
+ "id"
911
+ ],
912
+ "via": [
913
+ "tags"
914
+ ],
915
+ "bridge": "tf-data-source",
916
+ "required": "immediately"
917
+ },
918
+ {
919
+ "direction": "inbound",
920
+ "survivor": "aws_subnet.private_b",
921
+ "carved": "random_pet.suffix",
922
+ "attrs": [
923
+ "id"
924
+ ],
925
+ "via": [
926
+ "tags"
927
+ ],
928
+ "bridge": "tf-data-source",
929
+ "required": "immediately"
930
+ },
931
+ {
932
+ "direction": "inbound",
933
+ "survivor": "aws_vpc.main",
934
+ "carved": "random_pet.suffix",
935
+ "attrs": [
936
+ "id"
937
+ ],
938
+ "via": [
939
+ "tags"
940
+ ],
941
+ "bridge": "tf-data-source",
942
+ "required": "immediately"
943
+ },
944
+ {
945
+ "direction": "inbound",
946
+ "survivor": "module.cdn",
947
+ "carved": "random_pet.suffix",
948
+ "attrs": [
949
+ "id"
950
+ ],
951
+ "via": [
952
+ "name_suffix"
953
+ ],
954
+ "bridge": "tf-data-source",
955
+ "required": "immediately"
956
+ }
957
+ ],
958
+ "outbound": []
959
+ }
960
+ }
961
+ ]
962
+ }