create-fluxstack 1.0.1 → 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/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/bun.lock +21 -11
- package/bunfig.toml +16 -0
- package/config/fluxstack.config.ts +48 -0
- package/create-fluxstack.ts +2 -3
- 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/types/global.d.ts +30 -0
- package/types/vitest.d.ts +9 -0
- package/vitest.config.ts +50 -0
- package/workspace.json +6 -0
- package/.env +0 -30
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estratégia Híbrida: Env Fixado + Env Dinâmico
|
|
3
|
+
* Use o melhor de cada abordagem conforme necessário
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { env } from '@/core/utils/env-runtime'
|
|
7
|
+
|
|
8
|
+
// ========================================
|
|
9
|
+
// CONFIGURAÇÕES FIXADAS (Build-time)
|
|
10
|
+
// ========================================
|
|
11
|
+
// Use para valores que nunca mudam ou precisam de máxima performance
|
|
12
|
+
|
|
13
|
+
// App metadata - fixado é OK
|
|
14
|
+
const APP_NAME = process.env.FLUXSTACK_APP_NAME || 'FluxStack'
|
|
15
|
+
const APP_VERSION = process.env.FLUXSTACK_APP_VERSION || '1.0.0'
|
|
16
|
+
|
|
17
|
+
// Feature flags - fixado é OK
|
|
18
|
+
const ENABLE_SWAGGER = process.env.ENABLE_SWAGGER !== 'false'
|
|
19
|
+
const ENABLE_CORS = process.env.ENABLE_CORS !== 'false'
|
|
20
|
+
|
|
21
|
+
// Build configuration - fixado é ideal
|
|
22
|
+
const BUILD_TARGET = process.env.BUILD_TARGET || 'bun'
|
|
23
|
+
const CLIENT_OUTDIR = process.env.CLIENT_OUTDIR || 'dist/client'
|
|
24
|
+
|
|
25
|
+
// ========================================
|
|
26
|
+
// CONFIGURAÇÕES DINÂMICAS (Runtime)
|
|
27
|
+
// ========================================
|
|
28
|
+
// Use para valores que precisam mudar em diferentes deploys
|
|
29
|
+
|
|
30
|
+
// Server config - deve ser dinâmico
|
|
31
|
+
const getServerConfig = () => ({
|
|
32
|
+
port: env.num('PORT', 3000), // 🔄 Dinâmico
|
|
33
|
+
host: env.get('HOST', 'localhost'), // 🔄 Dinâmico
|
|
34
|
+
apiPrefix: env.get('API_PREFIX', '/api')
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
// Database - deve ser dinâmico
|
|
38
|
+
const getDatabaseConfig = () => ({
|
|
39
|
+
url: env.get('DATABASE_URL'), // 🔄 Dinâmico
|
|
40
|
+
maxConnections: env.num('DB_MAX_CONNECTIONS', 10),
|
|
41
|
+
ssl: env.bool('DB_SSL', env.get('NODE_ENV') === 'production')
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
// Secrets - deve ser dinâmico
|
|
45
|
+
const getSecrets = () => ({
|
|
46
|
+
jwtSecret: env.get('JWT_SECRET'), // 🔄 Dinâmico
|
|
47
|
+
apiKey: env.get('API_KEY'),
|
|
48
|
+
encryptionKey: env.get('ENCRYPTION_KEY')
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
// Environment specific - dinâmico
|
|
52
|
+
const getEnvironmentConfig = () => ({
|
|
53
|
+
nodeEnv: env.get('NODE_ENV', 'development'), // 🔄 Dinâmico
|
|
54
|
+
logLevel: env.get('LOG_LEVEL', 'info'),
|
|
55
|
+
debug: env.bool('DEBUG', false)
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
// ========================================
|
|
59
|
+
// CONFIGURAÇÃO HÍBRIDA
|
|
60
|
+
// ========================================
|
|
61
|
+
|
|
62
|
+
export const hybridConfig = {
|
|
63
|
+
// Fixado no build (performance máxima)
|
|
64
|
+
app: {
|
|
65
|
+
name: APP_NAME, // ⚡ Fixado
|
|
66
|
+
version: APP_VERSION, // ⚡ Fixado
|
|
67
|
+
enableSwagger: ENABLE_SWAGGER, // ⚡ Fixado
|
|
68
|
+
enableCors: ENABLE_CORS // ⚡ Fixado
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
build: {
|
|
72
|
+
target: BUILD_TARGET, // ⚡ Fixado
|
|
73
|
+
clientOutDir: CLIENT_OUTDIR // ⚡ Fixado
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
// Dinâmico no runtime (flexibilidade máxima)
|
|
77
|
+
runtime: {
|
|
78
|
+
server: getServerConfig(), // 🔄 Dinâmico
|
|
79
|
+
database: getDatabaseConfig(), // 🔄 Dinâmico
|
|
80
|
+
secrets: getSecrets(), // 🔄 Dinâmico
|
|
81
|
+
environment: getEnvironmentConfig() // 🔄 Dinâmico
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// ========================================
|
|
86
|
+
// EXEMPLO DE USO PRÁTICO
|
|
87
|
+
// ========================================
|
|
88
|
+
|
|
89
|
+
export function createHybridServer() {
|
|
90
|
+
console.log(`🚀 Starting ${hybridConfig.app.name} v${hybridConfig.app.version}`)
|
|
91
|
+
|
|
92
|
+
const { server, database, environment } = hybridConfig.runtime
|
|
93
|
+
|
|
94
|
+
console.log(`📊 Environment: ${environment.nodeEnv}`)
|
|
95
|
+
console.log(`🌐 Server: ${server.host}:${server.port}`)
|
|
96
|
+
console.log(`💾 Database: ${database.url ? '✅ Connected' : '❌ Not configured'}`)
|
|
97
|
+
|
|
98
|
+
// Configuração do FluxStack
|
|
99
|
+
const config = {
|
|
100
|
+
// Valores fixados (build-time) - performance máxima
|
|
101
|
+
app: hybridConfig.app,
|
|
102
|
+
build: hybridConfig.build,
|
|
103
|
+
|
|
104
|
+
// Valores dinâmicos (runtime) - flexibilidade máxima
|
|
105
|
+
server: {
|
|
106
|
+
port: server.port, // 🔄 Pode mudar sem rebuild
|
|
107
|
+
host: server.host, // 🔄 Pode mudar sem rebuild
|
|
108
|
+
apiPrefix: server.apiPrefix,
|
|
109
|
+
cors: {
|
|
110
|
+
origins: env.array('CORS_ORIGINS', ['*']),
|
|
111
|
+
enabled: hybridConfig.app.enableCors // ⚡ Fixado no build
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
logging: {
|
|
116
|
+
level: environment.logLevel, // 🔄 Pode mudar sem rebuild
|
|
117
|
+
debug: environment.debug
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return config
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ========================================
|
|
125
|
+
// OTIMIZAÇÃO POR AMBIENTE
|
|
126
|
+
// ========================================
|
|
127
|
+
|
|
128
|
+
export function createOptimizedConfig() {
|
|
129
|
+
const nodeEnv = env.get('NODE_ENV', 'development')
|
|
130
|
+
|
|
131
|
+
switch (nodeEnv) {
|
|
132
|
+
case 'development':
|
|
133
|
+
return {
|
|
134
|
+
// Development: tudo dinâmico para flexibilidade
|
|
135
|
+
port: env.num('PORT', 3000), // 🔄
|
|
136
|
+
debug: env.bool('DEBUG', true), // 🔄
|
|
137
|
+
logLevel: env.get('LOG_LEVEL', 'debug'), // 🔄
|
|
138
|
+
hotReload: env.bool('HOT_RELOAD', true) // 🔄
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
case 'production':
|
|
142
|
+
return {
|
|
143
|
+
// Production: mix de fixado e dinâmico
|
|
144
|
+
appName: APP_NAME, // ⚡ Fixado (performance)
|
|
145
|
+
version: APP_VERSION, // ⚡ Fixado (performance)
|
|
146
|
+
port: env.num('PORT', 3000), // 🔄 Dinâmico (deploy)
|
|
147
|
+
dbUrl: env.get('DATABASE_URL'), // 🔄 Dinâmico (deploy)
|
|
148
|
+
logLevel: env.get('LOG_LEVEL', 'warn') // 🔄 Dinâmico (ops)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
default:
|
|
152
|
+
return createHybridServer()
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// ========================================
|
|
157
|
+
// PERFORMANCE COMPARISON
|
|
158
|
+
// ========================================
|
|
159
|
+
|
|
160
|
+
export const performanceComparison = {
|
|
161
|
+
// ⚡ ULTRA RÁPIDO - Fixado no build
|
|
162
|
+
fixedConfig: {
|
|
163
|
+
port: 3000, // Literal number
|
|
164
|
+
dbUrl: "postgres://...", // Literal string
|
|
165
|
+
debug: false // Literal boolean
|
|
166
|
+
},
|
|
167
|
+
|
|
168
|
+
// 🔄 LIGEIRAMENTE MAIS LENTO - Dinâmico
|
|
169
|
+
dynamicConfig: {
|
|
170
|
+
port: env.num('PORT', 3000), // Function call
|
|
171
|
+
dbUrl: env.get('DATABASE_URL'), // Function call
|
|
172
|
+
debug: env.bool('DEBUG', false) // Function call
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// ========================================
|
|
177
|
+
// MIGRAÇÃO GRADUAL
|
|
178
|
+
// ========================================
|
|
179
|
+
|
|
180
|
+
export const migrationStrategy = {
|
|
181
|
+
// Passo 1: Identifique configurações críticas
|
|
182
|
+
critical: {
|
|
183
|
+
// Use dinâmico para configs que DEVEM mudar
|
|
184
|
+
port: env.num('PORT', 3000),
|
|
185
|
+
dbUrl: env.get('DATABASE_URL'),
|
|
186
|
+
secrets: env.get('JWT_SECRET')
|
|
187
|
+
},
|
|
188
|
+
|
|
189
|
+
// Passo 2: Mantenha fixado o que não precisa mudar
|
|
190
|
+
static: {
|
|
191
|
+
appName: process.env.APP_NAME || 'MyApp',
|
|
192
|
+
version: process.env.APP_VERSION || '1.0.0',
|
|
193
|
+
features: process.env.FEATURES?.split(',') || []
|
|
194
|
+
},
|
|
195
|
+
|
|
196
|
+
// Passo 3: Migre gradualmente conforme necessário
|
|
197
|
+
gradually: {
|
|
198
|
+
// Comece com fixado...
|
|
199
|
+
logLevel: process.env.LOG_LEVEL || 'info',
|
|
200
|
+
|
|
201
|
+
// ...depois mude para dinâmico quando precisar
|
|
202
|
+
// logLevel: env.get('LOG_LEVEL', 'info')
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export default {
|
|
207
|
+
hybridConfig,
|
|
208
|
+
createHybridServer,
|
|
209
|
+
createOptimizedConfig,
|
|
210
|
+
performanceComparison,
|
|
211
|
+
migrationStrategy
|
|
212
|
+
}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exemplos da API simplificada de Environment Variables
|
|
3
|
+
* Mais elegante, intuitiva e com menos código
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { env, createNamespace, validate, helpers } from '../core/utils/env-runtime-v2'
|
|
7
|
+
|
|
8
|
+
// ========================================
|
|
9
|
+
// 1. CASTING AUTOMÁTICO INTELIGENTE
|
|
10
|
+
// ========================================
|
|
11
|
+
|
|
12
|
+
// ✅ NOVO - API super simples com casting automático
|
|
13
|
+
const config = {
|
|
14
|
+
port: env.get('PORT', 3000), // -> number (baseado no default)
|
|
15
|
+
debug: env.get('DEBUG', false), // -> boolean (baseado no default)
|
|
16
|
+
origins: env.get('CORS_ORIGINS', ['*']), // -> string[] (baseado no default)
|
|
17
|
+
host: env.get('HOST', 'localhost'), // -> string (baseado no default)
|
|
18
|
+
dbUrl: env.get('DATABASE_URL'), // -> string | undefined
|
|
19
|
+
retries: env.get('MAX_RETRIES', 3), // -> number
|
|
20
|
+
features: env.get('FEATURES', ['api']) // -> string[]
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// ❌ ANTES - API verbosa com métodos específicos
|
|
24
|
+
const oldConfig = {
|
|
25
|
+
port: env.num('PORT', 3000),
|
|
26
|
+
debug: env.bool('DEBUG', false),
|
|
27
|
+
origins: env.array('CORS_ORIGINS', ['*']),
|
|
28
|
+
host: env.get('HOST', 'localhost'),
|
|
29
|
+
dbUrl: env.get('DATABASE_URL'),
|
|
30
|
+
retries: env.num('MAX_RETRIES', 3),
|
|
31
|
+
features: env.array('FEATURES', ['api'])
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// ========================================
|
|
35
|
+
// 2. ACESSO DIRETO COMO PROPRIEDADES
|
|
36
|
+
// ========================================
|
|
37
|
+
|
|
38
|
+
console.log(`🚀 Starting on ${env.HOST}:${env.PORT}`) // Direto!
|
|
39
|
+
console.log(`📊 Environment: ${env.NODE_ENV}`) // Direto!
|
|
40
|
+
console.log(`🐛 Debug mode: ${env.DEBUG}`) // Direto!
|
|
41
|
+
console.log(`📋 Swagger: ${env.ENABLE_SWAGGER}`) // Direto!
|
|
42
|
+
console.log(`💾 Database: ${env.DATABASE_URL || 'not configured'}`) // Direto!
|
|
43
|
+
|
|
44
|
+
// Todos com tipos corretos automaticamente!
|
|
45
|
+
|
|
46
|
+
// ========================================
|
|
47
|
+
// 3. CONFIGURAÇÃO DE SERVIDOR SIMPLIFICADA
|
|
48
|
+
// ========================================
|
|
49
|
+
|
|
50
|
+
export function createSimpleServer() {
|
|
51
|
+
return {
|
|
52
|
+
// Casting automático baseado no tipo do default
|
|
53
|
+
server: {
|
|
54
|
+
port: env.get('PORT', 3000), // number
|
|
55
|
+
host: env.get('HOST', 'localhost'), // string
|
|
56
|
+
timeout: env.get('TIMEOUT', 30000), // number
|
|
57
|
+
keepAlive: env.get('KEEP_ALIVE', true) // boolean
|
|
58
|
+
},
|
|
59
|
+
|
|
60
|
+
// Ou acesso direto
|
|
61
|
+
database: {
|
|
62
|
+
url: env.DATABASE_URL, // string
|
|
63
|
+
ssl: env.DB_SSL, // boolean
|
|
64
|
+
port: env.DB_PORT, // number
|
|
65
|
+
maxConnections: env.get('DB_MAX_CONNECTIONS', 10) // number
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
cors: {
|
|
69
|
+
origins: env.CORS_ORIGINS, // string[]
|
|
70
|
+
credentials: env.get('CORS_CREDENTIALS', false), // boolean
|
|
71
|
+
maxAge: env.get('CORS_MAX_AGE', 86400) // number
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ========================================
|
|
77
|
+
// 4. NAMESPACES PARA ORGANIZAÇÃO
|
|
78
|
+
// ========================================
|
|
79
|
+
|
|
80
|
+
// Criar namespaces especializados
|
|
81
|
+
const db = createNamespace('DATABASE_')
|
|
82
|
+
const redis = createNamespace('REDIS_')
|
|
83
|
+
const smtp = createNamespace('SMTP_')
|
|
84
|
+
|
|
85
|
+
const databaseConfig = {
|
|
86
|
+
url: db.get('URL'), // DATABASE_URL
|
|
87
|
+
host: db.get('HOST', 'localhost'), // DATABASE_HOST
|
|
88
|
+
port: db.get('PORT', 5432), // DATABASE_PORT (number)
|
|
89
|
+
ssl: db.get('SSL', false), // DATABASE_SSL (boolean)
|
|
90
|
+
poolSize: db.get('POOL_SIZE', 10), // DATABASE_POOL_SIZE (number)
|
|
91
|
+
timeout: db.get('TIMEOUT', 30000) // DATABASE_TIMEOUT (number)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const redisConfig = {
|
|
95
|
+
url: redis.get('URL'), // REDIS_URL
|
|
96
|
+
host: redis.get('HOST', 'localhost'), // REDIS_HOST
|
|
97
|
+
port: redis.get('PORT', 6379), // REDIS_PORT (number)
|
|
98
|
+
password: redis.get('PASSWORD') // REDIS_PASSWORD
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ========================================
|
|
102
|
+
// 5. CONFIGURAÇÃO CONDICIONAL ELEGANTE
|
|
103
|
+
// ========================================
|
|
104
|
+
|
|
105
|
+
export function createConditionalConfig() {
|
|
106
|
+
const config: any = {
|
|
107
|
+
app: {
|
|
108
|
+
name: env.FLUXSTACK_APP_NAME, // 'FluxStack'
|
|
109
|
+
version: env.FLUXSTACK_APP_VERSION // '1.0.0'
|
|
110
|
+
},
|
|
111
|
+
|
|
112
|
+
server: {
|
|
113
|
+
port: env.PORT, // 3000
|
|
114
|
+
host: env.HOST // 'localhost'
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Adicionar database se configurado
|
|
119
|
+
if (env.has('DATABASE_URL')) {
|
|
120
|
+
config.database = {
|
|
121
|
+
url: env.DATABASE_URL,
|
|
122
|
+
ssl: env.get('DB_SSL', env.NODE_ENV === 'production') // smart default
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Features opcionais
|
|
127
|
+
if (env.ENABLE_MONITORING) {
|
|
128
|
+
config.monitoring = {
|
|
129
|
+
metrics: env.ENABLE_METRICS,
|
|
130
|
+
interval: env.get('METRICS_INTERVAL', 30000)
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return config
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// ========================================
|
|
138
|
+
// 6. VALIDAÇÃO SIMPLIFICADA
|
|
139
|
+
// ========================================
|
|
140
|
+
|
|
141
|
+
export function validateEnvironment() {
|
|
142
|
+
// Vars obrigatórias
|
|
143
|
+
validate.require(['NODE_ENV'])
|
|
144
|
+
|
|
145
|
+
// Produção precisa de mais vars
|
|
146
|
+
if (helpers.isProduction()) {
|
|
147
|
+
validate.require(['DATABASE_URL', 'JWT_SECRET'])
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Validar valores específicos
|
|
151
|
+
validate.oneOf('NODE_ENV', ['development', 'production', 'test'])
|
|
152
|
+
validate.oneOf('LOG_LEVEL', ['debug', 'info', 'warn', 'error'])
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// ========================================
|
|
156
|
+
// 7. HELPERS ÚTEIS
|
|
157
|
+
// ========================================
|
|
158
|
+
|
|
159
|
+
export function printConfiguration() {
|
|
160
|
+
console.log('🔧 Configuration loaded:')
|
|
161
|
+
console.log(` Environment: ${env.NODE_ENV}`)
|
|
162
|
+
console.log(` Server: ${helpers.getServerUrl()}`)
|
|
163
|
+
console.log(` Client: ${helpers.getClientUrl()}`)
|
|
164
|
+
console.log(` Database: ${helpers.getDatabaseUrl() || 'not configured'}`)
|
|
165
|
+
console.log(` Debug: ${env.DEBUG ? 'enabled' : 'disabled'}`)
|
|
166
|
+
console.log(` Swagger: ${env.ENABLE_SWAGGER ? 'enabled' : 'disabled'}`)
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// ========================================
|
|
170
|
+
// 8. FLUXSTACK INTEGRATION SIMPLIFICADA
|
|
171
|
+
// ========================================
|
|
172
|
+
|
|
173
|
+
import { FluxStackFramework } from '../core/framework/server'
|
|
174
|
+
|
|
175
|
+
export function createSimpleFluxStack() {
|
|
176
|
+
validateEnvironment()
|
|
177
|
+
|
|
178
|
+
const app = new FluxStackFramework({
|
|
179
|
+
app: {
|
|
180
|
+
name: env.FLUXSTACK_APP_NAME, // Direto!
|
|
181
|
+
version: env.FLUXSTACK_APP_VERSION // Direto!
|
|
182
|
+
},
|
|
183
|
+
|
|
184
|
+
server: {
|
|
185
|
+
port: env.PORT, // Direto! (number)
|
|
186
|
+
host: env.HOST, // Direto! (string)
|
|
187
|
+
apiPrefix: env.API_PREFIX, // Direto! (string)
|
|
188
|
+
cors: {
|
|
189
|
+
origins: env.CORS_ORIGINS, // Direto! (string[])
|
|
190
|
+
credentials: env.get('CORS_CREDENTIALS', false) // boolean
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
|
|
194
|
+
client: {
|
|
195
|
+
port: env.VITE_PORT, // Direto! (number)
|
|
196
|
+
proxy: {
|
|
197
|
+
target: helpers.getServerUrl() // Helper!
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
// Plugins condicionais
|
|
203
|
+
if (env.ENABLE_SWAGGER) {
|
|
204
|
+
console.log('📋 Swagger enabled')
|
|
205
|
+
// app.use(swaggerPlugin)
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if (env.ENABLE_MONITORING) {
|
|
209
|
+
console.log('📊 Monitoring enabled')
|
|
210
|
+
// app.use(monitoringPlugin)
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return app
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ========================================
|
|
217
|
+
// 9. COMPARAÇÃO ANTES vs DEPOIS
|
|
218
|
+
// ========================================
|
|
219
|
+
|
|
220
|
+
// ❌ ANTES - Verboso
|
|
221
|
+
const beforeConfig = {
|
|
222
|
+
port: env.num('PORT', 3000),
|
|
223
|
+
debug: env.bool('DEBUG', false),
|
|
224
|
+
origins: env.array('CORS_ORIGINS', ['*']),
|
|
225
|
+
retries: env.num('MAX_RETRIES', 3),
|
|
226
|
+
timeout: env.num('TIMEOUT', 30000)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// ✅ DEPOIS - Limpo e elegante
|
|
230
|
+
const afterConfig = {
|
|
231
|
+
port: env.get('PORT', 3000), // casting automático
|
|
232
|
+
debug: env.get('DEBUG', false), // casting automático
|
|
233
|
+
origins: env.get('CORS_ORIGINS', ['*']), // casting automático
|
|
234
|
+
retries: env.get('MAX_RETRIES', 3), // casting automático
|
|
235
|
+
timeout: env.get('TIMEOUT', 30000) // casting automático
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Ou ainda mais simples com propriedades diretas:
|
|
239
|
+
const simpleConfig = {
|
|
240
|
+
port: env.PORT, // Direto da propriedade
|
|
241
|
+
debug: env.DEBUG, // Direto da propriedade
|
|
242
|
+
origins: env.CORS_ORIGINS // Direto da propriedade
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export default {
|
|
246
|
+
createSimpleServer,
|
|
247
|
+
createConditionalConfig,
|
|
248
|
+
validateEnvironment,
|
|
249
|
+
printConfiguration,
|
|
250
|
+
createSimpleFluxStack
|
|
251
|
+
}
|
package/flux-cli.ts
ADDED
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* FluxStack CLI - Comando nativo `flux`
|
|
5
|
+
* Permite criar projetos sem dependências externas ou configurações manuais
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { promises as fs } from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { spawn } from 'child_process';
|
|
11
|
+
|
|
12
|
+
interface CreateProjectOptions {
|
|
13
|
+
name: string;
|
|
14
|
+
template?: 'basic' | 'minimal' | 'full';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async function createProject(options: CreateProjectOptions) {
|
|
18
|
+
const { name, template = 'basic' } = options;
|
|
19
|
+
const projectPath = path.resolve(name);
|
|
20
|
+
|
|
21
|
+
console.log(`🚀 Creating FluxStack project: ${name}`);
|
|
22
|
+
console.log(`📋 Template: ${template}`);
|
|
23
|
+
console.log(`📁 Location: ${projectPath}`);
|
|
24
|
+
console.log();
|
|
25
|
+
|
|
26
|
+
// Check if directory exists
|
|
27
|
+
try {
|
|
28
|
+
await fs.access(projectPath);
|
|
29
|
+
console.error(`❌ Directory "${name}" already exists`);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
} catch (error: any) {
|
|
32
|
+
if (error.code !== 'ENOENT') {
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Create project directory
|
|
38
|
+
await fs.mkdir(projectPath, { recursive: true });
|
|
39
|
+
|
|
40
|
+
// Copy template
|
|
41
|
+
const templatePath = path.resolve(__dirname, 'templates', template);
|
|
42
|
+
await copyDirectory(templatePath, projectPath);
|
|
43
|
+
|
|
44
|
+
// Process placeholders
|
|
45
|
+
await processTemplateFiles(projectPath, {
|
|
46
|
+
PROJECT_NAME: name,
|
|
47
|
+
PROJECT_DESCRIPTION: `A FluxStack application named ${name}`
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
console.log('✅ Project structure created!');
|
|
51
|
+
console.log('📦 Installing dependencies...');
|
|
52
|
+
|
|
53
|
+
// Install dependencies
|
|
54
|
+
await installDependencies(projectPath);
|
|
55
|
+
|
|
56
|
+
console.log();
|
|
57
|
+
console.log('🎉 Project created successfully!');
|
|
58
|
+
console.log();
|
|
59
|
+
console.log('Next steps:');
|
|
60
|
+
console.log(` cd ${name}`);
|
|
61
|
+
console.log(' bun run dev');
|
|
62
|
+
console.log();
|
|
63
|
+
console.log('Happy coding! 🚀');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function copyDirectory(src: string, dest: string, exclude: string[] = ['node_modules', '.git', 'dist']) {
|
|
67
|
+
await fs.mkdir(dest, { recursive: true });
|
|
68
|
+
|
|
69
|
+
try {
|
|
70
|
+
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
71
|
+
|
|
72
|
+
for (const entry of entries) {
|
|
73
|
+
if (exclude.includes(entry.name)) continue;
|
|
74
|
+
|
|
75
|
+
const srcPath = path.join(src, entry.name);
|
|
76
|
+
const destPath = path.join(dest, entry.name);
|
|
77
|
+
|
|
78
|
+
if (entry.isDirectory()) {
|
|
79
|
+
await copyDirectory(srcPath, destPath, exclude);
|
|
80
|
+
} else {
|
|
81
|
+
const content = await fs.readFile(srcPath, 'utf-8');
|
|
82
|
+
await fs.writeFile(destPath, content, 'utf-8');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
} catch (error) {
|
|
86
|
+
console.error(`❌ Template not found at: ${src}`);
|
|
87
|
+
console.error('Make sure you have the templates directory in your FluxStack installation.');
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async function processTemplateFiles(
|
|
93
|
+
projectPath: string,
|
|
94
|
+
replacements: Record<string, string>
|
|
95
|
+
) {
|
|
96
|
+
const files = await getAllFiles(projectPath);
|
|
97
|
+
|
|
98
|
+
for (const file of files) {
|
|
99
|
+
// Skip binary files
|
|
100
|
+
if (isBinaryFile(file)) continue;
|
|
101
|
+
|
|
102
|
+
let content = await fs.readFile(file, 'utf-8');
|
|
103
|
+
|
|
104
|
+
// Replace placeholders
|
|
105
|
+
for (const [key, value] of Object.entries(replacements)) {
|
|
106
|
+
const regex = new RegExp(`{{${key}}}`, 'g');
|
|
107
|
+
content = content.replace(regex, value);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
await fs.writeFile(file, content, 'utf-8');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function getAllFiles(dirPath: string): Promise<string[]> {
|
|
115
|
+
const files: string[] = [];
|
|
116
|
+
const items = await fs.readdir(dirPath, { withFileTypes: true });
|
|
117
|
+
|
|
118
|
+
for (const item of items) {
|
|
119
|
+
const fullPath = path.join(dirPath, item.name);
|
|
120
|
+
|
|
121
|
+
if (item.isDirectory()) {
|
|
122
|
+
files.push(...await getAllFiles(fullPath));
|
|
123
|
+
} else {
|
|
124
|
+
files.push(fullPath);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return files;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function isBinaryFile(filePath: string): boolean {
|
|
132
|
+
const binaryExtensions = ['.png', '.jpg', '.jpeg', '.gif', '.ico', '.svg', '.woff', '.woff2', '.ttf', '.eot'];
|
|
133
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
134
|
+
return binaryExtensions.includes(ext);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async function installDependencies(projectPath: string): Promise<void> {
|
|
138
|
+
return new Promise((resolve, reject) => {
|
|
139
|
+
const install = spawn('bun', ['install'], {
|
|
140
|
+
cwd: projectPath,
|
|
141
|
+
stdio: 'inherit'
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
install.on('close', (code) => {
|
|
145
|
+
if (code === 0) {
|
|
146
|
+
resolve();
|
|
147
|
+
} else {
|
|
148
|
+
reject(new Error(`Dependencies installation failed with code ${code}`));
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
install.on('error', reject);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function showHelp() {
|
|
157
|
+
console.log(`
|
|
158
|
+
🚀 FluxStack CLI
|
|
159
|
+
|
|
160
|
+
Usage:
|
|
161
|
+
flux create <project-name> Create a new FluxStack project
|
|
162
|
+
flux create <project-name> --template Specify template (basic, minimal, full)
|
|
163
|
+
flux --help Show this help
|
|
164
|
+
|
|
165
|
+
Examples:
|
|
166
|
+
flux create my-app Create basic project
|
|
167
|
+
flux create my-blog --template basic Create with basic template
|
|
168
|
+
flux create my-api --template minimal Create minimal project
|
|
169
|
+
|
|
170
|
+
Templates:
|
|
171
|
+
basic Full-featured app with frontend and backend (default)
|
|
172
|
+
minimal Just the backend API
|
|
173
|
+
full Everything + advanced features
|
|
174
|
+
|
|
175
|
+
Get started in seconds! 🔥
|
|
176
|
+
`);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Parse command line arguments
|
|
180
|
+
const args = process.argv.slice(2);
|
|
181
|
+
const command = args[0];
|
|
182
|
+
|
|
183
|
+
if (!command || command === '--help' || command === 'help') {
|
|
184
|
+
showHelp();
|
|
185
|
+
process.exit(0);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (command === 'create') {
|
|
189
|
+
const projectName = args[1];
|
|
190
|
+
|
|
191
|
+
if (!projectName) {
|
|
192
|
+
console.error('❌ Please provide a project name');
|
|
193
|
+
console.error('Usage: flux create <project-name>');
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Validate project name
|
|
198
|
+
if (!/^[a-zA-Z0-9-_]+$/.test(projectName)) {
|
|
199
|
+
console.error('❌ Project name can only contain letters, numbers, hyphens, and underscores');
|
|
200
|
+
process.exit(1);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const templateIndex = args.indexOf('--template');
|
|
204
|
+
const template = templateIndex !== -1 ? args[templateIndex + 1] as 'basic' | 'minimal' | 'full' : 'basic';
|
|
205
|
+
|
|
206
|
+
createProject({ name: projectName, template }).catch(error => {
|
|
207
|
+
console.error('❌ Error creating project:', error.message);
|
|
208
|
+
process.exit(1);
|
|
209
|
+
});
|
|
210
|
+
} else {
|
|
211
|
+
console.error(`❌ Unknown command: ${command}`);
|
|
212
|
+
console.error('Run "flux --help" for available commands');
|
|
213
|
+
process.exit(1);
|
|
214
|
+
}
|