@semacode/cli 1.3.1 → 1.3.5
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/dist/index.js +33 -27
- package/package.json +10 -10
- package/semacode-cli-1.3.1.tgz +0 -0
- package/src/index.ts +332 -326
package/dist/index.js
CHANGED
|
@@ -60,8 +60,8 @@ Comandos essenciais:
|
|
|
60
60
|
- validacao: \`sema validar <arquivo.sema> --json\`
|
|
61
61
|
- diagnosticos: \`sema diagnosticos <arquivo.sema> --json\`
|
|
62
62
|
- formatacao: \`sema formatar <arquivo.sema>\`
|
|
63
|
-
- importacao assistida de legado: \`sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> --saida <diretorio>\`
|
|
64
|
-
- geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>\`
|
|
63
|
+
- importacao assistida de legado: \`sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> --saida <diretorio>\`
|
|
64
|
+
- geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>\`
|
|
65
65
|
- verificacao final: \`sema verificar <arquivo-ou-pasta> [--json]\`
|
|
66
66
|
|
|
67
67
|
Antes de editar:
|
|
@@ -100,24 +100,24 @@ Superficies que a IA deve enxergar como first-class:
|
|
|
100
100
|
|
|
101
101
|
Nao improvise quando faltar contexto.
|
|
102
102
|
`;
|
|
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
|
|
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
|
|
121
121
|
- use diagnosticos estruturados como contrato de correcao
|
|
122
122
|
- use a IR como fonte de verdade semantica quando houver duvida
|
|
123
123
|
- nao conclua uma alteracao sem validar e verificar o modulo
|
|
@@ -432,29 +432,35 @@ async function escreverArquivos(base, arquivos) {
|
|
|
432
432
|
}
|
|
433
433
|
}
|
|
434
434
|
function obterOpcao(args, nome, padrao) {
|
|
435
|
-
const
|
|
436
|
-
|
|
437
|
-
|
|
435
|
+
const nomes = [nome, ...Object.entries(ALIAS_OPCOES).filter(([, v]) => v === nome).map(([k]) => k)];
|
|
436
|
+
for (const n of nomes) {
|
|
437
|
+
const indice = args.findIndex((arg) => arg === n);
|
|
438
|
+
if (indice !== -1)
|
|
439
|
+
return args[indice + 1] ?? padrao;
|
|
438
440
|
}
|
|
439
|
-
return
|
|
441
|
+
return padrao;
|
|
440
442
|
}
|
|
441
443
|
function possuiFlag(args, nome) {
|
|
442
444
|
return args.includes(nome);
|
|
443
445
|
}
|
|
444
446
|
const OPCOES_COM_VALOR = new Set([
|
|
445
447
|
"--template",
|
|
446
|
-
"--alvo",
|
|
447
|
-
"--saida",
|
|
448
|
+
"--alvo", "-a",
|
|
449
|
+
"--saida", "-s",
|
|
448
450
|
"--estrutura",
|
|
449
451
|
"--framework",
|
|
450
452
|
"--namespace",
|
|
451
453
|
"--para",
|
|
452
454
|
]);
|
|
455
|
+
const ALIAS_OPCOES = {
|
|
456
|
+
"-a": "--alvo",
|
|
457
|
+
"-s": "--saida",
|
|
458
|
+
};
|
|
453
459
|
function obterPosicionais(args) {
|
|
454
460
|
const posicionais = [];
|
|
455
461
|
for (let indice = 0; indice < args.length; indice += 1) {
|
|
456
462
|
const atual = args[indice];
|
|
457
|
-
if (atual.startsWith("
|
|
463
|
+
if (atual.startsWith("-")) {
|
|
458
464
|
if (OPCOES_COM_VALOR.has(atual)) {
|
|
459
465
|
indice += 1;
|
|
460
466
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@semacode/cli",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.5",
|
|
4
4
|
"type": "module",
|
|
5
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.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -37,15 +37,15 @@
|
|
|
37
37
|
"build": "tsc -p tsconfig.json"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@sema/nucleo": "
|
|
41
|
-
"@sema/gerador-dart": "
|
|
42
|
-
"@sema/gerador-lua": "
|
|
43
|
-
"@sema/gerador-python": "
|
|
44
|
-
"@sema/gerador-typescript": "
|
|
45
|
-
"@sema/gerador-javascript": "
|
|
46
|
-
"@sema/gerador-html": "
|
|
47
|
-
"@sema/gerador-css": "
|
|
48
|
-
"@sema/padroes": "
|
|
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",
|
|
49
49
|
"typescript": "^5.8.3"
|
|
50
50
|
},
|
|
51
51
|
"bundleDependencies": [
|
|
Binary file
|
package/src/index.ts
CHANGED
|
@@ -12,14 +12,14 @@ import {
|
|
|
12
12
|
temErros,
|
|
13
13
|
type IrModulo,
|
|
14
14
|
} from "@sema/nucleo";
|
|
15
|
-
import { descreverEstruturaModulo, type AlvoGeracao, type FrameworkGeracao } from "@sema/padroes";
|
|
16
|
-
import { gerarDart } from "@sema/gerador-dart";
|
|
17
|
-
import { gerarLua } from "@sema/gerador-lua";
|
|
18
|
-
import { gerarPython } from "@sema/gerador-python";
|
|
19
|
-
import { gerarTypeScript } from "@sema/gerador-typescript";
|
|
20
|
-
import { gerarJavaScript } from "@sema/gerador-javascript";
|
|
21
|
-
import { gerarHtml } from "@sema/gerador-html";
|
|
22
|
-
import { gerarCss } from "@sema/gerador-css";
|
|
15
|
+
import { descreverEstruturaModulo, type AlvoGeracao, type FrameworkGeracao } from "@sema/padroes";
|
|
16
|
+
import { gerarDart } from "@sema/gerador-dart";
|
|
17
|
+
import { gerarLua } from "@sema/gerador-lua";
|
|
18
|
+
import { gerarPython } from "@sema/gerador-python";
|
|
19
|
+
import { gerarTypeScript } from "@sema/gerador-typescript";
|
|
20
|
+
import { gerarJavaScript } from "@sema/gerador-javascript";
|
|
21
|
+
import { gerarHtml } from "@sema/gerador-html";
|
|
22
|
+
import { gerarCss } from "@sema/gerador-css";
|
|
23
23
|
import {
|
|
24
24
|
carregarConfiguracaoProjeto,
|
|
25
25
|
carregarProjeto,
|
|
@@ -80,16 +80,16 @@ interface ResultadoExecucaoTestes {
|
|
|
80
80
|
quantidadeTestes: number;
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
interface ResumoAlvoVerificacao {
|
|
84
|
-
alvo: AlvoGeracao;
|
|
85
|
-
arquivosGerados: number;
|
|
86
|
-
quantidadeTestes: number;
|
|
87
|
-
pastaSaida: string;
|
|
88
|
-
sucesso: boolean;
|
|
89
|
-
framework: FrameworkGeracao;
|
|
90
|
-
estrutura: EstruturaSaida;
|
|
91
|
-
testesExecutados: boolean;
|
|
92
|
-
}
|
|
83
|
+
interface ResumoAlvoVerificacao {
|
|
84
|
+
alvo: AlvoGeracao;
|
|
85
|
+
arquivosGerados: number;
|
|
86
|
+
quantidadeTestes: number;
|
|
87
|
+
pastaSaida: string;
|
|
88
|
+
sucesso: boolean;
|
|
89
|
+
framework: FrameworkGeracao;
|
|
90
|
+
estrutura: EstruturaSaida;
|
|
91
|
+
testesExecutados: boolean;
|
|
92
|
+
}
|
|
93
93
|
|
|
94
94
|
interface ResumoModuloVerificacao {
|
|
95
95
|
modulo: string;
|
|
@@ -266,8 +266,8 @@ Comandos essenciais:
|
|
|
266
266
|
- validacao: \`sema validar <arquivo.sema> --json\`
|
|
267
267
|
- diagnosticos: \`sema diagnosticos <arquivo.sema> --json\`
|
|
268
268
|
- formatacao: \`sema formatar <arquivo.sema>\`
|
|
269
|
-
- importacao assistida de legado: \`sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> --saida <diretorio>\`
|
|
270
|
-
- geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>\`
|
|
269
|
+
- importacao assistida de legado: \`sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> --saida <diretorio>\`
|
|
270
|
+
- geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>\`
|
|
271
271
|
- verificacao final: \`sema verificar <arquivo-ou-pasta> [--json]\`
|
|
272
272
|
|
|
273
273
|
Antes de editar:
|
|
@@ -307,24 +307,24 @@ Superficies que a IA deve enxergar como first-class:
|
|
|
307
307
|
Nao improvise quando faltar contexto.
|
|
308
308
|
`;
|
|
309
309
|
|
|
310
|
-
const PROMPT_BASE_IA = `Voce esta trabalhando com Sema, um Protocolo de Governanca de Intencao orientado a contrato, desenhado para operacao por IA.
|
|
311
|
-
|
|
312
|
-
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.
|
|
313
|
-
|
|
314
|
-
Fontes de verdade, em ordem:
|
|
315
|
-
1. se o projeto expuser \`SEMA_CONTEXT.md\`, comece por ele
|
|
316
|
-
2. \`SEMA_BRIEF.md\`
|
|
317
|
-
3. \`SEMA_INDEX.json\`
|
|
318
|
-
4. README do projeto
|
|
319
|
-
5. gramatica e documentacao de sintaxe da Sema
|
|
320
|
-
6. especificacao semantica da linguagem
|
|
321
|
-
7. exemplos oficiais, com prioridade para o vertical de pagamento
|
|
322
|
-
8. \`sema resumo\` e \`briefing.min.json\` quando a IA for pequena
|
|
323
|
-
9. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar
|
|
324
|
-
|
|
325
|
-
Regras de operacao:
|
|
326
|
-
- preserve o significado semantico
|
|
327
|
-
- use o formatador oficial da Sema como fonte unica de estilo
|
|
310
|
+
const PROMPT_BASE_IA = `Voce esta trabalhando com Sema, um Protocolo de Governanca de Intencao orientado a contrato, desenhado para operacao por IA.
|
|
311
|
+
|
|
312
|
+
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.
|
|
313
|
+
|
|
314
|
+
Fontes de verdade, em ordem:
|
|
315
|
+
1. se o projeto expuser \`SEMA_CONTEXT.md\`, comece por ele
|
|
316
|
+
2. \`SEMA_BRIEF.md\`
|
|
317
|
+
3. \`SEMA_INDEX.json\`
|
|
318
|
+
4. README do projeto
|
|
319
|
+
5. gramatica e documentacao de sintaxe da Sema
|
|
320
|
+
6. especificacao semantica da linguagem
|
|
321
|
+
7. exemplos oficiais, com prioridade para o vertical de pagamento
|
|
322
|
+
8. \`sema resumo\` e \`briefing.min.json\` quando a IA for pequena
|
|
323
|
+
9. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar
|
|
324
|
+
|
|
325
|
+
Regras de operacao:
|
|
326
|
+
- preserve o significado semantico
|
|
327
|
+
- use o formatador oficial da Sema como fonte unica de estilo
|
|
328
328
|
- use diagnosticos estruturados como contrato de correcao
|
|
329
329
|
- use a IR como fonte de verdade semantica quando houver duvida
|
|
330
330
|
- nao conclua uma alteracao sem validar e verificar o modulo
|
|
@@ -582,7 +582,7 @@ function ajuda(): string {
|
|
|
582
582
|
"[1] Projeto novo / producao inicial",
|
|
583
583
|
"sema iniciar --template <base|nestjs|fastapi|nextjs-api|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer>",
|
|
584
584
|
"sema validar contratos/<modulo>.sema --json",
|
|
585
|
-
"sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>",
|
|
585
|
+
"sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>",
|
|
586
586
|
"sema verificar <arquivo-ou-pasta> --json",
|
|
587
587
|
"",
|
|
588
588
|
"[2] Editar projeto que ja usa Sema",
|
|
@@ -607,11 +607,11 @@ function ajuda(): string {
|
|
|
607
607
|
renderizarSecaoAscii("Comandos principais", [
|
|
608
608
|
"descoberta: sema inspecionar [arquivo-ou-pasta] [--json]",
|
|
609
609
|
"auditoria: sema drift <arquivo-ou-pasta> [--json]",
|
|
610
|
-
"importacao: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]",
|
|
610
|
+
"importacao: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]",
|
|
611
611
|
"validacao: sema validar <arquivo-ou-pasta> [--json]",
|
|
612
612
|
"diagnostico: sema diagnosticos <arquivo.sema> [--json]",
|
|
613
|
-
"geracao: sema compilar <arquivo-ou-pasta> --alvo <python|typescript|dart|lua> --saida <diretorio> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
|
|
614
|
-
"teste local: sema testar <arquivo.sema> --alvo <python|typescript|dart|lua> --saida <diretorio-temporario> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
|
|
613
|
+
"geracao: sema compilar <arquivo-ou-pasta> --alvo <python|typescript|dart|lua> --saida <diretorio> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
|
|
614
|
+
"teste local: sema testar <arquivo.sema> --alvo <python|typescript|dart|lua> --saida <diretorio-temporario> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
|
|
615
615
|
"verificacao final: sema verificar <arquivo-ou-pasta> [--saida <diretorio-base>] [--json]",
|
|
616
616
|
"formatacao: sema formatar <arquivo-ou-pasta> [--check] [--json]",
|
|
617
617
|
]),
|
|
@@ -651,11 +651,12 @@ async function escreverArquivos(base: string, arquivos: Array<{ caminhoRelativo:
|
|
|
651
651
|
}
|
|
652
652
|
|
|
653
653
|
function obterOpcao(args: string[], nome: string, padrao?: string): string | undefined {
|
|
654
|
-
const
|
|
655
|
-
|
|
656
|
-
|
|
654
|
+
const nomes = [nome, ...Object.entries(ALIAS_OPCOES).filter(([, v]) => v === nome).map(([k]) => k)];
|
|
655
|
+
for (const n of nomes) {
|
|
656
|
+
const indice = args.findIndex((arg) => arg === n);
|
|
657
|
+
if (indice !== -1) return args[indice + 1] ?? padrao;
|
|
657
658
|
}
|
|
658
|
-
return
|
|
659
|
+
return padrao;
|
|
659
660
|
}
|
|
660
661
|
|
|
661
662
|
function possuiFlag(args: string[], nome: string): boolean {
|
|
@@ -664,19 +665,24 @@ function possuiFlag(args: string[], nome: string): boolean {
|
|
|
664
665
|
|
|
665
666
|
const OPCOES_COM_VALOR = new Set([
|
|
666
667
|
"--template",
|
|
667
|
-
"--alvo",
|
|
668
|
-
"--saida",
|
|
668
|
+
"--alvo", "-a",
|
|
669
|
+
"--saida", "-s",
|
|
669
670
|
"--estrutura",
|
|
670
671
|
"--framework",
|
|
671
672
|
"--namespace",
|
|
672
673
|
"--para",
|
|
673
674
|
]);
|
|
674
675
|
|
|
676
|
+
const ALIAS_OPCOES: Record<string, string> = {
|
|
677
|
+
"-a": "--alvo",
|
|
678
|
+
"-s": "--saida",
|
|
679
|
+
};
|
|
680
|
+
|
|
675
681
|
function obterPosicionais(args: string[]): string[] {
|
|
676
682
|
const posicionais: string[] = [];
|
|
677
683
|
for (let indice = 0; indice < args.length; indice += 1) {
|
|
678
684
|
const atual = args[indice]!;
|
|
679
|
-
if (atual.startsWith("
|
|
685
|
+
if (atual.startsWith("-")) {
|
|
680
686
|
if (OPCOES_COM_VALOR.has(atual)) {
|
|
681
687
|
indice += 1;
|
|
682
688
|
}
|
|
@@ -754,11 +760,11 @@ function validarCompatibilidadeFramework(alvo: AlvoGeracao, framework: Framework
|
|
|
754
760
|
if (framework === "fastapi" && alvo !== "python") {
|
|
755
761
|
return `Framework "${framework}" so pode ser usado com o alvo python.`;
|
|
756
762
|
}
|
|
757
|
-
if (alvo === "dart" || alvo === "lua" || alvo === "javascript" || alvo === "html" || alvo === "css") {
|
|
758
|
-
return `Framework "${framework}" nao e suportado para o alvo ${alvo}.`;
|
|
759
|
-
}
|
|
760
|
-
return undefined;
|
|
761
|
-
}
|
|
763
|
+
if (alvo === "dart" || alvo === "lua" || alvo === "javascript" || alvo === "html" || alvo === "css") {
|
|
764
|
+
return `Framework "${framework}" nao e suportado para o alvo ${alvo}.`;
|
|
765
|
+
}
|
|
766
|
+
return undefined;
|
|
767
|
+
}
|
|
762
768
|
|
|
763
769
|
function normalizarFonteImportacao(valor: string | undefined): FonteImportacao | undefined {
|
|
764
770
|
if (!valor) {
|
|
@@ -826,10 +832,10 @@ function normalizarFonteImportacao(valor: string | undefined): FonteImportacao |
|
|
|
826
832
|
|| valor === "cpp"
|
|
827
833
|
|| valor === "typescript"
|
|
828
834
|
|| valor === "python"
|
|
829
|
-
|| valor === "dart"
|
|
830
|
-
) {
|
|
831
|
-
return valor;
|
|
832
|
-
}
|
|
835
|
+
|| valor === "dart"
|
|
836
|
+
) {
|
|
837
|
+
return valor;
|
|
838
|
+
}
|
|
833
839
|
return undefined;
|
|
834
840
|
}
|
|
835
841
|
|
|
@@ -861,27 +867,27 @@ function garantirIr(resultado: ReturnType<typeof compilarCodigo>, caminho: strin
|
|
|
861
867
|
return resultado.ir;
|
|
862
868
|
}
|
|
863
869
|
|
|
864
|
-
function gerarArquivosPorAlvo(ir: IrModulo, alvo: AlvoGeracao, framework: FrameworkGeracao) {
|
|
865
|
-
if (alvo === "python") {
|
|
866
|
-
return gerarPython(ir, { framework });
|
|
867
|
-
}
|
|
868
|
-
if (alvo === "dart") {
|
|
869
|
-
return gerarDart(ir);
|
|
870
|
-
}
|
|
871
|
-
if (alvo === "lua") {
|
|
872
|
-
return gerarLua(ir);
|
|
873
|
-
}
|
|
874
|
-
if (alvo === "javascript") {
|
|
875
|
-
return gerarJavaScript(ir);
|
|
876
|
-
}
|
|
877
|
-
if (alvo === "html") {
|
|
878
|
-
return gerarHtml(ir);
|
|
879
|
-
}
|
|
880
|
-
if (alvo === "css") {
|
|
881
|
-
return gerarCss(ir);
|
|
882
|
-
}
|
|
883
|
-
return gerarTypeScript(ir, { framework });
|
|
884
|
-
}
|
|
870
|
+
function gerarArquivosPorAlvo(ir: IrModulo, alvo: AlvoGeracao, framework: FrameworkGeracao) {
|
|
871
|
+
if (alvo === "python") {
|
|
872
|
+
return gerarPython(ir, { framework });
|
|
873
|
+
}
|
|
874
|
+
if (alvo === "dart") {
|
|
875
|
+
return gerarDart(ir);
|
|
876
|
+
}
|
|
877
|
+
if (alvo === "lua") {
|
|
878
|
+
return gerarLua(ir);
|
|
879
|
+
}
|
|
880
|
+
if (alvo === "javascript") {
|
|
881
|
+
return gerarJavaScript(ir);
|
|
882
|
+
}
|
|
883
|
+
if (alvo === "html") {
|
|
884
|
+
return gerarHtml(ir);
|
|
885
|
+
}
|
|
886
|
+
if (alvo === "css") {
|
|
887
|
+
return gerarCss(ir);
|
|
888
|
+
}
|
|
889
|
+
return gerarTypeScript(ir, { framework });
|
|
890
|
+
}
|
|
885
891
|
|
|
886
892
|
function aplicarEstruturaSaida(
|
|
887
893
|
arquivos: Array<{ caminhoRelativo: string; conteudo: string }>,
|
|
@@ -912,23 +918,23 @@ function aplicarEstruturaSaida(
|
|
|
912
918
|
} else if (basename === `test_${nomeBaseAntigo}.py`) {
|
|
913
919
|
novoBasename = `test_${nomeArquivo}.py`;
|
|
914
920
|
conteudo = conteudo.replace(`from ${nomeBaseAntigo} import *`, `from ${nomeArquivo} import *`);
|
|
915
|
-
} else if (basename === `${nomeBaseAntigo}.dart`) {
|
|
916
|
-
novoBasename = `${nomeArquivo}.dart`;
|
|
917
|
-
} else if (basename === `${nomeBaseAntigo}.lua`) {
|
|
918
|
-
novoBasename = `${nomeArquivo}.lua`;
|
|
919
|
-
} else if (basename === `test_${nomeBaseAntigo}.lua`) {
|
|
920
|
-
novoBasename = `test_${nomeArquivo}.lua`;
|
|
921
|
-
conteudo = conteudo.replace(`${nomeBaseAntigo}.lua`, `${nomeArquivo}.lua`);
|
|
922
|
-
} else if (basename === `${nomeBaseAntigo}.js`) {
|
|
923
|
-
novoBasename = `${nomeArquivo}.js`;
|
|
924
|
-
} else if (basename === `${nomeBaseAntigo}.test.js`) {
|
|
925
|
-
novoBasename = `${nomeArquivo}.test.js`;
|
|
926
|
-
conteudo = conteudo.replace(`./${nomeBaseAntigo}.js`, `./${nomeArquivo}.js`);
|
|
927
|
-
} else if (basename === `${nomeBaseAntigo}.html`) {
|
|
928
|
-
novoBasename = `${nomeArquivo}.html`;
|
|
929
|
-
} else if (basename === `${nomeBaseAntigo}.css`) {
|
|
930
|
-
novoBasename = `${nomeArquivo}.css`;
|
|
931
|
-
}
|
|
921
|
+
} else if (basename === `${nomeBaseAntigo}.dart`) {
|
|
922
|
+
novoBasename = `${nomeArquivo}.dart`;
|
|
923
|
+
} else if (basename === `${nomeBaseAntigo}.lua`) {
|
|
924
|
+
novoBasename = `${nomeArquivo}.lua`;
|
|
925
|
+
} else if (basename === `test_${nomeBaseAntigo}.lua`) {
|
|
926
|
+
novoBasename = `test_${nomeArquivo}.lua`;
|
|
927
|
+
conteudo = conteudo.replace(`${nomeBaseAntigo}.lua`, `${nomeArquivo}.lua`);
|
|
928
|
+
} else if (basename === `${nomeBaseAntigo}.js`) {
|
|
929
|
+
novoBasename = `${nomeArquivo}.js`;
|
|
930
|
+
} else if (basename === `${nomeBaseAntigo}.test.js`) {
|
|
931
|
+
novoBasename = `${nomeArquivo}.test.js`;
|
|
932
|
+
conteudo = conteudo.replace(`./${nomeBaseAntigo}.js`, `./${nomeArquivo}.js`);
|
|
933
|
+
} else if (basename === `${nomeBaseAntigo}.html`) {
|
|
934
|
+
novoBasename = `${nomeArquivo}.html`;
|
|
935
|
+
} else if (basename === `${nomeBaseAntigo}.css`) {
|
|
936
|
+
novoBasename = `${nomeArquivo}.css`;
|
|
937
|
+
}
|
|
932
938
|
|
|
933
939
|
return {
|
|
934
940
|
caminhoRelativo: pastaModulo ? path.join(pastaModulo, novoBasename) : novoBasename,
|
|
@@ -937,32 +943,32 @@ function aplicarEstruturaSaida(
|
|
|
937
943
|
});
|
|
938
944
|
}
|
|
939
945
|
|
|
940
|
-
function contarCasosDeTesteGerados(alvo: AlvoGeracao, arquivos: Array<{ caminhoRelativo: string; conteudo: string }>): number {
|
|
941
|
-
if (alvo === "dart" || alvo === "html" || alvo === "css") {
|
|
942
|
-
return 0;
|
|
943
|
-
}
|
|
944
|
-
if (alvo === "lua") {
|
|
945
|
-
const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_") && item.caminhoRelativo.endsWith(".lua"));
|
|
946
|
-
if (!arquivoTeste) {
|
|
947
|
-
return 0;
|
|
948
|
-
}
|
|
949
|
-
return (arquivoTeste.conteudo.match(/\blocal function test_/g) ?? []).length;
|
|
950
|
-
}
|
|
951
|
-
|
|
952
|
-
if (alvo === "typescript") {
|
|
946
|
+
function contarCasosDeTesteGerados(alvo: AlvoGeracao, arquivos: Array<{ caminhoRelativo: string; conteudo: string }>): number {
|
|
947
|
+
if (alvo === "dart" || alvo === "html" || alvo === "css") {
|
|
948
|
+
return 0;
|
|
949
|
+
}
|
|
950
|
+
if (alvo === "lua") {
|
|
951
|
+
const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_") && item.caminhoRelativo.endsWith(".lua"));
|
|
952
|
+
if (!arquivoTeste) {
|
|
953
|
+
return 0;
|
|
954
|
+
}
|
|
955
|
+
return (arquivoTeste.conteudo.match(/\blocal function test_/g) ?? []).length;
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
if (alvo === "typescript") {
|
|
953
959
|
const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.ts"));
|
|
954
960
|
if (!arquivoTeste) {
|
|
955
961
|
return 0;
|
|
956
962
|
}
|
|
957
963
|
return (arquivoTeste.conteudo.match(/\btest\(/g) ?? []).length;
|
|
958
|
-
}
|
|
959
|
-
|
|
960
|
-
if (alvo === "javascript") {
|
|
961
|
-
const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.js"));
|
|
962
|
-
if (!arquivoTeste) {
|
|
963
|
-
return 0;
|
|
964
|
-
}
|
|
965
|
-
return (arquivoTeste.conteudo.match(/\btest\(/g) ?? []).length;
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
if (alvo === "javascript") {
|
|
967
|
+
const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.js"));
|
|
968
|
+
if (!arquivoTeste) {
|
|
969
|
+
return 0;
|
|
970
|
+
}
|
|
971
|
+
return (arquivoTeste.conteudo.match(/\btest\(/g) ?? []).length;
|
|
966
972
|
}
|
|
967
973
|
|
|
968
974
|
const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_"));
|
|
@@ -972,24 +978,24 @@ function contarCasosDeTesteGerados(alvo: AlvoGeracao, arquivos: Array<{ caminhoR
|
|
|
972
978
|
return (arquivoTeste.conteudo.match(/\bdef test_/g) ?? []).length;
|
|
973
979
|
}
|
|
974
980
|
|
|
975
|
-
function executarTestesGerados(
|
|
976
|
-
alvo: AlvoGeracao,
|
|
977
|
-
baseSaida: string,
|
|
978
|
-
arquivos: Array<{ caminhoRelativo: string; conteudo: string }>,
|
|
981
|
+
function executarTestesGerados(
|
|
982
|
+
alvo: AlvoGeracao,
|
|
983
|
+
baseSaida: string,
|
|
984
|
+
arquivos: Array<{ caminhoRelativo: string; conteudo: string }>,
|
|
979
985
|
silencioso = false,
|
|
980
986
|
): SaidaTesteCapturada {
|
|
981
|
-
const quantidadeTestes = contarCasosDeTesteGerados(alvo, arquivos);
|
|
982
|
-
if (quantidadeTestes === 0) {
|
|
983
|
-
if (!silencioso) {
|
|
984
|
-
const nomesAlvo: Record<AlvoGeracao, string> = { typescript: "TypeScript", python: "Python", lua: "Lua", dart: "Dart", javascript: "JavaScript", html: "HTML", css: "CSS" };
|
|
985
|
-
console.log(`Nenhum teste ${nomesAlvo[alvo] ?? alvo} foi gerado.`);
|
|
986
|
-
}
|
|
987
|
-
return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
|
|
988
|
-
}
|
|
989
|
-
|
|
990
|
-
if (alvo === "html" || alvo === "css") {
|
|
991
|
-
return { codigoSaida: 0, quantidadeTestes: 0, saidaPadrao: "", saidaErro: "" };
|
|
992
|
-
}
|
|
987
|
+
const quantidadeTestes = contarCasosDeTesteGerados(alvo, arquivos);
|
|
988
|
+
if (quantidadeTestes === 0) {
|
|
989
|
+
if (!silencioso) {
|
|
990
|
+
const nomesAlvo: Record<AlvoGeracao, string> = { typescript: "TypeScript", python: "Python", lua: "Lua", dart: "Dart", javascript: "JavaScript", html: "HTML", css: "CSS" };
|
|
991
|
+
console.log(`Nenhum teste ${nomesAlvo[alvo] ?? alvo} foi gerado.`);
|
|
992
|
+
}
|
|
993
|
+
return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
if (alvo === "html" || alvo === "css") {
|
|
997
|
+
return { codigoSaida: 0, quantidadeTestes: 0, saidaPadrao: "", saidaErro: "" };
|
|
998
|
+
}
|
|
993
999
|
|
|
994
1000
|
if (alvo === "typescript") {
|
|
995
1001
|
const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.ts"))?.caminhoRelativo;
|
|
@@ -1009,52 +1015,52 @@ function executarTestesGerados(
|
|
|
1009
1015
|
saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
|
|
1010
1016
|
saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
|
|
1011
1017
|
};
|
|
1012
|
-
}
|
|
1013
|
-
|
|
1014
|
-
if (alvo === "javascript") {
|
|
1015
|
-
const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.js"))?.caminhoRelativo;
|
|
1016
|
-
if (!arquivoTeste) {
|
|
1017
|
-
if (!silencioso) {
|
|
1018
|
-
console.log("Nenhum teste JavaScript foi gerado.");
|
|
1019
|
-
}
|
|
1020
|
-
return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
|
|
1021
|
-
}
|
|
1022
|
-
const execucao = spawnSync("node", ["--test", path.join(baseSaida, arquivoTeste)], {
|
|
1023
|
-
stdio: silencioso ? "pipe" : "inherit",
|
|
1024
|
-
encoding: silencioso ? "utf8" : undefined,
|
|
1025
|
-
});
|
|
1026
|
-
return {
|
|
1027
|
-
codigoSaida: execucao.status ?? 1,
|
|
1028
|
-
quantidadeTestes,
|
|
1029
|
-
saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
|
|
1030
|
-
saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
|
|
1031
|
-
};
|
|
1032
|
-
}
|
|
1033
|
-
|
|
1034
|
-
if (alvo === "lua") {
|
|
1035
|
-
const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_") && item.caminhoRelativo.endsWith(".lua"))?.caminhoRelativo;
|
|
1036
|
-
if (!arquivoTeste) {
|
|
1037
|
-
if (!silencioso) {
|
|
1038
|
-
console.log("Nenhum teste Lua foi gerado.");
|
|
1039
|
-
}
|
|
1040
|
-
return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
|
|
1041
|
-
}
|
|
1042
|
-
const execucao = spawnSync("lua", [arquivoTeste], {
|
|
1043
|
-
stdio: silencioso ? "pipe" : "inherit",
|
|
1044
|
-
cwd: baseSaida,
|
|
1045
|
-
encoding: silencioso ? "utf8" : undefined,
|
|
1046
|
-
shell: process.platform === "win32",
|
|
1047
|
-
});
|
|
1048
|
-
return {
|
|
1049
|
-
codigoSaida: execucao.status ?? 1,
|
|
1050
|
-
quantidadeTestes,
|
|
1051
|
-
saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
|
|
1052
|
-
saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
|
|
1053
|
-
};
|
|
1054
|
-
}
|
|
1055
|
-
|
|
1056
|
-
const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_"))?.caminhoRelativo;
|
|
1057
|
-
if (!arquivoTeste) {
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
if (alvo === "javascript") {
|
|
1021
|
+
const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.js"))?.caminhoRelativo;
|
|
1022
|
+
if (!arquivoTeste) {
|
|
1023
|
+
if (!silencioso) {
|
|
1024
|
+
console.log("Nenhum teste JavaScript foi gerado.");
|
|
1025
|
+
}
|
|
1026
|
+
return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
|
|
1027
|
+
}
|
|
1028
|
+
const execucao = spawnSync("node", ["--test", path.join(baseSaida, arquivoTeste)], {
|
|
1029
|
+
stdio: silencioso ? "pipe" : "inherit",
|
|
1030
|
+
encoding: silencioso ? "utf8" : undefined,
|
|
1031
|
+
});
|
|
1032
|
+
return {
|
|
1033
|
+
codigoSaida: execucao.status ?? 1,
|
|
1034
|
+
quantidadeTestes,
|
|
1035
|
+
saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
|
|
1036
|
+
saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
|
|
1037
|
+
};
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
if (alvo === "lua") {
|
|
1041
|
+
const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_") && item.caminhoRelativo.endsWith(".lua"))?.caminhoRelativo;
|
|
1042
|
+
if (!arquivoTeste) {
|
|
1043
|
+
if (!silencioso) {
|
|
1044
|
+
console.log("Nenhum teste Lua foi gerado.");
|
|
1045
|
+
}
|
|
1046
|
+
return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
|
|
1047
|
+
}
|
|
1048
|
+
const execucao = spawnSync("lua", [arquivoTeste], {
|
|
1049
|
+
stdio: silencioso ? "pipe" : "inherit",
|
|
1050
|
+
cwd: baseSaida,
|
|
1051
|
+
encoding: silencioso ? "utf8" : undefined,
|
|
1052
|
+
shell: process.platform === "win32",
|
|
1053
|
+
});
|
|
1054
|
+
return {
|
|
1055
|
+
codigoSaida: execucao.status ?? 1,
|
|
1056
|
+
quantidadeTestes,
|
|
1057
|
+
saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
|
|
1058
|
+
saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
|
|
1059
|
+
};
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_"))?.caminhoRelativo;
|
|
1063
|
+
if (!arquivoTeste) {
|
|
1058
1064
|
if (!silencioso) {
|
|
1059
1065
|
console.log("Nenhum teste Python foi gerado.");
|
|
1060
1066
|
}
|
|
@@ -1065,60 +1071,60 @@ function executarTestesGerados(
|
|
|
1065
1071
|
cwd: baseSaida,
|
|
1066
1072
|
encoding: silencioso ? "utf8" : undefined,
|
|
1067
1073
|
});
|
|
1068
|
-
return {
|
|
1069
|
-
codigoSaida: execucao.status ?? 1,
|
|
1070
|
-
quantidadeTestes,
|
|
1071
|
-
saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
|
|
1072
|
-
saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
|
|
1073
|
-
};
|
|
1074
|
-
}
|
|
1075
|
-
|
|
1076
|
-
function resolverConfiguracaoVerificacaoPorAlvo(
|
|
1077
|
-
alvo: AlvoGeracao,
|
|
1078
|
-
configCarregada?: Awaited<ReturnType<typeof carregarConfiguracaoProjeto>>,
|
|
1079
|
-
): {
|
|
1080
|
-
framework: FrameworkGeracao;
|
|
1081
|
-
estrutura: EstruturaSaida;
|
|
1082
|
-
incompatibilidade?: string;
|
|
1083
|
-
} {
|
|
1084
|
-
const framework = resolverFrameworkPadrao(undefined, configCarregada);
|
|
1085
|
-
const incompatibilidade = validarCompatibilidadeFramework(alvo, framework);
|
|
1086
|
-
const estrutura = resolverEstruturaSaidaPadrao(undefined, framework, configCarregada);
|
|
1087
|
-
|
|
1088
|
-
return {
|
|
1089
|
-
framework,
|
|
1090
|
-
estrutura,
|
|
1091
|
-
incompatibilidade,
|
|
1092
|
-
};
|
|
1093
|
-
}
|
|
1094
|
-
|
|
1095
|
-
function executarTestesParaVerificacao(
|
|
1096
|
-
alvo: AlvoGeracao,
|
|
1097
|
-
baseSaida: string,
|
|
1098
|
-
arquivos: Array<{ caminhoRelativo: string; conteudo: string }>,
|
|
1099
|
-
framework: FrameworkGeracao,
|
|
1100
|
-
silencioso = false,
|
|
1101
|
-
): {
|
|
1102
|
-
execucao: SaidaTesteCapturada;
|
|
1103
|
-
testesExecutados: boolean;
|
|
1104
|
-
} {
|
|
1105
|
-
if (framework !== "base") {
|
|
1106
|
-
return {
|
|
1107
|
-
execucao: {
|
|
1108
|
-
codigoSaida: 0,
|
|
1109
|
-
quantidadeTestes: 0,
|
|
1110
|
-
saidaPadrao: "",
|
|
1111
|
-
saidaErro: "",
|
|
1112
|
-
},
|
|
1113
|
-
testesExecutados: false,
|
|
1114
|
-
};
|
|
1115
|
-
}
|
|
1116
|
-
|
|
1117
|
-
return {
|
|
1118
|
-
execucao: executarTestesGerados(alvo, baseSaida, arquivos, silencioso),
|
|
1119
|
-
testesExecutados: true,
|
|
1120
|
-
};
|
|
1121
|
-
}
|
|
1074
|
+
return {
|
|
1075
|
+
codigoSaida: execucao.status ?? 1,
|
|
1076
|
+
quantidadeTestes,
|
|
1077
|
+
saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
|
|
1078
|
+
saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
|
|
1079
|
+
};
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
function resolverConfiguracaoVerificacaoPorAlvo(
|
|
1083
|
+
alvo: AlvoGeracao,
|
|
1084
|
+
configCarregada?: Awaited<ReturnType<typeof carregarConfiguracaoProjeto>>,
|
|
1085
|
+
): {
|
|
1086
|
+
framework: FrameworkGeracao;
|
|
1087
|
+
estrutura: EstruturaSaida;
|
|
1088
|
+
incompatibilidade?: string;
|
|
1089
|
+
} {
|
|
1090
|
+
const framework = resolverFrameworkPadrao(undefined, configCarregada);
|
|
1091
|
+
const incompatibilidade = validarCompatibilidadeFramework(alvo, framework);
|
|
1092
|
+
const estrutura = resolverEstruturaSaidaPadrao(undefined, framework, configCarregada);
|
|
1093
|
+
|
|
1094
|
+
return {
|
|
1095
|
+
framework,
|
|
1096
|
+
estrutura,
|
|
1097
|
+
incompatibilidade,
|
|
1098
|
+
};
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1101
|
+
function executarTestesParaVerificacao(
|
|
1102
|
+
alvo: AlvoGeracao,
|
|
1103
|
+
baseSaida: string,
|
|
1104
|
+
arquivos: Array<{ caminhoRelativo: string; conteudo: string }>,
|
|
1105
|
+
framework: FrameworkGeracao,
|
|
1106
|
+
silencioso = false,
|
|
1107
|
+
): {
|
|
1108
|
+
execucao: SaidaTesteCapturada;
|
|
1109
|
+
testesExecutados: boolean;
|
|
1110
|
+
} {
|
|
1111
|
+
if (framework !== "base") {
|
|
1112
|
+
return {
|
|
1113
|
+
execucao: {
|
|
1114
|
+
codigoSaida: 0,
|
|
1115
|
+
quantidadeTestes: 0,
|
|
1116
|
+
saidaPadrao: "",
|
|
1117
|
+
saidaErro: "",
|
|
1118
|
+
},
|
|
1119
|
+
testesExecutados: false,
|
|
1120
|
+
};
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
return {
|
|
1124
|
+
execucao: executarTestesGerados(alvo, baseSaida, arquivos, silencioso),
|
|
1125
|
+
testesExecutados: true,
|
|
1126
|
+
};
|
|
1127
|
+
}
|
|
1122
1128
|
|
|
1123
1129
|
function nomeSubpastaModulo(caminhoArquivo: string): string {
|
|
1124
1130
|
return path.basename(caminhoArquivo, ".sema");
|
|
@@ -3847,7 +3853,7 @@ async function comandoAjudaIa(): Promise<number> {
|
|
|
3847
3853
|
"Use `sema inspecionar` para descobrir base, codigo vivo e fontes legado.",
|
|
3848
3854
|
"Use `sema drift` para medir impls, vinculos, rotas, score e lacunas.",
|
|
3849
3855
|
"Use `sema contexto-ia <arquivo.sema>` para gerar AST, IR, drift, `briefing.json` e `briefing.min.json`.",
|
|
3850
|
-
"Use `sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>` quando a tarefa pedir codigo derivado.",
|
|
3856
|
+
"Use `sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>` quando a tarefa pedir codigo derivado.",
|
|
3851
3857
|
]));
|
|
3852
3858
|
console.log("");
|
|
3853
3859
|
console.log(renderizarSecaoAscii("Regras praticas", [
|
|
@@ -4125,14 +4131,14 @@ function imprimirResumoVerificacao(resumos: ResumoModuloVerificacao[]): void {
|
|
|
4125
4131
|
for (const resumo of resumos) {
|
|
4126
4132
|
console.log(`- Modulo ${resumo.modulo} (${resumo.arquivoFonte})`);
|
|
4127
4133
|
for (const alvo of resumo.alvos) {
|
|
4128
|
-
totalArquivos += alvo.arquivosGerados;
|
|
4129
|
-
totalTestes += alvo.quantidadeTestes;
|
|
4130
|
-
totalAlvos += 1;
|
|
4131
|
-
console.log(
|
|
4132
|
-
` alvo=${alvo.alvo} framework=${alvo.framework} estrutura=${alvo.estrutura} status=${alvo.sucesso ? "ok" : "falhou"} arquivos=${alvo.arquivosGerados} testes=${alvo.quantidadeTestes}${alvo.testesExecutados ? "" : " (skip)"} saida=${alvo.pastaSaida}`,
|
|
4133
|
-
);
|
|
4134
|
-
}
|
|
4135
|
-
}
|
|
4134
|
+
totalArquivos += alvo.arquivosGerados;
|
|
4135
|
+
totalTestes += alvo.quantidadeTestes;
|
|
4136
|
+
totalAlvos += 1;
|
|
4137
|
+
console.log(
|
|
4138
|
+
` alvo=${alvo.alvo} framework=${alvo.framework} estrutura=${alvo.estrutura} status=${alvo.sucesso ? "ok" : "falhou"} arquivos=${alvo.arquivosGerados} testes=${alvo.quantidadeTestes}${alvo.testesExecutados ? "" : " (skip)"} saida=${alvo.pastaSaida}`,
|
|
4139
|
+
);
|
|
4140
|
+
}
|
|
4141
|
+
}
|
|
4136
4142
|
|
|
4137
4143
|
console.log(`Totais: modulos=${resumos.length} alvos=${totalAlvos} arquivos=${totalArquivos} testes=${totalTestes}`);
|
|
4138
4144
|
}
|
|
@@ -4148,47 +4154,47 @@ async function comandoVerificar(
|
|
|
4148
4154
|
if (temErros(diagnosticos)) {
|
|
4149
4155
|
console.error(formatarDiagnosticos(diagnosticos));
|
|
4150
4156
|
return 1;
|
|
4151
|
-
}
|
|
4152
|
-
|
|
4153
|
-
const alvos = resolverAlvosVerificacao(contextoProjeto.configCarregada);
|
|
4154
|
-
const configuracoesAlvo = alvos.map((alvo) => ({
|
|
4155
|
-
alvo,
|
|
4156
|
-
...resolverConfiguracaoVerificacaoPorAlvo(alvo, contextoProjeto.configCarregada),
|
|
4157
|
-
}));
|
|
4158
|
-
const incompatibilidade = configuracoesAlvo.find((item) => item.incompatibilidade);
|
|
4159
|
-
if (incompatibilidade?.incompatibilidade) {
|
|
4160
|
-
console.error(incompatibilidade.incompatibilidade);
|
|
4161
|
-
return 1;
|
|
4162
|
-
}
|
|
4163
|
-
|
|
4164
|
-
const resumos: ResumoModuloVerificacao[] = [];
|
|
4165
|
-
for (const modulo of modulos) {
|
|
4166
|
-
const ir = garantirIr(modulo.resultado, modulo.caminho);
|
|
4167
|
-
console.log(`Verificando modulo ${modulo.caminho}`);
|
|
4157
|
+
}
|
|
4158
|
+
|
|
4159
|
+
const alvos = resolverAlvosVerificacao(contextoProjeto.configCarregada);
|
|
4160
|
+
const configuracoesAlvo = alvos.map((alvo) => ({
|
|
4161
|
+
alvo,
|
|
4162
|
+
...resolverConfiguracaoVerificacaoPorAlvo(alvo, contextoProjeto.configCarregada),
|
|
4163
|
+
}));
|
|
4164
|
+
const incompatibilidade = configuracoesAlvo.find((item) => item.incompatibilidade);
|
|
4165
|
+
if (incompatibilidade?.incompatibilidade) {
|
|
4166
|
+
console.error(incompatibilidade.incompatibilidade);
|
|
4167
|
+
return 1;
|
|
4168
|
+
}
|
|
4169
|
+
|
|
4170
|
+
const resumos: ResumoModuloVerificacao[] = [];
|
|
4171
|
+
for (const modulo of modulos) {
|
|
4172
|
+
const ir = garantirIr(modulo.resultado, modulo.caminho);
|
|
4173
|
+
console.log(`Verificando modulo ${modulo.caminho}`);
|
|
4168
4174
|
const resumoModulo: ResumoModuloVerificacao = {
|
|
4169
4175
|
modulo: ir.nome,
|
|
4170
|
-
arquivoFonte: modulo.caminho,
|
|
4171
|
-
alvos: [],
|
|
4172
|
-
};
|
|
4173
|
-
for (const configuracaoAlvo of configuracoesAlvo) {
|
|
4174
|
-
const { alvo, framework, estrutura } = configuracaoAlvo;
|
|
4175
|
-
const pastaAlvo = path.join(baseSaida, alvo, nomeSubpastaModulo(modulo.caminho));
|
|
4176
|
-
const arquivos = aplicarEstruturaSaida(gerarArquivosPorAlvo(ir, alvo, framework), ir, estrutura);
|
|
4177
|
-
await escreverArquivos(pastaAlvo, arquivos);
|
|
4178
|
-
const { execucao, testesExecutados } = executarTestesParaVerificacao(alvo, pastaAlvo, arquivos, framework);
|
|
4179
|
-
resumoModulo.alvos.push({
|
|
4180
|
-
alvo,
|
|
4181
|
-
arquivosGerados: arquivos.length,
|
|
4182
|
-
quantidadeTestes: execucao.quantidadeTestes,
|
|
4183
|
-
pastaSaida: pastaAlvo,
|
|
4184
|
-
sucesso: execucao.codigoSaida === 0,
|
|
4185
|
-
framework,
|
|
4186
|
-
estrutura,
|
|
4187
|
-
testesExecutados,
|
|
4188
|
-
});
|
|
4189
|
-
if (execucao.codigoSaida !== 0) {
|
|
4190
|
-
imprimirResumoVerificacao([...resumos, resumoModulo]);
|
|
4191
|
-
console.error(`Falha na verificacao do modulo ${modulo.caminho} para o alvo ${alvo}.`);
|
|
4176
|
+
arquivoFonte: modulo.caminho,
|
|
4177
|
+
alvos: [],
|
|
4178
|
+
};
|
|
4179
|
+
for (const configuracaoAlvo of configuracoesAlvo) {
|
|
4180
|
+
const { alvo, framework, estrutura } = configuracaoAlvo;
|
|
4181
|
+
const pastaAlvo = path.join(baseSaida, alvo, nomeSubpastaModulo(modulo.caminho));
|
|
4182
|
+
const arquivos = aplicarEstruturaSaida(gerarArquivosPorAlvo(ir, alvo, framework), ir, estrutura);
|
|
4183
|
+
await escreverArquivos(pastaAlvo, arquivos);
|
|
4184
|
+
const { execucao, testesExecutados } = executarTestesParaVerificacao(alvo, pastaAlvo, arquivos, framework);
|
|
4185
|
+
resumoModulo.alvos.push({
|
|
4186
|
+
alvo,
|
|
4187
|
+
arquivosGerados: arquivos.length,
|
|
4188
|
+
quantidadeTestes: execucao.quantidadeTestes,
|
|
4189
|
+
pastaSaida: pastaAlvo,
|
|
4190
|
+
sucesso: execucao.codigoSaida === 0,
|
|
4191
|
+
framework,
|
|
4192
|
+
estrutura,
|
|
4193
|
+
testesExecutados,
|
|
4194
|
+
});
|
|
4195
|
+
if (execucao.codigoSaida !== 0) {
|
|
4196
|
+
imprimirResumoVerificacao([...resumos, resumoModulo]);
|
|
4197
|
+
console.error(`Falha na verificacao do modulo ${modulo.caminho} para o alvo ${alvo}.`);
|
|
4192
4198
|
return execucao.codigoSaida;
|
|
4193
4199
|
}
|
|
4194
4200
|
}
|
|
@@ -4217,27 +4223,27 @@ async function comandoVerificarJson(
|
|
|
4217
4223
|
totais: { modulos: 0, alvos: 0, arquivos: 0, testes: 0 },
|
|
4218
4224
|
}, null, 2));
|
|
4219
4225
|
return 1;
|
|
4220
|
-
}
|
|
4221
|
-
|
|
4222
|
-
const alvos = resolverAlvosVerificacao(contextoProjeto.configCarregada);
|
|
4223
|
-
const configuracoesAlvo = alvos.map((alvo) => ({
|
|
4224
|
-
alvo,
|
|
4225
|
-
...resolverConfiguracaoVerificacaoPorAlvo(alvo, contextoProjeto.configCarregada),
|
|
4226
|
-
}));
|
|
4227
|
-
const incompatibilidade = configuracoesAlvo.find((item) => item.incompatibilidade);
|
|
4228
|
-
if (incompatibilidade?.incompatibilidade) {
|
|
4229
|
-
console.log(JSON.stringify({
|
|
4230
|
-
comando: "verificar",
|
|
4231
|
-
sucesso: false,
|
|
4232
|
-
erro: incompatibilidade.incompatibilidade,
|
|
4233
|
-
modulos: [],
|
|
4234
|
-
totais: { modulos: 0, alvos: 0, arquivos: 0, testes: 0 },
|
|
4235
|
-
}, null, 2));
|
|
4236
|
-
return 1;
|
|
4237
|
-
}
|
|
4238
|
-
|
|
4239
|
-
const resumos: Array<ResumoModuloVerificacao & { saidaTestes?: Array<{ alvo: string; stdout: string; stderr: string }> }> = [];
|
|
4240
|
-
let codigoSaida = 0;
|
|
4226
|
+
}
|
|
4227
|
+
|
|
4228
|
+
const alvos = resolverAlvosVerificacao(contextoProjeto.configCarregada);
|
|
4229
|
+
const configuracoesAlvo = alvos.map((alvo) => ({
|
|
4230
|
+
alvo,
|
|
4231
|
+
...resolverConfiguracaoVerificacaoPorAlvo(alvo, contextoProjeto.configCarregada),
|
|
4232
|
+
}));
|
|
4233
|
+
const incompatibilidade = configuracoesAlvo.find((item) => item.incompatibilidade);
|
|
4234
|
+
if (incompatibilidade?.incompatibilidade) {
|
|
4235
|
+
console.log(JSON.stringify({
|
|
4236
|
+
comando: "verificar",
|
|
4237
|
+
sucesso: false,
|
|
4238
|
+
erro: incompatibilidade.incompatibilidade,
|
|
4239
|
+
modulos: [],
|
|
4240
|
+
totais: { modulos: 0, alvos: 0, arquivos: 0, testes: 0 },
|
|
4241
|
+
}, null, 2));
|
|
4242
|
+
return 1;
|
|
4243
|
+
}
|
|
4244
|
+
|
|
4245
|
+
const resumos: Array<ResumoModuloVerificacao & { saidaTestes?: Array<{ alvo: string; stdout: string; stderr: string }> }> = [];
|
|
4246
|
+
let codigoSaida = 0;
|
|
4241
4247
|
|
|
4242
4248
|
for (const modulo of modulos) {
|
|
4243
4249
|
const ir = garantirIr(modulo.resultado, modulo.caminho);
|
|
@@ -4245,29 +4251,29 @@ async function comandoVerificarJson(
|
|
|
4245
4251
|
modulo: ir.nome,
|
|
4246
4252
|
arquivoFonte: modulo.caminho,
|
|
4247
4253
|
alvos: [],
|
|
4248
|
-
saidaTestes: [],
|
|
4249
|
-
};
|
|
4250
|
-
|
|
4251
|
-
for (const configuracaoAlvo of configuracoesAlvo) {
|
|
4252
|
-
const { alvo, framework, estrutura } = configuracaoAlvo;
|
|
4253
|
-
const pastaAlvo = path.join(baseSaida, alvo, nomeSubpastaModulo(modulo.caminho));
|
|
4254
|
-
const arquivos = aplicarEstruturaSaida(gerarArquivosPorAlvo(ir, alvo, framework), ir, estrutura);
|
|
4255
|
-
await escreverArquivos(pastaAlvo, arquivos);
|
|
4256
|
-
const { execucao, testesExecutados } = executarTestesParaVerificacao(alvo, pastaAlvo, arquivos, framework, true);
|
|
4257
|
-
resumoModulo.alvos.push({
|
|
4258
|
-
alvo,
|
|
4259
|
-
arquivosGerados: arquivos.length,
|
|
4260
|
-
quantidadeTestes: execucao.quantidadeTestes,
|
|
4261
|
-
pastaSaida: pastaAlvo,
|
|
4262
|
-
sucesso: execucao.codigoSaida === 0,
|
|
4263
|
-
framework,
|
|
4264
|
-
estrutura,
|
|
4265
|
-
testesExecutados,
|
|
4266
|
-
});
|
|
4267
|
-
resumoModulo.saidaTestes.push({ alvo, stdout: execucao.saidaPadrao, stderr: execucao.saidaErro });
|
|
4268
|
-
if (execucao.codigoSaida !== 0) {
|
|
4269
|
-
codigoSaida = execucao.codigoSaida;
|
|
4270
|
-
}
|
|
4254
|
+
saidaTestes: [],
|
|
4255
|
+
};
|
|
4256
|
+
|
|
4257
|
+
for (const configuracaoAlvo of configuracoesAlvo) {
|
|
4258
|
+
const { alvo, framework, estrutura } = configuracaoAlvo;
|
|
4259
|
+
const pastaAlvo = path.join(baseSaida, alvo, nomeSubpastaModulo(modulo.caminho));
|
|
4260
|
+
const arquivos = aplicarEstruturaSaida(gerarArquivosPorAlvo(ir, alvo, framework), ir, estrutura);
|
|
4261
|
+
await escreverArquivos(pastaAlvo, arquivos);
|
|
4262
|
+
const { execucao, testesExecutados } = executarTestesParaVerificacao(alvo, pastaAlvo, arquivos, framework, true);
|
|
4263
|
+
resumoModulo.alvos.push({
|
|
4264
|
+
alvo,
|
|
4265
|
+
arquivosGerados: arquivos.length,
|
|
4266
|
+
quantidadeTestes: execucao.quantidadeTestes,
|
|
4267
|
+
pastaSaida: pastaAlvo,
|
|
4268
|
+
sucesso: execucao.codigoSaida === 0,
|
|
4269
|
+
framework,
|
|
4270
|
+
estrutura,
|
|
4271
|
+
testesExecutados,
|
|
4272
|
+
});
|
|
4273
|
+
resumoModulo.saidaTestes.push({ alvo, stdout: execucao.saidaPadrao, stderr: execucao.saidaErro });
|
|
4274
|
+
if (execucao.codigoSaida !== 0) {
|
|
4275
|
+
codigoSaida = execucao.codigoSaida;
|
|
4276
|
+
}
|
|
4271
4277
|
}
|
|
4272
4278
|
|
|
4273
4279
|
resumos.push(resumoModulo);
|
|
@@ -4386,7 +4392,7 @@ async function principal(): Promise<void> {
|
|
|
4386
4392
|
{
|
|
4387
4393
|
const fonte = normalizarFonteImportacao(posicionais[0]);
|
|
4388
4394
|
if (!fonte || !posicionais[1]) {
|
|
4389
|
-
console.error("Uso: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]");
|
|
4395
|
+
console.error("Uso: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]");
|
|
4390
4396
|
codigoSaida = 1;
|
|
4391
4397
|
break;
|
|
4392
4398
|
}
|