@friggframework/devtools 2.0.0--canary.398.7664c46.0 → 2.0.0--canary.400.bed3308.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) 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 +15 -2
  11. package/frigg-cli/deploy-command/index.js +15 -2
  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 +350 -0
  16. package/frigg-cli/generate-command/terraform-generator.js +555 -0
  17. package/frigg-cli/index.js +66 -4
  18. package/frigg-cli/install-command/index.js +15 -2
  19. package/frigg-cli/package.json +75 -0
  20. package/frigg-cli/start-command/index.js +17 -2
  21. package/frigg-cli/ui-command/index.js +167 -0
  22. package/frigg-cli/utils/app-resolver.js +319 -0
  23. package/frigg-cli/utils/backend-path.js +38 -0
  24. package/frigg-cli/utils/process-manager.js +199 -0
  25. package/frigg-cli/utils/repo-detection.js +405 -0
  26. package/infrastructure/AWS-IAM-CREDENTIAL-NEEDS.md +43 -19
  27. package/infrastructure/IAM-POLICY-TEMPLATES.md +1 -1
  28. package/infrastructure/frigg-deployment-iam-stack.yaml +16 -2
  29. package/infrastructure/iam-generator.js +129 -6
  30. package/infrastructure/iam-policy-basic.json +29 -5
  31. package/infrastructure/iam-policy-full.json +28 -5
  32. package/infrastructure/serverless-template.js +209 -3
  33. package/infrastructure/serverless-template.test.js +12 -0
  34. package/management-ui/.eslintrc.js +22 -0
  35. package/management-ui/README.md +203 -0
  36. package/management-ui/components.json +21 -0
  37. package/management-ui/{dist/index.html → index.html} +1 -2
  38. package/management-ui/merge-conflict-cleaner.py +371 -0
  39. package/management-ui/package-lock.json +10997 -0
  40. package/management-ui/package.json +76 -0
  41. package/management-ui/postcss.config.js +6 -0
  42. package/management-ui/server/api/backend.js +256 -0
  43. package/management-ui/server/api/cli.js +315 -0
  44. package/management-ui/server/api/codegen.js +663 -0
  45. package/management-ui/server/api/connections.js +857 -0
  46. package/management-ui/server/api/discovery.js +185 -0
  47. package/management-ui/server/api/environment/index.js +1 -0
  48. package/management-ui/server/api/environment/router.js +378 -0
  49. package/management-ui/server/api/environment.js +328 -0
  50. package/management-ui/server/api/integrations.js +479 -0
  51. package/management-ui/server/api/logs.js +248 -0
  52. package/management-ui/server/api/monitoring.js +282 -0
  53. package/management-ui/server/api/open-ide.js +31 -0
  54. package/management-ui/server/api/project.js +553 -0
  55. package/management-ui/server/api/users/sessions.js +371 -0
  56. package/management-ui/server/api/users/simulation.js +254 -0
  57. package/management-ui/server/api/users.js +362 -0
  58. package/management-ui/server/api-contract.md +275 -0
  59. package/management-ui/server/index.js +428 -0
  60. package/management-ui/server/middleware/errorHandler.js +70 -0
  61. package/management-ui/server/middleware/security.js +32 -0
  62. package/management-ui/server/processManager.js +296 -0
  63. package/management-ui/server/server.js +188 -0
  64. package/management-ui/server/services/aws-monitor.js +413 -0
  65. package/management-ui/server/services/npm-registry.js +347 -0
  66. package/management-ui/server/services/template-engine.js +538 -0
  67. package/management-ui/server/utils/cliIntegration.js +220 -0
  68. package/management-ui/server/utils/environment/auditLogger.js +471 -0
  69. package/management-ui/server/utils/environment/awsParameterStore.js +264 -0
  70. package/management-ui/server/utils/environment/encryption.js +278 -0
  71. package/management-ui/server/utils/environment/envFileManager.js +286 -0
  72. package/management-ui/server/utils/import-commonjs.js +28 -0
  73. package/management-ui/server/utils/response.js +83 -0
  74. package/management-ui/server/websocket/handler.js +325 -0
  75. package/management-ui/src/App.jsx +51 -0
  76. package/management-ui/src/components/AppRouter.jsx +65 -0
  77. package/management-ui/src/components/Button.jsx +2 -0
  78. package/management-ui/src/components/Card.jsx +9 -0
  79. package/management-ui/src/components/EnvironmentCompare.jsx +400 -0
  80. package/management-ui/src/components/EnvironmentEditor.jsx +372 -0
  81. package/management-ui/src/components/EnvironmentImportExport.jsx +469 -0
  82. package/management-ui/src/components/EnvironmentSchema.jsx +491 -0
  83. package/management-ui/src/components/EnvironmentSecurity.jsx +463 -0
  84. package/management-ui/src/components/ErrorBoundary.jsx +73 -0
  85. package/management-ui/src/components/IntegrationCard.jsx +199 -0
  86. package/management-ui/src/components/IntegrationCardEnhanced.jsx +490 -0
  87. package/management-ui/src/components/IntegrationExplorer.jsx +379 -0
  88. package/management-ui/src/components/IntegrationStatus.jsx +235 -0
  89. package/management-ui/src/components/Layout.jsx +250 -0
  90. package/management-ui/src/components/LoadingSpinner.jsx +45 -0
  91. package/management-ui/src/components/RepositoryPicker.jsx +248 -0
  92. package/management-ui/src/components/SessionMonitor.jsx +255 -0
  93. package/management-ui/src/components/StatusBadge.jsx +70 -0
  94. package/management-ui/src/components/UserContextSwitcher.jsx +154 -0
  95. package/management-ui/src/components/UserSimulation.jsx +299 -0
  96. package/management-ui/src/components/Welcome.jsx +434 -0
  97. package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +637 -0
  98. package/management-ui/src/components/codegen/APIModuleSelector.jsx +227 -0
  99. package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +247 -0
  100. package/management-ui/src/components/codegen/CodePreviewEditor.jsx +316 -0
  101. package/management-ui/src/components/codegen/DynamicModuleForm.jsx +271 -0
  102. package/management-ui/src/components/codegen/FormBuilder.jsx +737 -0
  103. package/management-ui/src/components/codegen/IntegrationGenerator.jsx +855 -0
  104. package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +797 -0
  105. package/management-ui/src/components/codegen/SchemaBuilder.jsx +303 -0
  106. package/management-ui/src/components/codegen/TemplateSelector.jsx +586 -0
  107. package/management-ui/src/components/codegen/index.js +10 -0
  108. package/management-ui/src/components/connections/ConnectionConfigForm.jsx +362 -0
  109. package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +182 -0
  110. package/management-ui/src/components/connections/ConnectionTester.jsx +200 -0
  111. package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +292 -0
  112. package/management-ui/src/components/connections/OAuthFlow.jsx +204 -0
  113. package/management-ui/src/components/connections/index.js +5 -0
  114. package/management-ui/src/components/index.js +21 -0
  115. package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +222 -0
  116. package/management-ui/src/components/monitoring/LambdaMetrics.jsx +169 -0
  117. package/management-ui/src/components/monitoring/MetricsChart.jsx +197 -0
  118. package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +393 -0
  119. package/management-ui/src/components/monitoring/SQSMetrics.jsx +246 -0
  120. package/management-ui/src/components/monitoring/index.js +6 -0
  121. package/management-ui/src/components/monitoring/monitoring.css +218 -0
  122. package/management-ui/src/components/theme-provider.jsx +52 -0
  123. package/management-ui/src/components/theme-toggle.jsx +39 -0
  124. package/management-ui/src/components/ui/badge.tsx +36 -0
  125. package/management-ui/src/components/ui/button.test.jsx +56 -0
  126. package/management-ui/src/components/ui/button.tsx +57 -0
  127. package/management-ui/src/components/ui/card.tsx +76 -0
  128. package/management-ui/src/components/ui/dropdown-menu.tsx +199 -0
  129. package/management-ui/src/components/ui/select.tsx +157 -0
  130. package/management-ui/src/components/ui/skeleton.jsx +15 -0
  131. package/management-ui/src/hooks/useFrigg.jsx +387 -0
  132. package/management-ui/src/hooks/useSocket.jsx +58 -0
  133. package/management-ui/src/index.css +194 -0
  134. package/management-ui/src/lib/utils.ts +6 -0
  135. package/management-ui/src/main.jsx +10 -0
  136. package/management-ui/src/pages/CodeGeneration.jsx +14 -0
  137. package/management-ui/src/pages/Connections.jsx +252 -0
  138. package/management-ui/src/pages/ConnectionsEnhanced.jsx +427 -0
  139. package/management-ui/src/pages/Dashboard.jsx +311 -0
  140. package/management-ui/src/pages/Environment.jsx +314 -0
  141. package/management-ui/src/pages/IntegrationConfigure.jsx +544 -0
  142. package/management-ui/src/pages/IntegrationDiscovery.jsx +479 -0
  143. package/management-ui/src/pages/IntegrationTest.jsx +494 -0
  144. package/management-ui/src/pages/Integrations.jsx +254 -0
  145. package/management-ui/src/pages/Monitoring.jsx +17 -0
  146. package/management-ui/src/pages/Simulation.jsx +155 -0
  147. package/management-ui/src/pages/Users.jsx +492 -0
  148. package/management-ui/src/services/api.js +41 -0
  149. package/management-ui/src/services/apiModuleService.js +193 -0
  150. package/management-ui/src/services/websocket-handlers.js +120 -0
  151. package/management-ui/src/test/api/project.test.js +273 -0
  152. package/management-ui/src/test/components/Welcome.test.jsx +378 -0
  153. package/management-ui/src/test/mocks/server.js +178 -0
  154. package/management-ui/src/test/setup.js +61 -0
  155. package/management-ui/src/test/utils/test-utils.jsx +134 -0
  156. package/management-ui/src/utils/repository.js +98 -0
  157. package/management-ui/src/utils/repository.test.js +118 -0
  158. package/management-ui/src/workflows/phase2-integration-workflows.js +884 -0
  159. package/management-ui/tailwind.config.js +63 -0
  160. package/management-ui/tsconfig.json +37 -0
  161. package/management-ui/tsconfig.node.json +10 -0
  162. package/management-ui/vite.config.js +26 -0
  163. package/management-ui/vitest.config.js +38 -0
  164. package/package.json +5 -5
  165. package/management-ui/dist/assets/index-CbM64Oba.js +0 -1221
  166. package/management-ui/dist/assets/index-CkvseXTC.css +0 -1
  167. /package/management-ui/{dist/assets/FriggLogo-B7Xx8ZW1.svg → src/assets/FriggLogo.svg} +0 -0
