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.
Files changed (466) hide show
  1. package/.claude/settings.local.json +63 -0
  2. package/.dockerignore +50 -0
  3. package/.env.example +53 -0
  4. package/.gitattributes +2 -0
  5. package/.github/workflows/ci-build-tests.yml +480 -0
  6. package/.github/workflows/dependency-management.yml +324 -0
  7. package/.github/workflows/release-validation.yml +355 -0
  8. package/.kiro/specs/fluxstack-architecture-optimization/design.md +700 -0
  9. package/.kiro/specs/fluxstack-architecture-optimization/requirements.md +127 -0
  10. package/.kiro/specs/fluxstack-architecture-optimization/tasks.md +330 -0
  11. package/CLAUDE.md +200 -0
  12. package/Dockerfile +58 -0
  13. package/Dockerfile.backend +52 -0
  14. package/Dockerfile.frontend +54 -0
  15. package/ENV_TESTING_REPORT.md +292 -0
  16. package/FRAMEWORK_ROADMAP.md +183 -0
  17. package/FRONTEND_TESTS_README.md +287 -0
  18. package/README-Docker.md +85 -0
  19. package/TEST_RESULTS.md +130 -0
  20. package/ai-context/00-QUICK-START.md +86 -0
  21. package/ai-context/README.md +88 -0
  22. package/ai-context/development/eden-treaty-guide.md +362 -0
  23. package/ai-context/development/patterns.md +382 -0
  24. package/ai-context/examples/crud-complete.md +626 -0
  25. package/ai-context/project/architecture.md +399 -0
  26. package/ai-context/project/overview.md +213 -0
  27. package/ai-context/recent-changes/eden-treaty-refactor.md +281 -0
  28. package/ai-context/recent-changes/type-inference-fix.md +223 -0
  29. package/ai-context/reference/environment-vars.md +384 -0
  30. package/ai-context/reference/troubleshooting.md +407 -0
  31. package/bun.lock +21 -11
  32. package/bunfig.toml +16 -0
  33. package/config/fluxstack.config.ts +48 -0
  34. package/create-fluxstack.ts +2 -3
  35. package/create-test-app.ts +156 -0
  36. package/docker-compose.microservices.yml +75 -0
  37. package/docker-compose.simple.yml +57 -0
  38. package/docker-compose.yml +71 -0
  39. package/docs/dynamic-environment-variables.md +380 -0
  40. package/eslint.config.js +23 -0
  41. package/examples/dynamic-env-usage.ts +283 -0
  42. package/examples/hybrid-env-strategy.ts +212 -0
  43. package/examples/simplified-env-usage.ts +251 -0
  44. package/flux-cli.ts +214 -0
  45. package/fluxstack.config.ts +318 -0
  46. package/meu-app-teste/README.md +44 -0
  47. package/meu-app-teste/app/client/README.md +69 -0
  48. package/meu-app-teste/app/client/frontend-only.ts +12 -0
  49. package/meu-app-teste/app/client/index.html +13 -0
  50. package/meu-app-teste/app/client/public/vite.svg +1 -0
  51. package/meu-app-teste/app/client/src/App.css +883 -0
  52. package/meu-app-teste/app/client/src/App.tsx +669 -0
  53. package/meu-app-teste/app/client/src/assets/react.svg +1 -0
  54. package/meu-app-teste/app/client/src/components/TestPage.tsx +453 -0
  55. package/meu-app-teste/app/client/src/index.css +51 -0
  56. package/meu-app-teste/app/client/src/lib/eden-api.ts +110 -0
  57. package/meu-app-teste/app/client/src/main.tsx +10 -0
  58. package/meu-app-teste/app/client/src/vite-env.d.ts +1 -0
  59. package/meu-app-teste/app/client/tsconfig.app.json +43 -0
  60. package/meu-app-teste/app/client/tsconfig.json +7 -0
  61. package/meu-app-teste/app/client/tsconfig.node.json +25 -0
  62. package/meu-app-teste/app/server/app.ts +10 -0
  63. package/meu-app-teste/app/server/backend-only.ts +15 -0
  64. package/meu-app-teste/app/server/controllers/users.controller.ts +69 -0
  65. package/meu-app-teste/app/server/index.ts +104 -0
  66. package/meu-app-teste/app/server/routes/index.ts +25 -0
  67. package/meu-app-teste/app/server/routes/users.routes.ts +121 -0
  68. package/meu-app-teste/app/server/types/index.ts +1 -0
  69. package/meu-app-teste/app/shared/types/index.ts +18 -0
  70. package/meu-app-teste/bun.lock +1053 -0
  71. package/meu-app-teste/core/__tests__/integration.test.ts +227 -0
  72. package/meu-app-teste/core/build/index.ts +186 -0
  73. package/meu-app-teste/core/cli/command-registry.ts +334 -0
  74. package/meu-app-teste/core/cli/index.ts +394 -0
  75. package/meu-app-teste/core/cli/plugin-discovery.ts +200 -0
  76. package/meu-app-teste/core/client/standalone.ts +57 -0
  77. package/meu-app-teste/core/config/__tests__/config-loader.test.ts +591 -0
  78. package/meu-app-teste/core/config/__tests__/config-merger.test.ts +657 -0
  79. package/meu-app-teste/core/config/__tests__/env-converter.test.ts +372 -0
  80. package/meu-app-teste/core/config/__tests__/env-processor.test.ts +431 -0
  81. package/meu-app-teste/core/config/__tests__/env.test.ts +452 -0
  82. package/meu-app-teste/core/config/__tests__/integration.test.ts +418 -0
  83. package/meu-app-teste/core/config/__tests__/loader.test.ts +331 -0
  84. package/meu-app-teste/core/config/__tests__/schema.test.ts +129 -0
  85. package/meu-app-teste/core/config/__tests__/validator.test.ts +318 -0
  86. package/meu-app-teste/core/config/env-dynamic.ts +326 -0
  87. package/meu-app-teste/core/config/env.ts +597 -0
  88. package/meu-app-teste/core/config/index.ts +317 -0
  89. package/meu-app-teste/core/config/loader.ts +546 -0
  90. package/meu-app-teste/core/config/runtime-config.ts +322 -0
  91. package/meu-app-teste/core/config/schema.ts +694 -0
  92. package/meu-app-teste/core/config/validator.ts +540 -0
  93. package/meu-app-teste/core/framework/__tests__/server.test.ts +233 -0
  94. package/meu-app-teste/core/framework/client.ts +132 -0
  95. package/meu-app-teste/core/framework/index.ts +8 -0
  96. package/meu-app-teste/core/framework/server.ts +501 -0
  97. package/meu-app-teste/core/framework/types.ts +63 -0
  98. package/meu-app-teste/core/plugins/__tests__/built-in.test.ts.disabled +366 -0
  99. package/meu-app-teste/core/plugins/__tests__/manager.test.ts +398 -0
  100. package/meu-app-teste/core/plugins/__tests__/monitoring.test.ts +401 -0
  101. package/meu-app-teste/core/plugins/__tests__/registry.test.ts +335 -0
  102. package/meu-app-teste/core/plugins/built-in/index.ts +142 -0
  103. package/meu-app-teste/core/plugins/built-in/logger/index.ts +180 -0
  104. package/meu-app-teste/core/plugins/built-in/monitoring/README.md +193 -0
  105. package/meu-app-teste/core/plugins/built-in/monitoring/index.ts +912 -0
  106. package/meu-app-teste/core/plugins/built-in/static/index.ts +289 -0
  107. package/meu-app-teste/core/plugins/built-in/swagger/index.ts +229 -0
  108. package/meu-app-teste/core/plugins/built-in/vite/index.ts +316 -0
  109. package/meu-app-teste/core/plugins/config.ts +348 -0
  110. package/meu-app-teste/core/plugins/discovery.ts +350 -0
  111. package/meu-app-teste/core/plugins/executor.ts +351 -0
  112. package/meu-app-teste/core/plugins/index.ts +195 -0
  113. package/meu-app-teste/core/plugins/manager.ts +583 -0
  114. package/meu-app-teste/core/plugins/registry.ts +424 -0
  115. package/meu-app-teste/core/plugins/types.ts +254 -0
  116. package/meu-app-teste/core/server/framework.ts +123 -0
  117. package/meu-app-teste/core/server/index.ts +8 -0
  118. package/meu-app-teste/core/server/plugins/database.ts +182 -0
  119. package/meu-app-teste/core/server/plugins/logger.ts +47 -0
  120. package/meu-app-teste/core/server/plugins/swagger.ts +34 -0
  121. package/meu-app-teste/core/server/standalone.ts +91 -0
  122. package/meu-app-teste/core/templates/create-project.ts +455 -0
  123. package/meu-app-teste/core/types/api.ts +169 -0
  124. package/meu-app-teste/core/types/build.ts +174 -0
  125. package/meu-app-teste/core/types/config.ts +68 -0
  126. package/meu-app-teste/core/types/index.ts +127 -0
  127. package/meu-app-teste/core/types/plugin.ts +94 -0
  128. package/meu-app-teste/core/utils/__tests__/errors.test.ts +139 -0
  129. package/meu-app-teste/core/utils/__tests__/helpers.test.ts +297 -0
  130. package/meu-app-teste/core/utils/__tests__/logger.test.ts +141 -0
  131. package/meu-app-teste/core/utils/env-runtime-v2.ts +232 -0
  132. package/meu-app-teste/core/utils/env-runtime.ts +252 -0
  133. package/meu-app-teste/core/utils/errors/codes.ts +115 -0
  134. package/meu-app-teste/core/utils/errors/handlers.ts +63 -0
  135. package/meu-app-teste/core/utils/errors/index.ts +81 -0
  136. package/meu-app-teste/core/utils/helpers.ts +180 -0
  137. package/meu-app-teste/core/utils/index.ts +18 -0
  138. package/meu-app-teste/core/utils/logger/index.ts +161 -0
  139. package/meu-app-teste/core/utils/logger.ts +106 -0
  140. package/meu-app-teste/core/utils/monitoring/index.ts +212 -0
  141. package/meu-app-teste/package.json +92 -0
  142. package/meu-app-teste/tsconfig.json +51 -0
  143. package/meu-app-teste/vite.config.ts +42 -0
  144. package/my-final-test/README.md +44 -0
  145. package/my-final-test/app/client/README.md +69 -0
  146. package/my-final-test/app/client/frontend-only.ts +12 -0
  147. package/my-final-test/app/client/index.html +13 -0
  148. package/my-final-test/app/client/public/vite.svg +1 -0
  149. package/my-final-test/app/client/src/App.css +883 -0
  150. package/my-final-test/app/client/src/App.tsx +669 -0
  151. package/my-final-test/app/client/src/assets/react.svg +1 -0
  152. package/my-final-test/app/client/src/components/TestPage.tsx +453 -0
  153. package/my-final-test/app/client/src/index.css +51 -0
  154. package/my-final-test/app/client/src/lib/eden-api.ts +110 -0
  155. package/my-final-test/app/client/src/main.tsx +10 -0
  156. package/my-final-test/app/client/src/vite-env.d.ts +1 -0
  157. package/my-final-test/app/client/tsconfig.app.json +43 -0
  158. package/my-final-test/app/client/tsconfig.json +7 -0
  159. package/my-final-test/app/client/tsconfig.node.json +25 -0
  160. package/my-final-test/app/server/app.ts +10 -0
  161. package/my-final-test/app/server/backend-only.ts +15 -0
  162. package/my-final-test/app/server/controllers/users.controller.ts +69 -0
  163. package/my-final-test/app/server/index.ts +104 -0
  164. package/my-final-test/app/server/routes/index.ts +25 -0
  165. package/my-final-test/app/server/routes/users.routes.ts +121 -0
  166. package/my-final-test/app/server/types/index.ts +1 -0
  167. package/my-final-test/app/shared/types/index.ts +18 -0
  168. package/my-final-test/bun.lock +993 -0
  169. package/my-final-test/core/__tests__/integration.test.ts +227 -0
  170. package/my-final-test/core/build/index.ts +186 -0
  171. package/my-final-test/core/cli/command-registry.ts +334 -0
  172. package/my-final-test/core/cli/index.ts +394 -0
  173. package/my-final-test/core/cli/plugin-discovery.ts +200 -0
  174. package/my-final-test/core/client/standalone.ts +57 -0
  175. package/my-final-test/core/config/__tests__/config-loader.test.ts +591 -0
  176. package/my-final-test/core/config/__tests__/config-merger.test.ts +657 -0
  177. package/my-final-test/core/config/__tests__/env-converter.test.ts +372 -0
  178. package/my-final-test/core/config/__tests__/env-processor.test.ts +431 -0
  179. package/my-final-test/core/config/__tests__/env.test.ts +452 -0
  180. package/my-final-test/core/config/__tests__/integration.test.ts +418 -0
  181. package/my-final-test/core/config/__tests__/loader.test.ts +331 -0
  182. package/my-final-test/core/config/__tests__/schema.test.ts +129 -0
  183. package/my-final-test/core/config/__tests__/validator.test.ts +318 -0
  184. package/my-final-test/core/config/env-dynamic.ts +326 -0
  185. package/my-final-test/core/config/env.ts +597 -0
  186. package/my-final-test/core/config/index.ts +317 -0
  187. package/my-final-test/core/config/loader.ts +546 -0
  188. package/my-final-test/core/config/runtime-config.ts +322 -0
  189. package/my-final-test/core/config/schema.ts +694 -0
  190. package/my-final-test/core/config/validator.ts +540 -0
  191. package/my-final-test/core/framework/__tests__/server.test.ts +233 -0
  192. package/my-final-test/core/framework/client.ts +132 -0
  193. package/my-final-test/core/framework/index.ts +8 -0
  194. package/my-final-test/core/framework/server.ts +501 -0
  195. package/my-final-test/core/framework/types.ts +63 -0
  196. package/my-final-test/core/plugins/__tests__/built-in.test.ts.disabled +366 -0
  197. package/my-final-test/core/plugins/__tests__/manager.test.ts +398 -0
  198. package/my-final-test/core/plugins/__tests__/monitoring.test.ts +401 -0
  199. package/my-final-test/core/plugins/__tests__/registry.test.ts +335 -0
  200. package/my-final-test/core/plugins/built-in/index.ts +142 -0
  201. package/my-final-test/core/plugins/built-in/logger/index.ts +180 -0
  202. package/my-final-test/core/plugins/built-in/monitoring/README.md +193 -0
  203. package/my-final-test/core/plugins/built-in/monitoring/index.ts +912 -0
  204. package/my-final-test/core/plugins/built-in/static/index.ts +289 -0
  205. package/my-final-test/core/plugins/built-in/swagger/index.ts +229 -0
  206. package/my-final-test/core/plugins/built-in/vite/index.ts +316 -0
  207. package/my-final-test/core/plugins/config.ts +348 -0
  208. package/my-final-test/core/plugins/discovery.ts +350 -0
  209. package/my-final-test/core/plugins/executor.ts +351 -0
  210. package/my-final-test/core/plugins/index.ts +195 -0
  211. package/my-final-test/core/plugins/manager.ts +583 -0
  212. package/my-final-test/core/plugins/registry.ts +424 -0
  213. package/my-final-test/core/plugins/types.ts +254 -0
  214. package/my-final-test/core/server/framework.ts +123 -0
  215. package/my-final-test/core/server/index.ts +8 -0
  216. package/my-final-test/core/server/plugins/database.ts +182 -0
  217. package/my-final-test/core/server/plugins/logger.ts +47 -0
  218. package/my-final-test/core/server/plugins/swagger.ts +34 -0
  219. package/my-final-test/core/server/standalone.ts +91 -0
  220. package/my-final-test/core/templates/create-project.ts +455 -0
  221. package/my-final-test/core/types/api.ts +169 -0
  222. package/my-final-test/core/types/build.ts +174 -0
  223. package/my-final-test/core/types/config.ts +68 -0
  224. package/my-final-test/core/types/index.ts +127 -0
  225. package/my-final-test/core/types/plugin.ts +94 -0
  226. package/my-final-test/core/utils/__tests__/errors.test.ts +139 -0
  227. package/my-final-test/core/utils/__tests__/helpers.test.ts +297 -0
  228. package/my-final-test/core/utils/__tests__/logger.test.ts +141 -0
  229. package/my-final-test/core/utils/env-runtime-v2.ts +232 -0
  230. package/my-final-test/core/utils/env-runtime.ts +252 -0
  231. package/my-final-test/core/utils/errors/codes.ts +115 -0
  232. package/my-final-test/core/utils/errors/handlers.ts +63 -0
  233. package/my-final-test/core/utils/errors/index.ts +81 -0
  234. package/my-final-test/core/utils/helpers.ts +180 -0
  235. package/my-final-test/core/utils/index.ts +18 -0
  236. package/my-final-test/core/utils/logger/index.ts +161 -0
  237. package/my-final-test/core/utils/logger.ts +106 -0
  238. package/my-final-test/core/utils/monitoring/index.ts +212 -0
  239. package/my-final-test/package.json +68 -0
  240. package/my-final-test/tsconfig.json +51 -0
  241. package/my-final-test/vite.config.ts +42 -0
  242. package/nginx-lb.conf +37 -0
  243. package/package-template.json +32 -15
  244. package/package.json +71 -30
  245. package/publish-setup.md +111 -0
  246. package/publish.sh +63 -0
  247. package/run-clean.ts +26 -0
  248. package/run-env-tests.ts +313 -0
  249. package/tailwind.config.js +34 -0
  250. package/teste-corrigido/README.md +44 -0
  251. package/teste-corrigido/app/client/README.md +69 -0
  252. package/teste-corrigido/app/client/frontend-only.ts +12 -0
  253. package/teste-corrigido/app/client/index.html +13 -0
  254. package/teste-corrigido/app/client/public/vite.svg +1 -0
  255. package/teste-corrigido/app/client/src/App.css +883 -0
  256. package/teste-corrigido/app/client/src/App.tsx +669 -0
  257. package/teste-corrigido/app/client/src/assets/react.svg +1 -0
  258. package/teste-corrigido/app/client/src/components/TestPage.tsx +453 -0
  259. package/teste-corrigido/app/client/src/index.css +51 -0
  260. package/teste-corrigido/app/client/src/lib/eden-api.ts +110 -0
  261. package/teste-corrigido/app/client/src/main.tsx +10 -0
  262. package/teste-corrigido/app/client/src/vite-env.d.ts +1 -0
  263. package/teste-corrigido/app/client/tsconfig.app.json +43 -0
  264. package/teste-corrigido/app/client/tsconfig.json +7 -0
  265. package/teste-corrigido/app/client/tsconfig.node.json +25 -0
  266. package/teste-corrigido/app/server/app.ts +10 -0
  267. package/teste-corrigido/app/server/backend-only.ts +15 -0
  268. package/teste-corrigido/app/server/controllers/users.controller.ts +69 -0
  269. package/teste-corrigido/app/server/index.ts +104 -0
  270. package/teste-corrigido/app/server/routes/index.ts +25 -0
  271. package/teste-corrigido/app/server/routes/users.routes.ts +121 -0
  272. package/teste-corrigido/app/server/types/index.ts +1 -0
  273. package/teste-corrigido/app/shared/types/index.ts +18 -0
  274. package/teste-corrigido/bun.lock +1053 -0
  275. package/teste-corrigido/core/__tests__/integration.test.ts +227 -0
  276. package/teste-corrigido/core/build/index.ts +186 -0
  277. package/teste-corrigido/core/cli/command-registry.ts +334 -0
  278. package/teste-corrigido/core/cli/index.ts +394 -0
  279. package/teste-corrigido/core/cli/plugin-discovery.ts +200 -0
  280. package/teste-corrigido/core/client/standalone.ts +57 -0
  281. package/teste-corrigido/core/config/__tests__/config-loader.test.ts +591 -0
  282. package/teste-corrigido/core/config/__tests__/config-merger.test.ts +657 -0
  283. package/teste-corrigido/core/config/__tests__/env-converter.test.ts +372 -0
  284. package/teste-corrigido/core/config/__tests__/env-processor.test.ts +431 -0
  285. package/teste-corrigido/core/config/__tests__/env.test.ts +452 -0
  286. package/teste-corrigido/core/config/__tests__/integration.test.ts +418 -0
  287. package/teste-corrigido/core/config/__tests__/loader.test.ts +331 -0
  288. package/teste-corrigido/core/config/__tests__/schema.test.ts +129 -0
  289. package/teste-corrigido/core/config/__tests__/validator.test.ts +318 -0
  290. package/teste-corrigido/core/config/env-dynamic.ts +326 -0
  291. package/teste-corrigido/core/config/env.ts +597 -0
  292. package/teste-corrigido/core/config/index.ts +317 -0
  293. package/teste-corrigido/core/config/loader.ts +546 -0
  294. package/teste-corrigido/core/config/runtime-config.ts +322 -0
  295. package/teste-corrigido/core/config/schema.ts +694 -0
  296. package/teste-corrigido/core/config/validator.ts +540 -0
  297. package/teste-corrigido/core/framework/__tests__/server.test.ts +233 -0
  298. package/teste-corrigido/core/framework/client.ts +132 -0
  299. package/teste-corrigido/core/framework/index.ts +8 -0
  300. package/teste-corrigido/core/framework/server.ts +501 -0
  301. package/teste-corrigido/core/framework/types.ts +63 -0
  302. package/teste-corrigido/core/plugins/__tests__/built-in.test.ts.disabled +366 -0
  303. package/teste-corrigido/core/plugins/__tests__/manager.test.ts +398 -0
  304. package/teste-corrigido/core/plugins/__tests__/monitoring.test.ts +401 -0
  305. package/teste-corrigido/core/plugins/__tests__/registry.test.ts +335 -0
  306. package/teste-corrigido/core/plugins/built-in/index.ts +142 -0
  307. package/teste-corrigido/core/plugins/built-in/logger/index.ts +180 -0
  308. package/teste-corrigido/core/plugins/built-in/monitoring/README.md +193 -0
  309. package/teste-corrigido/core/plugins/built-in/monitoring/index.ts +912 -0
  310. package/teste-corrigido/core/plugins/built-in/static/index.ts +289 -0
  311. package/teste-corrigido/core/plugins/built-in/swagger/index.ts +229 -0
  312. package/teste-corrigido/core/plugins/built-in/vite/index.ts +316 -0
  313. package/teste-corrigido/core/plugins/config.ts +348 -0
  314. package/teste-corrigido/core/plugins/discovery.ts +350 -0
  315. package/teste-corrigido/core/plugins/executor.ts +351 -0
  316. package/teste-corrigido/core/plugins/index.ts +195 -0
  317. package/teste-corrigido/core/plugins/manager.ts +583 -0
  318. package/teste-corrigido/core/plugins/registry.ts +424 -0
  319. package/teste-corrigido/core/plugins/types.ts +254 -0
  320. package/teste-corrigido/core/server/framework.ts +123 -0
  321. package/teste-corrigido/core/server/index.ts +8 -0
  322. package/teste-corrigido/core/server/plugins/database.ts +182 -0
  323. package/teste-corrigido/core/server/plugins/logger.ts +47 -0
  324. package/teste-corrigido/core/server/plugins/swagger.ts +34 -0
  325. package/teste-corrigido/core/server/standalone.ts +91 -0
  326. package/teste-corrigido/core/templates/create-project.ts +455 -0
  327. package/teste-corrigido/core/types/api.ts +169 -0
  328. package/teste-corrigido/core/types/build.ts +174 -0
  329. package/teste-corrigido/core/types/config.ts +68 -0
  330. package/teste-corrigido/core/types/index.ts +127 -0
  331. package/teste-corrigido/core/types/plugin.ts +94 -0
  332. package/teste-corrigido/core/utils/__tests__/errors.test.ts +139 -0
  333. package/teste-corrigido/core/utils/__tests__/helpers.test.ts +297 -0
  334. package/teste-corrigido/core/utils/__tests__/logger.test.ts +141 -0
  335. package/teste-corrigido/core/utils/env-runtime-v2.ts +232 -0
  336. package/teste-corrigido/core/utils/env-runtime.ts +252 -0
  337. package/teste-corrigido/core/utils/errors/codes.ts +115 -0
  338. package/teste-corrigido/core/utils/errors/handlers.ts +63 -0
  339. package/teste-corrigido/core/utils/errors/index.ts +81 -0
  340. package/teste-corrigido/core/utils/helpers.ts +180 -0
  341. package/teste-corrigido/core/utils/index.ts +18 -0
  342. package/teste-corrigido/core/utils/logger/index.ts +161 -0
  343. package/teste-corrigido/core/utils/logger.ts +106 -0
  344. package/teste-corrigido/core/utils/monitoring/index.ts +212 -0
  345. package/teste-corrigido/package-template.json +51 -0
  346. package/teste-corrigido/package.json +51 -0
  347. package/teste-corrigido/tsconfig.json +51 -0
  348. package/teste-corrigido/vite.config.ts +42 -0
  349. package/teste-final-npm/README.md +44 -0
  350. package/teste-final-npm/app/client/README.md +69 -0
  351. package/teste-final-npm/app/client/frontend-only.ts +12 -0
  352. package/teste-final-npm/app/client/index.html +13 -0
  353. package/teste-final-npm/app/client/public/vite.svg +1 -0
  354. package/teste-final-npm/app/client/src/App.css +883 -0
  355. package/teste-final-npm/app/client/src/App.tsx +669 -0
  356. package/teste-final-npm/app/client/src/assets/react.svg +1 -0
  357. package/teste-final-npm/app/client/src/components/TestPage.tsx +453 -0
  358. package/teste-final-npm/app/client/src/index.css +51 -0
  359. package/teste-final-npm/app/client/src/lib/eden-api.ts +110 -0
  360. package/teste-final-npm/app/client/src/main.tsx +10 -0
  361. package/teste-final-npm/app/client/src/vite-env.d.ts +1 -0
  362. package/teste-final-npm/app/client/tsconfig.app.json +43 -0
  363. package/teste-final-npm/app/client/tsconfig.json +7 -0
  364. package/teste-final-npm/app/client/tsconfig.node.json +25 -0
  365. package/teste-final-npm/app/server/app.ts +10 -0
  366. package/teste-final-npm/app/server/backend-only.ts +15 -0
  367. package/teste-final-npm/app/server/controllers/users.controller.ts +69 -0
  368. package/teste-final-npm/app/server/index.ts +104 -0
  369. package/teste-final-npm/app/server/routes/index.ts +25 -0
  370. package/teste-final-npm/app/server/routes/users.routes.ts +121 -0
  371. package/teste-final-npm/app/server/types/index.ts +1 -0
  372. package/teste-final-npm/app/shared/types/index.ts +18 -0
  373. package/teste-final-npm/bun.lock +1053 -0
  374. package/teste-final-npm/core/__tests__/integration.test.ts +227 -0
  375. package/teste-final-npm/core/build/index.ts +186 -0
  376. package/teste-final-npm/core/cli/command-registry.ts +334 -0
  377. package/teste-final-npm/core/cli/index.ts +394 -0
  378. package/teste-final-npm/core/cli/plugin-discovery.ts +200 -0
  379. package/teste-final-npm/core/client/standalone.ts +57 -0
  380. package/teste-final-npm/core/config/__tests__/config-loader.test.ts +591 -0
  381. package/teste-final-npm/core/config/__tests__/config-merger.test.ts +657 -0
  382. package/teste-final-npm/core/config/__tests__/env-converter.test.ts +372 -0
  383. package/teste-final-npm/core/config/__tests__/env-processor.test.ts +431 -0
  384. package/teste-final-npm/core/config/__tests__/env.test.ts +452 -0
  385. package/teste-final-npm/core/config/__tests__/integration.test.ts +418 -0
  386. package/teste-final-npm/core/config/__tests__/loader.test.ts +331 -0
  387. package/teste-final-npm/core/config/__tests__/schema.test.ts +129 -0
  388. package/teste-final-npm/core/config/__tests__/validator.test.ts +318 -0
  389. package/teste-final-npm/core/config/env-dynamic.ts +326 -0
  390. package/teste-final-npm/core/config/env.ts +597 -0
  391. package/teste-final-npm/core/config/index.ts +317 -0
  392. package/teste-final-npm/core/config/loader.ts +546 -0
  393. package/teste-final-npm/core/config/runtime-config.ts +322 -0
  394. package/teste-final-npm/core/config/schema.ts +694 -0
  395. package/teste-final-npm/core/config/validator.ts +540 -0
  396. package/teste-final-npm/core/framework/__tests__/server.test.ts +233 -0
  397. package/teste-final-npm/core/framework/client.ts +132 -0
  398. package/teste-final-npm/core/framework/index.ts +8 -0
  399. package/teste-final-npm/core/framework/server.ts +501 -0
  400. package/teste-final-npm/core/framework/types.ts +63 -0
  401. package/teste-final-npm/core/plugins/__tests__/built-in.test.ts.disabled +366 -0
  402. package/teste-final-npm/core/plugins/__tests__/manager.test.ts +398 -0
  403. package/teste-final-npm/core/plugins/__tests__/monitoring.test.ts +401 -0
  404. package/teste-final-npm/core/plugins/__tests__/registry.test.ts +335 -0
  405. package/teste-final-npm/core/plugins/built-in/index.ts +142 -0
  406. package/teste-final-npm/core/plugins/built-in/logger/index.ts +180 -0
  407. package/teste-final-npm/core/plugins/built-in/monitoring/README.md +193 -0
  408. package/teste-final-npm/core/plugins/built-in/monitoring/index.ts +912 -0
  409. package/teste-final-npm/core/plugins/built-in/static/index.ts +289 -0
  410. package/teste-final-npm/core/plugins/built-in/swagger/index.ts +229 -0
  411. package/teste-final-npm/core/plugins/built-in/vite/index.ts +316 -0
  412. package/teste-final-npm/core/plugins/config.ts +348 -0
  413. package/teste-final-npm/core/plugins/discovery.ts +350 -0
  414. package/teste-final-npm/core/plugins/executor.ts +351 -0
  415. package/teste-final-npm/core/plugins/index.ts +195 -0
  416. package/teste-final-npm/core/plugins/manager.ts +583 -0
  417. package/teste-final-npm/core/plugins/registry.ts +424 -0
  418. package/teste-final-npm/core/plugins/types.ts +254 -0
  419. package/teste-final-npm/core/server/framework.ts +123 -0
  420. package/teste-final-npm/core/server/index.ts +8 -0
  421. package/teste-final-npm/core/server/plugins/database.ts +182 -0
  422. package/teste-final-npm/core/server/plugins/logger.ts +47 -0
  423. package/teste-final-npm/core/server/plugins/swagger.ts +34 -0
  424. package/teste-final-npm/core/server/standalone.ts +91 -0
  425. package/teste-final-npm/core/templates/create-project.ts +455 -0
  426. package/teste-final-npm/core/types/api.ts +169 -0
  427. package/teste-final-npm/core/types/build.ts +174 -0
  428. package/teste-final-npm/core/types/config.ts +68 -0
  429. package/teste-final-npm/core/types/index.ts +127 -0
  430. package/teste-final-npm/core/types/plugin.ts +94 -0
  431. package/teste-final-npm/core/utils/__tests__/errors.test.ts +139 -0
  432. package/teste-final-npm/core/utils/__tests__/helpers.test.ts +297 -0
  433. package/teste-final-npm/core/utils/__tests__/logger.test.ts +141 -0
  434. package/teste-final-npm/core/utils/env-runtime-v2.ts +232 -0
  435. package/teste-final-npm/core/utils/env-runtime.ts +252 -0
  436. package/teste-final-npm/core/utils/errors/codes.ts +115 -0
  437. package/teste-final-npm/core/utils/errors/handlers.ts +63 -0
  438. package/teste-final-npm/core/utils/errors/index.ts +81 -0
  439. package/teste-final-npm/core/utils/helpers.ts +180 -0
  440. package/teste-final-npm/core/utils/index.ts +18 -0
  441. package/teste-final-npm/core/utils/logger/index.ts +161 -0
  442. package/teste-final-npm/core/utils/logger.ts +106 -0
  443. package/teste-final-npm/core/utils/monitoring/index.ts +212 -0
  444. package/teste-final-npm/package-template.json +51 -0
  445. package/teste-final-npm/package.json +51 -0
  446. package/teste-final-npm/tsconfig.json +51 -0
  447. package/teste-final-npm/vite.config.ts +42 -0
  448. package/tests/__mocks__/api.ts +56 -0
  449. package/tests/fixtures/users.ts +69 -0
  450. package/tests/integration/api/users.routes.test.ts +221 -0
  451. package/tests/setup.ts +29 -0
  452. package/tests/unit/app/client/App-simple.test.tsx +56 -0
  453. package/tests/unit/app/client/App.test.tsx.skip +237 -0
  454. package/tests/unit/app/client/eden-api.test.ts +186 -0
  455. package/tests/unit/app/client/simple.test.tsx +23 -0
  456. package/tests/unit/app/controllers/users.controller.test.ts +150 -0
  457. package/tests/unit/core/create-project.test.ts.skip +95 -0
  458. package/tests/unit/core/framework.test.ts +144 -0
  459. package/tests/unit/core/plugins/logger.test.ts.skip +268 -0
  460. package/tests/unit/core/plugins/vite.test.ts.disabled +188 -0
  461. package/tests/utils/test-helpers.ts +61 -0
  462. package/types/global.d.ts +30 -0
  463. package/types/vitest.d.ts +9 -0
  464. package/vitest.config.ts +50 -0
  465. package/workspace.json +6 -0
  466. package/.env +0 -30
