@semacode/cli 1.5.16 → 1.5.18

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 (181) hide show
  1. package/AGENTS.md +272 -0
  2. package/LICENSE +22 -0
  3. package/README.md +104 -112
  4. package/SEMA_BRIEF.curto.txt +9 -0
  5. package/SEMA_BRIEF.md +63 -0
  6. package/SEMA_BRIEF.micro.txt +7 -0
  7. package/SEMA_INDEX.json +783 -0
  8. package/dist/angular-consumer-standalone.d.ts +6 -0
  9. package/dist/angular-consumer-standalone.js.map +1 -0
  10. package/dist/cpp-symbols.d.ts +10 -0
  11. package/dist/cpp-symbols.js.map +1 -0
  12. package/dist/docs.d.ts +56 -0
  13. package/dist/docs.js.map +1 -0
  14. package/dist/dotnet-http.d.ts +23 -0
  15. package/dist/dotnet-http.js.map +1 -0
  16. package/dist/drift.d.ts +225 -0
  17. package/dist/drift.js +5 -111
  18. package/dist/drift.js.map +1 -0
  19. package/dist/go-http.d.ts +23 -0
  20. package/dist/go-http.js.map +1 -0
  21. package/dist/importador.d.ts +31 -0
  22. package/dist/importador.js +1 -200
  23. package/dist/importador.js.map +1 -0
  24. package/dist/index.d.ts +2 -0
  25. package/dist/index.js +59 -479
  26. package/dist/index.js.map +1 -0
  27. package/dist/java-http.d.ts +23 -0
  28. package/dist/java-http.js.map +1 -0
  29. package/dist/lua-symbols.d.ts +10 -0
  30. package/dist/lua-symbols.js.map +1 -0
  31. package/dist/php-symbols.d.ts +24 -0
  32. package/dist/php-symbols.js.map +1 -0
  33. package/dist/projeto.d.ts +53 -0
  34. package/dist/projeto.js +0 -20
  35. package/dist/projeto.js.map +1 -0
  36. package/dist/python-http.d.ts +23 -0
  37. package/dist/python-http.js.map +1 -0
  38. package/dist/rust-http.d.ts +23 -0
  39. package/dist/rust-http.js.map +1 -0
  40. package/dist/tipos.d.ts +3 -0
  41. package/dist/tipos.js.map +1 -0
  42. package/dist/typescript-http.d.ts +35 -0
  43. package/dist/typescript-http.js.map +1 -0
  44. package/docs/AGENT_STARTER.md +103 -0
  45. package/docs/cli.md +106 -0
  46. package/docs/como-ensinar-a-sema-para-ia.md +149 -0
  47. package/docs/deploy.md +70 -0
  48. package/docs/documentacao.md +63 -0
  49. package/docs/env.md +56 -0
  50. package/docs/extensao-vscode.md +45 -0
  51. package/docs/fluxo-pratico-ia-sema.md +181 -0
  52. package/docs/instalacao-e-primeiro-uso.md +112 -0
  53. package/docs/integracao-com-ia.md +103 -0
  54. package/docs/mcp.md +51 -0
  55. package/docs/pagamento-ponta-a-ponta.md +165 -0
  56. package/docs/persistencia-vendor-first.md +145 -0
  57. package/docs/prompt-base-ia-sema.md +105 -0
  58. package/docs/rollback.md +47 -0
  59. package/docs/sintaxe.md +212 -0
  60. package/exemplos/agendamento.sema +105 -0
  61. package/exemplos/assinatura.sema +133 -0
  62. package/exemplos/auditoria.sema +89 -0
  63. package/exemplos/autenticacao.sema +125 -0
  64. package/exemplos/automacao.sema +107 -0
  65. package/exemplos/cadastro_usuario.sema +54 -0
  66. package/exemplos/calculadora.sema +78 -0
  67. package/exemplos/crud_simples.sema +89 -0
  68. package/exemplos/estoque.sema +127 -0
  69. package/exemplos/exportacao.sema +94 -0
  70. package/exemplos/fila.sema +130 -0
  71. package/exemplos/integracao_externa.sema +94 -0
  72. package/exemplos/multi_tenant.sema +140 -0
  73. package/exemplos/notificacao.sema +149 -0
  74. package/exemplos/operacao_estrategia.sema +633 -0
  75. package/exemplos/pagamento.sema +434 -0
  76. package/exemplos/pagamento_dominio.sema +35 -0
  77. package/exemplos/pedido.sema +255 -0
  78. package/exemplos/permissao.sema +121 -0
  79. package/exemplos/persistencia_vendor_first.sema +86 -0
  80. package/exemplos/relatorio.sema +93 -0
  81. package/exemplos/replica_analitica_erp.sema +160 -0
  82. package/exemplos/testes_embutidos.sema +45 -0
  83. package/exemplos/tratamento_erro.sema +157 -0
  84. package/exemplos/upload_arquivo.sema +93 -0
  85. package/exemplos/webhook.sema +94 -0
  86. package/llms-full.txt +34 -0
  87. package/llms.txt +17 -0
  88. package/node_modules/@sema/gerador-css/dist/index.d.ts +3 -0
  89. package/node_modules/@sema/gerador-css/dist/index.js +592 -0
  90. package/node_modules/@sema/gerador-css/dist/index.js.map +1 -0
  91. package/node_modules/@sema/gerador-css/package.json +7 -0
  92. package/node_modules/@sema/gerador-dart/dist/index.d.ts +3 -0
  93. package/node_modules/@sema/gerador-dart/dist/index.js +44 -0
  94. package/node_modules/@sema/gerador-dart/dist/index.js.map +1 -0
  95. package/node_modules/@sema/gerador-dart/package.json +7 -0
  96. package/node_modules/@sema/gerador-html/dist/index.d.ts +3 -0
  97. package/node_modules/@sema/gerador-html/dist/index.js +163 -0
  98. package/node_modules/@sema/gerador-html/dist/index.js.map +1 -0
  99. package/node_modules/@sema/gerador-html/package.json +7 -0
  100. package/node_modules/@sema/gerador-javascript/dist/index.d.ts +3 -0
  101. package/node_modules/@sema/gerador-javascript/dist/index.js +421 -0
  102. package/node_modules/@sema/gerador-javascript/dist/index.js.map +1 -0
  103. package/node_modules/@sema/gerador-javascript/package.json +7 -0
  104. package/node_modules/@sema/gerador-lua/dist/index.d.ts +3 -0
  105. package/node_modules/@sema/gerador-lua/dist/index.js +328 -0
  106. package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -0
  107. package/node_modules/@sema/gerador-lua/package.json +7 -0
  108. package/node_modules/@sema/gerador-python/dist/index.d.ts +6 -0
  109. package/node_modules/@sema/gerador-python/dist/index.js +729 -0
  110. package/node_modules/@sema/gerador-python/dist/index.js.map +1 -0
  111. package/node_modules/@sema/gerador-python/package.json +7 -0
  112. package/node_modules/@sema/gerador-typescript/dist/index.d.ts +6 -0
  113. package/node_modules/@sema/gerador-typescript/dist/index.js +793 -0
  114. package/node_modules/@sema/gerador-typescript/dist/index.js.map +1 -0
  115. package/node_modules/@sema/gerador-typescript/package.json +7 -0
  116. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +123 -0
  117. package/node_modules/@sema/nucleo/dist/ast/tipos.js +2 -0
  118. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +1 -0
  119. package/node_modules/@sema/nucleo/dist/diagnosticos/index.d.ts +21 -0
  120. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js +12 -0
  121. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +1 -0
  122. package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +9 -0
  123. package/node_modules/@sema/nucleo/dist/formatador/index.js +460 -0
  124. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -0
  125. package/node_modules/@sema/nucleo/dist/index.d.ts +35 -0
  126. package/node_modules/@sema/nucleo/dist/index.js +96 -0
  127. package/node_modules/@sema/nucleo/dist/index.js.map +1 -0
  128. package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +5 -0
  129. package/node_modules/@sema/nucleo/dist/ir/conversor.js +877 -0
  130. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -0
  131. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +345 -0
  132. package/node_modules/@sema/nucleo/dist/ir/modelos.js +2 -0
  133. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +1 -0
  134. package/node_modules/@sema/nucleo/dist/lexer/lexer.d.ts +7 -0
  135. package/node_modules/@sema/nucleo/dist/lexer/lexer.js +122 -0
  136. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +1 -0
  137. package/node_modules/@sema/nucleo/dist/lexer/tokens.d.ts +8 -0
  138. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +61 -0
  139. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -0
  140. package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +9 -0
  141. package/node_modules/@sema/nucleo/dist/parser/parser.js +767 -0
  142. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -0
  143. package/node_modules/@sema/nucleo/dist/persistencia/contratos.d.ts +39 -0
  144. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js +294 -0
  145. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +1 -0
  146. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +59 -0
  147. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1681 -0
  148. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -0
  149. package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +106 -0
  150. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +475 -0
  151. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +1 -0
  152. package/node_modules/@sema/nucleo/dist/semantico/seguranca.d.ts +91 -0
  153. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js +258 -0
  154. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +1 -0
  155. package/node_modules/@sema/nucleo/dist/util/arquivos.d.ts +2 -0
  156. package/node_modules/@sema/nucleo/dist/util/arquivos.js +25 -0
  157. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +1 -0
  158. package/node_modules/@sema/nucleo/package.json +7 -0
  159. package/node_modules/@sema/padroes/dist/index.d.ts +25 -0
  160. package/node_modules/@sema/padroes/dist/index.js +316 -0
  161. package/node_modules/@sema/padroes/dist/index.js.map +1 -0
  162. package/node_modules/@sema/padroes/package.json +7 -0
  163. package/package.json +32 -23
  164. package/semacode-cli-1.3.1.tgz +0 -0
  165. package/src/angular-consumer-standalone.ts +0 -312
  166. package/src/cpp-symbols.ts +0 -82
  167. package/src/docs.ts +0 -535
  168. package/src/dotnet-http.ts +0 -355
  169. package/src/drift.ts +0 -4933
  170. package/src/go-http.ts +0 -118
  171. package/src/importador.ts +0 -3891
  172. package/src/index.ts +0 -5641
  173. package/src/java-http.ts +0 -247
  174. package/src/lua-symbols.ts +0 -114
  175. package/src/php-symbols.ts +0 -462
  176. package/src/projeto.ts +0 -862
  177. package/src/python-http.ts +0 -258
  178. package/src/rust-http.ts +0 -125
  179. package/src/tipos.ts +0 -24
  180. package/src/typescript-http.ts +0 -1076
  181. package/tsconfig.json +0 -20
