@semacode/cli 1.5.31 → 1.5.34

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 (160) hide show
  1. package/AGENTS.md +308 -0
  2. package/AGENT_CONTEXT_PACK.json +288 -0
  3. package/LICENSE +22 -0
  4. package/README.md +85 -144
  5. package/SEMA_BRIEF.curto.txt +11 -0
  6. package/SEMA_BRIEF.md +617 -0
  7. package/SEMA_BRIEF.micro.txt +9 -0
  8. package/SEMA_INDEX.json +9805 -0
  9. package/dist/billing/index.d.ts +46 -0
  10. package/dist/billing/index.js +143 -0
  11. package/dist/billing/index.js.map +1 -0
  12. package/dist/controleComercialSupabase.d.ts +7 -0
  13. package/dist/controleComercialSupabase.js +6 -0
  14. package/dist/controleComercialSupabase.js.map +1 -0
  15. package/dist/controleComercialSupabaseAdmin.d.ts +7 -0
  16. package/dist/controleComercialSupabaseAdmin.js +138 -0
  17. package/dist/controleComercialSupabaseAdmin.js.map +1 -0
  18. package/dist/controleComercialSupabaseCadastro.d.ts +4 -0
  19. package/dist/controleComercialSupabaseCadastro.js +85 -0
  20. package/dist/controleComercialSupabaseCadastro.js.map +1 -0
  21. package/dist/controleComercialSupabaseConstantes.d.ts +28 -0
  22. package/dist/controleComercialSupabaseConstantes.js +44 -0
  23. package/dist/controleComercialSupabaseConstantes.js.map +1 -0
  24. package/dist/controleComercialSupabaseConsumo.d.ts +2 -0
  25. package/dist/controleComercialSupabaseConsumo.js +77 -0
  26. package/dist/controleComercialSupabaseConsumo.js.map +1 -0
  27. package/dist/controleComercialSupabaseConta.d.ts +11 -0
  28. package/dist/controleComercialSupabaseConta.js +157 -0
  29. package/dist/controleComercialSupabaseConta.js.map +1 -0
  30. package/dist/controleComercialSupabaseProfiles.d.ts +4 -0
  31. package/dist/controleComercialSupabaseProfiles.js +55 -0
  32. package/dist/controleComercialSupabaseProfiles.js.map +1 -0
  33. package/dist/controleComercialSupabaseTipos.d.ts +3 -0
  34. package/dist/controleComercialSupabaseTipos.js +2 -0
  35. package/dist/controleComercialSupabaseTipos.js.map +1 -0
  36. package/dist/controleComercialSupabaseTiposAdmin.d.ts +152 -0
  37. package/dist/controleComercialSupabaseTiposAdmin.js +2 -0
  38. package/dist/controleComercialSupabaseTiposAdmin.js.map +1 -0
  39. package/dist/controleComercialSupabaseTiposBase.d.ts +169 -0
  40. package/dist/controleComercialSupabaseTiposBase.js +2 -0
  41. package/dist/controleComercialSupabaseTiposBase.js.map +1 -0
  42. package/dist/controleComercialSupabaseTiposConta.d.ts +220 -0
  43. package/dist/controleComercialSupabaseTiposConta.js +2 -0
  44. package/dist/controleComercialSupabaseTiposConta.js.map +1 -0
  45. package/dist/docs.js +72 -5
  46. package/dist/docs.js.map +1 -1
  47. package/dist/index.js +701 -185
  48. package/dist/index.js.map +1 -1
  49. package/dist/runnerValidacaoRemota.d.ts +9 -0
  50. package/dist/runnerValidacaoRemota.js +9 -0
  51. package/dist/runnerValidacaoRemota.js.map +1 -0
  52. package/dist/runnerValidacaoRemotaBateria.d.ts +10 -0
  53. package/dist/runnerValidacaoRemotaBateria.js +115 -0
  54. package/dist/runnerValidacaoRemotaBateria.js.map +1 -0
  55. package/dist/runnerValidacaoRemotaCli.d.ts +4 -0
  56. package/dist/runnerValidacaoRemotaCli.js +86 -0
  57. package/dist/runnerValidacaoRemotaCli.js.map +1 -0
  58. package/dist/runnerValidacaoRemotaComandos.d.ts +7 -0
  59. package/dist/runnerValidacaoRemotaComandos.js +123 -0
  60. package/dist/runnerValidacaoRemotaComandos.js.map +1 -0
  61. package/dist/runnerValidacaoRemotaEscopo.d.ts +4 -0
  62. package/dist/runnerValidacaoRemotaEscopo.js +79 -0
  63. package/dist/runnerValidacaoRemotaEscopo.js.map +1 -0
  64. package/dist/runnerValidacaoRemotaExecucao.d.ts +2 -0
  65. package/dist/runnerValidacaoRemotaExecucao.js +102 -0
  66. package/dist/runnerValidacaoRemotaExecucao.js.map +1 -0
  67. package/dist/runnerValidacaoRemotaRelatorio.d.ts +3 -0
  68. package/dist/runnerValidacaoRemotaRelatorio.js +93 -0
  69. package/dist/runnerValidacaoRemotaRelatorio.js.map +1 -0
  70. package/dist/runnerValidacaoRemotaServidor.d.ts +3 -0
  71. package/dist/runnerValidacaoRemotaServidor.js +157 -0
  72. package/dist/runnerValidacaoRemotaServidor.js.map +1 -0
  73. package/dist/runnerValidacaoRemotaSnapshot.d.ts +10 -0
  74. package/dist/runnerValidacaoRemotaSnapshot.js +217 -0
  75. package/dist/runnerValidacaoRemotaSnapshot.js.map +1 -0
  76. package/dist/runnerValidacaoRemotaTipos.d.ts +158 -0
  77. package/dist/runnerValidacaoRemotaTipos.js +35 -0
  78. package/dist/runnerValidacaoRemotaTipos.js.map +1 -0
  79. package/dist/runnerValidacaoRemotaUtil.d.ts +3 -0
  80. package/dist/runnerValidacaoRemotaUtil.js +18 -0
  81. package/dist/runnerValidacaoRemotaUtil.js.map +1 -0
  82. package/dist/runnerValidacaoRemotaWorkspace.d.ts +2 -0
  83. package/dist/runnerValidacaoRemotaWorkspace.js +110 -0
  84. package/dist/runnerValidacaoRemotaWorkspace.js.map +1 -0
  85. package/docs/AGENT_STARTER.md +109 -0
  86. package/docs/agentes-por-capacidade.md +42 -0
  87. package/docs/api.md +82 -0
  88. package/docs/cli.md +93 -0
  89. package/docs/como-ensinar-a-sema-para-ia.md +30 -0
  90. package/docs/deploy.md +45 -0
  91. package/docs/documentacao.md +88 -0
  92. package/docs/env.md +115 -0
  93. package/docs/extensao-vscode.md +42 -0
  94. package/docs/fluxo-pratico-ia-sema.md +195 -0
  95. package/docs/instalacao-e-primeiro-uso.md +48 -0
  96. package/docs/integracao-com-ia.md +38 -0
  97. package/docs/mcp.md +54 -0
  98. package/docs/pagamento-ponta-a-ponta.md +171 -0
  99. package/docs/persistencia-vendor-first.md +151 -0
  100. package/docs/prompt-base-ia-sema.md +111 -0
  101. package/docs/repositories.md +69 -0
  102. package/docs/rollback.md +24 -0
  103. package/docs/seguranca.md +126 -0
  104. package/docs/sintaxe.md +218 -0
  105. package/exemplos/profile_conversas.sema +165 -0
  106. package/llms-full.txt +35 -0
  107. package/llms.txt +18 -0
  108. package/node_modules/@sema/gerador-css/package.json +7 -14
  109. package/node_modules/@sema/gerador-dart/package.json +7 -14
  110. package/node_modules/@sema/gerador-html/package.json +7 -14
  111. package/node_modules/@sema/gerador-javascript/package.json +7 -14
  112. package/node_modules/@sema/gerador-lua/package.json +7 -14
  113. package/node_modules/@sema/gerador-python/package.json +7 -14
  114. package/node_modules/@sema/gerador-typescript/package.json +7 -14
  115. package/node_modules/@sema/nucleo/package.json +7 -10
  116. package/node_modules/@sema/padroes/package.json +7 -10
  117. package/package.json +75 -74
  118. package/exemplos/.prepack-generated +0 -1
  119. package/node_modules/@sema/gerador-css/src/index.ts +0 -605
  120. package/node_modules/@sema/gerador-css/tsconfig.json +0 -13
  121. package/node_modules/@sema/gerador-css/tsconfig.tsbuildinfo +0 -1
  122. package/node_modules/@sema/gerador-dart/src/index.ts +0 -52
  123. package/node_modules/@sema/gerador-dart/tsconfig.json +0 -13
  124. package/node_modules/@sema/gerador-dart/tsconfig.tsbuildinfo +0 -1
  125. package/node_modules/@sema/gerador-html/src/index.ts +0 -185
  126. package/node_modules/@sema/gerador-html/tsconfig.json +0 -13
  127. package/node_modules/@sema/gerador-html/tsconfig.tsbuildinfo +0 -1
  128. package/node_modules/@sema/gerador-javascript/src/index.ts +0 -461
  129. package/node_modules/@sema/gerador-javascript/tsconfig.json +0 -13
  130. package/node_modules/@sema/gerador-javascript/tsconfig.tsbuildinfo +0 -1
  131. package/node_modules/@sema/gerador-lua/src/index.ts +0 -359
  132. package/node_modules/@sema/gerador-lua/tsconfig.json +0 -13
  133. package/node_modules/@sema/gerador-lua/tsconfig.tsbuildinfo +0 -1
  134. package/node_modules/@sema/gerador-python/src/index.ts +0 -850
  135. package/node_modules/@sema/gerador-python/tsconfig.json +0 -13
  136. package/node_modules/@sema/gerador-python/tsconfig.tsbuildinfo +0 -1
  137. package/node_modules/@sema/gerador-typescript/src/index.ts +0 -876
  138. package/node_modules/@sema/gerador-typescript/tsconfig.json +0 -13
  139. package/node_modules/@sema/gerador-typescript/tsconfig.tsbuildinfo +0 -1
  140. package/node_modules/@sema/nucleo/src/ast/tipos.ts +0 -207
  141. package/node_modules/@sema/nucleo/src/diagnosticos/index.ts +0 -43
  142. package/node_modules/@sema/nucleo/src/diagnosticos/melhorador.ts +0 -130
  143. package/node_modules/@sema/nucleo/src/formatador/index.ts +0 -530
  144. package/node_modules/@sema/nucleo/src/index.ts +0 -184
  145. package/node_modules/@sema/nucleo/src/ir/conversor.ts +0 -1037
  146. package/node_modules/@sema/nucleo/src/ir/modelos.ts +0 -403
  147. package/node_modules/@sema/nucleo/src/lexer/lexer.ts +0 -166
  148. package/node_modules/@sema/nucleo/src/lexer/tokens.ts +0 -79
  149. package/node_modules/@sema/nucleo/src/parser/gramatica.ebnf +0 -41
  150. package/node_modules/@sema/nucleo/src/parser/parser.ts +0 -936
  151. package/node_modules/@sema/nucleo/src/persistencia/contratos.ts +0 -379
  152. package/node_modules/@sema/nucleo/src/semantico/analisador.ts +0 -3126
  153. package/node_modules/@sema/nucleo/src/semantico/estruturas.ts +0 -665
  154. package/node_modules/@sema/nucleo/src/semantico/seguranca.ts +0 -362
  155. package/node_modules/@sema/nucleo/src/util/arquivos.ts +0 -28
  156. package/node_modules/@sema/nucleo/tsconfig.json +0 -9
  157. package/node_modules/@sema/nucleo/tsconfig.tsbuildinfo +0 -1
  158. package/node_modules/@sema/padroes/src/index.ts +0 -382
  159. package/node_modules/@sema/padroes/tsconfig.json +0 -9
  160. package/node_modules/@sema/padroes/tsconfig.tsbuildinfo +0 -1
