@semacode/cli 1.0.0 → 1.2.0

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 (48) hide show
  1. package/AGENTS.md +50 -0
  2. package/README.md +15 -2
  3. package/SEMA_BRIEF.curto.txt +9 -0
  4. package/SEMA_BRIEF.md +49 -0
  5. package/SEMA_BRIEF.micro.txt +7 -0
  6. package/SEMA_INDEX.json +546 -0
  7. package/dist/drift.d.ts +17 -2
  8. package/dist/drift.js +516 -5
  9. package/dist/drift.js.map +1 -1
  10. package/dist/importador.d.ts +1 -1
  11. package/dist/importador.js +741 -3
  12. package/dist/importador.js.map +1 -1
  13. package/dist/index.js +962 -86
  14. package/dist/index.js.map +1 -1
  15. package/dist/lua-symbols.d.ts +8 -0
  16. package/dist/lua-symbols.js +68 -0
  17. package/dist/lua-symbols.js.map +1 -0
  18. package/dist/projeto.js +56 -2
  19. package/dist/projeto.js.map +1 -1
  20. package/dist/tipos.d.ts +1 -1
  21. package/docs/AGENT_STARTER.md +34 -6
  22. package/docs/instalacao-e-primeiro-uso.md +18 -9
  23. package/llms-full.txt +34 -0
  24. package/llms.txt +17 -0
  25. package/node_modules/@sema/gerador-dart/package.json +1 -1
  26. package/node_modules/@sema/gerador-lua/dist/index.d.ts +3 -0
  27. package/node_modules/@sema/gerador-lua/dist/index.js +360 -0
  28. package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -0
  29. package/node_modules/@sema/gerador-lua/package.json +7 -0
  30. package/node_modules/@sema/gerador-python/dist/index.js +92 -10
  31. package/node_modules/@sema/gerador-python/dist/index.js.map +1 -1
  32. package/node_modules/@sema/gerador-python/package.json +1 -1
  33. package/node_modules/@sema/gerador-typescript/package.json +1 -1
  34. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +1 -1
  35. package/node_modules/@sema/nucleo/dist/ir/conversor.js +4 -0
  36. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
  37. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +3 -3
  38. package/node_modules/@sema/nucleo/dist/parser/parser.js +2 -0
  39. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
  40. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +2 -2
  41. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +3 -1
  42. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
  43. package/node_modules/@sema/nucleo/package.json +1 -1
  44. package/node_modules/@sema/padroes/dist/index.d.ts +2 -1
  45. package/node_modules/@sema/padroes/dist/index.js +64 -1
  46. package/node_modules/@sema/padroes/dist/index.js.map +1 -1
  47. package/node_modules/@sema/padroes/package.json +1 -1
  48. package/package.json +16 -7