@@ -4,10 +4,14 @@ This document outlines the minimum AWS IAM permissions required to build and dep
4
4
 
5
5
  ## Overview
6
6
 
7
- Frigg applications require two distinct sets of permissions:
7
+ Frigg provides two IAM policy templates:
8
8
 
9
- 1. **Discovery-Time Permissions** - Used during the build process to discover default AWS resources
10
- 2. **Deployment-Time Permissions** - Used during actual deployment to create CloudFormation resources
9
+ 1. **Basic Policy** (`iam-policy-basic.json`) - Core Lambda/API Gateway functionality only (no VPC/KMS/SSM)
10
+ 2. **Full Policy** (`iam-policy-full.json`) - Includes VPC, KMS, and SSM support for advanced deployments
11
+
12
+ Choose the policy that matches your deployment needs:
13
+ - Use **Basic** for simple serverless functions with public internet access
14
+ - Use **Full** for VPC-enabled functions with encryption and parameter store support
11
15
 
12
16
  The AWS discovery process runs during the `before:package:initialize` serverless hook to automatically find your default VPC, subnets, security groups, and KMS keys, eliminating the need for manual resource ID lookup.
13
17
 
@@ -86,16 +90,29 @@ Required for basic Frigg application deployment:
86
90
  "Effect": "Allow",
