@friggframework/devtools 2.0.0--canary.520.6641121.0 → 2.0.0--canary.517.35ee143.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 (141) hide show
  1. package/.eslintrc.json +3 -0
  2. package/CHANGELOG.md +132 -0
  3. package/infrastructure/domains/admin-scripts/admin-script-builder.js +200 -0
  4. package/infrastructure/domains/admin-scripts/admin-script-builder.test.js +499 -0
  5. package/infrastructure/domains/admin-scripts/index.js +5 -0
  6. package/infrastructure/domains/shared/types/app-definition.js +21 -0
  7. package/infrastructure/domains/shared/utilities/base-definition-factory.js +1 -15
  8. package/infrastructure/infrastructure-composer.js +2 -0
  9. package/layers/prisma/.build-complete +3 -0
  10. package/layers/prisma/nodejs/package.json +8 -0
  11. package/management-ui/.eslintrc.js +22 -0
  12. package/management-ui/components.json +21 -0
  13. package/management-ui/docs/phase2-integration-guide.md +320 -0
  14. package/management-ui/index.html +13 -0
  15. package/management-ui/package.json +76 -0
  16. package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +302 -0
  17. package/management-ui/postcss.config.js +6 -0
  18. package/management-ui/server/api/backend.js +256 -0
  19. package/management-ui/server/api/cli.js +315 -0
  20. package/management-ui/server/api/codegen.js +663 -0
  21. package/management-ui/server/api/connections.js +857 -0
  22. package/management-ui/server/api/discovery.js +185 -0
  23. package/management-ui/server/api/environment/index.js +1 -0
  24. package/management-ui/server/api/environment/router.js +378 -0
  25. package/management-ui/server/api/environment.js +328 -0
  26. package/management-ui/server/api/integrations.js +876 -0
  27. package/management-ui/server/api/logs.js +248 -0
  28. package/management-ui/server/api/monitoring.js +282 -0
  29. package/management-ui/server/api/open-ide.js +31 -0
  30. package/management-ui/server/api/project.js +1029 -0
  31. package/management-ui/server/api/users/sessions.js +371 -0
  32. package/management-ui/server/api/users/simulation.js +254 -0
  33. package/management-ui/server/api/users.js +362 -0
  34. package/management-ui/server/api-contract.md +275 -0
  35. package/management-ui/server/index.js +873 -0
  36. package/management-ui/server/middleware/errorHandler.js +93 -0
  37. package/management-ui/server/middleware/security.js +32 -0
  38. package/management-ui/server/processManager.js +296 -0
  39. package/management-ui/server/server.js +346 -0
  40. package/management-ui/server/services/aws-monitor.js +413 -0
  41. package/management-ui/server/services/npm-registry.js +347 -0
  42. package/management-ui/server/services/template-engine.js +538 -0
  43. package/management-ui/server/utils/cliIntegration.js +220 -0
  44. package/management-ui/server/utils/environment/auditLogger.js +471 -0
  45. package/management-ui/server/utils/environment/awsParameterStore.js +275 -0
  46. package/management-ui/server/utils/environment/encryption.js +278 -0
  47. package/management-ui/server/utils/environment/envFileManager.js +286 -0
  48. package/management-ui/server/utils/import-commonjs.js +28 -0
  49. package/management-ui/server/utils/response.js +83 -0
  50. package/management-ui/server/websocket/handler.js +325 -0
  51. package/management-ui/src/App.jsx +25 -0
  52. package/management-ui/src/assets/FriggLogo.svg +1 -0
  53. package/management-ui/src/components/AppRouter.jsx +65 -0
  54. package/management-ui/src/components/Button.jsx +70 -0
  55. package/management-ui/src/components/Card.jsx +97 -0
  56. package/management-ui/src/components/EnvironmentCompare.jsx +400 -0
  57. package/management-ui/src/components/EnvironmentEditor.jsx +372 -0
  58. package/management-ui/src/components/EnvironmentImportExport.jsx +469 -0
  59. package/management-ui/src/components/EnvironmentSchema.jsx +491 -0
  60. package/management-ui/src/components/EnvironmentSecurity.jsx +463 -0
  61. package/management-ui/src/components/ErrorBoundary.jsx +73 -0
  62. package/management-ui/src/components/IntegrationCard.jsx +481 -0
  63. package/management-ui/src/components/IntegrationCardEnhanced.jsx +770 -0
  64. package/management-ui/src/components/IntegrationExplorer.jsx +379 -0
  65. package/management-ui/src/components/IntegrationStatus.jsx +336 -0
  66. package/management-ui/src/components/Layout.jsx +716 -0
  67. package/management-ui/src/components/LoadingSpinner.jsx +113 -0
  68. package/management-ui/src/components/RepositoryPicker.jsx +248 -0
  69. package/management-ui/src/components/SessionMonitor.jsx +350 -0
  70. package/management-ui/src/components/StatusBadge.jsx +208 -0
  71. package/management-ui/src/components/UserContextSwitcher.jsx +212 -0
  72. package/management-ui/src/components/UserSimulation.jsx +327 -0
  73. package/management-ui/src/components/Welcome.jsx +434 -0
  74. package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +637 -0
  75. package/management-ui/src/components/codegen/APIModuleSelector.jsx +227 -0
  76. package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +247 -0
  77. package/management-ui/src/components/codegen/CodePreviewEditor.jsx +316 -0
  78. package/management-ui/src/components/codegen/DynamicModuleForm.jsx +271 -0
  79. package/management-ui/src/components/codegen/FormBuilder.jsx +737 -0
  80. package/management-ui/src/components/codegen/IntegrationGenerator.jsx +855 -0
  81. package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +797 -0
  82. package/management-ui/src/components/codegen/SchemaBuilder.jsx +303 -0
  83. package/management-ui/src/components/codegen/TemplateSelector.jsx +586 -0
  84. package/management-ui/src/components/codegen/index.js +10 -0
  85. package/management-ui/src/components/connections/ConnectionConfigForm.jsx +362 -0
  86. package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +182 -0
  87. package/management-ui/src/components/connections/ConnectionTester.jsx +200 -0
  88. package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +292 -0
  89. package/management-ui/src/components/connections/OAuthFlow.jsx +204 -0
  90. package/management-ui/src/components/connections/index.js +5 -0
  91. package/management-ui/src/components/index.js +21 -0
  92. package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +222 -0
  93. package/management-ui/src/components/monitoring/LambdaMetrics.jsx +169 -0
  94. package/management-ui/src/components/monitoring/MetricsChart.jsx +197 -0
  95. package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +393 -0
  96. package/management-ui/src/components/monitoring/SQSMetrics.jsx +246 -0
  97. package/management-ui/src/components/monitoring/index.js +6 -0
  98. package/management-ui/src/components/monitoring/monitoring.css +218 -0
  99. package/management-ui/src/components/theme-provider.jsx +52 -0
  100. package/management-ui/src/components/theme-toggle.jsx +39 -0
  101. package/management-ui/src/components/ui/badge.tsx +36 -0
  102. package/management-ui/src/components/ui/button.test.jsx +56 -0
  103. package/management-ui/src/components/ui/button.tsx +57 -0
  104. package/management-ui/src/components/ui/card.tsx +76 -0
  105. package/management-ui/src/components/ui/dropdown-menu.tsx +199 -0
  106. package/management-ui/src/components/ui/select.tsx +157 -0
  107. package/management-ui/src/components/ui/skeleton.jsx +15 -0
  108. package/management-ui/src/hooks/useFrigg.jsx +387 -0
  109. package/management-ui/src/hooks/useSocket.jsx +58 -0
  110. package/management-ui/src/index.css +193 -0
  111. package/management-ui/src/lib/utils.ts +6 -0
  112. package/management-ui/src/main.jsx +10 -0
  113. package/management-ui/src/pages/CodeGeneration.jsx +14 -0
  114. package/management-ui/src/pages/Connections.jsx +252 -0
  115. package/management-ui/src/pages/ConnectionsEnhanced.jsx +633 -0
  116. package/management-ui/src/pages/Dashboard.jsx +311 -0
  117. package/management-ui/src/pages/Environment.jsx +314 -0
  118. package/management-ui/src/pages/IntegrationConfigure.jsx +669 -0
  119. package/management-ui/src/pages/IntegrationDiscovery.jsx +567 -0
  120. package/management-ui/src/pages/IntegrationTest.jsx +742 -0
  121. package/management-ui/src/pages/Integrations.jsx +253 -0
  122. package/management-ui/src/pages/Monitoring.jsx +17 -0
  123. package/management-ui/src/pages/Simulation.jsx +155 -0
  124. package/management-ui/src/pages/Users.jsx +492 -0
  125. package/management-ui/src/services/api.js +41 -0
  126. package/management-ui/src/services/apiModuleService.js +193 -0
  127. package/management-ui/src/services/websocket-handlers.js +120 -0
  128. package/management-ui/src/test/api/project.test.js +273 -0
  129. package/management-ui/src/test/components/Welcome.test.jsx +378 -0
  130. package/management-ui/src/test/mocks/server.js +178 -0
  131. package/management-ui/src/test/setup.js +61 -0
  132. package/management-ui/src/test/utils/test-utils.jsx +134 -0
  133. package/management-ui/src/utils/repository.js +98 -0
  134. package/management-ui/src/utils/repository.test.js +118 -0
  135. package/management-ui/src/workflows/phase2-integration-workflows.js +884 -0
  136. package/management-ui/tailwind.config.js +63 -0
  137. package/management-ui/tsconfig.json +37 -0
  138. package/management-ui/tsconfig.node.json +10 -0
  139. package/management-ui/vite.config.js +26 -0
  140. package/management-ui/vitest.config.js +38 -0
  141. package/package.json +7 -16
