create-fluxstack 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (561) 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/LICENSE +21 -0
  19. package/README-Docker.md +85 -0
  20. package/TEST_RESULTS.md +130 -0
  21. package/ai-context/00-QUICK-START.md +86 -0
  22. package/ai-context/README.md +88 -0
  23. package/ai-context/development/eden-treaty-guide.md +362 -0
  24. package/ai-context/development/patterns.md +382 -0
  25. package/ai-context/examples/crud-complete.md +626 -0
  26. package/ai-context/project/architecture.md +399 -0
  27. package/ai-context/project/overview.md +213 -0
  28. package/ai-context/recent-changes/eden-treaty-refactor.md +281 -0
  29. package/ai-context/recent-changes/type-inference-fix.md +223 -0
  30. package/ai-context/reference/environment-vars.md +384 -0
  31. package/ai-context/reference/troubleshooting.md +407 -0
  32. package/app/client/README.md +69 -0
  33. package/app/client/frontend-only.ts +12 -0
  34. package/app/client/index.html +13 -0
  35. package/app/client/public/vite.svg +1 -0
  36. package/app/client/src/App.css +883 -0
  37. package/app/client/src/App.tsx +669 -0
  38. package/app/client/src/assets/react.svg +1 -0
  39. package/app/client/src/components/TestPage.tsx +453 -0
  40. package/app/client/src/index.css +51 -0
  41. package/app/client/src/lib/eden-api.ts +110 -0
  42. package/app/client/src/main.tsx +10 -0
  43. package/app/client/src/vite-env.d.ts +1 -0
  44. package/app/client/tsconfig.app.json +43 -0
  45. package/app/client/tsconfig.json +7 -0
  46. package/app/client/tsconfig.node.json +25 -0
  47. package/app/server/app.ts +10 -0
  48. package/app/server/backend-only.ts +15 -0
  49. package/app/server/controllers/users.controller.ts +69 -0
  50. package/app/server/index.ts +104 -0
  51. package/app/server/routes/index.ts +25 -0
  52. package/app/server/routes/users.routes.ts +121 -0
  53. package/app/server/types/index.ts +1 -0
  54. package/app/shared/types/index.ts +18 -0
  55. package/bun.lock +1063 -0
  56. package/bunfig.toml +16 -0
  57. package/config/fluxstack.config.ts +48 -0
  58. package/core/__tests__/integration.test.ts +227 -0
  59. package/core/build/index.ts +186 -0
  60. package/core/cli/command-registry.ts +334 -0
  61. package/core/cli/index.ts +394 -0
  62. package/core/cli/plugin-discovery.ts +200 -0
  63. package/core/client/standalone.ts +57 -0
  64. package/core/config/__tests__/config-loader.test.ts +591 -0
  65. package/core/config/__tests__/config-merger.test.ts +657 -0
  66. package/core/config/__tests__/env-converter.test.ts +372 -0
  67. package/core/config/__tests__/env-processor.test.ts +431 -0
  68. package/core/config/__tests__/env.test.ts +452 -0
  69. package/core/config/__tests__/integration.test.ts +418 -0
  70. package/core/config/__tests__/loader.test.ts +331 -0
  71. package/core/config/__tests__/schema.test.ts +129 -0
  72. package/core/config/__tests__/validator.test.ts +318 -0
  73. package/core/config/env-dynamic.ts +326 -0
  74. package/core/config/env.ts +597 -0
  75. package/core/config/index.ts +317 -0
  76. package/core/config/loader.ts +546 -0
  77. package/core/config/runtime-config.ts +322 -0
  78. package/core/config/schema.ts +694 -0
  79. package/core/config/validator.ts +540 -0
  80. package/core/framework/__tests__/server.test.ts +233 -0
  81. package/core/framework/client.ts +132 -0
  82. package/core/framework/index.ts +8 -0
  83. package/core/framework/server.ts +501 -0
  84. package/core/framework/types.ts +63 -0
  85. package/core/plugins/__tests__/built-in.test.ts.disabled +366 -0
  86. package/core/plugins/__tests__/manager.test.ts +398 -0
  87. package/core/plugins/__tests__/monitoring.test.ts +401 -0
  88. package/core/plugins/__tests__/registry.test.ts +335 -0
  89. package/core/plugins/built-in/index.ts +142 -0
  90. package/core/plugins/built-in/logger/index.ts +180 -0
  91. package/core/plugins/built-in/monitoring/README.md +193 -0
  92. package/core/plugins/built-in/monitoring/index.ts +912 -0
  93. package/core/plugins/built-in/static/index.ts +289 -0
  94. package/core/plugins/built-in/swagger/index.ts +229 -0
  95. package/core/plugins/built-in/vite/index.ts +316 -0
  96. package/core/plugins/config.ts +348 -0
  97. package/core/plugins/discovery.ts +350 -0
  98. package/core/plugins/executor.ts +351 -0
  99. package/core/plugins/index.ts +195 -0
  100. package/core/plugins/manager.ts +583 -0
  101. package/core/plugins/registry.ts +424 -0
  102. package/core/plugins/types.ts +254 -0
  103. package/core/server/framework.ts +123 -0
  104. package/core/server/index.ts +8 -0
  105. package/core/server/plugins/database.ts +182 -0
  106. package/core/server/plugins/logger.ts +47 -0
  107. package/core/server/plugins/swagger.ts +34 -0
  108. package/core/server/standalone.ts +91 -0
  109. package/core/templates/create-project.ts +455 -0
  110. package/core/types/api.ts +169 -0
  111. package/core/types/build.ts +174 -0
  112. package/core/types/config.ts +68 -0
  113. package/core/types/index.ts +127 -0
  114. package/core/types/plugin.ts +94 -0
  115. package/core/utils/__tests__/errors.test.ts +139 -0
  116. package/core/utils/__tests__/helpers.test.ts +297 -0
  117. package/core/utils/__tests__/logger.test.ts +141 -0
  118. package/core/utils/env-runtime-v2.ts +232 -0
  119. package/core/utils/env-runtime.ts +252 -0
  120. package/core/utils/errors/codes.ts +115 -0
  121. package/core/utils/errors/handlers.ts +63 -0
  122. package/core/utils/errors/index.ts +81 -0
  123. package/core/utils/helpers.ts +180 -0
  124. package/core/utils/index.ts +18 -0
  125. package/core/utils/logger/index.ts +161 -0
  126. package/core/utils/logger.ts +106 -0
  127. package/core/utils/monitoring/index.ts +212 -0
  128. package/create-fluxstack.ts +1 -1
  129. package/create-test-app.ts +156 -0
  130. package/docker-compose.microservices.yml +75 -0
  131. package/docker-compose.simple.yml +57 -0
  132. package/docker-compose.yml +71 -0
  133. package/docs/dynamic-environment-variables.md +380 -0
  134. package/eslint.config.js +23 -0
  135. package/examples/dynamic-env-usage.ts +283 -0
  136. package/examples/hybrid-env-strategy.ts +212 -0
  137. package/examples/simplified-env-usage.ts +251 -0
  138. package/flux-cli.ts +214 -0
  139. package/fluxstack.config.ts +318 -0
  140. package/meu-app-teste/README.md +44 -0
  141. package/meu-app-teste/app/client/README.md +69 -0
  142. package/meu-app-teste/app/client/frontend-only.ts +12 -0
  143. package/meu-app-teste/app/client/index.html +13 -0
  144. package/meu-app-teste/app/client/public/vite.svg +1 -0
  145. package/meu-app-teste/app/client/src/App.css +883 -0
  146. package/meu-app-teste/app/client/src/App.tsx +669 -0
  147. package/meu-app-teste/app/client/src/assets/react.svg +1 -0
  148. package/meu-app-teste/app/client/src/components/TestPage.tsx +453 -0
  149. package/meu-app-teste/app/client/src/index.css +51 -0
  150. package/meu-app-teste/app/client/src/lib/eden-api.ts +110 -0
  151. package/meu-app-teste/app/client/src/main.tsx +10 -0
  152. package/meu-app-teste/app/client/src/vite-env.d.ts +1 -0
  153. package/meu-app-teste/app/client/tsconfig.app.json +43 -0
  154. package/meu-app-teste/app/client/tsconfig.json +7 -0
  155. package/meu-app-teste/app/client/tsconfig.node.json +25 -0
  156. package/meu-app-teste/app/server/app.ts +10 -0
  157. package/meu-app-teste/app/server/backend-only.ts +15 -0
  158. package/meu-app-teste/app/server/controllers/users.controller.ts +69 -0
  159. package/meu-app-teste/app/server/index.ts +104 -0
  160. package/meu-app-teste/app/server/routes/index.ts +25 -0
  161. package/meu-app-teste/app/server/routes/users.routes.ts +121 -0
  162. package/meu-app-teste/app/server/types/index.ts +1 -0
  163. package/meu-app-teste/app/shared/types/index.ts +18 -0
  164. package/meu-app-teste/bun.lock +1053 -0
  165. package/meu-app-teste/core/__tests__/integration.test.ts +227 -0
  166. package/meu-app-teste/core/build/index.ts +186 -0
  167. package/meu-app-teste/core/cli/command-registry.ts +334 -0
  168. package/meu-app-teste/core/cli/index.ts +394 -0
  169. package/meu-app-teste/core/cli/plugin-discovery.ts +200 -0
  170. package/meu-app-teste/core/client/standalone.ts +57 -0
  171. package/meu-app-teste/core/config/__tests__/config-loader.test.ts +591 -0
  172. package/meu-app-teste/core/config/__tests__/config-merger.test.ts +657 -0
  173. package/meu-app-teste/core/config/__tests__/env-converter.test.ts +372 -0
  174. package/meu-app-teste/core/config/__tests__/env-processor.test.ts +431 -0
  175. package/meu-app-teste/core/config/__tests__/env.test.ts +452 -0
  176. package/meu-app-teste/core/config/__tests__/integration.test.ts +418 -0
  177. package/meu-app-teste/core/config/__tests__/loader.test.ts +331 -0
  178. package/meu-app-teste/core/config/__tests__/schema.test.ts +129 -0
  179. package/meu-app-teste/core/config/__tests__/validator.test.ts +318 -0
  180. package/meu-app-teste/core/config/env-dynamic.ts +326 -0
  181. package/meu-app-teste/core/config/env.ts +597 -0
  182. package/meu-app-teste/core/config/index.ts +317 -0
  183. package/meu-app-teste/core/config/loader.ts +546 -0
  184. package/meu-app-teste/core/config/runtime-config.ts +322 -0
  185. package/meu-app-teste/core/config/schema.ts +694 -0
  186. package/meu-app-teste/core/config/validator.ts +540 -0
  187. package/meu-app-teste/core/framework/__tests__/server.test.ts +233 -0
  188. package/meu-app-teste/core/framework/client.ts +132 -0
  189. package/meu-app-teste/core/framework/index.ts +8 -0
  190. package/meu-app-teste/core/framework/server.ts +501 -0
  191. package/meu-app-teste/core/framework/types.ts +63 -0
  192. package/meu-app-teste/core/plugins/__tests__/built-in.test.ts.disabled +366 -0
  193. package/meu-app-teste/core/plugins/__tests__/manager.test.ts +398 -0
  194. package/meu-app-teste/core/plugins/__tests__/monitoring.test.ts +401 -0
  195. package/meu-app-teste/core/plugins/__tests__/registry.test.ts +335 -0
  196. package/meu-app-teste/core/plugins/built-in/index.ts +142 -0
  197. package/meu-app-teste/core/plugins/built-in/logger/index.ts +180 -0
  198. package/meu-app-teste/core/plugins/built-in/monitoring/README.md +193 -0
  199. package/meu-app-teste/core/plugins/built-in/monitoring/index.ts +912 -0
  200. package/meu-app-teste/core/plugins/built-in/static/index.ts +289 -0
  201. package/meu-app-teste/core/plugins/built-in/swagger/index.ts +229 -0
  202. package/meu-app-teste/core/plugins/built-in/vite/index.ts +316 -0
  203. package/meu-app-teste/core/plugins/config.ts +348 -0
  204. package/meu-app-teste/core/plugins/discovery.ts +350 -0
  205. package/meu-app-teste/core/plugins/executor.ts +351 -0
  206. package/meu-app-teste/core/plugins/index.ts +195 -0
  207. package/meu-app-teste/core/plugins/manager.ts +583 -0
  208. package/meu-app-teste/core/plugins/registry.ts +424 -0
  209. package/meu-app-teste/core/plugins/types.ts +254 -0
  210. package/meu-app-teste/core/server/framework.ts +123 -0
  211. package/meu-app-teste/core/server/index.ts +8 -0
  212. package/meu-app-teste/core/server/plugins/database.ts +182 -0
  213. package/meu-app-teste/core/server/plugins/logger.ts +47 -0
  214. package/meu-app-teste/core/server/plugins/swagger.ts +34 -0
  215. package/meu-app-teste/core/server/standalone.ts +91 -0
  216. package/meu-app-teste/core/templates/create-project.ts +455 -0
  217. package/meu-app-teste/core/types/api.ts +169 -0
  218. package/meu-app-teste/core/types/build.ts +174 -0
  219. package/meu-app-teste/core/types/config.ts +68 -0
  220. package/meu-app-teste/core/types/index.ts +127 -0
  221. package/meu-app-teste/core/types/plugin.ts +94 -0
  222. package/meu-app-teste/core/utils/__tests__/errors.test.ts +139 -0
  223. package/meu-app-teste/core/utils/__tests__/helpers.test.ts +297 -0
  224. package/meu-app-teste/core/utils/__tests__/logger.test.ts +141 -0
  225. package/meu-app-teste/core/utils/env-runtime-v2.ts +232 -0
  226. package/meu-app-teste/core/utils/env-runtime.ts +252 -0
  227. package/meu-app-teste/core/utils/errors/codes.ts +115 -0
  228. package/meu-app-teste/core/utils/errors/handlers.ts +63 -0
  229. package/meu-app-teste/core/utils/errors/index.ts +81 -0
  230. package/meu-app-teste/core/utils/helpers.ts +180 -0
  231. package/meu-app-teste/core/utils/index.ts +18 -0
  232. package/meu-app-teste/core/utils/logger/index.ts +161 -0
  233. package/meu-app-teste/core/utils/logger.ts +106 -0
  234. package/meu-app-teste/core/utils/monitoring/index.ts +212 -0
  235. package/meu-app-teste/package.json +92 -0
  236. package/meu-app-teste/tsconfig.json +51 -0
  237. package/meu-app-teste/vite.config.ts +42 -0
  238. package/my-final-test/README.md +44 -0
  239. package/my-final-test/app/client/README.md +69 -0
  240. package/my-final-test/app/client/frontend-only.ts +12 -0
  241. package/my-final-test/app/client/index.html +13 -0
  242. package/my-final-test/app/client/public/vite.svg +1 -0
  243. package/my-final-test/app/client/src/App.css +883 -0
  244. package/my-final-test/app/client/src/App.tsx +669 -0
  245. package/my-final-test/app/client/src/assets/react.svg +1 -0
  246. package/my-final-test/app/client/src/components/TestPage.tsx +453 -0
  247. package/my-final-test/app/client/src/index.css +51 -0
  248. package/my-final-test/app/client/src/lib/eden-api.ts +110 -0
  249. package/my-final-test/app/client/src/main.tsx +10 -0
  250. package/my-final-test/app/client/src/vite-env.d.ts +1 -0
  251. package/my-final-test/app/client/tsconfig.app.json +43 -0
  252. package/my-final-test/app/client/tsconfig.json +7 -0
  253. package/my-final-test/app/client/tsconfig.node.json +25 -0
  254. package/my-final-test/app/server/app.ts +10 -0
  255. package/my-final-test/app/server/backend-only.ts +15 -0
  256. package/my-final-test/app/server/controllers/users.controller.ts +69 -0
  257. package/my-final-test/app/server/index.ts +104 -0
  258. package/my-final-test/app/server/routes/index.ts +25 -0
  259. package/my-final-test/app/server/routes/users.routes.ts +121 -0
  260. package/my-final-test/app/server/types/index.ts +1 -0
  261. package/my-final-test/app/shared/types/index.ts +18 -0
  262. package/my-final-test/bun.lock +993 -0
  263. package/my-final-test/core/__tests__/integration.test.ts +227 -0
  264. package/my-final-test/core/build/index.ts +186 -0
  265. package/my-final-test/core/cli/command-registry.ts +334 -0
  266. package/my-final-test/core/cli/index.ts +394 -0
  267. package/my-final-test/core/cli/plugin-discovery.ts +200 -0
  268. package/my-final-test/core/client/standalone.ts +57 -0
  269. package/my-final-test/core/config/__tests__/config-loader.test.ts +591 -0
  270. package/my-final-test/core/config/__tests__/config-merger.test.ts +657 -0
  271. package/my-final-test/core/config/__tests__/env-converter.test.ts +372 -0
  272. package/my-final-test/core/config/__tests__/env-processor.test.ts +431 -0
  273. package/my-final-test/core/config/__tests__/env.test.ts +452 -0
  274. package/my-final-test/core/config/__tests__/integration.test.ts +418 -0
  275. package/my-final-test/core/config/__tests__/loader.test.ts +331 -0
  276. package/my-final-test/core/config/__tests__/schema.test.ts +129 -0
  277. package/my-final-test/core/config/__tests__/validator.test.ts +318 -0
  278. package/my-final-test/core/config/env-dynamic.ts +326 -0
  279. package/my-final-test/core/config/env.ts +597 -0
  280. package/my-final-test/core/config/index.ts +317 -0
  281. package/my-final-test/core/config/loader.ts +546 -0
  282. package/my-final-test/core/config/runtime-config.ts +322 -0
  283. package/my-final-test/core/config/schema.ts +694 -0
  284. package/my-final-test/core/config/validator.ts +540 -0
  285. package/my-final-test/core/framework/__tests__/server.test.ts +233 -0
  286. package/my-final-test/core/framework/client.ts +132 -0
  287. package/my-final-test/core/framework/index.ts +8 -0
  288. package/my-final-test/core/framework/server.ts +501 -0
  289. package/my-final-test/core/framework/types.ts +63 -0
  290. package/my-final-test/core/plugins/__tests__/built-in.test.ts.disabled +366 -0
  291. package/my-final-test/core/plugins/__tests__/manager.test.ts +398 -0
  292. package/my-final-test/core/plugins/__tests__/monitoring.test.ts +401 -0
  293. package/my-final-test/core/plugins/__tests__/registry.test.ts +335 -0
  294. package/my-final-test/core/plugins/built-in/index.ts +142 -0
  295. package/my-final-test/core/plugins/built-in/logger/index.ts +180 -0
  296. package/my-final-test/core/plugins/built-in/monitoring/README.md +193 -0
  297. package/my-final-test/core/plugins/built-in/monitoring/index.ts +912 -0
  298. package/my-final-test/core/plugins/built-in/static/index.ts +289 -0
  299. package/my-final-test/core/plugins/built-in/swagger/index.ts +229 -0
  300. package/my-final-test/core/plugins/built-in/vite/index.ts +316 -0
  301. package/my-final-test/core/plugins/config.ts +348 -0
  302. package/my-final-test/core/plugins/discovery.ts +350 -0
  303. package/my-final-test/core/plugins/executor.ts +351 -0
  304. package/my-final-test/core/plugins/index.ts +195 -0
  305. package/my-final-test/core/plugins/manager.ts +583 -0
  306. package/my-final-test/core/plugins/registry.ts +424 -0
  307. package/my-final-test/core/plugins/types.ts +254 -0
  308. package/my-final-test/core/server/framework.ts +123 -0
  309. package/my-final-test/core/server/index.ts +8 -0
  310. package/my-final-test/core/server/plugins/database.ts +182 -0
  311. package/my-final-test/core/server/plugins/logger.ts +47 -0
  312. package/my-final-test/core/server/plugins/swagger.ts +34 -0
  313. package/my-final-test/core/server/standalone.ts +91 -0
  314. package/my-final-test/core/templates/create-project.ts +455 -0
  315. package/my-final-test/core/types/api.ts +169 -0
  316. package/my-final-test/core/types/build.ts +174 -0
  317. package/my-final-test/core/types/config.ts +68 -0
  318. package/my-final-test/core/types/index.ts +127 -0
  319. package/my-final-test/core/types/plugin.ts +94 -0
  320. package/my-final-test/core/utils/__tests__/errors.test.ts +139 -0
  321. package/my-final-test/core/utils/__tests__/helpers.test.ts +297 -0
  322. package/my-final-test/core/utils/__tests__/logger.test.ts +141 -0
  323. package/my-final-test/core/utils/env-runtime-v2.ts +232 -0
  324. package/my-final-test/core/utils/env-runtime.ts +252 -0
  325. package/my-final-test/core/utils/errors/codes.ts +115 -0
  326. package/my-final-test/core/utils/errors/handlers.ts +63 -0
  327. package/my-final-test/core/utils/errors/index.ts +81 -0
  328. package/my-final-test/core/utils/helpers.ts +180 -0
  329. package/my-final-test/core/utils/index.ts +18 -0
  330. package/my-final-test/core/utils/logger/index.ts +161 -0
  331. package/my-final-test/core/utils/logger.ts +106 -0
  332. package/my-final-test/core/utils/monitoring/index.ts +212 -0
  333. package/my-final-test/package.json +68 -0
  334. package/my-final-test/tsconfig.json +51 -0
  335. package/my-final-test/vite.config.ts +42 -0
  336. package/nginx-lb.conf +37 -0
  337. package/package-template.json +32 -15
  338. package/package.json +71 -30
  339. package/publish-setup.md +111 -0
  340. package/publish.sh +63 -0
  341. package/run-clean.ts +26 -0
  342. package/run-env-tests.ts +313 -0
  343. package/tailwind.config.js +34 -0
  344. package/teste-corrigido/README.md +44 -0
  345. package/teste-corrigido/app/client/README.md +69 -0
  346. package/teste-corrigido/app/client/frontend-only.ts +12 -0
  347. package/teste-corrigido/app/client/index.html +13 -0
  348. package/teste-corrigido/app/client/public/vite.svg +1 -0
  349. package/teste-corrigido/app/client/src/App.css +883 -0
  350. package/teste-corrigido/app/client/src/App.tsx +669 -0
  351. package/teste-corrigido/app/client/src/assets/react.svg +1 -0
  352. package/teste-corrigido/app/client/src/components/TestPage.tsx +453 -0
  353. package/teste-corrigido/app/client/src/index.css +51 -0
  354. package/teste-corrigido/app/client/src/lib/eden-api.ts +110 -0
  355. package/teste-corrigido/app/client/src/main.tsx +10 -0
  356. package/teste-corrigido/app/client/src/vite-env.d.ts +1 -0
  357. package/teste-corrigido/app/client/tsconfig.app.json +43 -0
  358. package/teste-corrigido/app/client/tsconfig.json +7 -0
  359. package/teste-corrigido/app/client/tsconfig.node.json +25 -0
  360. package/teste-corrigido/app/server/app.ts +10 -0
  361. package/teste-corrigido/app/server/backend-only.ts +15 -0
  362. package/teste-corrigido/app/server/controllers/users.controller.ts +69 -0
  363. package/teste-corrigido/app/server/index.ts +104 -0
  364. package/teste-corrigido/app/server/routes/index.ts +25 -0
  365. package/teste-corrigido/app/server/routes/users.routes.ts +121 -0
  366. package/teste-corrigido/app/server/types/index.ts +1 -0
  367. package/teste-corrigido/app/shared/types/index.ts +18 -0
  368. package/teste-corrigido/bun.lock +1053 -0
  369. package/teste-corrigido/core/__tests__/integration.test.ts +227 -0
  370. package/teste-corrigido/core/build/index.ts +186 -0
  371. package/teste-corrigido/core/cli/command-registry.ts +334 -0
  372. package/teste-corrigido/core/cli/index.ts +394 -0
  373. package/teste-corrigido/core/cli/plugin-discovery.ts +200 -0
  374. package/teste-corrigido/core/client/standalone.ts +57 -0
  375. package/teste-corrigido/core/config/__tests__/config-loader.test.ts +591 -0
  376. package/teste-corrigido/core/config/__tests__/config-merger.test.ts +657 -0
  377. package/teste-corrigido/core/config/__tests__/env-converter.test.ts +372 -0
  378. package/teste-corrigido/core/config/__tests__/env-processor.test.ts +431 -0
  379. package/teste-corrigido/core/config/__tests__/env.test.ts +452 -0
  380. package/teste-corrigido/core/config/__tests__/integration.test.ts +418 -0
  381. package/teste-corrigido/core/config/__tests__/loader.test.ts +331 -0
  382. package/teste-corrigido/core/config/__tests__/schema.test.ts +129 -0
  383. package/teste-corrigido/core/config/__tests__/validator.test.ts +318 -0
  384. package/teste-corrigido/core/config/env-dynamic.ts +326 -0
  385. package/teste-corrigido/core/config/env.ts +597 -0
  386. package/teste-corrigido/core/config/index.ts +317 -0
  387. package/teste-corrigido/core/config/loader.ts +546 -0
  388. package/teste-corrigido/core/config/runtime-config.ts +322 -0
  389. package/teste-corrigido/core/config/schema.ts +694 -0
  390. package/teste-corrigido/core/config/validator.ts +540 -0
  391. package/teste-corrigido/core/framework/__tests__/server.test.ts +233 -0
  392. package/teste-corrigido/core/framework/client.ts +132 -0
  393. package/teste-corrigido/core/framework/index.ts +8 -0
  394. package/teste-corrigido/core/framework/server.ts +501 -0
  395. package/teste-corrigido/core/framework/types.ts +63 -0
  396. package/teste-corrigido/core/plugins/__tests__/built-in.test.ts.disabled +366 -0
  397. package/teste-corrigido/core/plugins/__tests__/manager.test.ts +398 -0
  398. package/teste-corrigido/core/plugins/__tests__/monitoring.test.ts +401 -0
  399. package/teste-corrigido/core/plugins/__tests__/registry.test.ts +335 -0
  400. package/teste-corrigido/core/plugins/built-in/index.ts +142 -0
  401. package/teste-corrigido/core/plugins/built-in/logger/index.ts +180 -0
  402. package/teste-corrigido/core/plugins/built-in/monitoring/README.md +193 -0
  403. package/teste-corrigido/core/plugins/built-in/monitoring/index.ts +912 -0
  404. package/teste-corrigido/core/plugins/built-in/static/index.ts +289 -0
  405. package/teste-corrigido/core/plugins/built-in/swagger/index.ts +229 -0
  406. package/teste-corrigido/core/plugins/built-in/vite/index.ts +316 -0
  407. package/teste-corrigido/core/plugins/config.ts +348 -0
  408. package/teste-corrigido/core/plugins/discovery.ts +350 -0
  409. package/teste-corrigido/core/plugins/executor.ts +351 -0
  410. package/teste-corrigido/core/plugins/index.ts +195 -0
  411. package/teste-corrigido/core/plugins/manager.ts +583 -0
  412. package/teste-corrigido/core/plugins/registry.ts +424 -0
  413. package/teste-corrigido/core/plugins/types.ts +254 -0
  414. package/teste-corrigido/core/server/framework.ts +123 -0
  415. package/teste-corrigido/core/server/index.ts +8 -0
  416. package/teste-corrigido/core/server/plugins/database.ts +182 -0
  417. package/teste-corrigido/core/server/plugins/logger.ts +47 -0
  418. package/teste-corrigido/core/server/plugins/swagger.ts +34 -0
  419. package/teste-corrigido/core/server/standalone.ts +91 -0
  420. package/teste-corrigido/core/templates/create-project.ts +455 -0
  421. package/teste-corrigido/core/types/api.ts +169 -0
  422. package/teste-corrigido/core/types/build.ts +174 -0
  423. package/teste-corrigido/core/types/config.ts +68 -0
  424. package/teste-corrigido/core/types/index.ts +127 -0
  425. package/teste-corrigido/core/types/plugin.ts +94 -0
  426. package/teste-corrigido/core/utils/__tests__/errors.test.ts +139 -0
  427. package/teste-corrigido/core/utils/__tests__/helpers.test.ts +297 -0
  428. package/teste-corrigido/core/utils/__tests__/logger.test.ts +141 -0
  429. package/teste-corrigido/core/utils/env-runtime-v2.ts +232 -0
  430. package/teste-corrigido/core/utils/env-runtime.ts +252 -0
  431. package/teste-corrigido/core/utils/errors/codes.ts +115 -0
  432. package/teste-corrigido/core/utils/errors/handlers.ts +63 -0
  433. package/teste-corrigido/core/utils/errors/index.ts +81 -0
  434. package/teste-corrigido/core/utils/helpers.ts +180 -0
  435. package/teste-corrigido/core/utils/index.ts +18 -0
  436. package/teste-corrigido/core/utils/logger/index.ts +161 -0
  437. package/teste-corrigido/core/utils/logger.ts +106 -0
  438. package/teste-corrigido/core/utils/monitoring/index.ts +212 -0
  439. package/teste-corrigido/package-template.json +51 -0
  440. package/teste-corrigido/package.json +51 -0
  441. package/teste-corrigido/tsconfig.json +51 -0
  442. package/teste-corrigido/vite.config.ts +42 -0
  443. package/teste-final-npm/README.md +44 -0
  444. package/teste-final-npm/app/client/README.md +69 -0
  445. package/teste-final-npm/app/client/frontend-only.ts +12 -0
  446. package/teste-final-npm/app/client/index.html +13 -0
  447. package/teste-final-npm/app/client/public/vite.svg +1 -0
  448. package/teste-final-npm/app/client/src/App.css +883 -0
  449. package/teste-final-npm/app/client/src/App.tsx +669 -0
  450. package/teste-final-npm/app/client/src/assets/react.svg +1 -0
  451. package/teste-final-npm/app/client/src/components/TestPage.tsx +453 -0
  452. package/teste-final-npm/app/client/src/index.css +51 -0
  453. package/teste-final-npm/app/client/src/lib/eden-api.ts +110 -0
  454. package/teste-final-npm/app/client/src/main.tsx +10 -0
  455. package/teste-final-npm/app/client/src/vite-env.d.ts +1 -0
  456. package/teste-final-npm/app/client/tsconfig.app.json +43 -0
  457. package/teste-final-npm/app/client/tsconfig.json +7 -0
  458. package/teste-final-npm/app/client/tsconfig.node.json +25 -0
  459. package/teste-final-npm/app/server/app.ts +10 -0
  460. package/teste-final-npm/app/server/backend-only.ts +15 -0
  461. package/teste-final-npm/app/server/controllers/users.controller.ts +69 -0
  462. package/teste-final-npm/app/server/index.ts +104 -0
  463. package/teste-final-npm/app/server/routes/index.ts +25 -0
  464. package/teste-final-npm/app/server/routes/users.routes.ts +121 -0
  465. package/teste-final-npm/app/server/types/index.ts +1 -0
  466. package/teste-final-npm/app/shared/types/index.ts +18 -0
  467. package/teste-final-npm/bun.lock +1053 -0
  468. package/teste-final-npm/core/__tests__/integration.test.ts +227 -0
  469. package/teste-final-npm/core/build/index.ts +186 -0
  470. package/teste-final-npm/core/cli/command-registry.ts +334 -0
  471. package/teste-final-npm/core/cli/index.ts +394 -0
  472. package/teste-final-npm/core/cli/plugin-discovery.ts +200 -0
  473. package/teste-final-npm/core/client/standalone.ts +57 -0
  474. package/teste-final-npm/core/config/__tests__/config-loader.test.ts +591 -0
  475. package/teste-final-npm/core/config/__tests__/config-merger.test.ts +657 -0
  476. package/teste-final-npm/core/config/__tests__/env-converter.test.ts +372 -0
  477. package/teste-final-npm/core/config/__tests__/env-processor.test.ts +431 -0
  478. package/teste-final-npm/core/config/__tests__/env.test.ts +452 -0
  479. package/teste-final-npm/core/config/__tests__/integration.test.ts +418 -0
  480. package/teste-final-npm/core/config/__tests__/loader.test.ts +331 -0
  481. package/teste-final-npm/core/config/__tests__/schema.test.ts +129 -0
  482. package/teste-final-npm/core/config/__tests__/validator.test.ts +318 -0
  483. package/teste-final-npm/core/config/env-dynamic.ts +326 -0
  484. package/teste-final-npm/core/config/env.ts +597 -0
  485. package/teste-final-npm/core/config/index.ts +317 -0
  486. package/teste-final-npm/core/config/loader.ts +546 -0
  487. package/teste-final-npm/core/config/runtime-config.ts +322 -0
  488. package/teste-final-npm/core/config/schema.ts +694 -0
  489. package/teste-final-npm/core/config/validator.ts +540 -0
  490. package/teste-final-npm/core/framework/__tests__/server.test.ts +233 -0
  491. package/teste-final-npm/core/framework/client.ts +132 -0
  492. package/teste-final-npm/core/framework/index.ts +8 -0
  493. package/teste-final-npm/core/framework/server.ts +501 -0
  494. package/teste-final-npm/core/framework/types.ts +63 -0
  495. package/teste-final-npm/core/plugins/__tests__/built-in.test.ts.disabled +366 -0
  496. package/teste-final-npm/core/plugins/__tests__/manager.test.ts +398 -0
  497. package/teste-final-npm/core/plugins/__tests__/monitoring.test.ts +401 -0
  498. package/teste-final-npm/core/plugins/__tests__/registry.test.ts +335 -0
  499. package/teste-final-npm/core/plugins/built-in/index.ts +142 -0
  500. package/teste-final-npm/core/plugins/built-in/logger/index.ts +180 -0
  501. package/teste-final-npm/core/plugins/built-in/monitoring/README.md +193 -0
  502. package/teste-final-npm/core/plugins/built-in/monitoring/index.ts +912 -0
  503. package/teste-final-npm/core/plugins/built-in/static/index.ts +289 -0
  504. package/teste-final-npm/core/plugins/built-in/swagger/index.ts +229 -0
  505. package/teste-final-npm/core/plugins/built-in/vite/index.ts +316 -0
  506. package/teste-final-npm/core/plugins/config.ts +348 -0
  507. package/teste-final-npm/core/plugins/discovery.ts +350 -0
  508. package/teste-final-npm/core/plugins/executor.ts +351 -0
  509. package/teste-final-npm/core/plugins/index.ts +195 -0
  510. package/teste-final-npm/core/plugins/manager.ts +583 -0
  511. package/teste-final-npm/core/plugins/registry.ts +424 -0
  512. package/teste-final-npm/core/plugins/types.ts +254 -0
  513. package/teste-final-npm/core/server/framework.ts +123 -0
  514. package/teste-final-npm/core/server/index.ts +8 -0
  515. package/teste-final-npm/core/server/plugins/database.ts +182 -0
  516. package/teste-final-npm/core/server/plugins/logger.ts +47 -0
  517. package/teste-final-npm/core/server/plugins/swagger.ts +34 -0
  518. package/teste-final-npm/core/server/standalone.ts +91 -0
  519. package/teste-final-npm/core/templates/create-project.ts +455 -0
  520. package/teste-final-npm/core/types/api.ts +169 -0
  521. package/teste-final-npm/core/types/build.ts +174 -0
  522. package/teste-final-npm/core/types/config.ts +68 -0
  523. package/teste-final-npm/core/types/index.ts +127 -0
  524. package/teste-final-npm/core/types/plugin.ts +94 -0
  525. package/teste-final-npm/core/utils/__tests__/errors.test.ts +139 -0
  526. package/teste-final-npm/core/utils/__tests__/helpers.test.ts +297 -0
  527. package/teste-final-npm/core/utils/__tests__/logger.test.ts +141 -0
  528. package/teste-final-npm/core/utils/env-runtime-v2.ts +232 -0
  529. package/teste-final-npm/core/utils/env-runtime.ts +252 -0
  530. package/teste-final-npm/core/utils/errors/codes.ts +115 -0
  531. package/teste-final-npm/core/utils/errors/handlers.ts +63 -0
  532. package/teste-final-npm/core/utils/errors/index.ts +81 -0
  533. package/teste-final-npm/core/utils/helpers.ts +180 -0
  534. package/teste-final-npm/core/utils/index.ts +18 -0
  535. package/teste-final-npm/core/utils/logger/index.ts +161 -0
  536. package/teste-final-npm/core/utils/logger.ts +106 -0
  537. package/teste-final-npm/core/utils/monitoring/index.ts +212 -0
  538. package/teste-final-npm/package-template.json +51 -0
  539. package/teste-final-npm/package.json +51 -0
  540. package/teste-final-npm/tsconfig.json +51 -0
  541. package/teste-final-npm/vite.config.ts +42 -0
  542. package/tests/__mocks__/api.ts +56 -0
  543. package/tests/fixtures/users.ts +69 -0
  544. package/tests/integration/api/users.routes.test.ts +221 -0
  545. package/tests/setup.ts +29 -0
  546. package/tests/unit/app/client/App-simple.test.tsx +56 -0
  547. package/tests/unit/app/client/App.test.tsx.skip +237 -0
  548. package/tests/unit/app/client/eden-api.test.ts +186 -0
  549. package/tests/unit/app/client/simple.test.tsx +23 -0
  550. package/tests/unit/app/controllers/users.controller.test.ts +150 -0
  551. package/tests/unit/core/create-project.test.ts.skip +95 -0
  552. package/tests/unit/core/framework.test.ts +144 -0
  553. package/tests/unit/core/plugins/logger.test.ts.skip +268 -0
  554. package/tests/unit/core/plugins/vite.test.ts.disabled +188 -0
  555. package/tests/utils/test-helpers.ts +61 -0
  556. package/tsconfig.json +51 -0
  557. package/types/global.d.ts +30 -0
  558. package/types/vitest.d.ts +9 -0
  559. package/vite.config.ts +42 -0
  560. package/vitest.config.ts +50 -0
  561. package/workspace.json +6 -0