@@ -1,530 +0,0 @@
1
- import type {
2
- BlocoAst,
3
- BlocoCasoTesteAst,
4
- BlocoGenericoAst,
5
- CampoAst,
6
- EntityAst,
7
- EnumAst,
8
- FlowAst,
9
- ModuloAst,
10
- RouteAst,
11
- StateAst,
12
- TaskAst,
13
- TypeAst,
14
- UseAst,
15
- } from "../ast/tipos.js";
16
- import type { Diagnostico } from "../diagnosticos/index.js";
17
- import { parsear } from "../parser/parser.js";
18
- import { tokenizar } from "../lexer/lexer.js";
19
-
20
- const ORDEM_BLOCOS_MODULO = new Map<string, number>([
21
- ["docs", 0],
22
- ["comments", 1],
23
- ["use", 2],
24
- ["vinculos", 3],
25
- ["database", 4],
26
- ["type", 5],
27
- ["entity", 6],
28
- ["enum", 7],
29
- ["state", 8],
30
- ["task", 9],
31
- ["flow", 10],
32
- ["route", 11],
33
- ["worker", 12],
34
- ["evento", 13],
35
- ["fila", 14],
36
- ["cron", 15],
37
- ["webhook", 16],
38
- ["cache", 17],
39
- ["storage", 18],
40
- ["policy", 19],
41
- ["tests", 20],
42
- ["desconhecido", 21],
43
- ]);
44
-
45
- const ORDEM_SUBBLOCOS_TASK = new Map<string, number>([
46
- ["docs", 0],
47
- ["comments", 1],
48
- ["input", 2],
49
- ["output", 3],
50
- ["rules", 4],
51
- ["effects", 5],
52
- ["auth", 6],
53
- ["authz", 7],
54
- ["dados", 8],
55
- ["audit", 9],
56
- ["segredos", 10],
57
- ["forbidden", 11],
58
- ["impl", 12],
59
- ["vinculos", 13],
60
- ["execucao", 14],
61
- ["state", 15],
62
- ["guarantees", 16],
63
- ["error", 17],
64
- ["tests", 18],
65
- ["desconhecido", 19],
66
- ]);
67
-
68
- const ORDEM_SUBBLOCOS_ROUTE = new Map<string, number>([
69
- ["input", 0],
70
- ["output", 1],
71
- ["effects", 2],
72
- ["auth", 3],
73
- ["authz", 4],
74
- ["dados", 5],
75
- ["audit", 6],
76
- ["segredos", 7],
77
- ["forbidden", 8],
78
- ["vinculos", 9],
79
- ["error", 10],
80
- ["docs", 11],
81
- ["comments", 12],
82
- ["desconhecido", 13],
83
- ]);
84
-
85
- const ORDEM_SUBBLOCOS_FLOW = new Map<string, number>([
86
- ["effects", 0],
87
- ["vinculos", 1],
88
- ["docs", 2],
89
- ["comments", 3],
90
- ["desconhecido", 4],
91
- ]);
92
-
93
- const ORDEM_SUBBLOCOS_SUPERFICIE = new Map<string, number>([
94
- ["input", 0],
95
- ["output", 1],
96
- ["effects", 2],
97
- ["auth", 3],
98
- ["authz", 4],
99
- ["dados", 5],
100
- ["audit", 6],
101
- ["segredos", 7],
102
- ["forbidden", 8],
103
- ["impl", 9],
104
- ["vinculos", 10],
105
- ["execucao", 11],
106
- ["error", 12],
107
- ["docs", 13],
108
- ["comments", 14],
109
- ["desconhecido", 15],
110
- ]);
111
-
112
- const ORDEM_SUBBLOCOS_STATE = new Map<string, number>([
113
- ["fields", 0],
114
- ["invariants", 1],
115
- ["transitions", 2],
116
- ["docs", 3],
117
- ["comments", 4],
118
- ["desconhecido", 5],
119
- ]);
120
-
121
- const ORDEM_SUBBLOCOS_TESTE = new Map<string, number>([
122
- ["given", 0],
123
- ["when", 1],
124
- ["expect", 2],
125
- ["error", 3],
126
- ["docs", 4],
127
- ["comments", 5],
128
- ["desconhecido", 6],
129
- ]);
130
-
131
- const ORDEM_CAMPOS_POR_BLOCO = new Map<string, Map<string, number>>([
132
- ["vinculos", new Map<string, number>([
133
- ["arquivo", 0],
134
- ["simbolo", 1],
135
- ["rota", 2],
136
- ["superficie", 3],
137
- ["recurso", 4],
138
- ["tabela", 5],
139
- ["fila", 6],
140
- ["worker", 7],
141
- ["evento", 8],
142
- ["cron", 9],
143
- ["webhook", 10],
144
- ["cache", 11],
145
- ["storage", 12],
146
- ["policy", 13],
147
- ["teste", 14],
148
- ])],
149
- ["execucao", new Map<string, number>([
150
- ["idempotencia", 0],
151
- ["timeout", 1],
152
- ["retry", 2],
153
- ["compensacao", 3],
154
- ["criticidade_operacional", 4],
155
- ])],
156
- ["auth", new Map<string, number>([
157
- ["modo", 0],
158
- ["estrategia", 1],
159
- ["principal", 2],
160
- ["origem", 3],
161
- ])],
162
- ["authz", new Map<string, number>([
163
- ["papeis", 0],
164
- ["papel", 1],
165
- ["escopos", 2],
166
- ["escopo", 3],
167
- ["politica", 4],
168
- ["tenant", 5],
169
- ])],
170
- ["dados", new Map<string, number>([
171
- ["classificacao_padrao", 0],
172
- ["redacao_log", 1],
173
- ["retencao", 2],
174
- ])],
175
- ["audit", new Map<string, number>([
176
- ["evento", 0],
177
- ["ator", 1],
178
- ["correlacao", 2],
179
- ["retencao", 3],
180
- ["motivo", 4],
181
- ])],
182
- ["database", new Map<string, number>([
183
- ["engine", 0],
184
- ["schema", 1],
185
- ["database", 2],
186
- ["consistency", 3],
187
- ["durability", 4],
188
- ["transaction_model", 5],
189
- ["query_model", 6],
190
- ["portavel", 7],
191
- ["adapter", 8],
192
- ])],
193
- ]);
194
-
195
- export interface ResultadoFormatacao {
196
- modulo?: ModuloAst;
197
- codigoFormatado?: string;
198
- diagnosticos: Diagnostico[];
199
- alterado: boolean;
200
- }
201
-
202
- function indentacao(nivel: number): string {
203
- return " ".repeat(nivel);
204
- }
205
-
206
- function ordenarPorMapa<T>(itens: T[], extrairChave: (item: T) => string, ordem: Map<string, number>): T[] {
207
- return [...itens].sort((a, b) => {
208
- const ordemA = ordem.get(extrairChave(a)) ?? Number.MAX_SAFE_INTEGER;
209
- const ordemB = ordem.get(extrairChave(b)) ?? Number.MAX_SAFE_INTEGER;
210
- if (ordemA !== ordemB) {
211
- return ordemA - ordemB;
212
- }
213
- return extrairChave(a).localeCompare(extrairChave(b), "pt-BR");
214
- });
215
- }
216
-
217
- function normalizarEspacos(texto: string): string {
218
- const marcadorSeta = "__SEMA_SETA__";
219
- const marcadorMaiorIgual = "__SEMA_MAIOR_IGUAL__";
220
- const marcadorMenorIgual = "__SEMA_MENOR_IGUAL__";
221
- const marcadorIgual = "__SEMA_IGUAL__";
222
- const marcadorDiferente = "__SEMA_DIFERENTE__";
223
- return texto
224
- .trim()
225
- .replace(/\s*->\s*/g, ` ${marcadorSeta} `)
226
- .replace(/\s*-\s*>\s*/g, ` ${marcadorSeta} `)
227
- .replace(/\s+/g, " ")
228
- .replace(/\s*,\s*/g, ", ")
229
- .replace(/\(\s+/g, "(")
230
- .replace(/\s+\)/g, ")")
231
- .replace(/\[\s+/g, "[")
232
- .replace(/\s+\]/g, "]")
233
- .replace(/\s*>=\s*/g, ` ${marcadorMaiorIgual} `)
234
- .replace(/\s*<=\s*/g, ` ${marcadorMenorIgual} `)
235
- .replace(/\s*==\s*/g, ` ${marcadorIgual} `)
236
- .replace(/\s*!=\s*/g, ` ${marcadorDiferente} `)
237
- .replace(/\s*>\s*/g, " > ")
238
- .replace(/\s*<\s*/g, " < ")
239
- .replace(new RegExp(`\\s*${marcadorMaiorIgual}\\s*`, "g"), " >= ")
240
- .replace(new RegExp(`\\s*${marcadorMenorIgual}\\s*`, "g"), " <= ")
241
- .replace(new RegExp(`\\s*${marcadorIgual}\\s*`, "g"), " == ")
242
- .replace(new RegExp(`\\s*${marcadorDiferente}\\s*`, "g"), " != ")
243
- .replace(new RegExp(`\\s*${marcadorSeta}\\s*`, "g"), " -> ");
244
- }
245
-
246
- function normalizarCaminho(texto: string): string {
247
- return texto
248
- .trim()
249
- .replace(/\s*\/\s*/g, "/")
250
- .replace(/\s+/g, "");
251
- }
252
-
253
- function eLiteralEscalar(texto: string): boolean {
254
- const normalizado = texto.trim();
255
- return /^-?\d+(?:\.\d+)?$/.test(normalizado) || ["verdadeiro", "falso", "nulo"].includes(normalizado);
256
- }
257
-
258
- function deveColocarAspas(contexto: string, campo: CampoAst, combinado: string): boolean {
259
- if (campo.nome === "metodo") {
260
- return false;
261
- }
262
- if (campo.nome === "caminho") {
263
- return /[{}]/.test(combinado);
264
- }
265
- if (contexto === "vinculos" && ["arquivo", "webhook"].includes(campo.nome)) {
266
- return true;
267
- }
268
- if (["timeout", "retry", "compensacao", "retencao", "rotacao"].includes(campo.nome)) {
269
- return true;
270
- }
271
- if (contexto === "docs" || contexto === "comments") {
272
- return true;
273
- }
274
- if (contexto === "error") {
275
- return !eLiteralEscalar(combinado);
276
- }
277
- if (contexto === "given" || contexto === "when" || contexto === "expect") {
278
- return !eLiteralEscalar(combinado);
279
- }
280
- return false;
281
- }
282
-
283
- function normalizarValorCampo(campo: CampoAst): string {
284
- return [campo.valor, ...campo.modificadores]
285
- .filter(Boolean)
286
- .join(" ")
287
- .replace(/\s+/g, " ")
288
- .trim();
289
- }
290
-
291
- function ordenarCampos(bloco: BlocoGenericoAst): CampoAst[] {
292
- const ordem = ORDEM_CAMPOS_POR_BLOCO.get(bloco.palavraChave);
293
- if (!ordem) {
294
- return bloco.campos;
295
- }
296
- return ordenarPorMapa(bloco.campos, (campo) => campo.nome, ordem);
297
- }
298
-
299
- function renderizarCampo(campo: CampoAst, nivel: number, contexto: string): string {
300
- let combinado = normalizarValorCampo(campo);
301
-
302
- if (campo.nome === "caminho") {
303
- combinado = normalizarCaminho(combinado);
304
- }
305
-
306
- if (deveColocarAspas(contexto, campo, combinado)) {
307
- combinado = JSON.stringify(combinado);
308
- }
309
-
310
- return `${indentacao(nivel)}${campo.nome}: ${combinado}`;
311
- }
312
-
313
- function renderizarLinha(linha: string, nivel: number): string {
314
- return `${indentacao(nivel)}${normalizarEspacos(linha)}`;
315
- }
316
-
317
- function renderizarCasoTeste(caso: BlocoCasoTesteAst, nivel: number): string {
318
- const partes: string[] = [];
319
- if (caso.given) {
320
- partes.push(renderizarBlocoGenerico(caso.given, nivel + 1));
321
- }
322
- if (caso.when) {
323
- partes.push(renderizarBlocoGenerico(caso.when, nivel + 1));
324
- }
325
- if (caso.expect) {
326
- partes.push(renderizarBlocoGenerico(caso.expect, nivel + 1));
327
- }
328
- if (caso.error) {
329
- partes.push(renderizarBlocoGenerico(caso.error, nivel + 1));
330
- }
331
- if (caso.docs) {
332
- partes.push(renderizarBlocoGenerico(caso.docs, nivel + 1));
333
- }
334
- if (caso.comments) {
335
- partes.push(renderizarBlocoGenerico(caso.comments, nivel + 1));
336
- }
337
-
338
- return `${indentacao(nivel)}caso ${JSON.stringify(caso.nome)} {\n${partes.join("\n\n")}\n${indentacao(nivel)}}`;
339
- }
340
-
341
- function renderizarBlocoAst(bloco: BlocoAst, nivel: number): string {
342
- switch (bloco.tipo) {
343
- case "caso_teste":
344
- return renderizarCasoTeste(bloco, nivel);
345
- case "bloco_generico":
346
- return renderizarBlocoGenerico(bloco, nivel);
347
- case "use":
348
- return `${indentacao(nivel)}use ${bloco.origem === "sema" ? "" : `${bloco.origem} `}${bloco.caminho}`.trimEnd();
349
- case "enum":
350
- return renderizarEnum(bloco, nivel);
351
- case "type":
352
- return renderizarTipo(bloco, nivel);
353
- case "entity":
354
- return renderizarEntity(bloco, nivel);
355
- case "task":
356
- return renderizarTask(bloco, nivel);
357
- case "flow":
358
- return renderizarFlow(bloco, nivel);
359
- case "route":
360
- return renderizarRoute(bloco, nivel);
361
- case "state":
362
- return renderizarState(bloco, nivel);
363
- }
364
- }
365
-
366
- function ordenarSubblocos(bloco: BlocoGenericoAst): BlocoAst[] {
367
- if (bloco.palavraChave === "task") {
368
- return ordenarPorMapa(bloco.blocos, (item) => item.tipo === "bloco_generico" ? item.palavraChave : item.tipo, ORDEM_SUBBLOCOS_TASK);
369
- }
370
- if (bloco.palavraChave === "route") {
371
- return ordenarPorMapa(bloco.blocos, (item) => item.tipo === "bloco_generico" ? item.palavraChave : item.tipo, ORDEM_SUBBLOCOS_ROUTE);
372
- }
373
- if (bloco.palavraChave === "flow") {
374
- return ordenarPorMapa(bloco.blocos, (item) => item.tipo === "bloco_generico" ? item.palavraChave : item.tipo, ORDEM_SUBBLOCOS_FLOW);
375
- }
376
- if (["worker", "evento", "fila", "cron", "webhook", "cache", "storage", "policy"].includes(bloco.palavraChave)) {
377
- return ordenarPorMapa(bloco.blocos, (item) => item.tipo === "bloco_generico" ? item.palavraChave : item.tipo, ORDEM_SUBBLOCOS_SUPERFICIE);
378
- }
379
- if (bloco.palavraChave === "state") {
380
- return ordenarPorMapa(bloco.blocos, (item) => item.tipo === "bloco_generico" ? item.palavraChave : item.tipo, ORDEM_SUBBLOCOS_STATE);
381
- }
382
- if (bloco.palavraChave === "tests") {
383
- return ordenarPorMapa(bloco.blocos, (item) => item.tipo === "caso_teste" ? "case" : item.tipo === "bloco_generico" ? item.palavraChave : item.tipo, ORDEM_SUBBLOCOS_TESTE);
384
- }
385
- return bloco.blocos;
386
- }
387
-
388
- function renderizarBlocoGenerico(bloco: BlocoGenericoAst, nivel: number): string {
389
- const identificadorBloco = bloco.palavraChave === "desconhecido" && bloco.nome
390
- ? bloco.nome
391
- : `${bloco.palavraChave}${bloco.nome ? ` ${bloco.nome}` : ""}`;
392
- const cabecalho = `${indentacao(nivel)}${identificadorBloco} {`;
393
- const linhasCampos = ordenarCampos(bloco).map((campo) => renderizarCampo(campo, nivel + 1, bloco.palavraChave));
394
- const linhasDeclarativas = bloco.linhas.map((linha) => renderizarLinha(linha.conteudo, nivel + 1));
395
- const blocosInternos = ordenarSubblocos(bloco).map((subbloco) => renderizarBlocoAst(subbloco, nivel + 1));
396
- const corpo = [...linhasCampos, ...linhasDeclarativas, ...blocosInternos];
397
- if (corpo.length === 0) {
398
- return `${cabecalho}\n${indentacao(nivel)}}`;
399
- }
400
- return `${cabecalho}\n${corpo.join("\n")}\n${indentacao(nivel)}}`;
401
- }
402
-
403
- function renderizarEnum(enumeracao: EnumAst, nivel: number): string {
404
- const corpo = enumeracao.valores.map((valor, indice) => `${indentacao(nivel + 1)}${valor}${indice < enumeracao.valores.length - 1 ? "," : ""}`);
405
- return `${indentacao(nivel)}enum ${enumeracao.nome} {\n${corpo.join("\n")}\n${indentacao(nivel)}}`;
406
- }
407
-
408
- function renderizarTipo(type: TypeAst, nivel: number): string {
409
- return `${indentacao(nivel)}type ${type.nome} {\n${renderizarCorpoSimples(type.corpo, nivel + 1)}\n${indentacao(nivel)}}`;
410
- }
411
-
412
- function renderizarEntity(entity: EntityAst, nivel: number): string {
413
- return `${indentacao(nivel)}entity ${entity.nome} {\n${renderizarCorpoSimples(entity.corpo, nivel + 1)}\n${indentacao(nivel)}}`;
414
- }
415
-
416
- function renderizarTask(task: TaskAst, nivel: number): string {
417
- return `${indentacao(nivel)}task ${task.nome} {\n${renderizarCorpoSimples(task.corpo, nivel + 1)}\n${indentacao(nivel)}}`;
418
- }
419
-
420
- function renderizarFlow(flow: FlowAst, nivel: number): string {
421
- return `${indentacao(nivel)}flow ${flow.nome} {\n${renderizarCorpoSimples(flow.corpo, nivel + 1)}\n${indentacao(nivel)}}`;
422
- }
423
-
424
- function renderizarRoute(route: RouteAst, nivel: number): string {
425
- return `${indentacao(nivel)}route ${route.nome} {\n${renderizarCorpoSimples(route.corpo, nivel + 1)}\n${indentacao(nivel)}}`;
426
- }
427
-
428
- function renderizarState(state: StateAst, nivel: number): string {
429
- return `${indentacao(nivel)}state${state.nome ? ` ${state.nome}` : ""} {\n${renderizarCorpoSimples(state.corpo, nivel + 1)}\n${indentacao(nivel)}}`;
430
- }
431
-
432
- function renderizarCorpoSimples(bloco: BlocoGenericoAst, nivel: number): string {
433
- const conteudo = ordenarSubblocos(bloco).map((subbloco) => renderizarBlocoAst(subbloco, nivel));
434
- const campos = ordenarCampos(bloco).map((campo) => renderizarCampo(campo, nivel, bloco.palavraChave));
435
- const linhas = bloco.linhas.map((linha) => renderizarLinha(linha.conteudo, nivel));
436
- const corpo = [...campos, ...linhas, ...conteudo];
437
- return corpo.join("\n");
438
- }
439
-
440
- function renderizarModulo(modulo: ModuloAst): string {
441
- const blocos: Array<{ chave: string; conteudo: string }> = [];
442
-
443
- if (modulo.docs) {
444
- blocos.push({ chave: "docs", conteudo: renderizarBlocoGenerico(modulo.docs, 1) });
445
- }
446
- if (modulo.comments) {
447
- blocos.push({ chave: "comments", conteudo: renderizarBlocoGenerico(modulo.comments, 1) });
448
- }
449
- for (const use of modulo.uses) {
450
- blocos.push({ chave: "use", conteudo: renderizarBlocoAst(use, 1) });
451
- }
452
- if (modulo.vinculos) {
453
- blocos.push({ chave: "vinculos", conteudo: renderizarBlocoGenerico(modulo.vinculos, 1) });
454
- }
455
- for (const database of modulo.databases) {
456
- blocos.push({ chave: "database", conteudo: renderizarBlocoGenerico(database, 1) });
457
- }
458
- for (const type of modulo.types) {
459
- blocos.push({ chave: "type", conteudo: renderizarBlocoAst(type, 1) });
460
- }
461
- for (const entity of modulo.entities) {
462
- blocos.push({ chave: "entity", conteudo: renderizarBlocoAst(entity, 1) });
463
- }
464
- for (const enumeracao of modulo.enums) {
465
- blocos.push({ chave: "enum", conteudo: renderizarBlocoAst(enumeracao, 1) });
466
- }
467
- for (const state of modulo.states) {
468
- blocos.push({ chave: "state", conteudo: renderizarBlocoAst(state, 1) });
469
- }
470
- for (const task of modulo.tasks) {
471
- blocos.push({ chave: "task", conteudo: renderizarBlocoAst(task, 1) });
472
- }
473
- for (const flow of modulo.flows) {
474
- blocos.push({ chave: "flow", conteudo: renderizarBlocoAst(flow, 1) });
475
- }
476
- for (const route of modulo.routes) {
477
- blocos.push({ chave: "route", conteudo: renderizarBlocoAst(route, 1) });
478
- }
479
- for (const worker of modulo.workers) {
480
- blocos.push({ chave: "worker", conteudo: renderizarBlocoGenerico(worker, 1) });
481
- }
482
- for (const evento of modulo.eventos) {
483
- blocos.push({ chave: "evento", conteudo: renderizarBlocoGenerico(evento, 1) });
484
- }
485
- for (const fila of modulo.filas) {
486
- blocos.push({ chave: "fila", conteudo: renderizarBlocoGenerico(fila, 1) });
487
- }
488
- for (const cron of modulo.crons) {
489
- blocos.push({ chave: "cron", conteudo: renderizarBlocoGenerico(cron, 1) });
490
- }
491
- for (const webhook of modulo.webhooks) {
492
- blocos.push({ chave: "webhook", conteudo: renderizarBlocoGenerico(webhook, 1) });
493
- }
494
- for (const cache of modulo.caches) {
495
- blocos.push({ chave: "cache", conteudo: renderizarBlocoGenerico(cache, 1) });
496
- }
497
- for (const storage of modulo.storages) {
498
- blocos.push({ chave: "storage", conteudo: renderizarBlocoGenerico(storage, 1) });
499
- }
500
- for (const policy of modulo.policies) {
501
- blocos.push({ chave: "policy", conteudo: renderizarBlocoGenerico(policy, 1) });
502
- }
503
- if (modulo.tests) {
504
- blocos.push({ chave: "tests", conteudo: renderizarBlocoGenerico(modulo.tests, 1) });
505
- }
506
- for (const extra of modulo.extras) {
507
- blocos.push({ chave: "desconhecido", conteudo: renderizarBlocoGenerico(extra, 1) });
508
- }
509
-
510
- const ordenados = ordenarPorMapa(blocos, (item) => item.chave, ORDEM_BLOCOS_MODULO);
511
- return `module ${modulo.nome} {\n${ordenados.map((item) => item.conteudo).join("\n\n")}\n}\n`;
512
- }
513
-
514
- export function formatarCodigo(codigo: string, arquivo?: string): ResultadoFormatacao {
515
- const resultadoLexer = tokenizar(codigo, arquivo);
516
- const resultadoParser = parsear(resultadoLexer.tokens);
517
- const diagnosticos = [...resultadoLexer.diagnosticos, ...resultadoParser.diagnosticos];
518
-
519
- if (!resultadoParser.modulo) {
520
- return { diagnosticos, alterado: false };
521
- }
522
-
523
- const codigoFormatado = renderizarModulo(resultadoParser.modulo);
524
- return {
525
- modulo: resultadoParser.modulo,
526
- codigoFormatado,
527
- diagnosticos,
528
- alterado: codigoFormatado !== codigo,
529
- };
530
- }
@@ -1,184 +0,0 @@
1
- import { parsear } from "./parser/parser.js";
2
- import { analisarSemantica, criarContextoLocal } from "./semantico/analisador.js";
3
- import { tokenizar } from "./lexer/lexer.js";
4
- import { converterParaIr } from "./ir/conversor.js";
5
- import { formatarDiagnostico, type Diagnostico } from "./diagnosticos/index.js";
6
- import type { ModuloAst } from "./ast/tipos.js";
7
- import type { IrModulo } from "./ir/modelos.js";
8
-
9
- export * from "./diagnosticos/index.js";
10
- export * from "./diagnosticos/melhorador.js";
11
- export * from "./ast/tipos.js";
12
- export * from "./lexer/tokens.js";
13
- export * from "./lexer/lexer.js";
14
- export * from "./parser/parser.js";
15
- export * from "./semantico/analisador.js";
16
- export * from "./semantico/estruturas.js";
17
- export * from "./persistencia/contratos.js";
18
- export * from "./ir/modelos.js";
19
- export * from "./ir/conversor.js";
20
- export * from "./formatador/index.js";
21
- export * from "./util/arquivos.js";
22
-
23
- export interface ResultadoCompilacao {
24
- modulo?: ModuloAst;
25
- ir?: IrModulo;
26
- diagnosticos: Diagnostico[];
27
- }
28
-
29
- export interface FonteProjeto {
30
- caminho: string;
31
- codigo: string;
32
- }
33
-
34
- export interface ResultadoCompilacaoProjetoModulo extends ResultadoCompilacao {
35
- caminho: string;
36
- }
37
-
38
- export interface ResultadoCompilacaoProjeto {
39
- modulos: ResultadoCompilacaoProjetoModulo[];
40
- diagnosticos: Diagnostico[];
41
- }
42
-
43
- export function compilarCodigo(codigo: string, arquivo?: string): ResultadoCompilacao {
44
- const resultadoLexer = tokenizar(codigo, arquivo);
45
- const resultadoParser = parsear(resultadoLexer.tokens);
46
- const diagnosticos = [...resultadoLexer.diagnosticos, ...resultadoParser.diagnosticos];
47
-
48
- if (!resultadoParser.modulo) {
49
- return { diagnosticos };
50
- }
51
-
52
- const resultadoSemantico = analisarSemantica(resultadoParser.modulo);
53
- diagnosticos.push(...resultadoSemantico.diagnosticos);
54
-
55
- const ir = converterParaIr(resultadoParser.modulo, diagnosticos, resultadoSemantico.contexto);
56
-
57
- return {
58
- modulo: resultadoParser.modulo,
59
- ir,
60
- diagnosticos,
61
- };
62
- }
63
-
64
- export function compilarProjeto(fontes: FonteProjeto[]): ResultadoCompilacaoProjeto {
65
- const resultadosBase = fontes.map((fonte) => {
66
- const resultadoLexer = tokenizar(fonte.codigo, fonte.caminho);
67
- const resultadoParser = parsear(resultadoLexer.tokens);
68
- return {
69
- caminho: fonte.caminho,
70
- modulo: resultadoParser.modulo,
71
- diagnosticos: [...resultadoLexer.diagnosticos, ...resultadoParser.diagnosticos],
72
- };
73
- });
74
-
75
- const contextosLocais = new Map<string, ReturnType<typeof criarContextoLocal>>();
76
- const nomesModulos = new Map<string, string>();
77
-
78
- for (const resultado of resultadosBase) {
79
- if (!resultado.modulo) {
80
- continue;
81
- }
82
-
83
- const caminhoAnterior = nomesModulos.get(resultado.modulo.nome);
84
- if (caminhoAnterior) {
85
- resultado.diagnosticos.push({
86
- codigo: "SEM020",
87
- mensagem: `Modulo "${resultado.modulo.nome}" foi declarado mais de uma vez no mesmo projeto.`,
88
- severidade: "erro",
89
- intervalo: resultado.modulo.intervalo,
90
- dica: "Use nomes de modulo unicos para evitar ambiguidade de importacao.",
91
- contexto: `Primeira ocorrencia encontrada em ${caminhoAnterior}.`,
92
- });
93
- continue;
94
- }
95
-
96
- nomesModulos.set(resultado.modulo.nome, resultado.caminho);
97
- contextosLocais.set(resultado.modulo.nome, criarContextoLocal(resultado.modulo));
98
- }
99
-
100
- const modulos = resultadosBase.map<ResultadoCompilacaoProjetoModulo>((resultado) => {
101
- if (!resultado.modulo) {
102
- return {
103
- caminho: resultado.caminho,
104
- diagnosticos: resultado.diagnosticos,
105
- };
106
- }
107
-
108
- const resultadoSemantico = analisarSemantica(resultado.modulo, { contextosModulos: contextosLocais });
109
- const diagnosticos = [...resultado.diagnosticos, ...resultadoSemantico.diagnosticos];
110
- const ir = converterParaIr(resultado.modulo, diagnosticos, resultadoSemantico.contexto);
111
-
112
- return {
113
- caminho: resultado.caminho,
114
- modulo: resultado.modulo,
115
- ir,
116
- diagnosticos,
117
- };
118
- });
119
-
120
- return {
121
- modulos,
122
- diagnosticos: modulos.flatMap((modulo) => modulo.diagnosticos),
123
- };
124
- }
125
-
126
- export function temErros(diagnosticos: Diagnostico[]): boolean {
127
- return diagnosticos.some((diagnostico) => diagnostico.severidade === "erro");
128
- }
129
-
130
- export function formatarDiagnosticos(diagnosticos: Diagnostico[]): string {
131
- if (diagnosticos.length === 0) {
132
- return "Nenhum diagnostico encontrado.";
133
- }
134
- return diagnosticos.map(formatarDiagnostico).join("\n");
135
- }
136
-
137
- export interface RespostaValidacao {
138
- valido: boolean;
139
- bloqueia_acao: boolean;
140
- erros: Array<{
141
- codigo: string;
142
- mensagem: string;
143
- dica?: string;
144
- contexto?: string;
145
- }>;
146
- advertencias: Array<{
147
- codigo: string;
148
- mensagem: string;
149
- dica?: string;
150
- }>;
151
- proximo_passo_obrigatorio: string;
152
- }
153
-
154
- export function gerarRespostaValidacao(diagnosticos: Diagnostico[]): RespostaValidacao {
155
- const erros = diagnosticos
156
- .filter((d) => d.severidade === "erro")
157
- .map((d) => ({
158
- codigo: d.codigo,
159
- mensagem: d.mensagem,
160
- dica: d.dica,
161
- contexto: d.contexto,
162
- }));
163
-
164
- const advertencias = diagnosticos
165
- .filter((d) => d.severidade === "aviso")
166
- .map((d) => ({
167
- codigo: d.codigo,
168
- mensagem: d.mensagem,
169
- dica: d.dica,
170
- }));
171
-
172
- const temErros = erros.length > 0;
173
- const proximo_passo_obrigatorio = temErros
174
- ? "corrigir_contrato_e_chamar_sema_validar_novamente"
175
- : "pode_chamar_profile_ou_ir";
176
-
177
- return {
178
- valido: !temErros,
179
- bloqueia_acao: temErros,
180
- erros,
181
- advertencias,
182
- proximo_passo_obrigatorio,
183
- };
184
- }