package/.eslintrc.json ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "@friggframework/eslint-config"
3
+ }
package/CHANGELOG.md ADDED
@@ -0,0 +1,132 @@
1
+ # v1.2.0 (Tue Aug 06 2024)
2
+
3
+ #### 🚀 Enhancement
4
+
5
+ - CLI for Frigg - Install command for now [#322](https://github.com/friggframework/frigg/pull/322) ([@seanspeaks](https://github.com/seanspeaks))
6
+
7
+ #### 🐛 Bug Fix
8
+
9
+ - Add READMEs that will need updating, but for version releasing [#324](https://github.com/friggframework/frigg/pull/324) ([@seanspeaks](https://github.com/seanspeaks))
10
+ - Add READMEs that will need updating, but for version releasing ([@seanspeaks](https://github.com/seanspeaks))
11
+ - small update to integration testing / tooling [#304](https://github.com/friggframework/frigg/pull/304) ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
12
+ - Added missing dependencies ([@seanspeaks](https://github.com/seanspeaks))
13
+ - Added a missing dependency ([@seanspeaks](https://github.com/seanspeaks))
14
+ - Updated to handle envs properly, also further refactoring, and better templating. ([@seanspeaks](https://github.com/seanspeaks))
15
+ - WIP with help from Tabnine AI chat. ([@seanspeaks](https://github.com/seanspeaks))
16
+ - Bump version to: v1.1.8 \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
17
+ - use the factory methods for creating the mock integration so that everything is set up (mostly events and userActions) ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
18
+ - Bump version to: v1.1.5 \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
19
+
20
+ #### Authors: 2
21
+
22
+ - [@MichaelRyanWebber](https://github.com/MichaelRyanWebber)
23
+ - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
24
+
25
+ ---
26
+
27
+ # v1.1.8 (Thu Jul 18 2024)
28
+
29
+ #### 🐛 Bug Fix
30
+
31
+ - Revert open to support commonjs [#319](https://github.com/friggframework/frigg/pull/319) ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
32
+ - Bump version to: v1.1.6 \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
33
+
34
+ #### Authors: 2
35
+
36
+ - [@MichaelRyanWebber](https://github.com/MichaelRyanWebber)
37
+ - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
38
+
39
+ ---
40
+
41
+ # v1.1.7 (Mon Jul 15 2024)
42
+
43
+ #### 🐛 Bug Fix
44
+
45
+ - getAuthorizationRequirements() async [#318](https://github.com/friggframework/frigg/pull/318) ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
46
+ - await getAuthorizeRequirements() ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
47
+ - Bump version to: v1.1.6 \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
48
+
49
+ #### Authors: 2
50
+
51
+ - [@MichaelRyanWebber](https://github.com/MichaelRyanWebber)
52
+ - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
53
+
54
+ ---
55
+
56
+ # v1.1.6 (Fri Apr 26 2024)
57
+
58
+ #### 🐛 Bug Fix
59
+
60
+ - Small fix to validation errors and cleanup [#307](https://github.com/friggframework/frigg/pull/307) ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
61
+ - also cleanup devtools since all versions will bump ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
62
+ - Bump version to: v1.1.5 \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
63
+
64
+ #### Authors: 2
65
+
66
+ - [@MichaelRyanWebber](https://github.com/MichaelRyanWebber)
67
+ - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
68
+
69
+ ---
70
+
71
+ # v1.1.5 (Tue Apr 09 2024)
72
+
73
+ #### 🐛 Bug Fix
74
+
75
+ - update router to include options and refresh [#301](https://github.com/friggframework/frigg/pull/301) ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
76
+ - Bump version to: v1.1.4 \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
77
+ - Bump version to: v1.1.3 \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
78
+
79
+ #### Authors: 2
80
+
81
+ - [@MichaelRyanWebber](https://github.com/MichaelRyanWebber)
82
+ - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
83
+
84
+ ---
85
+
86
+ # v2.0.0 (Sat Mar 30 2024)
87
+
88
+ #### 💥 Breaking Change
89
+
90
+ - revert HEAD to a corrected v1-connectwise release [#283](https://github.com/friggframework/frigg/pull/283) ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
91
+
92
+ #### 🚀 Enhancement
93
+
94
+ - Package redo [#294](https://github.com/friggframework/frigg/pull/294) ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
95
+
96
+ #### 🐛 Bug Fix
97
+
98
+ - delete all node_modules and regenerate lock file to potentially address known bug ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
99
+ - add back the direct dependency on eslint as this might be leading to a deploy issue ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
100
+ - create test, eslint-config and prettier-config packages as base shared dependencies ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
101
+ - slight fix to mock integration module instantiation [#290](https://github.com/friggframework/frigg/pull/290) ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
102
+ - slight fix to mock integration module instantiation ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
103
+ - Publish ([@seanspeaks](https://github.com/seanspeaks))
104
+ - Bump node and npm version for the whole repo (Fix CI) [#274](https://github.com/friggframework/frigg/pull/274) ([@seanspeaks](https://github.com/seanspeaks))
105
+ - Revert main to last release [#284](https://github.com/friggframework/frigg/pull/284) ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
106
+ - Revert "set test environment STAGE to dev" ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
107
+ - Add stage to test env [#282](https://github.com/friggframework/frigg/pull/282) ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
108
+ - set test environment STAGE to dev ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
109
+ - Bump independent versions \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
110
+
111
+ #### Authors: 2
112
+
113
+ - [@MichaelRyanWebber](https://github.com/MichaelRyanWebber)
114
+ - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
115
+
116
+ ---
117
+
118
+ # v1.1.0 (Wed Mar 20 2024)
119
+
120
+ #### 🚀 Enhancement
121
+
122
+
123
+ #### 🐛 Bug Fix
124
+
125
+ - correct some bad automated edits, though they are not in relevant files ([@MichaelRyanWebber](https://github.com/MichaelRyanWebber))
126
+
127
+ #### Authors: 4
128
+
129
+ - [@MichaelRyanWebber](https://github.com/MichaelRyanWebber)
130
+ - Nicolas Leal ([@nicolasmelo1](https://github.com/nicolasmelo1))
131
+ - nmilcoff ([@nmilcoff](https://github.com/nmilcoff))
132
+ - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Admin Script Builder
3
+ *
4
+ * Domain Layer - Hexagonal Architecture
5
+ *
6
+ * Responsible for:
7
+ * - Creating SQS queue for admin script execution
8
+ * - Creating Lambda function for script execution (worker)
9
+ * - Creating Lambda function for admin API routes (router)
10
+ * - Creating EventBridge Scheduler resources (Phase 2)
11
+ * - Creating IAM roles for scheduler to invoke Lambda
12
+ */
13
+
14
+ const { InfrastructureBuilder, ValidationResult } = require('../shared/base-builder');
15
+
16
+ class AdminScriptBuilder extends InfrastructureBuilder {
17
+ constructor() {
18
+ super();
19
+ this.name = 'AdminScriptBuilder';
20
+ }
21
+
22
+ shouldExecute(appDefinition) {
23
+ return Array.isArray(appDefinition.adminScripts) && appDefinition.adminScripts.length > 0;
24
+ }
25
+
26
+ getDependencies() {
27
+ return []; // Can run independently
28
+ }
29
+
30
+ validate(appDefinition) {
31
+ const result = new ValidationResult();
32
+
33
+ if (!appDefinition.adminScripts) {
34
+ return result; // Not an error, just no scripts
35
+ }
36
+
37
+ if (!Array.isArray(appDefinition.adminScripts)) {
38
+ result.addError('adminScripts must be an array');
39
+ return result;
40
+ }
41
+
42
+ // Validate each script
43
+ appDefinition.adminScripts.forEach((script, index) => {
44
+ if (!script?.Definition?.name) {
45
+ result.addError(`Admin script at index ${index} is missing Definition or name`);
46
+ }
47
+ });
48
+
49
+ return result;
50
+ }
51
+
52
+ async build(appDefinition, discoveredResources) {
53
+ console.log(`\n[${this.name}] Configuring admin scripts...`);
54
+ console.log(` Processing ${appDefinition.adminScripts.length} scripts...`);
55
+
56
+ const usePrismaLayer = appDefinition.usePrismaLambdaLayer !== false;
57
+ const adminConfig = appDefinition.admin || {};
58
+
59
+ const result = {
60
+ functions: {},
61
+ resources: {},
62
+ environment: {},
63
+ custom: {},
64
+ iamStatements: [],
65
+ };
66
+
67
+ // Create admin script queue
68
+ this.createAdminScriptQueue(result);
69
+
70
+ // Create Lambda function for script execution
71
+ this.createScriptExecutorFunction(result, usePrismaLayer);
72
+
73
+ // Create API routes for script management
74
+ this.createAdminScriptRoutes(result, usePrismaLayer);
75
+
76
+ // Phase 2: Create EventBridge Scheduler resources
77
+ if (adminConfig.enableScheduling) {
78
+ this.createSchedulerResources(appDefinition, result);
79
+ }
80
+
81
+ // Log registered scripts
82
+ appDefinition.adminScripts.forEach(script => {
83
+ const name = script.Definition?.name || 'unknown';
84
+ const schedule = script.Definition?.schedule;
85
+ console.log(` ✓ Registered: ${name}${schedule?.enabled ? ' (scheduled)' : ''}`);
86
+ });
87
+
88
+ console.log(`[${this.name}] ✅ Admin script configuration completed`);
89
+ return result;
90
+ }
91
+
92
+ createAdminScriptQueue(result) {
93
+ result.resources.AdminScriptQueue = {
94
+ Type: 'AWS::SQS::Queue',
95
+ Properties: {
96
+ QueueName: '${self:service}-${self:provider.stage}-AdminScriptQueue',
97
+ MessageRetentionPeriod: 86400, // 1 day
98
+ VisibilityTimeout: 900, // 15 minutes (Lambda max)
99
+ RedrivePolicy: {
100
+ maxReceiveCount: 3,
101
+ deadLetterTargetArn: {
102
+ 'Fn::GetAtt': ['InternalErrorQueue', 'Arn'],
103
+ },
104
+ },
105
+ },
106
+ };
107
+
108
+ result.environment.ADMIN_SCRIPT_QUEUE_URL = { Ref: 'AdminScriptQueue' };
109
+ console.log(' ✓ Created AdminScriptQueue');
110
+ }
111
+
112
+ createScriptExecutorFunction(result, usePrismaLayer) {
113
+ result.functions.adminScriptExecutor = {
114
+ handler: 'node_modules/@friggframework/admin-scripts/src/infrastructure/script-executor-handler.handler',
115
+ skipEsbuild: true,
116
+ ...(usePrismaLayer && { layers: [{ Ref: 'PrismaLambdaLayer' }] }),
117
+ timeout: 900, // 15 minutes max
118
+ memorySize: 1024,
119
+ events: [
120
+ {
121
+ sqs: {
122
+ arn: { 'Fn::GetAtt': ['AdminScriptQueue', 'Arn'] },
123
+ batchSize: 1,
124
+ },
125
+ },
126
+ ],
127
+ };
128
+ console.log(' ✓ Created adminScriptExecutor function');
129
+ }
130
+
131
+ createAdminScriptRoutes(result, usePrismaLayer) {
132
+ result.functions.adminScriptRouter = {
133
+ handler: 'node_modules/@friggframework/admin-scripts/src/infrastructure/admin-script-router.handler',
134
+ skipEsbuild: true,
135
+ ...(usePrismaLayer && { layers: [{ Ref: 'PrismaLambdaLayer' }] }),
136
+ timeout: 30,
137
+ events: [
138
+ // List scripts
139
+ { httpApi: { path: '/admin/scripts', method: 'GET' } },
140
+ // Get script details
141
+ { httpApi: { path: '/admin/scripts/{scriptName}', method: 'GET' } },
142
+ // Execute script (sync or async)
143
+ { httpApi: { path: '/admin/scripts/{scriptName}/execute', method: 'POST' } },
144
+ // Get execution status
145
+ { httpApi: { path: '/admin/executions/{executionId}', method: 'GET' } },
146
+ // List executions
147
+ { httpApi: { path: '/admin/executions', method: 'GET' } },
148
+ // Schedule management (Phase 2)
149
+ { httpApi: { path: '/admin/scripts/{scriptName}/schedule', method: 'GET' } },
150
+ { httpApi: { path: '/admin/scripts/{scriptName}/schedule', method: 'PUT' } },
151
+ { httpApi: { path: '/admin/scripts/{scriptName}/schedule', method: 'DELETE' } },
152
+ ],
153
+ };
154
+ console.log(' ✓ Created adminScriptRouter function');
155
+ }
156
+
157
+ createSchedulerResources(appDefinition, result) {
158
+ // Create IAM role for EventBridge Scheduler
159
+ result.resources.AdminScriptSchedulerRole = {
160
+ Type: 'AWS::IAM::Role',
161
+ Properties: {
162
+ RoleName: '${self:service}-${self:provider.stage}-admin-script-scheduler',
163
+ AssumeRolePolicyDocument: {
164
+ Version: '2012-10-17',
165
+ Statement: [{
166
+ Effect: 'Allow',
167
+ Principal: { Service: 'scheduler.amazonaws.com' },
168
+ Action: 'sts:AssumeRole',
169
+ }],
170
+ },
171
+ Policies: [{
172
+ PolicyName: 'InvokeLambda',
173
+ PolicyDocument: {
174
+ Version: '2012-10-17',
175
+ Statement: [{
176
+ Effect: 'Allow',
177
+ Action: 'lambda:InvokeFunction',
178
+ Resource: { 'Fn::GetAtt': ['AdminScriptExecutorLambdaFunction', 'Arn'] },
179
+ }],
180
+ },
181
+ }],
182
+ },
183
+ };
184
+
185
+ // Create schedule group
186
+ result.resources.AdminScriptScheduleGroup = {
187
+ Type: 'AWS::Scheduler::ScheduleGroup',
188
+ Properties: {
189
+ Name: '${self:service}-${self:provider.stage}-admin-scripts',
190
+ },
191
+ };
192
+
193
+ result.environment.SCHEDULER_ROLE_ARN = { 'Fn::GetAtt': ['AdminScriptSchedulerRole', 'Arn'] };
194
+ result.environment.SCHEDULE_GROUP_NAME = { Ref: 'AdminScriptScheduleGroup' };
195
+
196
+ console.log(' ✓ Created EventBridge Scheduler resources');
197
+ }
198
+ }
199
+
200
+ module.exports = { AdminScriptBuilder };