@@ -0,0 +1,546 @@
1
+ /**
2
+ * Configuration Loader for FluxStack
3
+ * Handles loading, merging, and environment variable integration
4
+ */
5
+
6
+ import { existsSync } from 'fs'
7
+ import { join } from 'path'
8
+ import type {
9
+ FluxStackConfig
10
+ } from './schema'
11
+ import {
12
+ defaultFluxStackConfig,
13
+ environmentDefaults
14
+ } from './schema'
15
+
16
+ export interface ConfigLoadOptions {
17
+ configPath?: string
18
+ environment?: string
19
+ envPrefix?: string
20
+ validateSchema?: boolean
21
+ }
22
+
23
+ export interface ConfigLoadResult {
24
+ config: FluxStackConfig
25
+ sources: string[]
26
+ warnings: string[]
27
+ errors: string[]
28
+ }
29
+
30
+ export interface ValidationResult {
31
+ valid: boolean
32
+ errors: ValidationError[]
33
+ warnings: ValidationWarning[]
34
+ }
35
+
36
+ export interface ValidationError {
37
+ path: string
38
+ message: string
39
+ value?: any
40
+ }
41
+
42
+ export interface ValidationWarning {
43
+ path: string
44
+ message: string
45
+ value?: any
46
+ }
47
+
48
+ /**
49
+ * Environment variable mapping for FluxStack configuration
50
+ */
51
+ const ENV_MAPPINGS = {
52
+ // App configuration
53
+ 'FLUXSTACK_APP_NAME': 'app.name',
54
+ 'FLUXSTACK_APP_VERSION': 'app.version',
55
+ 'FLUXSTACK_APP_DESCRIPTION': 'app.description',
56
+
57
+ // Server configuration
58
+ 'PORT': 'server.port',
59
+ 'HOST': 'server.host',
60
+ 'FLUXSTACK_API_PREFIX': 'server.apiPrefix',
61
+ 'CORS_ORIGINS': 'server.cors.origins',
62
+ 'FLUXSTACK_CORS_ORIGINS': 'server.cors.origins',
63
+ 'CORS_METHODS': 'server.cors.methods',
64
+ 'FLUXSTACK_CORS_METHODS': 'server.cors.methods',
65
+ 'CORS_HEADERS': 'server.cors.headers',
66
+ 'FLUXSTACK_CORS_HEADERS': 'server.cors.headers',
67
+ 'CORS_CREDENTIALS': 'server.cors.credentials',
68
+ 'FLUXSTACK_CORS_CREDENTIALS': 'server.cors.credentials',
69
+ 'CORS_MAX_AGE': 'server.cors.maxAge',
70
+ 'FLUXSTACK_CORS_MAX_AGE': 'server.cors.maxAge',
71
+
72
+ // Client configuration
73
+ 'VITE_PORT': 'client.port',
74
+ 'FLUXSTACK_CLIENT_PORT': 'client.port',
75
+ 'FLUXSTACK_PROXY_TARGET': 'client.proxy.target',
76
+ 'FLUXSTACK_CLIENT_SOURCEMAPS': 'client.build.sourceMaps',
77
+ 'FLUXSTACK_CLIENT_MINIFY': 'client.build.minify',
78
+ 'FLUXSTACK_CLIENT_TARGET': 'client.build.target',
79
+ 'FLUXSTACK_CLIENT_OUTDIR': 'client.build.outDir',
80
+
81
+ // Build configuration
82
+ 'FLUXSTACK_BUILD_TARGET': 'build.target',
83
+ 'FLUXSTACK_BUILD_OUTDIR': 'build.outDir',
84
+ 'FLUXSTACK_BUILD_SOURCEMAPS': 'build.sourceMaps',
85
+ 'FLUXSTACK_BUILD_CLEAN': 'build.clean',
86
+ 'FLUXSTACK_BUILD_MINIFY': 'build.optimization.minify',
87
+ 'FLUXSTACK_BUILD_TREESHAKE': 'build.optimization.treeshake',
88
+ 'FLUXSTACK_BUILD_COMPRESS': 'build.optimization.compress',
89
+ 'FLUXSTACK_BUILD_SPLIT_CHUNKS': 'build.optimization.splitChunks',
90
+ 'FLUXSTACK_BUILD_ANALYZER': 'build.optimization.bundleAnalyzer',
91
+
92
+ // Logging configuration
93
+ 'LOG_LEVEL': 'logging.level',
94
+ 'FLUXSTACK_LOG_LEVEL': 'logging.level',
95
+ 'LOG_FORMAT': 'logging.format',
96
+ 'FLUXSTACK_LOG_FORMAT': 'logging.format',
97
+
98
+ // Monitoring configuration
99
+ 'MONITORING_ENABLED': 'monitoring.enabled',
100
+ 'FLUXSTACK_MONITORING_ENABLED': 'monitoring.enabled',
101
+ 'METRICS_ENABLED': 'monitoring.metrics.enabled',
102
+ 'FLUXSTACK_METRICS_ENABLED': 'monitoring.metrics.enabled',
103
+ 'METRICS_INTERVAL': 'monitoring.metrics.collectInterval',
104
+ 'FLUXSTACK_METRICS_INTERVAL': 'monitoring.metrics.collectInterval',
105
+ 'PROFILING_ENABLED': 'monitoring.profiling.enabled',
106
+ 'FLUXSTACK_PROFILING_ENABLED': 'monitoring.profiling.enabled',
107
+ 'PROFILING_SAMPLE_RATE': 'monitoring.profiling.sampleRate',
108
+ 'FLUXSTACK_PROFILING_SAMPLE_RATE': 'monitoring.profiling.sampleRate',
109
+
110
+ // Database configuration
111
+ 'DATABASE_URL': 'database.url',
112
+ 'DATABASE_HOST': 'database.host',
113
+ 'DATABASE_PORT': 'database.port',
114
+ 'DATABASE_NAME': 'database.database',
115
+ 'DATABASE_USER': 'database.user',
116
+ 'DATABASE_PASSWORD': 'database.password',
117
+ 'DATABASE_SSL': 'database.ssl',
118
+ 'DATABASE_POOL_SIZE': 'database.poolSize',
119
+
120
+ // Auth configuration
121
+ 'JWT_SECRET': 'auth.secret',
122
+ 'JWT_EXPIRES_IN': 'auth.expiresIn',
123
+ 'JWT_ALGORITHM': 'auth.algorithm',
124
+ 'JWT_ISSUER': 'auth.issuer',
125
+
126
+ // Email configuration
127
+ 'SMTP_HOST': 'email.host',
128
+ 'SMTP_PORT': 'email.port',
129
+ 'SMTP_USER': 'email.user',
130
+ 'SMTP_PASSWORD': 'email.password',
131
+ 'SMTP_SECURE': 'email.secure',
132
+ 'SMTP_FROM': 'email.from',
133
+
134
+ // Storage configuration
135
+ 'UPLOAD_PATH': 'storage.uploadPath',
136
+ 'MAX_FILE_SIZE': 'storage.maxFileSize',
137
+ 'STORAGE_PROVIDER': 'storage.provider'
138
+ } as const
139
+
140
+ /**
141
+ * Parse environment variable value to appropriate type
142
+ */
143
+ function parseEnvValue(value: string, targetType?: string): any {
144
+ if (!value) return undefined
145
+
146
+ // Handle different types based on target or value format
147
+ if (targetType === 'number' || /^\d+$/.test(value)) {
148
+ const parsed = parseInt(value, 10)
149
+ return isNaN(parsed) ? undefined : parsed
150
+ }
151
+
152
+ if (targetType === 'boolean' || ['true', 'false', '1', '0'].includes(value.toLowerCase())) {
153
+ return ['true', '1'].includes(value.toLowerCase())
154
+ }
155
+
156
+ if (targetType === 'array' || value.includes(',')) {
157
+ return value.split(',').map(v => v.trim()).filter(Boolean)
158
+ }
159
+
160
+ // Try to parse as JSON for complex objects
161
+ if (value.startsWith('{') || value.startsWith('[')) {
162
+ try {
163
+ return JSON.parse(value)
164
+ } catch {
165
+ // Fall back to string if JSON parsing fails
166
+ }
167
+ }
168
+
169
+ return value
170
+ }
171
+
172
+ /**
173
+ * Set nested object property using dot notation
174
+ */
175
+ function setNestedProperty(obj: any, path: string, value: any): void {
176
+ const keys = path.split('.')
177
+ let current = obj
178
+
179
+ for (let i = 0; i < keys.length - 1; i++) {
180
+ const key = keys[i]
181
+ if (!(key in current) || typeof current[key] !== 'object') {
182
+ current[key] = {}
183
+ }
184
+ current = current[key]
185
+ }
186
+
187
+ current[keys[keys.length - 1]] = value
188
+ }
189
+
190
+ /**
191
+ * Get nested object property using dot notation
192
+ */
193
+ function getNestedProperty(obj: any, path: string): any {
194
+ return path.split('.').reduce((current, key) => current?.[key], obj)
195
+ }
196
+
197
+ /**
198
+ * Deep merge two configuration objects
199
+ */
200
+ function deepMerge(target: any, source: any): any {
201
+ if (!source || typeof source !== 'object') return target
202
+ if (!target || typeof target !== 'object') return source
203
+
204
+ const result = { ...target }
205
+
206
+ for (const key in source) {
207
+ if (source.hasOwnProperty(key)) {
208
+ if (Array.isArray(source[key])) {
209
+ result[key] = [...source[key]]
210
+ } else if (typeof source[key] === 'object' && source[key] !== null) {
211
+ result[key] = deepMerge(target[key], source[key])
212
+ } else {
213
+ result[key] = source[key]
214
+ }
215
+ }
216
+ }
217
+
218
+ return result
219
+ }
220
+
221
+ /**
222
+ * Load configuration from environment variables
223
+ */
224
+ function loadFromEnvironment(prefix = 'FLUXSTACK_'): Partial<FluxStackConfig> {
225
+ const config: any = {}
226
+
227
+ // Process known environment variable mappings
228
+ for (const [envKey, configPath] of Object.entries(ENV_MAPPINGS)) {
229
+ const envValue = process.env[envKey]
230
+ if (envValue !== undefined && envValue !== '') {
231
+ try {
232
+ // Determine target type from config path
233
+ let targetType = 'string'
234
+ if (configPath.includes('port') || configPath.includes('maxAge') || configPath.includes('collectInterval') || configPath.includes('sampleRate') || configPath.includes('poolSize')) {
235
+ targetType = 'number'
236
+ } else if (configPath.includes('enabled') || configPath.includes('credentials') || configPath.includes('ssl') || configPath.includes('secure') || configPath.includes('minify') || configPath.includes('treeshake') || configPath.includes('compress') || configPath.includes('splitChunks') || configPath.includes('bundleAnalyzer') || configPath.includes('sourceMaps') || configPath.includes('clean')) {
237
+ targetType = 'boolean'
238
+ } else if (configPath.includes('origins') || configPath.includes('methods') || configPath.includes('headers') || configPath.includes('exporters')) {
239
+ targetType = 'array'
240
+ }
241
+
242
+ const parsedValue = parseEnvValue(envValue, targetType)
243
+ if (parsedValue !== undefined) {
244
+ setNestedProperty(config, configPath, parsedValue)
245
+ }
246
+ } catch (error) {
247
+ console.warn(`Failed to parse environment variable ${envKey}: ${error}`)
248
+ }
249
+ }
250
+ }
251
+
252
+ // Process custom environment variables with prefix
253
+ for (const [key, value] of Object.entries(process.env)) {
254
+ if (key.startsWith(prefix) && !ENV_MAPPINGS[key as keyof typeof ENV_MAPPINGS] && value !== undefined && value !== '') {
255
+ const configKey = key.slice(prefix.length).toLowerCase().replace(/_/g, '.')
256
+ try {
257
+ const parsedValue = parseEnvValue(value!)
258
+ if (parsedValue !== undefined) {
259
+ if (!config.custom) config.custom = {}
260
+ config.custom[configKey] = parsedValue
261
+ }
262
+ } catch (error) {
263
+ console.warn(`Failed to parse custom environment variable ${key}: ${error}`)
264
+ }
265
+ }
266
+ }
267
+
268
+ return config
269
+ }
270
+
271
+ /**
272
+ * Load configuration from file
273
+ */
274
+ async function loadFromFile(configPath: string): Promise<Partial<FluxStackConfig>> {
275
+ if (!existsSync(configPath)) {
276
+ throw new Error(`Configuration file not found: ${configPath}`)
277
+ }
278
+
279
+ try {
280
+ // Dynamic import to support both .ts and .js files
281
+ const configModule = await import(configPath)
282
+ const config = configModule.default || configModule.config || configModule
283
+
284
+ if (typeof config === 'function') {
285
+ return config()
286
+ }
287
+
288
+ return config
289
+ } catch (error) {
290
+ throw new Error(`Failed to load configuration from ${configPath}: ${error}`)
291
+ }
292
+ }
293
+
294
+ /**
295
+ * Find configuration file in common locations
296
+ */
297
+ function findConfigFile(startDir = process.cwd()): string | null {
298
+ const configNames = [
299
+ 'fluxstack.config.ts',
300
+ 'fluxstack.config.js',
301
+ 'fluxstack.config.mjs',
302
+ 'config/fluxstack.config.ts',
303
+ 'config/fluxstack.config.js'
304
+ ]
305
+
306
+ for (const name of configNames) {
307
+ const fullPath = join(startDir, name)
308
+ if (existsSync(fullPath)) {
309
+ return fullPath
310
+ }
311
+ }
312
+
313
+ return null
314
+ }
315
+
316
+ /**
317
+ * Apply environment-specific configuration
318
+ */
319
+ export function applyEnvironmentConfig(
320
+ config: FluxStackConfig,
321
+ environment: string
322
+ ): FluxStackConfig {
323
+ const envDefaults = environmentDefaults[environment as keyof typeof environmentDefaults]
324
+ const envOverrides = config.environments?.[environment]
325
+
326
+ let result = config
327
+
328
+ // Apply environment defaults only for values that haven't been explicitly set
329
+ if (envDefaults) {
330
+ result = smartMerge(result, envDefaults)
331
+ }
332
+
333
+ // Apply environment-specific overrides from config
334
+ if (envOverrides) {
335
+ result = deepMerge(result, envOverrides)
336
+ }
337
+
338
+ return result
339
+ }
340
+
341
+ /**
342
+ * Smart merge that only applies defaults for undefined values
343
+ */
344
+ function smartMerge(target: any, defaults: any): any {
345
+ if (!defaults || typeof defaults !== 'object') return target
346
+ if (!target || typeof target !== 'object') return defaults
347
+
348
+ const result = { ...target }
349
+
350
+ for (const key in defaults) {
351
+ if (defaults.hasOwnProperty(key)) {
352
+ if (target[key] === undefined) {
353
+ // Value not set in target, use default
354
+ result[key] = defaults[key]
355
+ } else if (typeof defaults[key] === 'object' && defaults[key] !== null && !Array.isArray(defaults[key])) {
356
+ // Recursively merge nested objects
357
+ result[key] = smartMerge(target[key], defaults[key])
358
+ }
359
+ // Otherwise keep the target value (don't override)
360
+ }
361
+ }
362
+
363
+ return result
364
+ }
365
+
366
+ /**
367
+ * Main configuration loader
368
+ */
369
+ export async function loadConfig(options: ConfigLoadOptions = {}): Promise<ConfigLoadResult> {
370
+ const {
371
+ configPath,
372
+ environment = process.env.NODE_ENV || 'development',
373
+ envPrefix = 'FLUXSTACK_',
374
+ validateSchema = true
375
+ } = options
376
+
377
+ const sources: string[] = []
378
+ const warnings: string[] = []
379
+ const errors: string[] = []
380
+
381
+ try {
382
+ // Start with default configuration
383
+ let config: FluxStackConfig = JSON.parse(JSON.stringify(defaultFluxStackConfig))
384
+ sources.push('defaults')
385
+
386
+ // Load from configuration file
387
+ let fileConfig: any = null
388
+ const actualConfigPath = configPath || findConfigFile()
389
+ if (actualConfigPath) {
390
+ try {
391
+ fileConfig = await loadFromFile(actualConfigPath)
392
+ config = deepMerge(config, fileConfig)
393
+ sources.push(`file:${actualConfigPath}`)
394
+ } catch (error) {
395
+ errors.push(`Failed to load config file: ${error}`)
396
+ }
397
+ } else if (configPath) {
398
+ errors.push(`Specified config file not found: ${configPath}`)
399
+ }
400
+
401
+ // Load from environment variables
402
+ const envConfig = loadFromEnvironment(envPrefix)
403
+ if (Object.keys(envConfig).length > 0) {
404
+ config = deepMerge(config, envConfig)
405
+ sources.push('environment')
406
+ }
407
+
408
+ // Apply environment-specific configuration (only if no file config or env vars override)
409
+ const envDefaults = environmentDefaults[environment as keyof typeof environmentDefaults]
410
+ if (envDefaults) {
411
+ // Apply environment defaults but don't override existing values
412
+ config = smartMerge(config, envDefaults)
413
+ sources.push(`environment:${environment}`)
414
+ }
415
+
416
+ // Validate configuration if requested
417
+ if (validateSchema) {
418
+ try {
419
+ const { validateConfig } = await import('./validator')
420
+ const validationResult = validateConfig(config)
421
+
422
+ if (!validationResult.valid) {
423
+ errors.push(...validationResult.errors)
424
+ }
425
+
426
+ warnings.push(...validationResult.warnings)
427
+ } catch (error) {
428
+ warnings.push(`Validation failed: ${error}`)
429
+ }
430
+ }
431
+
432
+ return {
433
+ config,
434
+ sources,
435
+ warnings,
436
+ errors
437
+ }
438
+ } catch (error) {
439
+ errors.push(`Configuration loading failed: ${error}`)
440
+
441
+ return {
442
+ config: defaultFluxStackConfig,
443
+ sources: ['defaults'],
444
+ warnings,
445
+ errors
446
+ }
447
+ }
448
+ }
449
+
450
+ /**
451
+ * Load configuration synchronously (limited functionality)
452
+ */
453
+ export function loadConfigSync(options: ConfigLoadOptions = {}): ConfigLoadResult {
454
+ const {
455
+ environment = process.env.NODE_ENV || 'development',
456
+ envPrefix = 'FLUXSTACK_'
457
+ } = options
458
+
459
+ const sources: string[] = []
460
+ const warnings: string[] = []
461
+ const errors: string[] = []
462
+
463
+ try {
464
+ // Start with default configuration
465
+ let config: FluxStackConfig = JSON.parse(JSON.stringify(defaultFluxStackConfig))
466
+ sources.push('defaults')
467
+
468
+ // Load from environment variables
469
+ const envConfig = loadFromEnvironment(envPrefix)
470
+ if (Object.keys(envConfig).length > 0) {
471
+ config = deepMerge(config, envConfig)
472
+ sources.push('environment')
473
+ }
474
+
475
+ // Apply environment-specific configuration
476
+ const envDefaults = environmentDefaults[environment as keyof typeof environmentDefaults]
477
+ if (envDefaults) {
478
+ // Apply environment defaults first
479
+ const configWithEnvDefaults = deepMerge(config, envDefaults)
480
+
481
+ // Re-apply environment variables last (highest priority)
482
+ if (Object.keys(envConfig).length > 0) {
483
+ config = deepMerge(configWithEnvDefaults, envConfig)
484
+ } else {
485
+ config = configWithEnvDefaults
486
+ }
487
+
488
+ sources.push(`environment:${environment}`)
489
+ } else if (environment !== 'development') {
490
+ // Still add the environment source even if no defaults
491
+ sources.push(`environment:${environment}`)
492
+ }
493
+
494
+ return {
495
+ config,
496
+ sources,
497
+ warnings,
498
+ errors
499
+ }
500
+ } catch (error) {
501
+ errors.push(`Synchronous configuration loading failed: ${error}`)
502
+
503
+ return {
504
+ config: defaultFluxStackConfig,
505
+ sources: ['defaults'],
506
+ warnings,
507
+ errors
508
+ }
509
+ }
510
+ }
511
+
512
+ /**
513
+ * Get configuration value using dot notation
514
+ */
515
+ export function getConfigValue<T = any>(config: FluxStackConfig, path: string): T | undefined
516
+ export function getConfigValue<T = any>(config: FluxStackConfig, path: string, defaultValue: T): T
517
+ export function getConfigValue<T = any>(config: FluxStackConfig, path: string, defaultValue?: T): T | undefined {
518
+ const value = getNestedProperty(config, path)
519
+ return value !== undefined ? value : defaultValue
520
+ }
521
+
522
+ /**
523
+ * Check if configuration has a specific value
524
+ */
525
+ export function hasConfigValue(config: FluxStackConfig, path: string): boolean {
526
+ return getNestedProperty(config, path) !== undefined
527
+ }
528
+
529
+ /**
530
+ * Create a configuration subset for a specific plugin or module
531
+ */
532
+ export function createConfigSubset(
533
+ config: FluxStackConfig,
534
+ paths: string[]
535
+ ): Record<string, any> {
536
+ const subset: Record<string, any> = {}
537
+
538
+ for (const path of paths) {
539
+ const value = getNestedProperty(config, path)
540
+ if (value !== undefined) {
541
+ setNestedProperty(subset, path, value)
542
+ }
543
+ }
544
+
545
+ return subset
546
+ }