@@ -0,0 +1,360 @@
1
+ import path from "node:path";
2
+ import { descreverEstruturaModulo, mapearTipoParaLua, normalizarNomeModulo, normalizarNomeParaSimbolo, } from "@sema/padroes";
3
+ const TIPOS_PRIMITIVOS_SEMA = new Set(["Texto", "Numero", "Inteiro", "Decimal", "Booleano", "Data", "DataHora", "Id", "Email", "Url", "Json", "Vazio"]);
4
+ function coletarTiposExternos(modulo) {
5
+ const locais = new Set([
6
+ ...modulo.types.map((item) => item.nome),
7
+ ...modulo.entities.map((item) => item.nome),
8
+ ...modulo.enums.map((item) => item.nome),
9
+ ]);
10
+ const referenciados = new Set();
11
+ const campos = [
12
+ ...modulo.entities.flatMap((entity) => entity.campos),
13
+ ...modulo.tasks.flatMap((task) => [...task.input, ...task.output]),
14
+ ...modulo.routes.flatMap((route) => [...route.inputPublico, ...route.outputPublico]),
15
+ ...modulo.states.flatMap((state) => state.campos),
16
+ ];
17
+ for (const campo of campos) {
18
+ if (!TIPOS_PRIMITIVOS_SEMA.has(campo.tipoBase) && !locais.has(campo.tipoBase)) {
19
+ referenciados.add(campo.tipoBase);
20
+ }
21
+ for (const tipo of campo.tiposAlternativos) {
22
+ if (!TIPOS_PRIMITIVOS_SEMA.has(tipo) && !locais.has(tipo)) {
23
+ referenciados.add(tipo);
24
+ }
25
+ }
26
+ }
27
+ return [...referenciados].sort((a, b) => a.localeCompare(b, "pt-BR"));
28
+ }
29
+ function comentarInvariantes(invariantes) {
30
+ if (invariantes.length === 0) {
31
+ return "";
32
+ }
33
+ return `${invariantes.map((invariante) => `-- Invariante: ${invariante.textoOriginal}`).join("\n")}\n`;
34
+ }
35
+ function gerarTabelaCampos(campos) {
36
+ if (campos.length === 0) {
37
+ return "{}";
38
+ }
39
+ return `{\n${campos.map((campo) => ` { nome = ${JSON.stringify(campo.nome)}, tipo = ${JSON.stringify(campo.tipo)}, obrigatorio = ${campo.modificadores.includes("required") ? "true" : "false"} },`).join("\n")}\n }`;
40
+ }
41
+ function valorPadraoLua(campo) {
42
+ if (campo.cardinalidade === "lista") {
43
+ return "{}";
44
+ }
45
+ if (campo.cardinalidade === "mapa") {
46
+ return "{}";
47
+ }
48
+ if (campo.opcional) {
49
+ return "nil";
50
+ }
51
+ switch (campo.tipoBase) {
52
+ case "Texto":
53
+ case "Id":
54
+ case "Email":
55
+ case "Url":
56
+ return JSON.stringify(`${campo.nome}_exemplo`);
57
+ case "Numero":
58
+ case "Inteiro":
59
+ case "Decimal":
60
+ return "1";
61
+ case "Booleano":
62
+ return "false";
63
+ case "Json":
64
+ return "{}";
65
+ case "Vazio":
66
+ return "nil";
67
+ default:
68
+ return "{}";
69
+ }
70
+ }
71
+ function normalizarReferenciaLua(referencia) {
72
+ return referencia
73
+ .split(".")
74
+ .map((parte) => `[${JSON.stringify(parte)}]`)
75
+ .join("");
76
+ }
77
+ function resolverReferenciaLua(referencia, variavel) {
78
+ const partes = referencia.split(".").filter(Boolean);
79
+ if (partes.length === 0) {
80
+ return variavel;
81
+ }
82
+ return `${variavel}${partes.map((parte) => `[${JSON.stringify(parte)}]`).join("")}`;
83
+ }
84
+ function formatarValorLua(valor, camposConhecidos, variavel) {
85
+ const texto = valor.trim();
86
+ if (/^-?\d+(?:\.\d+)?$/.test(texto)) {
87
+ return texto;
88
+ }
89
+ if (texto === "verdadeiro") {
90
+ return "true";
91
+ }
92
+ if (texto === "falso") {
93
+ return "false";
94
+ }
95
+ if (texto === "nulo") {
96
+ return "nil";
97
+ }
98
+ if (camposConhecidos.has(texto.split(".")[0] ?? texto)) {
99
+ return resolverReferenciaLua(texto, variavel);
100
+ }
101
+ return JSON.stringify(texto);
102
+ }
103
+ function gerarExpressaoLua(expressao, camposConhecidos, variavel) {
104
+ switch (expressao.tipo) {
105
+ case "existe":
106
+ return `${resolverReferenciaLua(expressao.alvo, variavel)} ~= nil`;
107
+ case "comparacao":
108
+ return `${resolverReferenciaLua(expressao.alvo, variavel)} ${expressao.operador} ${formatarValorLua(expressao.valor, camposConhecidos, variavel)}`;
109
+ case "pertencimento":
110
+ return `contem({ ${((expressao.valores ?? []).map((valor) => formatarValorLua(valor, camposConhecidos, variavel)).join(", "))} }, ${resolverReferenciaLua(expressao.alvo, variavel)})`;
111
+ case "predicado":
112
+ return "true";
113
+ case "composta":
114
+ return `(${expressao.termos.map((termo) => gerarExpressaoLua(termo, camposConhecidos, variavel)).join(expressao.operadorLogico === "e" ? " and " : " or ")})`;
115
+ case "negacao":
116
+ return `(not ${gerarExpressaoLua(expressao.termo, camposConhecidos, variavel)})`;
117
+ }
118
+ }
119
+ function gerarValidacoes(task) {
120
+ const linhas = [];
121
+ const camposEntrada = new Set(task.input.map((campo) => campo.nome));
122
+ for (const campo of task.input) {
123
+ if (campo.modificadores.includes("required")) {
124
+ linhas.push(` if entrada[${JSON.stringify(campo.nome)}] == nil then error("Campo obrigatorio ausente: ${campo.nome}") end`);
125
+ }
126
+ }
127
+ for (const regra of task.regrasEstruturadas) {
128
+ if (regra.tipo === "predicado") {
129
+ linhas.push(` -- Predicado declarado em Sema: ${regra.textoOriginal}`);
130
+ continue;
131
+ }
132
+ linhas.push(` if not (${gerarExpressaoLua(regra, camposEntrada, "entrada")}) then error("Regra violada: ${regra.textoOriginal}") end`);
133
+ }
134
+ for (const regra of task.rules.filter((texto) => !task.regrasEstruturadas.some((estruturada) => estruturada.textoOriginal === texto))) {
135
+ linhas.push(` -- Regra declarada em Sema: ${regra}`);
136
+ }
137
+ return linhas.join("\n");
138
+ }
139
+ function gerarGarantias(task) {
140
+ const camposSaida = new Set(task.output.map((campo) => campo.nome));
141
+ const linhas = [];
142
+ for (const garantia of task.garantiasEstruturadas) {
143
+ if (garantia.tipo === "predicado") {
144
+ linhas.push(` -- Predicado de garantia declarado em Sema: ${garantia.textoOriginal}`);
145
+ continue;
146
+ }
147
+ linhas.push(` if not (${gerarExpressaoLua(garantia, camposSaida, "saida")}) then error("Garantia violada: ${garantia.textoOriginal}") end`);
148
+ }
149
+ for (const garantia of task.guarantees.filter((texto) => !task.garantiasEstruturadas.some((estruturada) => estruturada.textoOriginal === texto))) {
150
+ linhas.push(` -- Garantia declarada em Sema: ${garantia}`);
151
+ }
152
+ if (linhas.length === 0) {
153
+ linhas.push(" return");
154
+ }
155
+ return `local function verificar_garantias_${normalizarNomeParaSimbolo(task.nome)}(saida)\n${linhas.join("\n")}\nend`;
156
+ }
157
+ function gerarAjustesGarantias(task) {
158
+ const camposSaida = new Set(task.output.map((campo) => campo.nome));
159
+ const tabelasGarantidas = new Set();
160
+ const ajustes = [];
161
+ for (const garantia of task.garantiasEstruturadas) {
162
+ if (garantia.tipo === "pertencimento" && garantia.valores && camposSaida.has(garantia.alvo)) {
163
+ ajustes.push(` saida[${JSON.stringify(garantia.alvo)}] = ${formatarValorLua(garantia.valores[0] ?? "", camposSaida, "saida")}`);
164
+ continue;
165
+ }
166
+ if (garantia.tipo === "comparacao" && garantia.valor) {
167
+ const [raiz, filho] = garantia.alvo.split(".", 2);
168
+ if (!raiz || !camposSaida.has(raiz)) {
169
+ continue;
170
+ }
171
+ if (filho) {
172
+ if (!tabelasGarantidas.has(raiz)) {
173
+ ajustes.push(` saida[${JSON.stringify(raiz)}] = saida[${JSON.stringify(raiz)}] or {}`);
174
+ tabelasGarantidas.add(raiz);
175
+ }
176
+ ajustes.push(` ${resolverReferenciaLua(garantia.alvo, "saida")} = ${formatarValorLua(garantia.valor, camposSaida, "saida")}`);
177
+ continue;
178
+ }
179
+ ajustes.push(` saida[${JSON.stringify(garantia.alvo)}] = ${formatarValorLua(garantia.valor, camposSaida, "saida")}`);
180
+ continue;
181
+ }
182
+ if (garantia.tipo === "existe") {
183
+ const [raiz, filho] = garantia.alvo.split(".", 2);
184
+ if (!raiz || !filho || !camposSaida.has(raiz)) {
185
+ continue;
186
+ }
187
+ if (!tabelasGarantidas.has(raiz)) {
188
+ ajustes.push(` saida[${JSON.stringify(raiz)}] = saida[${JSON.stringify(raiz)}] or {}`);
189
+ tabelasGarantidas.add(raiz);
190
+ }
191
+ ajustes.push(` if ${resolverReferenciaLua(garantia.alvo, "saida")} == nil then ${resolverReferenciaLua(garantia.alvo, "saida")} = "valor_garantido" end`);
192
+ }
193
+ }
194
+ return ajustes;
195
+ }
196
+ function gerarPreparacaoSaida(task) {
197
+ if (task.output.length === 0) {
198
+ return " local saida = nil";
199
+ }
200
+ const linhas = task.output.map((campo) => ` [${JSON.stringify(campo.nome)}] = ${valorPadraoLua(campo)},`);
201
+ const ajustes = gerarAjustesGarantias(task);
202
+ return ` local saida = {\n${linhas.join("\n")}\n }${ajustes.length > 0 ? `\n${ajustes.join("\n")}` : ""}`;
203
+ }
204
+ function formatarLiteralTesteLua(valor, tipoDeclarado) {
205
+ if (["Numero", "Inteiro", "Decimal"].includes(tipoDeclarado ?? "") && /^-?\d+(?:\.\d+)?$/.test(valor)) {
206
+ return valor;
207
+ }
208
+ if ((tipoDeclarado ?? "") === "Booleano") {
209
+ if (valor === "verdadeiro") {
210
+ return "true";
211
+ }
212
+ if (valor === "falso") {
213
+ return "false";
214
+ }
215
+ }
216
+ if (/^-?\d+(?:\.\d+)?$/.test(valor)) {
217
+ return valor;
218
+ }
219
+ if (valor === "verdadeiro") {
220
+ return "true";
221
+ }
222
+ if (valor === "falso") {
223
+ return "false";
224
+ }
225
+ if (valor === "nulo") {
226
+ return "nil";
227
+ }
228
+ return JSON.stringify(valor);
229
+ }
230
+ function gerarTabelaLua(campos, blocos) {
231
+ const entradas = [
232
+ ...campos.map((campo) => ` [${JSON.stringify(campo.nome)}] = ${campo.valor},`),
233
+ ...blocos.map((bloco) => ` [${JSON.stringify(bloco.nome)}] = ${bloco.conteudo},`),
234
+ ];
235
+ if (entradas.length === 0) {
236
+ return "{}";
237
+ }
238
+ return `{\n${entradas.join("\n")}\n}`;
239
+ }
240
+ function converterBlocoTesteParaLua(bloco, tiposDeclarados) {
241
+ const campos = bloco.campos.map((campo) => ({
242
+ nome: campo.nome,
243
+ valor: formatarLiteralTesteLua(campo.tipo, tiposDeclarados?.get(campo.nome)),
244
+ }));
245
+ const blocos = bloco.blocos.map((subbloco) => ({
246
+ nome: subbloco.nome,
247
+ conteudo: converterBlocoTesteParaLua(subbloco.conteudo),
248
+ }));
249
+ return gerarTabelaLua(campos, blocos);
250
+ }
251
+ function gerarTabelaTiposDeclarados(task) {
252
+ return new Map(task.input.map((campo) => [campo.nome, campo.tipo]));
253
+ }
254
+ function gerarTestesLua(modulo, arquivoModulo) {
255
+ const testes = modulo.tasks.flatMap((task) => task.tests.map((caso, indice) => ({ task, caso, indice })));
256
+ if (testes.length === 0) {
257
+ return undefined;
258
+ }
259
+ const nomeArquivo = path.basename(arquivoModulo);
260
+ const funcoes = testes.map(({ task, caso, indice }) => {
261
+ const nomeTeste = `test_${normalizarNomeParaSimbolo(task.nome)}_${indice + 1}`;
262
+ const tiposDeclarados = gerarTabelaTiposDeclarados(task);
263
+ return `local function ${nomeTeste}()
264
+ local entrada = ${converterBlocoTesteParaLua(caso.given, tiposDeclarados)}
265
+ local saida = modulo.executar_${normalizarNomeParaSimbolo(task.nome)}(entrada)
266
+ if ${caso.expect.campos.some((campo) => campo.nome === "sucesso" && campo.tipo === "falso") ? "saida ~= nil" : "saida == nil"} then
267
+ error("Caso ${caso.nome} nao respeitou expectativa basica de execucao.")
268
+ end
269
+ end`;
270
+ });
271
+ const lista = testes.map(({ task, caso, indice }) => `{ nome = ${JSON.stringify(caso.nome)}, fn = test_${normalizarNomeParaSimbolo(task.nome)}_${indice + 1} }`).join(",\n ");
272
+ return `local origem = debug.getinfo(1, "S").source:sub(2)
273
+ local base = origem:match("^(.*[/\\\\])") or "./"
274
+ local modulo = assert(loadfile(base .. ${JSON.stringify(nomeArquivo)}))()
275
+
276
+ ${funcoes.join("\n\n")}
277
+
278
+ local testes = {
279
+ ${lista}
280
+ }
281
+
282
+ for _, teste in ipairs(testes) do
283
+ io.write("test ", teste.nome, "\\n")
284
+ teste.fn()
285
+ end
286
+
287
+ io.write("ok ", tostring(#testes), " testes\\n")
288
+ `;
289
+ }
290
+ function gerarMetadadosTask(task) {
291
+ const efeitos = task.efeitosEstruturados.map((efeito) => `${efeito.categoria}:${efeito.alvo}`).join(", ") || "nenhum";
292
+ const impl = task.implementacoesExternas.map((item) => `${item.origem}:${item.caminho}[${item.statusImpl ?? "nao_verificado"}]`).join(", ") || "nenhuma";
293
+ return `M.contrato_${normalizarNomeParaSimbolo(task.nome)} = {
294
+ nome = ${JSON.stringify(task.nome)},
295
+ input = ${gerarTabelaCampos(task.input)},
296
+ output = ${gerarTabelaCampos(task.output)},
297
+ effects = ${JSON.stringify(efeitos)},
298
+ impl = ${JSON.stringify(impl)}
299
+ }`;
300
+ }
301
+ function gerarFuncoesTask(task) {
302
+ const simbolo = normalizarNomeParaSimbolo(task.nome);
303
+ const validacoes = gerarValidacoes(task);
304
+ const garantias = gerarGarantias(task);
305
+ const preparacaoSaida = gerarPreparacaoSaida(task);
306
+ return `${gerarMetadadosTask(task)}
307
+
308
+ ${garantias}
309
+
310
+ function M.executar_${simbolo}(entrada)
311
+ entrada = entrada or {}
312
+ ${validacoes ? `${validacoes}\n` : ""}${preparacaoSaida}
313
+ verificar_garantias_${simbolo}(saida)
314
+ return saida
315
+ end`;
316
+ }
317
+ export function gerarLua(modulo) {
318
+ const nomeBase = normalizarNomeModulo(modulo.nome).replace(/\./g, "_");
319
+ const estrutura = descreverEstruturaModulo(modulo.nome);
320
+ const interops = modulo.interoperabilidades.map((interop) => `-- Interop externo ${interop.origem}: ${interop.caminho}`).join("\n");
321
+ const tiposExternos = coletarTiposExternos(modulo).map((tipo) => `---@class ${tipo}`).join("\n");
322
+ const enums = modulo.enums.map((enumeracao) => `M.enum_${normalizarNomeParaSimbolo(enumeracao.nome)} = { ${enumeracao.valores.map((valor) => `${valor} = ${JSON.stringify(valor)}`).join(", ")} }`).join("\n\n");
323
+ const entidades = modulo.entities.map((entity) => `${comentarInvariantes(entity.invariantes)}---@class ${entity.nome}\nM.${normalizarNomeParaSimbolo(entity.nome)} = {\n${entity.campos.map((campo) => ` ${campo.nome} = nil, -- ${mapearTipoParaLua(campo.tipoBase)}`).join("\n")}\n}`).join("\n\n");
324
+ const tipos = modulo.types.map((type) => `${comentarInvariantes(type.invariantes)}---@alias ${type.nome} table`).join("\n\n");
325
+ const tasks = modulo.tasks.map((task) => gerarFuncoesTask(task)).join("\n\n");
326
+ const flows = modulo.flows.map((flow) => `-- Flow ${flow.nome}: etapas=${flow.etapasEstruturadas.length} tasks=${flow.tasksReferenciadas.join(", ") || "nenhuma"}`).join("\n");
327
+ const routes = modulo.routes.map((route) => `-- Route ${route.nome}: metodo=${route.metodo ?? "nao_definido"} caminho=${route.caminho ?? "nao_definido"} task=${route.task ?? "nao_definida"}`).join("\n");
328
+ const codigo = `-- Arquivo gerado automaticamente pela Sema.
329
+ -- Modulo de origem: ${modulo.nome}
330
+ ${interops ? `${interops}\n` : ""}${tiposExternos ? `${tiposExternos}\n\n` : ""}local M = {}
331
+
332
+ local function contem(lista, valor)
333
+ for _, item in ipairs(lista) do
334
+ if item == valor then
335
+ return true
336
+ end
337
+ end
338
+ return false
339
+ end
340
+
341
+ ${tipos ? `${tipos}\n\n` : ""}${entidades ? `${entidades}\n\n` : ""}${enums ? `${enums}\n\n` : ""}${tasks}${flows ? `\n\n${flows}` : ""}${routes ? `\n${routes}` : ""}
342
+
343
+ return M
344
+ `;
345
+ const caminhoModulo = estrutura.contextoRelativo
346
+ ? path.join(estrutura.contextoRelativo, `${estrutura.nomeArquivo}.lua`)
347
+ : `${nomeBase}.lua`;
348
+ const arquivos = [{ caminhoRelativo: caminhoModulo, conteudo: codigo }];
349
+ const testes = gerarTestesLua(modulo, path.basename(caminhoModulo));
350
+ if (testes) {
351
+ arquivos.push({
352
+ caminhoRelativo: estrutura.contextoRelativo
353
+ ? path.join(estrutura.contextoRelativo, `test_${estrutura.nomeArquivo}.lua`)
354
+ : `test_${nomeBase}.lua`,
355
+ conteudo: testes,
356
+ });
357
+ }
358
+ return arquivos;
359
+ }
360
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@sema/gerador-lua",
3
+ "version": "1.2.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts"
7
+ }
@@ -1,15 +1,84 @@
1
1
  import path from "node:path";
