@intentius/chant-lexicon-aws 0.124.31 → 0.124.33

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 (649) hide show
  1. package/dist/actions/dynamodb.js +41 -0
  2. package/dist/actions/ecr.js +9 -0
  3. package/dist/actions/ecs.js +5 -0
  4. package/dist/actions/iam.js +3 -0
  5. package/dist/actions/index.js +9 -0
  6. package/dist/actions/lambda.js +11 -0
  7. package/dist/actions/logs.js +4 -0
  8. package/dist/actions/s3.js +40 -0
  9. package/dist/actions/sns.js +5 -0
  10. package/dist/actions/sqs.js +15 -0
  11. package/dist/agentcore/trace-fetch.d.ts.map +1 -1
  12. package/dist/agentcore/trace-fetch.js +472 -0
  13. package/dist/agentcore/trace-render.js +359 -0
  14. package/dist/ambient.js +148 -0
  15. package/dist/api/credential-chain.d.ts +30 -3
  16. package/dist/api/credential-chain.d.ts.map +1 -1
  17. package/dist/api/credential-chain.js +509 -0
  18. package/dist/api/read-client.d.ts +16 -43
  19. package/dist/api/read-client.d.ts.map +1 -1
  20. package/dist/api/read-client.js +458 -0
  21. package/dist/api/sigv4.d.ts +4 -4
  22. package/dist/api/sigv4.js +185 -0
  23. package/dist/behaviour-kinds.js +114 -0
  24. package/dist/caller-identity.d.ts +3 -5
  25. package/dist/caller-identity.d.ts.map +1 -1
  26. package/dist/caller-identity.js +146 -0
  27. package/dist/codegen/docs-cli.js +2 -0
  28. package/dist/codegen/docs.js +120 -0
  29. package/dist/codegen/enum-overlay.js +162 -0
  30. package/dist/codegen/extensions.js +139 -0
  31. package/dist/codegen/fallback.js +32 -0
  32. package/dist/codegen/generate-cli.js +15 -0
  33. package/dist/codegen/generate-lexicon.js +70 -0
  34. package/dist/codegen/generate-typescript.js +226 -0
  35. package/dist/codegen/generate.d.ts.map +1 -1
  36. package/dist/codegen/generate.js +234 -0
  37. package/dist/codegen/naming.js +135 -0
  38. package/dist/codegen/package.js +67 -0
  39. package/dist/codegen/patches.d.ts +26 -1
  40. package/dist/codegen/patches.d.ts.map +1 -1
  41. package/dist/codegen/patches.js +90 -0
  42. package/dist/codegen/property-overlay.js +85 -0
  43. package/dist/codegen/property-overlay.json +1 -16
  44. package/dist/codegen/sam.js +402 -0
  45. package/dist/codegen/typecheck.js +4 -0
  46. package/dist/codegen/versions.js +31 -0
  47. package/dist/components/__tests__/mock-cloud-executor.js +326 -0
  48. package/dist/components/apply.d.ts +44 -1
  49. package/dist/components/apply.d.ts.map +1 -1
  50. package/dist/components/apply.js +752 -0
  51. package/dist/components/builders.js +37 -0
  52. package/dist/components/capability-plugin.js +66 -0
  53. package/dist/components/cloud-executor.d.ts +35 -0
  54. package/dist/components/cloud-executor.d.ts.map +1 -1
  55. package/dist/components/cloud-executor.js +576 -0
  56. package/dist/components/config-bom.js +207 -0
  57. package/dist/components/host-delivery.js +117 -0
  58. package/dist/components/index.js +18 -0
  59. package/dist/components/job-submission.js +77 -0
  60. package/dist/components/publish.js +234 -0
  61. package/dist/components/safety.js +62 -0
  62. package/dist/components/wait-aws.js +68 -0
  63. package/dist/composites/agentcore-agent.js +187 -0
  64. package/dist/composites/agentcore-trust-policy.js +13 -0
  65. package/dist/composites/alb-shared.js +84 -0
  66. package/dist/composites/bucket-deployment.js +93 -0
  67. package/dist/composites/catalog.js +2714 -0
  68. package/dist/composites/dynamodb-table.js +66 -0
  69. package/dist/composites/ec2-instance-bundle.js +75 -0
  70. package/dist/composites/ec2-instance-role.js +26 -0
  71. package/dist/composites/ecr-repository.js +64 -0
  72. package/dist/composites/ecs-trust-policy.js +10 -0
  73. package/dist/composites/efs-with-access-point.js +44 -0
  74. package/dist/composites/eks-cluster.js +118 -0
  75. package/dist/composites/fargate-alb.js +216 -0
  76. package/dist/composites/fargate-service.js +222 -0
  77. package/dist/composites/index.js +28 -0
  78. package/dist/composites/lambda-api.js +15 -0
  79. package/dist/composites/lambda-dynamodb.js +77 -0
  80. package/dist/composites/lambda-eventbridge.js +27 -0
  81. package/dist/composites/lambda-function.js +54 -0
  82. package/dist/composites/lambda-s3.js +93 -0
  83. package/dist/composites/lambda-sns.js +23 -0
  84. package/dist/composites/lambda-sqs.js +34 -0
  85. package/dist/composites/landing-zone.js +82 -0
  86. package/dist/composites/microvm-app.js +293 -0
  87. package/dist/composites/minimal-vpc.js +40 -0
  88. package/dist/composites/monitoring-stack.js +105 -0
  89. package/dist/composites/nlb-service.js +61 -0
  90. package/dist/composites/rds-instance.js +98 -0
  91. package/dist/composites/scheduled-lambda.js +28 -0
  92. package/dist/composites/solr-fargate-service.js +33 -0
  93. package/dist/composites/step-functions-workflow.js +78 -0
  94. package/dist/composites/vpc-default.js +132 -0
  95. package/dist/condition.js +43 -0
  96. package/dist/coverage.js +4 -0
  97. package/dist/deep-observe.d.ts.map +1 -1
  98. package/dist/deep-observe.js +709 -0
  99. package/dist/deep-topology.js +226 -0
  100. package/dist/default-tags.js +50 -0
  101. package/dist/defaults.js +85 -0
  102. package/dist/dependencies.js +269 -0
  103. package/dist/detect.js +21 -0
  104. package/dist/disruption.d.ts.map +1 -1
  105. package/dist/disruption.js +129 -0
  106. package/dist/effect-receipt-row.js +107 -0
  107. package/dist/generated/index.d.ts +1297 -82
  108. package/dist/generated/index.d.ts.map +1 -1
  109. package/dist/generated/index.js +12382 -0
  110. package/dist/generated/runtime.js +4 -0
  111. package/dist/governance.js +131 -0
  112. package/dist/health.d.ts +61 -0
  113. package/dist/health.d.ts.map +1 -0
  114. package/dist/health.js +216 -0
  115. package/dist/identity-observe.d.ts.map +1 -1
  116. package/dist/identity-observe.js +127 -0
  117. package/dist/import/generator.js +757 -0
  118. package/dist/import/live-export.js +34 -0
  119. package/dist/import/parser.js +394 -0
  120. package/dist/index.js +69 -0
  121. package/dist/integrity.json +6 -6
  122. package/dist/intrinsics.js +393 -0
  123. package/dist/lint/audit-catalog.js +87 -0
  124. package/dist/lint/audit-lineage.js +150 -0
  125. package/dist/lint/post-synth/cf-refs.js +247 -0
  126. package/dist/lint/post-synth/cor020.js +60 -0
  127. package/dist/lint/post-synth/ext001.d.ts.map +1 -1
  128. package/dist/lint/post-synth/ext001.js +197 -0
  129. package/dist/lint/post-synth/index.js +124 -0
  130. package/dist/lint/post-synth/waw010.js +41 -0
  131. package/dist/lint/post-synth/waw011.js +41 -0
  132. package/dist/lint/post-synth/waw013.js +38 -0
  133. package/dist/lint/post-synth/waw014.js +42 -0
  134. package/dist/lint/post-synth/waw015.js +88 -0
  135. package/dist/lint/post-synth/waw016.d.ts.map +1 -1
  136. package/dist/lint/post-synth/waw016.js +116 -0
  137. package/dist/lint/post-synth/waw017.js +43 -0
  138. package/dist/lint/post-synth/waw018.js +61 -0
  139. package/dist/lint/post-synth/waw019.js +64 -0
  140. package/dist/lint/post-synth/waw020.js +56 -0
  141. package/dist/lint/post-synth/waw021.js +44 -0
  142. package/dist/lint/post-synth/waw022.js +36 -0
  143. package/dist/lint/post-synth/waw023.js +40 -0
  144. package/dist/lint/post-synth/waw024.js +46 -0
  145. package/dist/lint/post-synth/waw025.js +36 -0
  146. package/dist/lint/post-synth/waw026.js +38 -0
  147. package/dist/lint/post-synth/waw027.js +41 -0
  148. package/dist/lint/post-synth/waw028.js +39 -0
  149. package/dist/lint/post-synth/waw029.js +54 -0
  150. package/dist/lint/post-synth/waw030.js +282 -0
  151. package/dist/lint/post-synth/waw031.js +58 -0
  152. package/dist/lint/post-synth/waw032.js +45 -0
  153. package/dist/lint/post-synth/waw033.js +75 -0
  154. package/dist/lint/post-synth/waw034.js +52 -0
  155. package/dist/lint/post-synth/waw035.js +56 -0
  156. package/dist/lint/post-synth/waw036.js +79 -0
  157. package/dist/lint/post-synth/waw037.js +67 -0
  158. package/dist/lint/post-synth/waw038.js +42 -0
  159. package/dist/lint/post-synth/waw039.js +42 -0
  160. package/dist/lint/post-synth/waw040.js +45 -0
  161. package/dist/lint/post-synth/waw041.js +40 -0
  162. package/dist/lint/post-synth/waw042.js +99 -0
  163. package/dist/lint/post-synth/waw043.js +51 -0
  164. package/dist/lint/post-synth/waw044.js +64 -0
  165. package/dist/lint/post-synth/waw045.js +49 -0
  166. package/dist/lint/post-synth/waw046.js +52 -0
  167. package/dist/lint/post-synth/waw047.js +43 -0
  168. package/dist/lint/post-synth/waw048.js +40 -0
  169. package/dist/lint/post-synth/waw049.js +78 -0
  170. package/dist/lint/post-synth/waw050.js +44 -0
  171. package/dist/lint/post-synth/waw051.js +41 -0
  172. package/dist/lint/post-synth/waw052.js +43 -0
  173. package/dist/lint/post-synth/waw053.js +43 -0
  174. package/dist/lint/post-synth/waw054.js +41 -0
  175. package/dist/lint/post-synth/waw055.js +41 -0
  176. package/dist/lint/post-synth/waw056.js +65 -0
  177. package/dist/lint/post-synth/waw057.js +43 -0
  178. package/dist/lint/post-synth/waw058.js +61 -0
  179. package/dist/lint/post-synth/waw059.js +338 -0
  180. package/dist/lint/post-synth/waw060.js +83 -0
  181. package/dist/lint/post-synth/waw061.js +60 -0
  182. package/dist/lint/post-synth/waw062.js +0 -0
  183. package/dist/lint/post-synth/waw063.js +0 -0
  184. package/dist/lint/post-synth/waw064.js +45 -0
  185. package/dist/lint/post-synth/waw065.js +104 -0
  186. package/dist/lint/post-synth/waw066.js +145 -0
  187. package/dist/lint/post-synth/waw067.js +115 -0
  188. package/dist/lint/post-synth/waw068.js +69 -0
  189. package/dist/lint/post-synth/waw069.js +0 -0
  190. package/dist/lint/rules/hardcoded-region.js +38 -0
  191. package/dist/lint/rules/iam-wildcard.js +60 -0
  192. package/dist/lint/rules/index.js +6 -0
  193. package/dist/lint/rules/s3-encryption.js +60 -0
  194. package/dist/live-attrs.js +42 -0
  195. package/dist/lsp/completions.d.ts.map +1 -1
  196. package/dist/lsp/completions.js +18 -0
  197. package/dist/lsp/hover.d.ts.map +1 -1
  198. package/dist/lsp/hover.js +66 -0
  199. package/dist/manifest.json +1 -1
  200. package/dist/mapping.js +33 -0
  201. package/dist/meta.json +17359 -784
  202. package/dist/nested-stack.js +95 -0
  203. package/dist/okf/index.md +203 -0
  204. package/dist/okf/rules/EXT001.md +1 -0
  205. package/dist/okf/rules/WAW016.md +2 -0
  206. package/dist/okf/rules/WAW019.md +1 -0
  207. package/dist/okf/rules/WAW028.md +1 -0
  208. package/dist/okf/rules/WAW030.md +2 -0
  209. package/dist/okf/rules/WAW039.md +1 -0
  210. package/dist/okf/rules/WAW049.md +1 -0
  211. package/dist/okf/rules/WAW056.md +1 -0
  212. package/dist/okf/rules/WAW058.md +1 -0
  213. package/dist/okf/rules/WAW062.md +1 -0
  214. package/dist/okf/rules/WAW064.md +1 -0
  215. package/dist/okf/rules/WAW065.md +1 -0
  216. package/dist/okf/rules/WAW066.md +1 -0
  217. package/dist/okf/rules/WAW067.md +1 -0
  218. package/dist/okf/rules/WAW068.md +1 -0
  219. package/dist/okf/rules/WAW069.md +4 -0
  220. package/dist/okf/types/AIWorkloadConfig.md +23 -0
  221. package/dist/okf/types/ARCRegionSwitchPlan.md +1 -0
  222. package/dist/okf/types/AccountAccessApplication.md +28 -0
  223. package/dist/okf/types/AccountAccessEntitlement.md +22 -0
  224. package/dist/okf/types/ActionTarget.md +20 -0
  225. package/dist/okf/types/AdConfiguration.md +21 -0
  226. package/dist/okf/types/Adapter.md +26 -0
  227. package/dist/okf/types/AgentContext.md +35 -0
  228. package/dist/okf/types/AgentGoal.md +31 -0
  229. package/dist/okf/types/AgentProfile.md +34 -0
  230. package/dist/okf/types/Alarm.md +3 -1
  231. package/dist/okf/types/AlarmModel.md +14 -9
  232. package/dist/okf/types/AmplifyWebhook.md +25 -0
  233. package/dist/okf/types/ApiCache.md +8 -8
  234. package/dist/okf/types/ApiGatewayManagedOverrides.md +5 -5
  235. package/dist/okf/types/AppAuthorization.md +35 -0
  236. package/dist/okf/types/AppBlockBuilder.md +1 -0
  237. package/dist/okf/types/AppInstance.md +2 -2
  238. package/dist/okf/types/AppInstanceBot.md +2 -2
  239. package/dist/okf/types/AppStreamFleet.md +3 -2
  240. package/dist/okf/types/AppSyncApiKey.md +6 -6
  241. package/dist/okf/types/AppSyncType.md +22 -0
  242. package/dist/okf/types/ApplicationStatusCheck.md +36 -0
  243. package/dist/okf/types/ApplicationVersion.md +4 -1
  244. package/dist/okf/types/ApplicationsList.md +26 -0
  245. package/dist/okf/types/ApprovalPolicy.md +28 -0
  246. package/dist/okf/types/ArchiveRule.md +24 -0
  247. package/dist/okf/types/Asset.md +30 -0
  248. package/dist/okf/types/Backup.md +31 -0
  249. package/dist/okf/types/BedrockAgentCoreDataset.md +1 -1
  250. package/dist/okf/types/BedrockAgentCoreGateway.md +3 -0
  251. package/dist/okf/types/BedrockSession.md +28 -0
  252. package/dist/okf/types/BillEstimate.md +35 -0
  253. package/dist/okf/types/Brand.md +32 -0
  254. package/dist/okf/types/CallAnalyticsCategory.md +25 -0
  255. package/dist/okf/types/Campaign.md +28 -0
  256. package/dist/okf/types/CapacityProvider.md +30 -0
  257. package/dist/okf/types/Case.md +24 -0
  258. package/dist/okf/types/CertificateAssociation.md +13 -0
  259. package/dist/okf/types/ChangeSet.md +36 -0
  260. package/dist/okf/types/ChannelFlow.md +29 -0
  261. package/dist/okf/types/ChimeChannel.md +39 -0
  262. package/dist/okf/types/Classifier.md +6 -6
  263. package/dist/okf/types/ClientVpnAuthorizationRule.md +6 -6
  264. package/dist/okf/types/ClientVpnEndpoint.md +2 -0
  265. package/dist/okf/types/ClientVpnRoute.md +5 -5
  266. package/dist/okf/types/CloudConnector.md +29 -0
  267. package/dist/okf/types/Cluster.md +39 -0
  268. package/dist/okf/types/ClusterSchedulerConfig.md +30 -0
  269. package/dist/okf/types/CodeCommitRepository.md +12 -12
  270. package/dist/okf/types/CodeConnectionsHost.md +26 -0
  271. package/dist/okf/types/CodeRepository.md +5 -5
  272. package/dist/okf/types/CompositeAlarm.md +1 -0
  273. package/dist/okf/types/ComputeEnvironment.md +2 -0
  274. package/dist/okf/types/ComputeNodeGroup.md +1 -1
  275. package/dist/okf/types/ComputeQuota.md +34 -0
  276. package/dist/okf/types/ConfigRule.md +1 -1
  277. package/dist/okf/types/ConfigurationRecorder.md +7 -6
  278. package/dist/okf/types/ConnectAttachment.md +2 -0
  279. package/dist/okf/types/ConnectQueue.md +5 -1
  280. package/dist/okf/types/ConnectVocabulary.md +28 -0
  281. package/dist/okf/types/ConnectionType.md +24 -0
  282. package/dist/okf/types/ConsentPortal.md +33 -0
  283. package/dist/okf/types/ContactMethod.md +29 -0
  284. package/dist/okf/types/ContainerAssociation.md +26 -0
  285. package/dist/okf/types/ContainerFleet.md +1 -1
  286. package/dist/okf/types/ContainerGroupDefinition.md +1 -1
  287. package/dist/okf/types/Content.md +40 -0
  288. package/dist/okf/types/ContentAssociation.md +28 -0
  289. package/dist/okf/types/CustomDetectionRuleAssociation.md +28 -0
  290. package/dist/okf/types/CustomEntityType.md +4 -9
  291. package/dist/okf/types/Customization.md +22 -0
  292. package/dist/okf/types/CwIntegration.md +31 -0
  293. package/dist/okf/types/DAXParameterGroup.md +3 -8
  294. package/dist/okf/types/DAXSubnetGroup.md +0 -5
  295. package/dist/okf/types/DBClusterEndpoint.md +31 -0
  296. package/dist/okf/types/DBProxyTargetGroup.md +1 -0
  297. package/dist/okf/types/DBSnapshot.md +62 -0
  298. package/dist/okf/types/DLMLifecyclePolicy.md +12 -12
  299. package/dist/okf/types/DLPSetting.md +31 -0
  300. package/dist/okf/types/DMSInstanceProfile.md +1 -1
  301. package/dist/okf/types/DRSLaunchConfigurationTemplate.md +28 -0
  302. package/dist/okf/types/Daemon.md +1 -0
  303. package/dist/okf/types/DataExchangeDataSet.md +29 -0
  304. package/dist/okf/types/DataIntegrationFlow.md +27 -0
  305. package/dist/okf/types/DataMigration.md +1 -1
  306. package/dist/okf/types/DataProvider.md +2 -1
  307. package/dist/okf/types/DataQualityRuleset.md +6 -11
  308. package/dist/okf/types/DataSource.md +23 -0
  309. package/dist/okf/types/Dataset.md +20 -0
  310. package/dist/okf/types/DatasetIntegration.md +23 -0
  311. package/dist/okf/types/DbCluster.md +1 -1
  312. package/dist/okf/types/DbInstance.md +8 -2
  313. package/dist/okf/types/DeadlineBudget.md +29 -0
  314. package/dist/okf/types/DelegationSet.md +23 -0
  315. package/dist/okf/types/DeliveryChannel.md +6 -11
  316. package/dist/okf/types/DevOpsAgentAgentSpace.md +4 -0
  317. package/dist/okf/types/DevOpsAgentService.md +1 -0
  318. package/dist/okf/types/DevOpsAgentTrigger.md +28 -0
  319. package/dist/okf/types/DirectConnectGatewayAttachment.md +2 -0
  320. package/dist/okf/types/Directory.md +60 -0
  321. package/dist/okf/types/DocDBDBClusterParameterGroup.md +5 -10
  322. package/dist/okf/types/DocDBDBSubnetGroup.md +4 -9
  323. package/dist/okf/types/DocDBElasticClusterSnapshot.md +36 -0
  324. package/dist/okf/types/DocumentClassifierEndpoint.md +27 -0
  325. package/dist/okf/types/Domain.md +27 -0
  326. package/dist/okf/types/EKSCertificateAuthority.md +42 -0
  327. package/dist/okf/types/EKSCluster.md +8 -0
  328. package/dist/okf/types/EcSnapshot.md +66 -0
  329. package/dist/okf/types/EmailIdentityCertificate.md +15 -0
  330. package/dist/okf/types/EndpointConfig.md +14 -13
  331. package/dist/okf/types/EntityRecognizer.md +27 -0
  332. package/dist/okf/types/EntityRecognizerEndpoint.md +31 -0
  333. package/dist/okf/types/EnvironmentEC2.md +13 -13
  334. package/dist/okf/types/EvaluationForm.md +1 -0
  335. package/dist/okf/types/Evaluator.md +6 -2
  336. package/dist/okf/types/EventAction.md +26 -0
  337. package/dist/okf/types/EventRule.md +2 -0
  338. package/dist/okf/types/EventSource.md +30 -0
  339. package/dist/okf/types/EventTracker.md +22 -0
  340. package/dist/okf/types/EventsV2EventBus.md +28 -0
  341. package/dist/okf/types/EventsV2ResourcePolicy.md +19 -0
  342. package/dist/okf/types/EventsV2Subscriber.md +39 -0
  343. package/dist/okf/types/ExperimentDefinition.md +39 -0
  344. package/dist/okf/types/ExperimentRun.md +33 -0
  345. package/dist/okf/types/ExperimentTrialComponent.md +13 -11
  346. package/dist/okf/types/FHIRDatastore.md +3 -0
  347. package/dist/okf/types/FSxSnapshot.md +5 -5
  348. package/dist/okf/types/FSxVolume.md +9 -9
  349. package/dist/okf/types/FeaturedResultsSet.md +26 -0
  350. package/dist/okf/types/Feed.md +1 -0
  351. package/dist/okf/types/FieldLevelEncryptionConfig.md +25 -0
  352. package/dist/okf/types/FieldLevelEncryptionProfile.md +22 -0
  353. package/dist/okf/types/FileCache.md +45 -0
  354. package/dist/okf/types/Filter.md +27 -0
  355. package/dist/okf/types/Firewall.md +6 -0
  356. package/dist/okf/types/FlowMediaStream.md +28 -0
  357. package/dist/okf/types/FlowOutput.md +1 -0
  358. package/dist/okf/types/FpgaImage.md +38 -0
  359. package/dist/okf/types/Function.md +2 -2
  360. package/dist/okf/types/Gateway.md +41 -0
  361. package/dist/okf/types/GatewayClusterAssociations.md +23 -0
  362. package/dist/okf/types/GatewayRateLimit.md +26 -0
  363. package/dist/okf/types/GatewayRule.md +32 -0
  364. package/dist/okf/types/GlobalReplicationGroup.md +3 -0
  365. package/dist/okf/types/GlobalResolver.md +1 -1
  366. package/dist/okf/types/GlobalTable.md +1 -0
  367. package/dist/okf/types/GlueConnection.md +5 -4
  368. package/dist/okf/types/GlueSecurityConfiguration.md +1 -6
  369. package/dist/okf/types/GlueSession.md +38 -0
  370. package/dist/okf/types/GlueTable.md +5 -10
  371. package/dist/okf/types/GlueWorkflow.md +5 -10
  372. package/dist/okf/types/Group.md +27 -0
  373. package/dist/okf/types/Harness.md +1 -0
  374. package/dist/okf/types/HostKey.md +33 -0
  375. package/dist/okf/types/HostedZone.md +1 -0
  376. package/dist/okf/types/HttpApi.md +2 -0
  377. package/dist/okf/types/HttpNamespace.md +5 -5
  378. package/dist/okf/types/HubV2.md +1 -0
  379. package/dist/okf/types/HumanTaskUi.md +22 -0
  380. package/dist/okf/types/IPv4Pool.md +28 -0
  381. package/dist/okf/types/ImageBuilder.md +1 -0
  382. package/dist/okf/types/ImageBuilderImage.md +1 -1
  383. package/dist/okf/types/ImagePipeline.md +1 -1
  384. package/dist/okf/types/InferenceComponent.md +5 -1
  385. package/dist/okf/types/InfluxDBBackup.md +65 -0
  386. package/dist/okf/types/InfluxDBCluster.md +3 -0
  387. package/dist/okf/types/InfrastructureConfiguration.md +2 -0
  388. package/dist/okf/types/IngestionDestination.md +28 -0
  389. package/dist/okf/types/InputSecurityGroup.md +6 -4
  390. package/dist/okf/types/InspectorV2Connector.md +38 -0
  391. package/dist/okf/types/InstanceEventWindow.md +25 -0
  392. package/dist/okf/types/InstanceFleetConfig.md +10 -10
  393. package/dist/okf/types/InstanceGroupConfig.md +3 -3
  394. package/dist/okf/types/InstrumentationConfig.md +31 -0
  395. package/dist/okf/types/IntegrationAssociation.md +3 -0
  396. package/dist/okf/types/IoTSiteWiseApplication.md +34 -0
  397. package/dist/okf/types/IoTSiteWiseDataset.md +5 -2
  398. package/dist/okf/types/IoTSiteWiseTask.md +24 -0
  399. package/dist/okf/types/IpamExternalResourceVerificationToken.md +35 -0
  400. package/dist/okf/types/IpamInternetRegistryAssociation.md +32 -0
  401. package/dist/okf/types/Job.md +35 -0
  402. package/dist/okf/types/JobTemplate.md +26 -0
  403. package/dist/okf/types/KinesisChannel.md +31 -0
  404. package/dist/okf/types/KinesisStream.md +1 -0
  405. package/dist/okf/types/LambdaResourcePolicy.md +14 -0
  406. package/dist/okf/types/Lexicon.md +34 -0
  407. package/dist/okf/types/LicenseAssetGroup.md +23 -0
  408. package/dist/okf/types/LicenseConfiguration.md +33 -0
  409. package/dist/okf/types/LicenseServerEndpoint.md +32 -0
  410. package/dist/okf/types/LightsailKeyPair.md +29 -0
  411. package/dist/okf/types/LimitsProfile.md +27 -0
  412. package/dist/okf/types/LocationAzureBlob.md +2 -1
  413. package/dist/okf/types/LocationObjectStorage.md +1 -0
  414. package/dist/okf/types/LogAlarm.md +2 -0
  415. package/dist/okf/types/MGNConnector.md +23 -0
  416. package/dist/okf/types/MGNLaunchConfigurationTemplate.md +37 -0
  417. package/dist/okf/types/MLTransform.md +15 -15
  418. package/dist/okf/types/MWAAServerlessWorkflow.md +3 -0
  419. package/dist/okf/types/ManagedNotificationAccountContactAssociation.md +1 -0
  420. package/dist/okf/types/ManagedNotificationAdditionalChannelAssociation.md +1 -0
  421. package/dist/okf/types/MediaConvertJobTemplate.md +11 -13
  422. package/dist/okf/types/MediaConvertQueue.md +8 -10
  423. package/dist/okf/types/MediaInsightsPipelineConfiguration.md +28 -0
  424. package/dist/okf/types/MediaLiveInput.md +41 -18
  425. package/dist/okf/types/MediaPackageV2Channel.md +3 -0
  426. package/dist/okf/types/MediaPackageV2OriginEndpoint.md +1 -0
  427. package/dist/okf/types/MediaPipelineKinesisVideoStreamPool.md +28 -0
  428. package/dist/okf/types/MediaTailorFunction.md +27 -0
  429. package/dist/okf/types/MedicalVocabulary.md +21 -0
  430. package/dist/okf/types/Member.md +26 -0
  431. package/dist/okf/types/Memory.md +6 -0
  432. package/dist/okf/types/MemoryDBSnapshot.md +29 -0
  433. package/dist/okf/types/Metric.md +59 -0
  434. package/dist/okf/types/MetricAttribution.md +23 -0
  435. package/dist/okf/types/MicrosoftAD.md +11 -11
  436. package/dist/okf/types/MigrationProject.md +8 -1
  437. package/dist/okf/types/Monitor.md +26 -0
  438. package/dist/okf/types/NFSFileShare.md +44 -0
  439. package/dist/okf/types/NeptuneGraphGraph.md +1 -0
  440. package/dist/okf/types/NetworkConnector.md +4 -0
  441. package/dist/okf/types/NetworkFlowMonitorScope.md +23 -0
  442. package/dist/okf/types/NetworkMigrationDefinition.md +31 -0
  443. package/dist/okf/types/NetworkSecurityManagerDeployment.md +31 -0
  444. package/dist/okf/types/NetworkSecurityManagerPolicy.md +32 -0
  445. package/dist/okf/types/NetworkSecurityManagerScope.md +29 -0
  446. package/dist/okf/types/NotebookInstance.md +18 -18
  447. package/dist/okf/types/NotebookInstanceLifecycleConfig.md +6 -5
  448. package/dist/okf/types/NotifyConfiguration.md +35 -0
  449. package/dist/okf/types/OTelEnrichment.md +2 -0
  450. package/dist/okf/types/OnlineEvaluationConfig.md +0 -1
  451. package/dist/okf/types/OrganizationConfigRule.md +7 -7
  452. package/dist/okf/types/Outpost.md +32 -0
  453. package/dist/okf/types/ParallelData.md +40 -0
  454. package/dist/okf/types/Partition.md +5 -5
  455. package/dist/okf/types/PaymentConnector.md +4 -1
  456. package/dist/okf/types/Pentest.md +1 -0
  457. package/dist/okf/types/PerfReports.md +28 -0
  458. package/dist/okf/types/PermissionAssociation.md +30 -0
  459. package/dist/okf/types/PersonalizeDataset.md +1 -0
  460. package/dist/okf/types/PersonalizeDatasetGroup.md +1 -0
  461. package/dist/okf/types/PersonalizeSchema.md +1 -0
  462. package/dist/okf/types/Pipeline.md +25 -0
  463. package/dist/okf/types/PlaybackConfiguration.md +1 -0
  464. package/dist/okf/types/PolicyAssociation.md +1 -1
  465. package/dist/okf/types/PolicyGrant.md +2 -2
  466. package/dist/okf/types/PolicyPrincipalAttachment.md +2 -7
  467. package/dist/okf/types/PortalProduct.md +24 -0
  468. package/dist/okf/types/PrefetchSchedule.md +25 -0
  469. package/dist/okf/types/PricingPlanManagerSubscription.md +31 -0
  470. package/dist/okf/types/PrincipalAssociation.md +27 -0
  471. package/dist/okf/types/PrivateDnsNamespace.md +8 -8
  472. package/dist/okf/types/PrivateVirtualInterface.md +1 -0
  473. package/dist/okf/types/ProcurementPortalPreference.md +45 -0
  474. package/dist/okf/types/Program.md +33 -0
  475. package/dist/okf/types/ProjectMembership.md +1 -1
  476. package/dist/okf/types/ProtocolsList.md +26 -0
  477. package/dist/okf/types/PublicDnsNamespace.md +7 -7
  478. package/dist/okf/types/PublicVirtualInterface.md +1 -0
  479. package/dist/okf/types/QEV2IdcApplication.md +25 -0
  480. package/dist/okf/types/QueryLoggingConfig.md +21 -0
  481. package/dist/okf/types/QuerySuggestionsBlockList.md +25 -0
  482. package/dist/okf/types/QuickSightAssignment.md +24 -0
  483. package/dist/okf/types/RAMResourceAssociation.md +27 -0
  484. package/dist/okf/types/RDSClusterSnapshot.md +54 -0
  485. package/dist/okf/types/RDSDBParameterGroup.md +5 -0
  486. package/dist/okf/types/RDSDeployment.md +41 -0
  487. package/dist/okf/types/RcsAgent.md +38 -0
  488. package/dist/okf/types/ReceiptRule.md +5 -5
  489. package/dist/okf/types/ReceiptRuleSet.md +1 -6
  490. package/dist/okf/types/RecommenderFilter.md +27 -0
  491. package/dist/okf/types/RecommenderSchema.md +25 -0
  492. package/dist/okf/types/RecordSet.md +16 -22
  493. package/dist/okf/types/RecoveryPlan.md +28 -0
  494. package/dist/okf/types/RedshiftIdcApplication.md +31 -0
  495. package/dist/okf/types/RedshiftSnapshot.md +59 -0
  496. package/dist/okf/types/RegistrationAttachment.md +28 -0
  497. package/dist/okf/types/Registry.md +41 -0
  498. package/dist/okf/types/RegistryRecord.md +38 -0
  499. package/dist/okf/types/RelatedItem.md +24 -0
  500. package/dist/okf/types/ReplicationConfigurationTemplate.md +35 -0
  501. package/dist/okf/types/ReplicationSubnetGroup.md +4 -9
  502. package/dist/okf/types/ReplicationTask.md +14 -14
  503. package/dist/okf/types/ReportGenerator.md +29 -0
  504. package/dist/okf/types/ReportGroup.md +1 -3
  505. package/dist/okf/types/ResilienceHubV2Policy.md +1 -0
  506. package/dist/okf/types/ResilienceHubV2Service.md +1 -0
  507. package/dist/okf/types/ResourceConfiguration.md +1 -1
  508. package/dist/okf/types/ResourceMetricsConfiguration.md +21 -0
  509. package/dist/okf/types/RestApi.md +1 -0
  510. package/dist/okf/types/RetrievalInstruction.md +32 -0
  511. package/dist/okf/types/RouterOutput.md +1 -0
  512. package/dist/okf/types/Rule.md +31 -0
  513. package/dist/okf/types/RunCache.md +29 -0
  514. package/dist/okf/types/Runtime.md +2 -1
  515. package/dist/okf/types/SCNInstance.md +33 -0
  516. package/dist/okf/types/SDBDomain.md +2 -2
  517. package/dist/okf/types/SMBFileShare.md +49 -0
  518. package/dist/okf/types/SageMakerArtifact.md +27 -0
  519. package/dist/okf/types/SageMakerEndpoint.md +0 -1
  520. package/dist/okf/types/ScalableTarget.md +1 -0
  521. package/dist/okf/types/ScalingPlan.md +6 -6
  522. package/dist/okf/types/ScheduledReport.md +31 -0
  523. package/dist/okf/types/SecondaryNetwork.md +26 -0
  524. package/dist/okf/types/SecurityAgentArtifact.md +25 -0
  525. package/dist/okf/types/SecurityAgentIntegration.md +31 -0
  526. package/dist/okf/types/Server.md +1 -0
  527. package/dist/okf/types/ServerlessCache.md +2 -0
  528. package/dist/okf/types/ServerlessCacheSnapshot.md +31 -0
  529. package/dist/okf/types/ServerlessRepoApplication.md +32 -0
  530. package/dist/okf/types/ServiceDiscoveryInstance.md +3 -7
  531. package/dist/okf/types/SipMediaApplication.md +27 -0
  532. package/dist/okf/types/SiteToSiteVpnAttachment.md +2 -0
  533. package/dist/okf/types/SnapshotCopyGrant.md +20 -0
  534. package/dist/okf/types/Solution.md +1 -0
  535. package/dist/okf/types/SourceAssociation.md +25 -0
  536. package/dist/okf/types/SourceCredential.md +6 -6
  537. package/dist/okf/types/SourceNetwork.md +23 -0
  538. package/dist/okf/types/StackFleetAssociation.md +2 -7
  539. package/dist/okf/types/StorageTierPolicy.md +20 -0
  540. package/dist/okf/types/StorageVirtualMachine.md +9 -9
  541. package/dist/okf/types/Stream.md +28 -0
  542. package/dist/okf/types/SubnetCidrReservation.md +26 -0
  543. package/dist/okf/types/SubscriptionProvider.md +26 -0
  544. package/dist/okf/types/SupportPermit.md +29 -0
  545. package/dist/okf/types/Table.md +2 -1
  546. package/dist/okf/types/TableOptimizer.md +5 -10
  547. package/dist/okf/types/Tape.md +31 -0
  548. package/dist/okf/types/Template.md +36 -0
  549. package/dist/okf/types/Tenant.md +2 -0
  550. package/dist/okf/types/Terminology.md +39 -0
  551. package/dist/okf/types/Thesaurus.md +25 -0
  552. package/dist/okf/types/ThingPrincipalAttachment.md +3 -8
  553. package/dist/okf/types/Topic.md +1 -0
  554. package/dist/okf/types/TopicRuleDestination.md +1 -0
  555. package/dist/okf/types/TrafficPolicy.md +26 -0
  556. package/dist/okf/types/TrafficPolicyInstance.md +28 -0
  557. package/dist/okf/types/TranscribeVocabulary.md +27 -0
  558. package/dist/okf/types/TransitGatewayRouteTableAttachment.md +2 -0
  559. package/dist/okf/types/TransitVirtualInterface.md +1 -0
  560. package/dist/okf/types/Tunnel.md +25 -0
  561. package/dist/okf/types/UsageLimit.md +26 -0
  562. package/dist/okf/types/UseCase.md +23 -0
  563. package/dist/okf/types/User.md +47 -0
  564. package/dist/okf/types/VPCEndpoint.md +1 -1
  565. package/dist/okf/types/VPCEndpointService.md +6 -0
  566. package/dist/okf/types/VPCPeeringConnection.md +2 -2
  567. package/dist/okf/types/VPNConcentrator.md +1 -1
  568. package/dist/okf/types/VPNConnection.md +1 -1
  569. package/dist/okf/types/VerifiedDestinationNumber.md +25 -0
  570. package/dist/okf/types/View.md +27 -0
  571. package/dist/okf/types/VoiceConnector.md +30 -0
  572. package/dist/okf/types/Volume.md +44 -0
  573. package/dist/okf/types/Vpc.md +1 -1
  574. package/dist/okf/types/VpcAttachment.md +2 -0
  575. package/dist/okf/types/WebFunction.md +27 -0
  576. package/dist/okf/types/WebFunctionEndpoint.md +44 -0
  577. package/dist/okf/types/WebFunctionRevision.md +32 -0
  578. package/dist/okf/types/WickrNetwork.md +27 -0
  579. package/dist/okf/types/Worker.md +29 -0
  580. package/dist/okf/types/Workforce.md +26 -0
  581. package/dist/okf/types/Workload.md +35 -0
  582. package/dist/okf/types/WorkloadEstimate.md +35 -0
  583. package/dist/okf/types/Workspace.md +28 -0
  584. package/dist/okf/types/Workteam.md +8 -8
  585. package/dist/op/activities/aws-apply.js +214 -0
  586. package/dist/op/activities/floci.js +97 -0
  587. package/dist/op/activities/index.js +32 -0
  588. package/dist/op/builders.js +50 -0
  589. package/dist/ownership.js +52 -0
  590. package/dist/package-cli.js +25 -0
  591. package/dist/parameter.js +19 -0
  592. package/dist/plugin.d.ts.map +1 -1
  593. package/dist/plugin.js +1012 -0
  594. package/dist/properties.js +166 -0
  595. package/dist/pseudo.js +25 -0
  596. package/dist/receipt-store.d.ts.map +1 -1
  597. package/dist/receipt-store.js +233 -0
  598. package/dist/reference-catalog.js +106 -0
  599. package/dist/rules/ext001.ts +3 -3
  600. package/dist/rules/waw016.ts +2 -2
  601. package/dist/serializer.js +529 -0
  602. package/dist/spec/fetch.js +193 -0
  603. package/dist/spec/parse.js +259 -0
  604. package/dist/spec/pin.js +185 -0
  605. package/dist/spec/pinned-types.json +203 -0
  606. package/dist/stack-errors.js +14 -0
  607. package/dist/taggable.d.ts.map +1 -1
  608. package/dist/taggable.js +33 -0
  609. package/dist/teardown.js +199 -0
  610. package/dist/template-sections.js +53 -0
  611. package/dist/template-transform.js +50 -0
  612. package/dist/types/index.d.ts +18847 -1124
  613. package/dist/validate-cli.js +16 -0
  614. package/dist/validate.js +33 -0
  615. package/package.json +9 -9
  616. package/src/agentcore/trace-fetch.ts +2 -1
  617. package/src/api/credential-chain.ts +119 -9
  618. package/src/api/credential-isolation.test.ts +72 -0
  619. package/src/api/read-client-chain.test.ts +159 -0
  620. package/src/api/read-client.ts +42 -6
  621. package/src/api/sigv4.ts +4 -4
  622. package/src/caller-identity.ts +3 -5
  623. package/src/codegen/any-budget.test.ts +12 -2
  624. package/src/codegen/generate.ts +9 -0
  625. package/src/codegen/package.ts +2 -2
  626. package/src/codegen/patches.test.ts +95 -0
  627. package/src/codegen/patches.ts +53 -9
  628. package/src/codegen/property-overlay.json +1 -16
  629. package/src/components/apply.ts +218 -6
  630. package/src/components/cfn-plan-floci.e2e.test.ts +76 -0
  631. package/src/components/cfn-plan.test.ts +225 -16
  632. package/src/components/cloud-executor.ts +73 -25
  633. package/src/deep-observe.ts +2 -1
  634. package/src/disruption.ts +2 -1
  635. package/src/generated/index.d.ts +18847 -1124
  636. package/src/generated/index.ts +1376 -161
  637. package/src/generated/lexicon-aws.json +17359 -784
  638. package/src/health.test.ts +136 -0
  639. package/src/health.ts +281 -0
  640. package/src/identity-observe.ts +2 -1
  641. package/src/lint/post-synth/ext001.ts +3 -3
  642. package/src/lint/post-synth/waw016.ts +2 -2
  643. package/src/lsp/completions.ts +2 -1
  644. package/src/lsp/hover.ts +2 -1
  645. package/src/plugin.ts +10 -1
  646. package/src/receipt-store.ts +2 -1
  647. package/src/spec/pin.ts +3 -3
  648. package/src/spec/pinned-types.json +203 -0
  649. package/src/taggable.ts +2 -2
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Deep-read sources for the EC2 topology types (#1269).
3
+ *
4
+ * chant's distinguishing answers are folds over topology: `internetFacing`
5
+ * resolves subnet -> route table -> internet gateway, `effectiveIngress`
6
+ * resolves rules across attached security groups, and the default-VPC
7
+ * classification (`defaults.ts`) reads the provider's own markers. The inputs
8
+ * to all of them are the types this file covers — with only the original four
9
+ * kinds readable, a deep snapshot of an EC2 estate carried almost no
10
+ * properties, and a snapshot-backed query could answer identity questions but
11
+ * not a single fold question.
12
+ *
13
+ * Two sources, chosen per type:
14
+ *
15
+ * - The container types (VPC, subnet, route table, internet gateway) read
16
+ * through the EC2 describes. The fold facts live there and nowhere else:
17
+ * `IsDefault`, `DefaultForAz` and a subnet's live `MapPublicIpOnLaunch` are
18
+ * not part of the CloudFormation resource model, so Cloud Control cannot
19
+ * report them. The describes are also bulk (one call per type for the whole
20
+ * stack) and are implemented by the emulators that do not serve Cloud
21
+ * Control's `GetResource`.
22
+ *
23
+ * - The join types (route, association, gateway attachment) and the two whose
24
+ * describes do not fit a flat bulk join (instance rows nest inside
25
+ * reservations; launch-template data lives in a separate versions call) read
26
+ * through Cloud Control, which returns their model in the declared side's
27
+ * own shape.
28
+ *
29
+ * Each type carries its normalization entries alongside (#1269's note: adding
30
+ * a type without them trades a hole for a false positive, which is worse).
31
+ * They are merged into the tables in `deep-observe.ts`.
32
+ */
33
+ /**
34
+ * `describe-vpcs` -> the `AWS::EC2::VPC` resource model, plus `IsDefault`.
35
+ *
36
+ * `IsDefault` is the provider's own marker for the VPC nobody wrote — the fact
37
+ * the default classification reads — and it exists only on this surface.
38
+ * Carried even though the model does not name it; the diff subtracts it as a
39
+ * service default (`false`, gated on source silence) so a CloudFormation-made
40
+ * VPC does not report it as undeclared drift.
41
+ */
42
+ export function vpcToModel(row) {
43
+ return {
44
+ // The schema's readOnlyProperties prune the id after the ownership check.
45
+ ...(typeof row.VpcId === "string" ? { VpcId: row.VpcId } : {}),
46
+ ...(typeof row.CidrBlock === "string" ? { CidrBlock: row.CidrBlock } : {}),
47
+ ...(typeof row.InstanceTenancy === "string" ? { InstanceTenancy: row.InstanceTenancy } : {}),
48
+ ...(typeof row.IsDefault === "boolean" ? { IsDefault: row.IsDefault } : {}),
49
+ ...nonEmptyTags(row),
50
+ };
51
+ }
52
+ /**
53
+ * `describe-subnets` -> the `AWS::EC2::Subnet` resource model, plus
54
+ * `DefaultForAz`.
55
+ *
56
+ * `MapPublicIpOnLaunch` is half of `internetFacing`; `DefaultForAz` is the
57
+ * provider's default-subnet marker, off the model for the same reason as a
58
+ * VPC's `IsDefault` and handled the same way.
59
+ */
60
+ export function subnetToModel(row) {
61
+ return {
62
+ ...(typeof row.SubnetId === "string" ? { SubnetId: row.SubnetId } : {}),
63
+ ...(typeof row.VpcId === "string" ? { VpcId: row.VpcId } : {}),
64
+ ...(typeof row.CidrBlock === "string" ? { CidrBlock: row.CidrBlock } : {}),
65
+ ...(typeof row.AvailabilityZone === "string" ? { AvailabilityZone: row.AvailabilityZone } : {}),
66
+ ...(typeof row.AvailabilityZoneId === "string" ? { AvailabilityZoneId: row.AvailabilityZoneId } : {}),
67
+ ...(typeof row.MapPublicIpOnLaunch === "boolean" ? { MapPublicIpOnLaunch: row.MapPublicIpOnLaunch } : {}),
68
+ ...(typeof row.AssignIpv6AddressOnCreation === "boolean"
69
+ ? { AssignIpv6AddressOnCreation: row.AssignIpv6AddressOnCreation }
70
+ : {}),
71
+ ...(typeof row.EnableDns64 === "boolean" ? { EnableDns64: row.EnableDns64 } : {}),
72
+ ...(typeof row.Ipv6Native === "boolean" ? { Ipv6Native: row.Ipv6Native } : {}),
73
+ ...(typeof row.DefaultForAz === "boolean" ? { DefaultForAz: row.DefaultForAz } : {}),
74
+ ...nonEmptyTags(row),
75
+ };
76
+ }
77
+ /**
78
+ * `describe-route-tables` -> the `AWS::EC2::RouteTable` resource model.
79
+ *
80
+ * The row also carries `Routes` and `Associations`, and this mapping drops
81
+ * them on purpose: a template declares each route as its own
82
+ * `AWS::EC2::Route` and each association as its own
83
+ * `AWS::EC2::SubnetRouteTableAssociation`, both covered below, so carrying
84
+ * them here would report every declared route twice — once as an undeclared
85
+ * array on the table and once through its own resource.
86
+ */
87
+ export function routeTableToModel(row) {
88
+ return {
89
+ ...(typeof row.RouteTableId === "string" ? { RouteTableId: row.RouteTableId } : {}),
90
+ ...(typeof row.VpcId === "string" ? { VpcId: row.VpcId } : {}),
91
+ ...nonEmptyTags(row),
92
+ };
93
+ }
94
+ /** `describe-internet-gateways` -> the `AWS::EC2::InternetGateway` model, which is tags and nothing else. */
95
+ export function internetGatewayToModel(row) {
96
+ return {
97
+ ...(typeof row.InternetGatewayId === "string" ? { InternetGatewayId: row.InternetGatewayId } : {}),
98
+ ...nonEmptyTags(row),
99
+ };
100
+ }
101
+ /**
102
+ * An empty tag set is the absence of tags, not a value. EC2 always sends the
103
+ * key, so carrying it through reports `Tags: <undeclared> -> []` on every
104
+ * untagged resource — agreement rendered as drift. Same rule as the
105
+ * security-group mapping.
106
+ */
107
+ function nonEmptyTags(row) {
108
+ return Array.isArray(row.Tags) && row.Tags.length > 0 ? { Tags: row.Tags } : {};
109
+ }
110
+ /**
111
+ * The topology types' entries for `DEEP_SOURCES`.
112
+ *
113
+ * The routing-chain joins are addressed by their physical id — for a
114
+ * registry-backed type CloudFormation's physical id *is* the Cloud Control
115
+ * identifier (`rtb-…|0.0.0.0/0` for a route) — so Cloud Control's
116
+ * one-get-per-resource shape fits them exactly and returns the declared
117
+ * model's own field names.
118
+ */
119
+ export const EC2_TOPOLOGY_SOURCES = {
120
+ "AWS::EC2::VPC": {
121
+ via: "ec2",
122
+ argv: ["ec2", "describe-vpcs"],
123
+ idFlag: "--vpc-ids",
124
+ key: "Vpcs",
125
+ id: "VpcId",
126
+ toModel: vpcToModel,
127
+ },
128
+ "AWS::EC2::Subnet": {
129
+ via: "ec2",
130
+ argv: ["ec2", "describe-subnets"],
131
+ idFlag: "--subnet-ids",
132
+ key: "Subnets",
133
+ id: "SubnetId",
134
+ toModel: subnetToModel,
135
+ },
136
+ "AWS::EC2::RouteTable": {
137
+ via: "ec2",
138
+ argv: ["ec2", "describe-route-tables"],
139
+ idFlag: "--route-table-ids",
140
+ key: "RouteTables",
141
+ id: "RouteTableId",
142
+ toModel: routeTableToModel,
143
+ },
144
+ "AWS::EC2::InternetGateway": {
145
+ via: "ec2",
146
+ argv: ["ec2", "describe-internet-gateways"],
147
+ idFlag: "--internet-gateway-ids",
148
+ key: "InternetGateways",
149
+ id: "InternetGatewayId",
150
+ toModel: internetGatewayToModel,
151
+ },
152
+ // The `0.0.0.0/0` -> igw edge `internetFacing` walks.
153
+ "AWS::EC2::Route": { via: "cloud-control" },
154
+ // Subnet -> route table.
155
+ "AWS::EC2::SubnetRouteTableAssociation": { via: "cloud-control" },
156
+ // Igw -> VPC.
157
+ "AWS::EC2::VPCGatewayAttachment": { via: "cloud-control" },
158
+ // Subnet, security groups, launch template — the instance end of both folds.
159
+ "AWS::EC2::Instance": { via: "cloud-control" },
160
+ // The indirect security-group hop `effectiveIngress` resolves through.
161
+ "AWS::EC2::LaunchTemplate": { via: "cloud-control" },
162
+ };
163
+ /**
164
+ * Service defaults for the topology types, merged into
165
+ * `AWS_SERVICE_DEFAULTS`. Subtracted on the live side only where source never
166
+ * declared the property — which is how the fold facts (`IsDefault`,
167
+ * `DefaultForAz`, a live `MapPublicIpOnLaunch`) stay in the snapshot for a
168
+ * query to read while never surfacing as drift on a resource CloudFormation
169
+ * itself created.
170
+ */
171
+ export const EC2_TOPOLOGY_SERVICE_DEFAULTS = {
172
+ "AWS::EC2::VPC": {
173
+ InstanceTenancy: "default",
174
+ IsDefault: false,
175
+ },
176
+ "AWS::EC2::Subnet": {
177
+ MapPublicIpOnLaunch: false,
178
+ AssignIpv6AddressOnCreation: false,
179
+ EnableDns64: false,
180
+ Ipv6Native: false,
181
+ DefaultForAz: false,
182
+ },
183
+ "AWS::EC2::Instance": {
184
+ Tenancy: "default",
185
+ Monitoring: false,
186
+ EbsOptimized: false,
187
+ SourceDestCheck: true,
188
+ DisableApiTermination: false,
189
+ },
190
+ };
191
+ /**
192
+ * Values the service picks when the template does not supply one, merged into
193
+ * `AWS_GENERATED_NAMES`. A subnet that names no availability zone gets one
194
+ * assigned — a different one is real placement drift only when the template
195
+ * had an opinion, which is exactly the counterpart gate.
196
+ */
197
+ export const EC2_TOPOLOGY_GENERATED_NAMES = {
198
+ "AWS::EC2::Subnet": new Set(["AvailabilityZone", "AvailabilityZoneId"]),
199
+ "AWS::EC2::Instance": new Set(["AvailabilityZone"]),
200
+ };
201
+ /**
202
+ * Declared properties a type's source cannot see (#1269).
203
+ *
204
+ * `describe-vpcs` does not return the DNS attributes — they live behind
205
+ * `describe-vpc-attribute` — and neither describe returns the IPAM inputs,
206
+ * which are consumed at creation. A declared value for one of these has
207
+ * nothing live to stand against, so the diff would report `value -> <absent>`
208
+ * on every clean apply: a blind spot rendered as drift. Pruned on the
209
+ * declared side, and only where the live tree is silent, so a source that
210
+ * does report the field (Cloud Control, some day) is still compared.
211
+ */
212
+ export const AWS_DEEP_BLIND_SPOTS = {
213
+ "AWS::EC2::VPC": new Set([
214
+ "EnableDnsSupport",
215
+ "EnableDnsHostnames",
216
+ "Ipv4IpamPoolId",
217
+ "Ipv4NetmaskLength",
218
+ ]),
219
+ "AWS::EC2::Subnet": new Set([
220
+ "Ipv6CidrBlock",
221
+ "Ipv4IpamPoolId",
222
+ "Ipv4NetmaskLength",
223
+ "Ipv6IpamPoolId",
224
+ "Ipv6NetmaskLength",
225
+ ]),
226
+ };
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Default Tags — declares project-wide tags for all taggable resources.
3
+ *
4
+ * When a project exports a `defaultTags(...)` declaration, the serializer
5
+ * automatically injects those tags into every taggable resource at synthesis
6
+ * time. Explicit tags on individual resources take precedence.
7
+ */
8
+ import { DECLARABLE_MARKER } from "@intentius/chant/declarable";
9
+ /**
10
+ * Marker symbol for default tags identification.
11
+ */
12
+ export const DEFAULT_TAGS_MARKER = Symbol.for("chant.aws.defaultTags");
13
+ /**
14
+ * Type guard for DefaultTags.
15
+ */
16
+ export function isDefaultTags(value) {
17
+ return (typeof value === "object" &&
18
+ value !== null &&
19
+ DEFAULT_TAGS_MARKER in value &&
20
+ value[DEFAULT_TAGS_MARKER] === true);
21
+ }
22
+ /**
23
+ * Declare project-wide default tags for all taggable resources.
24
+ *
25
+ * Tags are injected at synthesis time into every resource that supports
26
+ * tagging (per the CloudFormation Registry metadata). If a resource has
27
+ * an explicit Tag with the same Key, the explicit value wins.
28
+ *
29
+ * @param tags - Array of { Key, Value } tag entries
30
+ * @returns A DefaultTags Declarable
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * import { defaultTags, Sub, AWS } from "@intentius/chant-lexicon-aws";
35
+ *
36
+ * export const tags = defaultTags([
37
+ * { Key: "Project", Value: "my-app" },
38
+ * { Key: "Environment", Value: Sub`${AWS.StackName}` },
39
+ * ]);
40
+ * ```
41
+ */
42
+ export function defaultTags(tags) {
43
+ return {
44
+ [DEFAULT_TAGS_MARKER]: true,
45
+ [DECLARABLE_MARKER]: true,
46
+ lexicon: "aws",
47
+ entityType: "chant:aws:defaultTags",
48
+ tags,
49
+ };
50
+ }
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Which resources the provider created, rather than anyone's infrastructure code.
3
+ *
4
+ * Every account arrives with resources nobody wrote: a default VPC and its
5
+ * subnets, a default security group per VPC, a main route table, AWS-managed
6
+ * KMS keys and IAM policies. They are yours to account for and were never
7
+ * yours to declare, and until now chant recorded them looking exactly like
8
+ * everything else.
9
+ *
10
+ * That matters wherever a question is about what you built. Asked which
11
+ * security groups were unused, agents split three ways on the same correct set
12
+ * of four — one excluded the three VPC defaults as "not real cleanup
13
+ * candidates" and answered one, another counted something extra and answered
14
+ * five. The answers that were accepted all did the same thing: listed all four
15
+ * and said which were defaults. They could only do that by recognising them,
16
+ * and chant gave them nothing to recognise them by.
17
+ *
18
+ * This records a fact and stops. `providerDefault: true` says the provider
19
+ * created this; it does not say the resource is unused, safe to ignore, or
20
+ * exempt from anything. Deciding that here would put a conclusion in an
21
+ * observation — the mistake `liveInternetFacing` made and #1271 undid — and it
22
+ * would be wrong in this very case, since the accepted answers count defaults
23
+ * as unused.
24
+ *
25
+ * Almost none of this is chant's judgement. AWS marks these itself, on the same
26
+ * payloads chant already reads; the fields were simply being dropped. The one
27
+ * derivation is the security group, and it is safe because `default` is a
28
+ * reserved group name — AWS rejects it on create, so a group called `default`
29
+ * is that VPC's default group.
30
+ */
31
+ /**
32
+ * Per kind, the provider's own marker. Extending this is the way to widen.
33
+ *
34
+ * Each predicate reads a field AWS already returns, so this is a passthrough
35
+ * rather than a heuristic — a resource is a default because the provider says
36
+ * so, not because it looks like one.
37
+ */
38
+ const PROVIDER_DEFAULT = {
39
+ "AWS::EC2::VPC": (a) => a.IsDefault === true,
40
+ "AWS::EC2::Subnet": (a) => a.DefaultForAz === true,
41
+ "AWS::EC2::NetworkAcl": (a) => a.IsDefault === true,
42
+ // `default` is a reserved group name: AWS refuses it on create, so a group
43
+ // carrying it is the one AWS made with the VPC.
44
+ "AWS::EC2::SecurityGroup": (a) => a.GroupName === "default",
45
+ // The main route table is the one a subnet falls back to when it has no
46
+ // explicit association — created with the VPC and not by anyone.
47
+ "AWS::EC2::RouteTable": (a) => Array.isArray(a.Associations) &&
48
+ a.Associations.some((x) => x?.Main === true),
49
+ "AWS::KMS::Key": (a) => a.KeyManager === "AWS",
50
+ "AWS::IAM::ManagedPolicy": (a) => typeof a.Arn === "string" && a.Arn.startsWith("arn:aws:iam::aws:policy/"),
51
+ "AWS::IAM::Policy": (a) => typeof a.Arn === "string" && a.Arn.startsWith("arn:aws:iam::aws:policy/"),
52
+ };
53
+ /** True when this lexicon can tell whether the kind is a provider default. */
54
+ export function canDetectDefault(kind) {
55
+ return kind in PROVIDER_DEFAULT;
56
+ }
57
+ /** The kinds whose provider-default status this lexicon can report. */
58
+ export const DEFAULT_AWARE_KINDS = Object.keys(PROVIDER_DEFAULT);
59
+ /**
60
+ * Mark the resources the provider created.
61
+ *
62
+ * Only ever sets the attribute to `true`, and only for kinds with a known
63
+ * marker: absent means "not a default, or chant cannot tell", and those are
64
+ * genuinely different from each other in a way a blanket `false` would hide.
65
+ */
66
+ export function stampProviderDefaults(resources) {
67
+ const stamped = {};
68
+ for (const [name, meta] of Object.entries(resources)) {
69
+ const test = PROVIDER_DEFAULT[meta.type];
70
+ const attrs = (meta.attributes ?? {});
71
+ let isDefault = false;
72
+ try {
73
+ isDefault = test ? test(attrs) : false;
74
+ }
75
+ catch {
76
+ // A malformed payload is not a default; it is a payload chant could not
77
+ // read, and the rest of the observation is still good.
78
+ isDefault = false;
79
+ }
80
+ stamped[name] = isDefault
81
+ ? { ...meta, attributes: { ...attrs, providerDefault: true } }
82
+ : meta;
83
+ }
84
+ return stamped;
85
+ }
@@ -0,0 +1,269 @@
1
+ /**
2
+ * What an AWS estate depends on but does not declare (#1273).
3
+ *
4
+ * `describeResources` is scoped to the stack. An instance placed in the
5
+ * account's default VPC routes through a route table nobody declared, so that
6
+ * table is never observed, never a node, and no fold can traverse to it. The
7
+ * answer used to be computed inside the lexicon and injected as an attribute —
8
+ * which is a conclusion no snapshot can record enough to recompute.
9
+ *
10
+ * This reports the resources instead, so the one graph fold derives the answer.
11
+ *
12
+ * The closure is bounded: start from the observed instances, follow the
13
+ * reference chain the catalog declares as meaningful — subnet, then route
14
+ * table, then gateway — and stop. Anything not reached from a declared resource
15
+ * along a declared reference is not a dependency, it is just the account.
16
+ */
17
+ import { applyAwsEndpointArgv } from "./components/cloud-executor.js";
18
+ /** Cloud-shaped ids are stable across a redeploy and unique per account. */
19
+ const nodeId = (physicalId) => physicalId;
20
+ /**
21
+ * Flatten `IpPermissions` into the CloudFormation-shaped rules the fold reads.
22
+ *
23
+ * The two AWS surfaces disagree about the same concept: a template's
24
+ * `SecurityGroupIngress` carries `CidrIp` flat on the rule, while
25
+ * `describe-security-groups` nests sources under `IpRanges[]`, `Ipv6Ranges[]`
26
+ * and `UserIdGroupPairs[]`, and one permission can hold several. Handing the
27
+ * describe shape to the fold unchanged yields a rule with no recognisable
28
+ * source, which `normalizeIngress` renders as `?` — an ingress rule that
29
+ * matches no CIDR query and quietly narrows the answer.
30
+ *
31
+ * One rule per source, because that is what the flat shape means.
32
+ */
33
+ export function toIngressRules(permissions) {
34
+ const rules = [];
35
+ for (const permission of permissions) {
36
+ const base = {
37
+ IpProtocol: permission.IpProtocol ?? "-1",
38
+ ...(permission.FromPort != null ? { FromPort: permission.FromPort } : {}),
39
+ ...(permission.ToPort != null ? { ToPort: permission.ToPort } : {}),
40
+ };
41
+ // A source's own `Description` rides with it. The fold ignores it, but the
42
+ // deep reader (#1269) matches rules by their whole value against a template
43
+ // that carries one, and a dropped field there reports every rule twice.
44
+ const described = (source) => source.Description ? { Description: source.Description } : {};
45
+ for (const range of permission.IpRanges ?? []) {
46
+ if (range.CidrIp)
47
+ rules.push({ ...base, CidrIp: range.CidrIp, ...described(range) });
48
+ }
49
+ for (const range of permission.Ipv6Ranges ?? []) {
50
+ if (range.CidrIpv6)
51
+ rules.push({ ...base, CidrIpv6: range.CidrIpv6, ...described(range) });
52
+ }
53
+ for (const pair of permission.UserIdGroupPairs ?? []) {
54
+ if (pair.GroupId)
55
+ rules.push({ ...base, SourceSecurityGroupId: pair.GroupId, ...described(pair) });
56
+ }
57
+ }
58
+ return rules;
59
+ }
60
+ /**
61
+ * Read the routing an observed estate depends on.
62
+ *
63
+ * Only the tables that actually serve an observed instance are reported: one
64
+ * reached by an explicit subnet association, or the VPC's main table standing in
65
+ * for a subnet with none. A route table serving nothing chant deployed is not a
66
+ * dependency of this estate.
67
+ */
68
+ export async function observeAwsDependencies(options) {
69
+ const { getRuntime } = await import("@intentius/chant/runtime-adapter");
70
+ const rt = getRuntime();
71
+ const regionArgs = options.region ? ["--region", options.region] : [];
72
+ const run = (args) => rt.spawn(applyAwsEndpointArgv(["aws", ...args, ...regionArgs, "--output", "json"], process.env.AWS_ENDPOINT_URL));
73
+ const resources = {};
74
+ const edges = [];
75
+ // Roots: the instances this estate manages, and where each one sits. Placement
76
+ // comes from the live API rather than the template, because the declared side
77
+ // may only carry a parameter reference to a subnet it never modelled.
78
+ const instances = Object.entries(options.observed).filter(([, meta]) => meta.type === "AWS::EC2::Instance" && meta.physicalId);
79
+ if (instances.length === 0)
80
+ return { resources: {}, edges: [] };
81
+ try {
82
+ const described = await run([
83
+ "ec2",
84
+ "describe-instances",
85
+ "--instance-ids",
86
+ ...instances.map(([, meta]) => meta.physicalId),
87
+ ]);
88
+ if (described.exitCode !== 0)
89
+ return { resources: {}, edges: [] };
90
+ const placement = new Map();
91
+ for (const reservation of (JSON.parse(described.stdout).Reservations ?? [])) {
92
+ for (const instance of reservation.Instances ?? []) {
93
+ placement.set(instance.InstanceId, {
94
+ subnetId: instance.SubnetId,
95
+ vpcId: instance.VpcId,
96
+ securityGroupIds: (instance.SecurityGroups ?? [])
97
+ .map((g) => g.GroupId)
98
+ .filter((id) => typeof id === "string"),
99
+ ...(instance.LaunchTemplate?.LaunchTemplateId
100
+ ? { launchTemplateId: instance.LaunchTemplate.LaunchTemplateId }
101
+ : {}),
102
+ });
103
+ }
104
+ }
105
+ const tablesResult = await run(["ec2", "describe-route-tables"]);
106
+ if (tablesResult.exitCode !== 0)
107
+ return { resources: {}, edges: [] };
108
+ const tables = (JSON.parse(tablesResult.stdout).RouteTables ?? []);
109
+ // Which table serves which subnet, and which is a VPC's main table — the
110
+ // two ways an instance's subnet resolves to routing.
111
+ const bySubnet = new Map();
112
+ const mainByVpc = new Map();
113
+ for (const table of tables) {
114
+ for (const association of table.Associations ?? []) {
115
+ if (association.SubnetId)
116
+ bySubnet.set(association.SubnetId, table);
117
+ if (association.Main && table.VpcId)
118
+ mainByVpc.set(table.VpcId, table);
119
+ }
120
+ }
121
+ // Security groups and launch templates the estate is guarded by (#1276).
122
+ // `effectiveIngress` resolved these from the declared graph alone, which is
123
+ // right until an instance sits in a group it did not declare — a shared
124
+ // group, one attached through someone else's launch template. Then the
125
+ // group is not a node, its rules are never read, and the instance reads as
126
+ // less exposed than it is. Under-reporting is the dangerous direction for a
127
+ // query whose whole purpose is finding what the internet can reach.
128
+ const declaredGroupIds = new Set(Object.values(options.observed)
129
+ .filter((m) => m.type === "AWS::EC2::SecurityGroup" && m.physicalId)
130
+ .map((m) => m.physicalId));
131
+ const declaredTemplateIds = new Set(Object.values(options.observed)
132
+ .filter((m) => m.type === "AWS::EC2::LaunchTemplate" && m.physicalId)
133
+ .map((m) => m.physicalId));
134
+ const groupsById = new Map();
135
+ const wantedGroups = new Set();
136
+ const templatesById = new Map();
137
+ for (const [, meta] of instances) {
138
+ const where = placement.get(meta.physicalId);
139
+ if (!where)
140
+ continue;
141
+ for (const id of where.securityGroupIds)
142
+ if (!declaredGroupIds.has(id))
143
+ wantedGroups.add(id);
144
+ if (where.launchTemplateId && !declaredTemplateIds.has(where.launchTemplateId)) {
145
+ const versions = await run([
146
+ "ec2",
147
+ "describe-launch-template-versions",
148
+ "--launch-template-id",
149
+ where.launchTemplateId,
150
+ "--versions",
151
+ "$Latest",
152
+ ]);
153
+ if (versions.exitCode === 0) {
154
+ const templateGroups = (JSON.parse(versions.stdout).LaunchTemplateVersions ?? []).flatMap((v) => v.LaunchTemplateData?.SecurityGroupIds ?? []);
155
+ templatesById.set(where.launchTemplateId, templateGroups);
156
+ for (const id of templateGroups)
157
+ if (!declaredGroupIds.has(id))
158
+ wantedGroups.add(id);
159
+ }
160
+ }
161
+ }
162
+ if (wantedGroups.size > 0) {
163
+ const described = await run(["ec2", "describe-security-groups", "--group-ids", ...wantedGroups]);
164
+ if (described.exitCode === 0) {
165
+ for (const group of (JSON.parse(described.stdout).SecurityGroups ?? [])) {
166
+ if (!group.GroupId)
167
+ continue;
168
+ groupsById.set(group.GroupId, {
169
+ GroupId: group.GroupId,
170
+ VpcId: group.VpcId,
171
+ SecurityGroupIngress: toIngressRules(group.IpPermissions ?? []),
172
+ });
173
+ }
174
+ }
175
+ }
176
+ const record = (logicalId, id, type, physicalId, attrs) => {
177
+ const existing = resources[id];
178
+ resources[id] = {
179
+ type,
180
+ status: "OBSERVED",
181
+ ...(physicalId ? { physicalId } : {}),
182
+ attributes: attrs,
183
+ ownership: "foreign",
184
+ referencedBy: [...new Set([...(existing?.referencedBy ?? []), logicalId])],
185
+ };
186
+ };
187
+ for (const [logicalId, meta] of instances) {
188
+ const where = placement.get(meta.physicalId);
189
+ if (!where)
190
+ continue;
191
+ // Guarding first, and unconditionally: an instance with no internet route
192
+ // still has security groups, and `effectiveIngress` is asked about
193
+ // instances that are not internet-facing too.
194
+ for (const groupId of where.securityGroupIds) {
195
+ const attrs = groupsById.get(groupId);
196
+ if (!attrs)
197
+ continue; // declared, or unreadable — either way not a dependency
198
+ record(logicalId, nodeId(groupId), "AWS::EC2::SecurityGroup", groupId, attrs);
199
+ edges.push({ from: logicalId, to: nodeId(groupId), kind: "ref", viaAttr: "SecurityGroupIds" });
200
+ }
201
+ const templateGroups = where.launchTemplateId ? templatesById.get(where.launchTemplateId) : undefined;
202
+ if (where.launchTemplateId && templateGroups) {
203
+ const templateNode = nodeId(where.launchTemplateId);
204
+ record(logicalId, templateNode, "AWS::EC2::LaunchTemplate", where.launchTemplateId, {
205
+ LaunchTemplateId: where.launchTemplateId,
206
+ LaunchTemplateData: { SecurityGroupIds: templateGroups },
207
+ });
208
+ edges.push({ from: logicalId, to: templateNode, kind: "ref", viaAttr: "LaunchTemplateId" });
209
+ for (const groupId of templateGroups) {
210
+ const attrs = groupsById.get(groupId);
211
+ if (!attrs)
212
+ continue;
213
+ record(logicalId, nodeId(groupId), "AWS::EC2::SecurityGroup", groupId, attrs);
214
+ edges.push({ from: templateNode, to: nodeId(groupId), kind: "ref", viaAttr: "SecurityGroupIds" });
215
+ }
216
+ }
217
+ // Explicit subnet association first, else the VPC's main table — the two
218
+ // ways an instance's placement resolves to routing.
219
+ const table = (where.subnetId ? bySubnet.get(where.subnetId) : undefined) ??
220
+ (where.vpcId ? mainByVpc.get(where.vpcId) : undefined);
221
+ if (!table?.RouteTableId)
222
+ continue;
223
+ // Only routing that actually reaches the internet is worth reporting: an
224
+ // internal table adds a node and an edge and answers nothing.
225
+ const igwRoute = (table.Routes ?? []).find((route) => typeof route.GatewayId === "string" &&
226
+ route.GatewayId.startsWith("igw-") &&
227
+ (route.DestinationCidrBlock == null || route.DestinationCidrBlock === "0.0.0.0/0"));
228
+ if (!igwRoute?.GatewayId)
229
+ continue;
230
+ const subnetNode = where.subnetId ? nodeId(where.subnetId) : undefined;
231
+ const tableNode = nodeId(table.RouteTableId);
232
+ const gatewayNode = nodeId(igwRoute.GatewayId);
233
+ const associationNode = `${tableNode}::assoc::${subnetNode ?? table.VpcId ?? "main"}`;
234
+ const routeNode = `${tableNode}::route::${gatewayNode}`;
235
+ if (subnetNode)
236
+ record(logicalId, subnetNode, "AWS::EC2::Subnet", where.subnetId, { VpcId: where.vpcId });
237
+ record(logicalId, tableNode, "AWS::EC2::RouteTable", table.RouteTableId, { VpcId: table.VpcId });
238
+ record(logicalId, gatewayNode, "AWS::EC2::InternetGateway", igwRoute.GatewayId, {
239
+ InternetGatewayId: igwRoute.GatewayId,
240
+ });
241
+ record(logicalId, associationNode, "AWS::EC2::SubnetRouteTableAssociation", undefined, {
242
+ SubnetId: where.subnetId,
243
+ RouteTableId: table.RouteTableId,
244
+ });
245
+ record(logicalId, routeNode, "AWS::EC2::Route", undefined, {
246
+ RouteTableId: table.RouteTableId,
247
+ GatewayId: igwRoute.GatewayId,
248
+ DestinationCidrBlock: igwRoute.DestinationCidrBlock ?? "0.0.0.0/0",
249
+ });
250
+ // The chain enrichEffectiveTopology walks, reported explicitly rather
251
+ // than left to be reconstructed: an association and a route have no
252
+ // physical id of their own, so no identity index can resolve them.
253
+ if (subnetNode) {
254
+ edges.push({ from: logicalId, to: subnetNode, kind: "ref", viaAttr: "SubnetId" });
255
+ edges.push({ from: associationNode, to: subnetNode, kind: "ref", viaAttr: "SubnetId" });
256
+ }
257
+ edges.push({ from: associationNode, to: tableNode, kind: "ref", viaAttr: "RouteTableId" });
258
+ edges.push({ from: routeNode, to: tableNode, kind: "ref", viaAttr: "RouteTableId" });
259
+ edges.push({ from: routeNode, to: gatewayNode, kind: "ref", viaAttr: "GatewayId" });
260
+ }
261
+ }
262
+ catch {
263
+ // Best-effort: the managed observation is complete and useful on its own,
264
+ // and failing it because an ambient dependency could not be read would
265
+ // trade a whole answer for a partial one.
266
+ return { resources: {}, edges: [] };
267
+ }
268
+ return { resources, edges };
269
+ }
package/dist/detect.js ADDED
@@ -0,0 +1,21 @@
1
+ /** Edge-safe template detection for aws (CloudFormation) — see #426. */
2
+ export function detectTemplate(data) {
3
+ if (typeof data !== "object" || data === null)
4
+ return false;
5
+ const obj = data;
6
+ // CloudFormation has AWSTemplateFormatVersion
7
+ if (obj.AWSTemplateFormatVersion !== undefined)
8
+ return true;
9
+ // Or Resources with AWS::* types
10
+ if (typeof obj.Resources === "object" && obj.Resources !== null) {
11
+ for (const resource of Object.values(obj.Resources)) {
12
+ if (typeof resource === "object" && resource !== null) {
13
+ const type = resource.Type;
14
+ if (typeof type === "string" && type.startsWith("AWS::")) {
15
+ return true;
16
+ }
17
+ }
18
+ }
19
+ }
20
+ return false;
21
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"disruption.d.ts","sourceRoot":"","sources":["../src/disruption.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAInF,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,oGAAoG;IACpG,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,mBAAmB,CAAC,EAAE,oBAAoB,GAAG,oBAAoB,CAAC;CACnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GACjC,iBAAiB,CAuDnB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAOpC"}
1
+ {"version":3,"file":"disruption.d.ts","sourceRoot":"","sources":["../src/disruption.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAInF,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,oGAAoG;IACpG,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,mBAAmB,CAAC,EAAE,oBAAoB,GAAG,oBAAoB,CAAC;CACnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GACjC,iBAAiB,CAuDnB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAOpC"}