@semacode/cli 1.2.12 → 1.3.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.
- package/README.md +2 -2
- package/dist/index.js +76 -25
- package/dist/projeto.js +4 -1
- package/package.json +17 -34
- package/src/cpp-symbols.ts +82 -0
- package/src/dotnet-http.ts +355 -0
- package/src/drift.ts +2455 -0
- package/src/go-http.ts +118 -0
- package/src/importador.ts +3448 -0
- package/src/index.ts +4470 -0
- package/src/java-http.ts +247 -0
- package/src/projeto.ts +810 -0
- package/src/python-http.ts +258 -0
- package/src/rust-http.ts +125 -0
- package/src/tipos.ts +22 -0
- package/src/typescript-http.ts +1076 -0
- package/tsconfig.json +20 -0
- package/AGENTS.md +0 -50
- package/LICENSE +0 -22
- package/SEMA_BRIEF.curto.txt +0 -9
- package/SEMA_BRIEF.md +0 -49
- package/SEMA_BRIEF.micro.txt +0 -7
- package/SEMA_INDEX.json +0 -501
- package/dist/cpp-symbols.d.ts +0 -10
- package/dist/cpp-symbols.js.map +0 -1
- package/dist/dotnet-http.d.ts +0 -23
- package/dist/dotnet-http.js.map +0 -1
- package/dist/drift.d.ts +0 -118
- package/dist/drift.js.map +0 -1
- package/dist/go-http.d.ts +0 -23
- package/dist/go-http.js.map +0 -1
- package/dist/importador.d.ts +0 -29
- package/dist/importador.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js.map +0 -1
- package/dist/java-http.d.ts +0 -23
- package/dist/java-http.js.map +0 -1
- package/dist/lua-symbols.d.ts +0 -8
- package/dist/lua-symbols.js.map +0 -1
- package/dist/projeto.d.ts +0 -48
- package/dist/projeto.js.map +0 -1
- package/dist/python-http.d.ts +0 -23
- package/dist/python-http.js.map +0 -1
- package/dist/rust-http.d.ts +0 -23
- package/dist/rust-http.js.map +0 -1
- package/dist/tipos.d.ts +0 -3
- package/dist/tipos.js.map +0 -1
- package/dist/typescript-http.d.ts +0 -35
- package/dist/typescript-http.js.map +0 -1
- package/docs/AGENT_STARTER.md +0 -102
- package/docs/como-ensinar-a-sema-para-ia.md +0 -149
- package/docs/fluxo-pratico-ia-sema.md +0 -177
- package/docs/instalacao-e-primeiro-uso.md +0 -196
- package/docs/integracao-com-ia.md +0 -228
- package/docs/pagamento-ponta-a-ponta.md +0 -155
- package/docs/prompt-base-ia-sema.md +0 -101
- package/docs/sintaxe.md +0 -361
- package/exemplos/automacao.sema +0 -107
- package/exemplos/cadastro_usuario.sema +0 -54
- package/exemplos/calculadora.sema +0 -78
- package/exemplos/crud_simples.sema +0 -89
- package/exemplos/operacao_estrategia.sema +0 -402
- package/exemplos/pagamento.sema +0 -222
- package/exemplos/pagamento_dominio.sema +0 -35
- package/exemplos/testes_embutidos.sema +0 -45
- package/exemplos/tratamento_erro.sema +0 -157
- package/llms-full.txt +0 -34
- package/llms.txt +0 -17
- package/node_modules/@sema/gerador-dart/dist/index.d.ts +0 -3
- package/node_modules/@sema/gerador-dart/dist/index.js +0 -44
- package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-dart/package.json +0 -7
- package/node_modules/@sema/gerador-lua/dist/index.d.ts +0 -3
- package/node_modules/@sema/gerador-lua/dist/index.js +0 -328
- package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-lua/package.json +0 -7
- package/node_modules/@sema/gerador-python/dist/index.d.ts +0 -6
- package/node_modules/@sema/gerador-python/dist/index.js +0 -628
- package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-python/package.json +0 -7
- package/node_modules/@sema/gerador-typescript/dist/index.d.ts +0 -6
- package/node_modules/@sema/gerador-typescript/dist/index.js +0 -656
- package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-typescript/package.json +0 -7
- package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +0 -122
- package/node_modules/@sema/nucleo/dist/ast/tipos.js +0 -2
- package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/diagnosticos/index.d.ts +0 -21
- package/node_modules/@sema/nucleo/dist/diagnosticos/index.js +0 -12
- package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +0 -9
- package/node_modules/@sema/nucleo/dist/formatador/index.js +0 -445
- package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/index.d.ts +0 -34
- package/node_modules/@sema/nucleo/dist/index.js +0 -95
- package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +0 -5
- package/node_modules/@sema/nucleo/dist/ir/conversor.js +0 -781
- package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +0 -285
- package/node_modules/@sema/nucleo/dist/ir/modelos.js +0 -2
- package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/lexer/lexer.d.ts +0 -7
- package/node_modules/@sema/nucleo/dist/lexer/lexer.js +0 -122
- package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/lexer/tokens.d.ts +0 -8
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js +0 -46
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +0 -9
- package/node_modules/@sema/nucleo/dist/parser/parser.js +0 -656
- package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +0 -57
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js +0 -1497
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +0 -104
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +0 -445
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/seguranca.d.ts +0 -91
- package/node_modules/@sema/nucleo/dist/semantico/seguranca.js +0 -258
- package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/util/arquivos.d.ts +0 -2
- package/node_modules/@sema/nucleo/dist/util/arquivos.js +0 -25
- package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
- package/node_modules/@sema/nucleo/package.json +0 -7
- package/node_modules/@sema/padroes/dist/index.d.ts +0 -21
- package/node_modules/@sema/padroes/dist/index.js +0 -159
- package/node_modules/@sema/padroes/dist/index.js.map +0 -1
- package/node_modules/@sema/padroes/package.json +0 -7
package/README.md
CHANGED
|
@@ -36,7 +36,7 @@ sema --help
|
|
|
36
36
|
## Instalacao via tarball da release
|
|
37
37
|
|
|
38
38
|
```bash
|
|
39
|
-
npm install -g ./
|
|
39
|
+
npm install -g ./{{TGZ_ARQUIVO}}
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
Ou direto da GitHub Release:
|
|
@@ -55,7 +55,7 @@ npx sema --help
|
|
|
55
55
|
Ou, se voce estiver testando um tarball local:
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
|
-
npm install ./
|
|
58
|
+
npm install ./{{TGZ_ARQUIVO}}
|
|
59
59
|
npx sema --help
|
|
60
60
|
```
|
|
61
61
|
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,9 @@ import { gerarDart } from "@sema/gerador-dart";
|
|
|
10
10
|
import { gerarLua } from "@sema/gerador-lua";
|
|
11
11
|
import { gerarPython } from "@sema/gerador-python";
|
|
12
12
|
import { gerarTypeScript } from "@sema/gerador-typescript";
|
|
13
|
+
import { gerarJavaScript } from "@sema/gerador-javascript";
|
|
14
|
+
import { gerarHtml } from "@sema/gerador-html";
|
|
15
|
+
import { gerarCss } from "@sema/gerador-css";
|
|
13
16
|
import { carregarConfiguracaoProjeto, carregarProjeto, resolverAlvoPadrao, resolverAlvosVerificacao, resolverEstruturaSaidaPadrao, resolverFrameworkPadrao, resolverSaidaPadrao, } from "./projeto.js";
|
|
14
17
|
import { importarProjetoLegado, resumoImportacao } from "./importador.js";
|
|
15
18
|
import { analisarDriftLegado } from "./drift.js";
|
|
@@ -97,21 +100,24 @@ Superficies que a IA deve enxergar como first-class:
|
|
|
97
100
|
|
|
98
101
|
Nao improvise quando faltar contexto.
|
|
99
102
|
`;
|
|
100
|
-
const PROMPT_BASE_IA = `Voce esta trabalhando com Sema, um Protocolo de Governanca de Intencao orientado a contrato, desenhado para operacao por IA.
|
|
101
|
-
|
|
102
|
-
Trate a Sema como camada semantica e linguagem de especificacao executavel feita para IA, nao para leitura humana confortavel. Nao invente sintaxe, palavras-chave ou blocos fora da gramatica e dos exemplos oficiais.
|
|
103
|
-
|
|
104
|
-
Fontes de verdade, em ordem:
|
|
105
|
-
1.
|
|
106
|
-
2.
|
|
107
|
-
3.
|
|
108
|
-
4.
|
|
109
|
-
5.
|
|
110
|
-
6.
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
103
|
+
const PROMPT_BASE_IA = `Voce esta trabalhando com Sema, um Protocolo de Governanca de Intencao orientado a contrato, desenhado para operacao por IA.
|
|
104
|
+
|
|
105
|
+
Trate a Sema como camada semantica e linguagem de especificacao executavel feita para IA, nao para leitura humana confortavel. Nao invente sintaxe, palavras-chave ou blocos fora da gramatica e dos exemplos oficiais.
|
|
106
|
+
|
|
107
|
+
Fontes de verdade, em ordem:
|
|
108
|
+
1. se o projeto expuser \`SEMA_CONTEXT.md\`, comece por ele
|
|
109
|
+
2. \`SEMA_BRIEF.md\`
|
|
110
|
+
3. \`SEMA_INDEX.json\`
|
|
111
|
+
4. README do projeto
|
|
112
|
+
5. gramatica e documentacao de sintaxe da Sema
|
|
113
|
+
6. especificacao semantica da linguagem
|
|
114
|
+
7. exemplos oficiais, com prioridade para o vertical de pagamento
|
|
115
|
+
8. \`sema resumo\` e \`briefing.min.json\` quando a IA for pequena
|
|
116
|
+
9. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar
|
|
117
|
+
|
|
118
|
+
Regras de operacao:
|
|
119
|
+
- preserve o significado semantico
|
|
120
|
+
- use o formatador oficial da Sema como fonte unica de estilo
|
|
115
121
|
- use diagnosticos estruturados como contrato de correcao
|
|
116
122
|
- use a IR como fonte de verdade semantica quando houver duvida
|
|
117
123
|
- nao conclua uma alteracao sem validar e verificar o modulo
|
|
@@ -515,7 +521,7 @@ function validarCompatibilidadeFramework(alvo, framework) {
|
|
|
515
521
|
if (framework === "fastapi" && alvo !== "python") {
|
|
516
522
|
return `Framework "${framework}" so pode ser usado com o alvo python.`;
|
|
517
523
|
}
|
|
518
|
-
if (alvo === "dart" || alvo === "lua") {
|
|
524
|
+
if (alvo === "dart" || alvo === "lua" || alvo === "javascript" || alvo === "html" || alvo === "css") {
|
|
519
525
|
return `Framework "${framework}" nao e suportado para o alvo ${alvo}.`;
|
|
520
526
|
}
|
|
521
527
|
return undefined;
|
|
@@ -624,6 +630,15 @@ function gerarArquivosPorAlvo(ir, alvo, framework) {
|
|
|
624
630
|
if (alvo === "lua") {
|
|
625
631
|
return gerarLua(ir);
|
|
626
632
|
}
|
|
633
|
+
if (alvo === "javascript") {
|
|
634
|
+
return gerarJavaScript(ir);
|
|
635
|
+
}
|
|
636
|
+
if (alvo === "html") {
|
|
637
|
+
return gerarHtml(ir);
|
|
638
|
+
}
|
|
639
|
+
if (alvo === "css") {
|
|
640
|
+
return gerarCss(ir);
|
|
641
|
+
}
|
|
627
642
|
return gerarTypeScript(ir, { framework });
|
|
628
643
|
}
|
|
629
644
|
function aplicarEstruturaSaida(arquivos, ir, estrutura) {
|
|
@@ -662,6 +677,19 @@ function aplicarEstruturaSaida(arquivos, ir, estrutura) {
|
|
|
662
677
|
novoBasename = `test_${nomeArquivo}.lua`;
|
|
663
678
|
conteudo = conteudo.replace(`${nomeBaseAntigo}.lua`, `${nomeArquivo}.lua`);
|
|
664
679
|
}
|
|
680
|
+
else if (basename === `${nomeBaseAntigo}.js`) {
|
|
681
|
+
novoBasename = `${nomeArquivo}.js`;
|
|
682
|
+
}
|
|
683
|
+
else if (basename === `${nomeBaseAntigo}.test.js`) {
|
|
684
|
+
novoBasename = `${nomeArquivo}.test.js`;
|
|
685
|
+
conteudo = conteudo.replace(`./${nomeBaseAntigo}.js`, `./${nomeArquivo}.js`);
|
|
686
|
+
}
|
|
687
|
+
else if (basename === `${nomeBaseAntigo}.html`) {
|
|
688
|
+
novoBasename = `${nomeArquivo}.html`;
|
|
689
|
+
}
|
|
690
|
+
else if (basename === `${nomeBaseAntigo}.css`) {
|
|
691
|
+
novoBasename = `${nomeArquivo}.css`;
|
|
692
|
+
}
|
|
665
693
|
return {
|
|
666
694
|
caminhoRelativo: pastaModulo ? path.join(pastaModulo, novoBasename) : novoBasename,
|
|
667
695
|
conteudo,
|
|
@@ -669,7 +697,7 @@ function aplicarEstruturaSaida(arquivos, ir, estrutura) {
|
|
|
669
697
|
});
|
|
670
698
|
}
|
|
671
699
|
function contarCasosDeTesteGerados(alvo, arquivos) {
|
|
672
|
-
if (alvo === "dart") {
|
|
700
|
+
if (alvo === "dart" || alvo === "html" || alvo === "css") {
|
|
673
701
|
return 0;
|
|
674
702
|
}
|
|
675
703
|
if (alvo === "lua") {
|
|
@@ -686,6 +714,13 @@ function contarCasosDeTesteGerados(alvo, arquivos) {
|
|
|
686
714
|
}
|
|
687
715
|
return (arquivoTeste.conteudo.match(/\btest\(/g) ?? []).length;
|
|
688
716
|
}
|
|
717
|
+
if (alvo === "javascript") {
|
|
718
|
+
const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.js"));
|
|
719
|
+
if (!arquivoTeste) {
|
|
720
|
+
return 0;
|
|
721
|
+
}
|
|
722
|
+
return (arquivoTeste.conteudo.match(/\btest\(/g) ?? []).length;
|
|
723
|
+
}
|
|
689
724
|
const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_"));
|
|
690
725
|
if (!arquivoTeste) {
|
|
691
726
|
return 0;
|
|
@@ -696,17 +731,14 @@ function executarTestesGerados(alvo, baseSaida, arquivos, silencioso = false) {
|
|
|
696
731
|
const quantidadeTestes = contarCasosDeTesteGerados(alvo, arquivos);
|
|
697
732
|
if (quantidadeTestes === 0) {
|
|
698
733
|
if (!silencioso) {
|
|
699
|
-
const
|
|
700
|
-
|
|
701
|
-
: alvo === "python"
|
|
702
|
-
? "Python"
|
|
703
|
-
: alvo === "lua"
|
|
704
|
-
? "Lua"
|
|
705
|
-
: "Dart";
|
|
706
|
-
console.log(`Nenhum teste ${nomeAlvo} foi gerado.`);
|
|
734
|
+
const nomesAlvo = { typescript: "TypeScript", python: "Python", lua: "Lua", dart: "Dart", javascript: "JavaScript", html: "HTML", css: "CSS" };
|
|
735
|
+
console.log(`Nenhum teste ${nomesAlvo[alvo] ?? alvo} foi gerado.`);
|
|
707
736
|
}
|
|
708
737
|
return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
|
|
709
738
|
}
|
|
739
|
+
if (alvo === "html" || alvo === "css") {
|
|
740
|
+
return { codigoSaida: 0, quantidadeTestes: 0, saidaPadrao: "", saidaErro: "" };
|
|
741
|
+
}
|
|
710
742
|
if (alvo === "typescript") {
|
|
711
743
|
const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.ts"))?.caminhoRelativo;
|
|
712
744
|
if (!arquivoTeste) {
|
|
@@ -726,6 +758,25 @@ function executarTestesGerados(alvo, baseSaida, arquivos, silencioso = false) {
|
|
|
726
758
|
saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
|
|
727
759
|
};
|
|
728
760
|
}
|
|
761
|
+
if (alvo === "javascript") {
|
|
762
|
+
const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.js"))?.caminhoRelativo;
|
|
763
|
+
if (!arquivoTeste) {
|
|
764
|
+
if (!silencioso) {
|
|
765
|
+
console.log("Nenhum teste JavaScript foi gerado.");
|
|
766
|
+
}
|
|
767
|
+
return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
|
|
768
|
+
}
|
|
769
|
+
const execucao = spawnSync("node", ["--test", path.join(baseSaida, arquivoTeste)], {
|
|
770
|
+
stdio: silencioso ? "pipe" : "inherit",
|
|
771
|
+
encoding: silencioso ? "utf8" : undefined,
|
|
772
|
+
});
|
|
773
|
+
return {
|
|
774
|
+
codigoSaida: execucao.status ?? 1,
|
|
775
|
+
quantidadeTestes,
|
|
776
|
+
saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
|
|
777
|
+
saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
|
|
778
|
+
};
|
|
779
|
+
}
|
|
729
780
|
if (alvo === "lua") {
|
|
730
781
|
const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_") && item.caminhoRelativo.endsWith(".lua"))?.caminhoRelativo;
|
|
731
782
|
if (!arquivoTeste) {
|
package/dist/projeto.js
CHANGED
|
@@ -59,9 +59,12 @@ export function normalizarFrameworkGeracao(valor) {
|
|
|
59
59
|
return "base";
|
|
60
60
|
}
|
|
61
61
|
function normalizarAlvo(valor) {
|
|
62
|
-
if (valor === "typescript" || valor === "python" || valor === "dart" || valor === "lua") {
|
|
62
|
+
if (valor === "typescript" || valor === "python" || valor === "dart" || valor === "lua" || valor === "javascript" || valor === "html" || valor === "css") {
|
|
63
63
|
return valor;
|
|
64
64
|
}
|
|
65
|
+
if (valor === "js") {
|
|
66
|
+
return "javascript";
|
|
67
|
+
}
|
|
65
68
|
return undefined;
|
|
66
69
|
}
|
|
67
70
|
function resolverEntradaPadrao(cwd, configCarregada) {
|
package/package.json
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@semacode/cli",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "CLI da Sema para validar contratos, medir drift e governar a navegacao operacional de agentes sobre software vivo em backend e front consumer.",
|
|
3
|
+
"version": "1.3.0",
|
|
5
4
|
"type": "module",
|
|
6
|
-
"
|
|
5
|
+
"description": "CLI da Sema para validar contratos, medir drift e governar a navegacao operacional de agentes sobre software vivo em backend e front consumer.",
|
|
7
6
|
"license": "MIT",
|
|
8
7
|
"repository": {
|
|
9
8
|
"type": "git",
|
|
@@ -28,41 +27,25 @@
|
|
|
28
27
|
"publishConfig": {
|
|
29
28
|
"access": "public"
|
|
30
29
|
},
|
|
30
|
+
"icon": "logo.png",
|
|
31
31
|
"bin": {
|
|
32
32
|
"sema": "dist/index.js"
|
|
33
33
|
},
|
|
34
34
|
"main": "dist/index.js",
|
|
35
35
|
"types": "dist/index.d.ts",
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
"exemplos",
|
|
40
|
-
"AGENTS.md",
|
|
41
|
-
"llms.txt",
|
|
42
|
-
"llms-full.txt",
|
|
43
|
-
"SEMA_BRIEF.md",
|
|
44
|
-
"SEMA_BRIEF.micro.txt",
|
|
45
|
-
"SEMA_BRIEF.curto.txt",
|
|
46
|
-
"SEMA_INDEX.json",
|
|
47
|
-
"logo.png",
|
|
48
|
-
"README.md",
|
|
49
|
-
"LICENSE"
|
|
50
|
-
],
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc -p tsconfig.json"
|
|
38
|
+
},
|
|
51
39
|
"dependencies": {
|
|
52
|
-
"@sema/nucleo": "
|
|
53
|
-
"@sema/gerador-dart": "
|
|
54
|
-
"@sema/gerador-lua": "
|
|
55
|
-
"@sema/gerador-python": "
|
|
56
|
-
"@sema/gerador-typescript": "
|
|
57
|
-
"@sema/
|
|
40
|
+
"@sema/nucleo": "file:../nucleo",
|
|
41
|
+
"@sema/gerador-dart": "file:../gerador-dart",
|
|
42
|
+
"@sema/gerador-lua": "file:../gerador-lua",
|
|
43
|
+
"@sema/gerador-python": "file:../gerador-python",
|
|
44
|
+
"@sema/gerador-typescript": "file:../gerador-typescript",
|
|
45
|
+
"@sema/gerador-javascript": "file:../gerador-javascript",
|
|
46
|
+
"@sema/gerador-html": "file:../gerador-html",
|
|
47
|
+
"@sema/gerador-css": "file:../gerador-css",
|
|
48
|
+
"@sema/padroes": "file:../padroes",
|
|
58
49
|
"typescript": "^5.8.3"
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
"@sema/nucleo",
|
|
62
|
-
"@sema/gerador-dart",
|
|
63
|
-
"@sema/gerador-lua",
|
|
64
|
-
"@sema/gerador-python",
|
|
65
|
-
"@sema/gerador-typescript",
|
|
66
|
-
"@sema/padroes"
|
|
67
|
-
]
|
|
68
|
-
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export interface SimboloCppExtraido {
|
|
2
|
+
simbolo: string;
|
|
3
|
+
retorno?: string;
|
|
4
|
+
parametros: Array<{ nome: string; tipoTexto?: string; obrigatorio: boolean }>;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
function extrairParametrosCpp(assinatura: string): Array<{ nome: string; tipoTexto?: string; obrigatorio: boolean }> {
|
|
8
|
+
return assinatura.split(",").map((parametroBruto) => {
|
|
9
|
+
const parametro = parametroBruto.trim();
|
|
10
|
+
if (!parametro || parametro === "void") {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
const semPadrao = parametro.split("=")[0]?.trim() ?? parametro;
|
|
14
|
+
const partes = semPadrao.split(/\s+/).filter(Boolean);
|
|
15
|
+
if (partes.length < 2) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const nome = partes.at(-1)!.replace(/[&*]+$/, "");
|
|
19
|
+
const tipoTexto = partes.slice(0, -1).join(" ");
|
|
20
|
+
return {
|
|
21
|
+
nome,
|
|
22
|
+
tipoTexto,
|
|
23
|
+
obrigatorio: !parametro.includes("="),
|
|
24
|
+
};
|
|
25
|
+
}).filter((item): item is NonNullable<typeof item> => Boolean(item));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function extrairSimbolosCpp(codigo: string): SimboloCppExtraido[] {
|
|
29
|
+
const simbolos = new Map<string, SimboloCppExtraido>();
|
|
30
|
+
|
|
31
|
+
for (const match of codigo.matchAll(/(?:^|\n)\s*(?:inline\s+|static\s+|virtual\s+|constexpr\s+|friend\s+|extern\s+|template\s*<[^>]+>\s*)*(?:[\w:<>~*&]+\s+)+([A-Za-z_]\w*)::([A-Za-z_]\w*)\s*\(([^)]*)\)\s*(?:const)?\s*(?:\{|;)/g)) {
|
|
32
|
+
const simbolo = `${match[1]!}.${match[2]!}`;
|
|
33
|
+
simbolos.set(simbolo, {
|
|
34
|
+
simbolo,
|
|
35
|
+
parametros: extrairParametrosCpp(match[3] ?? ""),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
for (const match of codigo.matchAll(/(?:^|\n)\s*(?:inline\s+|static\s+|virtual\s+|constexpr\s+|friend\s+|extern\s+)*(?:[\w:<>~*&]+\s+)+([A-Za-z_]\w*)\s*\(([^)]*)\)\s*(?:const)?\s*(?:\{|;)/g)) {
|
|
40
|
+
const nome = match[1]!;
|
|
41
|
+
if (["if", "for", "while", "switch", "return"].includes(nome)) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (!simbolos.has(nome)) {
|
|
45
|
+
simbolos.set(nome, {
|
|
46
|
+
simbolo: nome,
|
|
47
|
+
parametros: extrairParametrosCpp(match[2] ?? ""),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const pilhaClasses: string[] = [];
|
|
53
|
+
for (const linha of codigo.split(/\r?\n/)) {
|
|
54
|
+
const trim = linha.trim();
|
|
55
|
+
const classe = trim.match(/^(?:class|struct)\s+([A-Za-z_]\w*)/);
|
|
56
|
+
if (classe) {
|
|
57
|
+
pilhaClasses.push(classe[1]!);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (trim.startsWith("};") || trim === "}" || trim === "};") {
|
|
61
|
+
pilhaClasses.pop();
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const metodoClasse = trim.match(/^(?:inline\s+|static\s+|virtual\s+|constexpr\s+)*(?:[\w:<>~*&]+\s+)+([A-Za-z_]\w*)\s*\(([^)]*)\)\s*(?:const)?\s*\{/);
|
|
66
|
+
if (metodoClasse && pilhaClasses.length > 0) {
|
|
67
|
+
const nomeClasse = pilhaClasses[pilhaClasses.length - 1]!;
|
|
68
|
+
const nomeMetodo = metodoClasse[1]!;
|
|
69
|
+
if (!["if", "for", "while", "switch"].includes(nomeMetodo)) {
|
|
70
|
+
const simbolo = `${nomeClasse}.${nomeMetodo}`;
|
|
71
|
+
if (!simbolos.has(simbolo)) {
|
|
72
|
+
simbolos.set(simbolo, {
|
|
73
|
+
simbolo,
|
|
74
|
+
parametros: extrairParametrosCpp(metodoClasse[2] ?? ""),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return [...simbolos.values()];
|
|
82
|
+
}
|