@@ -0,0 +1,626 @@
1
+ # 💡 Exemplo CRUD Completo - FluxStack + Eden Treaty
2
+
3
+ > **Exemplo prático**: CRUD de usuários com type safety automática end-to-end
4
+
5
+ ## 🎯 **Visão Geral do Exemplo**
6
+
7
+ Este exemplo mostra como implementar um CRUD completo no FluxStack, demonstrando:
8
+ - **Types compartilhados** entre client e server
9
+ - **Controllers** com lógica de negócio
10
+ - **Routes** com response schemas
11
+ - **Frontend React** com Eden Treaty nativo
12
+ - **Error handling** elegante
13
+ - **Type safety** automática
14
+
15
+ ## 📁 **Estrutura do Exemplo**
16
+
17
+ ```
18
+ app/
19
+ ├── shared/types/index.ts # Types compartilhados
20
+ ├── server/
21
+ │ ├── controllers/users.controller.ts # Lógica de negócio
22
+ │ └── routes/users.routes.ts # Endpoints da API
23
+ └── client/src/
24
+ ├── lib/eden-api.ts # Cliente Eden Treaty
25
+ ├── components/UserList.tsx # Lista de usuários
26
+ └── hooks/useUsers.ts # Hook personalizado
27
+ ```
28
+
29
+ ## 🔧 **Implementação Passo a Passo**
30
+
31
+ ### **1. Types Compartilhados (app/shared/types/index.ts)**
32
+ ```typescript
33
+ // Entidades principais
34
+ export interface User {
35
+ id: number
36
+ name: string
37
+ email: string
38
+ createdAt: Date
39
+ }
40
+
41
+ // Request types
42
+ export interface CreateUserRequest {
43
+ name: string
44
+ email: string
45
+ }
46
+
47
+ export interface UpdateUserRequest {
48
+ name?: string
49
+ email?: string
50
+ }
51
+
52
+ // Response types
53
+ export interface UserResponse {
54
+ success: boolean
55
+ user?: User
56
+ message?: string
57
+ }
58
+
59
+ export interface UsersListResponse {
60
+ users: User[]
61
+ }
62
+
63
+ // Error types
64
+ export interface APIError {
65
+ message: string
66
+ status: number
67
+ code?: string
68
+ details?: any
69
+ }
70
+ ```
71
+
72
+ ### **2. Controller (app/server/controllers/users.controller.ts)**
73
+ ```typescript
74
+ import type { User, CreateUserRequest, UpdateUserRequest, UserResponse } from '@/shared/types'
75
+
76
+ // Simulando database em memória
77
+ let users: User[] = [
78
+ { id: 1, name: "João Silva", email: "joao@example.com", createdAt: new Date() },
79
+ { id: 2, name: "Maria Santos", email: "maria@example.com", createdAt: new Date() }
80
+ ]
81
+
82
+ export class UsersController {
83
+ // GET /users - Listar todos
84
+ static async getUsers() {
85
+ return { users }
86
+ }
87
+
88
+ // GET /users/:id - Buscar por ID
89
+ static async getUserById(id: number) {
90
+ const user = users.find(u => u.id === id)
91
+ return user ? { user } : null
92
+ }
93
+
94
+ // POST /users - Criar novo
95
+ static async createUser(userData: CreateUserRequest): Promise<UserResponse> {
96
+ // Validação de email único
97
+ const existingUser = users.find(u => u.email === userData.email)
98
+
99
+ if (existingUser) {
100
+ return {
101
+ success: false,
102
+ message: "Email já está em uso"
103
+ }
104
+ }
105
+
106
+ // Criar novo usuário
107
+ const newUser: User = {
108
+ id: Date.now(), // Simples ID generator
109
+ name: userData.name,
110
+ email: userData.email,
111
+ createdAt: new Date()
112
+ }
113
+
114
+ users.push(newUser)
115
+
116
+ return {
117
+ success: true,
118
+ user: newUser,
119
+ message: "Usuário criado com sucesso"
120
+ }
121
+ }
122
+
123
+ // PUT /users/:id - Atualizar
124
+ static async updateUser(id: number, userData: UpdateUserRequest): Promise<UserResponse> {
125
+ const userIndex = users.findIndex(u => u.id === id)
126
+
127
+ if (userIndex === -1) {
128
+ return {
129
+ success: false,
130
+ message: "Usuário não encontrado"
131
+ }
132
+ }
133
+
134
+ // Verificar email único (se alterando)
135
+ if (userData.email) {
136
+ const existingUser = users.find(u => u.email === userData.email && u.id !== id)
137
+ if (existingUser) {
138
+ return {
139
+ success: false,
140
+ message: "Email já está em uso"
141
+ }
142
+ }
143
+ }
144
+
145
+ // Atualizar usuário
146
+ users[userIndex] = {
147
+ ...users[userIndex],
148
+ ...userData
149
+ }
150
+
151
+ return {
152
+ success: true,
153
+ user: users[userIndex],
154
+ message: "Usuário atualizado com sucesso"
155
+ }
156
+ }
157
+
158
+ // DELETE /users/:id - Deletar
159
+ static async deleteUser(id: number): Promise<UserResponse> {
160
+ const userIndex = users.findIndex(u => u.id === id)
161
+
162
+ if (userIndex === -1) {
163
+ return {
164
+ success: false,
165
+ message: "Usuário não encontrado"
166
+ }
167
+ }
168
+
169
+ const deletedUser = users.splice(userIndex, 1)[0]
170
+
171
+ return {
172
+ success: true,
173
+ user: deletedUser,
174
+ message: "Usuário deletado com sucesso"
175
+ }
176
+ }
177
+
178
+ // Utility para reset (testing)
179
+ static resetUsers() {
180
+ users.splice(0, users.length)
181
+ users.push(
182
+ { id: 1, name: "João Silva", email: "joao@example.com", createdAt: new Date() },
183
+ { id: 2, name: "Maria Santos", email: "maria@example.com", createdAt: new Date() }
184
+ )
185
+ }
186
+ }
187
+ ```
188
+
189
+ ### **3. Routes com Response Schemas (app/server/routes/users.routes.ts)**
190
+ ```typescript
191
+ import { Elysia, t } from "elysia"
192
+ import { UsersController } from "../controllers/users.controller"
193
+
194
+ // Schemas TypeBox para validação e documentação
195
+ const UserSchema = t.Object({
196
+ id: t.Number(),
197
+ name: t.String(),
198
+ email: t.String(),
199
+ createdAt: t.Date()
200
+ })
201
+
202
+ const UserResponseSchema = t.Object({
203
+ success: t.Boolean(),
204
+ user: t.Optional(UserSchema),
205
+ message: t.Optional(t.String())
206
+ })
207
+
208
+ export const usersRoutes = new Elysia({ prefix: "/users" })
209
+
210
+ // GET /users - Listar todos
211
+ .get("/", () => UsersController.getUsers(), {
212
+ response: t.Object({
213
+ users: t.Array(UserSchema)
214
+ }),
215
+ detail: {
216
+ tags: ['Users'],
217
+ summary: 'List Users',
218
+ description: 'Retrieve a list of all users in the system'
219
+ }
220
+ })
221
+
222
+ // GET /users/:id - Buscar por ID
223
+ .get("/:id", async ({ params: { id }, set }) => {
224
+ const userId = parseInt(id)
225
+ const result = await UsersController.getUserById(userId)
226
+
227
+ if (!result) {
228
+ set.status = 404
229
+ return { error: "Usuário não encontrado" }
230
+ }
231
+
232
+ return result
233
+ }, {
234
+ params: t.Object({
235
+ id: t.String()
236
+ }),
237
+ response: t.Object({
238
+ user: UserSchema
239
+ }),
240
+ detail: {
241
+ tags: ['Users'],
242
+ summary: 'Get User by ID',
243
+ description: 'Retrieve a specific user by their ID'
244
+ }
245
+ })
246
+
247
+ // POST /users - Criar novo
248
+ .post("/", async ({ body, set }) => {
249
+ try {
250
+ return await UsersController.createUser(body)
251
+ } catch (error) {
252
+ set.status = 400
253
+ return {
254
+ success: false,
255
+ error: "Dados inválidos",
256
+ details: error instanceof Error ? error.message : 'Unknown error'
257
+ }
258
+ }
259
+ }, {
260
+ body: t.Object({
261
+ name: t.String({ minLength: 2 }),
262
+ email: t.String({ format: "email" })
263
+ }),
264
+ response: UserResponseSchema,
265
+ detail: {
266
+ tags: ['Users'],
267
+ summary: 'Create User',
268
+ description: 'Create a new user with name and email'
269
+ }
270
+ })
271
+
272
+ // PUT /users/:id - Atualizar
273
+ .put("/:id", async ({ params: { id }, body, set }) => {
274
+ try {
275
+ const userId = parseInt(id)
276
+ return await UsersController.updateUser(userId, body)
277
+ } catch (error) {
278
+ set.status = 400
279
+ return {
280
+ success: false,
281
+ error: "Dados inválidos",
282
+ details: error instanceof Error ? error.message : 'Unknown error'
283
+ }
284
+ }
285
+ }, {
286
+ params: t.Object({
287
+ id: t.String()
288
+ }),
289
+ body: t.Object({
290
+ name: t.Optional(t.String({ minLength: 2 })),
291
+ email: t.Optional(t.String({ format: "email" }))
292
+ }),
293
+ response: UserResponseSchema,
294
+ detail: {
295
+ tags: ['Users'],
296
+ summary: 'Update User',
297
+ description: 'Update an existing user'
298
+ }
299
+ })
300
+
301
+ // DELETE /users/:id - Deletar
302
+ .delete("/:id", async ({ params: { id } }) => {
303
+ const userId = parseInt(id)
304
+ return UsersController.deleteUser(userId)
305
+ }, {
306
+ params: t.Object({
307
+ id: t.String()
308
+ }),
309
+ response: UserResponseSchema,
310
+ detail: {
311
+ tags: ['Users'],
312
+ summary: 'Delete User',
313
+ description: 'Delete a user by their ID'
314
+ }
315
+ })
316
+ ```
317
+
318
+ ### **4. Hook Personalizado (app/client/src/hooks/useUsers.ts)**
319
+ ```typescript
320
+ import { useState, useEffect } from 'react'
321
+ import { api } from '../lib/eden-api'
322
+ import type { User, CreateUserRequest, UpdateUserRequest } from '@/shared/types'
323
+
324
+ export function useUsers() {
325
+ const [users, setUsers] = useState<User[]>([])
326
+ const [loading, setLoading] = useState(false)
327
+ const [error, setError] = useState<string | null>(null)
328
+
329
+ // Carregar usuários
330
+ const loadUsers = async () => {
331
+ setLoading(true)
332
+ setError(null)
333
+
334
+ try {
335
+ const { data, error } = await api.users.get()
336
+
337
+ if (error) {
338
+ setError(`Erro ao carregar usuários: ${error.status}`)
339
+ return
340
+ }
341
+
342
+ // ✨ Eden Treaty infere: data = { users: User[] }
343
+ setUsers(data.users)
344
+ } catch (err) {
345
+ setError('Erro de rede ao carregar usuários')
346
+ } finally {
347
+ setLoading(false)
348
+ }
349
+ }
350
+
351
+ // Criar usuário
352
+ const createUser = async (userData: CreateUserRequest): Promise<boolean> => {
353
+ try {
354
+ const { data, error } = await api.users.post(userData)
355
+
356
+ if (error) {
357
+ setError(`Erro ao criar usuário: ${error.status}`)
358
+ return false
359
+ }
360
+
361
+ // ✨ Eden Treaty infere: data = UserResponse
362
+ if (data.success && data.user) {
363
+ setUsers(prev => [...prev, data.user!])
364
+ return true
365
+ } else {
366
+ setError(data.message || 'Erro ao criar usuário')
367
+ return false
368
+ }
369
+ } catch (err) {
370
+ setError('Erro de rede ao criar usuário')
371
+ return false
372
+ }
373
+ }
374
+
375
+ // Atualizar usuário
376
+ const updateUser = async (id: number, userData: UpdateUserRequest): Promise<boolean> => {
377
+ try {
378
+ const { data, error } = await api.users({ id }).put(userData)
379
+
380
+ if (error) {
381
+ setError(`Erro ao atualizar usuário: ${error.status}`)
382
+ return false
383
+ }
384
+
385
+ // ✨ Eden Treaty infere tipos automaticamente
386
+ if (data.success && data.user) {
387
+ setUsers(prev => prev.map(u => u.id === id ? data.user! : u))
388
+ return true
389
+ } else {
390
+ setError(data.message || 'Erro ao atualizar usuário')
391
+ return false
392
+ }
393
+ } catch (err) {
394
+ setError('Erro de rede ao atualizar usuário')
395
+ return false
396
+ }
397
+ }
398
+
399
+ // Deletar usuário
400
+ const deleteUser = async (id: number): Promise<boolean> => {
401
+ try {
402
+ const { data, error } = await api.users({ id }).delete()
403
+
404
+ if (error) {
405
+ setError(`Erro ao deletar usuário: ${error.status}`)
406
+ return false
407
+ }
408
+
409
+ // ✨ Type safety automática
410
+ if (data.success) {
411
+ setUsers(prev => prev.filter(u => u.id !== id))
412
+ return true
413
+ } else {
414
+ setError(data.message || 'Erro ao deletar usuário')
415
+ return false
416
+ }
417
+ } catch (err) {
418
+ setError('Erro de rede ao deletar usuário')
419
+ return false
420
+ }
421
+ }
422
+
423
+ // Carregar na inicialização
424
+ useEffect(() => {
425
+ loadUsers()
426
+ }, [])
427
+
428
+ return {
429
+ users,
430
+ loading,
431
+ error,
432
+ loadUsers,
433
+ createUser,
434
+ updateUser,
435
+ deleteUser,
436
+ clearError: () => setError(null)
437
+ }
438
+ }
439
+ ```
440
+
441
+ ### **5. Componente React (app/client/src/components/UserList.tsx)**
442
+ ```typescript
443
+ import React, { useState } from 'react'
444
+ import { useUsers } from '../hooks/useUsers'
445
+ import type { CreateUserRequest } from '@/shared/types'
446
+
447
+ export function UserList() {
448
+ const { users, loading, error, createUser, updateUser, deleteUser, clearError } = useUsers()
449
+ const [showForm, setShowForm] = useState(false)
450
+ const [formData, setFormData] = useState<CreateUserRequest>({ name: '', email: '' })
451
+ const [editingId, setEditingId] = useState<number | null>(null)
452
+
453
+ const handleSubmit = async (e: React.FormEvent) => {
454
+ e.preventDefault()
455
+
456
+ if (!formData.name.trim() || !formData.email.trim()) return
457
+
458
+ const success = editingId
459
+ ? await updateUser(editingId, formData)
460
+ : await createUser(formData)
461
+
462
+ if (success) {
463
+ setFormData({ name: '', email: '' })
464
+ setShowForm(false)
465
+ setEditingId(null)
466
+ }
467
+ }
468
+
469
+ const handleEdit = (user: User) => {
470
+ setFormData({ name: user.name, email: user.email })
471
+ setEditingId(user.id)
472
+ setShowForm(true)
473
+ }
474
+
475
+ const handleDelete = async (user: User) => {
476
+ if (confirm(`Tem certeza que deseja deletar ${user.name}?`)) {
477
+ await deleteUser(user.id)
478
+ }
479
+ }
480
+
481
+ return (
482
+ <div className="user-list">
483
+ <h2>Usuários</h2>
484
+
485
+ {error && (
486
+ <div className="error">
487
+ {error}
488
+ <button onClick={clearError}>✕</button>
489
+ </div>
490
+ )}
491
+
492
+ <button
493
+ onClick={() => setShowForm(!showForm)}
494
+ className="btn-primary"
495
+ >
496
+ {showForm ? 'Cancelar' : 'Novo Usuário'}
497
+ </button>
498
+
499
+ {showForm && (
500
+ <form onSubmit={handleSubmit} className="user-form">
501
+ <input
502
+ type="text"
503
+ placeholder="Nome"
504
+ value={formData.name}
505
+ onChange={(e) => setFormData(prev => ({ ...prev, name: e.target.value }))}
506
+ required
507
+ />
508
+ <input
509
+ type="email"
510
+ placeholder="Email"
511
+ value={formData.email}
512
+ onChange={(e) => setFormData(prev => ({ ...prev, email: e.target.value }))}
513
+ required
514
+ />
515
+ <button type="submit" disabled={loading}>
516
+ {editingId ? 'Atualizar' : 'Criar'}
517
+ </button>
518
+ </form>
519
+ )}
520
+
521
+ {loading && <div className="loading">Carregando...</div>}
522
+
523
+ <div className="users-grid">
524
+ {users.map(user => (
525
+ <div key={user.id} className="user-card">
526
+ <h3>{user.name}</h3>
527
+ <p>{user.email}</p>
528
+ <small>Criado em: {new Date(user.createdAt).toLocaleDateString()}</small>
529
+ <div className="user-actions">
530
+ <button onClick={() => handleEdit(user)}>Editar</button>
531
+ <button onClick={() => handleDelete(user)}>Deletar</button>
532
+ </div>
533
+ </div>
534
+ ))}
535
+ </div>
536
+ </div>
537
+ )
538
+ }
539
+ ```
540
+
541
+ ## 🧪 **Teste do CRUD**
542
+
543
+ ### **Teste Simples**
544
+ ```bash
545
+ # 1. Iniciar servidor
546
+ bun run dev
547
+
548
+ # 2. Testar APIs
549
+ curl http://localhost:3000/api/users
550
+ curl -X POST http://localhost:3000/api/users \
551
+ -H "Content-Type: application/json" \
552
+ -d '{"name":"Test User","email":"test@example.com"}'
553
+
554
+ # 3. Frontend
555
+ # Acessar http://localhost:5173
556
+ ```
557
+
558
+ ### **Teste com Vitest**
559
+ ```typescript
560
+ // tests/users-crud.test.ts
561
+ import { describe, it, expect, beforeEach } from 'vitest'
562
+ import { api } from '@/client/lib/eden-api'
563
+
564
+ describe('Users CRUD', () => {
565
+ beforeEach(async () => {
566
+ // Reset para estado inicial
567
+ await api.users.reset.post()
568
+ })
569
+
570
+ it('should create, read, update, delete user', async () => {
571
+ // CREATE
572
+ const { data: createResult, error: createError } = await api.users.post({
573
+ name: "João Test",
574
+ email: "joao@test.com"
575
+ })
576
+
577
+ expect(createError).toBeUndefined()
578
+ expect(createResult.success).toBe(true)
579
+ expect(createResult.user).toBeDefined()
580
+
581
+ const userId = createResult.user!.id
582
+
583
+ // READ
584
+ const { data: getResult, error: getError } = await api.users({ id: userId }).get()
585
+ expect(getError).toBeUndefined()
586
+ expect(getResult.user.name).toBe("João Test")
587
+
588
+ // UPDATE
589
+ const { data: updateResult, error: updateError } = await api.users({ id: userId }).put({
590
+ name: "João Updated"
591
+ })
592
+ expect(updateError).toBeUndefined()
593
+ expect(updateResult.success).toBe(true)
594
+ expect(updateResult.user!.name).toBe("João Updated")
595
+
596
+ // DELETE
597
+ const { data: deleteResult, error: deleteError } = await api.users({ id: userId }).delete()
598
+ expect(deleteError).toBeUndefined()
599
+ expect(deleteResult.success).toBe(true)
600
+ })
601
+ })
602
+ ```
603
+
604
+ ## 🎯 **Pontos-Chave do Exemplo**
605
+
606
+ ### **✅ Type Safety Automática**
607
+ - Types definidos uma vez em `shared/`
608
+ - Eden Treaty infere automaticamente
609
+ - Zero declarações manuais de tipos
610
+ - Autocomplete perfeito no editor
611
+
612
+ ### **✅ Arquitetura Limpa**
613
+ - Separação clara: types → controller → routes → client
614
+ - Hook personalizado encapsula lógica
615
+ - Componente focado apenas na UI
616
+ - Error handling consistente
617
+
618
+ ### **✅ Eden Treaty Nativo**
619
+ - Sem wrappers que quebram tipos
620
+ - Padrão `{ data, error }` consistente
621
+ - Response schemas para documentação
622
+ - Type inference funcionando 100%
623
+
624
+ ---
625
+
626
+ **🎯 Este exemplo mostra como aproveitar ao máximo o FluxStack: type safety automática, arquitetura limpa e desenvolvimento produtivo!**