2
2
  import { descreverEstruturaModulo, mapearTipoParaPython, normalizarNomeModulo, normalizarNomeParaSimbolo, } from "@sema/padroes";
3
3
  const TIPOS_PRIMITIVOS_SEMA = new Set(["Texto", "Numero", "Inteiro", "Decimal", "Booleano", "Data", "DataHora", "Id", "Email", "Url", "Json", "Vazio"]);
4
+ function dividirTipoNoNivelRaiz(valor, separador) {
5
+ const partes = [];
6
+ let atual = "";
7
+ let profundidade = 0;
8
+ for (const caractere of valor) {
9
+ if (caractere === "<") {
10
+ profundidade += 1;
11
+ atual += caractere;
12
+ continue;
13
+ }
14
+ if (caractere === ">") {
15
+ profundidade = Math.max(0, profundidade - 1);
16
+ atual += caractere;
17
+ continue;
18
+ }
19
+ if (caractere === separador && profundidade === 0) {
20
+ if (atual.trim()) {
21
+ partes.push(atual.trim());
22
+ }
23
+ atual = "";
24
+ continue;
25
+ }
26
+ atual += caractere;
27
+ }
28
+ if (atual.trim()) {
29
+ partes.push(atual.trim());
30
+ }
31
+ return partes;
32
+ }
33
+ function coletarFolhasTipoPython(tipo) {
34
+ const limpo = tipo.trim();
35
+ if (!limpo) {
36
+ return [];
37
+ }
38
+ if (/^Opcional<.+>$/.test(limpo)) {
39
+ return coletarFolhasTipoPython(limpo.slice("Opcional<".length, -1));
40
+ }
41
+ const uniao = dividirTipoNoNivelRaiz(limpo, "|");
42
+ if (uniao.length > 1) {
43
+ return uniao.flatMap((item) => coletarFolhasTipoPython(item));
44
+ }
45
+ if (/^Lista<.+>$/.test(limpo)) {
46
+ return coletarFolhasTipoPython(limpo.slice("Lista<".length, -1));
47
+ }
48
+ if (/^Mapa<.+>$/.test(limpo)) {
49
+ return dividirTipoNoNivelRaiz(limpo.slice("Mapa<".length, -1), ",")
50
+ .flatMap((item) => coletarFolhasTipoPython(item));
51
+ }
52
+ return [limpo];
53
+ }
54
+ function mapearCampoParaPython(campo) {
55
+ let anotacao;
56
+ if (campo.cardinalidade === "lista") {
57
+ anotacao = `list[${mapearTipoParaPython(campo.tipoItem ?? campo.tipoBase)}]`;
58
+ }
59
+ else if (campo.cardinalidade === "mapa") {
60
+ anotacao = `dict[${mapearTipoParaPython(campo.chaveMapa ?? "Texto")}, ${mapearTipoParaPython(campo.valorMapa ?? "Json")}]`;
61
+ }
62
+ else if (campo.cardinalidade === "uniao") {
63
+ anotacao = campo.tiposAlternativos.map((tipo) => mapearTipoParaPython(tipo)).join(" | ");
64
+ }
65
+ else {
66
+ anotacao = mapearTipoParaPython(campo.tipoBase);
67
+ }
68
+ if (campo.opcional && !/\bNone\b/.test(anotacao)) {
69
+ return `${anotacao} | None`;
70
+ }
71
+ return anotacao;
72
+ }
4
73
  function gerarDataclass(nome, campos) {
5
74
  const linhas = campos.length === 0
6
75
  ? " pass"
7
76
  : campos.map((campo) => {
8
- const tipoBase = mapearTipoParaPython(campo.tipo);
77
+ const tipoBase = mapearCampoParaPython(campo);
9
78
  if (campo.modificadores.includes("required")) {
10
79
  return ` ${campo.nome}: ${tipoBase}`;
11
80
  }
12
- return ` ${campo.nome}: ${tipoBase} | None = None`;
81
+ return ` ${campo.nome}: ${/\bNone\b/.test(tipoBase) ? tipoBase : `${tipoBase} | None`} = None`;
13
82
  }).join("\n");
14
83
  return `@dataclass\nclass ${nome}:\n${linhas}\n`;
15
84
  }
