@friggframework/devtools 2.0.0-next.6 → 2.0.0-next.60

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 (357) hide show
  1. package/frigg-cli/README.md +1289 -0
  2. package/frigg-cli/__tests__/unit/commands/build.test.js +279 -0
  3. package/frigg-cli/__tests__/unit/commands/db-setup.test.js +649 -0
  4. package/frigg-cli/__tests__/unit/commands/deploy.test.js +320 -0
  5. package/frigg-cli/__tests__/unit/commands/doctor.test.js +309 -0
  6. package/frigg-cli/__tests__/unit/commands/install.test.js +400 -0
  7. package/frigg-cli/__tests__/unit/commands/ui.test.js +346 -0
  8. package/frigg-cli/__tests__/unit/dependencies.test.js +74 -0
  9. package/frigg-cli/__tests__/unit/utils/database-validator.test.js +397 -0
  10. package/frigg-cli/__tests__/unit/utils/error-messages.test.js +345 -0
  11. package/frigg-cli/__tests__/unit/version-detection.test.js +171 -0
  12. package/frigg-cli/__tests__/utils/mock-factory.js +270 -0
  13. package/frigg-cli/__tests__/utils/prisma-mock.js +194 -0
  14. package/frigg-cli/__tests__/utils/test-fixtures.js +463 -0
  15. package/frigg-cli/__tests__/utils/test-setup.js +287 -0
  16. package/frigg-cli/build-command/index.js +53 -14
  17. package/frigg-cli/db-setup-command/index.js +246 -0
  18. package/frigg-cli/deploy-command/SPEC-DEPLOY-DRY-RUN.md +981 -0
  19. package/frigg-cli/deploy-command/index.js +295 -17
  20. package/frigg-cli/doctor-command/index.js +335 -0
  21. package/frigg-cli/generate-command/__tests__/generate-command.test.js +301 -0
  22. package/frigg-cli/generate-command/azure-generator.js +43 -0
  23. package/frigg-cli/generate-command/gcp-generator.js +47 -0
  24. package/frigg-cli/generate-command/index.js +332 -0
  25. package/frigg-cli/generate-command/terraform-generator.js +555 -0
  26. package/frigg-cli/generate-iam-command.js +118 -0
  27. package/frigg-cli/index.js +142 -1
  28. package/frigg-cli/index.test.js +1 -4
  29. package/frigg-cli/init-command/backend-first-handler.js +756 -0
  30. package/frigg-cli/init-command/index.js +93 -0
  31. package/frigg-cli/init-command/template-handler.js +143 -0
  32. package/frigg-cli/install-command/index.js +1 -4
  33. package/frigg-cli/jest.config.js +124 -0
  34. package/frigg-cli/package.json +63 -0
  35. package/frigg-cli/repair-command/index.js +564 -0
  36. package/frigg-cli/start-command/index.js +125 -6
  37. package/frigg-cli/start-command/start-command.test.js +297 -0
  38. package/frigg-cli/test/init-command.test.js +180 -0
  39. package/frigg-cli/test/npm-registry.test.js +319 -0
  40. package/frigg-cli/ui-command/index.js +154 -0
  41. package/frigg-cli/utils/app-resolver.js +319 -0
  42. package/frigg-cli/utils/backend-path.js +16 -17
  43. package/frigg-cli/utils/database-validator.js +167 -0
  44. package/frigg-cli/utils/error-messages.js +329 -0
  45. package/frigg-cli/utils/npm-registry.js +167 -0
  46. package/frigg-cli/utils/process-manager.js +199 -0
  47. package/frigg-cli/utils/repo-detection.js +405 -0
  48. package/infrastructure/ARCHITECTURE.md +487 -0
  49. package/infrastructure/CLAUDE.md +481 -0
  50. package/infrastructure/HEALTH.md +468 -0
  51. package/infrastructure/README.md +522 -0
  52. package/infrastructure/__tests__/fixtures/mock-aws-resources.js +391 -0
  53. package/infrastructure/__tests__/helpers/test-utils.js +277 -0
  54. package/infrastructure/__tests__/postgres-config.test.js +914 -0
  55. package/infrastructure/__tests__/template-generation.test.js +687 -0
  56. package/infrastructure/create-frigg-infrastructure.js +129 -20
  57. package/infrastructure/docs/POSTGRES-CONFIGURATION.md +630 -0
  58. package/infrastructure/docs/PRE-DEPLOYMENT-HEALTH-CHECK-SPEC.md +1317 -0
  59. package/infrastructure/docs/WEBSOCKET-CONFIGURATION.md +105 -0
  60. package/infrastructure/docs/deployment-instructions.md +268 -0
  61. package/infrastructure/docs/generate-iam-command.md +278 -0
  62. package/infrastructure/docs/iam-policy-templates.md +193 -0
  63. package/infrastructure/domains/database/aurora-builder.js +809 -0
  64. package/infrastructure/domains/database/aurora-builder.test.js +950 -0
  65. package/infrastructure/domains/database/aurora-discovery.js +87 -0
  66. package/infrastructure/domains/database/aurora-discovery.test.js +188 -0
  67. package/infrastructure/domains/database/aurora-resolver.js +210 -0
  68. package/infrastructure/domains/database/aurora-resolver.test.js +347 -0
  69. package/infrastructure/domains/database/migration-builder.js +701 -0
  70. package/infrastructure/domains/database/migration-builder.test.js +321 -0
  71. package/infrastructure/domains/database/migration-resolver.js +163 -0
  72. package/infrastructure/domains/database/migration-resolver.test.js +337 -0
  73. package/infrastructure/domains/health/application/ports/IPropertyReconciler.js +164 -0
  74. package/infrastructure/domains/health/application/ports/IResourceDetector.js +129 -0
  75. package/infrastructure/domains/health/application/ports/IResourceImporter.js +142 -0
  76. package/infrastructure/domains/health/application/ports/IStackRepository.js +131 -0
  77. package/infrastructure/domains/health/application/ports/index.js +26 -0
  78. package/infrastructure/domains/health/application/use-cases/__tests__/execute-resource-import-use-case.test.js +679 -0
  79. package/infrastructure/domains/health/application/use-cases/__tests__/mismatch-analyzer-method-name.test.js +167 -0
  80. package/infrastructure/domains/health/application/use-cases/__tests__/repair-via-import-use-case.test.js +1130 -0
  81. package/infrastructure/domains/health/application/use-cases/execute-resource-import-use-case.js +221 -0
  82. package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.js +152 -0
  83. package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.test.js +343 -0
  84. package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.js +535 -0
  85. package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.test.js +376 -0
  86. package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.js +213 -0
  87. package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.test.js +441 -0
  88. package/infrastructure/domains/health/docs/ACME-DEV-DRIFT-ANALYSIS.md +267 -0
  89. package/infrastructure/domains/health/docs/BUILD-VS-DEPLOYED-TEMPLATE-ANALYSIS.md +324 -0
  90. package/infrastructure/domains/health/docs/ORPHAN-DETECTION-ANALYSIS.md +386 -0
  91. package/infrastructure/domains/health/docs/SPEC-CLEANUP-COMMAND.md +1419 -0
  92. package/infrastructure/domains/health/docs/TDD-IMPLEMENTATION-SUMMARY.md +391 -0
  93. package/infrastructure/domains/health/docs/TEMPLATE-COMPARISON-IMPLEMENTATION.md +551 -0
  94. package/infrastructure/domains/health/domain/entities/issue.js +299 -0
  95. package/infrastructure/domains/health/domain/entities/issue.test.js +528 -0
  96. package/infrastructure/domains/health/domain/entities/property-mismatch.js +108 -0
  97. package/infrastructure/domains/health/domain/entities/property-mismatch.test.js +275 -0
  98. package/infrastructure/domains/health/domain/entities/resource.js +159 -0
  99. package/infrastructure/domains/health/domain/entities/resource.test.js +432 -0
  100. package/infrastructure/domains/health/domain/entities/stack-health-report.js +306 -0
  101. package/infrastructure/domains/health/domain/entities/stack-health-report.test.js +601 -0
  102. package/infrastructure/domains/health/domain/services/__tests__/health-score-percentage-based.test.js +380 -0
  103. package/infrastructure/domains/health/domain/services/__tests__/import-progress-monitor.test.js +971 -0
  104. package/infrastructure/domains/health/domain/services/__tests__/import-template-generator.test.js +1150 -0
  105. package/infrastructure/domains/health/domain/services/__tests__/logical-id-mapper.test.js +672 -0
  106. package/infrastructure/domains/health/domain/services/__tests__/template-parser.test.js +496 -0
  107. package/infrastructure/domains/health/domain/services/__tests__/update-progress-monitor.test.js +419 -0
  108. package/infrastructure/domains/health/domain/services/health-score-calculator.js +248 -0
  109. package/infrastructure/domains/health/domain/services/health-score-calculator.test.js +504 -0
  110. package/infrastructure/domains/health/domain/services/import-progress-monitor.js +195 -0
  111. package/infrastructure/domains/health/domain/services/import-template-generator.js +435 -0
  112. package/infrastructure/domains/health/domain/services/logical-id-mapper.js +345 -0
  113. package/infrastructure/domains/health/domain/services/mismatch-analyzer.js +234 -0
  114. package/infrastructure/domains/health/domain/services/mismatch-analyzer.test.js +431 -0
  115. package/infrastructure/domains/health/domain/services/property-mutability-config.js +382 -0
  116. package/infrastructure/domains/health/domain/services/template-parser.js +245 -0
  117. package/infrastructure/domains/health/domain/services/update-progress-monitor.js +192 -0
  118. package/infrastructure/domains/health/domain/value-objects/health-score.js +138 -0
  119. package/infrastructure/domains/health/domain/value-objects/health-score.test.js +267 -0
  120. package/infrastructure/domains/health/domain/value-objects/property-mutability.js +161 -0
  121. package/infrastructure/domains/health/domain/value-objects/property-mutability.test.js +198 -0
  122. package/infrastructure/domains/health/domain/value-objects/resource-state.js +167 -0
  123. package/infrastructure/domains/health/domain/value-objects/resource-state.test.js +196 -0
  124. package/infrastructure/domains/health/domain/value-objects/stack-identifier.js +192 -0
  125. package/infrastructure/domains/health/domain/value-objects/stack-identifier.test.js +262 -0
  126. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-cfn-tagged.test.js +312 -0
  127. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-multi-stack.test.js +367 -0
  128. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-relationship-analysis.test.js +432 -0
  129. package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.js +784 -0
  130. package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.test.js +1133 -0
  131. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.js +565 -0
  132. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.test.js +554 -0
  133. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.js +318 -0
  134. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.test.js +398 -0
  135. package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.js +777 -0
  136. package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.test.js +580 -0
  137. package/infrastructure/domains/integration/integration-builder.js +404 -0
  138. package/infrastructure/domains/integration/integration-builder.test.js +690 -0
  139. package/infrastructure/domains/integration/integration-resolver.js +170 -0
  140. package/infrastructure/domains/integration/integration-resolver.test.js +369 -0
  141. package/infrastructure/domains/integration/websocket-builder.js +69 -0
  142. package/infrastructure/domains/integration/websocket-builder.test.js +195 -0
  143. package/infrastructure/domains/networking/vpc-builder.js +2051 -0
  144. package/infrastructure/domains/networking/vpc-builder.test.js +1960 -0
  145. package/infrastructure/domains/networking/vpc-discovery.js +177 -0
  146. package/infrastructure/domains/networking/vpc-discovery.test.js +350 -0
  147. package/infrastructure/domains/networking/vpc-resolver.js +505 -0
  148. package/infrastructure/domains/networking/vpc-resolver.test.js +801 -0
  149. package/infrastructure/domains/parameters/ssm-builder.js +79 -0
  150. package/infrastructure/domains/parameters/ssm-builder.test.js +189 -0
  151. package/infrastructure/domains/parameters/ssm-discovery.js +84 -0
  152. package/infrastructure/domains/parameters/ssm-discovery.test.js +210 -0
  153. package/infrastructure/domains/security/iam-generator.js +816 -0
  154. package/infrastructure/domains/security/iam-generator.test.js +204 -0
  155. package/infrastructure/domains/security/kms-builder.js +415 -0
  156. package/infrastructure/domains/security/kms-builder.test.js +392 -0
  157. package/infrastructure/domains/security/kms-discovery.js +80 -0
  158. package/infrastructure/domains/security/kms-discovery.test.js +177 -0
  159. package/infrastructure/domains/security/kms-resolver.js +96 -0
  160. package/infrastructure/domains/security/kms-resolver.test.js +216 -0
  161. package/infrastructure/domains/security/templates/frigg-deployment-iam-stack.yaml +401 -0
  162. package/infrastructure/domains/security/templates/iam-policy-basic.json +218 -0
  163. package/infrastructure/domains/security/templates/iam-policy-full.json +288 -0
  164. package/infrastructure/domains/shared/base-builder.js +112 -0
  165. package/infrastructure/domains/shared/base-resolver.js +186 -0
  166. package/infrastructure/domains/shared/base-resolver.test.js +305 -0
  167. package/infrastructure/domains/shared/builder-orchestrator.js +212 -0
  168. package/infrastructure/domains/shared/builder-orchestrator.test.js +213 -0
  169. package/infrastructure/domains/shared/cloudformation-discovery-v2.js +334 -0
  170. package/infrastructure/domains/shared/cloudformation-discovery.js +672 -0
  171. package/infrastructure/domains/shared/cloudformation-discovery.test.js +985 -0
  172. package/infrastructure/domains/shared/environment-builder.js +119 -0
  173. package/infrastructure/domains/shared/environment-builder.test.js +247 -0
  174. package/infrastructure/domains/shared/providers/aws-provider-adapter.js +579 -0
  175. package/infrastructure/domains/shared/providers/aws-provider-adapter.test.js +416 -0
  176. package/infrastructure/domains/shared/providers/azure-provider-adapter.stub.js +93 -0
  177. package/infrastructure/domains/shared/providers/cloud-provider-adapter.js +136 -0
  178. package/infrastructure/domains/shared/providers/gcp-provider-adapter.stub.js +82 -0
  179. package/infrastructure/domains/shared/providers/provider-factory.js +108 -0
  180. package/infrastructure/domains/shared/providers/provider-factory.test.js +170 -0
  181. package/infrastructure/domains/shared/resource-discovery.enhanced.test.js +306 -0
  182. package/infrastructure/domains/shared/resource-discovery.js +233 -0
  183. package/infrastructure/domains/shared/resource-discovery.test.js +588 -0
  184. package/infrastructure/domains/shared/types/app-definition.js +205 -0
  185. package/infrastructure/domains/shared/types/discovery-result.js +106 -0
  186. package/infrastructure/domains/shared/types/discovery-result.test.js +258 -0
  187. package/infrastructure/domains/shared/types/index.js +46 -0
  188. package/infrastructure/domains/shared/types/resource-ownership.js +108 -0
  189. package/infrastructure/domains/shared/types/resource-ownership.test.js +101 -0
  190. package/infrastructure/domains/shared/utilities/base-definition-factory.js +394 -0
  191. package/infrastructure/domains/shared/utilities/base-definition-factory.js.bak +338 -0
  192. package/infrastructure/domains/shared/utilities/base-definition-factory.test.js +291 -0
  193. package/infrastructure/domains/shared/utilities/handler-path-resolver.js +134 -0
  194. package/infrastructure/domains/shared/utilities/handler-path-resolver.test.js +268 -0
  195. package/infrastructure/domains/shared/utilities/prisma-layer-manager.js +159 -0
  196. package/infrastructure/domains/shared/utilities/prisma-layer-manager.test.js +444 -0
  197. package/infrastructure/domains/shared/validation/env-validator.js +78 -0
  198. package/infrastructure/domains/shared/validation/env-validator.test.js +173 -0
  199. package/infrastructure/domains/shared/validation/plugin-validator.js +187 -0
  200. package/infrastructure/domains/shared/validation/plugin-validator.test.js +323 -0
  201. package/infrastructure/esbuild.config.js +53 -0
  202. package/infrastructure/infrastructure-composer.js +117 -0
  203. package/infrastructure/infrastructure-composer.test.js +1895 -0
  204. package/infrastructure/integration.test.js +383 -0
  205. package/infrastructure/scripts/build-prisma-layer.js +701 -0
  206. package/infrastructure/scripts/build-prisma-layer.test.js +170 -0
  207. package/infrastructure/scripts/build-time-discovery.js +238 -0
  208. package/infrastructure/scripts/build-time-discovery.test.js +379 -0
  209. package/infrastructure/scripts/run-discovery.js +110 -0
  210. package/infrastructure/scripts/verify-prisma-layer.js +72 -0
  211. package/layers/prisma/.build-complete +3 -0
  212. package/layers/prisma/nodejs/package.json +8 -0
  213. package/management-ui/.eslintrc.js +22 -0
  214. package/management-ui/README.md +203 -0
  215. package/management-ui/components.json +21 -0
  216. package/management-ui/docs/phase2-integration-guide.md +320 -0
  217. package/management-ui/index.html +13 -0
  218. package/management-ui/package.json +76 -0
  219. package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +302 -0
  220. package/management-ui/postcss.config.js +6 -0
  221. package/management-ui/server/api/backend.js +256 -0
  222. package/management-ui/server/api/cli.js +315 -0
  223. package/management-ui/server/api/codegen.js +663 -0
  224. package/management-ui/server/api/connections.js +857 -0
  225. package/management-ui/server/api/discovery.js +185 -0
  226. package/management-ui/server/api/environment/index.js +1 -0
  227. package/management-ui/server/api/environment/router.js +378 -0
  228. package/management-ui/server/api/environment.js +328 -0
  229. package/management-ui/server/api/integrations.js +876 -0
  230. package/management-ui/server/api/logs.js +248 -0
  231. package/management-ui/server/api/monitoring.js +282 -0
  232. package/management-ui/server/api/open-ide.js +31 -0
  233. package/management-ui/server/api/project.js +1029 -0
  234. package/management-ui/server/api/users/sessions.js +371 -0
  235. package/management-ui/server/api/users/simulation.js +254 -0
  236. package/management-ui/server/api/users.js +362 -0
  237. package/management-ui/server/api-contract.md +275 -0
  238. package/management-ui/server/index.js +873 -0
  239. package/management-ui/server/middleware/errorHandler.js +93 -0
  240. package/management-ui/server/middleware/security.js +32 -0
  241. package/management-ui/server/processManager.js +296 -0
  242. package/management-ui/server/server.js +346 -0
  243. package/management-ui/server/services/aws-monitor.js +413 -0
  244. package/management-ui/server/services/npm-registry.js +347 -0
  245. package/management-ui/server/services/template-engine.js +538 -0
  246. package/management-ui/server/utils/cliIntegration.js +220 -0
  247. package/management-ui/server/utils/environment/auditLogger.js +471 -0
  248. package/management-ui/server/utils/environment/awsParameterStore.js +275 -0
  249. package/management-ui/server/utils/environment/encryption.js +278 -0
  250. package/management-ui/server/utils/environment/envFileManager.js +286 -0
  251. package/management-ui/server/utils/import-commonjs.js +28 -0
  252. package/management-ui/server/utils/response.js +83 -0
  253. package/management-ui/server/websocket/handler.js +325 -0
  254. package/management-ui/src/App.jsx +25 -0
  255. package/management-ui/src/assets/FriggLogo.svg +1 -0
  256. package/management-ui/src/components/AppRouter.jsx +65 -0
  257. package/management-ui/src/components/Button.jsx +70 -0
  258. package/management-ui/src/components/Card.jsx +97 -0
  259. package/management-ui/src/components/EnvironmentCompare.jsx +400 -0
  260. package/management-ui/src/components/EnvironmentEditor.jsx +372 -0
  261. package/management-ui/src/components/EnvironmentImportExport.jsx +469 -0
  262. package/management-ui/src/components/EnvironmentSchema.jsx +491 -0
  263. package/management-ui/src/components/EnvironmentSecurity.jsx +463 -0
  264. package/management-ui/src/components/ErrorBoundary.jsx +73 -0
  265. package/management-ui/src/components/IntegrationCard.jsx +481 -0
  266. package/management-ui/src/components/IntegrationCardEnhanced.jsx +770 -0
  267. package/management-ui/src/components/IntegrationExplorer.jsx +379 -0
  268. package/management-ui/src/components/IntegrationStatus.jsx +336 -0
  269. package/management-ui/src/components/Layout.jsx +716 -0
  270. package/management-ui/src/components/LoadingSpinner.jsx +113 -0
  271. package/management-ui/src/components/RepositoryPicker.jsx +248 -0
  272. package/management-ui/src/components/SessionMonitor.jsx +350 -0
  273. package/management-ui/src/components/StatusBadge.jsx +208 -0
  274. package/management-ui/src/components/UserContextSwitcher.jsx +212 -0
  275. package/management-ui/src/components/UserSimulation.jsx +327 -0
  276. package/management-ui/src/components/Welcome.jsx +434 -0
  277. package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +637 -0
  278. package/management-ui/src/components/codegen/APIModuleSelector.jsx +227 -0
  279. package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +247 -0
  280. package/management-ui/src/components/codegen/CodePreviewEditor.jsx +316 -0
  281. package/management-ui/src/components/codegen/DynamicModuleForm.jsx +271 -0
  282. package/management-ui/src/components/codegen/FormBuilder.jsx +737 -0
  283. package/management-ui/src/components/codegen/IntegrationGenerator.jsx +855 -0
  284. package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +797 -0
  285. package/management-ui/src/components/codegen/SchemaBuilder.jsx +303 -0
  286. package/management-ui/src/components/codegen/TemplateSelector.jsx +586 -0
  287. package/management-ui/src/components/codegen/index.js +10 -0
  288. package/management-ui/src/components/connections/ConnectionConfigForm.jsx +362 -0
  289. package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +182 -0
  290. package/management-ui/src/components/connections/ConnectionTester.jsx +200 -0
  291. package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +292 -0
  292. package/management-ui/src/components/connections/OAuthFlow.jsx +204 -0
  293. package/management-ui/src/components/connections/index.js +5 -0
  294. package/management-ui/src/components/index.js +21 -0
  295. package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +222 -0
  296. package/management-ui/src/components/monitoring/LambdaMetrics.jsx +169 -0
  297. package/management-ui/src/components/monitoring/MetricsChart.jsx +197 -0
  298. package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +393 -0
  299. package/management-ui/src/components/monitoring/SQSMetrics.jsx +246 -0
  300. package/management-ui/src/components/monitoring/index.js +6 -0
  301. package/management-ui/src/components/monitoring/monitoring.css +218 -0
  302. package/management-ui/src/components/theme-provider.jsx +52 -0
  303. package/management-ui/src/components/theme-toggle.jsx +39 -0
  304. package/management-ui/src/components/ui/badge.tsx +36 -0
  305. package/management-ui/src/components/ui/button.test.jsx +56 -0
  306. package/management-ui/src/components/ui/button.tsx +57 -0
  307. package/management-ui/src/components/ui/card.tsx +76 -0
  308. package/management-ui/src/components/ui/dropdown-menu.tsx +199 -0
  309. package/management-ui/src/components/ui/select.tsx +157 -0
  310. package/management-ui/src/components/ui/skeleton.jsx +15 -0
  311. package/management-ui/src/hooks/useFrigg.jsx +387 -0
  312. package/management-ui/src/hooks/useSocket.jsx +58 -0
  313. package/management-ui/src/index.css +193 -0
  314. package/management-ui/src/lib/utils.ts +6 -0
  315. package/management-ui/src/main.jsx +10 -0
  316. package/management-ui/src/pages/CodeGeneration.jsx +14 -0
  317. package/management-ui/src/pages/Connections.jsx +252 -0
  318. package/management-ui/src/pages/ConnectionsEnhanced.jsx +633 -0
  319. package/management-ui/src/pages/Dashboard.jsx +311 -0
  320. package/management-ui/src/pages/Environment.jsx +314 -0
  321. package/management-ui/src/pages/IntegrationConfigure.jsx +669 -0
  322. package/management-ui/src/pages/IntegrationDiscovery.jsx +567 -0
  323. package/management-ui/src/pages/IntegrationTest.jsx +742 -0
  324. package/management-ui/src/pages/Integrations.jsx +253 -0
  325. package/management-ui/src/pages/Monitoring.jsx +17 -0
  326. package/management-ui/src/pages/Simulation.jsx +155 -0
  327. package/management-ui/src/pages/Users.jsx +492 -0
  328. package/management-ui/src/services/api.js +41 -0
  329. package/management-ui/src/services/apiModuleService.js +193 -0
  330. package/management-ui/src/services/websocket-handlers.js +120 -0
  331. package/management-ui/src/test/api/project.test.js +273 -0
  332. package/management-ui/src/test/components/Welcome.test.jsx +378 -0
  333. package/management-ui/src/test/mocks/server.js +178 -0
  334. package/management-ui/src/test/setup.js +61 -0
  335. package/management-ui/src/test/utils/test-utils.jsx +134 -0
  336. package/management-ui/src/utils/repository.js +98 -0
  337. package/management-ui/src/utils/repository.test.js +118 -0
  338. package/management-ui/src/workflows/phase2-integration-workflows.js +884 -0
  339. package/management-ui/tailwind.config.js +63 -0
  340. package/management-ui/tsconfig.json +37 -0
  341. package/management-ui/tsconfig.node.json +10 -0
  342. package/management-ui/vite.config.js +26 -0
  343. package/management-ui/vitest.config.js +38 -0
  344. package/package.json +35 -14
  345. package/test/index.js +2 -4
  346. package/test/mock-integration.js +4 -14
  347. package/infrastructure/app-handler-helpers.js +0 -57
  348. package/infrastructure/backend-utils.js +0 -87
  349. package/infrastructure/routers/auth.js +0 -26
  350. package/infrastructure/routers/integration-defined-routers.js +0 -42
  351. package/infrastructure/routers/middleware/loadUser.js +0 -15
  352. package/infrastructure/routers/middleware/requireLoggedInUser.js +0 -12
  353. package/infrastructure/routers/user.js +0 -41
  354. package/infrastructure/routers/websocket.js +0 -55
  355. package/infrastructure/serverless-template.js +0 -291
  356. package/infrastructure/workers/integration-defined-workers.js +0 -24
  357. package/test/auther-definition-tester.js +0 -125
