@friggframework/devtools 2.0.0-next.61 → 2.0.0-next.62

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 (305) hide show
  1. package/package.json +14 -7
  2. package/.eslintrc.json +0 -3
  3. package/CHANGELOG.md +0 -132
  4. package/infrastructure/ARCHITECTURE.md +0 -487
  5. package/infrastructure/CLAUDE.md +0 -481
  6. package/infrastructure/HEALTH.md +0 -468
  7. package/infrastructure/README.md +0 -522
  8. package/infrastructure/__tests__/fixtures/mock-aws-resources.js +0 -391
  9. package/infrastructure/__tests__/helpers/test-utils.js +0 -277
  10. package/infrastructure/__tests__/postgres-config.test.js +0 -914
  11. package/infrastructure/__tests__/template-generation.test.js +0 -687
  12. package/infrastructure/create-frigg-infrastructure.js +0 -147
  13. package/infrastructure/docs/POSTGRES-CONFIGURATION.md +0 -630
  14. package/infrastructure/docs/PRE-DEPLOYMENT-HEALTH-CHECK-SPEC.md +0 -1317
  15. package/infrastructure/docs/WEBSOCKET-CONFIGURATION.md +0 -105
  16. package/infrastructure/docs/deployment-instructions.md +0 -268
  17. package/infrastructure/docs/generate-iam-command.md +0 -278
  18. package/infrastructure/docs/iam-policy-templates.md +0 -193
  19. package/infrastructure/domains/database/aurora-builder.js +0 -809
  20. package/infrastructure/domains/database/aurora-builder.test.js +0 -950
  21. package/infrastructure/domains/database/aurora-discovery.js +0 -87
  22. package/infrastructure/domains/database/aurora-discovery.test.js +0 -188
  23. package/infrastructure/domains/database/aurora-resolver.js +0 -210
  24. package/infrastructure/domains/database/aurora-resolver.test.js +0 -347
  25. package/infrastructure/domains/database/migration-builder.js +0 -701
  26. package/infrastructure/domains/database/migration-builder.test.js +0 -321
  27. package/infrastructure/domains/database/migration-resolver.js +0 -163
  28. package/infrastructure/domains/database/migration-resolver.test.js +0 -337
  29. package/infrastructure/domains/health/application/ports/IPropertyReconciler.js +0 -164
  30. package/infrastructure/domains/health/application/ports/IResourceDetector.js +0 -129
  31. package/infrastructure/domains/health/application/ports/IResourceImporter.js +0 -142
  32. package/infrastructure/domains/health/application/ports/IStackRepository.js +0 -131
  33. package/infrastructure/domains/health/application/ports/index.js +0 -26
  34. package/infrastructure/domains/health/application/use-cases/__tests__/execute-resource-import-use-case.test.js +0 -679
  35. package/infrastructure/domains/health/application/use-cases/__tests__/mismatch-analyzer-method-name.test.js +0 -167
  36. package/infrastructure/domains/health/application/use-cases/__tests__/repair-via-import-use-case.test.js +0 -1130
  37. package/infrastructure/domains/health/application/use-cases/execute-resource-import-use-case.js +0 -221
  38. package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.js +0 -152
  39. package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.test.js +0 -343
  40. package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.js +0 -535
  41. package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.test.js +0 -376
  42. package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.js +0 -213
  43. package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.test.js +0 -441
  44. package/infrastructure/domains/health/docs/ACME-DEV-DRIFT-ANALYSIS.md +0 -267
  45. package/infrastructure/domains/health/docs/BUILD-VS-DEPLOYED-TEMPLATE-ANALYSIS.md +0 -324
  46. package/infrastructure/domains/health/docs/ORPHAN-DETECTION-ANALYSIS.md +0 -386
  47. package/infrastructure/domains/health/docs/SPEC-CLEANUP-COMMAND.md +0 -1419
  48. package/infrastructure/domains/health/docs/TDD-IMPLEMENTATION-SUMMARY.md +0 -391
  49. package/infrastructure/domains/health/docs/TEMPLATE-COMPARISON-IMPLEMENTATION.md +0 -551
  50. package/infrastructure/domains/health/domain/entities/issue.js +0 -299
  51. package/infrastructure/domains/health/domain/entities/issue.test.js +0 -528
  52. package/infrastructure/domains/health/domain/entities/property-mismatch.js +0 -108
  53. package/infrastructure/domains/health/domain/entities/property-mismatch.test.js +0 -275
  54. package/infrastructure/domains/health/domain/entities/resource.js +0 -159
  55. package/infrastructure/domains/health/domain/entities/resource.test.js +0 -432
  56. package/infrastructure/domains/health/domain/entities/stack-health-report.js +0 -306
  57. package/infrastructure/domains/health/domain/entities/stack-health-report.test.js +0 -601
  58. package/infrastructure/domains/health/domain/services/__tests__/health-score-percentage-based.test.js +0 -380
  59. package/infrastructure/domains/health/domain/services/__tests__/import-progress-monitor.test.js +0 -971
  60. package/infrastructure/domains/health/domain/services/__tests__/import-template-generator.test.js +0 -1150
  61. package/infrastructure/domains/health/domain/services/__tests__/logical-id-mapper.test.js +0 -672
  62. package/infrastructure/domains/health/domain/services/__tests__/template-parser.test.js +0 -496
  63. package/infrastructure/domains/health/domain/services/__tests__/update-progress-monitor.test.js +0 -419
  64. package/infrastructure/domains/health/domain/services/health-score-calculator.js +0 -248
  65. package/infrastructure/domains/health/domain/services/health-score-calculator.test.js +0 -504
  66. package/infrastructure/domains/health/domain/services/import-progress-monitor.js +0 -195
  67. package/infrastructure/domains/health/domain/services/import-template-generator.js +0 -435
  68. package/infrastructure/domains/health/domain/services/logical-id-mapper.js +0 -345
  69. package/infrastructure/domains/health/domain/services/mismatch-analyzer.js +0 -234
  70. package/infrastructure/domains/health/domain/services/mismatch-analyzer.test.js +0 -431
  71. package/infrastructure/domains/health/domain/services/property-mutability-config.js +0 -382
  72. package/infrastructure/domains/health/domain/services/template-parser.js +0 -245
  73. package/infrastructure/domains/health/domain/services/update-progress-monitor.js +0 -192
  74. package/infrastructure/domains/health/domain/value-objects/health-score.js +0 -138
  75. package/infrastructure/domains/health/domain/value-objects/health-score.test.js +0 -267
  76. package/infrastructure/domains/health/domain/value-objects/property-mutability.js +0 -161
  77. package/infrastructure/domains/health/domain/value-objects/property-mutability.test.js +0 -198
  78. package/infrastructure/domains/health/domain/value-objects/resource-state.js +0 -167
  79. package/infrastructure/domains/health/domain/value-objects/resource-state.test.js +0 -196
  80. package/infrastructure/domains/health/domain/value-objects/stack-identifier.js +0 -192
  81. package/infrastructure/domains/health/domain/value-objects/stack-identifier.test.js +0 -262
  82. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-cfn-tagged.test.js +0 -312
  83. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-multi-stack.test.js +0 -367
  84. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-relationship-analysis.test.js +0 -432
  85. package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.js +0 -784
  86. package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.test.js +0 -1133
  87. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.js +0 -565
  88. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.test.js +0 -554
  89. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.js +0 -318
  90. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.test.js +0 -398
  91. package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.js +0 -777
  92. package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.test.js +0 -580
  93. package/infrastructure/domains/integration/integration-builder.js +0 -404
  94. package/infrastructure/domains/integration/integration-builder.test.js +0 -690
  95. package/infrastructure/domains/integration/integration-resolver.js +0 -170
  96. package/infrastructure/domains/integration/integration-resolver.test.js +0 -369
  97. package/infrastructure/domains/integration/websocket-builder.js +0 -69
  98. package/infrastructure/domains/integration/websocket-builder.test.js +0 -195
  99. package/infrastructure/domains/networking/vpc-builder.js +0 -2051
  100. package/infrastructure/domains/networking/vpc-builder.test.js +0 -1960
  101. package/infrastructure/domains/networking/vpc-discovery.js +0 -177
  102. package/infrastructure/domains/networking/vpc-discovery.test.js +0 -350
  103. package/infrastructure/domains/networking/vpc-resolver.js +0 -505
  104. package/infrastructure/domains/networking/vpc-resolver.test.js +0 -801
  105. package/infrastructure/domains/parameters/ssm-builder.js +0 -79
  106. package/infrastructure/domains/parameters/ssm-builder.test.js +0 -189
  107. package/infrastructure/domains/parameters/ssm-discovery.js +0 -84
  108. package/infrastructure/domains/parameters/ssm-discovery.test.js +0 -210
  109. package/infrastructure/domains/security/iam-generator.js +0 -816
  110. package/infrastructure/domains/security/iam-generator.test.js +0 -204
  111. package/infrastructure/domains/security/kms-builder.js +0 -415
  112. package/infrastructure/domains/security/kms-builder.test.js +0 -392
  113. package/infrastructure/domains/security/kms-discovery.js +0 -80
  114. package/infrastructure/domains/security/kms-discovery.test.js +0 -177
  115. package/infrastructure/domains/security/kms-resolver.js +0 -96
  116. package/infrastructure/domains/security/kms-resolver.test.js +0 -216
  117. package/infrastructure/domains/security/templates/frigg-deployment-iam-stack.yaml +0 -401
  118. package/infrastructure/domains/security/templates/iam-policy-basic.json +0 -218
  119. package/infrastructure/domains/security/templates/iam-policy-full.json +0 -288
  120. package/infrastructure/domains/shared/base-builder.js +0 -112
  121. package/infrastructure/domains/shared/base-resolver.js +0 -186
  122. package/infrastructure/domains/shared/base-resolver.test.js +0 -305
  123. package/infrastructure/domains/shared/builder-orchestrator.js +0 -212
  124. package/infrastructure/domains/shared/builder-orchestrator.test.js +0 -213
  125. package/infrastructure/domains/shared/cloudformation-discovery-v2.js +0 -334
  126. package/infrastructure/domains/shared/cloudformation-discovery.js +0 -672
  127. package/infrastructure/domains/shared/cloudformation-discovery.test.js +0 -985
  128. package/infrastructure/domains/shared/environment-builder.js +0 -119
  129. package/infrastructure/domains/shared/environment-builder.test.js +0 -247
  130. package/infrastructure/domains/shared/providers/aws-provider-adapter.js +0 -579
  131. package/infrastructure/domains/shared/providers/aws-provider-adapter.test.js +0 -416
  132. package/infrastructure/domains/shared/providers/azure-provider-adapter.stub.js +0 -93
  133. package/infrastructure/domains/shared/providers/cloud-provider-adapter.js +0 -136
  134. package/infrastructure/domains/shared/providers/gcp-provider-adapter.stub.js +0 -82
  135. package/infrastructure/domains/shared/providers/provider-factory.js +0 -108
  136. package/infrastructure/domains/shared/providers/provider-factory.test.js +0 -170
  137. package/infrastructure/domains/shared/resource-discovery.enhanced.test.js +0 -306
  138. package/infrastructure/domains/shared/resource-discovery.js +0 -233
  139. package/infrastructure/domains/shared/resource-discovery.test.js +0 -588
  140. package/infrastructure/domains/shared/types/app-definition.js +0 -205
  141. package/infrastructure/domains/shared/types/discovery-result.js +0 -106
  142. package/infrastructure/domains/shared/types/discovery-result.test.js +0 -258
  143. package/infrastructure/domains/shared/types/index.js +0 -46
  144. package/infrastructure/domains/shared/types/resource-ownership.js +0 -108
  145. package/infrastructure/domains/shared/types/resource-ownership.test.js +0 -101
  146. package/infrastructure/domains/shared/utilities/base-definition-factory.js +0 -394
  147. package/infrastructure/domains/shared/utilities/base-definition-factory.js.bak +0 -338
  148. package/infrastructure/domains/shared/utilities/base-definition-factory.test.js +0 -291
  149. package/infrastructure/domains/shared/utilities/handler-path-resolver.js +0 -134
  150. package/infrastructure/domains/shared/utilities/handler-path-resolver.test.js +0 -268
  151. package/infrastructure/domains/shared/utilities/prisma-layer-manager.js +0 -159
  152. package/infrastructure/domains/shared/utilities/prisma-layer-manager.test.js +0 -444
  153. package/infrastructure/domains/shared/validation/env-validator.js +0 -78
  154. package/infrastructure/domains/shared/validation/env-validator.test.js +0 -173
  155. package/infrastructure/domains/shared/validation/plugin-validator.js +0 -187
  156. package/infrastructure/domains/shared/validation/plugin-validator.test.js +0 -323
  157. package/infrastructure/esbuild.config.js +0 -53
  158. package/infrastructure/index.js +0 -4
  159. package/infrastructure/infrastructure-composer.js +0 -117
  160. package/infrastructure/infrastructure-composer.test.js +0 -1895
  161. package/infrastructure/integration.test.js +0 -383
  162. package/infrastructure/scripts/build-prisma-layer.js +0 -701
  163. package/infrastructure/scripts/build-prisma-layer.test.js +0 -170
  164. package/infrastructure/scripts/build-time-discovery.js +0 -238
  165. package/infrastructure/scripts/build-time-discovery.test.js +0 -379
  166. package/infrastructure/scripts/run-discovery.js +0 -110
  167. package/infrastructure/scripts/verify-prisma-layer.js +0 -72
  168. package/layers/prisma/.build-complete +0 -3
  169. package/layers/prisma/nodejs/package.json +0 -8
  170. package/management-ui/.eslintrc.js +0 -22
  171. package/management-ui/components.json +0 -21
  172. package/management-ui/docs/phase2-integration-guide.md +0 -320
  173. package/management-ui/index.html +0 -13
  174. package/management-ui/package.json +0 -76
  175. package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +0 -302
  176. package/management-ui/postcss.config.js +0 -6
  177. package/management-ui/server/api/backend.js +0 -256
  178. package/management-ui/server/api/cli.js +0 -315
  179. package/management-ui/server/api/codegen.js +0 -663
  180. package/management-ui/server/api/connections.js +0 -857
  181. package/management-ui/server/api/discovery.js +0 -185
  182. package/management-ui/server/api/environment/index.js +0 -1
  183. package/management-ui/server/api/environment/router.js +0 -378
  184. package/management-ui/server/api/environment.js +0 -328
  185. package/management-ui/server/api/integrations.js +0 -876
  186. package/management-ui/server/api/logs.js +0 -248
  187. package/management-ui/server/api/monitoring.js +0 -282
  188. package/management-ui/server/api/open-ide.js +0 -31
  189. package/management-ui/server/api/project.js +0 -1029
  190. package/management-ui/server/api/users/sessions.js +0 -371
  191. package/management-ui/server/api/users/simulation.js +0 -254
  192. package/management-ui/server/api/users.js +0 -362
  193. package/management-ui/server/api-contract.md +0 -275
  194. package/management-ui/server/index.js +0 -873
  195. package/management-ui/server/middleware/errorHandler.js +0 -93
  196. package/management-ui/server/middleware/security.js +0 -32
  197. package/management-ui/server/processManager.js +0 -296
  198. package/management-ui/server/server.js +0 -346
  199. package/management-ui/server/services/aws-monitor.js +0 -413
  200. package/management-ui/server/services/npm-registry.js +0 -347
  201. package/management-ui/server/services/template-engine.js +0 -538
  202. package/management-ui/server/utils/cliIntegration.js +0 -220
  203. package/management-ui/server/utils/environment/auditLogger.js +0 -471
  204. package/management-ui/server/utils/environment/awsParameterStore.js +0 -275
  205. package/management-ui/server/utils/environment/encryption.js +0 -278
  206. package/management-ui/server/utils/environment/envFileManager.js +0 -286
  207. package/management-ui/server/utils/import-commonjs.js +0 -28
  208. package/management-ui/server/utils/response.js +0 -83
  209. package/management-ui/server/websocket/handler.js +0 -325
  210. package/management-ui/src/App.jsx +0 -25
  211. package/management-ui/src/assets/FriggLogo.svg +0 -1
  212. package/management-ui/src/components/AppRouter.jsx +0 -65
  213. package/management-ui/src/components/Button.jsx +0 -70
  214. package/management-ui/src/components/Card.jsx +0 -97
  215. package/management-ui/src/components/EnvironmentCompare.jsx +0 -400
  216. package/management-ui/src/components/EnvironmentEditor.jsx +0 -372
  217. package/management-ui/src/components/EnvironmentImportExport.jsx +0 -469
  218. package/management-ui/src/components/EnvironmentSchema.jsx +0 -491
  219. package/management-ui/src/components/EnvironmentSecurity.jsx +0 -463
  220. package/management-ui/src/components/ErrorBoundary.jsx +0 -73
  221. package/management-ui/src/components/IntegrationCard.jsx +0 -481
  222. package/management-ui/src/components/IntegrationCardEnhanced.jsx +0 -770
  223. package/management-ui/src/components/IntegrationExplorer.jsx +0 -379
  224. package/management-ui/src/components/IntegrationStatus.jsx +0 -336
  225. package/management-ui/src/components/Layout.jsx +0 -716
  226. package/management-ui/src/components/LoadingSpinner.jsx +0 -113
  227. package/management-ui/src/components/RepositoryPicker.jsx +0 -248
  228. package/management-ui/src/components/SessionMonitor.jsx +0 -350
  229. package/management-ui/src/components/StatusBadge.jsx +0 -208
  230. package/management-ui/src/components/UserContextSwitcher.jsx +0 -212
  231. package/management-ui/src/components/UserSimulation.jsx +0 -327
  232. package/management-ui/src/components/Welcome.jsx +0 -434
  233. package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +0 -637
  234. package/management-ui/src/components/codegen/APIModuleSelector.jsx +0 -227
  235. package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +0 -247
  236. package/management-ui/src/components/codegen/CodePreviewEditor.jsx +0 -316
  237. package/management-ui/src/components/codegen/DynamicModuleForm.jsx +0 -271
  238. package/management-ui/src/components/codegen/FormBuilder.jsx +0 -737
  239. package/management-ui/src/components/codegen/IntegrationGenerator.jsx +0 -855
  240. package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +0 -797
  241. package/management-ui/src/components/codegen/SchemaBuilder.jsx +0 -303
  242. package/management-ui/src/components/codegen/TemplateSelector.jsx +0 -586
  243. package/management-ui/src/components/codegen/index.js +0 -10
  244. package/management-ui/src/components/connections/ConnectionConfigForm.jsx +0 -362
  245. package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +0 -182
  246. package/management-ui/src/components/connections/ConnectionTester.jsx +0 -200
  247. package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +0 -292
  248. package/management-ui/src/components/connections/OAuthFlow.jsx +0 -204
  249. package/management-ui/src/components/connections/index.js +0 -5
  250. package/management-ui/src/components/index.js +0 -21
  251. package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +0 -222
  252. package/management-ui/src/components/monitoring/LambdaMetrics.jsx +0 -169
  253. package/management-ui/src/components/monitoring/MetricsChart.jsx +0 -197
  254. package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +0 -393
  255. package/management-ui/src/components/monitoring/SQSMetrics.jsx +0 -246
  256. package/management-ui/src/components/monitoring/index.js +0 -6
  257. package/management-ui/src/components/monitoring/monitoring.css +0 -218
  258. package/management-ui/src/components/theme-provider.jsx +0 -52
  259. package/management-ui/src/components/theme-toggle.jsx +0 -39
  260. package/management-ui/src/components/ui/badge.tsx +0 -36
  261. package/management-ui/src/components/ui/button.test.jsx +0 -56
  262. package/management-ui/src/components/ui/button.tsx +0 -57
  263. package/management-ui/src/components/ui/card.tsx +0 -76
  264. package/management-ui/src/components/ui/dropdown-menu.tsx +0 -199
  265. package/management-ui/src/components/ui/select.tsx +0 -157
  266. package/management-ui/src/components/ui/skeleton.jsx +0 -15
  267. package/management-ui/src/hooks/useFrigg.jsx +0 -387
  268. package/management-ui/src/hooks/useSocket.jsx +0 -58
  269. package/management-ui/src/index.css +0 -193
  270. package/management-ui/src/lib/utils.ts +0 -6
  271. package/management-ui/src/main.jsx +0 -10
  272. package/management-ui/src/pages/CodeGeneration.jsx +0 -14
  273. package/management-ui/src/pages/Connections.jsx +0 -252
  274. package/management-ui/src/pages/ConnectionsEnhanced.jsx +0 -633
  275. package/management-ui/src/pages/Dashboard.jsx +0 -311
  276. package/management-ui/src/pages/Environment.jsx +0 -314
  277. package/management-ui/src/pages/IntegrationConfigure.jsx +0 -669
  278. package/management-ui/src/pages/IntegrationDiscovery.jsx +0 -567
  279. package/management-ui/src/pages/IntegrationTest.jsx +0 -742
  280. package/management-ui/src/pages/Integrations.jsx +0 -253
  281. package/management-ui/src/pages/Monitoring.jsx +0 -17
  282. package/management-ui/src/pages/Simulation.jsx +0 -155
  283. package/management-ui/src/pages/Users.jsx +0 -492
  284. package/management-ui/src/services/api.js +0 -41
  285. package/management-ui/src/services/apiModuleService.js +0 -193
  286. package/management-ui/src/services/websocket-handlers.js +0 -120
  287. package/management-ui/src/test/api/project.test.js +0 -273
  288. package/management-ui/src/test/components/Welcome.test.jsx +0 -378
  289. package/management-ui/src/test/mocks/server.js +0 -178
  290. package/management-ui/src/test/setup.js +0 -61
  291. package/management-ui/src/test/utils/test-utils.jsx +0 -134
  292. package/management-ui/src/utils/repository.js +0 -98
  293. package/management-ui/src/utils/repository.test.js +0 -118
  294. package/management-ui/src/workflows/phase2-integration-workflows.js +0 -884
  295. package/management-ui/tailwind.config.js +0 -63
  296. package/management-ui/tsconfig.json +0 -37
  297. package/management-ui/tsconfig.node.json +0 -10
  298. package/management-ui/vite.config.js +0 -26
  299. package/management-ui/vitest.config.js +0 -38
  300. package/test/auther-definition-method-tester.js +0 -45
  301. package/test/index.js +0 -9
  302. package/test/integration-validator.js +0 -2
  303. package/test/mock-api-readme.md +0 -102
  304. package/test/mock-api.js +0 -284
  305. package/test/mock-integration.js +0 -78