@@ -39,8 +108,10 @@ function coletarTiposExternos(modulo) {
39
108
  ...modulo.states.flatMap((state) => state.campos),
40
109
  ];
41
110
  for (const campo of campos) {
42
- if (!TIPOS_PRIMITIVOS_SEMA.has(campo.tipo) && !locais.has(campo.tipo)) {
43
- referenciados.add(campo.tipo);
111
+ for (const tipo of coletarFolhasTipoPython(campo.tipo)) {
112
+ if (!TIPOS_PRIMITIVOS_SEMA.has(tipo) && !locais.has(tipo)) {
113
+ referenciados.add(tipo);
114
+ }
44
115
  }
45
116
  }
46
117
  return [...referenciados].sort((a, b) => a.localeCompare(b, "pt-BR"));
@@ -87,7 +158,18 @@ function resolverExpressaoPython(expressao, camposConhecidos, variavel) {
87
158
  return `(not ${resolverExpressaoPython(expressao.termo, camposConhecidos, variavel)})`;
88
159
  }
89
160
  }
90
- function valorPadraoPython(tipo, nomeCampo) {
161
+ function valorPadraoPython(campo) {
162
+ const tipo = campo.tipoBase;
163
+ const nomeCampo = campo.nome;
164
+ if (campo.cardinalidade === "lista") {
165
+ return "[]";
166
+ }
167
+ if (campo.cardinalidade === "mapa") {
168
+ return "{}";
169
+ }
170
+ if (campo.opcional) {
171
+ return "None";
172
+ }
91
173
  switch (tipo) {
92
174
  case "Texto":
93
175
  case "Id":
@@ -175,7 +257,7 @@ function paraPascalCase(valor) {
175
257
  }
176
258
  function gerarPreparacaoSaida(task) {
177
259
  const camposSaida = new Set(task.output.map((campo) => campo.nome));
178
- const argumentos = task.output.map((campo) => `${campo.nome}=${valorPadraoPython(campo.tipo, campo.nome)}`).join(", ");
260
+ const argumentos = task.output.map((campo) => `${campo.nome}=${valorPadraoPython(campo)}`).join(", ");
179
261
  const ajustes = [];
180
262
  for (const garantia of task.garantiasEstruturadas) {
181
263
  if (garantia.tipo === "pertencimento" && garantia.valores && camposSaida.has(garantia.alvo)) {
@@ -426,18 +508,18 @@ function gerarFastApiSchemas(modulo, caminhoContrato) {
426
508
  ];
427
509
  for (const task of modulo.tasks) {
428
510
  linhas.push(`class ${task.nome}EntradaSchema(BaseModel):
429
- ${task.input.length === 0 ? " pass" : task.input.map((campo) => ` ${campo.nome}: ${mapearTipoParaPython(campo.tipo)}`).join("\n")}
511
+ ${task.input.length === 0 ? " pass" : task.input.map((campo) => ` ${campo.nome}: ${mapearCampoParaPython(campo)}`).join("\n")}
430
512
  `);
431
513
  linhas.push(`class ${task.nome}SaidaSchema(BaseModel):
432
- ${task.output.length === 0 ? " pass" : task.output.map((campo) => ` ${campo.nome}: ${mapearTipoParaPython(campo.tipo)}`).join("\n")}
514
+ ${task.output.length === 0 ? " pass" : task.output.map((campo) => ` ${campo.nome}: ${mapearCampoParaPython(campo)}`).join("\n")}
433
515
  `);
434
516
  }
435
517
  for (const route of modulo.routes) {
436
518
  linhas.push(`class ${route.nome}EntradaPublicaSchema(BaseModel):
437
- ${route.inputPublico.length === 0 ? " pass" : route.inputPublico.map((campo) => ` ${campo.nome}: ${mapearTipoParaPython(campo.tipo)}`).join("\n")}
519
+ ${route.inputPublico.length === 0 ? " pass" : route.inputPublico.map((campo) => ` ${campo.nome}: ${mapearCampoParaPython(campo)}`).join("\n")}
438
520
  `);
439
521
  linhas.push(`class ${route.nome}SaidaPublicaSchema(BaseModel):
440
- ${route.outputPublico.length === 0 ? " pass" : route.outputPublico.map((campo) => ` ${campo.nome}: ${mapearTipoParaPython(campo.tipo)}`).join("\n")}
522
+ ${route.outputPublico.length === 0 ? " pass" : route.outputPublico.map((campo) => ` ${campo.nome}: ${mapearCampoParaPython(campo)}`).join("\n")}
441
523
  `);
442
524
  }
443
525
  return linhas.join("\n");