@semacode/cli 1.5.36 → 1.5.38

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 (490) hide show
  1. package/AGENT_CONTEXT_PACK.json +80 -8
  2. package/LICENSE +1 -2
  3. package/SEMA_BRIEF.curto.txt +9 -6
  4. package/SEMA_BRIEF.md +240 -204
  5. package/SEMA_BRIEF.micro.txt +10 -6
  6. package/SEMA_INDEX.json +2087 -1907
  7. package/dist/agentContext.d.ts +19 -0
  8. package/dist/agentContext.js +26 -0
  9. package/dist/agentContext.js.map +1 -0
  10. package/dist/agentContextPack.d.ts +4 -0
  11. package/dist/agentContextPack.js +408 -0
  12. package/dist/agentContextPack.js.map +1 -0
  13. package/dist/agentContextTipos.d.ts +96 -0
  14. package/dist/agentContextTipos.js +55 -0
  15. package/dist/agentContextTipos.js.map +1 -0
  16. package/dist/agentEntryPoints.d.ts +13 -0
  17. package/dist/agentEntryPoints.js +435 -0
  18. package/dist/agentEntryPoints.js.map +1 -0
  19. package/dist/authorAnalise.d.ts +15 -0
  20. package/dist/authorAnalise.js +210 -0
  21. package/dist/authorAnalise.js.map +1 -0
  22. package/dist/authorPoliticas.d.ts +37 -0
  23. package/dist/authorPoliticas.js +340 -0
  24. package/dist/authorPoliticas.js.map +1 -0
  25. package/dist/billing/index.d.ts +1 -1
  26. package/dist/billing/index.js +6 -2
  27. package/dist/billing/index.js.map +1 -1
  28. package/dist/bridge.js +2 -0
  29. package/dist/bridge.js.map +1 -1
  30. package/dist/carregarModulos.d.ts +2 -0
  31. package/dist/carregarModulos.js +9 -0
  32. package/dist/carregarModulos.js.map +1 -0
  33. package/dist/cliArgs.d.ts +6 -0
  34. package/dist/cliArgs.js +70 -0
  35. package/dist/cliArgs.js.map +1 -0
  36. package/dist/contexto.js +2 -0
  37. package/dist/contexto.js.map +1 -1
  38. package/dist/controleComercialSupabase.js.map +1 -1
  39. package/dist/controleComercialSupabaseAdmin.js.map +1 -1
  40. package/dist/controleComercialSupabaseCadastro.js.map +1 -1
  41. package/dist/controleComercialSupabaseConsumo.js.map +1 -1
  42. package/dist/controleComercialSupabaseConta.js.map +1 -1
  43. package/dist/controleComercialSupabaseProfiles.js.map +1 -1
  44. package/dist/dev/index.js +2 -0
  45. package/dist/dev/index.js.map +1 -1
  46. package/dist/dev/watcher.d.ts +1 -0
  47. package/dist/dev/watcher.js +4 -0
  48. package/dist/dev/watcher.js.map +1 -0
  49. package/dist/docs/resolver.d.ts +1 -0
  50. package/dist/docs/resolver.js +4 -0
  51. package/dist/docs/resolver.js.map +1 -0
  52. package/dist/docs.d.ts +2 -56
  53. package/dist/docs.js +5 -502
  54. package/dist/docs.js.map +1 -1
  55. package/dist/docs.part01.d.ts +78 -0
  56. package/dist/docs.part01.js +347 -0
  57. package/dist/docs.part01.js.map +1 -0
  58. package/dist/docs.part02.d.ts +20 -0
  59. package/dist/docs.part02.js +181 -0
  60. package/dist/docs.part02.js.map +1 -0
  61. package/dist/doctorCommand.d.ts +27 -0
  62. package/dist/doctorCommand.js +160 -0
  63. package/dist/doctorCommand.js.map +1 -0
  64. package/dist/drift.contrato.d.ts +23 -0
  65. package/dist/drift.contrato.js +33 -0
  66. package/dist/drift.contrato.js.map +1 -0
  67. package/dist/drift.d.ts +13 -227
  68. package/dist/drift.js +16 -3924
  69. package/dist/drift.js.map +1 -1
  70. package/dist/drift.part01.d.ts +252 -0
  71. package/dist/drift.part01.js +183 -0
  72. package/dist/drift.part01.js.map +1 -0
  73. package/dist/drift.part02.d.ts +30 -0
  74. package/dist/drift.part02.js +342 -0
  75. package/dist/drift.part02.js.map +1 -0
  76. package/dist/drift.part03.d.ts +26 -0
  77. package/dist/drift.part03.js +343 -0
  78. package/dist/drift.part03.js.map +1 -0
  79. package/dist/drift.part04.d.ts +46 -0
  80. package/dist/drift.part04.js +354 -0
  81. package/dist/drift.part04.js.map +1 -0
  82. package/dist/drift.part05.d.ts +47 -0
  83. package/dist/drift.part05.js +353 -0
  84. package/dist/drift.part05.js.map +1 -0
  85. package/dist/drift.part06.d.ts +17 -0
  86. package/dist/drift.part06.js +381 -0
  87. package/dist/drift.part06.js.map +1 -0
  88. package/dist/drift.part07.d.ts +48 -0
  89. package/dist/drift.part07.js +377 -0
  90. package/dist/drift.part07.js.map +1 -0
  91. package/dist/drift.part08.d.ts +26 -0
  92. package/dist/drift.part08.js +333 -0
  93. package/dist/drift.part08.js.map +1 -0
  94. package/dist/drift.part09.d.ts +22 -0
  95. package/dist/drift.part09.js +322 -0
  96. package/dist/drift.part09.js.map +1 -0
  97. package/dist/drift.part10.d.ts +11 -0
  98. package/dist/drift.part10.js +116 -0
  99. package/dist/drift.part10.js.map +1 -0
  100. package/dist/drift.part11.d.ts +3 -0
  101. package/dist/drift.part11.js +320 -0
  102. package/dist/drift.part11.js.map +1 -0
  103. package/dist/drift.part12.d.ts +17 -0
  104. package/dist/drift.part12.js +289 -0
  105. package/dist/drift.part12.js.map +1 -0
  106. package/dist/drift.part13.d.ts +17 -0
  107. package/dist/drift.part13.js +86 -0
  108. package/dist/drift.part13.js.map +1 -0
  109. package/dist/drift.part14.d.ts +44 -0
  110. package/dist/drift.part14.js +402 -0
  111. package/dist/drift.part14.js.map +1 -0
  112. package/dist/driftOrcamento.d.ts +69 -0
  113. package/dist/driftOrcamento.js +280 -0
  114. package/dist/driftOrcamento.js.map +1 -0
  115. package/dist/execucoesExternas.d.ts +10 -0
  116. package/dist/execucoesExternas.js +51 -0
  117. package/dist/execucoesExternas.js.map +1 -0
  118. package/dist/exemplosOficiais.d.ts +10 -0
  119. package/dist/exemplosOficiais.js +63 -0
  120. package/dist/exemplosOficiais.js.map +1 -0
  121. package/dist/fsGovernado.d.ts +10 -0
  122. package/dist/fsGovernado.js +50 -0
  123. package/dist/fsGovernado.js.map +1 -0
  124. package/dist/geracaoCore.d.ts +64 -0
  125. package/dist/geracaoCore.js +381 -0
  126. package/dist/geracaoCore.js.map +1 -0
  127. package/dist/iaPrompts.d.ts +6 -0
  128. package/dist/iaPrompts.js +318 -0
  129. package/dist/iaPrompts.js.map +1 -0
  130. package/dist/importador.d.ts +9 -31
  131. package/dist/importador.js +11 -2938
  132. package/dist/importador.js.map +1 -1
  133. package/dist/importador.part01.d.ts +150 -0
  134. package/dist/importador.part01.js +256 -0
  135. package/dist/importador.part01.js.map +1 -0
  136. package/dist/importador.part02.d.ts +25 -0
  137. package/dist/importador.part02.js +359 -0
  138. package/dist/importador.part02.js.map +1 -0
  139. package/dist/importador.part03.d.ts +53 -0
  140. package/dist/importador.part03.js +366 -0
  141. package/dist/importador.part03.js.map +1 -0
  142. package/dist/importador.part04.d.ts +26 -0
  143. package/dist/importador.part04.js +374 -0
  144. package/dist/importador.part04.js.map +1 -0
  145. package/dist/importador.part05.d.ts +28 -0
  146. package/dist/importador.part05.js +340 -0
  147. package/dist/importador.part05.js.map +1 -0
  148. package/dist/importador.part06.d.ts +8 -0
  149. package/dist/importador.part06.js +327 -0
  150. package/dist/importador.part06.js.map +1 -0
  151. package/dist/importador.part07.d.ts +23 -0
  152. package/dist/importador.part07.js +300 -0
  153. package/dist/importador.part07.js.map +1 -0
  154. package/dist/importador.part08.d.ts +12 -0
  155. package/dist/importador.part08.js +378 -0
  156. package/dist/importador.part08.js.map +1 -0
  157. package/dist/importador.part09.d.ts +16 -0
  158. package/dist/importador.part09.js +319 -0
  159. package/dist/importador.part09.js.map +1 -0
  160. package/dist/index.d.ts +12 -1
  161. package/dist/index.js +16 -7945
  162. package/dist/index.js.map +1 -1
  163. package/dist/index.part01.d.ts +148 -0
  164. package/dist/index.part01.js +252 -0
  165. package/dist/index.part01.js.map +1 -0
  166. package/dist/index.part02.d.ts +17 -0
  167. package/dist/index.part02.js +344 -0
  168. package/dist/index.part02.js.map +1 -0
  169. package/dist/index.part03.d.ts +59 -0
  170. package/dist/index.part03.js +352 -0
  171. package/dist/index.part03.js.map +1 -0
  172. package/dist/index.part04.d.ts +20 -0
  173. package/dist/index.part04.js +360 -0
  174. package/dist/index.part04.js.map +1 -0
  175. package/dist/index.part05.d.ts +10 -0
  176. package/dist/index.part05.js +370 -0
  177. package/dist/index.part05.js.map +1 -0
  178. package/dist/index.part06.d.ts +14 -0
  179. package/dist/index.part06.js +336 -0
  180. package/dist/index.part06.js.map +1 -0
  181. package/dist/index.part07.d.ts +9 -0
  182. package/dist/index.part07.js +287 -0
  183. package/dist/index.part07.js.map +1 -0
  184. package/dist/index.part08.d.ts +1 -0
  185. package/dist/index.part08.js +206 -0
  186. package/dist/index.part08.js.map +1 -0
  187. package/dist/init/index.js +2 -0
  188. package/dist/init/index.js.map +1 -1
  189. package/dist/init/templates.d.ts +2 -11
  190. package/dist/init/templates.js +4 -659
  191. package/dist/init/templates.js.map +1 -1
  192. package/dist/init/templates.part01.d.ts +11 -0
  193. package/dist/init/templates.part01.js +399 -0
  194. package/dist/init/templates.part01.js.map +1 -0
  195. package/dist/init/templates.part02.d.ts +8 -0
  196. package/dist/init/templates.part02.js +265 -0
  197. package/dist/init/templates.part02.js.map +1 -0
  198. package/dist/initCommand.d.ts +3 -0
  199. package/dist/initCommand.js +41 -0
  200. package/dist/initCommand.js.map +1 -0
  201. package/dist/initTemplatesBackend.d.ts +2 -0
  202. package/dist/initTemplatesBackend.js +127 -0
  203. package/dist/initTemplatesBackend.js.map +1 -0
  204. package/dist/initTemplatesBase.d.ts +9 -0
  205. package/dist/initTemplatesBase.js +79 -0
  206. package/dist/initTemplatesBase.js.map +1 -0
  207. package/dist/initTemplatesFlutter.d.ts +2 -0
  208. package/dist/initTemplatesFlutter.js +185 -0
  209. package/dist/initTemplatesFlutter.js.map +1 -0
  210. package/dist/initTemplatesRuntime.d.ts +2 -0
  211. package/dist/initTemplatesRuntime.js +494 -0
  212. package/dist/initTemplatesRuntime.js.map +1 -0
  213. package/dist/initTemplatesWeb.d.ts +2 -0
  214. package/dist/initTemplatesWeb.js +429 -0
  215. package/dist/initTemplatesWeb.js.map +1 -0
  216. package/dist/mcpInstalarChaveCommand.d.ts +1 -0
  217. package/dist/mcpInstalarChaveCommand.js +141 -0
  218. package/dist/mcpInstalarChaveCommand.js.map +1 -0
  219. package/dist/mcpRemoto.js.map +1 -1
  220. package/dist/mcp_chave.d.ts +1 -0
  221. package/dist/mcp_chave.js +4 -0
  222. package/dist/mcp_chave.js.map +1 -0
  223. package/dist/profileArtefatoBase.d.ts +30 -0
  224. package/dist/profileArtefatoBase.js +129 -0
  225. package/dist/profileArtefatoBase.js.map +1 -0
  226. package/dist/profileArtefatoValidadores.d.ts +9 -0
  227. package/dist/profileArtefatoValidadores.js +287 -0
  228. package/dist/profileArtefatoValidadores.js.map +1 -0
  229. package/dist/profileAuthorCommand.d.ts +6 -0
  230. package/dist/profileAuthorCommand.js +442 -0
  231. package/dist/profileAuthorCommand.js.map +1 -0
  232. package/dist/profileAuthorTipos.d.ts +225 -0
  233. package/dist/profileAuthorTipos.js +6 -0
  234. package/dist/profileAuthorTipos.js.map +1 -0
  235. package/dist/profileCatalogo.d.ts +8 -0
  236. package/dist/profileCatalogo.js +235 -0
  237. package/dist/profileCatalogo.js.map +1 -0
  238. package/dist/profileCommand.d.ts +33 -0
  239. package/dist/profileCommand.js +256 -0
  240. package/dist/profileCommand.js.map +1 -0
  241. package/dist/profileOrquestracao.d.ts +33 -0
  242. package/dist/profileOrquestracao.js +53 -0
  243. package/dist/profileOrquestracao.js.map +1 -0
  244. package/dist/profileRegras.d.ts +19 -0
  245. package/dist/profileRegras.js +219 -0
  246. package/dist/profileRegras.js.map +1 -0
  247. package/dist/profileRulePacks.d.ts +3 -0
  248. package/dist/profileRulePacks.js +334 -0
  249. package/dist/profileRulePacks.js.map +1 -0
  250. package/dist/profiles/validate.d.ts +1 -0
  251. package/dist/profiles/validate.js +4 -0
  252. package/dist/profiles/validate.js.map +1 -0
  253. package/dist/projeto.d.ts +4 -53
  254. package/dist/projeto.js +5 -649
  255. package/dist/projeto.js.map +1 -1
  256. package/dist/projetoBusca.d.ts +7 -0
  257. package/dist/projetoBusca.js +142 -0
  258. package/dist/projetoBusca.js.map +1 -0
  259. package/dist/projetoCarregar.d.ts +2 -0
  260. package/dist/projetoCarregar.js +50 -0
  261. package/dist/projetoCarregar.js.map +1 -0
  262. package/dist/projetoConfig.d.ts +10 -0
  263. package/dist/projetoConfig.js +89 -0
  264. package/dist/projetoConfig.js.map +1 -0
  265. package/dist/projetoLegado.d.ts +3 -0
  266. package/dist/projetoLegado.js +175 -0
  267. package/dist/projetoLegado.js.map +1 -0
  268. package/dist/projetoOrigens.d.ts +6 -0
  269. package/dist/projetoOrigens.js +185 -0
  270. package/dist/projetoOrigens.js.map +1 -0
  271. package/dist/projetoResolucao.d.ts +8 -0
  272. package/dist/projetoResolucao.js +43 -0
  273. package/dist/projetoResolucao.js.map +1 -0
  274. package/dist/projetoTipos.d.ts +43 -0
  275. package/dist/projetoTipos.js +4 -0
  276. package/dist/projetoTipos.js.map +1 -0
  277. package/dist/runnerValidacaoRemota.js.map +1 -1
  278. package/dist/runnerValidacaoRemotaBateria.js +2 -0
  279. package/dist/runnerValidacaoRemotaBateria.js.map +1 -1
  280. package/dist/runnerValidacaoRemotaExecucao.js +2 -0
  281. package/dist/runnerValidacaoRemotaExecucao.js.map +1 -1
  282. package/dist/runnerValidacaoRemotaRelatorio.js +2 -0
  283. package/dist/runnerValidacaoRemotaRelatorio.js.map +1 -1
  284. package/dist/runnerValidacaoRemotaSnapshot.js +2 -0
  285. package/dist/runnerValidacaoRemotaSnapshot.js.map +1 -1
  286. package/dist/runnerValidacaoRemotaWorkspace.js +2 -0
  287. package/dist/runnerValidacaoRemotaWorkspace.js.map +1 -1
  288. package/dist/sync/index.js +2 -0
  289. package/dist/sync/index.js.map +1 -1
  290. package/dist/textoListas.d.ts +4 -0
  291. package/dist/textoListas.js +22 -0
  292. package/dist/textoListas.js.map +1 -0
  293. package/dist/typescript-http-body.d.ts +12 -0
  294. package/dist/typescript-http-body.js +145 -0
  295. package/dist/typescript-http-body.js.map +1 -0
  296. package/dist/typescript-http-expressoes.d.ts +17 -0
  297. package/dist/typescript-http-expressoes.js +194 -0
  298. package/dist/typescript-http-expressoes.js.map +1 -0
  299. package/dist/typescript-http-modelos.d.ts +45 -0
  300. package/dist/typescript-http-modelos.js +82 -0
  301. package/dist/typescript-http-modelos.js.map +1 -0
  302. package/dist/typescript-http-rotas.d.ts +9 -0
  303. package/dist/typescript-http-rotas.js +129 -0
  304. package/dist/typescript-http-rotas.js.map +1 -0
  305. package/dist/typescript-http-semantica.d.ts +11 -0
  306. package/dist/typescript-http-semantica.js +329 -0
  307. package/dist/typescript-http-semantica.js.map +1 -0
  308. package/dist/typescript-http.d.ts +3 -35
  309. package/dist/typescript-http.js +4 -853
  310. package/dist/typescript-http.js.map +1 -1
  311. package/docs/AGENT_STARTER.md +1 -1
  312. package/docs/agentes-por-capacidade.md +55 -3
  313. package/docs/documentacao.md +1 -1
  314. package/docs/fluxo-pratico-ia-sema.md +1 -1
  315. package/docs/mcp.md +12 -0
  316. package/docs/pagamento-ponta-a-ponta.md +1 -1
  317. package/docs/persistencia-vendor-first.md +1 -1
  318. package/docs/prompt-base-ia-sema.md +1 -1
  319. package/docs/repositories.md +2 -2
  320. package/docs/seguranca.md +1 -1
  321. package/docs/sintaxe.md +1 -1
  322. package/exemplos/agendamento.sema +1 -1
  323. package/exemplos/assinatura.sema +1 -1
  324. package/exemplos/auditoria.sema +1 -1
  325. package/exemplos/autenticacao.sema +1 -1
  326. package/exemplos/author_obra_comum.sema +1 -1
  327. package/exemplos/author_tema_sensivel.sema +1 -1
  328. package/exemplos/automacao.sema +1 -1
  329. package/exemplos/cadastro_usuario.sema +1 -1
  330. package/exemplos/calculadora.sema +1 -1
  331. package/exemplos/crud_simples.sema +1 -1
  332. package/exemplos/estoque.sema +1 -1
  333. package/exemplos/exportacao.sema +1 -1
  334. package/exemplos/fila.sema +1 -1
  335. package/exemplos/integracao_externa.sema +1 -1
  336. package/exemplos/multi_tenant.sema +1 -1
  337. package/exemplos/notificacao.sema +1 -1
  338. package/exemplos/operacao_estrategia.sema +132 -633
  339. package/exemplos/operacao_estrategia_discovery.sema +220 -0
  340. package/exemplos/operacao_estrategia_fluxo.sema +114 -0
  341. package/exemplos/operacao_estrategia_gates.sema +106 -0
  342. package/exemplos/operacao_estrategia_quarentena.sema +133 -0
  343. package/exemplos/operacao_estrategia_rollout.sema +124 -0
  344. package/exemplos/pagamento.sema +1 -1
  345. package/exemplos/pagamento_dominio.sema +1 -1
  346. package/exemplos/pedido.sema +1 -1
  347. package/exemplos/permissao.sema +1 -1
  348. package/exemplos/persistencia_vendor_first.sema +1 -1
  349. package/exemplos/profile_game.sema +1 -1
  350. package/exemplos/profile_legal.sema +1 -1
  351. package/exemplos/profile_ops.sema +1 -1
  352. package/exemplos/profile_research.sema +1 -1
  353. package/exemplos/profile_software.sema +1 -1
  354. package/exemplos/profile_workflow_n8n.sema +1 -1
  355. package/exemplos/relatorio.sema +1 -1
  356. package/exemplos/replica_analitica_erp.sema +1 -1
  357. package/exemplos/testes_embutidos.sema +1 -1
  358. package/exemplos/tratamento_erro.sema +1 -1
  359. package/exemplos/upload_arquivo.sema +1 -1
  360. package/exemplos/webhook.sema +1 -1
  361. package/llms-full.txt +13 -8
  362. package/llms.txt +12 -7
  363. package/node_modules/@sema/gerador-css/dist/index.d.ts +2 -3
  364. package/node_modules/@sema/gerador-css/dist/index.js +4 -599
  365. package/node_modules/@sema/gerador-css/dist/index.js.map +1 -1
  366. package/node_modules/@sema/gerador-css/dist/index.part01.d.ts +6 -0
  367. package/node_modules/@sema/gerador-css/dist/index.part01.js +49 -0
  368. package/node_modules/@sema/gerador-css/dist/index.part01.js.map +1 -0
  369. package/node_modules/@sema/gerador-css/dist/index.part02.d.ts +3 -0
  370. package/node_modules/@sema/gerador-css/dist/index.part02.js +471 -0
  371. package/node_modules/@sema/gerador-css/dist/index.part02.js.map +1 -0
  372. package/node_modules/@sema/gerador-css/package.json +1 -1
  373. package/node_modules/@sema/gerador-dart/package.json +1 -1
  374. package/node_modules/@sema/gerador-html/package.json +1 -1
  375. package/node_modules/@sema/gerador-javascript/package.json +1 -1
  376. package/node_modules/@sema/gerador-lua/package.json +1 -1
  377. package/node_modules/@sema/gerador-python/dist/index.d.ts +2 -6
  378. package/node_modules/@sema/gerador-python/dist/index.js +4 -771
  379. package/node_modules/@sema/gerador-python/dist/index.js.map +1 -1
  380. package/node_modules/@sema/gerador-python/dist/index.part01.d.ts +28 -0
  381. package/node_modules/@sema/gerador-python/dist/index.part01.js +383 -0
  382. package/node_modules/@sema/gerador-python/dist/index.part01.js.map +1 -0
  383. package/node_modules/@sema/gerador-python/dist/index.part02.d.ts +20 -0
  384. package/node_modules/@sema/gerador-python/dist/index.part02.js +396 -0
  385. package/node_modules/@sema/gerador-python/dist/index.part02.js.map +1 -0
  386. package/node_modules/@sema/gerador-python/package.json +1 -1
  387. package/node_modules/@sema/gerador-typescript/dist/index.d.ts +3 -6
  388. package/node_modules/@sema/gerador-typescript/dist/index.js +5 -810
  389. package/node_modules/@sema/gerador-typescript/dist/index.js.map +1 -1
  390. package/node_modules/@sema/gerador-typescript/dist/index.part01.d.ts +25 -0
  391. package/node_modules/@sema/gerador-typescript/dist/index.part01.js +358 -0
  392. package/node_modules/@sema/gerador-typescript/dist/index.part01.js.map +1 -0
  393. package/node_modules/@sema/gerador-typescript/dist/index.part02.d.ts +14 -0
  394. package/node_modules/@sema/gerador-typescript/dist/index.part02.js +405 -0
  395. package/node_modules/@sema/gerador-typescript/dist/index.part02.js.map +1 -0
  396. package/node_modules/@sema/gerador-typescript/dist/index.part03.d.ts +5 -0
  397. package/node_modules/@sema/gerador-typescript/dist/index.part03.js +60 -0
  398. package/node_modules/@sema/gerador-typescript/dist/index.part03.js.map +1 -0
  399. package/node_modules/@sema/gerador-typescript/package.json +1 -1
  400. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +2 -0
  401. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +1 -1
  402. package/node_modules/@sema/nucleo/dist/diagnosticos/snippets.d.ts +6 -0
  403. package/node_modules/@sema/nucleo/dist/diagnosticos/snippets.js +40 -0
  404. package/node_modules/@sema/nucleo/dist/diagnosticos/snippets.js.map +1 -0
  405. package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +2 -9
  406. package/node_modules/@sema/nucleo/dist/formatador/index.js +4 -467
  407. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -1
  408. package/node_modules/@sema/nucleo/dist/formatador/index.part01.d.ts +39 -0
  409. package/node_modules/@sema/nucleo/dist/formatador/index.part01.js +385 -0
  410. package/node_modules/@sema/nucleo/dist/formatador/index.part01.js.map +1 -0
  411. package/node_modules/@sema/nucleo/dist/formatador/index.part02.d.ts +4 -0
  412. package/node_modules/@sema/nucleo/dist/formatador/index.part02.js +92 -0
  413. package/node_modules/@sema/nucleo/dist/formatador/index.part02.js.map +1 -0
  414. package/node_modules/@sema/nucleo/dist/index.d.ts +2 -0
  415. package/node_modules/@sema/nucleo/dist/index.js +6 -0
  416. package/node_modules/@sema/nucleo/dist/index.js.map +1 -1
  417. package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +3 -5
  418. package/node_modules/@sema/nucleo/dist/ir/conversor.js +5 -880
  419. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
  420. package/node_modules/@sema/nucleo/dist/ir/conversor.part01.d.ts +30 -0
  421. package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js +398 -0
  422. package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js.map +1 -0
  423. package/node_modules/@sema/nucleo/dist/ir/conversor.part02.d.ts +41 -0
  424. package/node_modules/@sema/nucleo/dist/ir/conversor.part02.js +184 -0
  425. package/node_modules/@sema/nucleo/dist/ir/conversor.part02.js.map +1 -0
  426. package/node_modules/@sema/nucleo/dist/ir/conversor.part03.d.ts +5 -0
  427. package/node_modules/@sema/nucleo/dist/ir/conversor.part03.js +310 -0
  428. package/node_modules/@sema/nucleo/dist/ir/conversor.part03.js.map +1 -0
  429. package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +3 -9
  430. package/node_modules/@sema/nucleo/dist/parser/parser.declaracoes.d.ts +11 -0
  431. package/node_modules/@sema/nucleo/dist/parser/parser.declaracoes.js +150 -0
  432. package/node_modules/@sema/nucleo/dist/parser/parser.declaracoes.js.map +1 -0
  433. package/node_modules/@sema/nucleo/dist/parser/parser.js +5 -768
  434. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
  435. package/node_modules/@sema/nucleo/dist/parser/parser.modulo.d.ts +3 -0
  436. package/node_modules/@sema/nucleo/dist/parser/parser.modulo.js +222 -0
  437. package/node_modules/@sema/nucleo/dist/parser/parser.modulo.js.map +1 -0
  438. package/node_modules/@sema/nucleo/dist/parser/parser.part01.d.ts +9 -0
  439. package/node_modules/@sema/nucleo/dist/parser/parser.part01.js +61 -0
  440. package/node_modules/@sema/nucleo/dist/parser/parser.part01.js.map +1 -0
  441. package/node_modules/@sema/nucleo/dist/parser/parser.part02.d.ts +40 -0
  442. package/node_modules/@sema/nucleo/dist/parser/parser.part02.js +373 -0
  443. package/node_modules/@sema/nucleo/dist/parser/parser.part02.js.map +1 -0
  444. package/node_modules/@sema/nucleo/dist/parser/parser.part03.d.ts +4 -0
  445. package/node_modules/@sema/nucleo/dist/parser/parser.part03.js +9 -0
  446. package/node_modules/@sema/nucleo/dist/parser/parser.part03.js.map +1 -0
  447. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js +2 -0
  448. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +1 -1
  449. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +3 -59
  450. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +2 -1682
  451. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
  452. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.d.ts +89 -0
  453. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js +292 -0
  454. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js.map +1 -0
  455. package/node_modules/@sema/nucleo/dist/semantico/analisador.part02.d.ts +29 -0
  456. package/node_modules/@sema/nucleo/dist/semantico/analisador.part02.js +168 -0
  457. package/node_modules/@sema/nucleo/dist/semantico/analisador.part02.js.map +1 -0
  458. package/node_modules/@sema/nucleo/dist/semantico/analisador.part03.d.ts +11 -0
  459. package/node_modules/@sema/nucleo/dist/semantico/analisador.part03.js +185 -0
  460. package/node_modules/@sema/nucleo/dist/semantico/analisador.part03.js.map +1 -0
  461. package/node_modules/@sema/nucleo/dist/semantico/analisador.part04.d.ts +30 -0
  462. package/node_modules/@sema/nucleo/dist/semantico/analisador.part04.js +200 -0
  463. package/node_modules/@sema/nucleo/dist/semantico/analisador.part04.js.map +1 -0
  464. package/node_modules/@sema/nucleo/dist/semantico/analisador.part05.d.ts +6 -0
  465. package/node_modules/@sema/nucleo/dist/semantico/analisador.part05.js +193 -0
  466. package/node_modules/@sema/nucleo/dist/semantico/analisador.part05.js.map +1 -0
  467. package/node_modules/@sema/nucleo/dist/semantico/analisador.part06.d.ts +11 -0
  468. package/node_modules/@sema/nucleo/dist/semantico/analisador.part06.js +208 -0
  469. package/node_modules/@sema/nucleo/dist/semantico/analisador.part06.js.map +1 -0
  470. package/node_modules/@sema/nucleo/dist/semantico/analisador.part07.d.ts +11 -0
  471. package/node_modules/@sema/nucleo/dist/semantico/analisador.part07.js +247 -0
  472. package/node_modules/@sema/nucleo/dist/semantico/analisador.part07.js.map +1 -0
  473. package/node_modules/@sema/nucleo/dist/semantico/analisador.part08.d.ts +3 -0
  474. package/node_modules/@sema/nucleo/dist/semantico/analisador.part08.js +249 -0
  475. package/node_modules/@sema/nucleo/dist/semantico/analisador.part08.js.map +1 -0
  476. package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +2 -106
  477. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +4 -474
  478. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +1 -1
  479. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part01.d.ts +109 -0
  480. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part01.js +259 -0
  481. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part01.js.map +1 -0
  482. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part02.d.ts +9 -0
  483. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part02.js +223 -0
  484. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part02.js.map +1 -0
  485. package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.d.ts +21 -0
  486. package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.js +40 -0
  487. package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.js.map +1 -0
  488. package/node_modules/@sema/nucleo/package.json +1 -1
  489. package/node_modules/@sema/padroes/package.json +1 -1
  490. package/package.json +10 -10