package/src/java-http.ts DELETED
@@ -1,247 +0,0 @@
1
- export interface ParametroRotaJava {
2
- nome: string;
3
- tipoSema: "Texto" | "Inteiro" | "Decimal" | "Id";
4
- }
5
-
6
- export interface SimboloJavaExtraido {
7
- simbolo: string;
8
- retorno?: string;
9
- parametros: Array<{ nome: string; tipoTexto?: string; obrigatorio: boolean }>;
10
- }
11
-
12
- export interface RotaJavaExtraida {
13
- origem: "java";
14
- metodo: string;
15
- caminho: string;
16
- simbolo: string;
17
- parametros: ParametroRotaJava[];
18
- retorno?: string;
19
- }
20
-
21
- const METODOS_HTTP = new Set(["GET", "POST", "PUT", "PATCH", "DELETE"]);
22
-
23
- function contarChar(texto: string, alvo: string): number {
24
- return [...texto].filter((char) => char === alvo).length;
25
- }
26
-
27
- function juntarCaminho(base: string | undefined, sufixo: string | undefined): string {
28
- const partes = [base, sufixo]
29
- .map((parte) => (parte ?? "").trim())
30
- .filter(Boolean)
31
- .map((parte) => parte.replace(/^\/+|\/+$/g, ""));
32
- return `/${partes.join("/")}`.replace(/\/+/g, "/");
33
- }
34
-
35
- function extrairParametrosAssinaturaJava(assinatura: string): Array<{ nome: string; tipoTexto?: string; obrigatorio: boolean }> {
36
- return assinatura.split(",").map((parametroBruto) => {
37
- const parametro = parametroBruto.trim();
38
- if (!parametro) {
39
- return undefined;
40
- }
41
- const limpo = parametro.replace(/^@\w+(?:\([^)]*\))?\s*/g, "").trim();
42
- const partes = limpo.split(/\s+/).filter(Boolean);
43
- if (partes.length < 2) {
44
- return undefined;
45
- }
46
- return {
47
- nome: partes.at(-1)!,
48
- tipoTexto: partes.slice(0, -1).join(" "),
49
- obrigatorio: true,
50
- };
51
- }).filter((item): item is NonNullable<typeof item> => Boolean(item));
52
- }
53
-
54
- function mapearTipoJava(tipo?: string): ParametroRotaJava["tipoSema"] {
55
- const normalizado = (tipo ?? "").toLowerCase();
56
- if (/(^|\.)(int|integer|long|short)$/.test(normalizado)) {
57
- return "Inteiro";
58
- }
59
- if (/(^|\.)(float|double|bigdecimal|decimal)$/.test(normalizado)) {
60
- return "Decimal";
61
- }
62
- if (/uuid|id$/i.test(normalizado)) {
63
- return "Id";
64
- }
65
- return "Texto";
66
- }
67
-
68
- function extrairAtributosJava(linhas: string[], inicio: number): { atributos: string[]; proximoIndice: number } {
69
- const atributos: string[] = [];
70
- let indice = inicio;
71
-
72
- while (indice < linhas.length) {
73
- const linha = linhas[indice]!.trim();
74
- if (!linha.startsWith("@")) {
75
- break;
76
- }
77
- let atual = linha;
78
- let saldo = contarChar(linha, "(") - contarChar(linha, ")");
79
- while (saldo > 0 && indice + 1 < linhas.length) {
80
- indice += 1;
81
- const complemento = linhas[indice]!.trim();
82
- atual += ` ${complemento}`;
83
- saldo += contarChar(complemento, "(") - contarChar(complemento, ")");
84
- }
85
- atributos.push(atual);
86
- indice += 1;
87
- }
88
-
89
- return { atributos, proximoIndice: indice };
90
- }
91
-
92
- function extrairCaminhoJava(atributo: string): string | undefined {
93
- return atributo.match(/"([^"]+)"/)?.[1];
94
- }
95
-
96
- function extrairMetodosJava(atributo: string): string[] {
97
- const direto = atributo.match(/@(Get|Post|Put|Patch|Delete)Mapping/i)?.[1]?.toUpperCase();
98
- if (direto && METODOS_HTTP.has(direto)) {
99
- return [direto];
100
- }
101
-
102
- const requestMethod = [...atributo.matchAll(/RequestMethod\.(GET|POST|PUT|PATCH|DELETE)/gi)]
103
- .map((match) => match[1]!.toUpperCase())
104
- .filter((metodo) => METODOS_HTTP.has(metodo));
105
- if (requestMethod.length > 0) {
106
- return [...new Set(requestMethod)];
107
- }
108
- return [];
109
- }
110
-
111
- function normalizarCaminhoJava(caminho: string): string {
112
- return caminho.replace(/\{([^}:]+):[^}]+\}/g, "{$1}").replace(/\/+/g, "/");
113
- }
114
-
115
- function extrairParametrosRotaJava(caminho: string, assinatura: string): ParametroRotaJava[] {
116
- const assinaturaMap = new Map<string, string>();
117
- for (const parametro of extrairParametrosAssinaturaJava(assinatura)) {
118
- assinaturaMap.set(parametro.nome, parametro.tipoTexto ?? "");
119
- }
120
- return [...caminho.matchAll(/\{([^}:]+)(?::[^}]+)?\}/g)].map((match) => {
121
- const nome = match[1]!;
122
- return {
123
- nome,
124
- tipoSema: mapearTipoJava(assinaturaMap.get(nome)),
125
- };
126
- });
127
- }
128
-
129
- export function extrairSimbolosJava(codigo: string): SimboloJavaExtraido[] {
130
- const simbolos = new Map<string, SimboloJavaExtraido>();
131
- const linhas = codigo.split(/\r?\n/);
132
- const pilhaClasses: Array<{ nome: string; profundidade: number }> = [];
133
- let profundidade = 0;
134
-
135
- for (let indice = 0; indice < linhas.length; indice += 1) {
136
- const linhaOriginal = linhas[indice]!;
137
- const { atributos, proximoIndice } = extrairAtributosJava(linhas, indice);
138
- if (atributos.length > 0) {
139
- indice = proximoIndice;
140
- }
141
- const linha = (linhas[indice] ?? linhaOriginal).trim();
142
- if (!linha || linha.startsWith("//")) {
143
- profundidade += contarChar(linhaOriginal, "{") - contarChar(linhaOriginal, "}");
144
- while (pilhaClasses.length > 0 && profundidade < pilhaClasses[pilhaClasses.length - 1]!.profundidade) {
145
- pilhaClasses.pop();
146
- }
147
- continue;
148
- }
149
-
150
- const classe = linha.match(/\bclass\s+([A-Za-z_]\w*)/);
151
- if (classe) {
152
- pilhaClasses.push({ nome: classe[1]!, profundidade: profundidade + 1 });
153
- profundidade += contarChar(linha, "{") - contarChar(linha, "}");
154
- while (pilhaClasses.length > 0 && profundidade < pilhaClasses[pilhaClasses.length - 1]!.profundidade) {
155
- pilhaClasses.pop();
156
- }
157
- continue;
158
- }
159
-
160
- const metodo = linha.match(/\b(?:public|protected|private)\s+(?:static\s+|final\s+|synchronized\s+)*([A-Za-z0-9_<>,.?[\]\s]+)\s+([A-Za-z_]\w*)\s*\(([^)]*)\)/);
161
- if (metodo) {
162
- const classeAtual = pilhaClasses[pilhaClasses.length - 1];
163
- const simbolo = classeAtual ? `${classeAtual.nome}.${metodo[2]!}` : metodo[2]!;
164
- simbolos.set(simbolo, {
165
- simbolo,
166
- retorno: metodo[1]!.trim(),
167
- parametros: extrairParametrosAssinaturaJava(metodo[3]!),
168
- });
169
- }
170
-
171
- profundidade += contarChar(linha, "{") - contarChar(linha, "}");
172
- while (pilhaClasses.length > 0 && profundidade < pilhaClasses[pilhaClasses.length - 1]!.profundidade) {
173
- pilhaClasses.pop();
174
- }
175
- }
176
-
177
- return [...simbolos.values()];
178
- }
179
-
180
- export function extrairRotasJava(codigo: string): RotaJavaExtraida[] {
181
- const rotas = new Map<string, RotaJavaExtraida>();
182
- const linhas = codigo.split(/\r?\n/);
183
- const pilhaClasses: Array<{ nome: string; profundidade: number; rotaBase?: string; rest: boolean }> = [];
184
- let profundidade = 0;
185
-
186
- for (let indice = 0; indice < linhas.length; indice += 1) {
187
- const linhaOriginal = linhas[indice]!;
188
- const { atributos, proximoIndice } = extrairAtributosJava(linhas, indice);
189
- if (atributos.length > 0) {
190
- indice = proximoIndice;
191
- }
192
- const linha = (linhas[indice] ?? linhaOriginal).trim();
193
- if (!linha || linha.startsWith("//")) {
194
- profundidade += contarChar(linhaOriginal, "{") - contarChar(linhaOriginal, "}");
195
- while (pilhaClasses.length > 0 && profundidade < pilhaClasses[pilhaClasses.length - 1]!.profundidade) {
196
- pilhaClasses.pop();
197
- }
198
- continue;
199
- }
200
-
201
- const classe = linha.match(/\bclass\s+([A-Za-z_]\w*)/);
202
- if (classe) {
203
- const rotaBase = atributos
204
- .filter((atributo) => /@RequestMapping/i.test(atributo))
205
- .map((atributo) => extrairCaminhoJava(atributo))
206
- .find(Boolean);
207
- pilhaClasses.push({
208
- nome: classe[1]!,
209
- profundidade: profundidade + 1,
210
- rotaBase,
211
- rest: atributos.some((atributo) => /@RestController/i.test(atributo)),
212
- });
213
- profundidade += contarChar(linha, "{") - contarChar(linha, "}");
214
- while (pilhaClasses.length > 0 && profundidade < pilhaClasses[pilhaClasses.length - 1]!.profundidade) {
215
- pilhaClasses.pop();
216
- }
217
- continue;
218
- }
219
-
220
- const classeAtual = pilhaClasses[pilhaClasses.length - 1];
221
- const metodo = linha.match(/\b(?:public|protected)\s+(?:static\s+|final\s+)*([A-Za-z0-9_<>,.?[\]\s]+)\s+([A-Za-z_]\w*)\s*\(([^)]*)\)/);
222
- if (classeAtual && metodo) {
223
- for (const atributo of atributos.filter((item) => /@(Get|Post|Put|Patch|Delete)Mapping|@RequestMapping/i.test(item))) {
224
- const metodos = extrairMetodosJava(atributo);
225
- const caminho = normalizarCaminhoJava(juntarCaminho(classeAtual.rotaBase, extrairCaminhoJava(atributo)));
226
- for (const httpMetodo of metodos) {
227
- const registro: RotaJavaExtraida = {
228
- origem: "java",
229
- metodo: httpMetodo,
230
- caminho,
231
- simbolo: `${classeAtual.nome}.${metodo[2]!}`,
232
- parametros: extrairParametrosRotaJava(caminho, metodo[3] ?? ""),
233
- retorno: metodo[1]!.trim(),
234
- };
235
- rotas.set(`${registro.metodo}:${registro.caminho}:${registro.simbolo}`, registro);
236
- }
237
- }
238
- }
239
-
240
- profundidade += contarChar(linha, "{") - contarChar(linha, "}");
241
- while (pilhaClasses.length > 0 && profundidade < pilhaClasses[pilhaClasses.length - 1]!.profundidade) {
242
- pilhaClasses.pop();
243
- }
244
- }
245
-
246
- return [...rotas.values()];
247
- }
@@ -1,114 +0,0 @@
1
- export interface ParametroLuaExtraido {
2
- nome: string;
3
- obrigatorio: boolean;
4
- tipoTexto?: string;
5
- }
6
-
7
- export interface SimboloLuaExtraido {
8
- simbolo: string;
9
- parametros: ParametroLuaExtraido[];
10
- }
11
-
12
- const PALAVRAS_RESERVADAS_LUA = new Set([
13
- "and",
14
- "break",
15
- "do",
16
- "else",
17
- "elseif",
18
- "end",
19
- "false",
20
- "for",
21
- "function",
22
- "goto",
23
- "if",
24
- "in",
25
- "local",
26
- "nil",
27
- "not",
28
- "or",
29
- "repeat",
30
- "return",
31
- "then",
32
- "true",
33
- "until",
34
- "while",
35
- ]);
36
-
37
- function removerComentariosLua(codigo: string): string {
38
- return codigo
39
- .replace(/--\[\[[\s\S]*?\]\]/g, "")
40
- .replace(/--[^\r\n]*/g, "");
41
- }
42
-
43
- function normalizarSimboloLua(simbolo: string): string {
44
- return simbolo
45
- .replace(/:/g, ".")
46
- .replace(/\.+/g, ".")
47
- .replace(/^\.+|\.+$/g, "");
48
- }
49
-
50
- function simboloLuaValido(simbolo: string): boolean {
51
- const partes = simbolo.split(".").filter(Boolean);
52
- return partes.length > 0
53
- && partes.every((parte) => /^[A-Za-z_]\w*$/.test(parte) && !PALAVRAS_RESERVADAS_LUA.has(parte));
54
- }
55
-
56
- function dividirParametrosLua(parametros: string): ParametroLuaExtraido[] {
57
- return parametros
58
- .split(",")
59
- .map((item) => item.trim())
60
- .filter(Boolean)
61
- .filter((item) => item !== "..." && item !== "self")
62
- .map((item) => item.replace(/\s*=.*$/, "").trim())
63
- .filter((item) => /^[A-Za-z_]\w*$/.test(item))
64
- .map((nome) => ({
65
- nome,
66
- obrigatorio: true,
67
- }));
68
- }
69
-
70
- function registrarSimboloLua(
71
- simbolos: Map<string, SimboloLuaExtraido>,
72
- simboloBruto: string,
73
- parametros: string,
74
- ): void {
75
- const simbolo = normalizarSimboloLua(simboloBruto);
76
- if (!simboloLuaValido(simbolo)) {
77
- return;
78
- }
79
- simbolos.set(simbolo, {
80
- simbolo,
81
- parametros: dividirParametrosLua(parametros),
82
- });
83
- }
84
-
85
- export function extrairSimbolosLua(codigo: string): SimboloLuaExtraido[] {
86
- const texto = removerComentariosLua(codigo);
87
- const simbolos = new Map<string, SimboloLuaExtraido>();
88
-
89
- for (const match of texto.matchAll(/(?:^|\n)\s*(?:local\s+)?function\s+([A-Za-z_]\w*(?:(?:\.|:)[A-Za-z_]\w*)*)\s*\(([^)]*)\)/g)) {
90
- registrarSimboloLua(simbolos, match[1]!, match[2] ?? "");
91
- }
92
-
93
- for (const match of texto.matchAll(/(?:^|\n)\s*(?:local\s+)?([A-Za-z_]\w*)\s*=\s*\{([\s\S]*?)^\s*\}/gm)) {
94
- const tabela = match[1]!;
95
- const corpo = match[2] ?? "";
96
- for (const membro of corpo.matchAll(/(?:^|[\s,{])([A-Za-z_]\w*)\s*=\s*function\s*\(([^)]*)\)/g)) {
97
- registrarSimboloLua(simbolos, `${tabela}.${membro[1]!}`, membro[2] ?? "");
98
- }
99
- }
100
-
101
- for (const match of texto.matchAll(/(?:^|\n)\s*([A-Za-z_]\w*(?:(?:\.|:)[A-Za-z_]\w*)*)\s*=\s*function\s*\(([^)]*)\)/g)) {
102
- registrarSimboloLua(simbolos, match[1]!, match[2] ?? "");
103
- }
104
-
105
- for (const match of texto.matchAll(/(?:^|\n)\s*([A-Za-z_]\w*)\s*\[\s*["']([A-Za-z_]\w*)["']\s*\]\s*=\s*function\s*\(([^)]*)\)/g)) {
106
- registrarSimboloLua(simbolos, `${match[1]!}.${match[2]!}`, match[3] ?? "");
107
- }
108
-
109
- for (const match of texto.matchAll(/(?:^|[\s,{])([A-Za-z_]\w*)\s*=\s*function\s*\(([^)]*)\)/g)) {
110
- registrarSimboloLua(simbolos, match[1]!, match[2] ?? "");
111
- }
112
-
113
- return [...simbolos.values()].sort((a, b) => a.simbolo.localeCompare(b.simbolo, "pt-BR"));
114
- }