@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,416 +0,0 @@
1
- /**
2
- * Tests for AWS Provider Adapter
3
- *
4
- * Tests AWS-specific cloud resource discovery
5
- */
6
-
7
- const { AWSProviderAdapter } = require('./aws-provider-adapter');
8
-
9
- // Mock AWS SDK v3 clients
10
- jest.mock('@aws-sdk/client-ec2');
11
- jest.mock('@aws-sdk/client-kms');
12
- jest.mock('@aws-sdk/client-rds');
13
- jest.mock('@aws-sdk/client-ssm');
14
- jest.mock('@aws-sdk/client-secrets-manager');
15
-
16
- describe('AWSProviderAdapter', () => {
17
- describe('listStackResources', () => {
18
- it.skip('should handle pagination and return all resources across multiple pages', async () => {
19
- const mockCfClient = {
20
- send: jest.fn()
21
- .mockResolvedValueOnce({
22
- StackResourceSummaries: [
23
- { LogicalResourceId: 'Resource1', PhysicalResourceId: 'res-1', ResourceType: 'AWS::EC2::VPC' },
24
- { LogicalResourceId: 'Resource2', PhysicalResourceId: 'res-2', ResourceType: 'AWS::EC2::Subnet' }
25
- ],
26
- NextToken: 'token-page-2' // More pages available
27
- })
28
- .mockResolvedValueOnce({
29
- StackResourceSummaries: [
30
- { LogicalResourceId: 'VPCEndpointS3', PhysicalResourceId: 'vpce-s3', ResourceType: 'AWS::EC2::VPCEndpoint' },
31
- { LogicalResourceId: 'VPCEndpointDynamoDB', PhysicalResourceId: 'vpce-ddb', ResourceType: 'AWS::EC2::VPCEndpoint' }
32
- ],
33
- NextToken: null // Last page
34
- })
35
- };
36
-
37
- const provider = new AWSProviderAdapter('us-east-1');
38
- provider.getCloudFormationClient = jest.fn().mockReturnValue(mockCfClient);
39
-
40
- const resources = await provider.listStackResources('test-stack');
41
-
42
- // Should have ALL resources from ALL pages
43
- expect(resources).toHaveLength(4);
44
- expect(resources.map(r => r.LogicalResourceId)).toEqual([
45
- 'Resource1',
46
- 'Resource2',
47
- 'VPCEndpointS3',
48
- 'VPCEndpointDynamoDB'
49
- ]);
50
-
51
- // Should have called CloudFormation twice (once for each page)
52
- expect(mockCfClient.send).toHaveBeenCalledTimes(2);
53
- });
54
- });
55
-
56
- let provider;
57
-
58
- beforeEach(() => {
59
- jest.clearAllMocks();
60
- delete process.env.AWS_REGION;
61
- });
62
-
63
- describe('constructor()', () => {
64
- it('should initialize with provided region', () => {
65
- provider = new AWSProviderAdapter('eu-west-1');
66
-
67
- expect(provider.region).toBe('eu-west-1');
68
- });
69
-
70
- it('should default to us-east-1 if no region provided', () => {
71
- provider = new AWSProviderAdapter();
72
-
73
- expect(provider.region).toBe('us-east-1');
74
- });
75
-
76
- it('should use AWS_REGION environment variable', () => {
77
- process.env.AWS_REGION = 'ap-southeast-1';
78
- provider = new AWSProviderAdapter();
79
-
80
- expect(provider.region).toBe('ap-southeast-1');
81
- });
82
-
83
- it('should prefer provided region over environment variable', () => {
84
- process.env.AWS_REGION = 'us-west-2';
85
- provider = new AWSProviderAdapter('eu-central-1');
86
-
87
- expect(provider.region).toBe('eu-central-1');
88
- });
89
-
90
- it('should store credentials if provided', () => {
91
- const credentials = {
92
- accessKeyId: 'test-key',
93
- secretAccessKey: 'test-secret',
94
- };
95
-
96
- provider = new AWSProviderAdapter('us-east-1', credentials);
97
-
98
- expect(provider.credentials).toEqual(credentials);
99
- });
100
-
101
- it('should lazy-load clients (not instantiated on construction)', () => {
102
- provider = new AWSProviderAdapter('us-east-1');
103
-
104
- expect(provider.ec2).toBeNull();
105
- expect(provider.kms).toBeNull();
106
- expect(provider.rds).toBeNull();
107
- expect(provider.ssm).toBeNull();
108
- expect(provider.secretsManager).toBeNull();
109
- });
110
- });
111
-
112
- describe('getName()', () => {
113
- it('should return "aws"', () => {
114
- provider = new AWSProviderAdapter();
115
-
116
- expect(provider.getName()).toBe('aws');
117
- });
118
- });
119
-
120
- describe('getSupportedRegions()', () => {
121
- it('should return array of AWS regions', () => {
122
- provider = new AWSProviderAdapter();
123
-
124
- const regions = provider.getSupportedRegions();
125
-
126
- expect(Array.isArray(regions)).toBe(true);
127
- expect(regions.length).toBeGreaterThan(0);
128
- });
129
-
130
- it('should include common US regions', () => {
131
- provider = new AWSProviderAdapter();
132
-
133
- const regions = provider.getSupportedRegions();
134
-
135
- expect(regions).toContain('us-east-1');
136
- expect(regions).toContain('us-east-2');
137
- expect(regions).toContain('us-west-1');
138
- expect(regions).toContain('us-west-2');
139
- });
140
-
141
- it('should include common EU regions', () => {
142
- provider = new AWSProviderAdapter();
143
-
144
- const regions = provider.getSupportedRegions();
145
-
146
- expect(regions).toContain('eu-west-1');
147
- expect(regions).toContain('eu-central-1');
148
- });
149
-
150
- it('should include common APAC regions', () => {
151
- provider = new AWSProviderAdapter();
152
-
153
- const regions = provider.getSupportedRegions();
154
-
155
- expect(regions).toContain('ap-southeast-1');
156
- expect(regions).toContain('ap-northeast-1');
157
- });
158
- });
159
-
160
- describe('Lazy loading clients', () => {
161
- beforeEach(() => {
162
- provider = new AWSProviderAdapter('us-east-1');
163
- });
164
-
165
- it('should lazy-load EC2 client', () => {
166
- expect(provider.ec2).toBeNull();
167
-
168
- const client = provider.getEC2Client();
169
-
170
- expect(provider.ec2).not.toBeNull();
171
- expect(client).toBe(provider.ec2);
172
- });
173
-
174
- it('should lazy-load KMS client', () => {
175
- expect(provider.kms).toBeNull();
176
-
177
- const client = provider.getKMSClient();
178
-
179
- expect(provider.kms).not.toBeNull();
180
- expect(client).toBe(provider.kms);
181
- });
182
-
183
- it('should lazy-load RDS client', () => {
184
- expect(provider.rds).toBeNull();
185
-
186
- const client = provider.getRDSClient();
187
-
188
- expect(provider.rds).not.toBeNull();
189
- expect(client).toBe(provider.rds);
190
- });
191
-
192
- it('should lazy-load SSM client', () => {
193
- expect(provider.ssm).toBeNull();
194
-
195
- const client = provider.getSSMClient();
196
-
197
- expect(provider.ssm).not.toBeNull();
198
- expect(client).toBe(provider.ssm);
199
- });
200
-
201
- it('should lazy-load Secrets Manager client', () => {
202
- expect(provider.secretsManager).toBeNull();
203
-
204
- const client = provider.getSecretsManagerClient();
205
-
206
- expect(provider.secretsManager).not.toBeNull();
207
- expect(client).toBe(provider.secretsManager);
208
- });
209
-
210
- it('should lazy-load CloudFormation client', () => {
211
- expect(provider.cloudformation).toBeNull();
212
-
213
- const client = provider.getCloudFormationClient();
214
-
215
- expect(provider.cloudformation).not.toBeNull();
216
- expect(client).toBe(provider.cloudformation);
217
- });
218
-
219
- it('should reuse client on subsequent calls', () => {
220
- const client1 = provider.getEC2Client();
221
- const client2 = provider.getEC2Client();
222
-
223
- expect(client1).toBe(client2);
224
- });
225
- });
226
-
227
- describe('discoverVpc()', () => {
228
- beforeEach(() => {
229
- provider = new AWSProviderAdapter('us-east-1');
230
- const { EC2Client } = require('@aws-sdk/client-ec2');
231
- EC2Client.mockImplementation(() => ({
232
- send: jest.fn(),
233
- }));
234
- });
235
-
236
- it('should return VPC discovery results', async () => {
237
- const mockSend = jest.fn()
238
- .mockResolvedValueOnce({ // VPCs
239
- Vpcs: [
240
- { VpcId: 'vpc-123', CidrBlock: '172.31.0.0/16' },
241
- ],
242
- })
243
- .mockResolvedValueOnce({ Subnets: [] }) // Subnets
244
- .mockResolvedValueOnce({ SecurityGroups: [] }) // Security Groups
245
- .mockResolvedValueOnce({ RouteTables: [] }) // Route Tables
246
- .mockResolvedValueOnce({ NatGateways: [] }) // NAT Gateways
247
- .mockResolvedValueOnce({ InternetGateways: [] }) // Internet Gateways
248
- .mockResolvedValueOnce({ VpcEndpoints: [] }); // VPC Endpoints
249
-
250
- provider.getEC2Client = jest.fn().mockReturnValue({ send: mockSend });
251
-
252
- const result = await provider.discoverVpc({});
253
-
254
- expect(result.vpcId).toBe('vpc-123');
255
- expect(result.vpcCidr).toBe('172.31.0.0/16');
256
- });
257
-
258
- it('should handle discovery errors', async () => {
259
- provider.getEC2Client = jest.fn().mockReturnValue({
260
- send: jest.fn().mockRejectedValue(new Error('EC2 API Error')),
261
- });
262
-
263
- await expect(provider.discoverVpc({})).rejects.toThrow('Failed to discover AWS VPC');
264
- });
265
-
266
- it('should discover default VPC when no vpcId specified', async () => {
267
- const mockSend = jest.fn();
268
- provider.getEC2Client = jest.fn().mockReturnValue({ send: mockSend });
269
-
270
- await provider.discoverVpc({}).catch(() => { });
271
-
272
- // First call should filter for default VPC
273
- expect(mockSend).toHaveBeenCalled();
274
- });
275
- });
276
-
277
- describe('discoverKmsKeys()', () => {
278
- beforeEach(() => {
279
- provider = new AWSProviderAdapter('us-east-1');
280
- const { KMSClient } = require('@aws-sdk/client-kms');
281
- KMSClient.mockImplementation(() => ({
282
- send: jest.fn(),
283
- }));
284
- });
285
-
286
- it('should return KMS discovery results', async () => {
287
- const mockSend = jest.fn()
288
- .mockResolvedValueOnce({ // ListKeys
289
- Keys: [{ KeyId: 'key-123' }],
290
- })
291
- .mockResolvedValueOnce({ // DescribeKey
292
- KeyMetadata: {
293
- KeyId: 'key-123',
294
- Arn: 'arn:aws:kms:us-east-1:123:key/abc',
295
- Enabled: true,
296
- },
297
- })
298
- .mockResolvedValueOnce({ // ListAliases
299
- Aliases: [
300
- { AliasName: 'alias/my-key', TargetKeyId: 'key-123' },
301
- ],
302
- });
303
-
304
- provider.getKMSClient = jest.fn().mockReturnValue({ send: mockSend });
305
-
306
- const result = await provider.discoverKmsKeys({});
307
-
308
- expect(result.keys.length).toBeGreaterThan(0);
309
- expect(result.defaultKey).toBeDefined();
310
- });
311
-
312
- it('should handle discovery errors', async () => {
313
- provider.getKMSClient = jest.fn().mockReturnValue({
314
- send: jest.fn().mockRejectedValue(new Error('KMS API Error')),
315
- });
316
-
317
- await expect(provider.discoverKmsKeys({})).rejects.toThrow('Failed to discover AWS KMS keys');
318
- });
319
- });
320
-
321
- describe('discoverDatabase()', () => {
322
- beforeEach(() => {
323
- provider = new AWSProviderAdapter('us-east-1');
324
- const { RDSClient } = require('@aws-sdk/client-rds');
325
- RDSClient.mockImplementation(() => ({
326
- send: jest.fn(),
327
- }));
328
- });
329
-
330
- it('should return database discovery results', async () => {
331
- const mockSend = jest.fn()
332
- .mockResolvedValueOnce({ // Clusters
333
- DBClusters: [
334
- {
335
- DBClusterIdentifier: 'cluster-1',
336
- Endpoint: 'cluster-1.example.com',
337
- Port: 5432,
338
- Engine: 'aurora-postgresql',
339
- },
340
- ],
341
- })
342
- .mockResolvedValueOnce({ DBInstances: [] }); // Instances
343
-
344
- provider.getRDSClient = jest.fn().mockReturnValue({ send: mockSend });
345
-
346
- const result = await provider.discoverDatabase({});
347
-
348
- expect(result.endpoint).toBe('cluster-1.example.com');
349
- expect(result.port).toBe(5432);
350
- expect(result.engine).toBe('aurora-postgresql');
351
- });
352
-
353
- it('should handle discovery errors', async () => {
354
- provider.getRDSClient = jest.fn().mockReturnValue({
355
- send: jest.fn().mockRejectedValue(new Error('RDS API Error')),
356
- });
357
-
358
- await expect(provider.discoverDatabase({})).rejects.toThrow('Failed to discover AWS databases');
359
- });
360
- });
361
-
362
- describe('discoverParameters()', () => {
363
- beforeEach(() => {
364
- provider = new AWSProviderAdapter('us-east-1');
365
- });
366
-
367
- it('should return parameter discovery results', async () => {
368
- const mockSSMSend = jest.fn().mockResolvedValue({
369
- Parameters: [
370
- { Name: '/my-app/api-key', Value: 'encrypted' },
371
- ],
372
- });
373
-
374
- const mockSMSend = jest.fn().mockResolvedValue({
375
- SecretList: [
376
- { Name: 'my-app/secret', ARN: 'arn:aws:secretsmanager:us-east-1:123:secret:my-app/secret' },
377
- ],
378
- });
379
-
380
- provider.getSSMClient = jest.fn().mockReturnValue({ send: mockSSMSend });
381
- provider.getSecretsManagerClient = jest.fn().mockReturnValue({ send: mockSMSend });
382
-
383
- const result = await provider.discoverParameters({
384
- parameterPath: '/my-app',
385
- includeSecrets: true,
386
- });
387
-
388
- expect(result.parameters).toHaveLength(1);
389
- expect(result.secrets).toHaveLength(1);
390
- });
391
-
392
- it('should handle discovery errors', async () => {
393
- provider.getSSMClient = jest.fn().mockReturnValue({
394
- send: jest.fn().mockRejectedValue(new Error('SSM API Error')),
395
- });
396
-
397
- await expect(provider.discoverParameters({ parameterPath: '/test' })).rejects.toThrow('Failed to discover AWS parameters');
398
- });
399
-
400
- it('should skip secrets when includeSecrets is false', async () => {
401
- const mockSSMSend = jest.fn().mockResolvedValue({ Parameters: [] });
402
-
403
- provider.getSSMClient = jest.fn().mockReturnValue({ send: mockSSMSend });
404
-
405
- const result = await provider.discoverParameters({
406
- includeSecrets: false,
407
- });
408
-
409
- expect(result.parameters).toEqual([]);
410
- expect(result.secrets).toEqual([]);
411
- // Behavior-based test: secrets should be empty when includeSecrets is false
412
- // (Implementation detail: getSecretsManagerClient shouldn't be called)
413
- });
414
- });
415
- });
416
-
@@ -1,93 +0,0 @@
1
- /**
2
- * FUTURE: Microsoft Azure Provider Adapter
3
- *
4
- * This file serves as a placeholder for future Azure support.
5
- *
6
- * Implementation will use:
7
- * - @azure/arm-network for Virtual Network discovery
8
- * - @azure/keyvault-keys for Key Vault key management
9
- * - @azure/arm-sql for Azure SQL database discovery
10
- * - @azure/keyvault-secrets for secrets management
11
- * - @azure/arm-resources for resource group management
12
- *
13
- * Resources:
14
- * - Azure SDK for JavaScript: https://docs.microsoft.com/en-us/javascript/azure/
15
- * - ARM Network API: https://docs.microsoft.com/en-us/javascript/api/@azure/arm-network
16
- * - Key Vault API: https://docs.microsoft.com/en-us/javascript/api/@azure/keyvault-keys
17
- * - Azure SQL API: https://docs.microsoft.com/en-us/javascript/api/@azure/arm-sql
18
- *
19
- * Architecture mapping:
20
- * - AWS VPC → Azure Virtual Network (VNet)
21
- * - AWS KMS → Azure Key Vault
22
- * - AWS RDS Aurora → Azure SQL Database / Azure Database for PostgreSQL
23
- * - AWS SSM Parameter Store → Azure Key Vault Secrets
24
- * - AWS Lambda → Azure Functions
25
- *
26
- * Example structure:
27
- *
28
- * const { NetworkManagementClient } = require('@azure/arm-network');
29
- * const { KeyClient } = require('@azure/keyvault-keys');
30
- * const { DefaultAzureCredential } = require('@azure/identity');
31
- * const { CloudProviderAdapter } = require('./cloud-provider-adapter');
32
- *
33
- * class AzureProviderAdapter extends CloudProviderAdapter {
34
- * constructor(region, credentials = {}) {
35
- * super();
36
- * this.region = region || 'eastus';
37
- * this.subscriptionId = credentials.subscriptionId || process.env.AZURE_SUBSCRIPTION_ID;
38
- * this.credential = new DefaultAzureCredential();
39
- *
40
- * this.networkClient = new NetworkManagementClient(
41
- * this.credential,
42
- * this.subscriptionId
43
- * );
44
- * }
45
- *
46
- * getName() {
47
- * return 'azure';
48
- * }
49
- *
50
- * getSupportedRegions() {
51
- * return [
52
- * 'eastus', 'eastus2', 'westus', 'westus2',
53
- * 'northeurope', 'westeurope', 'southeastasia'
54
- * ];
55
- * }
56
- *
57
- * async discoverVpc(config) {
58
- * // Discover Azure Virtual Networks
59
- * const vnets = [];
60
- * for await (const vnet of this.networkClient.virtualNetworks.listAll()) {
61
- * vnets.push(vnet);
62
- * }
63
- * // ... implementation
64
- * }
65
- *
66
- * async discoverKmsKeys(config) {
67
- * // Discover Azure Key Vault keys
68
- * const keyVaultUrl = `https://${config.keyVaultName}.vault.azure.net`;
69
- * const keyClient = new KeyClient(keyVaultUrl, this.credential);
70
- * const keys = [];
71
- * for await (const key of keyClient.listPropertiesOfKeys()) {
72
- * keys.push(key);
73
- * }
74
- * // ... implementation
75
- * }
76
- *
77
- * async discoverDatabase(config) {
78
- * // Discover Azure SQL databases
79
- * // ... implementation
80
- * }
81
- *
82
- * async discoverParameters(config) {
83
- * // Discover Azure Key Vault secrets
84
- * // ... implementation
85
- * }
86
- * }
87
- *
88
- * module.exports = { AzureProviderAdapter };
89
- */
90
-
91
- // Placeholder export to prevent import errors
92
- module.exports = {};
93
-
@@ -1,136 +0,0 @@
1
- /**
2
- * Cloud Provider Adapter (Abstract Base Class)
3
- *
4
- * Port - Hexagonal Architecture
5
- *
6
- * Defines the contract for cloud provider implementations.
7
- * This abstraction enables multi-cloud support by providing a consistent
8
- * interface for AWS, GCP, Azure, and other cloud providers.
9
- *
10
- * Benefits:
11
- * - Cloud-agnostic infrastructure code
12
- * - Easy to add new providers (just implement this interface)
13
- * - Testable with mock providers
14
- * - Clear separation between cloud-specific and business logic
15
- */
16
-
17
- class CloudProviderAdapter {
18
- /**
19
- * Get provider name
20
- * @returns {string} Provider name ('aws', 'gcp', 'azure', etc.)
21
- */
22
- getName() {
23
- throw new Error('CloudProviderAdapter.getName() must be implemented by subclass');
24
- }
25
-
26
- /**
27
- * Get supported regions for this provider
28
- * @returns {Array<string>} List of supported region identifiers
29
- */
30
- getSupportedRegions() {
31
- throw new Error('CloudProviderAdapter.getSupportedRegions() must be implemented by subclass');
32
- }
33
-
34
- // ==================== Discovery Methods ====================
35
-
36
- /**
37
- * Discover VPC/network resources
38
- *
39
- * @param {Object} config - Discovery configuration
40
- * @param {string} [config.vpcId] - Specific VPC ID to discover
41
- * @param {string} [config.vpcName] - VPC name pattern to search for
42
- * @param {boolean} [config.includeSubnets] - Whether to include subnet details
43
- * @returns {Promise<Object>} Discovered VPC resources
44
- * @returns {Promise<Object>} result.vpcId - VPC identifier
45
- * @returns {Promise<Object>} result.vpcCidr - VPC CIDR block
46
- * @returns {Promise<Object>} result.subnets - Array of subnet objects
47
- * @returns {Promise<Object>} result.securityGroups - Array of security group objects
48
- * @returns {Promise<Object>} result.routeTables - Array of route table objects
49
- */
50
- async discoverVpc(config) {
51
- throw new Error('CloudProviderAdapter.discoverVpc() must be implemented by subclass');
52
- }
53
-
54
- /**
55
- * Discover encryption keys (KMS, Cloud KMS, Azure Key Vault, etc.)
56
- *
57
- * @param {Object} config - Discovery configuration
58
- * @param {string} [config.keyId] - Specific key ID to discover
59
- * @param {string} [config.keyAlias] - Key alias to search for
60
- * @returns {Promise<Object>} Discovered encryption key resources
61
- * @returns {Promise<Object>} result.keyId - Key identifier
62
- * @returns {Promise<Object>} result.keyArn - Key ARN/resource name
63
- * @returns {Promise<Object>} result.aliases - Array of key aliases
64
- */
65
- async discoverKmsKeys(config) {
66
- throw new Error('CloudProviderAdapter.discoverKmsKeys() must be implemented by subclass');
67
- }
68
-
69
- /**
70
- * Discover database resources (RDS, Cloud SQL, Azure SQL, etc.)
71
- *
72
- * @param {Object} config - Discovery configuration
73
- * @param {string} [config.databaseId] - Specific database instance/cluster ID
74
- * @param {string} [config.engine] - Database engine filter ('postgresql', 'mysql', etc.)
75
- * @returns {Promise<Object>} Discovered database resources
76
- * @returns {Promise<Object>} result.endpoint - Database connection endpoint
77
- * @returns {Promise<Object>} result.port - Database port
78
- * @returns {Promise<Object>} result.engine - Database engine type
79
- * @returns {Promise<Object>} result.version - Database version
80
- */
81
- async discoverDatabase(config) {
82
- throw new Error('CloudProviderAdapter.discoverDatabase() must be implemented by subclass');
83
- }
84
-
85
- /**
86
- * Discover parameter store/secret manager resources
87
- *
88
- * @param {Object} config - Discovery configuration
89
- * @param {string} [config.parameterPath] - Parameter path prefix to search
90
- * @param {string} [config.secretName] - Specific secret name to discover
91
- * @returns {Promise<Object>} Discovered parameter/secret resources
92
- * @returns {Promise<Object>} result.parameters - Array of parameter objects
93
- * @returns {Promise<Object>} result.secrets - Array of secret objects
94
- */
95
- async discoverParameters(config) {
96
- throw new Error('CloudProviderAdapter.discoverParameters() must be implemented by subclass');
97
- }
98
-
99
- // ==================== Provisioning Methods (Future) ====================
100
- // These will be used for Terraform/Pulumi/CloudFormation generation
101
-
102
- /**
103
- * Generate VPC provisioning configuration
104
- *
105
- * @param {Object} config - VPC configuration
106
- * @returns {Promise<Object>} Infrastructure-as-code configuration
107
- */
108
- async provisionVpc(config) {
109
- throw new Error('CloudProviderAdapter.provisionVpc() not yet implemented. Future feature for IaC generation.');
110
- }
111
-
112
- /**
113
- * Generate encryption key provisioning configuration
114
- *
115
- * @param {Object} config - Key configuration
116
- * @returns {Promise<Object>} Infrastructure-as-code configuration
117
- */
118
- async provisionKmsKey(config) {
119
- throw new Error('CloudProviderAdapter.provisionKmsKey() not yet implemented. Future feature for IaC generation.');
120
- }
121
-
122
- /**
123
- * Generate database provisioning configuration
124
- *
125
- * @param {Object} config - Database configuration
126
- * @returns {Promise<Object>} Infrastructure-as-code configuration
127
- */
128
- async provisionDatabase(config) {
129
- throw new Error('CloudProviderAdapter.provisionDatabase() not yet implemented. Future feature for IaC generation.');
130
- }
131
- }
132
-
133
- module.exports = {
134
- CloudProviderAdapter,
135
- };
136
-