@friggframework/devtools 2.0.0-next.6 → 2.0.0-next.61
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.
- package/frigg-cli/README.md +1289 -0
- package/frigg-cli/__tests__/unit/commands/build.test.js +279 -0
- package/frigg-cli/__tests__/unit/commands/db-setup.test.js +649 -0
- package/frigg-cli/__tests__/unit/commands/deploy.test.js +320 -0
- package/frigg-cli/__tests__/unit/commands/doctor.test.js +309 -0
- package/frigg-cli/__tests__/unit/commands/install.test.js +400 -0
- package/frigg-cli/__tests__/unit/commands/ui.test.js +346 -0
- package/frigg-cli/__tests__/unit/dependencies.test.js +74 -0
- package/frigg-cli/__tests__/unit/utils/database-validator.test.js +397 -0
- package/frigg-cli/__tests__/unit/utils/error-messages.test.js +345 -0
- package/frigg-cli/__tests__/unit/version-detection.test.js +171 -0
- package/frigg-cli/__tests__/utils/mock-factory.js +270 -0
- package/frigg-cli/__tests__/utils/prisma-mock.js +194 -0
- package/frigg-cli/__tests__/utils/test-fixtures.js +463 -0
- package/frigg-cli/__tests__/utils/test-setup.js +287 -0
- package/frigg-cli/build-command/index.js +53 -14
- package/frigg-cli/db-setup-command/index.js +246 -0
- package/frigg-cli/deploy-command/SPEC-DEPLOY-DRY-RUN.md +981 -0
- package/frigg-cli/deploy-command/index.js +295 -17
- package/frigg-cli/doctor-command/index.js +335 -0
- package/frigg-cli/generate-command/__tests__/generate-command.test.js +301 -0
- package/frigg-cli/generate-command/azure-generator.js +43 -0
- package/frigg-cli/generate-command/gcp-generator.js +47 -0
- package/frigg-cli/generate-command/index.js +332 -0
- package/frigg-cli/generate-command/terraform-generator.js +555 -0
- package/frigg-cli/generate-iam-command.js +118 -0
- package/frigg-cli/index.js +142 -1
- package/frigg-cli/index.test.js +1 -4
- package/frigg-cli/init-command/backend-first-handler.js +756 -0
- package/frigg-cli/init-command/index.js +93 -0
- package/frigg-cli/init-command/template-handler.js +143 -0
- package/frigg-cli/install-command/index.js +1 -4
- package/frigg-cli/jest.config.js +124 -0
- package/frigg-cli/package.json +63 -0
- package/frigg-cli/repair-command/index.js +564 -0
- package/frigg-cli/start-command/index.js +125 -6
- package/frigg-cli/start-command/start-command.test.js +297 -0
- package/frigg-cli/test/init-command.test.js +180 -0
- package/frigg-cli/test/npm-registry.test.js +319 -0
- package/frigg-cli/ui-command/index.js +154 -0
- package/frigg-cli/utils/app-resolver.js +319 -0
- package/frigg-cli/utils/backend-path.js +16 -17
- package/frigg-cli/utils/database-validator.js +167 -0
- package/frigg-cli/utils/error-messages.js +329 -0
- package/frigg-cli/utils/npm-registry.js +167 -0
- package/frigg-cli/utils/process-manager.js +199 -0
- package/frigg-cli/utils/repo-detection.js +405 -0
- package/infrastructure/ARCHITECTURE.md +487 -0
- package/infrastructure/CLAUDE.md +481 -0
- package/infrastructure/HEALTH.md +468 -0
- package/infrastructure/README.md +522 -0
- package/infrastructure/__tests__/fixtures/mock-aws-resources.js +391 -0
- package/infrastructure/__tests__/helpers/test-utils.js +277 -0
- package/infrastructure/__tests__/postgres-config.test.js +914 -0
- package/infrastructure/__tests__/template-generation.test.js +687 -0
- package/infrastructure/create-frigg-infrastructure.js +129 -20
- package/infrastructure/docs/POSTGRES-CONFIGURATION.md +630 -0
- package/infrastructure/docs/PRE-DEPLOYMENT-HEALTH-CHECK-SPEC.md +1317 -0
- package/infrastructure/docs/WEBSOCKET-CONFIGURATION.md +105 -0
- package/infrastructure/docs/deployment-instructions.md +268 -0
- package/infrastructure/docs/generate-iam-command.md +278 -0
- package/infrastructure/docs/iam-policy-templates.md +193 -0
- package/infrastructure/domains/database/aurora-builder.js +809 -0
- package/infrastructure/domains/database/aurora-builder.test.js +950 -0
- package/infrastructure/domains/database/aurora-discovery.js +87 -0
- package/infrastructure/domains/database/aurora-discovery.test.js +188 -0
- package/infrastructure/domains/database/aurora-resolver.js +210 -0
- package/infrastructure/domains/database/aurora-resolver.test.js +347 -0
- package/infrastructure/domains/database/migration-builder.js +701 -0
- package/infrastructure/domains/database/migration-builder.test.js +321 -0
- package/infrastructure/domains/database/migration-resolver.js +163 -0
- package/infrastructure/domains/database/migration-resolver.test.js +337 -0
- package/infrastructure/domains/health/application/ports/IPropertyReconciler.js +164 -0
- package/infrastructure/domains/health/application/ports/IResourceDetector.js +129 -0
- package/infrastructure/domains/health/application/ports/IResourceImporter.js +142 -0
- package/infrastructure/domains/health/application/ports/IStackRepository.js +131 -0
- package/infrastructure/domains/health/application/ports/index.js +26 -0
- package/infrastructure/domains/health/application/use-cases/__tests__/execute-resource-import-use-case.test.js +679 -0
- package/infrastructure/domains/health/application/use-cases/__tests__/mismatch-analyzer-method-name.test.js +167 -0
- package/infrastructure/domains/health/application/use-cases/__tests__/repair-via-import-use-case.test.js +1130 -0
- package/infrastructure/domains/health/application/use-cases/execute-resource-import-use-case.js +221 -0
- package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.js +152 -0
- package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.test.js +343 -0
- package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.js +535 -0
- package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.test.js +376 -0
- package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.js +213 -0
- package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.test.js +441 -0
- package/infrastructure/domains/health/docs/ACME-DEV-DRIFT-ANALYSIS.md +267 -0
- package/infrastructure/domains/health/docs/BUILD-VS-DEPLOYED-TEMPLATE-ANALYSIS.md +324 -0
- package/infrastructure/domains/health/docs/ORPHAN-DETECTION-ANALYSIS.md +386 -0
- package/infrastructure/domains/health/docs/SPEC-CLEANUP-COMMAND.md +1419 -0
- package/infrastructure/domains/health/docs/TDD-IMPLEMENTATION-SUMMARY.md +391 -0
- package/infrastructure/domains/health/docs/TEMPLATE-COMPARISON-IMPLEMENTATION.md +551 -0
- package/infrastructure/domains/health/domain/entities/issue.js +299 -0
- package/infrastructure/domains/health/domain/entities/issue.test.js +528 -0
- package/infrastructure/domains/health/domain/entities/property-mismatch.js +108 -0
- package/infrastructure/domains/health/domain/entities/property-mismatch.test.js +275 -0
- package/infrastructure/domains/health/domain/entities/resource.js +159 -0
- package/infrastructure/domains/health/domain/entities/resource.test.js +432 -0
- package/infrastructure/domains/health/domain/entities/stack-health-report.js +306 -0
- package/infrastructure/domains/health/domain/entities/stack-health-report.test.js +601 -0
- package/infrastructure/domains/health/domain/services/__tests__/health-score-percentage-based.test.js +380 -0
- package/infrastructure/domains/health/domain/services/__tests__/import-progress-monitor.test.js +971 -0
- package/infrastructure/domains/health/domain/services/__tests__/import-template-generator.test.js +1150 -0
- package/infrastructure/domains/health/domain/services/__tests__/logical-id-mapper.test.js +672 -0
- package/infrastructure/domains/health/domain/services/__tests__/template-parser.test.js +496 -0
- package/infrastructure/domains/health/domain/services/__tests__/update-progress-monitor.test.js +419 -0
- package/infrastructure/domains/health/domain/services/health-score-calculator.js +248 -0
- package/infrastructure/domains/health/domain/services/health-score-calculator.test.js +504 -0
- package/infrastructure/domains/health/domain/services/import-progress-monitor.js +195 -0
- package/infrastructure/domains/health/domain/services/import-template-generator.js +435 -0
- package/infrastructure/domains/health/domain/services/logical-id-mapper.js +345 -0
- package/infrastructure/domains/health/domain/services/mismatch-analyzer.js +234 -0
- package/infrastructure/domains/health/domain/services/mismatch-analyzer.test.js +431 -0
- package/infrastructure/domains/health/domain/services/property-mutability-config.js +382 -0
- package/infrastructure/domains/health/domain/services/template-parser.js +245 -0
- package/infrastructure/domains/health/domain/services/update-progress-monitor.js +192 -0
- package/infrastructure/domains/health/domain/value-objects/health-score.js +138 -0
- package/infrastructure/domains/health/domain/value-objects/health-score.test.js +267 -0
- package/infrastructure/domains/health/domain/value-objects/property-mutability.js +161 -0
- package/infrastructure/domains/health/domain/value-objects/property-mutability.test.js +198 -0
- package/infrastructure/domains/health/domain/value-objects/resource-state.js +167 -0
- package/infrastructure/domains/health/domain/value-objects/resource-state.test.js +196 -0
- package/infrastructure/domains/health/domain/value-objects/stack-identifier.js +192 -0
- package/infrastructure/domains/health/domain/value-objects/stack-identifier.test.js +262 -0
- package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-cfn-tagged.test.js +312 -0
- package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-multi-stack.test.js +367 -0
- package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-relationship-analysis.test.js +432 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.js +784 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.test.js +1133 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.js +565 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.test.js +554 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.js +318 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.test.js +398 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.js +777 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.test.js +580 -0
- package/infrastructure/domains/integration/integration-builder.js +404 -0
- package/infrastructure/domains/integration/integration-builder.test.js +690 -0
- package/infrastructure/domains/integration/integration-resolver.js +170 -0
- package/infrastructure/domains/integration/integration-resolver.test.js +369 -0
- package/infrastructure/domains/integration/websocket-builder.js +69 -0
- package/infrastructure/domains/integration/websocket-builder.test.js +195 -0
- package/infrastructure/domains/networking/vpc-builder.js +2051 -0
- package/infrastructure/domains/networking/vpc-builder.test.js +1960 -0
- package/infrastructure/domains/networking/vpc-discovery.js +177 -0
- package/infrastructure/domains/networking/vpc-discovery.test.js +350 -0
- package/infrastructure/domains/networking/vpc-resolver.js +505 -0
- package/infrastructure/domains/networking/vpc-resolver.test.js +801 -0
- package/infrastructure/domains/parameters/ssm-builder.js +79 -0
- package/infrastructure/domains/parameters/ssm-builder.test.js +189 -0
- package/infrastructure/domains/parameters/ssm-discovery.js +84 -0
- package/infrastructure/domains/parameters/ssm-discovery.test.js +210 -0
- package/infrastructure/domains/security/iam-generator.js +816 -0
- package/infrastructure/domains/security/iam-generator.test.js +204 -0
- package/infrastructure/domains/security/kms-builder.js +415 -0
- package/infrastructure/domains/security/kms-builder.test.js +392 -0
- package/infrastructure/domains/security/kms-discovery.js +80 -0
- package/infrastructure/domains/security/kms-discovery.test.js +177 -0
- package/infrastructure/domains/security/kms-resolver.js +96 -0
- package/infrastructure/domains/security/kms-resolver.test.js +216 -0
- package/infrastructure/domains/security/templates/frigg-deployment-iam-stack.yaml +401 -0
- package/infrastructure/domains/security/templates/iam-policy-basic.json +218 -0
- package/infrastructure/domains/security/templates/iam-policy-full.json +288 -0
- package/infrastructure/domains/shared/base-builder.js +112 -0
- package/infrastructure/domains/shared/base-resolver.js +186 -0
- package/infrastructure/domains/shared/base-resolver.test.js +305 -0
- package/infrastructure/domains/shared/builder-orchestrator.js +212 -0
- package/infrastructure/domains/shared/builder-orchestrator.test.js +213 -0
- package/infrastructure/domains/shared/cloudformation-discovery-v2.js +334 -0
- package/infrastructure/domains/shared/cloudformation-discovery.js +672 -0
- package/infrastructure/domains/shared/cloudformation-discovery.test.js +985 -0
- package/infrastructure/domains/shared/environment-builder.js +119 -0
- package/infrastructure/domains/shared/environment-builder.test.js +247 -0
- package/infrastructure/domains/shared/providers/aws-provider-adapter.js +579 -0
- package/infrastructure/domains/shared/providers/aws-provider-adapter.test.js +416 -0
- package/infrastructure/domains/shared/providers/azure-provider-adapter.stub.js +93 -0
- package/infrastructure/domains/shared/providers/cloud-provider-adapter.js +136 -0
- package/infrastructure/domains/shared/providers/gcp-provider-adapter.stub.js +82 -0
- package/infrastructure/domains/shared/providers/provider-factory.js +108 -0
- package/infrastructure/domains/shared/providers/provider-factory.test.js +170 -0
- package/infrastructure/domains/shared/resource-discovery.enhanced.test.js +306 -0
- package/infrastructure/domains/shared/resource-discovery.js +233 -0
- package/infrastructure/domains/shared/resource-discovery.test.js +588 -0
- package/infrastructure/domains/shared/types/app-definition.js +205 -0
- package/infrastructure/domains/shared/types/discovery-result.js +106 -0
- package/infrastructure/domains/shared/types/discovery-result.test.js +258 -0
- package/infrastructure/domains/shared/types/index.js +46 -0
- package/infrastructure/domains/shared/types/resource-ownership.js +108 -0
- package/infrastructure/domains/shared/types/resource-ownership.test.js +101 -0
- package/infrastructure/domains/shared/utilities/base-definition-factory.js +394 -0
- package/infrastructure/domains/shared/utilities/base-definition-factory.js.bak +338 -0
- package/infrastructure/domains/shared/utilities/base-definition-factory.test.js +291 -0
- package/infrastructure/domains/shared/utilities/handler-path-resolver.js +134 -0
- package/infrastructure/domains/shared/utilities/handler-path-resolver.test.js +268 -0
- package/infrastructure/domains/shared/utilities/prisma-layer-manager.js +159 -0
- package/infrastructure/domains/shared/utilities/prisma-layer-manager.test.js +444 -0
- package/infrastructure/domains/shared/validation/env-validator.js +78 -0
- package/infrastructure/domains/shared/validation/env-validator.test.js +173 -0
- package/infrastructure/domains/shared/validation/plugin-validator.js +187 -0
- package/infrastructure/domains/shared/validation/plugin-validator.test.js +323 -0
- package/infrastructure/esbuild.config.js +53 -0
- package/infrastructure/infrastructure-composer.js +117 -0
- package/infrastructure/infrastructure-composer.test.js +1895 -0
- package/infrastructure/integration.test.js +383 -0
- package/infrastructure/scripts/build-prisma-layer.js +701 -0
- package/infrastructure/scripts/build-prisma-layer.test.js +170 -0
- package/infrastructure/scripts/build-time-discovery.js +238 -0
- package/infrastructure/scripts/build-time-discovery.test.js +379 -0
- package/infrastructure/scripts/run-discovery.js +110 -0
- package/infrastructure/scripts/verify-prisma-layer.js +72 -0
- package/layers/prisma/.build-complete +3 -0
- package/layers/prisma/nodejs/package.json +8 -0
- package/management-ui/.eslintrc.js +22 -0
- package/management-ui/README.md +203 -0
- package/management-ui/components.json +21 -0
- package/management-ui/docs/phase2-integration-guide.md +320 -0
- package/management-ui/index.html +13 -0
- package/management-ui/package.json +76 -0
- package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +302 -0
- package/management-ui/postcss.config.js +6 -0
- package/management-ui/server/api/backend.js +256 -0
- package/management-ui/server/api/cli.js +315 -0
- package/management-ui/server/api/codegen.js +663 -0
- package/management-ui/server/api/connections.js +857 -0
- package/management-ui/server/api/discovery.js +185 -0
- package/management-ui/server/api/environment/index.js +1 -0
- package/management-ui/server/api/environment/router.js +378 -0
- package/management-ui/server/api/environment.js +328 -0
- package/management-ui/server/api/integrations.js +876 -0
- package/management-ui/server/api/logs.js +248 -0
- package/management-ui/server/api/monitoring.js +282 -0
- package/management-ui/server/api/open-ide.js +31 -0
- package/management-ui/server/api/project.js +1029 -0
- package/management-ui/server/api/users/sessions.js +371 -0
- package/management-ui/server/api/users/simulation.js +254 -0
- package/management-ui/server/api/users.js +362 -0
- package/management-ui/server/api-contract.md +275 -0
- package/management-ui/server/index.js +873 -0
- package/management-ui/server/middleware/errorHandler.js +93 -0
- package/management-ui/server/middleware/security.js +32 -0
- package/management-ui/server/processManager.js +296 -0
- package/management-ui/server/server.js +346 -0
- package/management-ui/server/services/aws-monitor.js +413 -0
- package/management-ui/server/services/npm-registry.js +347 -0
- package/management-ui/server/services/template-engine.js +538 -0
- package/management-ui/server/utils/cliIntegration.js +220 -0
- package/management-ui/server/utils/environment/auditLogger.js +471 -0
- package/management-ui/server/utils/environment/awsParameterStore.js +275 -0
- package/management-ui/server/utils/environment/encryption.js +278 -0
- package/management-ui/server/utils/environment/envFileManager.js +286 -0
- package/management-ui/server/utils/import-commonjs.js +28 -0
- package/management-ui/server/utils/response.js +83 -0
- package/management-ui/server/websocket/handler.js +325 -0
- package/management-ui/src/App.jsx +25 -0
- package/management-ui/src/assets/FriggLogo.svg +1 -0
- package/management-ui/src/components/AppRouter.jsx +65 -0
- package/management-ui/src/components/Button.jsx +70 -0
- package/management-ui/src/components/Card.jsx +97 -0
- package/management-ui/src/components/EnvironmentCompare.jsx +400 -0
- package/management-ui/src/components/EnvironmentEditor.jsx +372 -0
- package/management-ui/src/components/EnvironmentImportExport.jsx +469 -0
- package/management-ui/src/components/EnvironmentSchema.jsx +491 -0
- package/management-ui/src/components/EnvironmentSecurity.jsx +463 -0
- package/management-ui/src/components/ErrorBoundary.jsx +73 -0
- package/management-ui/src/components/IntegrationCard.jsx +481 -0
- package/management-ui/src/components/IntegrationCardEnhanced.jsx +770 -0
- package/management-ui/src/components/IntegrationExplorer.jsx +379 -0
- package/management-ui/src/components/IntegrationStatus.jsx +336 -0
- package/management-ui/src/components/Layout.jsx +716 -0
- package/management-ui/src/components/LoadingSpinner.jsx +113 -0
- package/management-ui/src/components/RepositoryPicker.jsx +248 -0
- package/management-ui/src/components/SessionMonitor.jsx +350 -0
- package/management-ui/src/components/StatusBadge.jsx +208 -0
- package/management-ui/src/components/UserContextSwitcher.jsx +212 -0
- package/management-ui/src/components/UserSimulation.jsx +327 -0
- package/management-ui/src/components/Welcome.jsx +434 -0
- package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +637 -0
- package/management-ui/src/components/codegen/APIModuleSelector.jsx +227 -0
- package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +247 -0
- package/management-ui/src/components/codegen/CodePreviewEditor.jsx +316 -0
- package/management-ui/src/components/codegen/DynamicModuleForm.jsx +271 -0
- package/management-ui/src/components/codegen/FormBuilder.jsx +737 -0
- package/management-ui/src/components/codegen/IntegrationGenerator.jsx +855 -0
- package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +797 -0
- package/management-ui/src/components/codegen/SchemaBuilder.jsx +303 -0
- package/management-ui/src/components/codegen/TemplateSelector.jsx +586 -0
- package/management-ui/src/components/codegen/index.js +10 -0
- package/management-ui/src/components/connections/ConnectionConfigForm.jsx +362 -0
- package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +182 -0
- package/management-ui/src/components/connections/ConnectionTester.jsx +200 -0
- package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +292 -0
- package/management-ui/src/components/connections/OAuthFlow.jsx +204 -0
- package/management-ui/src/components/connections/index.js +5 -0
- package/management-ui/src/components/index.js +21 -0
- package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +222 -0
- package/management-ui/src/components/monitoring/LambdaMetrics.jsx +169 -0
- package/management-ui/src/components/monitoring/MetricsChart.jsx +197 -0
- package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +393 -0
- package/management-ui/src/components/monitoring/SQSMetrics.jsx +246 -0
- package/management-ui/src/components/monitoring/index.js +6 -0
- package/management-ui/src/components/monitoring/monitoring.css +218 -0
- package/management-ui/src/components/theme-provider.jsx +52 -0
- package/management-ui/src/components/theme-toggle.jsx +39 -0
- package/management-ui/src/components/ui/badge.tsx +36 -0
- package/management-ui/src/components/ui/button.test.jsx +56 -0
- package/management-ui/src/components/ui/button.tsx +57 -0
- package/management-ui/src/components/ui/card.tsx +76 -0
- package/management-ui/src/components/ui/dropdown-menu.tsx +199 -0
- package/management-ui/src/components/ui/select.tsx +157 -0
- package/management-ui/src/components/ui/skeleton.jsx +15 -0
- package/management-ui/src/hooks/useFrigg.jsx +387 -0
- package/management-ui/src/hooks/useSocket.jsx +58 -0
- package/management-ui/src/index.css +193 -0
- package/management-ui/src/lib/utils.ts +6 -0
- package/management-ui/src/main.jsx +10 -0
- package/management-ui/src/pages/CodeGeneration.jsx +14 -0
- package/management-ui/src/pages/Connections.jsx +252 -0
- package/management-ui/src/pages/ConnectionsEnhanced.jsx +633 -0
- package/management-ui/src/pages/Dashboard.jsx +311 -0
- package/management-ui/src/pages/Environment.jsx +314 -0
- package/management-ui/src/pages/IntegrationConfigure.jsx +669 -0
- package/management-ui/src/pages/IntegrationDiscovery.jsx +567 -0
- package/management-ui/src/pages/IntegrationTest.jsx +742 -0
- package/management-ui/src/pages/Integrations.jsx +253 -0
- package/management-ui/src/pages/Monitoring.jsx +17 -0
- package/management-ui/src/pages/Simulation.jsx +155 -0
- package/management-ui/src/pages/Users.jsx +492 -0
- package/management-ui/src/services/api.js +41 -0
- package/management-ui/src/services/apiModuleService.js +193 -0
- package/management-ui/src/services/websocket-handlers.js +120 -0
- package/management-ui/src/test/api/project.test.js +273 -0
- package/management-ui/src/test/components/Welcome.test.jsx +378 -0
- package/management-ui/src/test/mocks/server.js +178 -0
- package/management-ui/src/test/setup.js +61 -0
- package/management-ui/src/test/utils/test-utils.jsx +134 -0
- package/management-ui/src/utils/repository.js +98 -0
- package/management-ui/src/utils/repository.test.js +118 -0
- package/management-ui/src/workflows/phase2-integration-workflows.js +884 -0
- package/management-ui/tailwind.config.js +63 -0
- package/management-ui/tsconfig.json +37 -0
- package/management-ui/tsconfig.node.json +10 -0
- package/management-ui/vite.config.js +26 -0
- package/management-ui/vitest.config.js +38 -0
- package/package.json +35 -14
- package/test/index.js +2 -4
- package/test/mock-integration.js +4 -14
- package/infrastructure/app-handler-helpers.js +0 -57
- package/infrastructure/backend-utils.js +0 -87
- package/infrastructure/routers/auth.js +0 -26
- package/infrastructure/routers/integration-defined-routers.js +0 -42
- package/infrastructure/routers/middleware/loadUser.js +0 -15
- package/infrastructure/routers/middleware/requireLoggedInUser.js +0 -12
- package/infrastructure/routers/user.js +0 -41
- package/infrastructure/routers/websocket.js +0 -55
- package/infrastructure/serverless-template.js +0 -291
- package/infrastructure/workers/integration-defined-workers.js +0 -24
- package/test/auther-definition-tester.js +0 -125
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
const {
|
|
2
|
+
DATABASE_URL_EXAMPLES,
|
|
3
|
+
getDatabaseUrlMissingError,
|
|
4
|
+
getDatabaseTypeNotConfiguredError,
|
|
5
|
+
getDatabaseConnectionError,
|
|
6
|
+
getPrismaClientNotGeneratedError,
|
|
7
|
+
getPrismaCommandError,
|
|
8
|
+
getDatabaseSetupSuccess
|
|
9
|
+
} = require('../../../utils/error-messages');
|
|
10
|
+
|
|
11
|
+
describe('Error Messages Utility', () => {
|
|
12
|
+
describe('DATABASE_URL_EXAMPLES', () => {
|
|
13
|
+
it('should include MongoDB connection string example', () => {
|
|
14
|
+
expect(DATABASE_URL_EXAMPLES.mongodb).toBeDefined();
|
|
15
|
+
expect(DATABASE_URL_EXAMPLES.mongodb).toContain('mongodb://');
|
|
16
|
+
expect(DATABASE_URL_EXAMPLES.mongodb).toContain('replicaSet=rs0');
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('should include DocumentDB connection string example', () => {
|
|
20
|
+
expect(DATABASE_URL_EXAMPLES.documentdb).toBeDefined();
|
|
21
|
+
expect(DATABASE_URL_EXAMPLES.documentdb).toContain('docdb');
|
|
22
|
+
expect(DATABASE_URL_EXAMPLES.documentdb).toContain('retryWrites=false');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('should include PostgreSQL connection string example', () => {
|
|
26
|
+
expect(DATABASE_URL_EXAMPLES.postgresql).toBeDefined();
|
|
27
|
+
expect(DATABASE_URL_EXAMPLES.postgresql).toContain('postgresql://');
|
|
28
|
+
expect(DATABASE_URL_EXAMPLES.postgresql).toContain('schema=public');
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe('getDatabaseUrlMissingError()', () => {
|
|
33
|
+
it('should return formatted error message', () => {
|
|
34
|
+
const message = getDatabaseUrlMissingError();
|
|
35
|
+
|
|
36
|
+
expect(message).toBeTruthy();
|
|
37
|
+
expect(typeof message).toBe('string');
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('should include all database type examples', () => {
|
|
41
|
+
const message = getDatabaseUrlMissingError();
|
|
42
|
+
|
|
43
|
+
expect(message).toContain('MongoDB');
|
|
44
|
+
expect(message).toContain('DocumentDB');
|
|
45
|
+
expect(message).toContain('PostgreSQL');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should include example connection strings', () => {
|
|
49
|
+
const message = getDatabaseUrlMissingError();
|
|
50
|
+
|
|
51
|
+
expect(message).toContain(DATABASE_URL_EXAMPLES.mongodb);
|
|
52
|
+
expect(message).toContain(DATABASE_URL_EXAMPLES.documentdb);
|
|
53
|
+
expect(message).toContain(DATABASE_URL_EXAMPLES.postgresql);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('should suggest running frigg db:setup', () => {
|
|
57
|
+
const message = getDatabaseUrlMissingError();
|
|
58
|
+
|
|
59
|
+
expect(message).toContain('frigg db:setup');
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('should mention .env file', () => {
|
|
63
|
+
const message = getDatabaseUrlMissingError();
|
|
64
|
+
|
|
65
|
+
expect(message).toContain('.env');
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
describe('getDatabaseTypeNotConfiguredError()', () => {
|
|
70
|
+
it('should return formatted error message', () => {
|
|
71
|
+
const message = getDatabaseTypeNotConfiguredError();
|
|
72
|
+
|
|
73
|
+
expect(message).toBeTruthy();
|
|
74
|
+
expect(typeof message).toBe('string');
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('should include PostgreSQL configuration example', () => {
|
|
78
|
+
const message = getDatabaseTypeNotConfiguredError();
|
|
79
|
+
|
|
80
|
+
expect(message).toContain('postgres');
|
|
81
|
+
expect(message).toContain('enable: true');
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('should include MongoDB configuration example', () => {
|
|
85
|
+
const message = getDatabaseTypeNotConfiguredError();
|
|
86
|
+
|
|
87
|
+
expect(message).toContain('mongoDB');
|
|
88
|
+
expect(message).toContain('enable: true');
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('should include DocumentDB configuration example', () => {
|
|
92
|
+
const message = getDatabaseTypeNotConfiguredError();
|
|
93
|
+
|
|
94
|
+
expect(message).toContain('documentDB');
|
|
95
|
+
expect(message).toContain('enable: true');
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('should mention app definition location', () => {
|
|
99
|
+
const message = getDatabaseTypeNotConfiguredError();
|
|
100
|
+
|
|
101
|
+
expect(message).toContain('backend/index.js');
|
|
102
|
+
expect(message).toContain('index.js');
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
describe('getDatabaseConnectionError()', () => {
|
|
107
|
+
const mockError = 'Connection refused';
|
|
108
|
+
|
|
109
|
+
it('should include error message for MongoDB', () => {
|
|
110
|
+
const message = getDatabaseConnectionError(mockError, 'mongodb');
|
|
111
|
+
|
|
112
|
+
expect(message).toContain(mockError);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('should include error message for PostgreSQL', () => {
|
|
116
|
+
const message = getDatabaseConnectionError(mockError, 'postgresql');
|
|
117
|
+
|
|
118
|
+
expect(message).toContain(mockError);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('should include MongoDB-specific troubleshooting for MongoDB', () => {
|
|
122
|
+
const message = getDatabaseConnectionError(mockError, 'mongodb');
|
|
123
|
+
|
|
124
|
+
expect(message).toContain('replica set');
|
|
125
|
+
expect(message).toContain('rs.initiate');
|
|
126
|
+
expect(message).toContain('mongosh');
|
|
127
|
+
expect(message).toContain('27017');
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('should include DocumentDB-specific troubleshooting for DocumentDB', () => {
|
|
131
|
+
const message = getDatabaseConnectionError(mockError, 'documentdb');
|
|
132
|
+
|
|
133
|
+
expect(message).toContain('DocumentDB');
|
|
134
|
+
expect(message).toContain('retryWrites=false');
|
|
135
|
+
expect(message).toContain('global-bundle.pem');
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('should include PostgreSQL-specific troubleshooting for PostgreSQL', () => {
|
|
139
|
+
const message = getDatabaseConnectionError(mockError, 'postgresql');
|
|
140
|
+
|
|
141
|
+
expect(message).toContain('pg_hba.conf');
|
|
142
|
+
expect(message).toContain('pg_isready');
|
|
143
|
+
expect(message).toContain('psql');
|
|
144
|
+
expect(message).toContain('5432');
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('should not include PostgreSQL troubleshooting for MongoDB', () => {
|
|
148
|
+
const message = getDatabaseConnectionError(mockError, 'mongodb');
|
|
149
|
+
|
|
150
|
+
expect(message).not.toContain('pg_hba.conf');
|
|
151
|
+
expect(message).not.toContain('pg_isready');
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('should not include MongoDB troubleshooting for PostgreSQL', () => {
|
|
155
|
+
const message = getDatabaseConnectionError(mockError, 'postgresql');
|
|
156
|
+
|
|
157
|
+
expect(message).not.toContain('replica set');
|
|
158
|
+
expect(message).not.toContain('rs.initiate');
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it('should include general troubleshooting steps', () => {
|
|
162
|
+
const messageMongo = getDatabaseConnectionError(mockError, 'mongodb');
|
|
163
|
+
const messagePostgres = getDatabaseConnectionError(mockError, 'postgresql');
|
|
164
|
+
|
|
165
|
+
expect(messageMongo).toContain('Troubleshooting');
|
|
166
|
+
expect(messagePostgres).toContain('Troubleshooting');
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('should display database name in the error output', () => {
|
|
170
|
+
const message = getDatabaseConnectionError(mockError, 'documentdb');
|
|
171
|
+
|
|
172
|
+
expect(message).toContain('AWS DocumentDB (MongoDB-compatible)');
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('should show DATABASE_URL when available', () => {
|
|
176
|
+
process.env.DATABASE_URL = 'mongodb://test';
|
|
177
|
+
const message = getDatabaseConnectionError(mockError, 'mongodb');
|
|
178
|
+
|
|
179
|
+
expect(message).toContain('mongodb://test');
|
|
180
|
+
delete process.env.DATABASE_URL;
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('should handle missing DATABASE_URL gracefully', () => {
|
|
184
|
+
delete process.env.DATABASE_URL;
|
|
185
|
+
const message = getDatabaseConnectionError(mockError, 'mongodb');
|
|
186
|
+
|
|
187
|
+
expect(message).toContain('not set');
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
describe('getPrismaClientNotGeneratedError()', () => {
|
|
192
|
+
it('should return error message for MongoDB', () => {
|
|
193
|
+
const message = getPrismaClientNotGeneratedError('mongodb');
|
|
194
|
+
|
|
195
|
+
expect(message).toBeTruthy();
|
|
196
|
+
expect(message).toContain('mongodb');
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it('should return error message for PostgreSQL', () => {
|
|
200
|
+
const message = getPrismaClientNotGeneratedError('postgresql');
|
|
201
|
+
|
|
202
|
+
expect(message).toBeTruthy();
|
|
203
|
+
expect(message).toContain('postgresql');
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
it('should include correct client package name for MongoDB', () => {
|
|
207
|
+
const message = getPrismaClientNotGeneratedError('mongodb');
|
|
208
|
+
|
|
209
|
+
expect(message).toContain('@prisma-mongodb/client');
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it('should mention Mongo client reuse for DocumentDB', () => {
|
|
213
|
+
const message = getPrismaClientNotGeneratedError('documentdb');
|
|
214
|
+
|
|
215
|
+
expect(message).toContain('@prisma-mongodb/client');
|
|
216
|
+
expect(message).toContain('DocumentDB reuses the MongoDB Prisma client');
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
it('should include correct client package name for PostgreSQL', () => {
|
|
220
|
+
const message = getPrismaClientNotGeneratedError('postgresql');
|
|
221
|
+
|
|
222
|
+
expect(message).toContain('@prisma-postgresql/client');
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it('should suggest running frigg db:setup', () => {
|
|
226
|
+
const message = getPrismaClientNotGeneratedError('mongodb');
|
|
227
|
+
|
|
228
|
+
expect(message).toContain('frigg db:setup');
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
it('should explain what will happen when running db:setup', () => {
|
|
232
|
+
const message = getPrismaClientNotGeneratedError('mongodb');
|
|
233
|
+
|
|
234
|
+
expect(message).toContain('Generate the Prisma client');
|
|
235
|
+
expect(message).toContain('Set up database schema');
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
describe('getPrismaCommandError()', () => {
|
|
240
|
+
const mockCommand = 'generate';
|
|
241
|
+
const mockError = 'Schema validation failed';
|
|
242
|
+
|
|
243
|
+
it('should include command name', () => {
|
|
244
|
+
const message = getPrismaCommandError(mockCommand, mockError);
|
|
245
|
+
|
|
246
|
+
expect(message).toContain('generate');
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it('should include error message', () => {
|
|
250
|
+
const message = getPrismaCommandError(mockCommand, mockError);
|
|
251
|
+
|
|
252
|
+
expect(message).toContain(mockError);
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
it('should list common causes', () => {
|
|
256
|
+
const message = getPrismaCommandError(mockCommand, mockError);
|
|
257
|
+
|
|
258
|
+
expect(message).toContain('Common causes');
|
|
259
|
+
expect(message).toContain('schema');
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
it('should suggest running frigg db:setup', () => {
|
|
263
|
+
const message = getPrismaCommandError(mockCommand, mockError);
|
|
264
|
+
|
|
265
|
+
expect(message).toContain('frigg db:setup');
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it('should suggest checking DATABASE_URL', () => {
|
|
269
|
+
const message = getPrismaCommandError(mockCommand, mockError);
|
|
270
|
+
|
|
271
|
+
expect(message).toContain('DATABASE_URL');
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
it('should work with different command names', () => {
|
|
275
|
+
const migrateMessage = getPrismaCommandError('migrate', mockError);
|
|
276
|
+
const pushMessage = getPrismaCommandError('db push', mockError);
|
|
277
|
+
|
|
278
|
+
expect(migrateMessage).toContain('migrate');
|
|
279
|
+
expect(pushMessage).toContain('db push');
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
describe('getDatabaseSetupSuccess()', () => {
|
|
284
|
+
it('should include database type for MongoDB', () => {
|
|
285
|
+
const message = getDatabaseSetupSuccess('mongodb', 'development');
|
|
286
|
+
|
|
287
|
+
expect(message).toContain('MongoDB');
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
it('should include database type for PostgreSQL', () => {
|
|
291
|
+
const message = getDatabaseSetupSuccess('postgresql', 'production');
|
|
292
|
+
|
|
293
|
+
expect(message).toContain('PostgreSQL');
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
it('should include database type for DocumentDB', () => {
|
|
297
|
+
const message = getDatabaseSetupSuccess('documentdb', 'production');
|
|
298
|
+
|
|
299
|
+
expect(message).toContain('AWS DocumentDB (MongoDB-compatible)');
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
it('should include stage information', () => {
|
|
303
|
+
const devMessage = getDatabaseSetupSuccess('mongodb', 'development');
|
|
304
|
+
const prodMessage = getDatabaseSetupSuccess('postgresql', 'production');
|
|
305
|
+
|
|
306
|
+
expect(devMessage).toContain('development');
|
|
307
|
+
expect(prodMessage).toContain('production');
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
it('should mention different operations for MongoDB vs PostgreSQL', () => {
|
|
311
|
+
const mongoMessage = getDatabaseSetupSuccess('mongodb', 'development');
|
|
312
|
+
const postgresMessage = getDatabaseSetupSuccess('postgresql', 'development');
|
|
313
|
+
|
|
314
|
+
expect(mongoMessage).toContain('Schema pushed');
|
|
315
|
+
expect(postgresMessage).toContain('Migrations applied');
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
it('should mention DocumentDB-specific schema messaging', () => {
|
|
319
|
+
const message = getDatabaseSetupSuccess('documentdb', 'development');
|
|
320
|
+
|
|
321
|
+
expect(message).toContain('Schema pushed to DocumentDB');
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
it('should suggest next steps', () => {
|
|
325
|
+
const message = getDatabaseSetupSuccess('mongodb', 'development');
|
|
326
|
+
|
|
327
|
+
expect(message).toContain('frigg start');
|
|
328
|
+
expect(message).toContain('Next steps');
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
it('should confirm what happened during setup', () => {
|
|
332
|
+
const message = getDatabaseSetupSuccess('mongodb', 'development');
|
|
333
|
+
|
|
334
|
+
expect(message).toContain('Prisma client generated');
|
|
335
|
+
expect(message).toContain('Database connection verified');
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
it('should show success indicators', () => {
|
|
339
|
+
const message = getDatabaseSetupSuccess('mongodb', 'development');
|
|
340
|
+
|
|
341
|
+
expect(message).toContain('successfully');
|
|
342
|
+
expect(message).toContain('completed');
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
});
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version Detection Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for the CLI version detection wrapper that prefers local installations
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const fs = require('fs');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const semver = require('semver');
|
|
10
|
+
|
|
11
|
+
describe('Version Detection Logic', () => {
|
|
12
|
+
describe('semver comparison', () => {
|
|
13
|
+
test('should prefer local when local version is newer', () => {
|
|
14
|
+
const localVersion = '2.1.0';
|
|
15
|
+
const globalVersion = '2.0.0';
|
|
16
|
+
|
|
17
|
+
const comparison = semver.compare(localVersion, globalVersion);
|
|
18
|
+
|
|
19
|
+
expect(comparison).toBeGreaterThan(0);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test('should prefer local when versions are equal', () => {
|
|
23
|
+
const localVersion = '2.0.0';
|
|
24
|
+
const globalVersion = '2.0.0';
|
|
25
|
+
|
|
26
|
+
const comparison = semver.compare(localVersion, globalVersion);
|
|
27
|
+
|
|
28
|
+
expect(comparison).toBe(0);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('should warn when global is newer than local', () => {
|
|
32
|
+
const localVersion = '2.0.0';
|
|
33
|
+
const globalVersion = '2.1.0';
|
|
34
|
+
|
|
35
|
+
const comparison = semver.compare(localVersion, globalVersion);
|
|
36
|
+
|
|
37
|
+
expect(comparison).toBeLessThan(0);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test('should handle prerelease versions correctly', () => {
|
|
41
|
+
const localVersion = '2.0.0-next.1';
|
|
42
|
+
const globalVersion = '2.0.0-next.0';
|
|
43
|
+
|
|
44
|
+
const comparison = semver.compare(localVersion, globalVersion);
|
|
45
|
+
|
|
46
|
+
expect(comparison).toBeGreaterThan(0);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('should prefer release over prerelease', () => {
|
|
50
|
+
const localVersion = '2.0.0';
|
|
51
|
+
const globalVersion = '2.0.0-next.0';
|
|
52
|
+
|
|
53
|
+
const comparison = semver.compare(localVersion, globalVersion);
|
|
54
|
+
|
|
55
|
+
expect(comparison).toBeGreaterThan(0);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
describe('local CLI detection', () => {
|
|
60
|
+
test('should find local installation in node_modules', () => {
|
|
61
|
+
const cwd = process.cwd();
|
|
62
|
+
const localCliPath = path.join(cwd, 'node_modules', '@friggframework', 'frigg-cli');
|
|
63
|
+
|
|
64
|
+
// This test validates the path construction logic
|
|
65
|
+
expect(localCliPath).toContain('node_modules');
|
|
66
|
+
expect(localCliPath).toContain('@friggframework');
|
|
67
|
+
expect(localCliPath).toContain('frigg-cli');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('should construct correct paths for package.json and index.js', () => {
|
|
71
|
+
const cwd = process.cwd();
|
|
72
|
+
const localCliPath = path.join(cwd, 'node_modules', '@friggframework', 'frigg-cli');
|
|
73
|
+
const localCliPackageJson = path.join(localCliPath, 'package.json');
|
|
74
|
+
const localCliIndex = path.join(localCliPath, 'index.js');
|
|
75
|
+
|
|
76
|
+
expect(localCliPackageJson).toContain('package.json');
|
|
77
|
+
expect(localCliIndex).toContain('index.js');
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
describe('environment variable check', () => {
|
|
82
|
+
test('should skip version check when FRIGG_CLI_SKIP_VERSION_CHECK is true', () => {
|
|
83
|
+
const originalEnv = process.env.FRIGG_CLI_SKIP_VERSION_CHECK;
|
|
84
|
+
|
|
85
|
+
process.env.FRIGG_CLI_SKIP_VERSION_CHECK = 'true';
|
|
86
|
+
const shouldSkip = process.env.FRIGG_CLI_SKIP_VERSION_CHECK === 'true';
|
|
87
|
+
expect(shouldSkip).toBe(true);
|
|
88
|
+
|
|
89
|
+
// Restore
|
|
90
|
+
if (originalEnv !== undefined) {
|
|
91
|
+
process.env.FRIGG_CLI_SKIP_VERSION_CHECK = originalEnv;
|
|
92
|
+
} else {
|
|
93
|
+
delete process.env.FRIGG_CLI_SKIP_VERSION_CHECK;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test('should not skip when environment variable is not set', () => {
|
|
98
|
+
const originalEnv = process.env.FRIGG_CLI_SKIP_VERSION_CHECK;
|
|
99
|
+
delete process.env.FRIGG_CLI_SKIP_VERSION_CHECK;
|
|
100
|
+
|
|
101
|
+
const shouldSkip = process.env.FRIGG_CLI_SKIP_VERSION_CHECK === 'true';
|
|
102
|
+
expect(shouldSkip).toBe(false);
|
|
103
|
+
|
|
104
|
+
// Restore
|
|
105
|
+
if (originalEnv !== undefined) {
|
|
106
|
+
process.env.FRIGG_CLI_SKIP_VERSION_CHECK = originalEnv;
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
describe('version detection decision matrix', () => {
|
|
112
|
+
const scenarios = [
|
|
113
|
+
{
|
|
114
|
+
name: 'local newer than global',
|
|
115
|
+
local: '2.1.0',
|
|
116
|
+
global: '2.0.0',
|
|
117
|
+
expected: 'use_local',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: 'local equal to global',
|
|
121
|
+
local: '2.0.0',
|
|
122
|
+
global: '2.0.0',
|
|
123
|
+
expected: 'use_local',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
name: 'global newer than local',
|
|
127
|
+
local: '2.0.0',
|
|
128
|
+
global: '2.1.0',
|
|
129
|
+
expected: 'warn_and_use_global',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: 'local prerelease newer',
|
|
133
|
+
local: '2.0.0-next.1',
|
|
134
|
+
global: '2.0.0-next.0',
|
|
135
|
+
expected: 'use_local',
|
|
136
|
+
},
|
|
137
|
+
];
|
|
138
|
+
|
|
139
|
+
scenarios.forEach(({ name, local, global, expected }) => {
|
|
140
|
+
test(`should ${expected.replace('_', ' ')} when ${name}`, () => {
|
|
141
|
+
const comparison = semver.compare(local, global);
|
|
142
|
+
|
|
143
|
+
if (expected === 'use_local') {
|
|
144
|
+
expect(comparison).toBeGreaterThanOrEqual(0);
|
|
145
|
+
} else if (expected === 'warn_and_use_global') {
|
|
146
|
+
expect(comparison).toBeLessThan(0);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
describe('argument forwarding', () => {
|
|
153
|
+
test('should extract arguments correctly from process.argv', () => {
|
|
154
|
+
// Simulate process.argv
|
|
155
|
+
const mockArgv = ['node', '/path/to/frigg', 'doctor', 'my-stack', '--region', 'us-east-1'];
|
|
156
|
+
const args = mockArgv.slice(2);
|
|
157
|
+
|
|
158
|
+
expect(args).toEqual(['doctor', 'my-stack', '--region', 'us-east-1']);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
test('should forward all arguments to local CLI', () => {
|
|
162
|
+
const mockArgv = ['node', '/path/to/frigg', 'repair', 'my-stack', '--import', '--yes'];
|
|
163
|
+
const args = mockArgv.slice(2);
|
|
164
|
+
|
|
165
|
+
expect(args).toContain('repair');
|
|
166
|
+
expect(args).toContain('my-stack');
|
|
167
|
+
expect(args).toContain('--import');
|
|
168
|
+
expect(args).toContain('--yes');
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
});
|