@friggframework/devtools 2.0.0-next.29 → 2.0.0-next.30

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 (164) 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/generate-command/__tests__/generate-command.test.js +312 -0
  11. package/frigg-cli/generate-command/azure-generator.js +43 -0
  12. package/frigg-cli/generate-command/gcp-generator.js +47 -0
  13. package/frigg-cli/generate-command/index.js +332 -0
  14. package/frigg-cli/generate-command/terraform-generator.js +555 -0
  15. package/frigg-cli/index.js +19 -1
  16. package/frigg-cli/init-command/backend-first-handler.js +756 -0
  17. package/frigg-cli/init-command/index.js +93 -0
  18. package/frigg-cli/init-command/template-handler.js +143 -0
  19. package/frigg-cli/package.json +51 -0
  20. package/frigg-cli/test/init-command.test.js +180 -0
  21. package/frigg-cli/test/npm-registry.test.js +319 -0
  22. package/frigg-cli/ui-command/index.js +154 -0
  23. package/frigg-cli/utils/app-resolver.js +319 -0
  24. package/frigg-cli/utils/backend-path.js +25 -0
  25. package/frigg-cli/utils/npm-registry.js +167 -0
  26. package/frigg-cli/utils/process-manager.js +199 -0
  27. package/frigg-cli/utils/repo-detection.js +405 -0
  28. package/infrastructure/serverless-template.js +177 -292
  29. package/management-ui/.eslintrc.js +22 -0
  30. package/management-ui/README.md +203 -0
  31. package/management-ui/components.json +21 -0
  32. package/management-ui/docs/phase2-integration-guide.md +320 -0
  33. package/management-ui/{dist/index.html → index.html} +1 -2
  34. package/management-ui/package-lock.json +16517 -0
  35. package/management-ui/package.json +76 -0
  36. package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +302 -0
  37. package/management-ui/postcss.config.js +6 -0
  38. package/management-ui/server/api/backend.js +256 -0
  39. package/management-ui/server/api/cli.js +315 -0
  40. package/management-ui/server/api/codegen.js +663 -0
  41. package/management-ui/server/api/connections.js +857 -0
  42. package/management-ui/server/api/discovery.js +185 -0
  43. package/management-ui/server/api/environment/index.js +1 -0
  44. package/management-ui/server/api/environment/router.js +378 -0
  45. package/management-ui/server/api/environment.js +328 -0
  46. package/management-ui/server/api/integrations.js +876 -0
  47. package/management-ui/server/api/logs.js +248 -0
  48. package/management-ui/server/api/monitoring.js +282 -0
  49. package/management-ui/server/api/open-ide.js +31 -0
  50. package/management-ui/server/api/project.js +1029 -0
  51. package/management-ui/server/api/users/sessions.js +371 -0
  52. package/management-ui/server/api/users/simulation.js +254 -0
  53. package/management-ui/server/api/users.js +362 -0
  54. package/management-ui/server/api-contract.md +275 -0
  55. package/management-ui/server/index.js +873 -0
  56. package/management-ui/server/middleware/errorHandler.js +93 -0
  57. package/management-ui/server/middleware/security.js +32 -0
  58. package/management-ui/server/processManager.js +296 -0
  59. package/management-ui/server/server.js +346 -0
  60. package/management-ui/server/services/aws-monitor.js +413 -0
  61. package/management-ui/server/services/npm-registry.js +347 -0
  62. package/management-ui/server/services/template-engine.js +538 -0
  63. package/management-ui/server/utils/cliIntegration.js +220 -0
  64. package/management-ui/server/utils/environment/auditLogger.js +471 -0
  65. package/management-ui/server/utils/environment/awsParameterStore.js +264 -0
  66. package/management-ui/server/utils/environment/encryption.js +278 -0
  67. package/management-ui/server/utils/environment/envFileManager.js +286 -0
  68. package/management-ui/server/utils/import-commonjs.js +28 -0
  69. package/management-ui/server/utils/response.js +83 -0
  70. package/management-ui/server/websocket/handler.js +325 -0
  71. package/management-ui/src/App.jsx +109 -0
  72. package/management-ui/src/components/AppRouter.jsx +65 -0
  73. package/management-ui/src/components/Button.jsx +70 -0
  74. package/management-ui/src/components/Card.jsx +97 -0
  75. package/management-ui/src/components/EnvironmentCompare.jsx +400 -0
  76. package/management-ui/src/components/EnvironmentEditor.jsx +372 -0
  77. package/management-ui/src/components/EnvironmentImportExport.jsx +469 -0
  78. package/management-ui/src/components/EnvironmentSchema.jsx +491 -0
  79. package/management-ui/src/components/EnvironmentSecurity.jsx +463 -0
  80. package/management-ui/src/components/ErrorBoundary.jsx +73 -0
  81. package/management-ui/src/components/IntegrationCard.jsx +481 -0
  82. package/management-ui/src/components/IntegrationCardEnhanced.jsx +770 -0
  83. package/management-ui/src/components/IntegrationExplorer.jsx +379 -0
  84. package/management-ui/src/components/IntegrationStatus.jsx +336 -0
  85. package/management-ui/src/components/Layout.jsx +716 -0
  86. package/management-ui/src/components/LoadingSpinner.jsx +113 -0
  87. package/management-ui/src/components/RepositoryPicker.jsx +248 -0
  88. package/management-ui/src/components/SessionMonitor.jsx +350 -0
  89. package/management-ui/src/components/StatusBadge.jsx +208 -0
  90. package/management-ui/src/components/UserContextSwitcher.jsx +212 -0
  91. package/management-ui/src/components/UserSimulation.jsx +327 -0
  92. package/management-ui/src/components/Welcome.jsx +434 -0
  93. package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +637 -0
  94. package/management-ui/src/components/codegen/APIModuleSelector.jsx +227 -0
  95. package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +247 -0
  96. package/management-ui/src/components/codegen/CodePreviewEditor.jsx +316 -0
  97. package/management-ui/src/components/codegen/DynamicModuleForm.jsx +271 -0
  98. package/management-ui/src/components/codegen/FormBuilder.jsx +737 -0
  99. package/management-ui/src/components/codegen/IntegrationGenerator.jsx +855 -0
  100. package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +797 -0
  101. package/management-ui/src/components/codegen/SchemaBuilder.jsx +303 -0
  102. package/management-ui/src/components/codegen/TemplateSelector.jsx +586 -0
  103. package/management-ui/src/components/codegen/index.js +10 -0
  104. package/management-ui/src/components/connections/ConnectionConfigForm.jsx +362 -0
  105. package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +182 -0
  106. package/management-ui/src/components/connections/ConnectionTester.jsx +200 -0
  107. package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +292 -0
  108. package/management-ui/src/components/connections/OAuthFlow.jsx +204 -0
  109. package/management-ui/src/components/connections/index.js +5 -0
  110. package/management-ui/src/components/index.js +21 -0
  111. package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +222 -0
  112. package/management-ui/src/components/monitoring/LambdaMetrics.jsx +169 -0
  113. package/management-ui/src/components/monitoring/MetricsChart.jsx +197 -0
  114. package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +393 -0
  115. package/management-ui/src/components/monitoring/SQSMetrics.jsx +246 -0
  116. package/management-ui/src/components/monitoring/index.js +6 -0
  117. package/management-ui/src/components/monitoring/monitoring.css +218 -0
  118. package/management-ui/src/components/theme-provider.jsx +52 -0
  119. package/management-ui/src/components/theme-toggle.jsx +39 -0
  120. package/management-ui/src/components/ui/badge.tsx +36 -0
  121. package/management-ui/src/components/ui/button.test.jsx +56 -0
  122. package/management-ui/src/components/ui/button.tsx +57 -0
  123. package/management-ui/src/components/ui/card.tsx +76 -0
  124. package/management-ui/src/components/ui/dropdown-menu.tsx +199 -0
  125. package/management-ui/src/components/ui/select.tsx +157 -0
  126. package/management-ui/src/components/ui/skeleton.jsx +15 -0
  127. package/management-ui/src/hooks/useFrigg.jsx +601 -0
  128. package/management-ui/src/hooks/useSocket.jsx +58 -0
  129. package/management-ui/src/index.css +193 -0
  130. package/management-ui/src/lib/utils.ts +6 -0
  131. package/management-ui/src/main.jsx +10 -0
  132. package/management-ui/src/pages/CodeGeneration.jsx +14 -0
  133. package/management-ui/src/pages/Connections.jsx +252 -0
  134. package/management-ui/src/pages/ConnectionsEnhanced.jsx +633 -0
  135. package/management-ui/src/pages/Dashboard.jsx +311 -0
  136. package/management-ui/src/pages/Environment.jsx +314 -0
  137. package/management-ui/src/pages/IntegrationConfigure.jsx +669 -0
  138. package/management-ui/src/pages/IntegrationDiscovery.jsx +567 -0
  139. package/management-ui/src/pages/IntegrationTest.jsx +742 -0
  140. package/management-ui/src/pages/Integrations.jsx +253 -0
  141. package/management-ui/src/pages/Monitoring.jsx +17 -0
  142. package/management-ui/src/pages/Simulation.jsx +155 -0
  143. package/management-ui/src/pages/Users.jsx +492 -0
  144. package/management-ui/src/services/api.js +41 -0
  145. package/management-ui/src/services/apiModuleService.js +193 -0
  146. package/management-ui/src/services/websocket-handlers.js +120 -0
  147. package/management-ui/src/test/api/project.test.js +273 -0
  148. package/management-ui/src/test/components/Welcome.test.jsx +378 -0
  149. package/management-ui/src/test/mocks/server.js +178 -0
  150. package/management-ui/src/test/setup.js +61 -0
  151. package/management-ui/src/test/utils/test-utils.jsx +134 -0
  152. package/management-ui/src/utils/repository.js +98 -0
  153. package/management-ui/src/utils/repository.test.js +118 -0
  154. package/management-ui/src/workflows/phase2-integration-workflows.js +884 -0
  155. package/management-ui/tailwind.config.js +63 -0
  156. package/management-ui/tsconfig.json +37 -0
  157. package/management-ui/tsconfig.node.json +10 -0
  158. package/management-ui/vite.config.js +26 -0
  159. package/management-ui/vitest.config.js +38 -0
  160. package/package.json +5 -5
  161. package/management-ui/dist/assets/index-BA21WgFa.js +0 -1221
  162. package/management-ui/dist/assets/index-CbM64Oba.js +0 -1221
  163. package/management-ui/dist/assets/index-CkvseXTC.css +0 -1
  164. /package/management-ui/{dist/assets/FriggLogo-B7Xx8ZW1.svg → src/assets/FriggLogo.svg} +0 -0
