@friggframework/devtools 2.0.0--canary.522.cbd3d5a.0 → 2.0.0--canary.517.21b69ac.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 (247) hide show
  1. package/.eslintrc.json +3 -0
  2. package/CHANGELOG.md +132 -0
  3. package/frigg-cli/README.md +1 -1
  4. package/frigg-cli/__tests__/unit/commands/doctor.test.js +2 -0
  5. package/frigg-cli/__tests__/unit/commands/install.test.js +17 -21
  6. package/frigg-cli/doctor-command/index.js +16 -17
  7. package/frigg-cli/index.js +6 -21
  8. package/frigg-cli/index.test.js +1 -7
  9. package/frigg-cli/init-command/backend-first-handler.js +42 -124
  10. package/frigg-cli/init-command/index.js +1 -2
  11. package/frigg-cli/init-command/template-handler.js +3 -13
  12. package/frigg-cli/install-command/backend-js.js +3 -3
  13. package/frigg-cli/install-command/environment-variables.js +19 -16
  14. package/frigg-cli/install-command/environment-variables.test.js +13 -12
  15. package/frigg-cli/install-command/index.js +9 -14
  16. package/frigg-cli/install-command/integration-file.js +3 -3
  17. package/frigg-cli/install-command/logger.js +12 -0
  18. package/frigg-cli/install-command/validate-package.js +9 -5
  19. package/frigg-cli/jest.config.js +1 -4
  20. package/frigg-cli/repair-command/index.js +128 -101
  21. package/frigg-cli/start-command/index.js +2 -246
  22. package/frigg-cli/ui-command/index.js +36 -58
  23. package/frigg-cli/utils/repo-detection.js +37 -85
  24. package/infrastructure/docs/iam-policy-templates.md +1 -1
  25. package/infrastructure/domains/networking/vpc-builder.test.js +4 -2
  26. package/infrastructure/domains/networking/vpc-resolver.test.js +1 -1
  27. package/infrastructure/domains/shared/cloudformation-discovery.test.js +7 -4
  28. package/infrastructure/domains/shared/resource-discovery.js +5 -5
  29. package/infrastructure/domains/shared/types/discovery-result.test.js +1 -1
  30. package/infrastructure/domains/shared/utilities/base-definition-factory.js +2 -25
  31. package/infrastructure/domains/shared/utilities/base-definition-factory.test.js +2 -2
  32. package/infrastructure/infrastructure-composer.test.js +2 -2
  33. package/layers/prisma/.build-complete +3 -0
  34. package/layers/prisma/nodejs/package.json +8 -0
  35. package/management-ui/.eslintrc.js +22 -0
  36. package/management-ui/README.md +109 -245
  37. package/management-ui/components.json +21 -0
  38. package/management-ui/docs/phase2-integration-guide.md +320 -0
  39. package/management-ui/index.html +13 -0
  40. package/management-ui/package.json +76 -0
  41. package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +302 -0
  42. package/management-ui/postcss.config.js +6 -0
  43. package/management-ui/server/api/backend.js +256 -0
  44. package/management-ui/server/api/cli.js +315 -0
  45. package/management-ui/server/api/codegen.js +663 -0
  46. package/management-ui/server/api/connections.js +857 -0
  47. package/management-ui/server/api/discovery.js +185 -0
  48. package/management-ui/server/api/environment/index.js +1 -0
  49. package/management-ui/server/api/environment/router.js +378 -0
  50. package/management-ui/server/api/environment.js +328 -0
  51. package/management-ui/server/api/integrations.js +876 -0
  52. package/management-ui/server/api/logs.js +248 -0
  53. package/management-ui/server/api/monitoring.js +282 -0
  54. package/management-ui/server/api/open-ide.js +31 -0
  55. package/management-ui/server/api/project.js +1029 -0
  56. package/management-ui/server/api/users/sessions.js +371 -0
  57. package/management-ui/server/api/users/simulation.js +254 -0
  58. package/management-ui/server/api/users.js +362 -0
  59. package/management-ui/server/api-contract.md +275 -0
  60. package/management-ui/server/index.js +873 -0
  61. package/management-ui/server/middleware/errorHandler.js +93 -0
  62. package/management-ui/server/middleware/security.js +32 -0
  63. package/management-ui/server/processManager.js +296 -0
  64. package/management-ui/server/server.js +346 -0
  65. package/management-ui/server/services/aws-monitor.js +413 -0
  66. package/management-ui/server/services/npm-registry.js +347 -0
  67. package/management-ui/server/services/template-engine.js +538 -0
  68. package/management-ui/server/utils/cliIntegration.js +220 -0
  69. package/management-ui/server/utils/environment/auditLogger.js +471 -0
  70. package/management-ui/server/utils/environment/awsParameterStore.js +275 -0
  71. package/management-ui/server/utils/environment/encryption.js +278 -0
  72. package/management-ui/server/utils/environment/envFileManager.js +286 -0
  73. package/management-ui/server/utils/import-commonjs.js +28 -0
  74. package/management-ui/server/utils/response.js +83 -0
  75. package/management-ui/server/websocket/handler.js +325 -0
  76. package/management-ui/src/App.jsx +25 -0
  77. package/management-ui/src/assets/FriggLogo.svg +1 -0
  78. package/management-ui/src/components/AppRouter.jsx +65 -0
  79. package/management-ui/src/components/Button.jsx +70 -0
  80. package/management-ui/src/components/Card.jsx +97 -0
  81. package/management-ui/src/components/EnvironmentCompare.jsx +400 -0
  82. package/management-ui/src/components/EnvironmentEditor.jsx +372 -0
  83. package/management-ui/src/components/EnvironmentImportExport.jsx +469 -0
  84. package/management-ui/src/components/EnvironmentSchema.jsx +491 -0
  85. package/management-ui/src/components/EnvironmentSecurity.jsx +463 -0
  86. package/management-ui/src/components/ErrorBoundary.jsx +73 -0
  87. package/management-ui/src/components/IntegrationCard.jsx +481 -0
  88. package/management-ui/src/components/IntegrationCardEnhanced.jsx +770 -0
  89. package/management-ui/src/components/IntegrationExplorer.jsx +379 -0
  90. package/management-ui/src/components/IntegrationStatus.jsx +336 -0
  91. package/management-ui/src/components/Layout.jsx +716 -0
  92. package/management-ui/src/components/LoadingSpinner.jsx +113 -0
  93. package/management-ui/src/components/RepositoryPicker.jsx +248 -0
  94. package/management-ui/src/components/SessionMonitor.jsx +350 -0
  95. package/management-ui/src/components/StatusBadge.jsx +208 -0
  96. package/management-ui/src/components/UserContextSwitcher.jsx +212 -0
  97. package/management-ui/src/components/UserSimulation.jsx +327 -0
  98. package/management-ui/src/components/Welcome.jsx +434 -0
  99. package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +637 -0
  100. package/management-ui/src/components/codegen/APIModuleSelector.jsx +227 -0
  101. package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +247 -0
  102. package/management-ui/src/components/codegen/CodePreviewEditor.jsx +316 -0
  103. package/management-ui/src/components/codegen/DynamicModuleForm.jsx +271 -0
  104. package/management-ui/src/components/codegen/FormBuilder.jsx +737 -0
  105. package/management-ui/src/components/codegen/IntegrationGenerator.jsx +855 -0
  106. package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +797 -0
  107. package/management-ui/src/components/codegen/SchemaBuilder.jsx +303 -0
  108. package/management-ui/src/components/codegen/TemplateSelector.jsx +586 -0
  109. package/management-ui/src/components/codegen/index.js +10 -0
  110. package/management-ui/src/components/connections/ConnectionConfigForm.jsx +362 -0
  111. package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +182 -0
  112. package/management-ui/src/components/connections/ConnectionTester.jsx +200 -0
  113. package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +292 -0
  114. package/management-ui/src/components/connections/OAuthFlow.jsx +204 -0
  115. package/management-ui/src/components/connections/index.js +5 -0
  116. package/management-ui/src/components/index.js +21 -0
  117. package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +222 -0
  118. package/management-ui/src/components/monitoring/LambdaMetrics.jsx +169 -0
  119. package/management-ui/src/components/monitoring/MetricsChart.jsx +197 -0
  120. package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +393 -0
  121. package/management-ui/src/components/monitoring/SQSMetrics.jsx +246 -0
  122. package/management-ui/src/components/monitoring/index.js +6 -0
  123. package/management-ui/src/components/monitoring/monitoring.css +218 -0
  124. package/management-ui/src/components/theme-provider.jsx +52 -0
  125. package/management-ui/src/components/theme-toggle.jsx +39 -0
  126. package/management-ui/src/components/ui/badge.tsx +36 -0
  127. package/management-ui/src/components/ui/button.test.jsx +56 -0
  128. package/management-ui/src/components/ui/button.tsx +57 -0
  129. package/management-ui/src/components/ui/card.tsx +76 -0
  130. package/management-ui/src/components/ui/dropdown-menu.tsx +199 -0
  131. package/management-ui/src/components/ui/select.tsx +157 -0
  132. package/management-ui/src/components/ui/skeleton.jsx +15 -0
  133. package/management-ui/src/hooks/useFrigg.jsx +387 -0
  134. package/management-ui/src/hooks/useSocket.jsx +58 -0
  135. package/management-ui/src/index.css +193 -0
  136. package/management-ui/src/lib/utils.ts +6 -0
  137. package/management-ui/src/main.jsx +10 -0
  138. package/management-ui/src/pages/CodeGeneration.jsx +14 -0
  139. package/management-ui/src/pages/Connections.jsx +252 -0
  140. package/management-ui/src/pages/ConnectionsEnhanced.jsx +633 -0
  141. package/management-ui/src/pages/Dashboard.jsx +311 -0
  142. package/management-ui/src/pages/Environment.jsx +314 -0
  143. package/management-ui/src/pages/IntegrationConfigure.jsx +669 -0
  144. package/management-ui/src/pages/IntegrationDiscovery.jsx +567 -0
  145. package/management-ui/src/pages/IntegrationTest.jsx +742 -0
  146. package/management-ui/src/pages/Integrations.jsx +253 -0
  147. package/management-ui/src/pages/Monitoring.jsx +17 -0
  148. package/management-ui/src/pages/Simulation.jsx +155 -0
  149. package/management-ui/src/pages/Users.jsx +492 -0
  150. package/management-ui/src/services/api.js +41 -0
  151. package/management-ui/src/services/apiModuleService.js +193 -0
  152. package/management-ui/src/services/websocket-handlers.js +120 -0
  153. package/management-ui/src/test/api/project.test.js +273 -0
  154. package/management-ui/src/test/components/Welcome.test.jsx +378 -0
  155. package/management-ui/src/test/mocks/server.js +178 -0
  156. package/management-ui/src/test/setup.js +61 -0
  157. package/management-ui/src/test/utils/test-utils.jsx +134 -0
  158. package/management-ui/src/utils/repository.js +98 -0
  159. package/management-ui/src/utils/repository.test.js +118 -0
  160. package/management-ui/src/workflows/phase2-integration-workflows.js +884 -0
  161. package/management-ui/tailwind.config.js +63 -0
  162. package/management-ui/tsconfig.json +37 -0
  163. package/management-ui/tsconfig.node.json +10 -0
  164. package/management-ui/vite.config.js +26 -0
  165. package/management-ui/vitest.config.js +38 -0
  166. package/package.json +7 -17
  167. package/frigg-cli/__tests__/application/use-cases/AddApiModuleToIntegrationUseCase.test.js +0 -326
  168. package/frigg-cli/__tests__/application/use-cases/CreateApiModuleUseCase.test.js +0 -337
  169. package/frigg-cli/__tests__/domain/entities/ApiModule.test.js +0 -373
  170. package/frigg-cli/__tests__/domain/entities/AppDefinition.test.js +0 -313
  171. package/frigg-cli/__tests__/domain/services/IntegrationValidator.test.js +0 -269
  172. package/frigg-cli/__tests__/domain/value-objects/IntegrationName.test.js +0 -82
  173. package/frigg-cli/__tests__/infrastructure/adapters/IntegrationJsUpdater.test.js +0 -408
  174. package/frigg-cli/__tests__/infrastructure/repositories/FileSystemApiModuleRepository.test.js +0 -583
  175. package/frigg-cli/__tests__/infrastructure/repositories/FileSystemAppDefinitionRepository.test.js +0 -314
  176. package/frigg-cli/__tests__/infrastructure/repositories/FileSystemIntegrationRepository.test.js +0 -430
  177. package/frigg-cli/__tests__/unit/commands/init.test.js +0 -406
  178. package/frigg-cli/__tests__/unit/commands/repair.test.js +0 -275
  179. package/frigg-cli/__tests__/unit/start-command/application/RunPreflightChecksUseCase.test.js +0 -411
  180. package/frigg-cli/__tests__/unit/start-command/infrastructure/DatabaseAdapter.test.js +0 -405
  181. package/frigg-cli/__tests__/unit/start-command/infrastructure/DockerAdapter.test.js +0 -496
  182. package/frigg-cli/__tests__/unit/start-command/presentation/InteractivePromptAdapter.test.js +0 -474
  183. package/frigg-cli/__tests__/unit/utils/output.test.js +0 -196
  184. package/frigg-cli/application/use-cases/AddApiModuleToIntegrationUseCase.js +0 -93
  185. package/frigg-cli/application/use-cases/CreateApiModuleUseCase.js +0 -93
  186. package/frigg-cli/application/use-cases/CreateIntegrationUseCase.js +0 -103
  187. package/frigg-cli/container.js +0 -172
  188. package/frigg-cli/docs/OUTPUT_MIGRATION_GUIDE.md +0 -286
  189. package/frigg-cli/domain/entities/ApiModule.js +0 -272
  190. package/frigg-cli/domain/entities/AppDefinition.js +0 -227
  191. package/frigg-cli/domain/entities/Integration.js +0 -198
  192. package/frigg-cli/domain/exceptions/DomainException.js +0 -24
  193. package/frigg-cli/domain/ports/IApiModuleRepository.js +0 -53
  194. package/frigg-cli/domain/ports/IAppDefinitionRepository.js +0 -43
  195. package/frigg-cli/domain/ports/IIntegrationRepository.js +0 -61
  196. package/frigg-cli/domain/services/IntegrationValidator.js +0 -185
  197. package/frigg-cli/domain/value-objects/IntegrationId.js +0 -42
  198. package/frigg-cli/domain/value-objects/IntegrationName.js +0 -60
  199. package/frigg-cli/domain/value-objects/SemanticVersion.js +0 -70
  200. package/frigg-cli/infrastructure/UnitOfWork.js +0 -46
  201. package/frigg-cli/infrastructure/adapters/BackendJsUpdater.js +0 -197
  202. package/frigg-cli/infrastructure/adapters/FileSystemAdapter.js +0 -224
  203. package/frigg-cli/infrastructure/adapters/IntegrationJsUpdater.js +0 -249
  204. package/frigg-cli/infrastructure/adapters/SchemaValidator.js +0 -92
  205. package/frigg-cli/infrastructure/repositories/FileSystemApiModuleRepository.js +0 -373
  206. package/frigg-cli/infrastructure/repositories/FileSystemAppDefinitionRepository.js +0 -116
  207. package/frigg-cli/infrastructure/repositories/FileSystemIntegrationRepository.js +0 -277
  208. package/frigg-cli/package-lock.json +0 -16226
  209. package/frigg-cli/start-command/application/RunPreflightChecksUseCase.js +0 -376
  210. package/frigg-cli/start-command/infrastructure/DatabaseAdapter.js +0 -591
  211. package/frigg-cli/start-command/infrastructure/DockerAdapter.js +0 -306
  212. package/frigg-cli/start-command/presentation/InteractivePromptAdapter.js +0 -329
  213. package/frigg-cli/templates/backend/.env.example +0 -62
  214. package/frigg-cli/templates/backend/.eslintrc.json +0 -12
  215. package/frigg-cli/templates/backend/.prettierrc +0 -6
  216. package/frigg-cli/templates/backend/docker-compose.yml +0 -22
  217. package/frigg-cli/templates/backend/index.js +0 -96
  218. package/frigg-cli/templates/backend/infrastructure.js +0 -12
  219. package/frigg-cli/templates/backend/jest.config.js +0 -17
  220. package/frigg-cli/templates/backend/package.json +0 -50
  221. package/frigg-cli/templates/backend/src/api-modules/.gitkeep +0 -10
  222. package/frigg-cli/templates/backend/src/base/.gitkeep +0 -7
  223. package/frigg-cli/templates/backend/src/integrations/.gitkeep +0 -10
  224. package/frigg-cli/templates/backend/src/integrations/ExampleIntegration.js +0 -65
  225. package/frigg-cli/templates/backend/src/utils/.gitkeep +0 -7
  226. package/frigg-cli/templates/backend/test/setup.js +0 -30
  227. package/frigg-cli/templates/backend/ui-extensions/.gitkeep +0 -0
  228. package/frigg-cli/templates/backend/ui-extensions/README.md +0 -77
  229. package/frigg-cli/utils/__tests__/repo-detection.test.js +0 -436
  230. package/frigg-cli/utils/output.js +0 -382
  231. package/frigg-cli/validate-command/__tests__/adapters/validate-command.test.js +0 -205
  232. package/frigg-cli/validate-command/__tests__/application/validate-app-use-case.test.js +0 -104
  233. package/frigg-cli/validate-command/__tests__/domain/fix-suggestion.test.js +0 -153
  234. package/frigg-cli/validate-command/__tests__/domain/validation-error.test.js +0 -162
  235. package/frigg-cli/validate-command/__tests__/domain/validation-result.test.js +0 -152
  236. package/frigg-cli/validate-command/__tests__/infrastructure/api-module-validator.test.js +0 -332
  237. package/frigg-cli/validate-command/__tests__/infrastructure/app-definition-validator.test.js +0 -191
  238. package/frigg-cli/validate-command/__tests__/infrastructure/integration-class-validator.test.js +0 -146
  239. package/frigg-cli/validate-command/__tests__/infrastructure/template-validation.test.js +0 -155
  240. package/frigg-cli/validate-command/adapters/cli/validate-command.js +0 -199
  241. package/frigg-cli/validate-command/application/use-cases/validate-app-use-case.js +0 -35
  242. package/frigg-cli/validate-command/domain/entities/validation-result.js +0 -74
  243. package/frigg-cli/validate-command/domain/value-objects/fix-suggestion.js +0 -74
  244. package/frigg-cli/validate-command/domain/value-objects/validation-error.js +0 -68
  245. package/frigg-cli/validate-command/infrastructure/validators/api-module-validator.js +0 -181
  246. package/frigg-cli/validate-command/infrastructure/validators/app-definition-validator.js +0 -128
  247. package/frigg-cli/validate-command/infrastructure/validators/integration-class-validator.js +0 -113
