@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,811 +1,6 @@
1
- import path from "node:path";
2
- import { descreverEstruturaModulo, extrairTiposNomeados, mapearTipoParaTypeScript, normalizarNomeModulo, normalizarNomeParaSimbolo, } from "@sema/padroes";
3
- function gerarInterface(nome, campos) {
4
- const propriedades = campos.length === 0
5
- ? " // Sem campos declarados.\n"
6
- : campos.map((campo) => ` ${campo.nome}${campo.modificadores.includes("required") ? "" : "?"}: ${mapearTipoParaTypeScript(campo.tipo)};`).join("\n");
7
- return `export interface ${nome} {\n${propriedades}\n}\n`;
8
- }
9
- function gerarComentarioInvariantesTypeScript(invariantes) {
10
- if (invariantes.length === 0) {
11
- return "";
12
- }
13
- return `${invariantes.map((invariante) => `// Invariante: ${invariante.textoOriginal}`).join("\n")}\n`;
14
- }
15
- function gerarLiteralCamposTypeScript(campos) {
16
- if (campos.length === 0) {
17
- return "[]";
18
- }
19
- return `[\n${campos.map((campo) => ` { nome: "${campo.nome}", tipo: "${campo.tipo}", obrigatorio: ${campo.modificadores.includes("required") ? "true" : "false"} },`).join("\n")}\n]`;
20
- }
21
- function coletarTiposExternos(modulo) {
22
- const locais = new Set([
23
- ...modulo.types.map((item) => item.nome),
24
- ...modulo.entities.map((item) => item.nome),
25
- ...modulo.enums.map((item) => item.nome),
26
- ]);
27
- const referenciados = new Set();
28
- const campos = [
29
- ...modulo.entities.flatMap((entity) => entity.campos),
30
- ...modulo.tasks.flatMap((task) => [...task.input, ...task.output]),
31
- ...modulo.routes.flatMap((route) => [...route.inputPublico, ...route.outputPublico]),
32
- ...modulo.states.flatMap((state) => state.campos),
33
- ];
34
- for (const campo of campos) {
35
- for (const tipo of extrairTiposNomeados(campo.tipo)) {
36
- if (!locais.has(tipo)) {
37
- referenciados.add(tipo);
38
- }
39
- }
40
- }
41
- return [...referenciados].sort((a, b) => a.localeCompare(b, "pt-BR"));
42
- }
43
- function gerarLiteralErrosTypeScript(erros) {
44
- const entradas = Object.entries(erros);
45
- if (entradas.length === 0) {
46
- return "{}";
47
- }
48
- return `{\n${entradas.map(([nome, mensagem]) => ` ${JSON.stringify(nome)}: ${JSON.stringify(mensagem)},`).join("\n")}\n}`;
49
- }
50
- function formatarValorTypeScript(valor, camposConhecidos, variavel) {
51
- const texto = valor.trim();
52
- if (/^-?\d+(?:\.\d+)?$/.test(texto)) {
53
- return texto;
54
- }
55
- if (texto === "verdadeiro") {
56
- return "true";
57
- }
58
- if (texto === "falso") {
59
- return "false";
60
- }
61
- if (texto === "nulo") {
62
- return "null";
63
- }
64
- if (camposConhecidos.has(texto.split(".")[0] ?? texto)) {
65
- return `${variavel}.${texto}`;
66
- }
67
- return JSON.stringify(texto);
68
- }
69
- function resolverReferenciaTypeScript(referencia, variavel) {
70
- return `${variavel}.${referencia}`;
71
- }
72
- function gerarExpressaoTypeScript(expressao, camposConhecidos, variavel) {
73
- switch (expressao.tipo) {
74
- case "existe":
75
- return `(${resolverReferenciaTypeScript(expressao.alvo, variavel)} !== undefined && ${resolverReferenciaTypeScript(expressao.alvo, variavel)} !== null)`;
76
- case "comparacao":
77
- return `(${resolverReferenciaTypeScript(expressao.alvo, variavel)} ${expressao.operador} ${formatarValorTypeScript(expressao.valor, camposConhecidos, variavel)})`;
78
- case "pertencimento":
79
- return `([${(expressao.valores ?? []).map((valor) => formatarValorTypeScript(valor, camposConhecidos, variavel)).join(", ")}].includes(${resolverReferenciaTypeScript(expressao.alvo, variavel)}))`;
80
- case "predicado":
81
- return "true";
82
- case "composta":
83
- return `(${expressao.termos.map((termo) => gerarExpressaoTypeScript(termo, camposConhecidos, variavel)).join(expressao.operadorLogico === "e" ? " && " : " || ")})`;
84
- case "negacao":
85
- return `(!${gerarExpressaoTypeScript(expressao.termo, camposConhecidos, variavel)})`;
86
- }
87
- }
88
- function valorPadraoTypeScript(tipo, nomeCampo) {
89
- switch (tipo) {
90
- case "Texto":
91
- case "Id":
92
- case "Email":
93
- case "Url":
94
- return JSON.stringify(`${nomeCampo}_exemplo`);
95
- case "Numero":
96
- case "Inteiro":
97
- case "Decimal":
98
- return "1";
99
- case "Booleano":
100
- return "false";
101
- case "Json":
102
- return "{}";
103
- default:
104
- return "{} as any";
105
- }
106
- }
107
- function removerAspasExternas(valor) {
108
- const texto = valor.trim();
109
- if ((texto.startsWith("\"") && texto.endsWith("\""))
110
- || (texto.startsWith("'") && texto.endsWith("'"))) {
111
- return texto.slice(1, -1);
112
- }
113
- return texto;
114
- }
115
- function dividirLiteralNoNivelRaiz(valor, separador) {
116
- const partes = [];
117
- let atual = "";
118
- let profundidadeAngular = 0;
119
- let profundidadeLista = 0;
120
- let profundidadeMapa = 0;
121
- let aspas = null;
122
- for (let indice = 0; indice < valor.length; indice += 1) {
123
- const caractere = valor[indice];
124
- const anterior = indice > 0 ? valor[indice - 1] : "";
125
- if (aspas) {
126
- atual += caractere;
127
- if (caractere === aspas && anterior !== "\\") {
128
- aspas = null;
129
- }
130
- continue;
131
- }
132
- if (caractere === "\"" || caractere === "'") {
133
- aspas = caractere;
134
- atual += caractere;
135
- continue;
136
- }
137
- if (caractere === "<") {
138
- profundidadeAngular += 1;
139
- atual += caractere;
140
- continue;
141
- }
142
- if (caractere === ">") {
143
- profundidadeAngular = Math.max(0, profundidadeAngular - 1);
144
- atual += caractere;
145
- continue;
146
- }
147
- if (caractere === "[") {
148
- profundidadeLista += 1;
149
- atual += caractere;
150
- continue;
151
- }
152
- if (caractere === "]") {
153
- profundidadeLista = Math.max(0, profundidadeLista - 1);
154
- atual += caractere;
155
- continue;
156
- }
157
- if (caractere === "{") {
158
- profundidadeMapa += 1;
159
- atual += caractere;
160
- continue;
161
- }
162
- if (caractere === "}") {
163
- profundidadeMapa = Math.max(0, profundidadeMapa - 1);
164
- atual += caractere;
165
- continue;
166
- }
167
- if (caractere === separador
168
- && profundidadeAngular === 0
169
- && profundidadeLista === 0
170
- && profundidadeMapa === 0) {
171
- if (atual.trim()) {
172
- partes.push(atual.trim());
173
- }
174
- atual = "";
175
- continue;
176
- }
177
- atual += caractere;
178
- }
179
- if (atual.trim()) {
180
- partes.push(atual.trim());
181
- }
182
- return partes;
183
- }
184
- function resolverTipoItemTeste(tipoDeclarado) {
185
- const tipo = (tipoDeclarado ?? "").trim();
186
- if (!tipo) {
187
- return undefined;
188
- }
189
- if (tipo.endsWith("[]")) {
190
- return tipo.slice(0, -2).trim();
191
- }
192
- const lista = tipo.match(/^Lista<(.+)>$/);
193
- if (lista?.[1]) {
194
- return lista[1].trim();
195
- }
196
- return undefined;
197
- }
198
- function formatarLiteralTesteTypeScript(valor, tipoDeclarado) {
199
- const bruto = valor.trim();
200
- if (bruto.startsWith("[") && bruto.endsWith("]")) {
201
- const interior = bruto.slice(1, -1).trim();
202
- const tipoItem = resolverTipoItemTeste(tipoDeclarado);
203
- if (!interior) {
204
- return [];
205
- }
206
- return dividirLiteralNoNivelRaiz(interior, ",").map((item) => formatarLiteralTesteTypeScript(item, tipoItem));
207
- }
208
- if (bruto.startsWith("{") && bruto.endsWith("}")) {
209
- const interior = bruto.slice(1, -1).trim();
210
- if (!interior) {
211
- return {};
212
- }
213
- const literal = {};
214
- for (const par of dividirLiteralNoNivelRaiz(interior, ",")) {
215
- const [chaveBruta, ...valorBruto] = dividirLiteralNoNivelRaiz(par, ":");
216
- if (!chaveBruta || valorBruto.length === 0) {
217
- continue;
218
- }
219
- literal[removerAspasExternas(chaveBruta)] = formatarLiteralTesteTypeScript(valorBruto.join(":"));
220
- }
221
- return literal;
222
- }
223
- const texto = removerAspasExternas(bruto);
224
- if (["Texto", "Id", "Email", "Url"].includes(tipoDeclarado ?? "")) {
225
- return texto;
226
- }
227
- if (["Numero", "Inteiro", "Decimal"].includes(tipoDeclarado ?? "") && /^-?\d+(?:\.\d+)?$/.test(texto)) {
228
- return Number(texto);
229
- }
230
- if ((tipoDeclarado ?? "") === "Booleano") {
231
- if (texto === "verdadeiro") {
232
- return true;
233
- }
234
- if (texto === "falso") {
235
- return false;
236
- }
237
- }
238
- if (/^-?\d+(?:\.\d+)?$/.test(texto)) {
239
- return Number(texto);
240
- }
241
- if (texto === "verdadeiro") {
242
- return true;
243
- }
244
- if (texto === "falso") {
245
- return false;
246
- }
247
- if (texto === "nulo") {
248
- return null;
249
- }
250
- return texto;
251
- }
252
- function converterBlocoTesteParaValorTypeScript(bloco, tiposDeclarados) {
253
- const literal = {};
254
- for (const campo of bloco.campos) {
255
- literal[campo.nome] = formatarLiteralTesteTypeScript(campo.tipo, tiposDeclarados?.get(campo.nome));
256
- }
257
- for (const subbloco of bloco.blocos) {
258
- literal[subbloco.nome] = converterBlocoTesteParaValorTypeScript(subbloco.conteudo);
259
- }
260
- return literal;
261
- }
262
- function gerarPreparacaoSaida(task) {
263
- const camposSaida = new Set(task.output.map((campo) => campo.nome));
264
- const linhas = [];
265
- for (const campo of task.output) {
266
- linhas.push(` ${campo.nome}: ${valorPadraoTypeScript(campo.tipo, campo.nome)},`);
267
- }
268
- const ajustes = [];
269
- for (const garantia of task.garantiasEstruturadas) {
270
- if (garantia.tipo === "pertencimento" && garantia.valores && camposSaida.has(garantia.alvo)) {
271
- ajustes.push(` saida.${garantia.alvo} = ${formatarValorTypeScript(garantia.valores[0] ?? "", camposSaida, "saida")} as any;`);
272
- }
273
- if (garantia.tipo === "comparacao" && garantia.valor && camposSaida.has(garantia.alvo.split(".")[0] ?? garantia.alvo)) {
274
- ajustes.push(` ${resolverReferenciaTypeScript(garantia.alvo, "saida")} = ${formatarValorTypeScript(garantia.valor, camposSaida, "saida")} as any;`);
275
- }
276
- if (garantia.tipo === "existe" && garantia.alvo.includes(".")) {
277
- const [raiz, filho] = garantia.alvo.split(".", 2);
278
- if (raiz && filho && camposSaida.has(raiz)) {
279
- ajustes.push(` saida.${raiz} = (saida.${raiz} ?? {}) as any;`);
280
- ajustes.push(` (saida.${raiz} as any).${filho} = (saida.${raiz} as any).${filho} ?? "valor_garantido";`);
281
- }
282
- }
283
- }
284
- return ` const saida = {\n${linhas.join("\n")}\n } as ${task.nome}Saida;\n${ajustes.join("\n")}`;
285
- }
286
- function gerarValidacoes(task) {
287
- const linhas = [];
288
- const camposEntrada = new Set(task.input.map((campo) => campo.nome));
289
- for (const campo of task.input) {
290
- if (campo.modificadores.includes("required")) {
291
- linhas.push(` if (entrada.${campo.nome} === undefined || entrada.${campo.nome} === null) throw new Error("Campo obrigatorio ausente: ${campo.nome}");`);
292
- }
293
- }
294
- for (const regra of task.regrasEstruturadas) {
295
- switch (regra.tipo) {
296
- case "predicado":
297
- linhas.push(` // Predicado declarado em Sema: ${regra.textoOriginal}`);
298
- break;
299
- default:
300
- linhas.push(` if (!${gerarExpressaoTypeScript(regra, camposEntrada, "entrada")}) throw new Error("Regra violada: ${regra.textoOriginal}");`);
301
- break;
302
- }
303
- }
304
- for (const regra of task.rules.filter((regra) => !task.regrasEstruturadas.some((estruturada) => estruturada.textoOriginal === regra))) {
305
- linhas.push(` // Regra declarada em Sema: ${regra}`);
306
- }
307
- return linhas.join("\n");
308
- }
309
- function gerarGarantias(task) {
310
- return ` verificar_garantias_${normalizarNomeParaSimbolo(task.nome)}(saida);\n return saida;`;
311
- }
312
- function gerarFuncaoGarantias(task) {
313
- const camposSaida = new Set(task.output.map((campo) => campo.nome));
314
- const linhas = [];
315
- for (const garantia of task.garantiasEstruturadas) {
316
- switch (garantia.tipo) {
317
- case "predicado":
318
- linhas.push(` // Predicado de garantia declarado em Sema: ${garantia.textoOriginal}`);
319
- break;
320
- default:
321
- linhas.push(` if (!${gerarExpressaoTypeScript(garantia, camposSaida, "saida")}) throw new Error("Garantia violada: ${garantia.textoOriginal}");`);
322
- break;
323
- }
324
- }
325
- for (const garantia of task.guarantees.filter((texto) => !task.garantiasEstruturadas.some((estruturada) => estruturada.textoOriginal === texto))) {
326
- linhas.push(` // Garantia declarada em Sema: ${garantia}`);
327
- }
328
- if (linhas.length === 0) {
329
- linhas.push(" // Nenhuma garantia declarada.");
330
- }
331
- return `export function verificar_garantias_${normalizarNomeParaSimbolo(task.nome)}(saida: ${task.nome}Saida): void {\n${linhas.join("\n")}\n}\n`;
332
- }
333
- function gerarMetadadosTask(task) {
334
- const efeitos = task.efeitosEstruturados.length === 0
335
- ? "[]"
336
- : `[\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]`;
337
- const implementacoes = task.implementacoesExternas.length === 0
338
- ? "[]"
339
- : `[\n${task.implementacoesExternas.map((impl) => ` { origem: "${impl.origem}", caminho: "${impl.caminho}", resolucaoImpl: "${impl.resolucaoImpl ?? impl.caminho}", statusImpl: "${impl.statusImpl ?? "nao_verificado"}" },`).join("\n")}\n]`;
340
- return `export const contrato_${normalizarNomeParaSimbolo(task.nome)} = {
341
- nome: "${task.nome}",
342
- input: ${gerarLiteralCamposTypeScript(task.input)},
343
- output: ${gerarLiteralCamposTypeScript(task.output)},
344
- effects: ${efeitos},
345
- impl: ${implementacoes},
346
- errors: ${gerarLiteralErrosTypeScript(task.errors)},
347
- guarantees: ${JSON.stringify(task.guarantees, null, 2)},
348
- } as const;
349
- `;
350
- }
351
- function gerarMapeamentoSaidaPublicaTypeScript(nomeVariavel, campos) {
352
- if (campos.length === 0) {
353
- return "{}";
354
- }
355
- return `{\n${campos.map((campo) => ` ${campo.nome}: ${nomeVariavel}.${campo.nome},`).join("\n")}\n }`;
356
- }
357
- function gerarRotas(modulo) {
358
- const rotasComTask = modulo.routes.filter((route) => route.task);
359
- if (rotasComTask.length === 0) {
360
- return "";
361
- }
362
- return rotasComTask.map((route) => {
363
- const taskAssociada = modulo.tasks.find((task) => task.nome === route.task);
364
- if (!taskAssociada) {
365
- return "";
366
- }
367
- const nomeSimboloRoute = normalizarNomeParaSimbolo(route.nome);
368
- const nomeSimboloTask = normalizarNomeParaSimbolo(taskAssociada.nome);
369
- const uniaoErros = route.errosPublicos.length === 0
370
- ? "never"
371
- : route.errosPublicos.map((erro) => JSON.stringify(erro.nome)).join(" | ");
372
- const efeitosPublicos = route.efeitosPublicos.length === 0
373
- ? "[]"
374
- : `[\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]`;
375
- const verificacoesErro = route.errosPublicos.map((erro) => ` if (erro instanceof ${taskAssociada.nome}_${erro.nome}Erro) {
376
- return { sucesso: false, erro: { codigo: "${erro.nome}" as ${route.nome}ErroPublico, mensagem: ${JSON.stringify(erro.mensagem ?? taskAssociada.errors[erro.nome] ?? `Erro publico ${erro.nome}`)} } };
377
- }`).join("\n");
378
- return `
379
- ${gerarInterface(`${route.nome}EntradaPublica`, route.inputPublico)}
380
- ${gerarInterface(`${route.nome}SaidaPublica`, route.outputPublico)}
381
- export type ${route.nome}ErroPublico = ${uniaoErros};
382
- export type ${route.nome}RespostaPublica =
383
- | { sucesso: true; dados: ${route.nome}SaidaPublica }
384
- | { sucesso: false; erro: { codigo: ${route.nome}ErroPublico; mensagem: string } };
385
-
386
- export const contrato_publico_${nomeSimboloRoute} = {
387
- nome: "${route.nome}",
388
- metodo: ${JSON.stringify(route.metodo ?? null)},
389
- caminho: ${JSON.stringify(route.caminho ?? null)},
390
- task: ${JSON.stringify(route.task ?? null)},
391
- input: ${gerarLiteralCamposTypeScript(route.inputPublico)},
392
- output: ${gerarLiteralCamposTypeScript(route.outputPublico)},
393
- effects: ${efeitosPublicos},
394
- guarantees: ${JSON.stringify(route.garantiasPublicasMinimas, null, 2)},
395
- errors: ${route.errosPublicos.length === 0 ? "[]" : `[\n${route.errosPublicos.map((erro) => ` { nome: "${erro.nome}", mensagem: ${JSON.stringify(erro.mensagem ?? taskAssociada.errors[erro.nome] ?? "")} },`).join("\n")}\n]`},
396
- } as const;
397
-
398
- export function verificar_resposta_publica_${nomeSimboloRoute}(dados: ${route.nome}SaidaPublica): void {
399
- ${route.outputPublico.length === 0
400
- ? " // Route sem campos publicos obrigatorios."
401
- : route.outputPublico.map((campo) => campo.modificadores.includes("required")
402
- ? ` if (dados.${campo.nome} === undefined || dados.${campo.nome} === null) throw new Error("Resposta publica invalida: campo obrigatorio ausente ${campo.nome}");`
403
- : ` // Campo publico opcional: ${campo.nome}`).join("\n")}
404
- }
405
-
406
- export async function adaptar_${nomeSimboloRoute}(requisicao: ${route.nome}EntradaPublica): Promise<${route.nome}RespostaPublica> {
407
- try {
408
- const saida = await executar_${nomeSimboloTask}(requisicao as ${taskAssociada.nome}Entrada);
409
- const dados = ${gerarMapeamentoSaidaPublicaTypeScript("saida", route.outputPublico)} as ${route.nome}SaidaPublica;
410
- verificar_resposta_publica_${nomeSimboloRoute}(dados);
411
- return {
412
- sucesso: true,
413
- dados,
414
- };
415
- } catch (erro) {
416
- ${verificacoesErro || " throw erro;"}
417
- throw erro;
418
- }
419
- }
420
- `;
421
- }).join("\n");
422
- }
423
- function gerarTask(task) {
424
- const nomeSimbolo = normalizarNomeParaSimbolo(task.nome);
425
- const entradaNome = `${nomeSimbolo}_entrada`;
426
- const saidaNome = `${nomeSimbolo}_saida`;
427
- const errosMapeados = new Map(Object.entries(task.errors));
428
- for (const caso of task.tests) {
429
- const tipoErro = caso.error?.campos.find((campo) => campo.nome === "tipo")?.tipo ?? caso.error?.campos[0]?.tipo;
430
- if (tipoErro && !errosMapeados.has(tipoErro)) {
431
- errosMapeados.set(tipoErro, `Erro sintetico gerado a partir do caso de teste "${caso.nome}".`);
432
- }
433
- }
434
- const erros = [...errosMapeados.entries()];
435
- const erroAutenticacao = erros.find(([nomeErro]) => nomeErro.includes("autentic"))?.[0];
436
- const erroAutorizacao = erros.find(([nomeErro]) => nomeErro.includes("acesso_negado") || nomeErro.includes("autoriz"))?.[0];
437
- return `
438
- ${gerarInterface(`${task.nome}Entrada`, task.input)}
439
- ${gerarInterface(`${task.nome}Saida`, task.output)}
440
- export type ${task.nome}Erro = ${erros.length === 0 ? "never" : erros.map(([erro]) => `"${erro}"`).join(" | ")};
441
- ${erros.map(([nomeErro, mensagem]) => `export class ${task.nome}_${nomeErro}Erro extends Error {\n readonly codigo = "${nomeErro}";\n constructor() {\n super(${JSON.stringify(mensagem)});\n this.name = "${task.nome}_${nomeErro}Erro";\n }\n}\n`).join("\n")}
442
- export interface ${task.nome}ContextoExecucao {
443
- autenticado?: boolean;
444
- autorizado?: boolean;
445
- erroEsperado?: ${task.nome}Erro | null;
446
- }
447
-
448
- function normalizar_contexto_${nomeSimbolo}(contexto: ${task.nome}ContextoExecucao = {}): Required<${task.nome}ContextoExecucao> {
449
- return {
450
- autenticado: contexto.autenticado ?? true,
451
- autorizado: contexto.autorizado ?? true,
452
- erroEsperado: contexto.erroEsperado ?? null,
453
- };
454
- }
455
-
456
- function criar_erro_${nomeSimbolo}(codigo: ${task.nome}Erro): Error {
457
- switch (codigo) {
458
- ${erros.map(([nomeErro]) => ` case "${nomeErro}":\n return new ${task.nome}_${nomeErro}Erro();`).join("\n")}
459
- default:
460
- return new Error(\`Erro sintetico nao mapeado para ${task.nome}: \${codigo as string}\`);
461
- }
462
- }
463
-
464
- ${gerarMetadadosTask(task)}
465
-
466
- export function validar_${nomeSimbolo}(entrada: ${task.nome}Entrada): void {
467
- ${gerarValidacoes(task)}
468
- }
469
-
470
- ${gerarFuncaoGarantias(task)}
471
-
472
- export async function executar_${nomeSimbolo}(entrada: ${task.nome}Entrada, contexto: ${task.nome}ContextoExecucao = {}): Promise<${task.nome}Saida> {
473
- const contextoExecucao = normalizar_contexto_${nomeSimbolo}(contexto);
474
- const erroEsperado = contextoExecucao.erroEsperado as ${task.nome}Erro | null;
475
- ${erroAutenticacao ? ` if (contextoExecucao.erroEsperado === "${erroAutenticacao}" || (${JSON.stringify(task.auth.modo ?? "")} === "obrigatorio" && !contextoExecucao.autenticado)) {\n throw new ${task.nome}_${erroAutenticacao}Erro();\n }` : ""}
476
- ${erroAutorizacao ? ` if (contextoExecucao.erroEsperado === "${erroAutorizacao}" || (${task.authz.explicita ? "!contextoExecucao.autorizado" : "false"})) {\n throw new ${task.nome}_${erroAutorizacao}Erro();\n }` : ""}
477
- if (erroEsperado${erroAutenticacao || erroAutorizacao ? ` && ![${[erroAutenticacao, erroAutorizacao].filter(Boolean).map((erro) => JSON.stringify(erro)).join(", ")}].includes(erroEsperado)` : ""}) {
478
- throw criar_erro_${nomeSimbolo}(erroEsperado);
479
- }
480
- validar_${nomeSimbolo}(entrada);
481
- ${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"}` : ""}
482
- ${task.implementacoesExternas.length > 0 ? ` // Implementacoes externas vinculadas:\n${task.implementacoesExternas.map((impl) => ` // - ${impl.origem}: ${impl.caminho} [${impl.statusImpl ?? "nao_verificado"}]`).join("\n")}` : ""}
483
- // Efeitos declarados:
484
- ${task.efeitosEstruturados.map((efeito) => ` // - categoria=${efeito.categoria} alvo=${efeito.alvo}${efeito.detalhe ? ` detalhe=${efeito.detalhe}` : ""}${efeito.criticidade ? ` criticidade=${efeito.criticidade}` : ""}`).join("\n") || task.effects.map((efeito) => ` // - ${efeito}`).join("\n") || " // - Nenhum efeito declarado."}
485
- ${gerarPreparacaoSaida(task)}
486
- ${gerarGarantias(task)}
487
- }
488
-
489
- export const ${entradaNome} = {} as ${task.nome}Entrada;
490
- export const ${saidaNome} = {} as ${task.nome}Saida;
491
- `;
492
- }
493
- function gerarTestes(modulo) {
494
- const classesErro = modulo.tasks.flatMap((task) => {
495
- const nomes = new Set(Object.keys(task.errors));
496
- for (const caso of task.tests) {
497
- const tipoErro = caso.error?.campos.find((campo) => campo.nome === "tipo")?.tipo ?? caso.error?.campos[0]?.tipo;
498
- if (tipoErro) {
499
- nomes.add(tipoErro);
500
- }
501
- }
502
- return [...nomes].map((nomeErro) => `${task.nome}_${nomeErro}Erro`);
503
- });
504
- const linhas = [
505
- 'import test from "node:test";',
506
- 'import assert from "node:assert/strict";',
507
- `import { ${[...modulo.tasks.map((task) => `executar_${normalizarNomeParaSimbolo(task.nome)}`), ...classesErro].join(", ")} } from "./${normalizarNomeModulo(modulo.nome).replace(/\./g, "_")}.ts";`,
508
- ];
509
- for (const task of modulo.tasks) {
510
- const nomeFuncao = `executar_${normalizarNomeParaSimbolo(task.nome)}`;
511
- const tiposEntrada = new Map(task.input.map((campo) => [campo.nome, campo.tipo]));
512
- for (const caso of task.tests) {
513
- const entrada = converterBlocoTesteParaValorTypeScript(caso.given, tiposEntrada);
514
- const tipoErro = caso.error?.campos.find((campo) => campo.nome === "tipo")?.tipo ?? caso.error?.campos[0]?.tipo;
515
- if (tipoErro) {
516
- const contextoLinhas = [`erroEsperado: ${JSON.stringify(tipoErro)}`];
517
- if (tipoErro.includes("autentic")) {
518
- contextoLinhas.push("autenticado: false", "autorizado: false");
519
- }
520
- else if (tipoErro.includes("acesso_negado") || tipoErro.includes("autoriz")) {
521
- contextoLinhas.push("autenticado: true", "autorizado: false");
522
- }
523
- linhas.push(`
524
- test("${task.nome} :: ${caso.nome}", async () => {
525
- const entrada = ${JSON.stringify(entrada, null, 2)};
526
- const contexto = {
527
- ${contextoLinhas.join(",\n ")}
528
- } as const;
529
- await assert.rejects(() => ${nomeFuncao}(entrada as any, contexto), ${task.nome}_${tipoErro}Erro);
530
- });
531
- `);
532
- continue;
533
- }
534
- linhas.push(`
535
- test("${task.nome} :: ${caso.nome}", async () => {
536
- const entrada = ${JSON.stringify(entrada, null, 2)};
537
- const resultado = await ${nomeFuncao}(entrada as any);
538
- assert.ok(resultado !== undefined);
539
- });
540
- `);
541
- }
542
- }
543
- return linhas.join("\n");
544
- }
545
- function gerarCabecalhoSemaTypeScript(modulo, tipo = "contrato") {
546
- const descricoes = {
547
- contrato: "artefato TypeScript gerado para executar e revisar as regras declaradas no contrato Sema.",
548
- teste: "testes TypeScript gerados a partir dos casos do contrato Sema.",
549
- dto: "DTOs NestJS derivados do contrato Sema para transportar entrada e saída públicas.",
550
- service: "service NestJS que conecta o scaffold do framework às tasks governadas pelo contrato Sema.",
551
- controller: "controller NestJS derivado das routes públicas declaradas no contrato Sema.",
552
- spec: "teste NestJS mínimo para manter o scaffold governado verificável.",
553
- };
554
- return [
555
- "// SEMA-GOVERNED",
556
- `// Módulo de origem: ${modulo.nome}`,
557
- "// Consulte o contrato .sema aplicável antes de editar este arquivo.",
558
- "// Para IA fraca/média/forte: chame Sema, rode docs-impacto e drift antes de alterar código.",
559
- `// Descrição: ${descricoes[tipo]}`,
560
- "",
561
- ].join("\n");
562
- }
563
- function gerarTypeScriptBase(modulo) {
564
- const nomeBase = normalizarNomeModulo(modulo.nome).replace(/\./g, "_");
565
- const interoperabilidades = modulo.interoperabilidades
566
- .map((interop) => `// Interop externo ${interop.origem}: ${interop.caminho}`)
567
- .join("\n");
568
- const tiposExternos = coletarTiposExternos(modulo)
569
- .map((tipo) => `export type ${tipo} = any; // Tipo externo referenciado por use ou por contrato compartilhado.\n`)
570
- .join("\n");
571
- const entidades = modulo.entities
572
- .map((entity) => `${gerarComentarioInvariantesTypeScript(entity.invariantes)}${gerarInterface(entity.nome, entity.campos)}`)
573
- .join("\n");
574
- const tipos = modulo.types
575
- .map((type) => `${gerarComentarioInvariantesTypeScript(type.invariantes)}${gerarInterface(type.nome, type.definicao.campos)}`)
576
- .join("\n");
577
- const enums = modulo.enums
578
- .map((enumeracao) => `export type ${enumeracao.nome} = ${enumeracao.valores.map((valor) => `"${valor}"`).join(" | ")};\n`)
579
- .join("\n");
580
- const states = modulo.states
581
- .map((state) => `// State${state.nome ? ` ${state.nome}` : ""}: campos=${state.campos.length} invariantes=${state.invariantes.length} transicoes=${state.transicoes.length}`)
582
- .join("\n");
583
- const flows = modulo.flows
584
- .map((flow) => `// Flow ${flow.nome}: etapas=${flow.linhas.length} estruturadas=${flow.etapasEstruturadas.length} tasks=${flow.tasksReferenciadas.join(", ") || flow.etapasEstruturadas.map((etapa) => etapa.task).filter(Boolean).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"}`)
585
- .join("\n");
586
- const routes = modulo.routes
587
- .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}`)
588
- .join("\n");
589
- const tasks = modulo.tasks.map(gerarTask).join("\n");
590
- const contratosPublicos = gerarRotas(modulo);
591
- const codigo = `${gerarCabecalhoSemaTypeScript(modulo)}${interoperabilidades ? `${interoperabilidades}\n` : ""}\n${tiposExternos}\n${tipos}\n${entidades}\n${enums}\n${states}\n${flows}\n${routes}\n${tasks}\n${contratosPublicos}\n`;
592
- const testes = `${gerarCabecalhoSemaTypeScript(modulo, "teste")}${gerarTestes(modulo)}`;
593
- return [
594
- { caminhoRelativo: `${nomeBase}.ts`, conteudo: codigo },
595
- { caminhoRelativo: `${nomeBase}.test.ts`, conteudo: testes },
596
- ];
597
- }
598
- function paraPascalCase(valor) {
599
- return valor
600
- .split(/[^A-Za-z0-9]+/)
601
- .filter(Boolean)
602
- .map((parte) => parte[0].toUpperCase() + parte.slice(1))
603
- .join("");
604
- }
605
- function limparPrefixoRota(caminho) {
606
- return (caminho ?? "/").replace(/^\/+/, "").replace(/\/+$/, "");
607
- }
608
- function gerarNestJsDtos(modulo, caminhoContrato) {
609
- const tiposReferenciados = new Set();
610
- const registrarTipos = (campos) => {
611
- for (const campo of campos) {
612
- for (const tipo of extrairTiposNomeados(campo.tipo)) {
613
- tiposReferenciados.add(tipo);
614
- }
615
- }
616
- };
617
- for (const task of modulo.tasks) {
618
- registrarTipos(task.input);
619
- registrarTipos(task.output);
620
- }
621
- for (const route of modulo.routes) {
622
- registrarTipos(route.inputPublico);
623
- registrarTipos(route.outputPublico);
624
- }
625
- const linhas = [];
626
- if (tiposReferenciados.size > 0) {
627
- linhas.push(`import type { ${[...tiposReferenciados].sort((a, b) => a.localeCompare(b, "pt-BR")).join(", ")} } from "${caminhoContrato}";`);
628
- linhas.push("");
629
- }
630
- const gerarClasseDto = (nomeClasse, campos) => {
631
- linhas.push(`export class ${nomeClasse} {`);
632
- if (campos.length === 0) {
633
- linhas.push(" // Sem campos declarados.");
634
- }
635
- else {
636
- for (const campo of campos) {
637
- linhas.push(` ${campo.nome}${campo.modificadores.includes("required") ? "!" : "?"}: ${mapearTipoParaTypeScript(campo.tipo)};`);
638
- }
639
- }
640
- linhas.push("}");
641
- linhas.push("");
642
- };
643
- for (const task of modulo.tasks) {
644
- gerarClasseDto(`${paraPascalCase(task.nome)}EntradaDto`, task.input);
645
- gerarClasseDto(`${paraPascalCase(task.nome)}SaidaDto`, task.output);
646
- }
647
- for (const route of modulo.routes) {
648
- gerarClasseDto(`${paraPascalCase(route.nome)}EntradaPublicaDto`, route.inputPublico);
649
- gerarClasseDto(`${paraPascalCase(route.nome)}SaidaPublicaDto`, route.outputPublico);
650
- }
651
- return `${gerarCabecalhoSemaTypeScript(modulo, "dto")}${linhas.join("\n").trim()}\n`;
652
- }
653
- function gerarNestJsService(modulo, caminhoContrato) {
654
- const nomeClasse = `${paraPascalCase(descreverEstruturaModulo(modulo.nome).nomeArquivo)}Service`;
655
- const imports = [
656
- `import { Injectable } from "@nestjs/common";`,
657
- `import {`,
658
- ...modulo.tasks.flatMap((task) => [` executar_${normalizarNomeParaSimbolo(task.nome)},`, ` type ${task.nome}Entrada,`, ` type ${task.nome}Saida,`]),
659
- ...modulo.routes.flatMap((route) => route.task ? [
660
- ` adaptar_${normalizarNomeParaSimbolo(route.nome)},`,
661
- ` type ${route.nome}EntradaPublica,`,
662
- ` type ${route.nome}RespostaPublica,`,
663
- ] : []),
664
- `} from "${caminhoContrato}";`,
665
- ];
666
- const metodosTask = modulo.tasks.map((task) => ` async ${normalizarNomeParaSimbolo(task.nome)}(entrada: ${task.nome}Entrada): Promise<${task.nome}Saida> {
667
- ${task.implementacoesExternas.length > 0 ? task.implementacoesExternas.map((impl) => ` // impl ${impl.origem}: ${impl.caminho}`).join("\n") : " // TODO: ajustar a implementacao real e preencher dependencias do framework."}
668
- return executar_${normalizarNomeParaSimbolo(task.nome)}(entrada);
669
- }`).join("\n\n");
670
- const metodosRota = modulo.routes
671
- .filter((route) => route.task)
672
- .map((route) => ` async ${normalizarNomeParaSimbolo(route.nome)}(entrada: ${route.nome}EntradaPublica): Promise<${route.nome}RespostaPublica> {
673
- return adaptar_${normalizarNomeParaSimbolo(route.nome)}(entrada);
674
- }`).join("\n\n");
675
- return `${gerarCabecalhoSemaTypeScript(modulo, "service")}${imports.join("\n")}
676
-
677
- @Injectable()
678
- export class ${nomeClasse} {
679
- ${metodosTask}${metodosTask && metodosRota ? "\n\n" : ""}${metodosRota}
680
- }
681
- `;
682
- }
683
- function gerarNestJsController(modulo, caminhoDto, caminhoService) {
684
- const nomeArquivo = descreverEstruturaModulo(modulo.nome).nomeArquivo;
685
- const nomeClasse = `${paraPascalCase(nomeArquivo)}Controller`;
686
- const nomeService = `${paraPascalCase(nomeArquivo)}Service`;
687
- const decoratorsImport = new Set(["Controller"]);
688
- const metodos = modulo.routes
689
- .filter((route) => route.task)
690
- .map((route) => {
691
- const metodo = (route.metodo ?? "POST").toUpperCase();
692
- if (metodo === "GET") {
693
- decoratorsImport.add("Get");
694
- }
695
- else if (metodo === "PUT") {
696
- decoratorsImport.add("Put");
697
- }
698
- else if (metodo === "PATCH") {
699
- decoratorsImport.add("Patch");
700
- }
701
- else if (metodo === "DELETE") {
702
- decoratorsImport.add("Delete");
703
- }
704
- else {
705
- decoratorsImport.add("Post");
706
- }
707
- if ((route.inputPublico ?? []).length > 0) {
708
- decoratorsImport.add("Body");
709
- }
710
- const decorator = metodo === "GET" ? "Get" : metodo === "PUT" ? "Put" : metodo === "PATCH" ? "Patch" : metodo === "DELETE" ? "Delete" : "Post";
711
- const caminhoDecorador = limparPrefixoRota(route.caminho);
712
- const bodyArg = route.inputPublico.length > 0
713
- ? `@Body() entrada: ${paraPascalCase(route.nome)}EntradaPublicaDto`
714
- : "";
715
- const tipoResposta = `${route.nome}RespostaPublica`;
716
- return ` @${decorator}(${JSON.stringify(caminhoDecorador)})
717
- async ${normalizarNomeParaSimbolo(route.nome)}(${bodyArg}): Promise<${tipoResposta}> {
718
- return this.service.${normalizarNomeParaSimbolo(route.nome)}(${route.inputPublico.length > 0 ? "entrada" : "{}"});
719
- }`;
720
- }).join("\n\n");
721
- const dtosImportados = [...new Set(modulo.routes
722
- .filter((route) => route.task && route.inputPublico.length > 0)
723
- .map((route) => `${paraPascalCase(route.nome)}EntradaPublicaDto`))];
724
- const contratosImportados = [...new Set(modulo.routes
725
- .filter((route) => route.task)
726
- .map((route) => `type ${route.nome}RespostaPublica`))];
727
- return `${gerarCabecalhoSemaTypeScript(modulo, "controller")}import { ${[...decoratorsImport].join(", ")} } from "@nestjs/common";
728
- import { ${nomeService} } from "${caminhoService}";
729
- ${dtosImportados.length > 0 ? `import { ${dtosImportados.join(", ")} } from "${caminhoDto}";` : ""}
730
- ${contratosImportados.length > 0 ? `import { ${contratosImportados.join(", ")} } from "./${descreverEstruturaModulo(modulo.nome).nomeArquivo}.contract";` : ""}
731
-
732
- @Controller()
733
- export class ${nomeClasse} {
734
- constructor(private readonly service: ${nomeService}) {}
735
-
736
- ${metodos || " // Nenhuma route publica declarada no modulo."}
737
- }
738
- `;
739
- }
740
- function gerarNestJsSpec(modulo, caminhoService, caminhoController) {
741
- const nomeArquivo = descreverEstruturaModulo(modulo.nome).nomeArquivo;
742
- const nomeService = `${paraPascalCase(nomeArquivo)}Service`;
743
- const nomeController = `${paraPascalCase(nomeArquivo)}Controller`;
744
- return `${gerarCabecalhoSemaTypeScript(modulo, "spec")}import { describe, it } from "@jest/globals";
745
- import { ${nomeService} } from "${caminhoService}";
746
- import { ${nomeController} } from "${caminhoController}";
747
-
748
- describe("${nomeController}", () => {
749
- it("mantem o scaffold inicial em pe", () => {
750
- const service = new ${nomeService}();
751
- const controller = new ${nomeController}(service);
752
- expect(controller).toBeDefined();
753
- });
754
- });
755
- `;
756
- }
757
- function gerarTypeScriptNestJs(modulo) {
758
- const base = gerarTypeScriptBase(modulo);
759
- const contrato = base.find((arquivo) => arquivo.caminhoRelativo.endsWith(".ts") && !arquivo.caminhoRelativo.endsWith(".test.ts"));
760
- const testeContrato = base.find((arquivo) => arquivo.caminhoRelativo.endsWith(".test.ts"));
761
- const estrutura = descreverEstruturaModulo(modulo.nome);
762
- const contexto = estrutura.contextoRelativo;
763
- const contratoPath = `${contexto ? `${contexto}/` : ""}${estrutura.nomeArquivo}.contract.ts`;
764
- const dtoPath = `${contexto ? `${contexto}/` : ""}dto/${estrutura.nomeArquivo}.dto.ts`;
765
- const servicePath = `${contexto ? `${contexto}/` : ""}${estrutura.nomeArquivo}.service.ts`;
766
- const controllerPath = `${contexto ? `${contexto}/` : ""}${estrutura.nomeArquivo}.controller.ts`;
767
- const caminhoImportDto = `./dto/${estrutura.nomeArquivo}.dto`;
768
- const caminhoImportContrato = `./${estrutura.nomeArquivo}.contract`;
769
- const caminhoImportService = `./${estrutura.nomeArquivo}.service`;
770
- const caminhoContratoTeste = path.posix.join("test", `${contexto ? `${contexto}/` : ""}${estrutura.nomeArquivo}.contract.test.ts`);
771
- const caminhoControllerSpec = path.posix.join("test", `${contexto ? `${contexto}/` : ""}${estrutura.nomeArquivo}.controller.spec.ts`);
772
- const relativoContratoDoTeste = path.posix.relative(path.posix.dirname(caminhoContratoTeste), path.posix.join("src", contratoPath).replace(/\.ts$/, ""));
773
- const relativoServiceDoSpec = path.posix.relative(path.posix.dirname(caminhoControllerSpec), path.posix.join("src", servicePath).replace(/\.ts$/, ""));
774
- const relativoControllerDoSpec = path.posix.relative(path.posix.dirname(caminhoControllerSpec), path.posix.join("src", controllerPath).replace(/\.ts$/, ""));
775
- const arquivos = [
776
- {
777
- caminhoRelativo: path.posix.join("src", contratoPath),
778
- conteudo: contrato?.conteudo ?? "// Nenhum contrato base gerado.\n",
779
- },
780
- {
781
- caminhoRelativo: path.posix.join("src", dtoPath),
782
- conteudo: gerarNestJsDtos(modulo, `../${path.posix.basename(contratoPath, ".ts")}`),
783
- },
784
- {
785
- caminhoRelativo: path.posix.join("src", servicePath),
786
- conteudo: gerarNestJsService(modulo, caminhoImportContrato),
787
- },
788
- {
789
- caminhoRelativo: path.posix.join("src", controllerPath),
790
- conteudo: gerarNestJsController(modulo, caminhoImportDto, caminhoImportService),
791
- },
792
- {
793
- caminhoRelativo: caminhoContratoTeste,
794
- conteudo: (testeContrato?.conteudo ?? "")
795
- .replace(`./${estrutura.nomeBase}.ts`, relativoContratoDoTeste)
796
- .replace(`./${estrutura.nomeArquivo}.ts`, relativoContratoDoTeste),
797
- },
798
- {
799
- caminhoRelativo: caminhoControllerSpec,
800
- conteudo: gerarNestJsSpec(modulo, relativoServiceDoSpec, relativoControllerDoSpec),
801
- },
802
- ];
803
- return arquivos;
804
- }
805
- export function gerarTypeScript(modulo, opcoes = {}) {
806
- if (opcoes.framework === "nestjs") {
807
- return gerarTypeScriptNestJs(modulo);
808
- }
809
- return gerarTypeScriptBase(modulo);
810
- }
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";
5
+ export * from "./index.part03.js";
811
6
  //# sourceMappingURL=index.js.map