@@ -1,382 +0,0 @@
1
- /**
2
- * Property Mutability Configuration
3
- *
4
- * Defines which CloudFormation resource properties are immutable (require replacement),
5
- * mutable (can be updated), or conditional (depends on other properties).
6
- *
7
- * Based on AWS CloudFormation documentation "Update requires" behavior:
8
- * - IMMUTABLE: "Replacement" - Cannot be changed without replacing the resource
9
- * - MUTABLE: "No interruption" or "Some interruptions" - Can be updated in place
10
- * - CONDITIONAL: Depends on other property values or specific conditions
11
- *
12
- * References:
13
- * - AWS CloudFormation Template Reference: https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/
14
- * - Each resource type has "Update requires" documentation for each property
15
- */
16
-
17
- const PropertyMutability = require('../value-objects/property-mutability');
18
-
19
- /**
20
- * Property mutability configuration by resource type
21
- *
22
- * Key: CloudFormation resource type (e.g., 'AWS::Lambda::Function')
23
- * Value: Object mapping property paths to PropertyMutability instances
24
- *
25
- * Property paths match AWS drift detection format (without 'Properties.' prefix):
26
- * - Simple: 'BucketName'
27
- * - Nested: 'VpcConfig.SubnetIds'
28
- */
29
- const PROPERTY_MUTABILITY_CONFIG = {
30
- //
31
- // AWS::EC2::* Resources
32
- //
33
-
34
- 'AWS::EC2::VPC': {
35
- // Immutable properties
36
- 'CidrBlock': PropertyMutability.IMMUTABLE, // Replacement required
37
- 'InstanceTenancy': PropertyMutability.IMMUTABLE, // Replacement required
38
-
39
- // Mutable properties
40
- 'EnableDnsSupport': PropertyMutability.MUTABLE, // No interruption
41
- 'EnableDnsHostnames': PropertyMutability.MUTABLE, // No interruption
42
- 'Tags': PropertyMutability.MUTABLE, // No interruption
43
- },
44
-
45
- 'AWS::EC2::Subnet': {
46
- // Immutable properties
47
- 'VpcId': PropertyMutability.IMMUTABLE, // Replacement required
48
- 'CidrBlock': PropertyMutability.IMMUTABLE, // Replacement required
49
- 'AvailabilityZone': PropertyMutability.IMMUTABLE, // Replacement required
50
- 'AvailabilityZoneId': PropertyMutability.IMMUTABLE, // Replacement required
51
- 'Ipv4IpamPoolId': PropertyMutability.IMMUTABLE, // Replacement required
52
- 'Ipv4NetmaskLength': PropertyMutability.IMMUTABLE, // Replacement required
53
- 'Ipv6IpamPoolId': PropertyMutability.IMMUTABLE, // Replacement required
54
- 'Ipv6Native': PropertyMutability.IMMUTABLE, // Replacement required
55
- 'Ipv6NetmaskLength': PropertyMutability.IMMUTABLE, // Replacement required
56
- 'OutpostArn': PropertyMutability.IMMUTABLE, // Replacement required
57
-
58
- // Mutable properties
59
- 'AssignIpv6AddressOnCreation': PropertyMutability.MUTABLE, // No interruption
60
- 'EnableDns64': PropertyMutability.MUTABLE, // No interruption
61
- 'EnableLniAtDeviceIndex': PropertyMutability.MUTABLE, // No interruption
62
- 'Ipv6CidrBlock': PropertyMutability.MUTABLE, // Some interruptions
63
- 'MapPublicIpOnLaunch': PropertyMutability.MUTABLE, // No interruption
64
- 'PrivateDnsNameOptionsOnLaunch': PropertyMutability.MUTABLE, // No interruption
65
- 'Tags': PropertyMutability.MUTABLE, // No interruption
66
- },
67
-
68
- 'AWS::EC2::SecurityGroup': {
69
- // Immutable properties
70
- 'VpcId': PropertyMutability.IMMUTABLE, // Replacement required
71
- 'GroupName': PropertyMutability.IMMUTABLE, // Replacement required
72
-
73
- // Mutable properties
74
- 'GroupDescription': PropertyMutability.MUTABLE, // No interruption
75
- 'SecurityGroupIngress': PropertyMutability.MUTABLE, // No interruption
76
- 'SecurityGroupEgress': PropertyMutability.MUTABLE, // No interruption
77
- 'Tags': PropertyMutability.MUTABLE, // No interruption
78
- },
79
-
80
- 'AWS::EC2::RouteTable': {
81
- // Immutable properties
82
- 'VpcId': PropertyMutability.IMMUTABLE, // Replacement required
83
-
84
- // Mutable properties
85
- 'Tags': PropertyMutability.MUTABLE, // No interruption
86
- },
87
-
88
- 'AWS::EC2::Instance': {
89
- // Immutable properties
90
- 'ImageId': PropertyMutability.IMMUTABLE, // Replacement required
91
- 'InstanceType': PropertyMutability.IMMUTABLE, // Replacement required
92
- 'KeyName': PropertyMutability.IMMUTABLE, // Replacement required
93
- 'AvailabilityZone': PropertyMutability.IMMUTABLE, // Replacement required
94
- 'PlacementGroupName': PropertyMutability.IMMUTABLE, // Replacement required
95
- 'PrivateIpAddress': PropertyMutability.IMMUTABLE, // Replacement required
96
- 'SubnetId': PropertyMutability.IMMUTABLE, // Replacement required
97
-
98
- // Mutable properties
99
- 'SecurityGroupIds': PropertyMutability.MUTABLE, // No interruption (VPC instances)
100
- 'SecurityGroups': PropertyMutability.MUTABLE, // No interruption
101
- 'UserData': PropertyMutability.MUTABLE, // Some interruptions
102
- 'IamInstanceProfile': PropertyMutability.MUTABLE, // No interruption
103
- 'Monitoring': PropertyMutability.MUTABLE, // No interruption
104
- 'Tags': PropertyMutability.MUTABLE, // No interruption
105
- 'DisableApiTermination': PropertyMutability.MUTABLE, // No interruption
106
- 'EbsOptimized': PropertyMutability.MUTABLE, // Some interruptions
107
- },
108
-
109
- //
110
- // AWS::Lambda::* Resources
111
- //
112
-
113
- 'AWS::Lambda::Function': {
114
- // Immutable properties
115
- 'FunctionName': PropertyMutability.IMMUTABLE, // Replacement required
116
-
117
- // Mutable properties
118
- 'Code': PropertyMutability.MUTABLE, // No interruption
119
- 'Runtime': PropertyMutability.MUTABLE, // No interruption
120
- 'Handler': PropertyMutability.MUTABLE, // No interruption
121
- 'Role': PropertyMutability.MUTABLE, // No interruption
122
- 'Description': PropertyMutability.MUTABLE, // No interruption
123
- 'Timeout': PropertyMutability.MUTABLE, // No interruption
124
- 'MemorySize': PropertyMutability.MUTABLE, // No interruption
125
- 'Environment': PropertyMutability.MUTABLE, // No interruption
126
- 'Environment.Variables': PropertyMutability.MUTABLE, // No interruption
127
- 'VpcConfig': PropertyMutability.MUTABLE, // No interruption
128
- 'VpcConfig.SubnetIds': PropertyMutability.MUTABLE, // No interruption
129
- 'VpcConfig.SecurityGroupIds': PropertyMutability.MUTABLE, // No interruption
130
- 'VpcConfig.Ipv6AllowedForDualStack': PropertyMutability.MUTABLE, // No interruption
131
- 'DeadLetterConfig': PropertyMutability.MUTABLE, // No interruption
132
- 'TracingConfig': PropertyMutability.MUTABLE, // No interruption
133
- 'KMSKeyArn': PropertyMutability.MUTABLE, // No interruption
134
- 'Layers': PropertyMutability.MUTABLE, // No interruption
135
- 'ReservedConcurrentExecutions': PropertyMutability.MUTABLE, // No interruption
136
- 'Tags': PropertyMutability.MUTABLE, // No interruption
137
- 'FileSystemConfigs': PropertyMutability.MUTABLE, // No interruption
138
- 'Architectures': PropertyMutability.MUTABLE, // No interruption
139
- 'EphemeralStorage': PropertyMutability.MUTABLE, // No interruption
140
- 'SnapStart': PropertyMutability.MUTABLE, // No interruption
141
- 'RuntimeManagementConfig': PropertyMutability.MUTABLE, // No interruption
142
- 'LoggingConfig': PropertyMutability.MUTABLE, // No interruption
143
- },
144
-
145
- //
146
- // AWS::RDS::* Resources
147
- //
148
-
149
- 'AWS::RDS::DBInstance': {
150
- // Immutable properties
151
- 'DBInstanceIdentifier': PropertyMutability.IMMUTABLE, // Replacement required
152
- 'Engine': PropertyMutability.IMMUTABLE, // Replacement required
153
- 'DBName': PropertyMutability.IMMUTABLE, // Replacement required (for some engines)
154
- 'AvailabilityZone': PropertyMutability.IMMUTABLE, // Replacement required
155
-
156
- // Mutable properties
157
- 'AllocatedStorage': PropertyMutability.MUTABLE, // No interruption
158
- 'DBInstanceClass': PropertyMutability.MUTABLE, // Some interruptions
159
- 'EngineVersion': PropertyMutability.MUTABLE, // Some interruptions
160
- 'MasterUsername': PropertyMutability.MUTABLE, // No interruption (can't actually change)
161
- 'MasterUserPassword': PropertyMutability.MUTABLE, // No interruption
162
- 'BackupRetentionPeriod': PropertyMutability.MUTABLE, // No interruption
163
- 'DBSecurityGroups': PropertyMutability.MUTABLE, // No interruption
164
- 'VPCSecurityGroups': PropertyMutability.MUTABLE, // No interruption
165
- 'MultiAZ': PropertyMutability.MUTABLE, // No interruption
166
- 'PubliclyAccessible': PropertyMutability.MUTABLE, // No interruption
167
- 'StorageEncrypted': PropertyMutability.MUTABLE, // Some interruptions
168
- 'Tags': PropertyMutability.MUTABLE, // No interruption
169
- },
170
-
171
- 'AWS::RDS::DBCluster': {
172
- // Immutable properties
173
- 'DBClusterIdentifier': PropertyMutability.IMMUTABLE, // Replacement required
174
- 'Engine': PropertyMutability.IMMUTABLE, // Replacement required
175
- 'DatabaseName': PropertyMutability.IMMUTABLE, // Replacement required
176
-
177
- // Mutable properties
178
- 'EngineVersion': PropertyMutability.MUTABLE, // No interruption
179
- 'MasterUsername': PropertyMutability.MUTABLE, // No interruption (can't actually change)
180
- 'MasterUserPassword': PropertyMutability.MUTABLE, // No interruption
181
- 'BackupRetentionPeriod': PropertyMutability.MUTABLE, // No interruption
182
- 'PreferredBackupWindow': PropertyMutability.MUTABLE, // No interruption
183
- 'PreferredMaintenanceWindow': PropertyMutability.MUTABLE, // No interruption
184
- 'VpcSecurityGroupIds': PropertyMutability.MUTABLE, // No interruption
185
- 'DBSubnetGroupName': PropertyMutability.MUTABLE, // Some interruptions
186
- 'StorageEncrypted': PropertyMutability.MUTABLE, // Some interruptions
187
- 'KmsKeyId': PropertyMutability.MUTABLE, // Some interruptions
188
- 'Tags': PropertyMutability.MUTABLE, // No interruption
189
- },
190
-
191
- //
192
- // AWS::S3::* Resources
193
- //
194
-
195
- 'AWS::S3::Bucket': {
196
- // Immutable properties
197
- 'BucketName': PropertyMutability.IMMUTABLE, // Replacement required
198
-
199
- // Mutable properties
200
- 'AccelerateConfiguration': PropertyMutability.MUTABLE, // No interruption
201
- 'AccessControl': PropertyMutability.MUTABLE, // No interruption
202
- 'AnalyticsConfigurations': PropertyMutability.MUTABLE, // No interruption
203
- 'BucketEncryption': PropertyMutability.MUTABLE, // No interruption
204
- 'CorsConfiguration': PropertyMutability.MUTABLE, // No interruption
205
- 'IntelligentTieringConfigurations': PropertyMutability.MUTABLE, // No interruption
206
- 'InventoryConfigurations': PropertyMutability.MUTABLE, // No interruption
207
- 'LifecycleConfiguration': PropertyMutability.MUTABLE, // No interruption
208
- 'LoggingConfiguration': PropertyMutability.MUTABLE, // No interruption
209
- 'MetricsConfigurations': PropertyMutability.MUTABLE, // No interruption
210
- 'NotificationConfiguration': PropertyMutability.MUTABLE, // No interruption
211
- 'ObjectLockConfiguration': PropertyMutability.MUTABLE, // No interruption
212
- 'ObjectLockEnabled': PropertyMutability.MUTABLE, // No interruption
213
- 'OwnershipControls': PropertyMutability.MUTABLE, // No interruption
214
- 'PublicAccessBlockConfiguration': PropertyMutability.MUTABLE, // No interruption
215
- 'ReplicationConfiguration': PropertyMutability.MUTABLE, // No interruption
216
- 'Tags': PropertyMutability.MUTABLE, // No interruption
217
- 'VersioningConfiguration': PropertyMutability.MUTABLE, // No interruption
218
- 'WebsiteConfiguration': PropertyMutability.MUTABLE, // No interruption
219
- },
220
-
221
- //
222
- // AWS::KMS::* Resources
223
- //
224
-
225
- 'AWS::KMS::Key': {
226
- // All KMS key properties are mutable (updates don't require replacement)
227
- 'Description': PropertyMutability.MUTABLE, // No interruption
228
- 'Enabled': PropertyMutability.MUTABLE, // No interruption
229
- 'EnableKeyRotation': PropertyMutability.MUTABLE, // No interruption
230
- 'KeyPolicy': PropertyMutability.MUTABLE, // No interruption
231
- 'KeyUsage': PropertyMutability.MUTABLE, // No interruption
232
- 'MultiRegion': PropertyMutability.MUTABLE, // No interruption
233
- 'PendingWindowInDays': PropertyMutability.MUTABLE, // No interruption
234
- 'Tags': PropertyMutability.MUTABLE, // No interruption
235
- },
236
-
237
- //
238
- // AWS::DynamoDB::* Resources
239
- //
240
-
241
- 'AWS::DynamoDB::Table': {
242
- // Immutable properties
243
- 'TableName': PropertyMutability.IMMUTABLE, // Replacement required
244
- 'KeySchema': PropertyMutability.IMMUTABLE, // Replacement required
245
- 'AttributeDefinitions': PropertyMutability.CONDITIONAL, // Some changes require replacement
246
-
247
- // Mutable properties
248
- 'BillingMode': PropertyMutability.MUTABLE, // No interruption
249
- 'ProvisionedThroughput': PropertyMutability.MUTABLE, // No interruption
250
- 'GlobalSecondaryIndexes': PropertyMutability.MUTABLE, // No interruption
251
- 'LocalSecondaryIndexes': PropertyMutability.IMMUTABLE, // Replacement required
252
- 'StreamSpecification': PropertyMutability.MUTABLE, // No interruption
253
- 'SSESpecification': PropertyMutability.MUTABLE, // No interruption
254
- 'Tags': PropertyMutability.MUTABLE, // No interruption
255
- 'TimeToLiveSpecification': PropertyMutability.MUTABLE, // No interruption
256
- 'PointInTimeRecoverySpecification': PropertyMutability.MUTABLE, // No interruption
257
- 'ContributorInsightsSpecification': PropertyMutability.MUTABLE, // No interruption
258
- 'KinesisStreamSpecification': PropertyMutability.MUTABLE, // No interruption
259
- },
260
-
261
- //
262
- // AWS::SQS::* Resources
263
- //
264
-
265
- 'AWS::SQS::Queue': {
266
- // Immutable properties
267
- 'QueueName': PropertyMutability.IMMUTABLE, // Replacement required
268
- 'FifoQueue': PropertyMutability.IMMUTABLE, // Replacement required
269
-
270
- // Mutable properties
271
- 'ContentBasedDeduplication': PropertyMutability.MUTABLE, // No interruption
272
- 'DeduplicationScope': PropertyMutability.MUTABLE, // No interruption
273
- 'DelaySeconds': PropertyMutability.MUTABLE, // No interruption
274
- 'FifoThroughputLimit': PropertyMutability.MUTABLE, // No interruption
275
- 'KmsMasterKeyId': PropertyMutability.MUTABLE, // No interruption
276
- 'KmsDataKeyReusePeriodSeconds': PropertyMutability.MUTABLE, // No interruption
277
- 'MaximumMessageSize': PropertyMutability.MUTABLE, // No interruption
278
- 'MessageRetentionPeriod': PropertyMutability.MUTABLE, // No interruption
279
- 'ReceiveMessageWaitTimeSeconds': PropertyMutability.MUTABLE, // No interruption
280
- 'RedrivePolicy': PropertyMutability.MUTABLE, // No interruption
281
- 'RedriveAllowPolicy': PropertyMutability.MUTABLE, // No interruption
282
- 'SqsManagedSseEnabled': PropertyMutability.MUTABLE, // No interruption
283
- 'Tags': PropertyMutability.MUTABLE, // No interruption
284
- 'VisibilityTimeout': PropertyMutability.MUTABLE, // No interruption
285
- },
286
-
287
- //
288
- // AWS::SNS::* Resources
289
- //
290
-
291
- 'AWS::SNS::Topic': {
292
- // Immutable properties
293
- 'TopicName': PropertyMutability.IMMUTABLE, // Replacement required
294
- 'FifoTopic': PropertyMutability.IMMUTABLE, // Replacement required
295
-
296
- // Mutable properties
297
- 'ContentBasedDeduplication': PropertyMutability.MUTABLE, // No interruption
298
- 'DataProtectionPolicy': PropertyMutability.MUTABLE, // No interruption
299
- 'DisplayName': PropertyMutability.MUTABLE, // No interruption
300
- 'KmsMasterKeyId': PropertyMutability.MUTABLE, // No interruption
301
- 'SignatureVersion': PropertyMutability.MUTABLE, // No interruption
302
- 'Subscription': PropertyMutability.MUTABLE, // No interruption
303
- 'Tags': PropertyMutability.MUTABLE, // No interruption
304
- 'TracingConfig': PropertyMutability.MUTABLE, // No interruption
305
- },
306
-
307
- //
308
- // AWS::IAM::* Resources
309
- //
310
-
311
- 'AWS::IAM::Role': {
312
- // Immutable properties
313
- 'RoleName': PropertyMutability.IMMUTABLE, // Replacement required
314
-
315
- // Mutable properties
316
- 'AssumeRolePolicyDocument': PropertyMutability.MUTABLE, // No interruption
317
- 'Description': PropertyMutability.MUTABLE, // No interruption
318
- 'ManagedPolicyArns': PropertyMutability.MUTABLE, // No interruption
319
- 'MaxSessionDuration': PropertyMutability.MUTABLE, // No interruption
320
- 'Path': PropertyMutability.MUTABLE, // No interruption
321
- 'PermissionsBoundary': PropertyMutability.MUTABLE, // No interruption
322
- 'Policies': PropertyMutability.MUTABLE, // No interruption
323
- 'Tags': PropertyMutability.MUTABLE, // No interruption
324
- },
325
- };
326
-
327
- /**
328
- * Get property mutability for a given resource type and property path
329
- *
330
- * @param {string} resourceType - CloudFormation resource type (e.g., 'AWS::Lambda::Function')
331
- * @param {string} propertyPath - Property path from drift detection (e.g., 'VpcConfig.SubnetIds')
332
- * @returns {PropertyMutability} Property mutability (defaults to MUTABLE if not found)
333
- */
334
- function getPropertyMutability(resourceType, propertyPath) {
335
- // Check if resource type has configuration
336
- if (!PROPERTY_MUTABILITY_CONFIG[resourceType]) {
337
- // Unknown resource type - default to MUTABLE (safe, allows reconciliation attempt)
338
- return PropertyMutability.MUTABLE;
339
- }
340
-
341
- const resourceConfig = PROPERTY_MUTABILITY_CONFIG[resourceType];
342
-
343
- // Check exact property path match
344
- if (resourceConfig[propertyPath]) {
345
- return resourceConfig[propertyPath];
346
- }
347
-
348
- // Check parent property for nested paths (e.g., 'VpcConfig' for 'VpcConfig.SubnetIds')
349
- const parentPath = propertyPath.split('.')[0];
350
- if (resourceConfig[parentPath]) {
351
- return resourceConfig[parentPath];
352
- }
353
-
354
- // Property not found in config - default to MUTABLE
355
- return PropertyMutability.MUTABLE;
356
- }
357
-
358
- /**
359
- * Check if a resource type is supported in the configuration
360
- *
361
- * @param {string} resourceType - CloudFormation resource type
362
- * @returns {boolean} True if resource type is configured
363
- */
364
- function isResourceTypeConfigured(resourceType) {
365
- return resourceType in PROPERTY_MUTABILITY_CONFIG;
366
- }
367
-
368
- /**
369
- * Get all configured resource types
370
- *
371
- * @returns {string[]} Array of resource type names
372
- */
373
- function getConfiguredResourceTypes() {
374
- return Object.keys(PROPERTY_MUTABILITY_CONFIG);
375
- }
376
-
377
- module.exports = {
378
- PROPERTY_MUTABILITY_CONFIG,
379
- getPropertyMutability,
380
- isResourceTypeConfigured,
381
- getConfiguredResourceTypes,
382
- };
@@ -1,245 +0,0 @@
1
- /**
2
- * TemplateParser - Parse CloudFormation templates for resource extraction
3
- *
4
- * Purpose: Parse both build templates (.serverless/) and deployed templates (from AWS)
5
- * to extract resource definitions, logical IDs, and Refs for import mapping.
6
- */
7
-
8
- class TemplateParser {
9
- /**
10
- * Parse CloudFormation template and extract resource definitions
11
- * @param {string|object} template - Template path or parsed template object
12
- * @returns {object} Parsed template with resources
13
- */
14
- parseTemplate(template) {
15
- let parsedTemplate;
16
-
17
- if (typeof template === 'string') {
18
- const fs = require('fs');
19
- const path = require('path');
20
-
21
- if (!fs.existsSync(template)) {
22
- throw new Error(`Template not found at path: ${template}`);
23
- }
24
-
25
- parsedTemplate = JSON.parse(fs.readFileSync(template, 'utf8'));
26
- } else {
27
- parsedTemplate = template;
28
- }
29
-
30
- return {
31
- resources: parsedTemplate.Resources || {},
32
- version: parsedTemplate.AWSTemplateFormatVersion,
33
- description: parsedTemplate.Description,
34
- outputs: parsedTemplate.Outputs || {},
35
- };
36
- }
37
-
38
- /**
39
- * Extract VPC-related resource logical IDs from template
40
- * @param {object} template - Parsed template object
41
- * @returns {Array} VPC resources with logical IDs
42
- */
43
- getVpcResources(template) {
44
- const vpcResourceTypes = [
45
- 'AWS::EC2::VPC',
46
- 'AWS::EC2::Subnet',
47
- 'AWS::EC2::SecurityGroup',
48
- 'AWS::EC2::InternetGateway',
49
- 'AWS::EC2::NatGateway',
50
- 'AWS::EC2::RouteTable',
51
- 'AWS::EC2::VPCEndpoint',
52
- ];
53
-
54
- return Object.entries(template.resources)
55
- .filter(([_, resource]) => vpcResourceTypes.includes(resource.Type))
56
- .map(([logicalId, resource]) => ({
57
- logicalId,
58
- resourceType: resource.Type,
59
- properties: resource.Properties || {},
60
- }));
61
- }
62
-
63
- /**
64
- * Extract hardcoded resource IDs from deployed template
65
- * Finds physical IDs that are hardcoded instead of using Refs
66
- * @param {object} template - Deployed CloudFormation template
67
- * @returns {object} Extracted hardcoded IDs by type
68
- */
69
- extractHardcodedIds(template) {
70
- const hardcodedIds = {
71
- vpcIds: new Set(),
72
- subnetIds: new Set(),
73
- securityGroupIds: new Set(),
74
- };
75
-
76
- // Traverse template to find hardcoded IDs
77
- Object.values(template.resources).forEach((resource) => {
78
- this._extractIdsFromResource(resource, hardcodedIds);
79
- });
80
-
81
- return {
82
- vpcIds: Array.from(hardcodedIds.vpcIds),
83
- subnetIds: Array.from(hardcodedIds.subnetIds),
84
- securityGroupIds: Array.from(hardcodedIds.securityGroupIds),
85
- };
86
- }
87
-
88
- /**
89
- * Extract Refs from build template
90
- * Finds logical IDs that are referenced via {Ref: "LogicalId"}
91
- * @param {object} template - Build template with Refs
92
- * @returns {object} Logical IDs mapped to expected resource types
93
- */
94
- extractRefs(template) {
95
- const refs = {
96
- vpcRefs: new Set(),
97
- subnetRefs: new Set(),
98
- securityGroupRefs: new Set(),
99
- };
100
-
101
- // Traverse template to find Ref expressions
102
- Object.values(template.resources).forEach((resource) => {
103
- this._extractRefsFromResource(resource, refs);
104
- });
105
-
106
- return {
107
- vpcRefs: Array.from(refs.vpcRefs),
108
- subnetRefs: Array.from(refs.subnetRefs),
109
- securityGroupRefs: Array.from(refs.securityGroupRefs),
110
- };
111
- }
112
-
113
- /**
114
- * Recursively extract hardcoded IDs from resource properties
115
- * @private
116
- */
117
- _extractIdsFromResource(obj, hardcodedIds) {
118
- if (typeof obj !== 'object' || obj === null) return;
119
-
120
- Object.entries(obj).forEach(([key, value]) => {
121
- // Check for VPC IDs
122
- if (key === 'VpcId' && typeof value === 'string' && value.startsWith('vpc-')) {
123
- hardcodedIds.vpcIds.add(value);
124
- }
125
-
126
- // Check for subnet IDs
127
- if (
128
- (key === 'SubnetIds' || key === 'SubnetId') &&
129
- Array.isArray(value)
130
- ) {
131
- value.forEach((id) => {
132
- if (typeof id === 'string' && id.startsWith('subnet-')) {
133
- hardcodedIds.subnetIds.add(id);
134
- }
135
- });
136
- } else if (
137
- key === 'SubnetId' &&
138
- typeof value === 'string' &&
139
- value.startsWith('subnet-')
140
- ) {
141
- hardcodedIds.subnetIds.add(value);
142
- }
143
-
144
- // Check for security group IDs
145
- if (key === 'SecurityGroupIds' && Array.isArray(value)) {
146
- value.forEach((id) => {
147
- if (typeof id === 'string' && id.startsWith('sg-')) {
148
- hardcodedIds.securityGroupIds.add(id);
149
- }
150
- });
151
- } else if (
152
- key === 'GroupId' &&
153
- typeof value === 'string' &&
154
- value.startsWith('sg-')
155
- ) {
156
- hardcodedIds.securityGroupIds.add(value);
157
- }
158
-
159
- // Recurse into nested objects
160
- if (typeof value === 'object') {
161
- this._extractIdsFromResource(value, hardcodedIds);
162
- }
163
- });
164
- }
165
-
166
- /**
167
- * Recursively extract Refs from resource properties
168
- * @private
169
- */
170
- _extractRefsFromResource(obj, refs) {
171
- if (typeof obj !== 'object' || obj === null) return;
172
-
173
- Object.entries(obj).forEach(([key, value]) => {
174
- // Check for Ref expressions
175
- if (key === 'Ref' && typeof value === 'string') {
176
- // Determine ref type based on logical ID naming
177
- if (value.includes('VPC') && !value.includes('Endpoint')) {
178
- refs.vpcRefs.add(value);
179
- } else if (value.includes('Subnet')) {
180
- refs.subnetRefs.add(value);
181
- } else if (value.includes('SecurityGroup')) {
182
- refs.securityGroupRefs.add(value);
183
- }
184
- }
185
-
186
- // Recurse into nested objects and arrays
187
- if (typeof value === 'object') {
188
- this._extractRefsFromResource(value, refs);
189
- }
190
- });
191
- }
192
-
193
- /**
194
- * Find logical ID for a physical ID by comparing templates
195
- * @param {string} physicalId - Physical resource ID from AWS
196
- * @param {object} deployedTemplate - Template with hardcoded IDs
197
- * @param {object} buildTemplate - Template with Refs
198
- * @returns {string|null} Matching logical ID or null
199
- */
200
- findLogicalIdForPhysicalId(physicalId, deployedTemplate, buildTemplate) {
201
- // Extract hardcoded IDs and their context
202
- const hardcodedIds = this.extractHardcodedIds(deployedTemplate);
203
- const refs = this.extractRefs(buildTemplate);
204
-
205
- // Determine resource type from physical ID
206
- let logicalIdCandidates = [];
207
- if (physicalId.startsWith('vpc-')) {
208
- logicalIdCandidates = refs.vpcRefs;
209
- } else if (physicalId.startsWith('subnet-')) {
210
- logicalIdCandidates = refs.subnetRefs;
211
- } else if (physicalId.startsWith('sg-')) {
212
- logicalIdCandidates = refs.securityGroupRefs;
213
- }
214
-
215
- // For now, return first candidate (will enhance with position matching)
216
- return logicalIdCandidates[0] || null;
217
- }
218
-
219
- /**
220
- * Get build template path from project directory
221
- * @param {string} projectPath - Project root path
222
- * @returns {string} Path to build template
223
- */
224
- static getBuildTemplatePath(projectPath = process.cwd()) {
225
- const path = require('path');
226
- return path.join(
227
- projectPath,
228
- '.serverless',
229
- 'cloudformation-template-update-stack.json'
230
- );
231
- }
232
-
233
- /**
234
- * Check if build template exists
235
- * @param {string} projectPath - Project root path
236
- * @returns {boolean} True if template exists
237
- */
238
- static buildTemplateExists(projectPath = process.cwd()) {
239
- const fs = require('fs');
240
- const templatePath = this.getBuildTemplatePath(projectPath);
241
- return fs.existsSync(templatePath);
242
- }
243
- }
244
-
245
- module.exports = { TemplateParser };