@@ -0,0 +1,649 @@
1
+ // Mock all dependencies BEFORE importing dbSetupCommand
2
+ const mockValidator = {
3
+ validateDatabaseUrl: jest.fn(),
4
+ getDatabaseType: jest.fn(),
5
+ testDatabaseConnection: jest.fn(),
6
+ checkPrismaClientGenerated: jest.fn(),
7
+ };
8
+
9
+ const mockRunner = {
10
+ runPrismaGenerate: jest.fn(),
11
+ checkDatabaseState: jest.fn(),
12
+ runPrismaMigrate: jest.fn(),
13
+ runPrismaDbPush: jest.fn(),
14
+ getMigrationCommand: jest.fn(),
15
+ };
16
+
17
+ const mockErrorMessages = {
18
+ getDatabaseUrlMissingError: jest.fn(),
19
+ getDatabaseTypeNotConfiguredError: jest.fn(),
20
+ getDatabaseConnectionError: jest.fn(),
21
+ getPrismaCommandError: jest.fn(),
22
+ getDatabaseSetupSuccess: jest.fn(),
23
+ };
24
+
25
+ jest.mock('../../../utils/database-validator', () => mockValidator);
26
+ jest.mock(
27
+ '@friggframework/core/database/utils/prisma-runner',
28
+ () => mockRunner
29
+ );
30
+ jest.mock('../../../utils/error-messages', () => mockErrorMessages);
31
+ jest.mock('dotenv');
32
+
33
+ const { dbSetupCommand } = require('../../../db-setup-command');
34
+ const {
35
+ createMockDatabaseValidator,
36
+ createMockPrismaRunner,
37
+ } = require('../../utils/prisma-mock');
38
+
39
+ const dotenv = require('dotenv');
40
+
41
+ describe('DB Setup Command', () => {
42
+ let mockConsoleLog;
43
+ let mockConsoleError;
44
+ let mockProcessExit;
45
+
46
+ beforeEach(() => {
47
+ // Set up default mock return values using the factory utilities
48
+ const defaultValidator = createMockDatabaseValidator();
49
+ const defaultRunner = createMockPrismaRunner();
50
+
51
+ // Apply default implementations
52
+ mockValidator.validateDatabaseUrl.mockImplementation(
53
+ defaultValidator.validateDatabaseUrl
54
+ );
55
+ mockValidator.getDatabaseType.mockImplementation(
56
+ defaultValidator.getDatabaseType
57
+ );
58
+ mockValidator.testDatabaseConnection.mockImplementation(
59
+ defaultValidator.testDatabaseConnection
60
+ );
61
+ mockValidator.checkPrismaClientGenerated.mockImplementation(
62
+ defaultValidator.checkPrismaClientGenerated
63
+ );
64
+
65
+ mockRunner.runPrismaGenerate.mockImplementation(
66
+ defaultRunner.runPrismaGenerate
67
+ );
68
+ mockRunner.checkDatabaseState.mockImplementation(
69
+ defaultRunner.checkDatabaseState
70
+ );
71
+ mockRunner.runPrismaMigrate.mockImplementation(
72
+ defaultRunner.runPrismaMigrate
73
+ );
74
+ mockRunner.runPrismaDbPush.mockImplementation(
75
+ defaultRunner.runPrismaDbPush
76
+ );
77
+ mockRunner.getMigrationCommand.mockImplementation(
78
+ defaultRunner.getMigrationCommand
79
+ );
80
+
81
+ // Mock dotenv
82
+ dotenv.config = jest.fn();
83
+
84
+ // Mock console and process.exit
85
+ mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();
86
+ mockConsoleError = jest.spyOn(console, 'error').mockImplementation();
87
+ mockProcessExit = jest.spyOn(process, 'exit').mockImplementation();
88
+
89
+ // Mock error message functions with default return values
90
+ mockErrorMessages.getDatabaseUrlMissingError.mockReturnValue(
91
+ 'DATABASE_URL missing error'
92
+ );
93
+ mockErrorMessages.getDatabaseTypeNotConfiguredError.mockReturnValue(
94
+ 'DB type error'
95
+ );
96
+ mockErrorMessages.getDatabaseConnectionError.mockReturnValue(
97
+ 'Connection error'
98
+ );
99
+ mockErrorMessages.getPrismaCommandError.mockReturnValue('Prisma error');
100
+ mockErrorMessages.getDatabaseSetupSuccess.mockReturnValue(
101
+ 'Success message'
102
+ );
103
+ });
104
+
105
+ afterEach(() => {
106
+ mockConsoleLog.mockRestore();
107
+ mockConsoleError.mockRestore();
108
+ mockProcessExit.mockRestore();
109
+ jest.clearAllMocks();
110
+ });
111
+
112
+ describe('Success Cases', () => {
113
+ it('should complete setup successfully for MongoDB', async () => {
114
+ mockValidator.getDatabaseType.mockReturnValue({
115
+ dbType: 'mongodb',
116
+ });
117
+ mockValidator.checkPrismaClientGenerated.mockReturnValue({
118
+ generated: false, // Client doesn't exist, will generate
119
+ });
120
+ mockRunner.checkDatabaseState.mockResolvedValue({
121
+ upToDate: false,
122
+ });
123
+
124
+ await dbSetupCommand({ verbose: false, stage: 'development' });
125
+
126
+ expect(mockValidator.validateDatabaseUrl).toHaveBeenCalled();
127
+ expect(mockValidator.getDatabaseType).toHaveBeenCalled();
128
+ expect(
129
+ mockValidator.checkPrismaClientGenerated
130
+ ).toHaveBeenCalledWith('mongodb');
131
+ expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith(
132
+ 'mongodb',
133
+ false
134
+ );
135
+ expect(mockRunner.runPrismaDbPush).toHaveBeenCalled();
136
+ expect(mockProcessExit).not.toHaveBeenCalled();
137
+ });
138
+
139
+ it('should treat DocumentDB as Mongo-compatible for schema pushes', async () => {
140
+ mockValidator.getDatabaseType.mockReturnValue({
141
+ dbType: 'documentdb',
142
+ });
143
+ mockValidator.checkPrismaClientGenerated.mockReturnValue({
144
+ generated: false,
145
+ });
146
+ mockRunner.checkDatabaseState.mockResolvedValue({
147
+ upToDate: false,
148
+ });
149
+
150
+ await dbSetupCommand({ verbose: false, stage: 'development' });
151
+
152
+ expect(
153
+ mockValidator.checkPrismaClientGenerated
154
+ ).toHaveBeenCalledWith('documentdb');
155
+ expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith(
156
+ 'mongodb',
157
+ false
158
+ );
159
+ expect(mockRunner.runPrismaDbPush).toHaveBeenCalled();
160
+ expect(mockConsoleLog).toHaveBeenCalledWith(
161
+ expect.stringContaining('AWS DocumentDB (MongoDB-compatible)')
162
+ );
163
+ });
164
+
165
+ it('should complete setup successfully for PostgreSQL', async () => {
166
+ mockValidator.getDatabaseType.mockReturnValue({
167
+ dbType: 'postgresql',
168
+ });
169
+ mockValidator.checkPrismaClientGenerated.mockReturnValue({
170
+ generated: false, // Client doesn't exist, will generate
171
+ });
172
+ mockRunner.checkDatabaseState.mockResolvedValue({
173
+ upToDate: false,
174
+ });
175
+
176
+ await dbSetupCommand({ verbose: false, stage: 'development' });
177
+
178
+ expect(
179
+ mockValidator.checkPrismaClientGenerated
180
+ ).toHaveBeenCalledWith('postgresql');
181
+ expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith(
182
+ 'postgresql',
183
+ false
184
+ );
185
+ expect(mockRunner.runPrismaMigrate).toHaveBeenCalled();
186
+ expect(mockProcessExit).not.toHaveBeenCalled();
187
+ });
188
+
189
+ it('should skip migrations when already up-to-date (PostgreSQL)', async () => {
190
+ mockValidator.getDatabaseType.mockReturnValue({
191
+ dbType: 'postgresql',
192
+ });
193
+ mockRunner.checkDatabaseState.mockResolvedValue({ upToDate: true });
194
+ mockRunner.getMigrationCommand.mockReturnValue('deploy');
195
+
196
+ await dbSetupCommand({ verbose: false, stage: 'production' });
197
+
198
+ expect(mockRunner.runPrismaMigrate).not.toHaveBeenCalled();
199
+ expect(mockConsoleLog).toHaveBeenCalledWith(
200
+ expect.stringContaining('already up-to-date')
201
+ );
202
+ });
203
+
204
+ it('should use migrate dev in development stage', async () => {
205
+ mockValidator.getDatabaseType.mockReturnValue({
206
+ dbType: 'postgresql',
207
+ });
208
+ mockRunner.getMigrationCommand.mockReturnValue('dev');
209
+ mockRunner.checkDatabaseState.mockResolvedValue({
210
+ upToDate: false,
211
+ });
212
+
213
+ await dbSetupCommand({ verbose: false, stage: 'development' });
214
+
215
+ expect(mockRunner.getMigrationCommand).toHaveBeenCalledWith(
216
+ 'development'
217
+ );
218
+ expect(mockRunner.runPrismaMigrate).toHaveBeenCalledWith(
219
+ 'dev',
220
+ false
221
+ );
222
+ });
223
+
224
+ it('should use migrate deploy in production stage', async () => {
225
+ mockValidator.getDatabaseType.mockReturnValue({
226
+ dbType: 'postgresql',
227
+ });
228
+ mockRunner.getMigrationCommand.mockReturnValue('deploy');
229
+ mockRunner.checkDatabaseState.mockResolvedValue({
230
+ upToDate: false,
231
+ });
232
+
233
+ await dbSetupCommand({ verbose: false, stage: 'production' });
234
+
235
+ expect(mockRunner.getMigrationCommand).toHaveBeenCalledWith(
236
+ 'production'
237
+ );
238
+ expect(mockRunner.runPrismaMigrate).toHaveBeenCalledWith(
239
+ 'deploy',
240
+ false
241
+ );
242
+ });
243
+
244
+ it('should respect --verbose flag', async () => {
245
+ mockValidator.checkPrismaClientGenerated.mockReturnValue({
246
+ generated: false, // Client doesn't exist, will generate
247
+ });
248
+
249
+ await dbSetupCommand({ verbose: true, stage: 'development' });
250
+
251
+ expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith(
252
+ 'mongodb',
253
+ true
254
+ );
255
+ });
256
+
257
+ it('should load .env file from project root', async () => {
258
+ await dbSetupCommand({ verbose: false, stage: 'development' });
259
+
260
+ expect(dotenv.config).toHaveBeenCalledWith(
261
+ expect.objectContaining({
262
+ path: expect.stringContaining('.env'),
263
+ })
264
+ );
265
+ });
266
+ });
267
+
268
+ describe('Conditional Client Generation', () => {
269
+ it('should skip generation when client already exists', async () => {
270
+ // Client exists
271
+ mockValidator.checkPrismaClientGenerated.mockReturnValue({
272
+ generated: true,
273
+ path: '/path/to/client',
274
+ });
275
+
276
+ await dbSetupCommand({ verbose: false, stage: 'development' });
277
+
278
+ // Should check if client exists
279
+ expect(
280
+ mockValidator.checkPrismaClientGenerated
281
+ ).toHaveBeenCalledWith('mongodb');
282
+ // Should NOT call generate
283
+ expect(mockRunner.runPrismaGenerate).not.toHaveBeenCalled();
284
+ expect(mockProcessExit).not.toHaveBeenCalled();
285
+ });
286
+
287
+ it('should generate client when it does not exist', async () => {
288
+ // Client does NOT exist
289
+ mockValidator.checkPrismaClientGenerated.mockReturnValue({
290
+ generated: false,
291
+ error: 'Client not found',
292
+ });
293
+
294
+ await dbSetupCommand({ verbose: false, stage: 'development' });
295
+
296
+ // Should check if client exists
297
+ expect(
298
+ mockValidator.checkPrismaClientGenerated
299
+ ).toHaveBeenCalledWith('mongodb');
300
+ // Should call generate
301
+ expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith(
302
+ 'mongodb',
303
+ false
304
+ );
305
+ // Should complete setup
306
+ expect(mockProcessExit).not.toHaveBeenCalled();
307
+ });
308
+
309
+ it('should regenerate client when --force flag is provided', async () => {
310
+ // Client exists
311
+ mockValidator.checkPrismaClientGenerated.mockReturnValue({
312
+ generated: true,
313
+ path: '/path/to/client',
314
+ });
315
+
316
+ await dbSetupCommand({
317
+ verbose: false,
318
+ stage: 'development',
319
+ force: true,
320
+ });
321
+
322
+ // Should check if client exists
323
+ expect(
324
+ mockValidator.checkPrismaClientGenerated
325
+ ).toHaveBeenCalledWith('mongodb');
326
+ // Should STILL call generate because of --force
327
+ expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith(
328
+ 'mongodb',
329
+ false
330
+ );
331
+ // Should complete setup
332
+ expect(mockProcessExit).not.toHaveBeenCalled();
333
+ });
334
+
335
+ it('should show client location in verbose mode when skipping generation', async () => {
336
+ mockValidator.checkPrismaClientGenerated.mockReturnValue({
337
+ generated: true,
338
+ path: '/path/to/prisma/client',
339
+ });
340
+
341
+ await dbSetupCommand({ verbose: true, stage: 'development' });
342
+
343
+ // Should log the client path
344
+ expect(mockConsoleLog).toHaveBeenCalledWith(
345
+ expect.stringContaining('/path/to/prisma/client')
346
+ );
347
+ expect(mockRunner.runPrismaGenerate).not.toHaveBeenCalled();
348
+ });
349
+
350
+ it('should generate for different database types', async () => {
351
+ // Test PostgreSQL
352
+ mockValidator.getDatabaseType.mockReturnValue({
353
+ dbType: 'postgresql',
354
+ });
355
+ mockValidator.checkPrismaClientGenerated.mockReturnValue({
356
+ generated: false,
357
+ });
358
+ mockRunner.checkDatabaseState.mockResolvedValue({
359
+ upToDate: false,
360
+ });
361
+
362
+ await dbSetupCommand({ verbose: false, stage: 'development' });
363
+
364
+ expect(
365
+ mockValidator.checkPrismaClientGenerated
366
+ ).toHaveBeenCalledWith('postgresql');
367
+ expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith(
368
+ 'postgresql',
369
+ false
370
+ );
371
+ });
372
+ });
373
+
374
+ describe('Failure Cases - Validation', () => {
375
+ it('should fail when DATABASE_URL missing', async () => {
376
+ mockValidator.validateDatabaseUrl.mockReturnValue({
377
+ valid: false,
378
+ error: 'DATABASE_URL not found',
379
+ });
380
+
381
+ await dbSetupCommand({});
382
+
383
+ expect(mockConsoleError).toHaveBeenCalled();
384
+ expect(mockProcessExit).toHaveBeenCalledWith(1);
385
+ });
386
+
387
+ it('should fail when DATABASE_URL is empty', async () => {
388
+ mockValidator.validateDatabaseUrl.mockReturnValue({
389
+ valid: false,
390
+ error: 'DATABASE_URL is empty',
391
+ });
392
+
393
+ await dbSetupCommand({});
394
+
395
+ expect(
396
+ mockErrorMessages.getDatabaseUrlMissingError
397
+ ).toHaveBeenCalled();
398
+ expect(mockProcessExit).toHaveBeenCalledWith(1);
399
+ });
400
+
401
+ it('should fail when database type not configured', async () => {
402
+ mockValidator.getDatabaseType.mockReturnValue({
403
+ error: 'Database not configured',
404
+ });
405
+
406
+ await dbSetupCommand({});
407
+
408
+ expect(
409
+ mockErrorMessages.getDatabaseTypeNotConfiguredError
410
+ ).toHaveBeenCalled();
411
+ expect(mockProcessExit).toHaveBeenCalledWith(1);
412
+ });
413
+
414
+ it('should fail when backend definition not found', async () => {
415
+ mockValidator.getDatabaseType.mockReturnValue({
416
+ error: 'Backend not found',
417
+ });
418
+
419
+ await dbSetupCommand({});
420
+
421
+ expect(mockProcessExit).toHaveBeenCalledWith(1);
422
+ });
423
+ });
424
+
425
+ describe('Failure Cases - Prisma Operations', () => {
426
+ it('should fail when prisma generate fails', async () => {
427
+ mockValidator.checkPrismaClientGenerated.mockReturnValue({
428
+ generated: false, // Client doesn't exist, will attempt generation
429
+ });
430
+ mockRunner.runPrismaGenerate.mockResolvedValue({
431
+ success: false,
432
+ error: 'Generation failed',
433
+ });
434
+
435
+ await dbSetupCommand({});
436
+
437
+ expect(
438
+ mockErrorMessages.getPrismaCommandError
439
+ ).toHaveBeenCalledWith('generate', 'Generation failed');
440
+ expect(mockProcessExit).toHaveBeenCalledWith(1);
441
+ });
442
+
443
+ it('should fail when migrate dev fails (PostgreSQL)', async () => {
444
+ mockValidator.getDatabaseType.mockReturnValue({
445
+ dbType: 'postgresql',
446
+ });
447
+ mockRunner.getMigrationCommand.mockReturnValue('dev');
448
+ mockRunner.checkDatabaseState.mockResolvedValue({
449
+ upToDate: false,
450
+ });
451
+ mockRunner.runPrismaMigrate.mockResolvedValue({
452
+ success: false,
453
+ error: 'Migration failed',
454
+ });
455
+
456
+ await dbSetupCommand({ stage: 'development' });
457
+
458
+ expect(
459
+ mockErrorMessages.getPrismaCommandError
460
+ ).toHaveBeenCalledWith('migrate', 'Migration failed');
461
+ expect(mockProcessExit).toHaveBeenCalledWith(1);
462
+ });
463
+
464
+ it('should fail when migrate deploy fails (PostgreSQL)', async () => {
465
+ mockValidator.getDatabaseType.mockReturnValue({
466
+ dbType: 'postgresql',
467
+ });
468
+ mockRunner.getMigrationCommand.mockReturnValue('deploy');
469
+ mockRunner.checkDatabaseState.mockResolvedValue({
470
+ upToDate: false,
471
+ });
472
+ mockRunner.runPrismaMigrate.mockResolvedValue({
473
+ success: false,
474
+ error: 'Deploy failed',
475
+ });
476
+
477
+ await dbSetupCommand({ stage: 'production' });
478
+
479
+ expect(mockProcessExit).toHaveBeenCalledWith(1);
480
+ });
481
+
482
+ it('should fail when db push fails (MongoDB)', async () => {
483
+ mockRunner.runPrismaDbPush.mockResolvedValue({
484
+ success: false,
485
+ error: 'Push failed',
486
+ });
487
+
488
+ await dbSetupCommand({});
489
+
490
+ expect(
491
+ mockErrorMessages.getPrismaCommandError
492
+ ).toHaveBeenCalledWith('db push', 'Push failed');
493
+ expect(mockProcessExit).toHaveBeenCalledWith(1);
494
+ });
495
+
496
+ it('should fail when schema file missing', async () => {
497
+ mockValidator.checkPrismaClientGenerated.mockReturnValue({
498
+ generated: false, // Client doesn't exist, will attempt generation
499
+ });
500
+ mockRunner.runPrismaGenerate.mockResolvedValue({
501
+ success: false,
502
+ error: 'Schema not found',
503
+ });
504
+
505
+ await dbSetupCommand({});
506
+
507
+ expect(mockProcessExit).toHaveBeenCalledWith(1);
508
+ });
509
+ });
510
+
511
+ describe('Error Message Validation', () => {
512
+ it('should display helpful error for missing DATABASE_URL', async () => {
513
+ mockValidator.validateDatabaseUrl.mockReturnValue({
514
+ valid: false,
515
+ error: 'Not found',
516
+ });
517
+
518
+ await dbSetupCommand({});
519
+
520
+ expect(
521
+ mockErrorMessages.getDatabaseUrlMissingError
522
+ ).toHaveBeenCalled();
523
+ });
524
+
525
+ it('should display helpful error for Prisma failures', async () => {
526
+ mockValidator.checkPrismaClientGenerated.mockReturnValue({
527
+ generated: false, // Client doesn't exist, will attempt generation
528
+ });
529
+ mockRunner.runPrismaGenerate.mockResolvedValue({
530
+ success: false,
531
+ error: 'Some error',
532
+ output: 'Detailed output',
533
+ });
534
+
535
+ await dbSetupCommand({});
536
+
537
+ expect(mockErrorMessages.getPrismaCommandError).toHaveBeenCalled();
538
+ });
539
+
540
+ it('should exit with code 1 on failure', async () => {
541
+ mockValidator.validateDatabaseUrl.mockReturnValue({
542
+ valid: false,
543
+ });
544
+
545
+ await dbSetupCommand({});
546
+
547
+ expect(mockProcessExit).toHaveBeenCalledWith(1);
548
+ });
549
+
550
+ it('should not exit with code 0 on failure', async () => {
551
+ mockValidator.validateDatabaseUrl.mockReturnValue({
552
+ valid: false,
553
+ });
554
+
555
+ await dbSetupCommand({});
556
+
557
+ expect(mockProcessExit).not.toHaveBeenCalledWith(0);
558
+ });
559
+
560
+ it('should display success message on completion', async () => {
561
+ await dbSetupCommand({ stage: 'development' });
562
+
563
+ expect(
564
+ mockErrorMessages.getDatabaseSetupSuccess
565
+ ).toHaveBeenCalledWith('mongodb', 'development');
566
+ });
567
+ });
568
+
569
+ describe('Verbose Output', () => {
570
+ it('should show verbose output when flag enabled', async () => {
571
+ await dbSetupCommand({ verbose: true });
572
+
573
+ // Verbose calls should show console output
574
+ expect(mockConsoleLog).toHaveBeenCalled();
575
+ });
576
+
577
+ it('should pass verbose flag to Prisma commands', async () => {
578
+ mockValidator.checkPrismaClientGenerated.mockReturnValue({
579
+ generated: false, // Client doesn't exist, will generate
580
+ });
581
+
582
+ await dbSetupCommand({ verbose: true });
583
+
584
+ expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith(
585
+ 'mongodb',
586
+ true
587
+ );
588
+ expect(mockRunner.runPrismaDbPush).toHaveBeenCalledWith(true);
589
+ });
590
+
591
+ it('should not show verbose output when flag disabled', async () => {
592
+ mockValidator.checkPrismaClientGenerated.mockReturnValue({
593
+ generated: false, // Client doesn't exist, will generate
594
+ });
595
+
596
+ await dbSetupCommand({ verbose: false });
597
+
598
+ expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith(
599
+ 'mongodb',
600
+ false
601
+ );
602
+ });
603
+ });
604
+
605
+ describe('Stage Handling', () => {
606
+ it('should use provided stage option', async () => {
607
+ mockValidator.getDatabaseType.mockReturnValue({
608
+ dbType: 'postgresql',
609
+ });
610
+ mockRunner.checkDatabaseState.mockResolvedValue({
611
+ upToDate: false,
612
+ });
613
+
614
+ await dbSetupCommand({ stage: 'production' });
615
+
616
+ expect(mockRunner.getMigrationCommand).toHaveBeenCalledWith(
617
+ 'production'
618
+ );
619
+ });
620
+
621
+ it('should default to development when no stage provided', async () => {
622
+ mockValidator.getDatabaseType.mockReturnValue({
623
+ dbType: 'postgresql',
624
+ });
625
+ mockRunner.checkDatabaseState.mockResolvedValue({
626
+ upToDate: false,
627
+ });
628
+
629
+ await dbSetupCommand({});
630
+
631
+ expect(mockRunner.getMigrationCommand).toHaveBeenCalled();
632
+ });
633
+
634
+ it('should handle different stage values', async () => {
635
+ mockValidator.getDatabaseType.mockReturnValue({
636
+ dbType: 'postgresql',
637
+ });
638
+ mockRunner.checkDatabaseState.mockResolvedValue({
639
+ upToDate: false,
640
+ });
641
+
642
+ await dbSetupCommand({ stage: 'staging' });
643
+
644
+ expect(mockRunner.getMigrationCommand).toHaveBeenCalledWith(
645
+ 'staging'
646
+ );
647
+ });
648
+ });
649
+ });