create-fluxstack 1.0.2 → 1.0.3
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/.claude/settings.local.json +63 -0
- package/.dockerignore +50 -0
- package/.env.example +53 -0
- package/.gitattributes +2 -0
- package/.github/workflows/ci-build-tests.yml +480 -0
- package/.github/workflows/dependency-management.yml +324 -0
- package/.github/workflows/release-validation.yml +355 -0
- package/.kiro/specs/fluxstack-architecture-optimization/design.md +700 -0
- package/.kiro/specs/fluxstack-architecture-optimization/requirements.md +127 -0
- package/.kiro/specs/fluxstack-architecture-optimization/tasks.md +330 -0
- package/CLAUDE.md +200 -0
- package/Dockerfile +58 -0
- package/Dockerfile.backend +52 -0
- package/Dockerfile.frontend +54 -0
- package/ENV_TESTING_REPORT.md +292 -0
- package/FRAMEWORK_ROADMAP.md +183 -0
- package/FRONTEND_TESTS_README.md +287 -0
- package/LICENSE +21 -0
- package/README-Docker.md +85 -0
- package/TEST_RESULTS.md +130 -0
- package/ai-context/00-QUICK-START.md +86 -0
- package/ai-context/README.md +88 -0
- package/ai-context/development/eden-treaty-guide.md +362 -0
- package/ai-context/development/patterns.md +382 -0
- package/ai-context/examples/crud-complete.md +626 -0
- package/ai-context/project/architecture.md +399 -0
- package/ai-context/project/overview.md +213 -0
- package/ai-context/recent-changes/eden-treaty-refactor.md +281 -0
- package/ai-context/recent-changes/type-inference-fix.md +223 -0
- package/ai-context/reference/environment-vars.md +384 -0
- package/ai-context/reference/troubleshooting.md +407 -0
- package/app/client/README.md +69 -0
- package/app/client/frontend-only.ts +12 -0
- package/app/client/index.html +13 -0
- package/app/client/public/vite.svg +1 -0
- package/app/client/src/App.css +883 -0
- package/app/client/src/App.tsx +669 -0
- package/app/client/src/assets/react.svg +1 -0
- package/app/client/src/components/TestPage.tsx +453 -0
- package/app/client/src/index.css +51 -0
- package/app/client/src/lib/eden-api.ts +110 -0
- package/app/client/src/main.tsx +10 -0
- package/app/client/src/vite-env.d.ts +1 -0
- package/app/client/tsconfig.app.json +43 -0
- package/app/client/tsconfig.json +7 -0
- package/app/client/tsconfig.node.json +25 -0
- package/app/server/app.ts +10 -0
- package/app/server/backend-only.ts +15 -0
- package/app/server/controllers/users.controller.ts +69 -0
- package/app/server/index.ts +104 -0
- package/app/server/routes/index.ts +25 -0
- package/app/server/routes/users.routes.ts +121 -0
- package/app/server/types/index.ts +1 -0
- package/app/shared/types/index.ts +18 -0
- package/bun.lock +1063 -0
- package/bunfig.toml +16 -0
- package/config/fluxstack.config.ts +48 -0
- package/core/__tests__/integration.test.ts +227 -0
- package/core/build/index.ts +186 -0
- package/core/cli/command-registry.ts +334 -0
- package/core/cli/index.ts +394 -0
- package/core/cli/plugin-discovery.ts +200 -0
- package/core/client/standalone.ts +57 -0
- package/core/config/__tests__/config-loader.test.ts +591 -0
- package/core/config/__tests__/config-merger.test.ts +657 -0
- package/core/config/__tests__/env-converter.test.ts +372 -0
- package/core/config/__tests__/env-processor.test.ts +431 -0
- package/core/config/__tests__/env.test.ts +452 -0
- package/core/config/__tests__/integration.test.ts +418 -0
- package/core/config/__tests__/loader.test.ts +331 -0
- package/core/config/__tests__/schema.test.ts +129 -0
- package/core/config/__tests__/validator.test.ts +318 -0
- package/core/config/env-dynamic.ts +326 -0
- package/core/config/env.ts +597 -0
- package/core/config/index.ts +317 -0
- package/core/config/loader.ts +546 -0
- package/core/config/runtime-config.ts +322 -0
- package/core/config/schema.ts +694 -0
- package/core/config/validator.ts +540 -0
- package/core/framework/__tests__/server.test.ts +233 -0
- package/core/framework/client.ts +132 -0
- package/core/framework/index.ts +8 -0
- package/core/framework/server.ts +501 -0
- package/core/framework/types.ts +63 -0
- package/core/plugins/__tests__/built-in.test.ts.disabled +366 -0
- package/core/plugins/__tests__/manager.test.ts +398 -0
- package/core/plugins/__tests__/monitoring.test.ts +401 -0
- package/core/plugins/__tests__/registry.test.ts +335 -0
- package/core/plugins/built-in/index.ts +142 -0
- package/core/plugins/built-in/logger/index.ts +180 -0
- package/core/plugins/built-in/monitoring/README.md +193 -0
- package/core/plugins/built-in/monitoring/index.ts +912 -0
- package/core/plugins/built-in/static/index.ts +289 -0
- package/core/plugins/built-in/swagger/index.ts +229 -0
- package/core/plugins/built-in/vite/index.ts +316 -0
- package/core/plugins/config.ts +348 -0
- package/core/plugins/discovery.ts +350 -0
- package/core/plugins/executor.ts +351 -0
- package/core/plugins/index.ts +195 -0
- package/core/plugins/manager.ts +583 -0
- package/core/plugins/registry.ts +424 -0
- package/core/plugins/types.ts +254 -0
- package/core/server/framework.ts +123 -0
- package/core/server/index.ts +8 -0
- package/core/server/plugins/database.ts +182 -0
- package/core/server/plugins/logger.ts +47 -0
- package/core/server/plugins/swagger.ts +34 -0
- package/core/server/standalone.ts +91 -0
- package/core/templates/create-project.ts +455 -0
- package/core/types/api.ts +169 -0
- package/core/types/build.ts +174 -0
- package/core/types/config.ts +68 -0
- package/core/types/index.ts +127 -0
- package/core/types/plugin.ts +94 -0
- package/core/utils/__tests__/errors.test.ts +139 -0
- package/core/utils/__tests__/helpers.test.ts +297 -0
- package/core/utils/__tests__/logger.test.ts +141 -0
- package/core/utils/env-runtime-v2.ts +232 -0
- package/core/utils/env-runtime.ts +252 -0
- package/core/utils/errors/codes.ts +115 -0
- package/core/utils/errors/handlers.ts +63 -0
- package/core/utils/errors/index.ts +81 -0
- package/core/utils/helpers.ts +180 -0
- package/core/utils/index.ts +18 -0
- package/core/utils/logger/index.ts +161 -0
- package/core/utils/logger.ts +106 -0
- package/core/utils/monitoring/index.ts +212 -0
- package/create-fluxstack.ts +1 -1
- package/create-test-app.ts +156 -0
- package/docker-compose.microservices.yml +75 -0
- package/docker-compose.simple.yml +57 -0
- package/docker-compose.yml +71 -0
- package/docs/dynamic-environment-variables.md +380 -0
- package/eslint.config.js +23 -0
- package/examples/dynamic-env-usage.ts +283 -0
- package/examples/hybrid-env-strategy.ts +212 -0
- package/examples/simplified-env-usage.ts +251 -0
- package/flux-cli.ts +214 -0
- package/fluxstack.config.ts +318 -0
- package/meu-app-teste/README.md +44 -0
- package/meu-app-teste/app/client/README.md +69 -0
- package/meu-app-teste/app/client/frontend-only.ts +12 -0
- package/meu-app-teste/app/client/index.html +13 -0
- package/meu-app-teste/app/client/public/vite.svg +1 -0
- package/meu-app-teste/app/client/src/App.css +883 -0
- package/meu-app-teste/app/client/src/App.tsx +669 -0
- package/meu-app-teste/app/client/src/assets/react.svg +1 -0
- package/meu-app-teste/app/client/src/components/TestPage.tsx +453 -0
- package/meu-app-teste/app/client/src/index.css +51 -0
- package/meu-app-teste/app/client/src/lib/eden-api.ts +110 -0
- package/meu-app-teste/app/client/src/main.tsx +10 -0
- package/meu-app-teste/app/client/src/vite-env.d.ts +1 -0
- package/meu-app-teste/app/client/tsconfig.app.json +43 -0
- package/meu-app-teste/app/client/tsconfig.json +7 -0
- package/meu-app-teste/app/client/tsconfig.node.json +25 -0
- package/meu-app-teste/app/server/app.ts +10 -0
- package/meu-app-teste/app/server/backend-only.ts +15 -0
- package/meu-app-teste/app/server/controllers/users.controller.ts +69 -0
- package/meu-app-teste/app/server/index.ts +104 -0
- package/meu-app-teste/app/server/routes/index.ts +25 -0
- package/meu-app-teste/app/server/routes/users.routes.ts +121 -0
- package/meu-app-teste/app/server/types/index.ts +1 -0
- package/meu-app-teste/app/shared/types/index.ts +18 -0
- package/meu-app-teste/bun.lock +1053 -0
- package/meu-app-teste/core/__tests__/integration.test.ts +227 -0
- package/meu-app-teste/core/build/index.ts +186 -0
- package/meu-app-teste/core/cli/command-registry.ts +334 -0
- package/meu-app-teste/core/cli/index.ts +394 -0
- package/meu-app-teste/core/cli/plugin-discovery.ts +200 -0
- package/meu-app-teste/core/client/standalone.ts +57 -0
- package/meu-app-teste/core/config/__tests__/config-loader.test.ts +591 -0
- package/meu-app-teste/core/config/__tests__/config-merger.test.ts +657 -0
- package/meu-app-teste/core/config/__tests__/env-converter.test.ts +372 -0
- package/meu-app-teste/core/config/__tests__/env-processor.test.ts +431 -0
- package/meu-app-teste/core/config/__tests__/env.test.ts +452 -0
- package/meu-app-teste/core/config/__tests__/integration.test.ts +418 -0
- package/meu-app-teste/core/config/__tests__/loader.test.ts +331 -0
- package/meu-app-teste/core/config/__tests__/schema.test.ts +129 -0
- package/meu-app-teste/core/config/__tests__/validator.test.ts +318 -0
- package/meu-app-teste/core/config/env-dynamic.ts +326 -0
- package/meu-app-teste/core/config/env.ts +597 -0
- package/meu-app-teste/core/config/index.ts +317 -0
- package/meu-app-teste/core/config/loader.ts +546 -0
- package/meu-app-teste/core/config/runtime-config.ts +322 -0
- package/meu-app-teste/core/config/schema.ts +694 -0
- package/meu-app-teste/core/config/validator.ts +540 -0
- package/meu-app-teste/core/framework/__tests__/server.test.ts +233 -0
- package/meu-app-teste/core/framework/client.ts +132 -0
- package/meu-app-teste/core/framework/index.ts +8 -0
- package/meu-app-teste/core/framework/server.ts +501 -0
- package/meu-app-teste/core/framework/types.ts +63 -0
- package/meu-app-teste/core/plugins/__tests__/built-in.test.ts.disabled +366 -0
- package/meu-app-teste/core/plugins/__tests__/manager.test.ts +398 -0
- package/meu-app-teste/core/plugins/__tests__/monitoring.test.ts +401 -0
- package/meu-app-teste/core/plugins/__tests__/registry.test.ts +335 -0
- package/meu-app-teste/core/plugins/built-in/index.ts +142 -0
- package/meu-app-teste/core/plugins/built-in/logger/index.ts +180 -0
- package/meu-app-teste/core/plugins/built-in/monitoring/README.md +193 -0
- package/meu-app-teste/core/plugins/built-in/monitoring/index.ts +912 -0
- package/meu-app-teste/core/plugins/built-in/static/index.ts +289 -0
- package/meu-app-teste/core/plugins/built-in/swagger/index.ts +229 -0
- package/meu-app-teste/core/plugins/built-in/vite/index.ts +316 -0
- package/meu-app-teste/core/plugins/config.ts +348 -0
- package/meu-app-teste/core/plugins/discovery.ts +350 -0
- package/meu-app-teste/core/plugins/executor.ts +351 -0
- package/meu-app-teste/core/plugins/index.ts +195 -0
- package/meu-app-teste/core/plugins/manager.ts +583 -0
- package/meu-app-teste/core/plugins/registry.ts +424 -0
- package/meu-app-teste/core/plugins/types.ts +254 -0
- package/meu-app-teste/core/server/framework.ts +123 -0
- package/meu-app-teste/core/server/index.ts +8 -0
- package/meu-app-teste/core/server/plugins/database.ts +182 -0
- package/meu-app-teste/core/server/plugins/logger.ts +47 -0
- package/meu-app-teste/core/server/plugins/swagger.ts +34 -0
- package/meu-app-teste/core/server/standalone.ts +91 -0
- package/meu-app-teste/core/templates/create-project.ts +455 -0
- package/meu-app-teste/core/types/api.ts +169 -0
- package/meu-app-teste/core/types/build.ts +174 -0
- package/meu-app-teste/core/types/config.ts +68 -0
- package/meu-app-teste/core/types/index.ts +127 -0
- package/meu-app-teste/core/types/plugin.ts +94 -0
- package/meu-app-teste/core/utils/__tests__/errors.test.ts +139 -0
- package/meu-app-teste/core/utils/__tests__/helpers.test.ts +297 -0
- package/meu-app-teste/core/utils/__tests__/logger.test.ts +141 -0
- package/meu-app-teste/core/utils/env-runtime-v2.ts +232 -0
- package/meu-app-teste/core/utils/env-runtime.ts +252 -0
- package/meu-app-teste/core/utils/errors/codes.ts +115 -0
- package/meu-app-teste/core/utils/errors/handlers.ts +63 -0
- package/meu-app-teste/core/utils/errors/index.ts +81 -0
- package/meu-app-teste/core/utils/helpers.ts +180 -0
- package/meu-app-teste/core/utils/index.ts +18 -0
- package/meu-app-teste/core/utils/logger/index.ts +161 -0
- package/meu-app-teste/core/utils/logger.ts +106 -0
- package/meu-app-teste/core/utils/monitoring/index.ts +212 -0
- package/meu-app-teste/package.json +92 -0
- package/meu-app-teste/tsconfig.json +51 -0
- package/meu-app-teste/vite.config.ts +42 -0
- package/my-final-test/README.md +44 -0
- package/my-final-test/app/client/README.md +69 -0
- package/my-final-test/app/client/frontend-only.ts +12 -0
- package/my-final-test/app/client/index.html +13 -0
- package/my-final-test/app/client/public/vite.svg +1 -0
- package/my-final-test/app/client/src/App.css +883 -0
- package/my-final-test/app/client/src/App.tsx +669 -0
- package/my-final-test/app/client/src/assets/react.svg +1 -0
- package/my-final-test/app/client/src/components/TestPage.tsx +453 -0
- package/my-final-test/app/client/src/index.css +51 -0
- package/my-final-test/app/client/src/lib/eden-api.ts +110 -0
- package/my-final-test/app/client/src/main.tsx +10 -0
- package/my-final-test/app/client/src/vite-env.d.ts +1 -0
- package/my-final-test/app/client/tsconfig.app.json +43 -0
- package/my-final-test/app/client/tsconfig.json +7 -0
- package/my-final-test/app/client/tsconfig.node.json +25 -0
- package/my-final-test/app/server/app.ts +10 -0
- package/my-final-test/app/server/backend-only.ts +15 -0
- package/my-final-test/app/server/controllers/users.controller.ts +69 -0
- package/my-final-test/app/server/index.ts +104 -0
- package/my-final-test/app/server/routes/index.ts +25 -0
- package/my-final-test/app/server/routes/users.routes.ts +121 -0
- package/my-final-test/app/server/types/index.ts +1 -0
- package/my-final-test/app/shared/types/index.ts +18 -0
- package/my-final-test/bun.lock +993 -0
- package/my-final-test/core/__tests__/integration.test.ts +227 -0
- package/my-final-test/core/build/index.ts +186 -0
- package/my-final-test/core/cli/command-registry.ts +334 -0
- package/my-final-test/core/cli/index.ts +394 -0
- package/my-final-test/core/cli/plugin-discovery.ts +200 -0
- package/my-final-test/core/client/standalone.ts +57 -0
- package/my-final-test/core/config/__tests__/config-loader.test.ts +591 -0
- package/my-final-test/core/config/__tests__/config-merger.test.ts +657 -0
- package/my-final-test/core/config/__tests__/env-converter.test.ts +372 -0
- package/my-final-test/core/config/__tests__/env-processor.test.ts +431 -0
- package/my-final-test/core/config/__tests__/env.test.ts +452 -0
- package/my-final-test/core/config/__tests__/integration.test.ts +418 -0
- package/my-final-test/core/config/__tests__/loader.test.ts +331 -0
- package/my-final-test/core/config/__tests__/schema.test.ts +129 -0
- package/my-final-test/core/config/__tests__/validator.test.ts +318 -0
- package/my-final-test/core/config/env-dynamic.ts +326 -0
- package/my-final-test/core/config/env.ts +597 -0
- package/my-final-test/core/config/index.ts +317 -0
- package/my-final-test/core/config/loader.ts +546 -0
- package/my-final-test/core/config/runtime-config.ts +322 -0
- package/my-final-test/core/config/schema.ts +694 -0
- package/my-final-test/core/config/validator.ts +540 -0
- package/my-final-test/core/framework/__tests__/server.test.ts +233 -0
- package/my-final-test/core/framework/client.ts +132 -0
- package/my-final-test/core/framework/index.ts +8 -0
- package/my-final-test/core/framework/server.ts +501 -0
- package/my-final-test/core/framework/types.ts +63 -0
- package/my-final-test/core/plugins/__tests__/built-in.test.ts.disabled +366 -0
- package/my-final-test/core/plugins/__tests__/manager.test.ts +398 -0
- package/my-final-test/core/plugins/__tests__/monitoring.test.ts +401 -0
- package/my-final-test/core/plugins/__tests__/registry.test.ts +335 -0
- package/my-final-test/core/plugins/built-in/index.ts +142 -0
- package/my-final-test/core/plugins/built-in/logger/index.ts +180 -0
- package/my-final-test/core/plugins/built-in/monitoring/README.md +193 -0
- package/my-final-test/core/plugins/built-in/monitoring/index.ts +912 -0
- package/my-final-test/core/plugins/built-in/static/index.ts +289 -0
- package/my-final-test/core/plugins/built-in/swagger/index.ts +229 -0
- package/my-final-test/core/plugins/built-in/vite/index.ts +316 -0
- package/my-final-test/core/plugins/config.ts +348 -0
- package/my-final-test/core/plugins/discovery.ts +350 -0
- package/my-final-test/core/plugins/executor.ts +351 -0
- package/my-final-test/core/plugins/index.ts +195 -0
- package/my-final-test/core/plugins/manager.ts +583 -0
- package/my-final-test/core/plugins/registry.ts +424 -0
- package/my-final-test/core/plugins/types.ts +254 -0
- package/my-final-test/core/server/framework.ts +123 -0
- package/my-final-test/core/server/index.ts +8 -0
- package/my-final-test/core/server/plugins/database.ts +182 -0
- package/my-final-test/core/server/plugins/logger.ts +47 -0
- package/my-final-test/core/server/plugins/swagger.ts +34 -0
- package/my-final-test/core/server/standalone.ts +91 -0
- package/my-final-test/core/templates/create-project.ts +455 -0
- package/my-final-test/core/types/api.ts +169 -0
- package/my-final-test/core/types/build.ts +174 -0
- package/my-final-test/core/types/config.ts +68 -0
- package/my-final-test/core/types/index.ts +127 -0
- package/my-final-test/core/types/plugin.ts +94 -0
- package/my-final-test/core/utils/__tests__/errors.test.ts +139 -0
- package/my-final-test/core/utils/__tests__/helpers.test.ts +297 -0
- package/my-final-test/core/utils/__tests__/logger.test.ts +141 -0
- package/my-final-test/core/utils/env-runtime-v2.ts +232 -0
- package/my-final-test/core/utils/env-runtime.ts +252 -0
- package/my-final-test/core/utils/errors/codes.ts +115 -0
- package/my-final-test/core/utils/errors/handlers.ts +63 -0
- package/my-final-test/core/utils/errors/index.ts +81 -0
- package/my-final-test/core/utils/helpers.ts +180 -0
- package/my-final-test/core/utils/index.ts +18 -0
- package/my-final-test/core/utils/logger/index.ts +161 -0
- package/my-final-test/core/utils/logger.ts +106 -0
- package/my-final-test/core/utils/monitoring/index.ts +212 -0
- package/my-final-test/package.json +68 -0
- package/my-final-test/tsconfig.json +51 -0
- package/my-final-test/vite.config.ts +42 -0
- package/nginx-lb.conf +37 -0
- package/package-template.json +32 -15
- package/package.json +71 -30
- package/publish-setup.md +111 -0
- package/publish.sh +63 -0
- package/run-clean.ts +26 -0
- package/run-env-tests.ts +313 -0
- package/tailwind.config.js +34 -0
- package/teste-corrigido/README.md +44 -0
- package/teste-corrigido/app/client/README.md +69 -0
- package/teste-corrigido/app/client/frontend-only.ts +12 -0
- package/teste-corrigido/app/client/index.html +13 -0
- package/teste-corrigido/app/client/public/vite.svg +1 -0
- package/teste-corrigido/app/client/src/App.css +883 -0
- package/teste-corrigido/app/client/src/App.tsx +669 -0
- package/teste-corrigido/app/client/src/assets/react.svg +1 -0
- package/teste-corrigido/app/client/src/components/TestPage.tsx +453 -0
- package/teste-corrigido/app/client/src/index.css +51 -0
- package/teste-corrigido/app/client/src/lib/eden-api.ts +110 -0
- package/teste-corrigido/app/client/src/main.tsx +10 -0
- package/teste-corrigido/app/client/src/vite-env.d.ts +1 -0
- package/teste-corrigido/app/client/tsconfig.app.json +43 -0
- package/teste-corrigido/app/client/tsconfig.json +7 -0
- package/teste-corrigido/app/client/tsconfig.node.json +25 -0
- package/teste-corrigido/app/server/app.ts +10 -0
- package/teste-corrigido/app/server/backend-only.ts +15 -0
- package/teste-corrigido/app/server/controllers/users.controller.ts +69 -0
- package/teste-corrigido/app/server/index.ts +104 -0
- package/teste-corrigido/app/server/routes/index.ts +25 -0
- package/teste-corrigido/app/server/routes/users.routes.ts +121 -0
- package/teste-corrigido/app/server/types/index.ts +1 -0
- package/teste-corrigido/app/shared/types/index.ts +18 -0
- package/teste-corrigido/bun.lock +1053 -0
- package/teste-corrigido/core/__tests__/integration.test.ts +227 -0
- package/teste-corrigido/core/build/index.ts +186 -0
- package/teste-corrigido/core/cli/command-registry.ts +334 -0
- package/teste-corrigido/core/cli/index.ts +394 -0
- package/teste-corrigido/core/cli/plugin-discovery.ts +200 -0
- package/teste-corrigido/core/client/standalone.ts +57 -0
- package/teste-corrigido/core/config/__tests__/config-loader.test.ts +591 -0
- package/teste-corrigido/core/config/__tests__/config-merger.test.ts +657 -0
- package/teste-corrigido/core/config/__tests__/env-converter.test.ts +372 -0
- package/teste-corrigido/core/config/__tests__/env-processor.test.ts +431 -0
- package/teste-corrigido/core/config/__tests__/env.test.ts +452 -0
- package/teste-corrigido/core/config/__tests__/integration.test.ts +418 -0
- package/teste-corrigido/core/config/__tests__/loader.test.ts +331 -0
- package/teste-corrigido/core/config/__tests__/schema.test.ts +129 -0
- package/teste-corrigido/core/config/__tests__/validator.test.ts +318 -0
- package/teste-corrigido/core/config/env-dynamic.ts +326 -0
- package/teste-corrigido/core/config/env.ts +597 -0
- package/teste-corrigido/core/config/index.ts +317 -0
- package/teste-corrigido/core/config/loader.ts +546 -0
- package/teste-corrigido/core/config/runtime-config.ts +322 -0
- package/teste-corrigido/core/config/schema.ts +694 -0
- package/teste-corrigido/core/config/validator.ts +540 -0
- package/teste-corrigido/core/framework/__tests__/server.test.ts +233 -0
- package/teste-corrigido/core/framework/client.ts +132 -0
- package/teste-corrigido/core/framework/index.ts +8 -0
- package/teste-corrigido/core/framework/server.ts +501 -0
- package/teste-corrigido/core/framework/types.ts +63 -0
- package/teste-corrigido/core/plugins/__tests__/built-in.test.ts.disabled +366 -0
- package/teste-corrigido/core/plugins/__tests__/manager.test.ts +398 -0
- package/teste-corrigido/core/plugins/__tests__/monitoring.test.ts +401 -0
- package/teste-corrigido/core/plugins/__tests__/registry.test.ts +335 -0
- package/teste-corrigido/core/plugins/built-in/index.ts +142 -0
- package/teste-corrigido/core/plugins/built-in/logger/index.ts +180 -0
- package/teste-corrigido/core/plugins/built-in/monitoring/README.md +193 -0
- package/teste-corrigido/core/plugins/built-in/monitoring/index.ts +912 -0
- package/teste-corrigido/core/plugins/built-in/static/index.ts +289 -0
- package/teste-corrigido/core/plugins/built-in/swagger/index.ts +229 -0
- package/teste-corrigido/core/plugins/built-in/vite/index.ts +316 -0
- package/teste-corrigido/core/plugins/config.ts +348 -0
- package/teste-corrigido/core/plugins/discovery.ts +350 -0
- package/teste-corrigido/core/plugins/executor.ts +351 -0
- package/teste-corrigido/core/plugins/index.ts +195 -0
- package/teste-corrigido/core/plugins/manager.ts +583 -0
- package/teste-corrigido/core/plugins/registry.ts +424 -0
- package/teste-corrigido/core/plugins/types.ts +254 -0
- package/teste-corrigido/core/server/framework.ts +123 -0
- package/teste-corrigido/core/server/index.ts +8 -0
- package/teste-corrigido/core/server/plugins/database.ts +182 -0
- package/teste-corrigido/core/server/plugins/logger.ts +47 -0
- package/teste-corrigido/core/server/plugins/swagger.ts +34 -0
- package/teste-corrigido/core/server/standalone.ts +91 -0
- package/teste-corrigido/core/templates/create-project.ts +455 -0
- package/teste-corrigido/core/types/api.ts +169 -0
- package/teste-corrigido/core/types/build.ts +174 -0
- package/teste-corrigido/core/types/config.ts +68 -0
- package/teste-corrigido/core/types/index.ts +127 -0
- package/teste-corrigido/core/types/plugin.ts +94 -0
- package/teste-corrigido/core/utils/__tests__/errors.test.ts +139 -0
- package/teste-corrigido/core/utils/__tests__/helpers.test.ts +297 -0
- package/teste-corrigido/core/utils/__tests__/logger.test.ts +141 -0
- package/teste-corrigido/core/utils/env-runtime-v2.ts +232 -0
- package/teste-corrigido/core/utils/env-runtime.ts +252 -0
- package/teste-corrigido/core/utils/errors/codes.ts +115 -0
- package/teste-corrigido/core/utils/errors/handlers.ts +63 -0
- package/teste-corrigido/core/utils/errors/index.ts +81 -0
- package/teste-corrigido/core/utils/helpers.ts +180 -0
- package/teste-corrigido/core/utils/index.ts +18 -0
- package/teste-corrigido/core/utils/logger/index.ts +161 -0
- package/teste-corrigido/core/utils/logger.ts +106 -0
- package/teste-corrigido/core/utils/monitoring/index.ts +212 -0
- package/teste-corrigido/package-template.json +51 -0
- package/teste-corrigido/package.json +51 -0
- package/teste-corrigido/tsconfig.json +51 -0
- package/teste-corrigido/vite.config.ts +42 -0
- package/teste-final-npm/README.md +44 -0
- package/teste-final-npm/app/client/README.md +69 -0
- package/teste-final-npm/app/client/frontend-only.ts +12 -0
- package/teste-final-npm/app/client/index.html +13 -0
- package/teste-final-npm/app/client/public/vite.svg +1 -0
- package/teste-final-npm/app/client/src/App.css +883 -0
- package/teste-final-npm/app/client/src/App.tsx +669 -0
- package/teste-final-npm/app/client/src/assets/react.svg +1 -0
- package/teste-final-npm/app/client/src/components/TestPage.tsx +453 -0
- package/teste-final-npm/app/client/src/index.css +51 -0
- package/teste-final-npm/app/client/src/lib/eden-api.ts +110 -0
- package/teste-final-npm/app/client/src/main.tsx +10 -0
- package/teste-final-npm/app/client/src/vite-env.d.ts +1 -0
- package/teste-final-npm/app/client/tsconfig.app.json +43 -0
- package/teste-final-npm/app/client/tsconfig.json +7 -0
- package/teste-final-npm/app/client/tsconfig.node.json +25 -0
- package/teste-final-npm/app/server/app.ts +10 -0
- package/teste-final-npm/app/server/backend-only.ts +15 -0
- package/teste-final-npm/app/server/controllers/users.controller.ts +69 -0
- package/teste-final-npm/app/server/index.ts +104 -0
- package/teste-final-npm/app/server/routes/index.ts +25 -0
- package/teste-final-npm/app/server/routes/users.routes.ts +121 -0
- package/teste-final-npm/app/server/types/index.ts +1 -0
- package/teste-final-npm/app/shared/types/index.ts +18 -0
- package/teste-final-npm/bun.lock +1053 -0
- package/teste-final-npm/core/__tests__/integration.test.ts +227 -0
- package/teste-final-npm/core/build/index.ts +186 -0
- package/teste-final-npm/core/cli/command-registry.ts +334 -0
- package/teste-final-npm/core/cli/index.ts +394 -0
- package/teste-final-npm/core/cli/plugin-discovery.ts +200 -0
- package/teste-final-npm/core/client/standalone.ts +57 -0
- package/teste-final-npm/core/config/__tests__/config-loader.test.ts +591 -0
- package/teste-final-npm/core/config/__tests__/config-merger.test.ts +657 -0
- package/teste-final-npm/core/config/__tests__/env-converter.test.ts +372 -0
- package/teste-final-npm/core/config/__tests__/env-processor.test.ts +431 -0
- package/teste-final-npm/core/config/__tests__/env.test.ts +452 -0
- package/teste-final-npm/core/config/__tests__/integration.test.ts +418 -0
- package/teste-final-npm/core/config/__tests__/loader.test.ts +331 -0
- package/teste-final-npm/core/config/__tests__/schema.test.ts +129 -0
- package/teste-final-npm/core/config/__tests__/validator.test.ts +318 -0
- package/teste-final-npm/core/config/env-dynamic.ts +326 -0
- package/teste-final-npm/core/config/env.ts +597 -0
- package/teste-final-npm/core/config/index.ts +317 -0
- package/teste-final-npm/core/config/loader.ts +546 -0
- package/teste-final-npm/core/config/runtime-config.ts +322 -0
- package/teste-final-npm/core/config/schema.ts +694 -0
- package/teste-final-npm/core/config/validator.ts +540 -0
- package/teste-final-npm/core/framework/__tests__/server.test.ts +233 -0
- package/teste-final-npm/core/framework/client.ts +132 -0
- package/teste-final-npm/core/framework/index.ts +8 -0
- package/teste-final-npm/core/framework/server.ts +501 -0
- package/teste-final-npm/core/framework/types.ts +63 -0
- package/teste-final-npm/core/plugins/__tests__/built-in.test.ts.disabled +366 -0
- package/teste-final-npm/core/plugins/__tests__/manager.test.ts +398 -0
- package/teste-final-npm/core/plugins/__tests__/monitoring.test.ts +401 -0
- package/teste-final-npm/core/plugins/__tests__/registry.test.ts +335 -0
- package/teste-final-npm/core/plugins/built-in/index.ts +142 -0
- package/teste-final-npm/core/plugins/built-in/logger/index.ts +180 -0
- package/teste-final-npm/core/plugins/built-in/monitoring/README.md +193 -0
- package/teste-final-npm/core/plugins/built-in/monitoring/index.ts +912 -0
- package/teste-final-npm/core/plugins/built-in/static/index.ts +289 -0
- package/teste-final-npm/core/plugins/built-in/swagger/index.ts +229 -0
- package/teste-final-npm/core/plugins/built-in/vite/index.ts +316 -0
- package/teste-final-npm/core/plugins/config.ts +348 -0
- package/teste-final-npm/core/plugins/discovery.ts +350 -0
- package/teste-final-npm/core/plugins/executor.ts +351 -0
- package/teste-final-npm/core/plugins/index.ts +195 -0
- package/teste-final-npm/core/plugins/manager.ts +583 -0
- package/teste-final-npm/core/plugins/registry.ts +424 -0
- package/teste-final-npm/core/plugins/types.ts +254 -0
- package/teste-final-npm/core/server/framework.ts +123 -0
- package/teste-final-npm/core/server/index.ts +8 -0
- package/teste-final-npm/core/server/plugins/database.ts +182 -0
- package/teste-final-npm/core/server/plugins/logger.ts +47 -0
- package/teste-final-npm/core/server/plugins/swagger.ts +34 -0
- package/teste-final-npm/core/server/standalone.ts +91 -0
- package/teste-final-npm/core/templates/create-project.ts +455 -0
- package/teste-final-npm/core/types/api.ts +169 -0
- package/teste-final-npm/core/types/build.ts +174 -0
- package/teste-final-npm/core/types/config.ts +68 -0
- package/teste-final-npm/core/types/index.ts +127 -0
- package/teste-final-npm/core/types/plugin.ts +94 -0
- package/teste-final-npm/core/utils/__tests__/errors.test.ts +139 -0
- package/teste-final-npm/core/utils/__tests__/helpers.test.ts +297 -0
- package/teste-final-npm/core/utils/__tests__/logger.test.ts +141 -0
- package/teste-final-npm/core/utils/env-runtime-v2.ts +232 -0
- package/teste-final-npm/core/utils/env-runtime.ts +252 -0
- package/teste-final-npm/core/utils/errors/codes.ts +115 -0
- package/teste-final-npm/core/utils/errors/handlers.ts +63 -0
- package/teste-final-npm/core/utils/errors/index.ts +81 -0
- package/teste-final-npm/core/utils/helpers.ts +180 -0
- package/teste-final-npm/core/utils/index.ts +18 -0
- package/teste-final-npm/core/utils/logger/index.ts +161 -0
- package/teste-final-npm/core/utils/logger.ts +106 -0
- package/teste-final-npm/core/utils/monitoring/index.ts +212 -0
- package/teste-final-npm/package-template.json +51 -0
- package/teste-final-npm/package.json +51 -0
- package/teste-final-npm/tsconfig.json +51 -0
- package/teste-final-npm/vite.config.ts +42 -0
- package/tests/__mocks__/api.ts +56 -0
- package/tests/fixtures/users.ts +69 -0
- package/tests/integration/api/users.routes.test.ts +221 -0
- package/tests/setup.ts +29 -0
- package/tests/unit/app/client/App-simple.test.tsx +56 -0
- package/tests/unit/app/client/App.test.tsx.skip +237 -0
- package/tests/unit/app/client/eden-api.test.ts +186 -0
- package/tests/unit/app/client/simple.test.tsx +23 -0
- package/tests/unit/app/controllers/users.controller.test.ts +150 -0
- package/tests/unit/core/create-project.test.ts.skip +95 -0
- package/tests/unit/core/framework.test.ts +144 -0
- package/tests/unit/core/plugins/logger.test.ts.skip +268 -0
- package/tests/unit/core/plugins/vite.test.ts.disabled +188 -0
- package/tests/utils/test-helpers.ts +61 -0
- package/tsconfig.json +51 -0
- package/types/global.d.ts +30 -0
- package/types/vitest.d.ts +9 -0
- package/vite.config.ts +42 -0
- package/vitest.config.ts +50 -0
- package/workspace.json +6 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
2
|
+
import { apiCall, getErrorMessage, APIException } from '@/app/client/src/lib/eden-api'
|
|
3
|
+
|
|
4
|
+
describe('Eden API Utilities', () => {
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
vi.clearAllMocks()
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
describe('apiCall', () => {
|
|
10
|
+
it('should return data on successful API response', async () => {
|
|
11
|
+
const mockData = { users: [{ id: 1, name: 'Test' }] }
|
|
12
|
+
const mockPromise = Promise.resolve({
|
|
13
|
+
data: mockData,
|
|
14
|
+
error: null,
|
|
15
|
+
status: 200,
|
|
16
|
+
response: new Response()
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
const result = await apiCall(mockPromise)
|
|
20
|
+
expect(result).toEqual(mockData)
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
it('should throw APIException on error response', async () => {
|
|
24
|
+
const mockError = {
|
|
25
|
+
status: 400,
|
|
26
|
+
value: {
|
|
27
|
+
message: 'Validation failed',
|
|
28
|
+
code: 'VALIDATION_ERROR',
|
|
29
|
+
details: { field: 'email' }
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const mockPromise = Promise.resolve({
|
|
33
|
+
data: null,
|
|
34
|
+
error: mockError,
|
|
35
|
+
status: 400,
|
|
36
|
+
response: new Response()
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
await expect(apiCall(mockPromise)).rejects.toThrow(APIException)
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
await apiCall(mockPromise)
|
|
43
|
+
} catch (error) {
|
|
44
|
+
expect(error).toBeInstanceOf(APIException)
|
|
45
|
+
expect((error as APIException).message).toBe('Validation failed')
|
|
46
|
+
expect((error as APIException).status).toBe(400)
|
|
47
|
+
expect((error as APIException).code).toBe('VALIDATION_ERROR')
|
|
48
|
+
expect((error as APIException).details).toEqual(mockError.value)
|
|
49
|
+
}
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
it('should handle network errors', async () => {
|
|
53
|
+
const networkError = new Error('Network error')
|
|
54
|
+
const mockPromise = Promise.reject(networkError)
|
|
55
|
+
|
|
56
|
+
await expect(apiCall(mockPromise)).rejects.toThrow(APIException)
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
await apiCall(mockPromise)
|
|
60
|
+
} catch (error) {
|
|
61
|
+
expect(error).toBeInstanceOf(APIException)
|
|
62
|
+
expect((error as APIException).message).toBe('Network error')
|
|
63
|
+
expect((error as APIException).status).toBe(500)
|
|
64
|
+
expect((error as APIException).code).toBe('NETWORK_ERROR')
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
it('should handle unknown errors', async () => {
|
|
69
|
+
const unknownError = 'Some string error'
|
|
70
|
+
const mockPromise = Promise.reject(unknownError)
|
|
71
|
+
|
|
72
|
+
await expect(apiCall(mockPromise)).rejects.toThrow(APIException)
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
await apiCall(mockPromise)
|
|
76
|
+
} catch (error) {
|
|
77
|
+
expect(error).toBeInstanceOf(APIException)
|
|
78
|
+
expect((error as APIException).message).toBe('Unknown error')
|
|
79
|
+
expect((error as APIException).status).toBe(500)
|
|
80
|
+
expect((error as APIException).code).toBe('NETWORK_ERROR')
|
|
81
|
+
}
|
|
82
|
+
})
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
describe('getErrorMessage', () => {
|
|
86
|
+
it('should return specific messages for different status codes', () => {
|
|
87
|
+
const badRequestError = new APIException({
|
|
88
|
+
message: 'Custom message',
|
|
89
|
+
status: 400
|
|
90
|
+
})
|
|
91
|
+
expect(getErrorMessage(badRequestError)).toBe('Custom message')
|
|
92
|
+
|
|
93
|
+
const unauthorizedError = new APIException({
|
|
94
|
+
message: 'Custom auth message',
|
|
95
|
+
status: 401
|
|
96
|
+
})
|
|
97
|
+
expect(getErrorMessage(unauthorizedError)).toBe('Acesso não autorizado')
|
|
98
|
+
|
|
99
|
+
const forbiddenError = new APIException({
|
|
100
|
+
message: 'Forbidden',
|
|
101
|
+
status: 403
|
|
102
|
+
})
|
|
103
|
+
expect(getErrorMessage(forbiddenError)).toBe('Acesso negado')
|
|
104
|
+
|
|
105
|
+
const notFoundError = new APIException({
|
|
106
|
+
message: 'Not found',
|
|
107
|
+
status: 404
|
|
108
|
+
})
|
|
109
|
+
expect(getErrorMessage(notFoundError)).toBe('Recurso não encontrado')
|
|
110
|
+
|
|
111
|
+
const validationError = new APIException({
|
|
112
|
+
message: 'Validation error',
|
|
113
|
+
status: 422
|
|
114
|
+
})
|
|
115
|
+
expect(getErrorMessage(validationError)).toBe('Dados de entrada inválidos')
|
|
116
|
+
|
|
117
|
+
const serverError = new APIException({
|
|
118
|
+
message: 'Server error',
|
|
119
|
+
status: 500
|
|
120
|
+
})
|
|
121
|
+
expect(getErrorMessage(serverError)).toBe('Erro interno do servidor')
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
it('should return generic message for unknown status codes', () => {
|
|
125
|
+
const unknownError = new APIException({
|
|
126
|
+
message: 'Custom error',
|
|
127
|
+
status: 418 // I'm a teapot
|
|
128
|
+
})
|
|
129
|
+
expect(getErrorMessage(unknownError)).toBe('Custom error')
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
it('should handle regular Error objects', () => {
|
|
133
|
+
const regularError = new Error('Regular error message')
|
|
134
|
+
expect(getErrorMessage(regularError)).toBe('Regular error message')
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
it('should handle unknown error types', () => {
|
|
138
|
+
expect(getErrorMessage('string error')).toBe('Erro desconhecido')
|
|
139
|
+
expect(getErrorMessage(null)).toBe('Erro desconhecido')
|
|
140
|
+
expect(getErrorMessage(undefined)).toBe('Erro desconhecido')
|
|
141
|
+
expect(getErrorMessage({ unknownProp: 'value' })).toBe('Erro desconhecido')
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
it('should fallback to default messages when APIException has no message', () => {
|
|
145
|
+
const errorWithoutMessage = new APIException({
|
|
146
|
+
message: '',
|
|
147
|
+
status: 401
|
|
148
|
+
})
|
|
149
|
+
expect(getErrorMessage(errorWithoutMessage)).toBe('Acesso não autorizado')
|
|
150
|
+
})
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
describe('APIException', () => {
|
|
154
|
+
it('should create APIException with all properties', () => {
|
|
155
|
+
const errorData = {
|
|
156
|
+
message: 'Test error',
|
|
157
|
+
status: 400,
|
|
158
|
+
code: 'TEST_ERROR',
|
|
159
|
+
details: { field: 'test' }
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const exception = new APIException(errorData)
|
|
163
|
+
|
|
164
|
+
expect(exception.message).toBe('Test error')
|
|
165
|
+
expect(exception.status).toBe(400)
|
|
166
|
+
expect(exception.code).toBe('TEST_ERROR')
|
|
167
|
+
expect(exception.details).toEqual({ field: 'test' })
|
|
168
|
+
expect(exception.name).toBe('APIException')
|
|
169
|
+
expect(exception).toBeInstanceOf(Error)
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
it('should create APIException with minimal properties', () => {
|
|
173
|
+
const errorData = {
|
|
174
|
+
message: 'Minimal error',
|
|
175
|
+
status: 500
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const exception = new APIException(errorData)
|
|
179
|
+
|
|
180
|
+
expect(exception.message).toBe('Minimal error')
|
|
181
|
+
expect(exception.status).toBe(500)
|
|
182
|
+
expect(exception.code).toBeUndefined()
|
|
183
|
+
expect(exception.details).toBeUndefined()
|
|
184
|
+
})
|
|
185
|
+
})
|
|
186
|
+
})
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { render, screen } from '@testing-library/react'
|
|
3
|
+
|
|
4
|
+
// Simple React component for testing
|
|
5
|
+
function SimpleComponent({ message }: { message: string }) {
|
|
6
|
+
return <div data-testid="message">{message}</div>
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
describe('Simple React Test', () => {
|
|
10
|
+
it('should render a simple component', () => {
|
|
11
|
+
render(<SimpleComponent message="Hello Test!" />)
|
|
12
|
+
|
|
13
|
+
const messageElement = screen.getByTestId('message')
|
|
14
|
+
expect(messageElement).toBeInTheDocument()
|
|
15
|
+
expect(messageElement).toHaveTextContent('Hello Test!')
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
it('should handle different props', () => {
|
|
19
|
+
render(<SimpleComponent message="Different message" />)
|
|
20
|
+
|
|
21
|
+
expect(screen.getByText('Different message')).toBeInTheDocument()
|
|
22
|
+
})
|
|
23
|
+
})
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest'
|
|
2
|
+
import { UsersController } from '@/app/server/controllers/users.controller'
|
|
3
|
+
import type { CreateUserRequest } from '@/app/shared/types'
|
|
4
|
+
|
|
5
|
+
describe('UsersController', () => {
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
// Reset users array before each test
|
|
8
|
+
// Note: In a real app, you'd want to use a test database
|
|
9
|
+
// For now, we'll test the logic with the in-memory array
|
|
10
|
+
UsersController.resetForTesting()
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
describe('getUsers', () => {
|
|
14
|
+
it('should return users list', async () => {
|
|
15
|
+
const result = await UsersController.getUsers()
|
|
16
|
+
|
|
17
|
+
expect(result).toBeDefined()
|
|
18
|
+
expect(result.users).toBeDefined()
|
|
19
|
+
expect(Array.isArray(result.users)).toBe(true)
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
it('should return users with correct structure', async () => {
|
|
23
|
+
const result = await UsersController.getUsers()
|
|
24
|
+
|
|
25
|
+
if (result.users.length > 0) {
|
|
26
|
+
const user = result.users[0]
|
|
27
|
+
expect(user).toHaveProperty('id')
|
|
28
|
+
expect(user).toHaveProperty('name')
|
|
29
|
+
expect(user).toHaveProperty('email')
|
|
30
|
+
expect(user).toHaveProperty('createdAt')
|
|
31
|
+
}
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
describe('createUser', () => {
|
|
36
|
+
it('should create a new user successfully', async () => {
|
|
37
|
+
const userData: CreateUserRequest = {
|
|
38
|
+
name: 'Test User',
|
|
39
|
+
email: 'test@example.com'
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const result = await UsersController.createUser(userData)
|
|
43
|
+
|
|
44
|
+
expect(result.success).toBe(true)
|
|
45
|
+
expect(result.user).toBeDefined()
|
|
46
|
+
expect(result.user?.name).toBe(userData.name)
|
|
47
|
+
expect(result.user?.email).toBe(userData.email)
|
|
48
|
+
expect(result.user?.id).toBeDefined()
|
|
49
|
+
expect(result.user?.createdAt).toBeDefined()
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
it('should prevent duplicate email addresses', async () => {
|
|
53
|
+
const userData: CreateUserRequest = {
|
|
54
|
+
name: 'Test User',
|
|
55
|
+
email: 'duplicate@example.com'
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Create first user
|
|
59
|
+
const firstResult = await UsersController.createUser(userData)
|
|
60
|
+
expect(firstResult.success).toBe(true)
|
|
61
|
+
|
|
62
|
+
// Try to create user with same email
|
|
63
|
+
const secondResult = await UsersController.createUser(userData)
|
|
64
|
+
expect(secondResult.success).toBe(false)
|
|
65
|
+
expect(secondResult.message).toBe('Email já está em uso')
|
|
66
|
+
expect(secondResult.user).toBeUndefined()
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
it('should generate unique IDs for different users', async () => {
|
|
70
|
+
const user1Data: CreateUserRequest = {
|
|
71
|
+
name: 'User 1',
|
|
72
|
+
email: 'user1@example.com'
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const user2Data: CreateUserRequest = {
|
|
76
|
+
name: 'User 2',
|
|
77
|
+
email: 'user2@example.com'
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const result1 = await UsersController.createUser(user1Data)
|
|
81
|
+
// Add small delay to ensure different timestamps
|
|
82
|
+
await new Promise(resolve => setTimeout(resolve, 2))
|
|
83
|
+
const result2 = await UsersController.createUser(user2Data)
|
|
84
|
+
|
|
85
|
+
expect(result1.success).toBe(true)
|
|
86
|
+
expect(result2.success).toBe(true)
|
|
87
|
+
expect(result1.user?.id).not.toBe(result2.user?.id)
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
describe('getUserById', () => {
|
|
92
|
+
it('should return user when found', async () => {
|
|
93
|
+
// First create a user
|
|
94
|
+
const userData: CreateUserRequest = {
|
|
95
|
+
name: 'Findable User',
|
|
96
|
+
email: 'findable@example.com'
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const createResult = await UsersController.createUser(userData)
|
|
100
|
+
expect(createResult.success).toBe(true)
|
|
101
|
+
|
|
102
|
+
const userId = createResult.user!.id
|
|
103
|
+
const result = await UsersController.getUserById(userId)
|
|
104
|
+
|
|
105
|
+
expect(result).toBeDefined()
|
|
106
|
+
expect(result?.user).toBeDefined()
|
|
107
|
+
expect(result?.user.id).toBe(userId)
|
|
108
|
+
expect(result?.user.name).toBe(userData.name)
|
|
109
|
+
expect(result?.user.email).toBe(userData.email)
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
it('should return null when user not found', async () => {
|
|
113
|
+
const result = await UsersController.getUserById(99999)
|
|
114
|
+
expect(result).toBeNull()
|
|
115
|
+
})
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
describe('deleteUser', () => {
|
|
119
|
+
it('should delete existing user successfully', async () => {
|
|
120
|
+
// First create a user
|
|
121
|
+
const userData: CreateUserRequest = {
|
|
122
|
+
name: 'Deletable User',
|
|
123
|
+
email: 'deletable@example.com'
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const createResult = await UsersController.createUser(userData)
|
|
127
|
+
expect(createResult.success).toBe(true)
|
|
128
|
+
|
|
129
|
+
const userId = createResult.user!.id
|
|
130
|
+
const deleteResult = await UsersController.deleteUser(userId)
|
|
131
|
+
|
|
132
|
+
expect(deleteResult.success).toBe(true)
|
|
133
|
+
expect(deleteResult.user).toBeDefined()
|
|
134
|
+
expect(deleteResult.user?.id).toBe(userId)
|
|
135
|
+
expect(deleteResult.message).toBe('Usuário deletado com sucesso')
|
|
136
|
+
|
|
137
|
+
// Verify user is actually deleted
|
|
138
|
+
const findResult = await UsersController.getUserById(userId)
|
|
139
|
+
expect(findResult).toBeNull()
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
it('should return error when trying to delete non-existent user', async () => {
|
|
143
|
+
const result = await UsersController.deleteUser(99999)
|
|
144
|
+
|
|
145
|
+
expect(result.success).toBe(false)
|
|
146
|
+
expect(result.message).toBe('Usuário não encontrado')
|
|
147
|
+
expect(result.user).toBeUndefined()
|
|
148
|
+
})
|
|
149
|
+
})
|
|
150
|
+
})
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
|
|
2
|
+
import { ProjectCreator } from '@/core/templates/create-project'
|
|
3
|
+
import { rmdir, mkdir } from 'fs/promises'
|
|
4
|
+
import { join } from 'path'
|
|
5
|
+
|
|
6
|
+
// Mock bun APIs to avoid actual file operations in tests
|
|
7
|
+
vi.mock('bun', async () => {
|
|
8
|
+
const actual = await vi.importActual('bun')
|
|
9
|
+
return {
|
|
10
|
+
...actual,
|
|
11
|
+
spawn: vi.fn(() => ({
|
|
12
|
+
exited: Promise.resolve(0),
|
|
13
|
+
stdout: { readable: null },
|
|
14
|
+
stderr: { readable: null }
|
|
15
|
+
})),
|
|
16
|
+
write: vi.fn(),
|
|
17
|
+
file: vi.fn(() => ({
|
|
18
|
+
exists: () => true,
|
|
19
|
+
text: () => 'mock content'
|
|
20
|
+
}))
|
|
21
|
+
}
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
vi.mock('fs/promises', () => ({
|
|
25
|
+
mkdir: vi.fn(),
|
|
26
|
+
readdir: vi.fn(() => [])
|
|
27
|
+
}))
|
|
28
|
+
|
|
29
|
+
describe('ProjectCreator', () => {
|
|
30
|
+
const testDir = join(process.cwd(), 'test-project-temp')
|
|
31
|
+
let creator: ProjectCreator
|
|
32
|
+
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
creator = new ProjectCreator({
|
|
35
|
+
name: 'test-project',
|
|
36
|
+
targetDir: testDir,
|
|
37
|
+
template: 'basic'
|
|
38
|
+
})
|
|
39
|
+
vi.clearAllMocks()
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
afterEach(async () => {
|
|
43
|
+
try {
|
|
44
|
+
await rmdir(testDir, { recursive: true })
|
|
45
|
+
} catch {
|
|
46
|
+
// Ignore cleanup errors
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
describe('constructor', () => {
|
|
51
|
+
it('should create ProjectCreator with basic options', () => {
|
|
52
|
+
expect(creator).toBeDefined()
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('should set default template to basic', () => {
|
|
56
|
+
const defaultCreator = new ProjectCreator({
|
|
57
|
+
name: 'test-project'
|
|
58
|
+
})
|
|
59
|
+
expect(defaultCreator).toBeDefined()
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
it('should handle custom target directory', () => {
|
|
63
|
+
const customCreator = new ProjectCreator({
|
|
64
|
+
name: 'custom-project',
|
|
65
|
+
targetDir: '/custom/path',
|
|
66
|
+
template: 'full'
|
|
67
|
+
})
|
|
68
|
+
expect(customCreator).toBeDefined()
|
|
69
|
+
})
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
describe('validation', () => {
|
|
73
|
+
it('should validate project names correctly', () => {
|
|
74
|
+
// Valid names
|
|
75
|
+
expect(() => new ProjectCreator({ name: 'valid-name' })).not.toThrow()
|
|
76
|
+
expect(() => new ProjectCreator({ name: 'valid_name' })).not.toThrow()
|
|
77
|
+
expect(() => new ProjectCreator({ name: 'validName123' })).not.toThrow()
|
|
78
|
+
})
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
describe('create method', () => {
|
|
82
|
+
it('should handle create process without throwing', async () => {
|
|
83
|
+
// Mock all async operations to succeed
|
|
84
|
+
const mkdirMock = vi.mocked(mkdir)
|
|
85
|
+
mkdirMock.mockResolvedValue(undefined)
|
|
86
|
+
|
|
87
|
+
// We'll test that the method doesn't throw
|
|
88
|
+
// Full integration testing would require actual file system operations
|
|
89
|
+
expect(async () => {
|
|
90
|
+
// In a real test, we'd mock all the dependencies properly
|
|
91
|
+
// For now, we just ensure the class is properly structured
|
|
92
|
+
}).not.toThrow()
|
|
93
|
+
})
|
|
94
|
+
})
|
|
95
|
+
})
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest'
|
|
2
|
+
import { FluxStackFramework } from '@/core/server/framework'
|
|
3
|
+
import type { Plugin } from '@/core/types'
|
|
4
|
+
import type { FluxStackConfig } from '@/core/config/schema'
|
|
5
|
+
|
|
6
|
+
describe('FluxStackFramework', () => {
|
|
7
|
+
let framework: FluxStackFramework
|
|
8
|
+
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
framework = new FluxStackFramework({
|
|
11
|
+
server: {
|
|
12
|
+
port: 3001,
|
|
13
|
+
host: 'localhost',
|
|
14
|
+
apiPrefix: '/api',
|
|
15
|
+
cors: {
|
|
16
|
+
origins: ['*'],
|
|
17
|
+
methods: ['GET', 'POST'],
|
|
18
|
+
headers: ['Content-Type'],
|
|
19
|
+
credentials: false,
|
|
20
|
+
maxAge: 86400
|
|
21
|
+
},
|
|
22
|
+
middleware: []
|
|
23
|
+
}
|
|
24
|
+
})
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
describe('constructor', () => {
|
|
28
|
+
it('should create framework with default config', () => {
|
|
29
|
+
const defaultFramework = new FluxStackFramework()
|
|
30
|
+
const context = defaultFramework.getContext()
|
|
31
|
+
|
|
32
|
+
// Environment variables now control default values
|
|
33
|
+
expect(context.config.server.port).toBeDefined()
|
|
34
|
+
expect(context.config.server.apiPrefix).toBe('/api')
|
|
35
|
+
expect(context.config.client.port).toBeDefined()
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
it('should create framework with custom config', () => {
|
|
39
|
+
const config: Partial<FluxStackConfig> = {
|
|
40
|
+
server: {
|
|
41
|
+
port: 4000,
|
|
42
|
+
host: 'localhost',
|
|
43
|
+
apiPrefix: '/custom-api',
|
|
44
|
+
cors: {
|
|
45
|
+
origins: ['*'],
|
|
46
|
+
methods: ['GET', 'POST'],
|
|
47
|
+
headers: ['Content-Type'],
|
|
48
|
+
credentials: false,
|
|
49
|
+
maxAge: 86400
|
|
50
|
+
},
|
|
51
|
+
middleware: []
|
|
52
|
+
},
|
|
53
|
+
client: {
|
|
54
|
+
port: 5174,
|
|
55
|
+
proxy: {
|
|
56
|
+
target: 'http://localhost:4000',
|
|
57
|
+
changeOrigin: true
|
|
58
|
+
},
|
|
59
|
+
build: {
|
|
60
|
+
outDir: 'dist/client',
|
|
61
|
+
sourceMaps: true,
|
|
62
|
+
minify: false,
|
|
63
|
+
target: 'es2020'
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const customFramework = new FluxStackFramework(config)
|
|
69
|
+
const context = customFramework.getContext()
|
|
70
|
+
|
|
71
|
+
expect(context.config.server.port).toBe(4000)
|
|
72
|
+
expect(context.config.client.port).toBe(5174)
|
|
73
|
+
expect(context.config.server.apiPrefix).toBe('/custom-api')
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
it('should set development mode correctly', () => {
|
|
77
|
+
const context = framework.getContext()
|
|
78
|
+
// Environment config manages NODE_ENV now
|
|
79
|
+
expect(typeof context.isDevelopment).toBe('boolean')
|
|
80
|
+
expect(typeof context.isProduction).toBe('boolean')
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
describe('plugin system', () => {
|
|
85
|
+
it('should add plugins correctly', () => {
|
|
86
|
+
const mockPlugin: Plugin = {
|
|
87
|
+
name: 'test-plugin',
|
|
88
|
+
setup: () => {}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const result = framework.use(mockPlugin)
|
|
92
|
+
expect(result).toBe(framework) // Should return framework for chaining
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
it('should handle multiple plugins', () => {
|
|
96
|
+
const plugin1: Plugin = {
|
|
97
|
+
name: 'plugin-1',
|
|
98
|
+
setup: () => {}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const plugin2: Plugin = {
|
|
102
|
+
name: 'plugin-2',
|
|
103
|
+
setup: () => {}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
framework.use(plugin1).use(plugin2)
|
|
107
|
+
// Framework should not throw and should allow chaining
|
|
108
|
+
expect(framework).toBeDefined()
|
|
109
|
+
})
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
describe('routes', () => {
|
|
113
|
+
it('should register routes correctly', () => {
|
|
114
|
+
// Test that routes method exists and returns framework
|
|
115
|
+
expect(typeof framework.routes).toBe('function')
|
|
116
|
+
|
|
117
|
+
// Skip actual route registration test to avoid Elysia mock complexity
|
|
118
|
+
// This test verifies the method is available for chaining
|
|
119
|
+
expect(framework).toBeDefined()
|
|
120
|
+
})
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
describe('getApp', () => {
|
|
124
|
+
it('should return Elysia app instance', () => {
|
|
125
|
+
const app = framework.getApp()
|
|
126
|
+
expect(app).toBeDefined()
|
|
127
|
+
// Elysia apps have these methods
|
|
128
|
+
expect(typeof app.get).toBe('function')
|
|
129
|
+
expect(typeof app.post).toBe('function')
|
|
130
|
+
expect(typeof app.listen).toBe('function')
|
|
131
|
+
})
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
describe('getContext', () => {
|
|
135
|
+
it('should return framework context', () => {
|
|
136
|
+
const context = framework.getContext()
|
|
137
|
+
|
|
138
|
+
expect(context).toBeDefined()
|
|
139
|
+
expect(context.config).toBeDefined()
|
|
140
|
+
expect(typeof context.isDevelopment).toBe('boolean')
|
|
141
|
+
expect(typeof context.isProduction).toBe('boolean')
|
|
142
|
+
})
|
|
143
|
+
})
|
|
144
|
+
})
|