@@ -0,0 +1,170 @@
1
+ const { Command } = require('commander');
2
+
3
+ /**
4
+ * CommandTester - Utility class for testing CLI commands
5
+ * Provides a fluent interface for setting up mocks and executing commands
6
+ */
7
+ class CommandTester {
8
+ constructor(commandDefinition) {
9
+ this.commandDefinition = commandDefinition;
10
+ this.mocks = new Map();
11
+ this.originalEnv = process.env;
12
+ this.capturedLogs = {
13
+ info: [],
14
+ error: [],
15
+ debug: [],
16
+ warn: []
17
+ };
18
+ }
19
+
20
+ /**
21
+ * Set up a mock for a module
22
+ * @param {string} modulePath - Path to the module to mock
23
+ * @param {object} implementation - Mock implementation
24
+ * @returns {CommandTester} - Fluent interface
25
+ */
26
+ mock(modulePath, implementation) {
27
+ this.mocks.set(modulePath, implementation);
28
+ return this;
29
+ }
30
+
31
+ /**
32
+ * Set environment variables for the test
33
+ * @param {object} env - Environment variables to set
34
+ * @returns {CommandTester} - Fluent interface
35
+ */
36
+ withEnv(env) {
37
+ process.env = { ...process.env, ...env };
38
+ return this;
39
+ }
40
+
41
+ /**
42
+ * Capture console output during test execution
43
+ * @returns {CommandTester} - Fluent interface
44
+ */
45
+ captureOutput() {
46
+ const originalConsole = { ...console };
47
+
48
+ console.log = (...args) => {
49
+ this.capturedLogs.info.push(args.join(' '));
50
+ originalConsole.log(...args);
51
+ };
52
+
53
+ console.error = (...args) => {
54
+ this.capturedLogs.error.push(args.join(' '));
55
+ originalConsole.error(...args);
56
+ };
57
+
58
+ console.warn = (...args) => {
59
+ this.capturedLogs.warn.push(args.join(' '));
60
+ originalConsole.warn(...args);
61
+ };
62
+
63
+ console.debug = (...args) => {
64
+ this.capturedLogs.debug.push(args.join(' '));
65
+ originalConsole.debug(...args);
66
+ };
67
+
68
+ return this;
69
+ }
70
+
71
+ /**
72
+ * Execute the command with given arguments
73
+ * @param {string[]} args - Command arguments
74
+ * @param {object} options - Command options
75
+ * @returns {Promise<object>} - Execution result
76
+ */
77
+ async execute(args = [], options = {}) {
78
+ // Set up mocks
79
+ for (const [path, impl] of this.mocks) {
80
+ jest.mock(path, () => impl, { virtual: true });
81
+ }
82
+
83
+ try {
84
+ const program = new Command();
85
+
86
+ // Set up the command
87
+ const cmd = program
88
+ .command(this.commandDefinition.name)
89
+ .description(this.commandDefinition.description);
90
+
91
+ // Add options if defined
92
+ if (this.commandDefinition.options) {
93
+ this.commandDefinition.options.forEach(option => {
94
+ cmd.option(option.flags, option.description, option.defaultValue);
95
+ });
96
+ }
97
+
98
+ // Add action
99
+ cmd.action(this.commandDefinition.action);
100
+
101
+ // Mock process.exit to prevent actual exit
102
+ const originalExit = process.exit;
103
+ let exitCode = 0;
104
+ process.exit = (code) => {
105
+ exitCode = code;
106
+ throw new Error(`Process exited with code ${code}`);
107
+ };
108
+
109
+ try {
110
+ await program.parseAsync(['node', 'cli', ...args]);
111
+
112
+ return {
113
+ success: true,
114
+ exitCode: 0,
115
+ logs: this.capturedLogs,
116
+ args,
117
+ options
118
+ };
119
+ } catch (error) {
120
+ if (error.message.includes('Process exited with code')) {
121
+ return {
122
+ success: false,
123
+ exitCode,
124
+ error: error.message,
125
+ logs: this.capturedLogs,
126
+ args,
127
+ options
128
+ };
129
+ }
130
+ throw error;
131
+ } finally {
132
+ process.exit = originalExit;
133
+ }
134
+ } finally {
135
+ // Clean up mocks
136
+ for (const [path] of this.mocks) {
137
+ jest.unmock(path);
138
+ }
139
+
140
+ // Restore environment
141
+ process.env = this.originalEnv;
142
+ }
143
+ }
144
+
145
+ /**
146
+ * Get captured logs
147
+ * @returns {object} - Captured logs by type
148
+ */
149
+ getLogs() {
150
+ return this.capturedLogs;
151
+ }
152
+
153
+ /**
154
+ * Reset the tester state
155
+ * @returns {CommandTester} - Fluent interface
156
+ */
157
+ reset() {
158
+ this.mocks.clear();
159
+ this.capturedLogs = {
160
+ info: [],
161
+ error: [],
162
+ debug: [],
163
+ warn: []
164
+ };
165
+ process.env = this.originalEnv;
166
+ return this;
167
+ }
168
+ }
169
+
170
+ module.exports = { CommandTester };
@@ -0,0 +1,270 @@
1
+ /**
2
+ * MockFactory - Factory for creating standardized mocks
3
+ * Provides consistent mock implementations across all CLI tests
4
+ */
5
+ class MockFactory {
6
+ /**
7
+ * Create a file system mock
8
+ * @returns {object} - Mock fs implementation
9
+ */
10
+ static createFileSystem() {
11
+ return {
12
+ existsSync: jest.fn().mockReturnValue(true),
13
+ readFileSync: jest.fn().mockReturnValue('{}'),
14
+ writeFileSync: jest.fn(),
15
+ mkdirSync: jest.fn(),
16
+ readdirSync: jest.fn().mockReturnValue([]),
17
+ statSync: jest.fn().mockReturnValue({
18
+ isDirectory: () => false,
19
+ isFile: () => true
20
+ }),
21
+ copyFileSync: jest.fn(),
22
+ unlinkSync: jest.fn(),
23
+ rmdirSync: jest.fn(),
24
+ constants: {
25
+ F_OK: 0,
26
+ R_OK: 4,
27
+ W_OK: 2,
28
+ X_OK: 1
29
+ }
30
+ };
31
+ }
32
+
33
+ /**
34
+ * Create a logger mock
35
+ * @returns {object} - Mock logger implementation
36
+ */
37
+ static createLogger() {
38
+ return {
39
+ info: jest.fn(),
40
+ error: jest.fn(),
41
+ debug: jest.fn(),
42
+ warn: jest.fn(),
43
+ logInfo: jest.fn(),
44
+ logError: jest.fn(),
45
+ logDebug: jest.fn(),
46
+ logWarn: jest.fn()
47
+ };
48
+ }
49
+
50
+ /**
51
+ * Create a package manager mock
52
+ * @returns {object} - Mock package manager implementation
53
+ */
54
+ static createPackageManager() {
55
+ return {
56
+ install: jest.fn().mockResolvedValue({ success: true }),
57
+ list: jest.fn().mockResolvedValue([]),
58
+ exists: jest.fn().mockResolvedValue(true),
59
+ getInfo: jest.fn().mockResolvedValue({
60
+ name: 'test-package',
61
+ version: '1.0.0'
62
+ }),
63
+ search: jest.fn().mockResolvedValue([])
64
+ };
65
+ }
66
+
67
+ /**
68
+ * Create a child process mock
69
+ * @returns {object} - Mock child_process implementation
70
+ */
71
+ static createChildProcess() {
72
+ return {
73
+ execSync: jest.fn().mockReturnValue(''),
74
+ exec: jest.fn(),
75
+ spawn: jest.fn().mockReturnValue({
76
+ stdout: { on: jest.fn() },
77
+ stderr: { on: jest.fn() },
78
+ on: jest.fn((event, callback) => {
79
+ if (event === 'close') {
80
+ callback(0);
81
+ }
82
+ })
83
+ }),
84
+ fork: jest.fn()
85
+ };
86
+ }
87
+
88
+ /**
89
+ * Create a git mock
90
+ * @returns {object} - Mock git implementation
91
+ */
92
+ static createGit() {
93
+ return {
94
+ init: jest.fn(),
95
+ add: jest.fn(),
96
+ commit: jest.fn(),
97
+ status: jest.fn().mockReturnValue({
98
+ clean: true,
99
+ files: []
100
+ }),
101
+ branch: jest.fn().mockReturnValue('main'),
102
+ remote: jest.fn().mockReturnValue('origin'),
103
+ isRepo: jest.fn().mockReturnValue(true)
104
+ };
105
+ }
106
+
107
+ /**
108
+ * Create a config loader mock
109
+ * @returns {object} - Mock config loader implementation
110
+ */
111
+ static createConfigLoader() {
112
+ return {
113
+ load: jest.fn().mockReturnValue({
114
+ stage: 'dev',
115
+ region: 'us-east-1',
116
+ profile: 'default'
117
+ }),
118
+ validate: jest.fn().mockReturnValue(true),
119
+ save: jest.fn(),
120
+ merge: jest.fn()
121
+ };
122
+ }
123
+
124
+ /**
125
+ * Create an app resolver mock
126
+ * @returns {object} - Mock app resolver implementation
127
+ */
128
+ static createAppResolver() {
129
+ return {
130
+ resolveAppPath: jest.fn().mockReturnValue('/mock/app/path'),
131
+ findNearestBackendPackageJson: jest.fn().mockReturnValue('/mock/backend/package.json'),
132
+ validateBackendPath: jest.fn().mockReturnValue(true),
133
+ getProjectRoot: jest.fn().mockReturnValue('/mock/project'),
134
+ findConfigFile: jest.fn().mockReturnValue('/mock/config.json')
135
+ };
136
+ }
137
+
138
+ /**
139
+ * Create a network mock
140
+ * @returns {object} - Mock network implementation
141
+ */
142
+ static createNetwork() {
143
+ return {
144
+ get: jest.fn().mockResolvedValue({
145
+ status: 200,
146
+ data: {}
147
+ }),
148
+ post: jest.fn().mockResolvedValue({
149
+ status: 200,
150
+ data: {}
151
+ }),
152
+ put: jest.fn().mockResolvedValue({
153
+ status: 200,
154
+ data: {}
155
+ }),
156
+ delete: jest.fn().mockResolvedValue({
157
+ status: 200,
158
+ data: {}
159
+ })
160
+ };
161
+ }
162
+
163
+ /**
164
+ * Create a comprehensive mock environment
165
+ * @returns {object} - Complete mock environment
166
+ */
167
+ static createMockEnvironment() {
168
+ return {
169
+ fs: this.createFileSystem(),
170
+ logger: this.createLogger(),
171
+ packageManager: this.createPackageManager(),
172
+ childProcess: this.createChildProcess(),
173
+ git: this.createGit(),
174
+ config: this.createConfigLoader(),
175
+ appResolver: this.createAppResolver(),
176
+ network: this.createNetwork()
177
+ };
178
+ }
179
+
180
+ /**
181
+ * Create a mock for process.env
182
+ * @param {object} customEnv - Custom environment variables
183
+ * @returns {object} - Mock environment
184
+ */
185
+ static createProcessEnv(customEnv = {}) {
186
+ return {
187
+ NODE_ENV: 'test',
188
+ HOME: '/mock/home',
189
+ PATH: '/mock/path',
190
+ ...customEnv
191
+ };
192
+ }
193
+
194
+ /**
195
+ * Create success response mock
196
+ * @param {any} data - Response data
197
+ * @returns {object} - Success response
198
+ */
199
+ static createSuccessResponse(data = {}) {
200
+ return {
201
+ success: true,
202
+ data,
203
+ message: 'Operation completed successfully'
204
+ };
205
+ }
206
+
207
+ /**
208
+ * Create error response mock
209
+ * @param {string} message - Error message
210
+ * @param {string} code - Error code
211
+ * @returns {object} - Error response
212
+ */
213
+ static createErrorResponse(message = 'An error occurred', code = 'GENERIC_ERROR') {
214
+ return {
215
+ success: false,
216
+ error: {
217
+ message,
218
+ code,
219
+ stack: 'Mock stack trace'
220
+ }
221
+ };
222
+ }
223
+
224
+ /**
225
+ * Create package.json mock
226
+ * @param {object} overrides - Custom package.json properties
227
+ * @returns {object} - Mock package.json
228
+ */
229
+ static createPackageJson(overrides = {}) {
230
+ return {
231
+ name: 'test-package',
232
+ version: '1.0.0',
233
+ description: 'Test package',
234
+ main: 'index.js',
235
+ scripts: {
236
+ test: 'jest',
237
+ start: 'node index.js'
238
+ },
239
+ dependencies: {},
240
+ devDependencies: {},
241
+ ...overrides
242
+ };
243
+ }
244
+
245
+ /**
246
+ * Create frigg config mock
247
+ * @param {object} overrides - Custom config properties
248
+ * @returns {object} - Mock frigg config
249
+ */
250
+ static createFriggConfig(overrides = {}) {
251
+ return {
252
+ stage: 'dev',
253
+ region: 'us-east-1',
254
+ profile: 'default',
255
+ backend: {
256
+ runtime: 'nodejs18.x',
257
+ timeout: 30,
258
+ memory: 128
259
+ },
260
+ frontend: {
261
+ framework: 'react',
262
+ buildCommand: 'npm run build',
263
+ outputDir: 'dist'
264
+ },
265
+ ...overrides
266
+ };
267
+ }
268
+ }
269
+
270
+ module.exports = { MockFactory };