@@ -0,0 +1,63 @@
1
+ /** @type {import('tailwindcss').Config} */
2
+ export default {
3
+ darkMode: ["class"],
4
+ content: [
5
+ "./index.html",
6
+ "./src/**/*.{js,ts,jsx,tsx}",
7
+ ],
8
+ theme: {
9
+ extend: {
10
+ colors: {
11
+ 'frigg-blue': '#0066CC',
12
+ 'frigg-dark': '#1A1A1A',
13
+ 'frigg-gray': '#F5F5F5',
14
+ background: 'hsl(var(--background))',
15
+ foreground: 'hsl(var(--foreground))',
16
+ card: {
17
+ DEFAULT: 'hsl(var(--card))',
18
+ foreground: 'hsl(var(--card-foreground))'
19
+ },
20
+ popover: {
21
+ DEFAULT: 'hsl(var(--popover))',
22
+ foreground: 'hsl(var(--popover-foreground))'
23
+ },
24
+ primary: {
25
+ DEFAULT: 'hsl(var(--primary))',
26
+ foreground: 'hsl(var(--primary-foreground))'
27
+ },
28
+ secondary: {
29
+ DEFAULT: 'hsl(var(--secondary))',
30
+ foreground: 'hsl(var(--secondary-foreground))'
31
+ },
32
+ muted: {
33
+ DEFAULT: 'hsl(var(--muted))',
34
+ foreground: 'hsl(var(--muted-foreground))'
35
+ },
36
+ accent: {
37
+ DEFAULT: 'hsl(var(--accent))',
38
+ foreground: 'hsl(var(--accent-foreground))'
39
+ },
40
+ destructive: {
41
+ DEFAULT: 'hsl(var(--destructive))',
42
+ foreground: 'hsl(var(--destructive-foreground))'
43
+ },
44
+ border: 'hsl(var(--border))',
45
+ input: 'hsl(var(--input))',
46
+ ring: 'hsl(var(--ring))',
47
+ chart: {
48
+ '1': 'hsl(var(--chart-1))',
49
+ '2': 'hsl(var(--chart-2))',
50
+ '3': 'hsl(var(--chart-3))',
51
+ '4': 'hsl(var(--chart-4))',
52
+ '5': 'hsl(var(--chart-5))'
53
+ }
54
+ },
55
+ borderRadius: {
56
+ lg: 'var(--radius)',
57
+ md: 'calc(var(--radius) - 2px)',
58
+ sm: 'calc(var(--radius) - 4px)'
59
+ }
60
+ }
61
+ },
62
+ plugins: [require("tailwindcss-animate")],
63
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "useDefineForClassFields": true,
5
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+ "allowJs": true,
9
+ "checkJs": false,
10
+
11
+ /* Bundler mode */
12
+ "moduleResolution": "bundler",
13
+ "allowImportingTsExtensions": true,
14
+ "resolveJsonModule": true,
15
+ "isolatedModules": true,
16
+ "noEmit": true,
17
+ "jsx": "react-jsx",
18
+
19
+ /* Linting */
20
+ "strict": true,
21
+ "noUnusedLocals": false,
22
+ "noUnusedParameters": false,
23
+ "noFallthroughCasesInSwitch": true,
24
+
25
+ /* Path mapping */
26
+ "baseUrl": ".",
27
+ "paths": {
28
+ "@/*": ["./src/*"],
29
+ "@/components/*": ["./src/components/*"],
30
+ "@/hooks/*": ["./src/hooks/*"],
31
+ "@/utils/*": ["./src/utils/*"],
32
+ "@/services/*": ["./src/services/*"]
33
+ }
34
+ },
35
+ "include": ["src"],
36
+ "references": [{ "path": "./tsconfig.node.json" }]
37
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "compilerOptions": {
3
+ "composite": true,
4
+ "skipLibCheck": true,
5
+ "module": "ESNext",
6
+ "moduleResolution": "bundler",
7
+ "allowSyntheticDefaultImports": true
8
+ },
9
+ "include": ["vite.config.js"]
10
+ }
@@ -0,0 +1,26 @@
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react'
3
+ import path from 'path'
4
+
5
+ // https://vitejs.dev/config/
6
+ export default defineConfig({
7
+ plugins: [react()],
8
+ resolve: {
9
+ alias: {
10
+ '@': path.resolve(__dirname, './src'),
11
+ },
12
+ },
13
+ server: {
14
+ port: 5173,
15
+ proxy: {
16
+ '/api': {
17
+ target: 'http://localhost:3001',
18
+ changeOrigin: true,
19
+ },
20
+ '/socket.io': {
21
+ target: 'http://localhost:3001',
22
+ ws: true,
23
+ }
24
+ }
25
+ }
26
+ })
@@ -0,0 +1,38 @@
1
+ import { defineConfig } from 'vitest/config'
2
+ import react from '@vitejs/plugin-react'
3
+ import path from 'path'
4
+
5
+ export default defineConfig({
6
+ plugins: [react()],
7
+ test: {
8
+ globals: true,
9
+ environment: 'jsdom',
10
+ setupFiles: ['./src/test/setup.js'],
11
+ coverage: {
12
+ provider: 'v8',
13
+ reporter: ['text', 'json', 'html'],
14
+ exclude: [
15
+ 'node_modules/',
16
+ 'dist/',
17
+ 'server/',
18
+ '**/*.config.js',
19
+ '**/*.config.ts',
20
+ '**/test/**',
21
+ '**/__tests__/**',
22
+ '**/*.test.{js,ts,jsx,tsx}',
23
+ '**/*.spec.{js,ts,jsx,tsx}'
24
+ ],
25
+ thresholds: {
26
+ statements: 70,
27
+ branches: 70,
28
+ functions: 70,
29
+ lines: 70
30
+ }
31
+ }
32
+ },
33
+ resolve: {
34
+ alias: {
35
+ '@': path.resolve(__dirname, './src'),
36
+ },
37
+ },
38
+ })
package/package.json CHANGED
@@ -1,19 +1,10 @@
1
1
  {
2
2
  "name": "@friggframework/devtools",
3
3
  "prettier": "@friggframework/prettier-config",
4
- "version": "2.0.0--canary.522.cbd3d5a.0",
4
+ "version": "2.0.0--canary.517.21b69ac.0",
5
5
  "bin": {
6
6
  "frigg": "./frigg-cli/index.js"
7
7
  },
8
- "files": [
9
- "frigg-cli/",
10
- "infrastructure/",
11
- "migrations/",
12
- "management-ui/dist/",
13
- "test/",
14
- "index.js",
15
- "README.md"
16
- ],
17
8
  "dependencies": {
18
9
  "@aws-sdk/client-cloudformation": "^3.705.0",
19
10
  "@aws-sdk/client-ec2": "^3.835.0",
@@ -25,9 +16,9 @@
25
16
  "@babel/eslint-parser": "^7.18.9",
26
17
  "@babel/parser": "^7.25.3",
27
18
  "@babel/traverse": "^7.25.3",
28
- "@friggframework/core": "2.0.0--canary.522.cbd3d5a.0",
29
- "@friggframework/schemas": "2.0.0--canary.522.cbd3d5a.0",
30
- "@friggframework/test": "2.0.0--canary.522.cbd3d5a.0",
19
+ "@friggframework/core": "2.0.0--canary.517.21b69ac.0",
20
+ "@friggframework/schemas": "2.0.0--canary.517.21b69ac.0",
21
+ "@friggframework/test": "2.0.0--canary.517.21b69ac.0",
31
22
  "@hapi/boom": "^10.0.1",
32
23
  "@inquirer/prompts": "^5.3.8",
33
24
  "axios": "^1.7.2",
@@ -55,11 +46,10 @@
55
46
  "validate-npm-package-name": "^5.0.0"
56
47
  },
57
48
  "devDependencies": {
58
- "@friggframework/eslint-config": "2.0.0--canary.522.cbd3d5a.0",
59
- "@friggframework/prettier-config": "2.0.0--canary.522.cbd3d5a.0",
49
+ "@friggframework/eslint-config": "2.0.0--canary.517.21b69ac.0",
50
+ "@friggframework/prettier-config": "2.0.0--canary.517.21b69ac.0",
60
51
  "aws-sdk-client-mock": "^4.1.0",
61
52
  "aws-sdk-client-mock-jest": "^4.1.0",
62
- "exit-x": "^0.2.2",
63
53
  "jest": "^30.1.3",
64
54
  "osls": "^3.40.1",
65
55
  "prettier": "^2.7.1",
@@ -89,5 +79,5 @@
89
79
  "publishConfig": {
90
80
  "access": "public"
91
81
  },
92
- "gitHead": "cbd3d5a81315519842f308fc0bd786a3f8786b79"
82
+ "gitHead": "21b69ac223278457b95dd8ba04c51d713a1c8f56"
93
83
  }
@@ -1,326 +0,0 @@
1
- const {AddApiModuleToIntegrationUseCase} = require('../../../application/use-cases/AddApiModuleToIntegrationUseCase');
2
- const {Integration} = require('../../../domain/entities/Integration');
3
- const {IntegrationName} = require('../../../domain/value-objects/IntegrationName');
4
- const {SemanticVersion} = require('../../../domain/value-objects/SemanticVersion');
5
- const {ValidationException} = require('../../../domain/exceptions/DomainException');
6
-
7
- // Mock dependencies
8
- class MockIntegrationRepository {
9
- constructor() {
10
- this.integrations = new Map();
11
- this.saveCalled = false;
12
- }
13
-
14
- async save(integration) {
15
- this.saveCalled = true;
16
- this.integrations.set(integration.name.value, integration);
17
- return integration;
18
- }
19
-
20
- async findByName(name) {
21
- return this.integrations.get(name) || null;
22
- }
23
-
24
- async exists(name) {
25
- return this.integrations.has(name);
26
- }
27
- }
28
-
29
- class MockApiModuleRepository {
30
- constructor() {
31
- this.modules = new Set(['salesforce', 'stripe', 'hubspot']);
32
- }
33
-
34
- async exists(name) {
35
- return this.modules.has(name);
36
- }
37
- }
38
-
39
- class MockUnitOfWork {
40
- constructor() {
41
- this.committed = false;
42
- this.rolledBack = false;
43
- }
44
-
45
- async commit() {
46
- this.committed = true;
47
- }
48
-
49
- async rollback() {
50
- this.rolledBack = true;
51
- }
52
- }
53
-
54
- class MockIntegrationValidator {
55
- constructor() {
56
- this.validateCalled = false;
57
- this.shouldFail = false;
58
- this.errors = [];
59
- }
60
-
61
- validateApiModuleAddition(integration, moduleName, moduleVersion) {
62
- this.validateCalled = true;
63
- if (this.shouldFail) {
64
- return {
65
- isValid: false,
66
- errors: this.errors
67
- };
68
- }
69
- return {
70
- isValid: true,
71
- errors: []
72
- };
73
- }
74
- }
75
-
76
- describe('AddApiModuleToIntegrationUseCase', () => {
77
- let useCase;
78
- let mockIntegrationRepository;
79
- let mockApiModuleRepository;
80
- let mockUnitOfWork;
81
- let mockValidator;
82
-
83
- beforeEach(() => {
84
- mockIntegrationRepository = new MockIntegrationRepository();
85
- mockApiModuleRepository = new MockApiModuleRepository();
86
- mockUnitOfWork = new MockUnitOfWork();
87
- mockValidator = new MockIntegrationValidator();
88
-
89
- useCase = new AddApiModuleToIntegrationUseCase(
90
- mockIntegrationRepository,
91
- mockApiModuleRepository,
92
- mockUnitOfWork,
93
- mockValidator
94
- );
95
-
96
- // Add a test integration
97
- const integration = Integration.create({
98
- name: 'test-integration',
99
- type: 'api',
100
- displayName: 'Test Integration',
101
- description: 'Test',
102
- category: 'CRM'
103
- });
104
- mockIntegrationRepository.integrations.set('test-integration', integration);
105
- });
106
-
107
- describe('execute()', () => {
108
- test('successfully adds API module to integration', async () => {
109
- const request = {
110
- integrationName: 'test-integration',
111
- moduleName: 'salesforce',
112
- moduleVersion: '1.0.0',
113
- source: 'local'
114
- };
115
-
116
- const result = await useCase.execute(request);
117
-
118
- expect(result.success).toBe(true);
119
- expect(result.message).toContain("API module 'salesforce' added");
120
- expect(result.integration.apiModules).toHaveLength(1);
121
- expect(result.integration.apiModules[0].name).toBe('salesforce');
122
- expect(mockIntegrationRepository.saveCalled).toBe(true);
123
- expect(mockUnitOfWork.committed).toBe(true);
124
- });
125
-
126
- test('adds module with correct version', async () => {
127
- const request = {
128
- integrationName: 'test-integration',
129
- moduleName: 'salesforce',
130
- moduleVersion: '2.3.0'
131
- };
132
-
133
- const result = await useCase.execute(request);
134
-
135
- expect(result.success).toBe(true);
136
- expect(result.integration.apiModules[0].version).toBe('2.3.0');
137
- });
138
-
139
- test('defaults version to 1.0.0 when not provided', async () => {
140
- const request = {
141
- integrationName: 'test-integration',
142
- moduleName: 'salesforce'
143
- };
144
-
145
- const result = await useCase.execute(request);
146
-
147
- expect(result.success).toBe(true);
148
- expect(result.integration.apiModules[0].version).toBe('1.0.0');
149
- });
150
-
151
- test('defaults source to local when not provided', async () => {
152
- const request = {
153
- integrationName: 'test-integration',
154
- moduleName: 'salesforce'
155
- };
156
-
157
- const result = await useCase.execute(request);
158
-
159
- expect(result.success).toBe(true);
160
- expect(result.integration.apiModules[0].source).toBe('local');
161
- });
162
-
163
- test('allows custom source', async () => {
164
- const request = {
165
- integrationName: 'test-integration',
166
- moduleName: 'salesforce',
167
- source: 'npm'
168
- };
169
-
170
- const result = await useCase.execute(request);
171
-
172
- expect(result.success).toBe(true);
173
- expect(result.integration.apiModules[0].source).toBe('npm');
174
- });
175
-
176
- test('throws error when integration not found', async () => {
177
- const request = {
178
- integrationName: 'non-existent',
179
- moduleName: 'salesforce'
180
- };
181
-
182
- await expect(useCase.execute(request)).rejects.toThrow(ValidationException);
183
- await expect(useCase.execute(request)).rejects.toThrow("Integration 'non-existent' not found");
184
- expect(mockUnitOfWork.rolledBack).toBe(true);
185
- });
186
-
187
- test('throws error when API module does not exist', async () => {
188
- const request = {
189
- integrationName: 'test-integration',
190
- moduleName: 'non-existent-module'
191
- };
192
-
193
- await expect(useCase.execute(request)).rejects.toThrow(ValidationException);
194
- await expect(useCase.execute(request)).rejects.toThrow("API module 'non-existent-module' not found");
195
- await expect(useCase.execute(request)).rejects.toThrow('Create it first');
196
- expect(mockUnitOfWork.rolledBack).toBe(true);
197
- });
198
-
199
- test('throws error when API module already added', async () => {
200
- // First add
201
- await useCase.execute({
202
- integrationName: 'test-integration',
203
- moduleName: 'salesforce'
204
- });
205
-
206
- // Try to add again
207
- const request = {
208
- integrationName: 'test-integration',
209
- moduleName: 'salesforce'
210
- };
211
-
212
- await expect(useCase.execute(request)).rejects.toThrow();
213
- await expect(useCase.execute(request)).rejects.toThrow('already added');
214
- expect(mockUnitOfWork.rolledBack).toBe(true);
215
- });
216
-
217
- test('calls validator with correct parameters', async () => {
218
- const request = {
219
- integrationName: 'test-integration',
220
- moduleName: 'salesforce',
221
- moduleVersion: '1.5.0'
222
- };
223
-
224
- await useCase.execute(request);
225
-
226
- expect(mockValidator.validateCalled).toBe(true);
227
- });
228
-
229
- test('throws error when validation fails', async () => {
230
- mockValidator.shouldFail = true;
231
- mockValidator.errors = ['Some validation error'];
232
-
233
- const request = {
234
- integrationName: 'test-integration',
235
- moduleName: 'salesforce'
236
- };
237
-
238
- await expect(useCase.execute(request)).rejects.toThrow(ValidationException);
239
- expect(mockUnitOfWork.rolledBack).toBe(true);
240
- });
241
-
242
- test('commits transaction only after all operations succeed', async () => {
243
- const request = {
244
- integrationName: 'test-integration',
245
- moduleName: 'salesforce'
246
- };
247
-
248
- await useCase.execute(request);
249
-
250
- expect(mockIntegrationRepository.saveCalled).toBe(true);
251
- expect(mockUnitOfWork.committed).toBe(true);
252
- expect(mockUnitOfWork.rolledBack).toBe(false);
253
- });
254
-
255
- test('rollsback on repository save error', async () => {
256
- mockIntegrationRepository.save = async () => {
257
- throw new Error('Database error');
258
- };
259
-
260
- const request = {
261
- integrationName: 'test-integration',
262
- moduleName: 'salesforce'
263
- };
264
-
265
- await expect(useCase.execute(request)).rejects.toThrow('Database error');
266
- expect(mockUnitOfWork.rolledBack).toBe(true);
267
- });
268
-
269
- test('allows adding multiple different API modules', async () => {
270
- await useCase.execute({
271
- integrationName: 'test-integration',
272
- moduleName: 'salesforce'
273
- });
274
-
275
- const result = await useCase.execute({
276
- integrationName: 'test-integration',
277
- moduleName: 'stripe'
278
- });
279
-
280
- expect(result.success).toBe(true);
281
- expect(result.integration.apiModules).toHaveLength(2);
282
- expect(result.integration.apiModules.map(m => m.name)).toContain('salesforce');
283
- expect(result.integration.apiModules.map(m => m.name)).toContain('stripe');
284
- });
285
-
286
- test('returns integration object with updated apiModules', async () => {
287
- const request = {
288
- integrationName: 'test-integration',
289
- moduleName: 'salesforce',
290
- moduleVersion: '1.0.0',
291
- source: 'local'
292
- };
293
-
294
- const result = await useCase.execute(request);
295
-
296
- expect(result.integration).toHaveProperty('id');
297
- expect(result.integration).toHaveProperty('name');
298
- expect(result.integration).toHaveProperty('version');
299
- expect(result.integration).toHaveProperty('apiModules');
300
- expect(result.integration.apiModules).toBeInstanceOf(Array);
301
- });
302
-
303
- test('preserves existing integration data', async () => {
304
- const integration = Integration.create({
305
- name: 'salesforce-sync',
306
- type: 'sync',
307
- displayName: 'Salesforce Sync',
308
- description: 'Sync data with Salesforce',
309
- category: 'CRM'
310
- });
311
- mockIntegrationRepository.integrations.set('salesforce-sync', integration);
312
-
313
- const request = {
314
- integrationName: 'salesforce-sync',
315
- moduleName: 'salesforce'
316
- };
317
-
318
- const result = await useCase.execute(request);
319
-
320
- expect(result.integration.name).toBe('salesforce-sync');
321
- expect(result.integration.type).toBe('sync');
322
- expect(result.integration.displayName).toBe('Salesforce Sync');
323
- expect(result.integration.description).toBe('Sync data with Salesforce');
324
- });
325
- });
326
- });