@intentius/behold 0.7.0 → 0.9.0

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