87
91
  "Action": [
88
92
  "s3:CreateBucket",
93
+ "s3:DeleteBucket",
89
94
  "s3:PutObject",
90
95
  "s3:GetObject",
91
96
  "s3:DeleteObject",
92
97
  "s3:PutBucketPolicy",
98
+ "s3:GetBucketPolicy",
99
+ "s3:DeleteBucketPolicy",
93
100
  "s3:PutBucketVersioning",
101
+ "s3:GetBucketVersioning",
94
102
  "s3:PutBucketPublicAccessBlock",
103
+ "s3:GetBucketPublicAccessBlock",
104
+ "s3:PutBucketTagging",
105
+ "s3:GetBucketTagging",
106
+ "s3:DeleteBucketTagging",
107
+ "s3:PutBucketEncryption",
108
+ "s3:GetBucketEncryption",
109
+ "s3:PutEncryptionConfiguration",
110
+ "s3:PutBucketNotification",
111
+ "s3:GetBucketNotification",
95
112
  "s3:GetBucketLocation",
96
113
  "s3:ListBucket",
97
- "s3:PutBucketTagging",
98
- "s3:GetBucketTagging"
114
+ "s3:GetBucketAcl",
115
+ "s3:PutBucketAcl"
99
116
  ],
100
117
  "Resource": [
101
118
  "arn:aws:s3:::*serverless*",
@@ -264,6 +281,7 @@ Required for basic Frigg application deployment:
264
281
  - Managing event-driven architectures
265
282
  - Handling queue-based processing (e.g., HubSpot integration queues)
266
283
  - Cleaning up event source mappings during stack deletion
284
+ - Tagging event source mappings for resource management and cost allocation
267
285
 
268
286
  ## Feature-Specific Permissions
269
287
 
@@ -276,7 +294,7 @@ Additional permissions needed when your app definition includes `vpc: { enable:
276
294
  "Version": "2012-10-17",
277
295
  "Statement": [
278
296
  {
279
- "Sid": "FriggVPCEndpointManagement",
297
+ "Sid": "FriggVPCDeploymentPermissions",
280
298
  "Effect": "Allow",
281
299
  "Action": [
282
300
  "ec2:CreateVpcEndpoint",
@@ -289,6 +307,8 @@ Additional permissions needed when your app definition includes `vpc: { enable:
289
307
  "ec2:AllocateAddress",
290
308
  "ec2:ReleaseAddress",
291
309
  "ec2:DescribeAddresses",
310
+ "ec2:AssociateAddress",
311
+ "ec2:DisassociateAddress",
292
312
  "ec2:CreateRouteTable",
293
313
  "ec2:DeleteRouteTable",
294
314
  "ec2:DescribeRouteTables",
@@ -301,25 +321,23 @@ Additional permissions needed when your app definition includes `vpc: { enable:
301
321
  "ec2:AuthorizeSecurityGroupEgress",
302
322
  "ec2:AuthorizeSecurityGroupIngress",
303
323
  "ec2:RevokeSecurityGroupEgress",
304
- "ec2:RevokeSecurityGroupIngress"
324
+ "ec2:RevokeSecurityGroupIngress",
325
+ "ec2:CreateTags",
326
+ "ec2:DeleteTags",
327
+ "ec2:DescribeTags"
305
328
  ],
306
- "Resource": "*",
307
- "Condition": {
308
- "StringLike": {
309
- "ec2:CreateAction": [
310
- "CreateVpcEndpoint",
311
- "CreateNatGateway",
312
- "CreateRouteTable",
313
- "CreateRoute",
314
- "CreateSecurityGroup"
315
- ]
316
- }
317
- }
329
+ "Resource": "*"
318
330
  }
319
331
  ]
320
332
  }
321
333
  ```
322
334
 
335
+ **⚠️ Critical Note:** The `ec2:CreateTags`, `ec2:DeleteTags`, and `ec2:DescribeTags` permissions are **REQUIRED** for VPC deployments. Without these permissions, CloudFormation will fail with errors like:
336
+
337
+ ```
338
+ "User is not authorized to perform: ec2:CreateTags on resource: arn:aws:ec2:*:*:elastic-ip/*"
339
+ ```
340
+
323
341
  **What this enables:**
324
342
  - Creates NAT Gateway for Lambda internet access to external APIs (Salesforce, HubSpot, etc.)
325
343
  - Creates VPC endpoints for AWS services (S3, DynamoDB, KMS, SSM) to reduce NAT Gateway costs
@@ -553,6 +571,12 @@ The discovery process sets these environment variables during build:
553
571
  7. **CloudFormation ListStackResources Error** - If you see "User is not authorized to perform: cloudformation:ListStackResources", update your IAM stack with the latest template that includes this permission
554
572
  8. **Elastic IP Already Associated Error** - If you see "Elastic IP address is already associated", the discovery process will now find and reuse existing NAT Gateways and EIPs to prevent conflicts
555
573
  9. **Lambda EventSourceMapping Error** - If you see "User is not authorized to perform: lambda:DeleteEventSourceMapping", update your IAM stack with the latest template that includes EventSourceMapping permissions
574
+ 10. **EC2 CreateTags Error** - If you see "User is not authorized to perform: ec2:CreateTags on resource: arn:aws:ec2:*:*:elastic-ip/*", you need the VPC deployment permissions that include `ec2:CreateTags`, `ec2:DeleteTags`, and `ec2:DescribeTags`. Use the **full policy** template or add the VPC permissions section to your existing policy.
575
+ 11. **CloudWatch Logs TagResource Error** - If you see "User is not authorized to perform CreateLogGroup with Tags. An additional permission 'logs:TagResource' is required", ensure your IAM policy includes `logs:TagResource` and `logs:UntagResource` permissions. This is now included in both basic and full policy templates.
576
+ 12. **Lambda PutFunctionConcurrency Error** - If you see "User is not authorized to perform: lambda:PutFunctionConcurrency", ensure your IAM policy includes the `lambda:PutFunctionConcurrency` permission. This is required when Lambda functions specify concurrency settings.
577
+ 13. **EC2 DeleteVpcEndpoints Error** - If you see "User is not authorized to perform: ec2:DeleteVpcEndpoints", ensure your VPC policy includes both `ec2:DeleteVpcEndpoint` (singular) and `ec2:DeleteVpcEndpoints` (plural) permissions. AWS uses different permissions for single vs bulk operations.
578
+ 14. **Lambda CreateEventSourceMapping Error** - If you see "User is not authorized to perform: lambda:CreateEventSourceMapping", this permission should already be included in both basic and full policy templates under the "FriggLambdaEventSourceMapping" section with the correct resource ARN `arn:aws:lambda:*:*:event-source-mapping:*`.
579
+ 15. **Lambda TagResource Error on EventSourceMapping** - If you see "User is not authorized to perform: lambda:TagResource on resource: arn:aws:lambda:*:*:event-source-mapping:*", ensure your IAM policy includes `lambda:TagResource`, `lambda:UntagResource`, and `lambda:ListTags` permissions in the FriggLambdaEventSourceMapping section. These permissions are required when CloudFormation tags event source mappings during creation.
556
580
 
557
581
  ### Fallback Behavior
558
582
 
@@ -137,7 +137,7 @@ Consider separate policies for different environments:
137
137
  4. **Lambda VPC errors** → Ensure VPC permissions are enabled
138
138
  5. **"lambda:DeleteEventSourceMapping" error** → Update to latest policy (includes EventSourceMapping permissions)
139
139
  6. **"ec2:DeleteVpcEndpoints" error** → Update IAM policy to use `ec2:DeleteVpcEndpoints` (plural) instead of `ec2:DeleteVpcEndpoint`
140
- 7. **"s3:PutBucketTagging" error** → Update to latest policy (includes S3 bucket tagging permissions)
140
+ 7. **S3 permission errors** (e.g., "s3:PutBucketTagging", "s3:DeleteBucket", "s3:GetBucketPolicy", "s3:PutBucketEncryption") → Update to latest policy (includes comprehensive S3 bucket management permissions)
141
141
 
142
142
  ### Validation
143
143
  Test your policy by deploying a simple Frigg app:
@@ -111,16 +111,29 @@ Resources:
111
111
  Effect: Allow
112
112
  Action:
113
113
  - 's3:CreateBucket'
114
+ - 's3:DeleteBucket'
114
115
  - 's3:PutObject'
115
116
  - 's3:GetObject'
116
117
  - 's3:DeleteObject'
117
118
  - 's3:PutBucketPolicy'
119
+ - 's3:GetBucketPolicy'
120
+ - 's3:DeleteBucketPolicy'
118
121
  - 's3:PutBucketVersioning'
122
+ - 's3:GetBucketVersioning'
119
123
  - 's3:PutBucketPublicAccessBlock'
120
- - 's3:GetBucketLocation'
121
- - 's3:ListBucket'
124
+ - 's3:GetBucketPublicAccessBlock'
122
125
  - 's3:PutBucketTagging'
123
126
  - 's3:GetBucketTagging'
127
+ - 's3:DeleteBucketTagging'
128
+ - 's3:PutBucketEncryption'
129
+ - 's3:GetBucketEncryption'
130
+ - 's3:PutEncryptionConfiguration'
131
+ - 's3:PutBucketNotification'
132
+ - 's3:GetBucketNotification'
133
+ - 's3:GetBucketLocation'
134
+ - 's3:ListBucket'
135
+ - 's3:GetBucketAcl'
136
+ - 's3:PutBucketAcl'
124
137
  Resource:
125
138
  - 'arn:aws:s3:::*serverless*'
126
139
  - 'arn:aws:s3:::*serverless*/*'
@@ -257,6 +270,7 @@ Resources:
257
270
  - 'arn:aws:apigateway:*::/restapis/*'
258
271
  - 'arn:aws:apigateway:*::/domainnames'
259
272
  - 'arn:aws:apigateway:*::/domainnames/*'
273
+ - 'arn:aws:apigateway:*::/tags/*'
260
274
 
261
275
  # VPC-specific permissions
262
276
  FriggVPCPolicy:
@@ -46,7 +46,10 @@ function generateIAMCloudFormation(appDefinition, options = {}) {
46
46
  const template = {
47
47
  AWSTemplateFormatVersion: '2010-09-09',
48
48
  Description: `IAM roles and policies for ${appDefinition.name || 'Frigg'} application deployment pipeline`,
49
+ <<<<<<< HEAD
50
+ =======
49
51
 
52
+ >>>>>>> 37c4892ee8a686eb7acfcd17c333b0ed73e1f120
50
53
  Parameters: {
51
54
  DeploymentUserName: {
52
55
  Type: 'String',
@@ -166,7 +169,10 @@ function generateIAMCloudFormation(appDefinition, options = {}) {
166
169
  'cloudformation:DeleteChangeSet',
167
170
  'cloudformation:ExecuteChangeSet',
168
171
  'cloudformation:ValidateTemplate',
172
+ <<<<<<< HEAD
173
+ =======
169
174
 
175
+ >>>>>>> 37c4892ee8a686eb7acfcd17c333b0ed73e1f120
170
176
  // Lambda permissions
171
177
  'lambda:CreateFunction',
172
178
  'lambda:UpdateFunctionCode',
@@ -189,7 +195,10 @@ function generateIAMCloudFormation(appDefinition, options = {}) {
189
195
  'lambda:TagResource',
190
196
  'lambda:UntagResource',
191
197
  'lambda:ListVersionsByFunction',
198
+ <<<<<<< HEAD
199
+ =======
192
200
 
201
+ >>>>>>> 37c4892ee8a686eb7acfcd17c333b0ed73e1f120
193
202
  // IAM permissions
194
203
  'iam:CreateRole',
195
204
  'iam:DeleteRole',
@@ -203,18 +212,41 @@ function generateIAMCloudFormation(appDefinition, options = {}) {
203
212
  'iam:TagRole',
204
213
  'iam:UntagRole',
205
214
  'iam:ListPolicyVersions',
215
+ <<<<<<< HEAD
216
+
217
+ =======
206
218
 
219
+ >>>>>>> 37c4892ee8a686eb7acfcd17c333b0ed73e1f120
207
220
  // S3 permissions
208
221
  's3:CreateBucket',
222
+ 's3:DeleteBucket',
209
223
  's3:PutObject',
210
224
  's3:GetObject',
211
225
  's3:DeleteObject',
212
226
  's3:PutBucketPolicy',
227
+ 's3:GetBucketPolicy',
228
+ 's3:DeleteBucketPolicy',
213
229
  's3:PutBucketVersioning',
230
+ 's3:GetBucketVersioning',
214
231
  's3:PutBucketPublicAccessBlock',
232
+ 's3:GetBucketPublicAccessBlock',
233
+ 's3:PutBucketTagging',
234
+ 's3:GetBucketTagging',
235
+ 's3:DeleteBucketTagging',
236
+ 's3:PutBucketEncryption',
237
+ 's3:GetBucketEncryption',
238
+ 's3:PutEncryptionConfiguration',
239
+ 's3:PutBucketNotification',
240
+ 's3:GetBucketNotification',
215
241
  's3:GetBucketLocation',
216
242
  's3:ListBucket',
243
+ 's3:GetBucketAcl',
244
+ 's3:PutBucketAcl',
245
+ <<<<<<< HEAD
246
+
247
+ =======
217
248
 
249
+ >>>>>>> 37c4892ee8a686eb7acfcd17c333b0ed73e1f120
218
250
  // SQS permissions
219
251
  'sqs:CreateQueue',
220
252
  'sqs:DeleteQueue',
@@ -223,7 +255,10 @@ function generateIAMCloudFormation(appDefinition, options = {}) {
223
255
  'sqs:GetQueueUrl',
224
256
  'sqs:TagQueue',
225
257
  'sqs:UntagQueue',
258
+ <<<<<<< HEAD
259
+ =======
226
260
 
261
+ >>>>>>> 37c4892ee8a686eb7acfcd17c333b0ed73e1f120
227
262
  // SNS permissions
228
263
  'sns:CreateTopic',
229
264
  'sns:DeleteTopic',
@@ -234,7 +269,10 @@ function generateIAMCloudFormation(appDefinition, options = {}) {
234
269
  'sns:ListSubscriptionsByTopic',
235
270
  'sns:TagResource',
236
271
  'sns:UntagResource',
272
+ <<<<<<< HEAD
273
+ =======
237
274
 
275
+ >>>>>>> 37c4892ee8a686eb7acfcd17c333b0ed73e1f120
238
276
  // CloudWatch and Logs permissions
239
277
  'cloudwatch:PutMetricAlarm',
240
278
  'cloudwatch:DeleteAlarms',
@@ -247,7 +285,10 @@ function generateIAMCloudFormation(appDefinition, options = {}) {
247
285
  'logs:FilterLogEvents',
248
286
  'logs:PutLogEvents',
249
287
  'logs:PutRetentionPolicy',
288
+ <<<<<<< HEAD
289
+ =======
250
290
 
291
+ >>>>>>> 37c4892ee8a686eb7acfcd17c333b0ed73e1f120
251
292
  // API Gateway permissions
252
293
  'apigateway:POST',
253
294
  'apigateway:PUT',
@@ -273,7 +314,10 @@ function generateIAMCloudFormation(appDefinition, options = {}) {
273
314
  'cloudformation:DescribeChangeSet',
274
315
  'cloudformation:CreateChangeSet',
275
316
  'cloudformation:DeleteChangeSet',
276
- 'cloudformation:ExecuteChangeSet'
317
+ 'cloudformation:ExecuteChangeSet',
318
+ 'cloudformation:TagResource',
319
+ 'cloudformation:UntagResource',
320
+ 'cloudformation:ListStackResources'
277
321
  ],
278
322
  Resource: [
279
323
  { 'Fn::Sub': 'arn:aws:cloudformation:*:${AWS::AccountId}:stack/*frigg*/*' }
@@ -290,14 +334,29 @@ function generateIAMCloudFormation(appDefinition, options = {}) {
290
334
  Effect: 'Allow',
291
335
  Action: [
292
336
  's3:CreateBucket',
337
+ 's3:DeleteBucket',
293
338
  's3:PutObject',
294
339
  's3:GetObject',
295
340
  's3:DeleteObject',
296
341
  's3:PutBucketPolicy',
342
+ 's3:GetBucketPolicy',
343
+ 's3:DeleteBucketPolicy',
297
344
  's3:PutBucketVersioning',
345
+ 's3:GetBucketVersioning',
298
346
  's3:PutBucketPublicAccessBlock',
347
+ 's3:GetBucketPublicAccessBlock',
348
+ 's3:PutBucketTagging',
349
+ 's3:GetBucketTagging',
350
+ 's3:DeleteBucketTagging',
351
+ 's3:PutBucketEncryption',
352
+ 's3:GetBucketEncryption',
353
+ 's3:PutEncryptionConfiguration',
354
+ 's3:PutBucketNotification',
355
+ 's3:GetBucketNotification',
299
356
  's3:GetBucketLocation',
300
- 's3:ListBucket'
357
+ 's3:ListBucket',
358
+ 's3:GetBucketAcl',
359
+ 's3:PutBucketAcl'
301
360
  ],
302
361
  Resource: [
303
362
  'arn:aws:s3:::*serverless*',
@@ -325,6 +384,7 @@ function generateIAMCloudFormation(appDefinition, options = {}) {
325
384
  'lambda:PutProvisionedConcurrencyConfig',
326
385
  'lambda:DeleteProvisionedConcurrencyConfig',
327
386
  'lambda:PutConcurrency',
387
+ 'lambda:PutFunctionConcurrency',
328
388
  'lambda:DeleteConcurrency',
329
389
  'lambda:TagResource',
330
390
  'lambda:UntagResource',
@@ -334,6 +394,23 @@ function generateIAMCloudFormation(appDefinition, options = {}) {
334
394
  { 'Fn::Sub': 'arn:aws:lambda:*:${AWS::AccountId}:function:*frigg*' }
335
395
  ]
336
396
  },
397
+ {
398
+ Sid: 'FriggLambdaEventSourceMapping',
399
+ Effect: 'Allow',
400
+ Action: [
401
+ 'lambda:CreateEventSourceMapping',
402
+ 'lambda:DeleteEventSourceMapping',
403
+ 'lambda:GetEventSourceMapping',
404
+ 'lambda:UpdateEventSourceMapping',
405
+ 'lambda:ListEventSourceMappings',
406
+ 'lambda:TagResource',
407
+ 'lambda:UntagResource',
408
+ 'lambda:ListTags'
409
+ ],
410
+ Resource: [
411
+ { 'Fn::Sub': 'arn:aws:lambda:*:${AWS::AccountId}:event-source-mapping:*' }
412
+ ]
413
+ },
337
414
  {
338
415
  Sid: 'IAMRolesForFriggLambda',
339
416
  Effect: 'Allow',
@@ -410,7 +487,9 @@ function generateIAMCloudFormation(appDefinition, options = {}) {
410
487
  'logs:DescribeLogStreams',
411
488
  'logs:FilterLogEvents',
412
489
  'logs:PutLogEvents',
413
- 'logs:PutRetentionPolicy'
490
+ 'logs:PutRetentionPolicy',
491
+ 'logs:TagResource',
492
+ 'logs:UntagResource'
414
493
  ],
415
494
  Resource: [
416
495
  { 'Fn::Sub': 'arn:aws:logs:*:${AWS::AccountId}:log-group:/aws/lambda/*frigg*' },
@@ -432,7 +511,8 @@ function generateIAMCloudFormation(appDefinition, options = {}) {
432
511
  'arn:aws:apigateway:*::/restapis',
433
512
  'arn:aws:apigateway:*::/restapis/*',
434
513
  'arn:aws:apigateway:*::/domainnames',
435
- 'arn:aws:apigateway:*::/domainnames/*'
514
+ 'arn:aws:apigateway:*::/domainnames/*',
515
+ 'arn:aws:apigateway:*::/tags/*'
436
516
  ]
437
517
  }
438
518
  ];
@@ -466,6 +546,7 @@ function generateIAMCloudFormation(appDefinition, options = {}) {
466
546
  Action: [
467
547
  'ec2:CreateVpcEndpoint',
468
548
  'ec2:DeleteVpcEndpoint',
549
+ 'ec2:DeleteVpcEndpoints',
469
550
  'ec2:DescribeVpcEndpoints',
470
551
  'ec2:ModifyVpcEndpoint',
471
552
  'ec2:CreateNatGateway',
@@ -474,6 +555,8 @@ function generateIAMCloudFormation(appDefinition, options = {}) {
474
555
  'ec2:AllocateAddress',
475
556
  'ec2:ReleaseAddress',
476
557
  'ec2:DescribeAddresses',
558
+ 'ec2:AssociateAddress',
559
+ 'ec2:DisassociateAddress',
477
560
  'ec2:CreateRouteTable',
478
561
  'ec2:DeleteRouteTable',
479
562
  'ec2:DescribeRouteTables',
@@ -486,7 +569,10 @@ function generateIAMCloudFormation(appDefinition, options = {}) {
486
569
  'ec2:AuthorizeSecurityGroupEgress',
487
570
  'ec2:AuthorizeSecurityGroupIngress',
488
571
  'ec2:RevokeSecurityGroupEgress',
489
- 'ec2:RevokeSecurityGroupIngress'
572
+ 'ec2:RevokeSecurityGroupIngress',
573
+ 'ec2:CreateTags',
574
+ 'ec2:DeleteTags',
575
+ 'ec2:DescribeTags'
490
576
  ],
491
577
  Resource: '*'
492
578
  }
@@ -678,10 +764,47 @@ function generateIAMPolicy(mode = 'basic') {
678
764
  return generateBasicIAMPolicy();
679
765
  }
680
766
 
767
+ /**
768
+ * Wrapper function for generate command compatibility
769
+ * @param {Object} options - Generation options
770
+ * @param {string} options.appName - Application name
771
+ * @param {Object} options.features - Feature flags
772
+ * @param {string} options.userPrefix - IAM user name prefix
773
+ * @param {string} options.stackName - CloudFormation stack name
774
+ * @returns {Promise<string>} CloudFormation YAML template
775
+ */
776
+ async function generateCloudFormationTemplate(options) {
777
+ const { appName, features, userPrefix, stackName } = options;
778
+ <<<<<<< HEAD
779
+
780
+ =======
781
+
782
+ >>>>>>> 37c4892ee8a686eb7acfcd17c333b0ed73e1f120
783
+ // Create appDefinition from features
784
+ const appDefinition = {
785
+ name: appName,
786
+ vpc: { enable: features.vpc },
787
+ encryption: { useDefaultKMSForFieldLevelEncryption: features.kms },
788
+ ssm: { enable: features.ssm },
789
+ websockets: { enable: features.websockets }
790
+ };
791
+ <<<<<<< HEAD
792
+
793
+ =======
794
+
795
+ >>>>>>> 37c4892ee8a686eb7acfcd17c333b0ed73e1f120
796
+ return generateIAMCloudFormation(appDefinition, {
797
+ deploymentUserName: userPrefix,
798
+ stackName: stackName,
799
+ mode: 'auto'
800
+ });
801
+ }
802
+
681
803
  module.exports = {
682
804
  generateIAMCloudFormation,
683
805
  getFeatureSummary,
684
806
  generateBasicIAMPolicy,
685
807
  generateFullIAMPolicy,
686
- generateIAMPolicy
808
+ generateIAMPolicy,
809
+ generateCloudFormationTemplate
687
810
  };
@@ -43,16 +43,29 @@
43
43
  "Effect": "Allow",
44
44
  "Action": [
45
45
  "s3:CreateBucket",
46
+ "s3:DeleteBucket",
46
47
  "s3:PutObject",
47
48
  "s3:GetObject",
48
49
  "s3:DeleteObject",
49
50
  "s3:PutBucketPolicy",
51
+ "s3:GetBucketPolicy",
52
+ "s3:DeleteBucketPolicy",
50
53
  "s3:PutBucketVersioning",
54
+ "s3:GetBucketVersioning",
51
55
  "s3:PutBucketPublicAccessBlock",
56
+ "s3:GetBucketPublicAccessBlock",
57
+ "s3:PutBucketTagging",
58
+ "s3:GetBucketTagging",
59
+ "s3:DeleteBucketTagging",
60
+ "s3:PutBucketEncryption",
61
+ "s3:GetBucketEncryption",
62
+ "s3:PutEncryptionConfiguration",
63
+ "s3:PutBucketNotification",
64
+ "s3:GetBucketNotification",
52
65
  "s3:GetBucketLocation",
53
66
  "s3:ListBucket",
54
- "s3:PutBucketTagging",
55
- "s3:GetBucketTagging"
67
+ "s3:GetBucketAcl",
68
+ "s3:PutBucketAcl"
56
69
  ],
57
70
  "Resource": [
58
71
  "arn:aws:s3:::*serverless*",
@@ -80,6 +93,7 @@
80
93
  "lambda:PutProvisionedConcurrencyConfig",
81
94
  "lambda:DeleteProvisionedConcurrencyConfig",
82
95
  "lambda:PutConcurrency",
96
+ "lambda:PutFunctionConcurrency",
83
97
  "lambda:DeleteConcurrency",
84
98
  "lambda:TagResource",
85
99
  "lambda:UntagResource",
@@ -97,7 +111,10 @@
97
111
  "lambda:DeleteEventSourceMapping",
98
112
  "lambda:GetEventSourceMapping",
99
113
  "lambda:UpdateEventSourceMapping",
100
- "lambda:ListEventSourceMappings"
114
+ "lambda:ListEventSourceMappings",
115
+ "lambda:TagResource",
116
+ "lambda:UntagResource",
117
+ "lambda:ListTags"
101
118
  ],
102
119
  "Resource": [
103
120
  "arn:aws:lambda:*:*:event-source-mapping:*"
@@ -183,7 +200,9 @@
183
200
  "logs:DescribeLogStreams",
184
201
  "logs:FilterLogEvents",
185
202
  "logs:PutLogEvents",
186
- "logs:PutRetentionPolicy"
203
+ "logs:PutRetentionPolicy",
204
+ "logs:TagResource",
205
+ "logs:UntagResource"
187
206
  ],
188
207
  "Resource": [
189
208
  "arn:aws:logs:*:*:log-group:/aws/lambda/*frigg*",
@@ -205,7 +224,12 @@
205
224
  "arn:aws:apigateway:*::/restapis",
206
225
  "arn:aws:apigateway:*::/restapis/*",
207
226
  "arn:aws:apigateway:*::/domainnames",
208
- "arn:aws:apigateway:*::/domainnames/*"
227
+ <<<<<<< HEAD
228
+ "arn:aws:apigateway:*::/domainnames/*",
229
+ =======
230
+ "arn:aws:apigateway:*::/domainnames/*",
231
+ >>>>>>> 37c4892ee8a686eb7acfcd17c333b0ed73e1f120
232
+ "arn:aws:apigateway:*::/tags/*"
209
233
  ]
210
234
  }
211
235
  ]
@@ -43,16 +43,29 @@
43
43
  "Effect": "Allow",
44
44
  "Action": [
45
45
  "s3:CreateBucket",
46
+ "s3:DeleteBucket",
46
47
  "s3:PutObject",
47
48
  "s3:GetObject",
48
49
  "s3:DeleteObject",
49
50
  "s3:PutBucketPolicy",
51
+ "s3:GetBucketPolicy",
52
+ "s3:DeleteBucketPolicy",
50
53
  "s3:PutBucketVersioning",
54
+ "s3:GetBucketVersioning",
51
55
  "s3:PutBucketPublicAccessBlock",
56
+ "s3:GetBucketPublicAccessBlock",
57
+ "s3:PutBucketTagging",
58
+ "s3:GetBucketTagging",
59
+ "s3:DeleteBucketTagging",
60
+ "s3:PutBucketEncryption",
61
+ "s3:GetBucketEncryption",
62
+ "s3:PutEncryptionConfiguration",
63
+ "s3:PutBucketNotification",
64
+ "s3:GetBucketNotification",
52
65
  "s3:GetBucketLocation",
53
66
  "s3:ListBucket",
54
- "s3:PutBucketTagging",
55
- "s3:GetBucketTagging"
67
+ "s3:GetBucketAcl",
68
+ "s3:PutBucketAcl"
56
69
  ],
57
70
  "Resource": [
58
71
  "arn:aws:s3:::*serverless*",
@@ -80,6 +93,7 @@
80
93
  "lambda:PutProvisionedConcurrencyConfig",
81
94
  "lambda:DeleteProvisionedConcurrencyConfig",
82
95
  "lambda:PutConcurrency",
96
+ "lambda:PutFunctionConcurrency",
83
97
  "lambda:DeleteConcurrency",
84
98
  "lambda:TagResource",
85
99
  "lambda:UntagResource",
@@ -97,7 +111,10 @@
97
111
  "lambda:DeleteEventSourceMapping",
98
112
  "lambda:GetEventSourceMapping",
99
113
  "lambda:UpdateEventSourceMapping",
100
- "lambda:ListEventSourceMappings"
114
+ "lambda:ListEventSourceMappings",
115
+ "lambda:TagResource",
116
+ "lambda:UntagResource",
117
+ "lambda:ListTags"
101
118
  ],
102
119
  "Resource": [
103
120
  "arn:aws:lambda:*:*:event-source-mapping:*"
@@ -183,7 +200,9 @@
183
200
  "logs:DescribeLogStreams",
184
201
  "logs:FilterLogEvents",
185
202
  "logs:PutLogEvents",
186
- "logs:PutRetentionPolicy"
203
+ "logs:PutRetentionPolicy",
204
+ "logs:TagResource",
205
+ "logs:UntagResource"
187
206
  ],
188
207
  "Resource": [
189
208
  "arn:aws:logs:*:*:log-group:/aws/lambda/*frigg*",
@@ -205,7 +224,8 @@
205
224
  "arn:aws:apigateway:*::/restapis",
206
225
  "arn:aws:apigateway:*::/restapis/*",
207
226
  "arn:aws:apigateway:*::/domainnames",
208
- "arn:aws:apigateway:*::/domainnames/*"
227
+ "arn:aws:apigateway:*::/domainnames/*",
228
+ "arn:aws:apigateway:*::/tags/*"
209
229
  ]
210
230
  },
211
231
  {
@@ -214,6 +234,7 @@
214
234
  "Action": [
215
235
  "ec2:CreateVpcEndpoint",
216
236
  "ec2:DeleteVpcEndpoint",
237
+ "ec2:DeleteVpcEndpoints",
217
238
  "ec2:DescribeVpcEndpoints",
218
239
  "ec2:ModifyVpcEndpoint",
219
240
  "ec2:CreateNatGateway",
@@ -222,6 +243,8 @@
222
243
  "ec2:AllocateAddress",
223
244
  "ec2:ReleaseAddress",
224
245
  "ec2:DescribeAddresses",
246
+ "ec2:AssociateAddress",
247
+ "ec2:DisassociateAddress",
225
248
  "ec2:CreateRouteTable",
226
249
  "ec2:DeleteRouteTable",
227
250
  "ec2:DescribeRouteTables",