@friggframework/devtools 2.0.0-next.4 → 2.0.0-next.40

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 (197) hide show
  1. package/frigg-cli/.eslintrc.js +141 -0
  2. package/frigg-cli/__tests__/jest.config.js +102 -0
  3. package/frigg-cli/__tests__/unit/commands/build.test.js +483 -0
  4. package/frigg-cli/__tests__/unit/commands/install.test.js +418 -0
  5. package/frigg-cli/__tests__/unit/commands/ui.test.js +592 -0
  6. package/frigg-cli/__tests__/utils/command-tester.js +170 -0
  7. package/frigg-cli/__tests__/utils/mock-factory.js +270 -0
  8. package/frigg-cli/__tests__/utils/test-fixtures.js +463 -0
  9. package/frigg-cli/__tests__/utils/test-setup.js +286 -0
  10. package/frigg-cli/build-command/index.js +54 -0
  11. package/frigg-cli/deploy-command/index.js +175 -0
  12. package/frigg-cli/generate-command/__tests__/generate-command.test.js +312 -0
  13. package/frigg-cli/generate-command/azure-generator.js +43 -0
  14. package/frigg-cli/generate-command/gcp-generator.js +47 -0
  15. package/frigg-cli/generate-command/index.js +332 -0
  16. package/frigg-cli/generate-command/terraform-generator.js +555 -0
  17. package/frigg-cli/generate-iam-command.js +115 -0
  18. package/frigg-cli/index.js +47 -1
  19. package/frigg-cli/index.test.js +1 -4
  20. package/frigg-cli/init-command/backend-first-handler.js +756 -0
  21. package/frigg-cli/init-command/index.js +93 -0
  22. package/frigg-cli/init-command/template-handler.js +143 -0
  23. package/frigg-cli/install-command/index.js +1 -4
  24. package/frigg-cli/package.json +51 -0
  25. package/frigg-cli/start-command/index.js +24 -4
  26. package/frigg-cli/test/init-command.test.js +180 -0
  27. package/frigg-cli/test/npm-registry.test.js +319 -0
  28. package/frigg-cli/ui-command/index.js +154 -0
  29. package/frigg-cli/utils/app-resolver.js +319 -0
  30. package/frigg-cli/utils/backend-path.js +16 -17
  31. package/frigg-cli/utils/npm-registry.js +167 -0
  32. package/frigg-cli/utils/process-manager.js +199 -0
  33. package/frigg-cli/utils/repo-detection.js +405 -0
  34. package/infrastructure/DEPLOYMENT-INSTRUCTIONS.md +268 -0
  35. package/infrastructure/GENERATE-IAM-DOCS.md +278 -0
  36. package/infrastructure/IAM-POLICY-TEMPLATES.md +176 -0
  37. package/infrastructure/README.md +443 -0
  38. package/infrastructure/WEBSOCKET-CONFIGURATION.md +105 -0
  39. package/infrastructure/__tests__/fixtures/mock-aws-resources.js +391 -0
  40. package/infrastructure/__tests__/helpers/test-utils.js +277 -0
  41. package/infrastructure/aws-discovery.js +1176 -0
  42. package/infrastructure/aws-discovery.test.js +1220 -0
  43. package/infrastructure/build-time-discovery.js +206 -0
  44. package/infrastructure/build-time-discovery.test.js +378 -0
  45. package/infrastructure/create-frigg-infrastructure.js +3 -5
  46. package/infrastructure/env-validator.js +77 -0
  47. package/infrastructure/frigg-deployment-iam-stack.yaml +401 -0
  48. package/infrastructure/iam-generator.js +836 -0
  49. package/infrastructure/iam-generator.test.js +172 -0
  50. package/infrastructure/iam-policy-basic.json +218 -0
  51. package/infrastructure/iam-policy-full.json +288 -0
  52. package/infrastructure/integration.test.js +383 -0
  53. package/infrastructure/run-discovery.js +110 -0
  54. package/infrastructure/serverless-template.js +1472 -138
  55. package/infrastructure/serverless-template.test.js +1759 -0
  56. package/management-ui/.eslintrc.js +22 -0
  57. package/management-ui/README.md +203 -0
  58. package/management-ui/components.json +21 -0
  59. package/management-ui/docs/phase2-integration-guide.md +320 -0
  60. package/management-ui/index.html +13 -0
  61. package/management-ui/package-lock.json +16517 -0
  62. package/management-ui/package.json +76 -0
  63. package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +302 -0
  64. package/management-ui/postcss.config.js +6 -0
  65. package/management-ui/server/api/backend.js +256 -0
  66. package/management-ui/server/api/cli.js +315 -0
  67. package/management-ui/server/api/codegen.js +663 -0
  68. package/management-ui/server/api/connections.js +857 -0
  69. package/management-ui/server/api/discovery.js +185 -0
  70. package/management-ui/server/api/environment/index.js +1 -0
  71. package/management-ui/server/api/environment/router.js +378 -0
  72. package/management-ui/server/api/environment.js +328 -0
  73. package/management-ui/server/api/integrations.js +876 -0
  74. package/management-ui/server/api/logs.js +248 -0
  75. package/management-ui/server/api/monitoring.js +282 -0
  76. package/management-ui/server/api/open-ide.js +31 -0
  77. package/management-ui/server/api/project.js +1029 -0
  78. package/management-ui/server/api/users/sessions.js +371 -0
  79. package/management-ui/server/api/users/simulation.js +254 -0
  80. package/management-ui/server/api/users.js +362 -0
  81. package/management-ui/server/api-contract.md +275 -0
  82. package/management-ui/server/index.js +873 -0
  83. package/management-ui/server/middleware/errorHandler.js +93 -0
  84. package/management-ui/server/middleware/security.js +32 -0
  85. package/management-ui/server/processManager.js +296 -0
  86. package/management-ui/server/server.js +346 -0
  87. package/management-ui/server/services/aws-monitor.js +413 -0
  88. package/management-ui/server/services/npm-registry.js +347 -0
  89. package/management-ui/server/services/template-engine.js +538 -0
  90. package/management-ui/server/utils/cliIntegration.js +220 -0
  91. package/management-ui/server/utils/environment/auditLogger.js +471 -0
  92. package/management-ui/server/utils/environment/awsParameterStore.js +264 -0
  93. package/management-ui/server/utils/environment/encryption.js +278 -0
  94. package/management-ui/server/utils/environment/envFileManager.js +286 -0
  95. package/management-ui/server/utils/import-commonjs.js +28 -0
  96. package/management-ui/server/utils/response.js +83 -0
  97. package/management-ui/server/websocket/handler.js +325 -0
  98. package/management-ui/src/App.jsx +109 -0
  99. package/management-ui/src/assets/FriggLogo.svg +1 -0
  100. package/management-ui/src/components/AppRouter.jsx +65 -0
  101. package/management-ui/src/components/Button.jsx +70 -0
  102. package/management-ui/src/components/Card.jsx +97 -0
  103. package/management-ui/src/components/EnvironmentCompare.jsx +400 -0
  104. package/management-ui/src/components/EnvironmentEditor.jsx +372 -0
  105. package/management-ui/src/components/EnvironmentImportExport.jsx +469 -0
  106. package/management-ui/src/components/EnvironmentSchema.jsx +491 -0
  107. package/management-ui/src/components/EnvironmentSecurity.jsx +463 -0
  108. package/management-ui/src/components/ErrorBoundary.jsx +73 -0
  109. package/management-ui/src/components/IntegrationCard.jsx +481 -0
  110. package/management-ui/src/components/IntegrationCardEnhanced.jsx +770 -0
  111. package/management-ui/src/components/IntegrationExplorer.jsx +379 -0
  112. package/management-ui/src/components/IntegrationStatus.jsx +336 -0
  113. package/management-ui/src/components/Layout.jsx +716 -0
  114. package/management-ui/src/components/LoadingSpinner.jsx +113 -0
  115. package/management-ui/src/components/RepositoryPicker.jsx +248 -0
  116. package/management-ui/src/components/SessionMonitor.jsx +350 -0
  117. package/management-ui/src/components/StatusBadge.jsx +208 -0
  118. package/management-ui/src/components/UserContextSwitcher.jsx +212 -0
  119. package/management-ui/src/components/UserSimulation.jsx +327 -0
  120. package/management-ui/src/components/Welcome.jsx +434 -0
  121. package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +637 -0
  122. package/management-ui/src/components/codegen/APIModuleSelector.jsx +227 -0
  123. package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +247 -0
  124. package/management-ui/src/components/codegen/CodePreviewEditor.jsx +316 -0
  125. package/management-ui/src/components/codegen/DynamicModuleForm.jsx +271 -0
  126. package/management-ui/src/components/codegen/FormBuilder.jsx +737 -0
  127. package/management-ui/src/components/codegen/IntegrationGenerator.jsx +855 -0
  128. package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +797 -0
  129. package/management-ui/src/components/codegen/SchemaBuilder.jsx +303 -0
  130. package/management-ui/src/components/codegen/TemplateSelector.jsx +586 -0
  131. package/management-ui/src/components/codegen/index.js +10 -0
  132. package/management-ui/src/components/connections/ConnectionConfigForm.jsx +362 -0
  133. package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +182 -0
  134. package/management-ui/src/components/connections/ConnectionTester.jsx +200 -0
  135. package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +292 -0
  136. package/management-ui/src/components/connections/OAuthFlow.jsx +204 -0
  137. package/management-ui/src/components/connections/index.js +5 -0
  138. package/management-ui/src/components/index.js +21 -0
  139. package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +222 -0
  140. package/management-ui/src/components/monitoring/LambdaMetrics.jsx +169 -0
  141. package/management-ui/src/components/monitoring/MetricsChart.jsx +197 -0
  142. package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +393 -0
  143. package/management-ui/src/components/monitoring/SQSMetrics.jsx +246 -0
  144. package/management-ui/src/components/monitoring/index.js +6 -0
  145. package/management-ui/src/components/monitoring/monitoring.css +218 -0
  146. package/management-ui/src/components/theme-provider.jsx +52 -0
  147. package/management-ui/src/components/theme-toggle.jsx +39 -0
  148. package/management-ui/src/components/ui/badge.tsx +36 -0
  149. package/management-ui/src/components/ui/button.test.jsx +56 -0
  150. package/management-ui/src/components/ui/button.tsx +57 -0
  151. package/management-ui/src/components/ui/card.tsx +76 -0
  152. package/management-ui/src/components/ui/dropdown-menu.tsx +199 -0
  153. package/management-ui/src/components/ui/select.tsx +157 -0
  154. package/management-ui/src/components/ui/skeleton.jsx +15 -0
  155. package/management-ui/src/hooks/useFrigg.jsx +601 -0
  156. package/management-ui/src/hooks/useSocket.jsx +58 -0
  157. package/management-ui/src/index.css +193 -0
  158. package/management-ui/src/lib/utils.ts +6 -0
  159. package/management-ui/src/main.jsx +10 -0
  160. package/management-ui/src/pages/CodeGeneration.jsx +14 -0
  161. package/management-ui/src/pages/Connections.jsx +252 -0
  162. package/management-ui/src/pages/ConnectionsEnhanced.jsx +633 -0
  163. package/management-ui/src/pages/Dashboard.jsx +311 -0
  164. package/management-ui/src/pages/Environment.jsx +314 -0
  165. package/management-ui/src/pages/IntegrationConfigure.jsx +669 -0
  166. package/management-ui/src/pages/IntegrationDiscovery.jsx +567 -0
  167. package/management-ui/src/pages/IntegrationTest.jsx +742 -0
  168. package/management-ui/src/pages/Integrations.jsx +253 -0
  169. package/management-ui/src/pages/Monitoring.jsx +17 -0
  170. package/management-ui/src/pages/Simulation.jsx +155 -0
  171. package/management-ui/src/pages/Users.jsx +492 -0
  172. package/management-ui/src/services/api.js +41 -0
  173. package/management-ui/src/services/apiModuleService.js +193 -0
  174. package/management-ui/src/services/websocket-handlers.js +120 -0
  175. package/management-ui/src/test/api/project.test.js +273 -0
  176. package/management-ui/src/test/components/Welcome.test.jsx +378 -0
  177. package/management-ui/src/test/mocks/server.js +178 -0
  178. package/management-ui/src/test/setup.js +61 -0
  179. package/management-ui/src/test/utils/test-utils.jsx +134 -0
  180. package/management-ui/src/utils/repository.js +98 -0
  181. package/management-ui/src/utils/repository.test.js +118 -0
  182. package/management-ui/src/workflows/phase2-integration-workflows.js +884 -0
  183. package/management-ui/tailwind.config.js +63 -0
  184. package/management-ui/tsconfig.json +37 -0
  185. package/management-ui/tsconfig.node.json +10 -0
  186. package/management-ui/vite.config.js +26 -0
  187. package/management-ui/vitest.config.js +38 -0
  188. package/package.json +20 -9
  189. package/infrastructure/app-handler-helpers.js +0 -57
  190. package/infrastructure/backend-utils.js +0 -90
  191. package/infrastructure/routers/auth.js +0 -26
  192. package/infrastructure/routers/integration-defined-routers.js +0 -37
  193. package/infrastructure/routers/middleware/loadUser.js +0 -15
  194. package/infrastructure/routers/middleware/requireLoggedInUser.js +0 -12
  195. package/infrastructure/routers/user.js +0 -41
  196. package/infrastructure/routers/websocket.js +0 -55
  197. package/infrastructure/workers/integration-defined-workers.js +0 -24