@@ -1,772 +1,5 @@
1
- import path from "node:path";
2
- import { descreverEstruturaModulo, extrairTiposNomeados, mapearTipoParaPython, normalizarNomeModulo, normalizarNomeParaSimbolo, } from "@sema/padroes";
3
- function mapearCampoParaPython(campo) {
4
- let anotacao;
5
- if (campo.cardinalidade === "lista") {
6
- anotacao = `list[${mapearTipoParaPython(campo.tipoItem ?? campo.tipoBase)}]`;
7
- }
8
- else if (campo.cardinalidade === "mapa") {
9
- anotacao = `dict[${mapearTipoParaPython(campo.chaveMapa ?? "Texto")}, ${mapearTipoParaPython(campo.valorMapa ?? "Json")}]`;
10
- }
11
- else if (campo.cardinalidade === "uniao") {
12
- anotacao = campo.tiposAlternativos.map((tipo) => mapearTipoParaPython(tipo)).join(" | ");
13
- }
14
- else {
15
- anotacao = mapearTipoParaPython(campo.tipoBase);
16
- }
17
- if (campo.opcional && !/\bNone\b/.test(anotacao)) {
18
- return `${anotacao} | None`;
19
- }
20
- return anotacao;
21
- }
22
- function gerarDataclass(nome, campos) {
23
- const camposOrdenados = [...campos].sort((a, b) => {
24
- const obrigatorioA = a.modificadores.includes("required") ? 0 : 1;
25
- const obrigatorioB = b.modificadores.includes("required") ? 0 : 1;
26
- return obrigatorioA - obrigatorioB;
27
- });
28
- const linhas = camposOrdenados.length === 0
29
- ? " pass"
30
- : camposOrdenados.map((campo) => {
31
- const tipoBase = mapearCampoParaPython(campo);
32
- if (campo.modificadores.includes("required")) {
33
- return ` ${campo.nome}: ${tipoBase}`;
34
- }
35
- return ` ${campo.nome}: ${/\bNone\b/.test(tipoBase) ? tipoBase : `${tipoBase} | None`} = None`;
36
- }).join("\n");
37
- return `@dataclass\nclass ${nome}:\n${linhas}\n`;
38
- }
39
- function gerarComentarioInvariantesPython(invariantes) {
40
- if (invariantes.length === 0) {
41
- return "";
42
- }
43
- return `${invariantes.map((invariante) => `# Invariante: ${invariante.textoOriginal}`).join("\n")}\n`;
44
- }
45
- function gerarListaCamposPython(campos) {
46
- if (campos.length === 0) {
47
- return "[]";
48
- }
49
- return `[\n${campos.map((campo) => ` {"nome": "${campo.nome}", "tipo": "${campo.tipo}", "obrigatorio": ${campo.modificadores.includes("required") ? "True" : "False"}},`).join("\n")}\n]`;
50
- }
51
- function coletarTiposExternos(modulo) {
52
- const locais = new Set([
53
- ...modulo.types.map((item) => item.nome),
54
- ...modulo.entities.map((item) => item.nome),
55
- ...modulo.enums.map((item) => item.nome),
56
- ]);
57
- const referenciados = new Set();
58
- const campos = [
59
- ...modulo.entities.flatMap((entity) => entity.campos),
60
- ...modulo.tasks.flatMap((task) => [...task.input, ...task.output]),
61
- ...modulo.routes.flatMap((route) => [...route.inputPublico, ...route.outputPublico]),
62
- ...modulo.states.flatMap((state) => state.campos),
63
- ];
64
- for (const campo of campos) {
65
- for (const tipo of extrairTiposNomeados(campo.tipo)) {
66
- if (!locais.has(tipo)) {
67
- referenciados.add(tipo);
68
- }
69
- }
70
- }
71
- return [...referenciados].sort((a, b) => a.localeCompare(b, "pt-BR"));
72
- }
73
- function gerarMapaErrosPython(erros) {
74
- const entradas = Object.entries(erros);
75
- if (entradas.length === 0) {
76
- return "{}";
77
- }
78
- return `{\n${entradas.map(([nome, mensagem]) => ` ${JSON.stringify(nome)}: ${JSON.stringify(mensagem)},`).join("\n")}\n}`;
79
- }
80
- function formatarValorPython(valor, camposConhecidos, variavel) {
81
- const texto = valor.trim();
82
- if (/^-?\d+(?:\.\d+)?$/.test(texto)) {
83
- return texto;
84
- }
85
- if (texto === "verdadeiro") {
86
- return "True";
87
- }
88
- if (texto === "falso") {
89
- return "False";
90
- }
91
- if (texto === "nulo") {
92
- return "None";
93
- }
94
- if (camposConhecidos.has(texto.split(".")[0] ?? texto)) {
95
- return `${variavel}.${texto}`;
96
- }
97
- return JSON.stringify(texto);
98
- }
99
- function extrairReferenciaCampoConhecido(valor, camposConhecidos) {
100
- const texto = valor.trim();
101
- if (!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)+$/u.test(texto)) {
102
- return null;
103
- }
104
- const partes = texto.split(".");
105
- return camposConhecidos.has(partes[0] ?? "") ? partes : null;
106
- }
107
- function gerarInicializacaoReferenciaSaida(partes) {
108
- const [raiz, filho] = partes;
109
- if (!raiz || !filho) {
110
- return [];
111
- }
112
- return [
113
- ` if saida.${raiz} is None:\n saida.${raiz} = SimpleNamespace()`,
114
- ` if getattr(saida.${raiz}, "${filho}", None) is None:\n saida.${raiz}.${filho} = "valor_garantido"`,
115
- ];
116
- }
117
- function resolverExpressaoPython(expressao, camposConhecidos, variavel) {
118
- switch (expressao.tipo) {
119
- case "existe":
120
- return `${variavel}.${expressao.alvo} is not None`;
121
- case "comparacao":
122
- return `${variavel}.${expressao.alvo} ${expressao.operador} ${formatarValorPython(expressao.valor, camposConhecidos, variavel)}`;
123
- case "pertencimento":
124
- return `${variavel}.${expressao.alvo} in [${(expressao.valores ?? []).map((valor) => formatarValorPython(valor, camposConhecidos, variavel)).join(", ")}]`;
125
- case "predicado":
126
- return "True";
127
- case "composta":
128
- return `(${expressao.termos.map((termo) => resolverExpressaoPython(termo, camposConhecidos, variavel)).join(expressao.operadorLogico === "e" ? " and " : " or ")})`;
129
- case "negacao":
130
- return `(not ${resolverExpressaoPython(expressao.termo, camposConhecidos, variavel)})`;
131
- }
132
- }
133
- function valorPadraoPython(campo) {
134
- const tipo = campo.tipoBase;
135
- const nomeCampo = campo.nome;
136
- if (campo.cardinalidade === "lista") {
137
- return "[]";
138
- }
139
- if (campo.cardinalidade === "mapa") {
140
- return "{}";
141
- }
142
- if (campo.opcional) {
143
- return "None";
144
- }
145
- switch (tipo) {
146
- case "Texto":
147
- case "Id":
148
- case "Email":
149
- case "Url":
150
- return JSON.stringify(`${nomeCampo}_exemplo`);
151
- case "Numero":
152
- case "Inteiro":
153
- case "Decimal":
154
- return "1";
155
- case "Booleano":
156
- return "False";
157
- case "Json":
158
- return "{}";
159
- default:
160
- return "SimpleNamespace()";
161
- }
162
- }
163
- function removerAspasExternas(valor) {
164
- const texto = valor.trim();
165
- if ((texto.startsWith("\"") && texto.endsWith("\""))
166
- || (texto.startsWith("'") && texto.endsWith("'"))) {
167
- return texto.slice(1, -1);
168
- }
169
- return texto;
170
- }
171
- function dividirLiteralNoNivelRaiz(valor, separador) {
172
- const partes = [];
173
- let atual = "";
174
- let profundidadeAngular = 0;
175
- let profundidadeLista = 0;
176
- let profundidadeMapa = 0;
177
- let aspas = null;
178
- for (let indice = 0; indice < valor.length; indice += 1) {
179
- const caractere = valor[indice];
180
- const anterior = indice > 0 ? valor[indice - 1] : "";
181
- if (aspas) {
182
- atual += caractere;
183
- if (caractere === aspas && anterior !== "\\") {
184
- aspas = null;
185
- }
186
- continue;
187
- }
188
- if (caractere === "\"" || caractere === "'") {
189
- aspas = caractere;
190
- atual += caractere;
191
- continue;
192
- }
193
- if (caractere === "<") {
194
- profundidadeAngular += 1;
195
- atual += caractere;
196
- continue;
197
- }
198
- if (caractere === ">") {
199
- profundidadeAngular = Math.max(0, profundidadeAngular - 1);
200
- atual += caractere;
201
- continue;
202
- }
203
- if (caractere === "[") {
204
- profundidadeLista += 1;
205
- atual += caractere;
206
- continue;
207
- }
208
- if (caractere === "]") {
209
- profundidadeLista = Math.max(0, profundidadeLista - 1);
210
- atual += caractere;
211
- continue;
212
- }
213
- if (caractere === "{") {
214
- profundidadeMapa += 1;
215
- atual += caractere;
216
- continue;
217
- }
218
- if (caractere === "}") {
219
- profundidadeMapa = Math.max(0, profundidadeMapa - 1);
220
- atual += caractere;
221
- continue;
222
- }
223
- if (caractere === separador
224
- && profundidadeAngular === 0
225
- && profundidadeLista === 0
226
- && profundidadeMapa === 0) {
227
- if (atual.trim()) {
228
- partes.push(atual.trim());
229
- }
230
- atual = "";
231
- continue;
232
- }
233
- atual += caractere;
234
- }
235
- if (atual.trim()) {
236
- partes.push(atual.trim());
237
- }
238
- return partes;
239
- }
240
- function resolverTipoItemTeste(tipoDeclarado) {
241
- const tipo = (tipoDeclarado ?? "").trim();
242
- if (!tipo) {
243
- return undefined;
244
- }
245
- if (tipo.endsWith("[]")) {
246
- return tipo.slice(0, -2).trim();
247
- }
248
- const lista = tipo.match(/^Lista<(.+)>$/);
249
- if (lista?.[1]) {
250
- return lista[1].trim();
251
- }
252
- return undefined;
253
- }
254
- function formatarLiteralTestePython(valor, tipoDeclarado) {
255
- const bruto = valor.trim();
256
- if (bruto.startsWith("[") && bruto.endsWith("]")) {
257
- const interior = bruto.slice(1, -1).trim();
258
- const tipoItem = resolverTipoItemTeste(tipoDeclarado);
259
- if (!interior) {
260
- return "[]";
261
- }
262
- return `[${dividirLiteralNoNivelRaiz(interior, ",").map((item) => formatarLiteralTestePython(item, tipoItem)).join(", ")}]`;
263
- }
264
- if (bruto.startsWith("{") && bruto.endsWith("}")) {
265
- const interior = bruto.slice(1, -1).trim();
266
- if (!interior) {
267
- return "{}";
268
- }
269
- const pares = dividirLiteralNoNivelRaiz(interior, ",")
270
- .map((par) => {
271
- const [chaveBruta, ...valorBruto] = dividirLiteralNoNivelRaiz(par, ":");
272
- if (!chaveBruta || valorBruto.length === 0) {
273
- return "";
274
- }
275
- return `${JSON.stringify(removerAspasExternas(chaveBruta))}: ${formatarLiteralTestePython(valorBruto.join(":"))}`;
276
- })
277
- .filter(Boolean);
278
- return `{${pares.join(", ")}}`;
279
- }
280
- const texto = removerAspasExternas(bruto);
281
- if (["Texto", "Id", "Email", "Url"].includes(tipoDeclarado ?? "")) {
282
- return JSON.stringify(texto);
283
- }
284
- if (["Numero", "Inteiro", "Decimal"].includes(tipoDeclarado ?? "") && /^-?\d+(?:\.\d+)?$/.test(texto)) {
285
- return texto;
286
- }
287
- if ((tipoDeclarado ?? "") === "Booleano") {
288
- if (texto === "verdadeiro") {
289
- return "True";
290
- }
291
- if (texto === "falso") {
292
- return "False";
293
- }
294
- }
295
- if (/^-?\d+(?:\.\d+)?$/.test(texto)) {
296
- return texto;
297
- }
298
- if (texto === "verdadeiro") {
299
- return "True";
300
- }
301
- if (texto === "falso") {
302
- return "False";
303
- }
304
- if (texto === "nulo") {
305
- return "None";
306
- }
307
- return JSON.stringify(texto);
308
- }
309
- function gerarMapaLiteralPython(campos) {
310
- return `{${campos.map((campo) => `${JSON.stringify(campo.nome)}: ${campo.valor}`).join(", ")}}`;
311
- }
312
- function coletarTiposCompostos(modulo) {
313
- const tipos = new Map();
314
- for (const type of modulo.types) {
315
- tipos.set(type.nome, new Map(type.definicao.campos.map((campo) => [campo.nome, campo.tipo])));
316
- }
317
- for (const entity of modulo.entities) {
318
- tipos.set(entity.nome, new Map(entity.campos.map((campo) => [campo.nome, campo.tipo])));
319
- }
320
- return tipos;
321
- }
322
- function gerarLiteralBlocoTestePython(bloco, tiposCompostos, tiposDeclarados, tipoAtual) {
323
- const entradas = [];
324
- const tiposAtuais = tipoAtual ? tiposCompostos?.get(tipoAtual) : undefined;
325
- for (const campo of bloco.campos) {
326
- entradas.push({
327
- nome: campo.nome,
328
- valor: formatarLiteralTestePython(campo.tipo, tiposDeclarados?.get(campo.nome) ?? tiposAtuais?.get(campo.nome)),
329
- });
330
- }
331
- for (const subbloco of bloco.blocos) {
332
- const tipoSubbloco = tiposDeclarados?.get(subbloco.nome) ?? tiposAtuais?.get(subbloco.nome);
333
- entradas.push({
334
- nome: subbloco.nome,
335
- valor: gerarLiteralBlocoTestePython(subbloco.conteudo, tiposCompostos, undefined, tipoSubbloco),
336
- });
337
- }
338
- if (tipoAtual && tiposCompostos?.has(tipoAtual)) {
339
- return `${tipoAtual}(${entradas.map((campo) => `${campo.nome}=${campo.valor}`).join(", ")})`;
340
- }
341
- return gerarMapaLiteralPython(entradas);
342
- }
343
- function paraPascalCase(valor) {
344
- return valor
345
- .split(/[^A-Za-z0-9]+/)
346
- .filter(Boolean)
347
- .map((parte) => parte[0].toUpperCase() + parte.slice(1))
348
- .join("");
349
- }
350
- function gerarPreparacaoSaida(task) {
351
- const camposSaida = new Set(task.output.map((campo) => campo.nome));
352
- const argumentos = task.output.map((campo) => `${campo.nome}=${valorPadraoPython(campo)}`).join(", ");
353
- const ajustes = [];
354
- for (const garantia of task.garantiasEstruturadas) {
355
- if (garantia.tipo === "pertencimento" && garantia.valores && camposSaida.has(garantia.alvo)) {
356
- ajustes.push(` saida.${garantia.alvo} = ${formatarValorPython(garantia.valores[0] ?? "", camposSaida, "saida")}`);
357
- }
358
- if (garantia.tipo === "comparacao" && garantia.valor && camposSaida.has(garantia.alvo.split(".")[0] ?? garantia.alvo) && !garantia.alvo.includes(".")) {
359
- ajustes.push(` saida.${garantia.alvo} = ${formatarValorPython(garantia.valor, camposSaida, "saida")}`);
360
- }
361
- if (garantia.tipo === "comparacao" && garantia.valor && garantia.alvo.includes(".")) {
362
- const [raiz, filho] = garantia.alvo.split(".", 2);
363
- if (raiz && filho && camposSaida.has(raiz)) {
364
- const referenciaValor = extrairReferenciaCampoConhecido(garantia.valor, camposSaida);
365
- if (referenciaValor) {
366
- ajustes.push(...gerarInicializacaoReferenciaSaida(referenciaValor));
367
- }
368
- ajustes.push(` if saida.${raiz} is None:\n saida.${raiz} = SimpleNamespace()`);
369
- ajustes.push(` saida.${raiz}.${filho} = ${formatarValorPython(garantia.valor, camposSaida, "saida")}`);
370
- }
371
- }
372
- if (garantia.tipo === "existe" && garantia.alvo.includes(".")) {
373
- const [raiz, filho] = garantia.alvo.split(".", 2);
374
- if (raiz && filho && camposSaida.has(raiz)) {
375
- ajustes.push(` if saida.${raiz} is None:\n saida.${raiz} = SimpleNamespace()`);
376
- ajustes.push(` if getattr(saida.${raiz}, "${filho}", None) is None:\n saida.${raiz}.${filho} = "valor_garantido"`);
377
- }
378
- }
379
- }
380
- return ` saida = ${task.nome}Saida(${argumentos})\n${ajustes.join("\n")}`;
381
- }
382
- function finalizarBlocoPython(linhas) {
383
- if (linhas.length === 0) {
384
- return " pass";
385
- }
386
- const possuiInstrucaoExecutavel = linhas.some((linha) => {
387
- const texto = linha.trim();
388
- return texto.length > 0 && !texto.startsWith("#");
389
- });
390
- if (possuiInstrucaoExecutavel) {
391
- return linhas.join("\n");
392
- }
393
- return `${linhas.join("\n")}\n pass`;
394
- }
395
- function gerarFuncaoGarantias(task) {
396
- const camposSaida = new Set(task.output.map((campo) => campo.nome));
397
- const linhas = [
398
- ...task.garantiasEstruturadas.map((garantia) => {
399
- switch (garantia.tipo) {
400
- case "predicado":
401
- return ` # Predicado de garantia declarado em Sema: ${garantia.textoOriginal}`;
402
- default:
403
- return ` if not (${resolverExpressaoPython(garantia, camposSaida, "saida")}):\n raise ValueError("Garantia violada: ${garantia.textoOriginal}")`;
404
- }
405
- }),
406
- ...task.guarantees
407
- .filter((garantia) => !task.garantiasEstruturadas.some((estruturada) => estruturada.textoOriginal === garantia))
408
- .map((garantia) => ` # Garantia declarada em Sema: ${garantia}`),
409
- ];
410
- return `def verificar_garantias_${normalizarNomeParaSimbolo(task.nome)}(saida: ${task.nome}Saida) -> None:\n${finalizarBlocoPython(linhas)}\n`;
411
- }
412
- function gerarMetadadosTask(task) {
413
- const efeitos = task.efeitosEstruturados.length === 0
414
- ? "[]"
415
- : `[\n${task.efeitosEstruturados.map((efeito) => ` {"categoria": "${efeito.categoria}", "alvo": "${efeito.alvo}"${efeito.detalhe ? `, "detalhe": ${JSON.stringify(efeito.detalhe)}` : ""}${efeito.criticidade ? `, "criticidade": "${efeito.criticidade}"` : ""}},`).join("\n")}\n]`;
416
- const implementacoes = task.implementacoesExternas.length === 0
417
- ? "[]"
418
- : `[\n${task.implementacoesExternas.map((impl) => ` {"origem": "${impl.origem}", "caminho": "${impl.caminho}", "resolucaoImpl": "${impl.resolucaoImpl ?? impl.caminho}", "statusImpl": "${impl.statusImpl ?? "nao_verificado"}"},`).join("\n")}\n]`;
419
- return `contrato_${normalizarNomeParaSimbolo(task.nome)} = {
420
- "nome": "${task.nome}",
421
- "input": ${gerarListaCamposPython(task.input)},
422
- "output": ${gerarListaCamposPython(task.output)},
423
- "effects": ${efeitos},
424
- "impl": ${implementacoes},
425
- "errors": ${gerarMapaErrosPython(task.errors)},
426
- "guarantees": ${JSON.stringify(task.guarantees, null, 2)},
427
- }
428
- `;
429
- }
430
- function gerarMapeamentoSaidaPublicaPython(nomeVariavel, campos) {
431
- if (campos.length === 0) {
432
- return "{}";
433
- }
434
- return `{\n${campos.map((campo) => ` "${campo.nome}": ${nomeVariavel}.${campo.nome},`).join("\n")}\n }`;
435
- }
436
- function gerarValidacoesRespostaPublicaPython(campos) {
437
- const obrigatorios = campos.filter((campo) => campo.modificadores.includes("required"));
438
- if (obrigatorios.length === 0) {
439
- return " pass";
440
- }
441
- return obrigatorios
442
- .map((campo) => ` if dados.${campo.nome} is None:\n raise ValueError("Resposta publica invalida: campo obrigatorio ausente ${campo.nome}")`)
443
- .join("\n");
444
- }
445
- function gerarRotas(modulo) {
446
- const rotasComTask = modulo.routes.filter((route) => route.task);
447
- if (rotasComTask.length === 0) {
448
- return "";
449
- }
450
- return rotasComTask.map((route) => {
451
- const taskAssociada = modulo.tasks.find((task) => task.nome === route.task);
452
- if (!taskAssociada) {
453
- return "";
454
- }
455
- const nomeSimboloRoute = normalizarNomeParaSimbolo(route.nome);
456
- const nomeSimboloTask = normalizarNomeParaSimbolo(taskAssociada.nome);
457
- const efeitosPublicos = route.efeitosPublicos.length === 0
458
- ? "[]"
459
- : `[\n${route.efeitosPublicos.map((efeito) => ` {"categoria": "${efeito.categoria}", "alvo": "${efeito.alvo}"${efeito.detalhe ? `, "detalhe": ${JSON.stringify(efeito.detalhe)}` : ""}${efeito.criticidade ? `, "criticidade": "${efeito.criticidade}"` : ""}},`).join("\n")}\n]`;
460
- const mapaErros = route.errosPublicos.length === 0
461
- ? "{}"
462
- : `{\n${route.errosPublicos.map((erro) => ` ${JSON.stringify(erro.nome)}: ${JSON.stringify(erro.mensagem ?? taskAssociada.errors[erro.nome] ?? "")},`).join("\n")}\n}`;
463
- const blocosErro = route.errosPublicos.map((erro) => ` except ${taskAssociada.nome}_${erro.nome}Erro:
464
- return {"sucesso": False, "erro": {"codigo": "${erro.nome}", "mensagem": ${JSON.stringify(erro.mensagem ?? taskAssociada.errors[erro.nome] ?? `Erro publico ${erro.nome}`)}}}`).join("\n");
465
- return `
466
- ${gerarDataclass(`${route.nome}EntradaPublica`, route.inputPublico)}
467
- ${gerarDataclass(`${route.nome}SaidaPublica`, route.outputPublico)}
468
- contrato_publico_${nomeSimboloRoute} = {
469
- "nome": "${route.nome}",
470
- "metodo": ${JSON.stringify(route.metodo ?? null)},
471
- "caminho": ${JSON.stringify(route.caminho ?? null)},
472
- "task": ${JSON.stringify(route.task ?? null)},
473
- "input": ${gerarListaCamposPython(route.inputPublico)},
474
- "output": ${gerarListaCamposPython(route.outputPublico)},
475
- "effects": ${efeitosPublicos},
476
- "guarantees": ${JSON.stringify(route.garantiasPublicasMinimas, null, 4)},
477
- "errors": ${mapaErros},
478
- }
479
-
480
- def verificar_resposta_publica_${nomeSimboloRoute}(dados: ${route.nome}SaidaPublica) -> None:
481
- ${gerarValidacoesRespostaPublicaPython(route.outputPublico)}
482
-
483
- def adaptar_${nomeSimboloRoute}(requisicao: ${route.nome}EntradaPublica) -> dict[str, object]:
484
- try:
485
- saida = executar_${nomeSimboloTask}(requisicao) # type: ignore[arg-type]
486
- dados_publicos = ${route.nome}SaidaPublica(${route.outputPublico.map((campo) => `${campo.nome}=saida.${campo.nome}`).join(", ")})
487
- verificar_resposta_publica_${nomeSimboloRoute}(dados_publicos)
488
- return {
489
- "sucesso": True,
490
- "dados": ${gerarMapeamentoSaidaPublicaPython("dados_publicos", route.outputPublico)},
491
- }
492
- ${blocosErro || " except Exception:\n raise"}
493
- except Exception:
494
- raise
495
- `;
496
- }).join("\n");
497
- }
498
- function gerarTask(task, tiposCompostos) {
499
- const nome = normalizarNomeParaSimbolo(task.nome);
500
- const camposEntrada = new Set(task.input.map((campo) => campo.nome));
501
- const camposSaida = new Set(task.output.map((campo) => campo.nome));
502
- const errosMapeados = new Map(Object.entries(task.errors));
503
- for (const caso of task.tests) {
504
- const tipoErro = caso.error?.campos.find((campo) => campo.nome === "tipo")?.tipo ?? caso.error?.campos[0]?.tipo;
505
- if (tipoErro && !errosMapeados.has(tipoErro)) {
506
- errosMapeados.set(tipoErro, `Erro sintetico gerado a partir do caso de teste "${caso.nome}".`);
507
- }
508
- }
509
- const erros = [...errosMapeados.entries()];
510
- const tiposEntrada = new Map(task.input.map((campo) => [campo.nome, campo.tipo]));
511
- const erroAutenticacao = erros.find(([nomeErro]) => nomeErro.includes("autentic"))?.[0];
512
- const erroAutorizacao = erros.find(([nomeErro]) => nomeErro.includes("acesso_negado") || nomeErro.includes("autoriz"))?.[0];
513
- const validacoes = [
514
- ...task.input
515
- .filter((campo) => campo.modificadores.includes("required"))
516
- .map((campo) => ` if entrada.${campo.nome} is None:\n raise ValueError("Campo obrigatorio ausente: ${campo.nome}")`),
517
- ...task.regrasEstruturadas.map((regra) => {
518
- switch (regra.tipo) {
519
- case "predicado":
520
- return ` # Predicado declarado em Sema: ${regra.textoOriginal}`;
521
- default:
522
- return ` if not (${resolverExpressaoPython(regra, camposEntrada, "entrada")}):\n raise ValueError("Regra violada: ${regra.textoOriginal}")`;
523
- }
524
- }),
525
- ...task.rules
526
- .filter((regra) => !task.regrasEstruturadas.some((estruturada) => estruturada.textoOriginal === regra))
527
- .map((regra) => ` # Regra declarada em Sema: ${regra}`),
528
- ];
529
- const efeitos = task.efeitosEstruturados.length > 0
530
- ? task.efeitosEstruturados.map((efeito) => ` # Efeito estruturado: categoria=${efeito.categoria} alvo=${efeito.alvo}${efeito.detalhe ? ` detalhe=${efeito.detalhe}` : ""}${efeito.criticidade ? ` criticidade=${efeito.criticidade}` : ""}`).join("\n")
531
- : task.effects.length === 0
532
- ? " # Nenhum efeito declarado."
533
- : task.effects.map((efeito) => ` # Efeito declarado: ${efeito}`).join("\n");
534
- const implementacoes = task.implementacoesExternas.length > 0
535
- ? task.implementacoesExternas.map((impl) => ` # Implementacao externa vinculada: origem=${impl.origem} caminho=${impl.caminho} status=${impl.statusImpl ?? "nao_verificado"}`).join("\n")
536
- : "";
537
- const garantias = ` verificar_garantias_${nome}(saida)\n return saida`;
538
- return `
539
- ${gerarDataclass(`${task.nome}Entrada`, task.input)}
540
- ${gerarDataclass(`${task.nome}Saida`, task.output)}
541
- ${erros.map(([nomeErro, mensagem]) => `\nclass ${task.nome}_${nomeErro}Erro(Exception):\n codigo = "${nomeErro}"\n\n def __init__(self) -> None:\n super().__init__(${JSON.stringify(mensagem)})\n`).join("\n")}
542
-
543
- def normalizar_contexto_${nome}(contexto: dict[str, object] | None = None) -> dict[str, object]:
544
- contexto_normalizado: dict[str, object] = dict(contexto or {})
545
- contexto_normalizado.setdefault("autenticado", True)
546
- contexto_normalizado.setdefault("autorizado", True)
547
- contexto_normalizado.setdefault("erro_esperado", None)
548
- return contexto_normalizado
549
-
550
- def criar_erro_${nome}(codigo: str) -> Exception:
551
- ${finalizarBlocoPython(erros.map(([nomeErro]) => ` if codigo == "${nomeErro}":\n return ${task.nome}_${nomeErro}Erro()`).concat(` return Exception(f"Erro sintetico nao mapeado para ${task.nome}: {codigo}")`))}
552
-
553
- ${gerarMetadadosTask(task)}
554
-
555
- def validar_${nome}(entrada: ${task.nome}Entrada) -> None:
556
- ${finalizarBlocoPython(validacoes)}
557
-
558
- ${gerarFuncaoGarantias(task)}
559
-
560
- def executar_${nome}(entrada: ${task.nome}Entrada, contexto: dict[str, object] | None = None) -> ${task.nome}Saida:
561
- contexto_execucao = normalizar_contexto_${nome}(contexto)
562
- ${erroAutenticacao ? ` if contexto_execucao["erro_esperado"] == "${erroAutenticacao}" or (${JSON.stringify(task.auth.modo ?? "")} == "obrigatorio" and not bool(contexto_execucao["autenticado"])):\n raise ${task.nome}_${erroAutenticacao}Erro()` : ""}
563
- ${erroAutorizacao ? ` if contexto_execucao["erro_esperado"] == "${erroAutorizacao}" or (${task.authz.explicita ? "not bool(contexto_execucao[\"autorizado\"])" : "False"}):\n raise ${task.nome}_${erroAutorizacao}Erro()` : ""}
564
- if contexto_execucao["erro_esperado"] is not None${erroAutenticacao ? ` and contexto_execucao["erro_esperado"] != "${erroAutenticacao}"` : ""}${erroAutorizacao ? ` and contexto_execucao["erro_esperado"] != "${erroAutorizacao}"` : ""}:
565
- raise criar_erro_${nome}(str(contexto_execucao["erro_esperado"]))
566
- validar_${nome}(entrada)
567
- ${task.stateContract ? ` # Vinculo de estado: ${task.stateContract.nomeEstado ?? "nao_definido"}\n # Transicoes declaradas pela task: ${task.stateContract.transicoes.map((transicao) => `${transicao.origem}->${transicao.destino}`).join(", ") || "nenhuma"}` : ""}
568
- ${implementacoes}
569
- ${efeitos}
570
- ${gerarPreparacaoSaida(task)}
571
- ${garantias}
572
- `;
573
- }
574
- function gerarTestes(modulo) {
575
- const linhas = ["import pytest", `from ${normalizarNomeModulo(modulo.nome).replace(/\./g, "_")} import *`, ""];
576
- const tiposCompostos = coletarTiposCompostos(modulo);
577
- for (const task of modulo.tasks) {
578
- const nomeFuncao = `executar_${normalizarNomeParaSimbolo(task.nome)}`;
579
- const tiposEntrada = new Map(task.input.map((campo) => [campo.nome, campo.tipo]));
580
- for (const caso of task.tests) {
581
- const argumentos = [
582
- ...caso.given.campos
583
- .filter((campo) => tiposEntrada.has(campo.nome))
584
- .map((campo) => `${campo.nome}=${formatarLiteralTestePython(campo.tipo, tiposEntrada.get(campo.nome))}`),
585
- ...caso.given.blocos
586
- .filter((subbloco) => tiposEntrada.has(subbloco.nome))
587
- .map((subbloco) => `${subbloco.nome}=${gerarLiteralBlocoTestePython(subbloco.conteudo, tiposCompostos, undefined, tiposEntrada.get(subbloco.nome))}`),
588
- ].join(", ");
589
- const tipoErro = caso.error?.campos.find((campo) => campo.nome === "tipo")?.tipo ?? caso.error?.campos[0]?.tipo;
590
- if (tipoErro) {
591
- const contextoLinhas = [`"erro_esperado": ${JSON.stringify(tipoErro)}`];
592
- if (tipoErro.includes("autentic")) {
593
- contextoLinhas.push('"autenticado": False', '"autorizado": False');
594
- }
595
- else if (tipoErro.includes("acesso_negado") || tipoErro.includes("autoriz")) {
596
- contextoLinhas.push('"autenticado": True', '"autorizado": False');
597
- }
598
- linhas.push(`def test_${normalizarNomeParaSimbolo(task.nome)}_${normalizarNomeParaSimbolo(caso.nome)}() -> None:\n entrada = ${task.nome}Entrada(${argumentos})\n contexto = { ${contextoLinhas.join(", ")} }\n with pytest.raises(${task.nome}_${tipoErro}Erro):\n ${nomeFuncao}(entrada, contexto)\n`);
599
- continue;
600
- }
601
- linhas.push(`def test_${normalizarNomeParaSimbolo(task.nome)}_${normalizarNomeParaSimbolo(caso.nome)}() -> None:\n entrada = ${task.nome}Entrada(${argumentos})\n resultado = ${nomeFuncao}(entrada)\n assert resultado is not None\n`);
602
- }
603
- }
604
- return linhas.join("\n");
605
- }
606
- function gerarCabecalhoSemaPython(modulo, tipo = "contrato") {
607
- const descricoes = {
608
- contrato: "artefato Python gerado para executar e revisar as regras declaradas no contrato Sema.",
609
- teste: "testes Python gerados a partir dos casos do contrato Sema.",
610
- schemas: "schemas FastAPI derivados do contrato Sema para entrada e saída públicas.",
611
- service: "service FastAPI que conecta o scaffold do framework às tasks governadas pelo contrato Sema.",
612
- router: "router FastAPI derivado das routes públicas declaradas no contrato Sema.",
613
- };
614
- return [
615
- "# SEMA-GOVERNED",
616
- `# Módulo de origem: ${modulo.nome}`,
617
- "# Consulte o contrato .sema aplicável antes de editar este arquivo.",
618
- "# Para IA fraca/média/forte: chame Sema, rode docs-impacto e drift antes de alterar código.",
619
- `# Descrição: ${descricoes[tipo]}`,
620
- "",
621
- ].join("\n");
622
- }
623
- function gerarPythonBase(modulo) {
624
- const nomeBase = normalizarNomeModulo(modulo.nome).replace(/\./g, "_");
625
- const interoperabilidades = modulo.interoperabilidades
626
- .map((interop) => `# Interop externo ${interop.origem}: ${interop.caminho}`)
627
- .join("\n");
628
- const tiposExternos = coletarTiposExternos(modulo)
629
- .map((tipo) => `class ${tipo}(SimpleNamespace):\n pass\n`)
630
- .join("\n");
631
- const enums = modulo.enums.map((enumeracao) => `class ${enumeracao.nome}:\n${enumeracao.valores.map((valor) => ` ${valor} = "${valor}"`).join("\n")}\n`).join("\n");
632
- const tipos = modulo.types.map((type) => `${gerarComentarioInvariantesPython(type.invariantes)}${gerarDataclass(type.nome, type.definicao.campos)}`).join("\n");
633
- const entidades = modulo.entities.map((entity) => `${gerarComentarioInvariantesPython(entity.invariantes)}${gerarDataclass(entity.nome, entity.campos)}`).join("\n");
634
- const states = modulo.states.map((state) => `# State${state.nome ? ` ${state.nome}` : ""}: campos=${state.campos.length} invariantes=${state.invariantes.length} transicoes=${state.transicoes.length}`).join("\n");
635
- const flows = modulo.flows.map((flow) => `# Flow ${flow.nome}: etapas=${flow.linhas.length} tasks=${flow.tasksReferenciadas.join(", ") || "nenhuma"} ramificacoes=${flow.etapasEstruturadas.filter((etapa) => etapa.emSucesso || etapa.emErro).length} mapeamentos=${flow.etapasEstruturadas.reduce((total, etapa) => total + etapa.mapeamentos.length, 0)} rotas_erro=${flow.etapasEstruturadas.reduce((total, etapa) => total + etapa.porErro.length, 0)} efeitos=${flow.efeitosEstruturados.map((efeito) => `${efeito.categoria}:${efeito.alvo}`).join(", ") || "nenhum"}`).join("\n");
636
- const routes = modulo.routes.map((route) => `# Route ${route.nome}: metodo=${route.metodo ?? "nao_definido"} caminho=${route.caminho ?? "nao_definido"} task=${route.task ?? "nao_definida"} input_publico=${route.inputPublico.map((campo) => campo.nome).join(", ") || "padrao_task"} output_publico=${route.outputPublico.map((campo) => campo.nome).join(", ") || "padrao_task"} erros_publicos=${route.errosPublicos.map((erro) => erro.nome).join(", ") || "padrao_task"} effects_publicos=${route.efeitosPublicos.map((efeito) => `${efeito.categoria}:${efeito.alvo}`).join(", ") || "nenhum"} garantias_publicas=${route.garantiasPublicasMinimas.length}`).join("\n");
637
- const tiposCompostos = coletarTiposCompostos(modulo);
638
- const tasks = modulo.tasks.map((task) => gerarTask(task, tiposCompostos)).join("\n");
639
- const contratosPublicos = gerarRotas(modulo);
640
- const codigo = `${gerarCabecalhoSemaPython(modulo)}from __future__ import annotations\n${interoperabilidades ? `${interoperabilidades}\n` : ""}\nfrom dataclasses import dataclass\nfrom types import SimpleNamespace\n\n${tiposExternos}\n${tipos}\n${enums}\n${entidades}\n${states}\n${flows}\n${routes}\n${tasks}\n${contratosPublicos}\n`;
641
- const testes = `${gerarCabecalhoSemaPython(modulo, "teste")}${gerarTestes(modulo)}`;
642
- return [
643
- { caminhoRelativo: `${nomeBase}.py`, conteudo: codigo },
644
- { caminhoRelativo: `test_${nomeBase}.py`, conteudo: testes },
645
- ];
646
- }
647
- function gerarFastApiSchemas(modulo, caminhoContrato) {
648
- const linhas = [
649
- "from pydantic import BaseModel",
650
- `from ${caminhoContrato} import *`,
651
- "",
652
- ];
653
- for (const task of modulo.tasks) {
654
- linhas.push(`class ${task.nome}EntradaSchema(BaseModel):
655
- ${task.input.length === 0 ? " pass" : task.input.map((campo) => ` ${campo.nome}: ${mapearCampoParaPython(campo)}`).join("\n")}
656
- `);
657
- linhas.push(`class ${task.nome}SaidaSchema(BaseModel):
658
- ${task.output.length === 0 ? " pass" : task.output.map((campo) => ` ${campo.nome}: ${mapearCampoParaPython(campo)}`).join("\n")}
659
- `);
660
- }
661
- for (const route of modulo.routes) {
662
- linhas.push(`class ${route.nome}EntradaPublicaSchema(BaseModel):
663
- ${route.inputPublico.length === 0 ? " pass" : route.inputPublico.map((campo) => ` ${campo.nome}: ${mapearCampoParaPython(campo)}`).join("\n")}
664
- `);
665
- linhas.push(`class ${route.nome}SaidaPublicaSchema(BaseModel):
666
- ${route.outputPublico.length === 0 ? " pass" : route.outputPublico.map((campo) => ` ${campo.nome}: ${mapearCampoParaPython(campo)}`).join("\n")}
667
- `);
668
- }
669
- return `${gerarCabecalhoSemaPython(modulo, "schemas")}${linhas.join("\n")}`;
670
- }
671
- function gerarFastApiService(modulo, caminhoContrato) {
672
- const nomeClasse = `${paraPascalCase(descreverEstruturaModulo(modulo.nome).nomeArquivo)}Service`;
673
- const metodos = [
674
- `class ${nomeClasse}:`,
675
- ...(modulo.tasks.length === 0
676
- ? [" pass"]
677
- : modulo.tasks.flatMap((task) => [
678
- ` def ${normalizarNomeParaSimbolo(task.nome)}(self, entrada: ${task.nome}Entrada) -> ${task.nome}Saida:`,
679
- ...(task.implementacoesExternas.length > 0
680
- ? task.implementacoesExternas.map((impl) => ` # impl ${impl.origem}: ${impl.caminho}`)
681
- : [" # TODO: conectar a implementacao real do projeto."]),
682
- ` return executar_${normalizarNomeParaSimbolo(task.nome)}(entrada)`,
683
- "",
684
- ])),
685
- ];
686
- return `${gerarCabecalhoSemaPython(modulo, "service")}${[`from ${caminhoContrato} import *`, "", ...metodos].join("\n")}`;
687
- }
688
- function gerarFastApiRouter(modulo, caminhoSchemas, caminhoService) {
689
- const nomeClasse = `${paraPascalCase(descreverEstruturaModulo(modulo.nome).nomeArquivo)}Service`;
690
- const imports = [
691
- "from fastapi import APIRouter",
692
- `from ${caminhoSchemas} import *`,
693
- `from ${caminhoService} import ${nomeClasse}`,
694
- "",
695
- "router = APIRouter()",
696
- `service = ${nomeClasse}()`,
697
- "",
698
- ];
699
- const rotas = modulo.routes
700
- .filter((route) => route.task)
701
- .map((route) => {
702
- const metodo = (route.metodo ?? "post").toLowerCase();
703
- const schemaEntrada = `${route.nome}EntradaPublicaSchema`;
704
- return `@router.${metodo}(${JSON.stringify(route.caminho ?? "/")})
705
- def ${normalizarNomeParaSimbolo(route.nome)}(entrada: ${schemaEntrada}):
706
- return adaptar_${normalizarNomeParaSimbolo(route.nome)}(${route.inputPublico.length > 0 ? `entrada` : `${schemaEntrada}()`})`;
707
- }).join("\n\n");
708
- return `${gerarCabecalhoSemaPython(modulo, "router")}${imports.join("\n")}${rotas}\n`;
709
- }
710
- function gerarFastApiTests(modulo, caminhoRouter) {
711
- return `${gerarCabecalhoSemaPython(modulo, "teste")}from fastapi.testclient import TestClient
712
- from ${caminhoRouter} import router
713
- from fastapi import FastAPI
714
-
715
- app = FastAPI()
716
- app.include_router(router)
717
- client = TestClient(app)
718
-
719
- def test_scaffold_${normalizarNomeParaSimbolo(descreverEstruturaModulo(modulo.nome).nomeArquivo)}() -> None:
720
- assert client is not None
721
- `;
722
- }
723
- function gerarPythonFastApi(modulo) {
724
- const base = gerarPythonBase(modulo);
725
- const contrato = base.find((arquivo) => arquivo.caminhoRelativo.endsWith(".py") && !path.posix.basename(arquivo.caminhoRelativo).startsWith("test_"));
726
- const testeContrato = base.find((arquivo) => path.posix.basename(arquivo.caminhoRelativo).startsWith("test_"));
727
- const estrutura = descreverEstruturaModulo(modulo.nome);
728
- const contexto = estrutura.contextoRelativo;
729
- const contratoPath = `${contexto ? `${contexto}/` : ""}${estrutura.nomeArquivo}_contract.py`;
730
- const schemasPath = `${contexto ? `${contexto}/` : ""}${estrutura.nomeArquivo}_schemas.py`;
731
- const servicePath = `${contexto ? `${contexto}/` : ""}${estrutura.nomeArquivo}_service.py`;
732
- const routerPath = `${contexto ? `${contexto}/` : ""}${estrutura.nomeArquivo}_router.py`;
733
- const testContractPath = path.posix.join("tests", `${contexto ? `${contexto}/` : ""}test_${estrutura.nomeArquivo}_contract.py`);
734
- const testRouterPath = path.posix.join("tests", `${contexto ? `${contexto}/` : ""}test_${estrutura.nomeArquivo}_router.py`);
735
- const contratoModulo = path.posix.basename(contratoPath, ".py");
736
- const schemasModulo = path.posix.basename(schemasPath, ".py");
737
- const serviceModulo = path.posix.basename(servicePath, ".py");
738
- const routerModulo = path.posix.basename(routerPath, ".py");
739
- return [
740
- {
741
- caminhoRelativo: path.posix.join("app", contratoPath),
742
- conteudo: contrato?.conteudo ?? "# Nenhum contrato base gerado.\n",
743
- },
744
- {
745
- caminhoRelativo: path.posix.join("app", schemasPath),
746
- conteudo: gerarFastApiSchemas(modulo, `.${contratoModulo}`),
747
- },
748
- {
749
- caminhoRelativo: path.posix.join("app", servicePath),
750
- conteudo: gerarFastApiService(modulo, `.${contratoModulo}`),
751
- },
752
- {
753
- caminhoRelativo: path.posix.join("app", routerPath),
754
- conteudo: gerarFastApiRouter(modulo, `.${schemasModulo}`, `.${serviceModulo}`),
755
- },
756
- {
757
- caminhoRelativo: testContractPath,
758
- conteudo: (testeContrato?.conteudo ?? "").replace(`from ${estrutura.nomeBase} import *`, `from app.${(contexto ? `${contexto.replace(/\//g, ".")}.` : "")}${contratoModulo} import *`),
759
- },
760
- {
761
- caminhoRelativo: testRouterPath,
762
- conteudo: gerarFastApiTests(modulo, `app.${(contexto ? `${contexto.replace(/\//g, ".")}.` : "")}${routerModulo}`),
763
- },
764
- ];
765
- }
766
- export function gerarPython(modulo, opcoes = {}) {
767
- if (opcoes.framework === "fastapi") {
768
- return gerarPythonFastApi(modulo);
769
- }
770
- return gerarPythonBase(modulo);
771
- }
1
+ // SEMA-GOVERNED: sema.geradores_codigo_governado
2
+ // Descricao: modulo particionado; consulte contratos/sema/geradores_codigo_governado.sema antes de editar.
3
+ export * from "./index.part01.js";
4
+ export * from "./index.part02.js";
772
5
  //# sourceMappingURL=index.js.map