@@ -0,0 +1,105 @@
1
+ # WebSocket Configuration for Frigg Applications
2
+
3
+ ## Overview
4
+
5
+ WebSockets in Frigg applications are now **disabled by default** and can be enabled through the AppDefinition configuration. This allows applications that don't need real-time communication to avoid deploying unnecessary WebSocket infrastructure.
6
+
7
+ ## Enabling WebSockets
8
+
9
+ To enable WebSocket support in your Frigg application, add the `websockets` configuration to your AppDefinition:
10
+
11
+ ```javascript
12
+ // backend/index.js
13
+ const appDefinition = {
14
+ integrations: [YourIntegration],
15
+ websockets: {
16
+ enable: true // Enable WebSocket support
17
+ },
18
+ // ... other configuration
19
+ };
20
+
21
+ module.exports = {
22
+ Definition: appDefinition,
23
+ };
24
+ ```
25
+
26
+ ## What Happens When WebSockets Are Enabled
27
+
28
+ When you set `websockets.enable: true`, the following resources are deployed:
29
+
30
+ 1. **WebSocket API Gateway** - AWS API Gateway WebSocket endpoint
31
+ 2. **Lambda Functions** - Handlers for `$connect`, `$disconnect`, and `$default` routes
32
+ 3. **Database Collection** - MongoDB collection to store active WebSocket connections
33
+ 4. **Environment Variable** - `WEBSOCKET_API_ENDPOINT` is automatically configured
34
+
35
+ ## Using WebSockets in Your Application
36
+
37
+ Once enabled, you can use the `WebsocketConnection` model to send messages to connected clients:
38
+
39
+ ```javascript
40
+ const { WebsocketConnection } = require('@friggframework/core');
41
+
42
+ // Get all active connections and send a message
43
+ const connections = await WebsocketConnection.getActiveConnections();
44
+ for (const connection of connections) {
45
+ await connection.send({
46
+ type: 'update',
47
+ data: { message: 'Hello from server!' }
48
+ });
49
+ }
50
+ ```
51
+
52
+ ## Default Behavior (WebSockets Disabled)
53
+
54
+ When websockets are disabled (the default):
55
+ - No WebSocket infrastructure is deployed
56
+ - `WebsocketConnection.getActiveConnections()` returns an empty array
57
+ - No `WEBSOCKET_API_ENDPOINT` environment variable is set
58
+ - No additional Lambda functions or API Gateway resources are created
59
+
60
+ ## Use Cases for WebSockets
61
+
62
+ Enable WebSockets when you need:
63
+ - Real-time updates for integration sync status
64
+ - Live streaming of data processing progress
65
+ - Push notifications to connected clients
66
+ - Real-time collaboration features
67
+
68
+ ## Cost Considerations
69
+
70
+ Disabling WebSockets by default helps reduce costs by:
71
+ - Avoiding API Gateway WebSocket charges when not needed
72
+ - Reducing Lambda function invocations
73
+ - Eliminating unnecessary database operations for connection management
74
+
75
+ ## Migration Guide
76
+
77
+ If you have an existing Frigg application that uses WebSockets:
78
+
79
+ 1. Add the websockets configuration to your AppDefinition:
80
+ ```javascript
81
+ websockets: {
82
+ enable: true
83
+ }
84
+ ```
85
+
86
+ 2. Redeploy your application:
87
+ ```bash
88
+ npx frigg deploy
89
+ ```
90
+
91
+ Your WebSocket functionality will continue to work as before.
92
+
93
+ ## Troubleshooting
94
+
95
+ ### WebSocket Connection Errors
96
+ If you see errors related to WebSocket connections, ensure:
97
+ 1. WebSockets are enabled in your AppDefinition
98
+ 2. The application has been redeployed after enabling WebSockets
99
+ 3. The `WEBSOCKET_API_ENDPOINT` environment variable is set (automatically done during deployment)
100
+
101
+ ### WebsocketConnection.getActiveConnections() Returns Empty Array
102
+ This is expected behavior when:
103
+ - WebSockets are disabled (default)
104
+ - No clients are currently connected
105
+ - The `WEBSOCKET_API_ENDPOINT` environment variable is not set
@@ -0,0 +1,391 @@
1
+ /**
2
+ * Mock AWS resources for consistent testing across all VPC/KMS/SSM tests
3
+ */
4
+
5
+ const mockVpc = {
6
+ VpcId: 'vpc-12345678',
7
+ IsDefault: true,
8
+ State: 'available',
9
+ CidrBlock: '10.0.0.0/16',
10
+ DhcpOptionsId: 'dopt-12345678',
11
+ InstanceTenancy: 'default'
12
+ };
13
+
14
+ const mockSubnets = [
15
+ {
16
+ SubnetId: 'subnet-private-1',
17
+ VpcId: 'vpc-12345678',
18
+ CidrBlock: '10.0.1.0/24',
19
+ AvailabilityZone: 'us-east-1a',
20
+ State: 'available',
21
+ MapPublicIpOnLaunch: false
22
+ },
23
+ {
24
+ SubnetId: 'subnet-private-2',
25
+ VpcId: 'vpc-12345678',
26
+ CidrBlock: '10.0.2.0/24',
27
+ AvailabilityZone: 'us-east-1b',
28
+ State: 'available',
29
+ MapPublicIpOnLaunch: false
30
+ },
31
+ {
32
+ SubnetId: 'subnet-public-1',
33
+ VpcId: 'vpc-12345678',
34
+ CidrBlock: '10.0.3.0/24',
35
+ AvailabilityZone: 'us-east-1a',
36
+ State: 'available',
37
+ MapPublicIpOnLaunch: true
38
+ }
39
+ ];
40
+
41
+ const mockSecurityGroups = [
42
+ {
43
+ GroupId: 'sg-frigg-12345678',
44
+ GroupName: 'frigg-lambda-sg',
45
+ Description: 'Security group for Frigg Lambda functions',
46
+ VpcId: 'vpc-12345678'
47
+ },
48
+ {
49
+ GroupId: 'sg-default-12345678',
50
+ GroupName: 'default',
51
+ Description: 'Default security group',
52
+ VpcId: 'vpc-12345678'
53
+ }
54
+ ];
55
+
56
+ const mockRouteTables = [
57
+ {
58
+ RouteTableId: 'rtb-private-12345678',
59
+ VpcId: 'vpc-12345678',
60
+ Routes: [
61
+ {
62
+ DestinationCidrBlock: '10.0.0.0/16',
63
+ GatewayId: 'local',
64
+ State: 'active'
65
+ },
66
+ {
67
+ DestinationCidrBlock: '0.0.0.0/0',
68
+ NatGatewayId: 'nat-12345678',
69
+ State: 'active'
70
+ }
71
+ ],
72
+ Associations: [
73
+ {
74
+ RouteTableAssociationId: 'rtbassoc-12345678',
75
+ RouteTableId: 'rtb-private-12345678',
76
+ SubnetId: 'subnet-private-1'
77
+ }
78
+ ]
79
+ },
80
+ {
81
+ RouteTableId: 'rtb-public-12345678',
82
+ VpcId: 'vpc-12345678',
83
+ Routes: [
84
+ {
85
+ DestinationCidrBlock: '10.0.0.0/16',
86
+ GatewayId: 'local',
87
+ State: 'active'
88
+ },
89
+ {
90
+ DestinationCidrBlock: '0.0.0.0/0',
91
+ GatewayId: 'igw-12345678',
92
+ State: 'active'
93
+ }
94
+ ],
95
+ Associations: [
96
+ {
97
+ RouteTableAssociationId: 'rtbassoc-87654321',
98
+ RouteTableId: 'rtb-public-12345678',
99
+ SubnetId: 'subnet-public-1'
100
+ }
101
+ ]
102
+ }
103
+ ];
104
+
105
+ const mockKmsKeys = [
106
+ {
107
+ KeyId: '12345678-1234-1234-1234-123456789012',
108
+ Arn: 'arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012'
109
+ },
110
+ {
111
+ KeyId: '87654321-8765-4321-8765-876543218765',
112
+ Arn: 'arn:aws:kms:us-east-1:123456789012:key/87654321-8765-4321-8765-876543218765'
113
+ }
114
+ ];
115
+
116
+ const mockKmsKeyMetadata = {
117
+ KeyId: '12345678-1234-1234-1234-123456789012',
118
+ Arn: 'arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012',
119
+ CreationDate: new Date('2023-01-01'),
120
+ Enabled: true,
121
+ Description: 'Default KMS key for Frigg encryption',
122
+ KeyUsage: 'ENCRYPT_DECRYPT',
123
+ KeyState: 'Enabled',
124
+ Origin: 'AWS_KMS',
125
+ KeyManager: 'CUSTOMER',
126
+ CustomerMasterKeySpec: 'SYMMETRIC_DEFAULT'
127
+ };
128
+
129
+ const mockStsCallerIdentity = {
130
+ UserId: 'AIDACKCEVSQ6C2EXAMPLE',
131
+ Account: '123456789012',
132
+ Arn: 'arn:aws:iam::123456789012:user/test-user'
133
+ };
134
+
135
+ const mockDiscoveredResources = {
136
+ defaultVpcId: mockVpc.VpcId,
137
+ defaultSecurityGroupId: mockSecurityGroups[0].GroupId,
138
+ privateSubnetId1: mockSubnets[0].SubnetId,
139
+ privateSubnetId2: mockSubnets[1].SubnetId,
140
+ privateRouteTableId: mockRouteTables[0].RouteTableId,
141
+ defaultKmsKeyId: mockKmsKeyMetadata.Arn
142
+ };
143
+
144
+ // App definitions for testing different scenarios
145
+ const mockAppDefinitions = {
146
+ vpcOnly: {
147
+ name: 'vpc-test-app',
148
+ vpc: { enable: true },
149
+ integrations: []
150
+ },
151
+
152
+ kmsOnly: {
153
+ name: 'kms-test-app',
154
+ encryption: { fieldLevelEncryptionMethod: 'kms' },
155
+ integrations: []
156
+ },
157
+
158
+ ssmOnly: {
159
+ name: 'ssm-test-app',
160
+ ssm: { enable: true },
161
+ integrations: []
162
+ },
163
+
164
+ allFeatures: {
165
+ name: 'full-feature-app',
166
+ vpc: { enable: true },
167
+ encryption: { fieldLevelEncryptionMethod: 'kms' },
168
+ ssm: { enable: true },
169
+ integrations: [{
170
+ Definition: {
171
+ name: 'testIntegration'
172
+ }
173
+ }]
174
+ },
175
+
176
+ noFeatures: {
177
+ name: 'minimal-app',
178
+ integrations: []
179
+ },
180
+
181
+ multipleIntegrations: {
182
+ name: 'multi-integration-app',
183
+ vpc: { enable: true },
184
+ integrations: [
185
+ {
186
+ Definition: {
187
+ name: 'hubspot'
188
+ }
189
+ },
190
+ {
191
+ Definition: {
192
+ name: 'salesforce'
193
+ }
194
+ }
195
+ ]
196
+ }
197
+ };
198
+
199
+ // Mock serverless service configurations
200
+ const mockServerlessServices = {
201
+ withVpc: {
202
+ provider: {
203
+ name: 'aws',
204
+ region: 'us-east-1',
205
+ vpc: '${self:custom.vpc.${self:provider.stage}}'
206
+ },
207
+ plugins: [],
208
+ custom: {
209
+ vpc: {
210
+ '${self:provider.stage}': {
211
+ securityGroupIds: ['${env:AWS_DISCOVERY_SECURITY_GROUP_ID}'],
212
+ subnetIds: [
213
+ '${env:AWS_DISCOVERY_SUBNET_ID_1}',
214
+ '${env:AWS_DISCOVERY_SUBNET_ID_2}'
215
+ ]
216
+ }
217
+ }
218
+ },
219
+ functions: {}
220
+ },
221
+
222
+ withKms: {
223
+ provider: {
224
+ name: 'aws',
225
+ region: 'us-east-1'
226
+ },
227
+ plugins: ['serverless-kms-grants'],
228
+ custom: {
229
+ kmsGrants: {
230
+ kmsKeyId: '${env:AWS_DISCOVERY_KMS_KEY_ID}'
231
+ }
232
+ },
233
+ functions: {}
234
+ },
235
+
236
+ withSsm: {
237
+ provider: {
238
+ name: 'aws',
239
+ region: 'us-east-1',
240
+ layers: [
241
+ 'arn:aws:lambda:us-east-1:177933569100:layer:AWS-Parameters-and-Secrets-Lambda-Extension:11'
242
+ ]
243
+ },
244
+ plugins: [],
245
+ custom: {},
246
+ functions: {}
247
+ },
248
+
249
+ withAll: {
250
+ provider: {
251
+ name: 'aws',
252
+ region: 'us-east-1',
253
+ vpc: '${self:custom.vpc.${self:provider.stage}}',
254
+ layers: [
255
+ 'arn:aws:lambda:us-east-1:177933569100:layer:AWS-Parameters-and-Secrets-Lambda-Extension:11'
256
+ ]
257
+ },
258
+ plugins: ['serverless-kms-grants'],
259
+ custom: {
260
+ vpc: {
261
+ '${self:provider.stage}': {
262
+ securityGroupIds: ['${env:AWS_DISCOVERY_SECURITY_GROUP_ID}'],
263
+ subnetIds: [
264
+ '${env:AWS_DISCOVERY_SUBNET_ID_1}',
265
+ '${env:AWS_DISCOVERY_SUBNET_ID_2}'
266
+ ]
267
+ }
268
+ },
269
+ kmsGrants: {
270
+ kmsKeyId: '${env:AWS_DISCOVERY_KMS_KEY_ID}'
271
+ }
272
+ },
273
+ functions: {}
274
+ }
275
+ };
276
+
277
+ // Environment variables for testing
278
+ const mockEnvironmentVariables = {
279
+ AWS_DISCOVERY_VPC_ID: mockVpc.VpcId,
280
+ AWS_DISCOVERY_SECURITY_GROUP_ID: mockSecurityGroups[0].GroupId,
281
+ AWS_DISCOVERY_SUBNET_ID_1: mockSubnets[0].SubnetId,
282
+ AWS_DISCOVERY_SUBNET_ID_2: mockSubnets[1].SubnetId,
283
+ AWS_DISCOVERY_ROUTE_TABLE_ID: mockRouteTables[0].RouteTableId,
284
+ AWS_DISCOVERY_KMS_KEY_ID:mockKmsKeyMetadata.Arn
285
+ };
286
+
287
+ // Fallback environment variables for error scenarios
288
+ const mockFallbackEnvironmentVariables = {
289
+ AWS_DISCOVERY_VPC_ID: 'vpc-fallback',
290
+ AWS_DISCOVERY_SECURITY_GROUP_ID: 'sg-fallback',
291
+ AWS_DISCOVERY_SUBNET_ID_1: 'subnet-fallback-1',
292
+ AWS_DISCOVERY_SUBNET_ID_2: 'subnet-fallback-2',
293
+ AWS_DISCOVERY_ROUTE_TABLE_ID: 'rtb-fallback',
294
+ AWS_DISCOVERY_KMS_KEY_ID:'arn:aws:kms:*:*:key/*'
295
+ };
296
+
297
+ // Mock AWS SDK responses
298
+ const mockAwsSdkResponses = {
299
+ ec2: {
300
+ describeVpcs: {
301
+ default: {
302
+ Vpcs: [mockVpc]
303
+ },
304
+ empty: {
305
+ Vpcs: []
306
+ },
307
+ multiple: {
308
+ Vpcs: [mockVpc, { ...mockVpc, VpcId: 'vpc-87654321', IsDefault: false }]
309
+ }
310
+ },
311
+
312
+ describeSubnets: {
313
+ private: {
314
+ Subnets: mockSubnets.slice(0, 2) // Only private subnets
315
+ },
316
+ mixed: {
317
+ Subnets: mockSubnets // All subnets
318
+ },
319
+ empty: {
320
+ Subnets: []
321
+ }
322
+ },
323
+
324
+ describeSecurityGroups: {
325
+ frigg: {
326
+ SecurityGroups: [mockSecurityGroups[0]]
327
+ },
328
+ default: {
329
+ SecurityGroups: [mockSecurityGroups[1]]
330
+ },
331
+ empty: {
332
+ SecurityGroups: []
333
+ }
334
+ },
335
+
336
+ describeRouteTables: {
337
+ private: {
338
+ RouteTables: [mockRouteTables[0]]
339
+ },
340
+ public: {
341
+ RouteTables: [mockRouteTables[1]]
342
+ },
343
+ mixed: {
344
+ RouteTables: mockRouteTables
345
+ }
346
+ }
347
+ },
348
+
349
+ kms: {
350
+ listKeys: {
351
+ withKeys: {
352
+ Keys: mockKmsKeys
353
+ },
354
+ empty: {
355
+ Keys: []
356
+ }
357
+ },
358
+
359
+ describeKey: {
360
+ customer: {
361
+ KeyMetadata: mockKmsKeyMetadata
362
+ },
363
+ aws: {
364
+ KeyMetadata: {
365
+ ...mockKmsKeyMetadata,
366
+ KeyManager: 'AWS'
367
+ }
368
+ }
369
+ }
370
+ },
371
+
372
+ sts: {
373
+ getCallerIdentity: mockStsCallerIdentity
374
+ }
375
+ };
376
+
377
+ module.exports = {
378
+ mockVpc,
379
+ mockSubnets,
380
+ mockSecurityGroups,
381
+ mockRouteTables,
382
+ mockKmsKeys,
383
+ mockKmsKeyMetadata,
384
+ mockStsCallerIdentity,
385
+ mockDiscoveredResources,
386
+ mockAppDefinitions,
387
+ mockServerlessServices,
388
+ mockEnvironmentVariables,
389
+ mockFallbackEnvironmentVariables,
390
+ mockAwsSdkResponses
391
+ };