@semacode/cli 1.5.16 → 1.5.17

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 (175) hide show
  1. package/AGENTS.md +272 -0
  2. package/LICENSE +22 -0
  3. package/SEMA_BRIEF.curto.txt +9 -0
  4. package/SEMA_BRIEF.md +70 -0
  5. package/SEMA_BRIEF.micro.txt +7 -0
  6. package/SEMA_INDEX.json +921 -0
  7. package/dist/angular-consumer-standalone.d.ts +6 -0
  8. package/dist/angular-consumer-standalone.js.map +1 -0
  9. package/dist/cpp-symbols.d.ts +10 -0
  10. package/dist/cpp-symbols.js.map +1 -0
  11. package/dist/docs.d.ts +56 -0
  12. package/dist/docs.js.map +1 -0
  13. package/dist/dotnet-http.d.ts +23 -0
  14. package/dist/dotnet-http.js.map +1 -0
  15. package/dist/drift.d.ts +225 -0
  16. package/dist/drift.js.map +1 -0
  17. package/dist/go-http.d.ts +23 -0
  18. package/dist/go-http.js.map +1 -0
  19. package/dist/importador.d.ts +31 -0
  20. package/dist/importador.js.map +1 -0
  21. package/dist/index.d.ts +2 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/java-http.d.ts +23 -0
  24. package/dist/java-http.js.map +1 -0
  25. package/dist/lua-symbols.d.ts +10 -0
  26. package/dist/lua-symbols.js.map +1 -0
  27. package/dist/php-symbols.d.ts +24 -0
  28. package/dist/php-symbols.js.map +1 -0
  29. package/dist/projeto.d.ts +53 -0
  30. package/dist/projeto.js.map +1 -0
  31. package/dist/python-http.d.ts +23 -0
  32. package/dist/python-http.js.map +1 -0
  33. package/dist/rust-http.d.ts +23 -0
  34. package/dist/rust-http.js.map +1 -0
  35. package/dist/tipos.d.ts +3 -0
  36. package/dist/tipos.js.map +1 -0
  37. package/dist/typescript-http.d.ts +35 -0
  38. package/dist/typescript-http.js.map +1 -0
  39. package/docs/AGENT_STARTER.md +102 -0
  40. package/docs/cli.md +119 -0
  41. package/docs/como-ensinar-a-sema-para-ia.md +149 -0
  42. package/docs/deploy.md +70 -0
  43. package/docs/documentacao.md +63 -0
  44. package/docs/env.md +56 -0
  45. package/docs/extensao-vscode.md +45 -0
  46. package/docs/fluxo-pratico-ia-sema.md +177 -0
  47. package/docs/instalacao-e-primeiro-uso.md +112 -0
  48. package/docs/integracao-com-ia.md +101 -0
  49. package/docs/mcp.md +53 -0
  50. package/docs/pagamento-ponta-a-ponta.md +155 -0
  51. package/docs/persistencia-vendor-first.md +145 -0
  52. package/docs/prompt-base-ia-sema.md +104 -0
  53. package/docs/rollback.md +47 -0
  54. package/docs/sintaxe.md +410 -0
  55. package/exemplos/agendamento.sema +106 -0
  56. package/exemplos/assinatura.sema +136 -0
  57. package/exemplos/auditoria.sema +88 -0
  58. package/exemplos/autenticacao.sema +125 -0
  59. package/exemplos/automacao.sema +107 -0
  60. package/exemplos/cadastro_usuario.sema +54 -0
  61. package/exemplos/calculadora.sema +78 -0
  62. package/exemplos/crud_simples.sema +89 -0
  63. package/exemplos/estoque.sema +126 -0
  64. package/exemplos/exportacao.sema +94 -0
  65. package/exemplos/fila.sema +131 -0
  66. package/exemplos/integracao_externa.sema +94 -0
  67. package/exemplos/multi_tenant.sema +140 -0
  68. package/exemplos/notificacao.sema +98 -0
  69. package/exemplos/operacao_estrategia.sema +402 -0
  70. package/exemplos/pagamento.sema +222 -0
  71. package/exemplos/pagamento_dominio.sema +35 -0
  72. package/exemplos/pedido.sema +119 -0
  73. package/exemplos/permissao.sema +121 -0
  74. package/exemplos/persistencia_vendor_first.sema +86 -0
  75. package/exemplos/relatorio.sema +93 -0
  76. package/exemplos/testes_embutidos.sema +45 -0
  77. package/exemplos/tratamento_erro.sema +157 -0
  78. package/exemplos/upload_arquivo.sema +93 -0
  79. package/exemplos/webhook.sema +96 -0
  80. package/llms-full.txt +34 -0
  81. package/llms.txt +17 -0
  82. package/node_modules/@sema/gerador-css/dist/index.d.ts +3 -0
  83. package/node_modules/@sema/gerador-css/dist/index.js +592 -0
  84. package/node_modules/@sema/gerador-css/dist/index.js.map +1 -0
  85. package/node_modules/@sema/gerador-css/package.json +7 -0
  86. package/node_modules/@sema/gerador-dart/dist/index.d.ts +3 -0
  87. package/node_modules/@sema/gerador-dart/dist/index.js +44 -0
  88. package/node_modules/@sema/gerador-dart/dist/index.js.map +1 -0
  89. package/node_modules/@sema/gerador-dart/package.json +7 -0
  90. package/node_modules/@sema/gerador-html/dist/index.d.ts +3 -0
  91. package/node_modules/@sema/gerador-html/dist/index.js +163 -0
  92. package/node_modules/@sema/gerador-html/dist/index.js.map +1 -0
  93. package/node_modules/@sema/gerador-html/package.json +7 -0
  94. package/node_modules/@sema/gerador-javascript/dist/index.d.ts +3 -0
  95. package/node_modules/@sema/gerador-javascript/dist/index.js +421 -0
  96. package/node_modules/@sema/gerador-javascript/dist/index.js.map +1 -0
  97. package/node_modules/@sema/gerador-javascript/package.json +7 -0
  98. package/node_modules/@sema/gerador-lua/dist/index.d.ts +3 -0
  99. package/node_modules/@sema/gerador-lua/dist/index.js +328 -0
  100. package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -0
  101. package/node_modules/@sema/gerador-lua/package.json +7 -0
  102. package/node_modules/@sema/gerador-python/dist/index.d.ts +6 -0
  103. package/node_modules/@sema/gerador-python/dist/index.js +729 -0
  104. package/node_modules/@sema/gerador-python/dist/index.js.map +1 -0
  105. package/node_modules/@sema/gerador-python/package.json +7 -0
  106. package/node_modules/@sema/gerador-typescript/dist/index.d.ts +6 -0
  107. package/node_modules/@sema/gerador-typescript/dist/index.js +793 -0
  108. package/node_modules/@sema/gerador-typescript/dist/index.js.map +1 -0
  109. package/node_modules/@sema/gerador-typescript/package.json +7 -0
  110. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +125 -0
  111. package/node_modules/@sema/nucleo/dist/ast/tipos.js +2 -0
  112. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +1 -0
  113. package/node_modules/@sema/nucleo/dist/diagnosticos/index.d.ts +21 -0
  114. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js +12 -0
  115. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +1 -0
  116. package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +9 -0
  117. package/node_modules/@sema/nucleo/dist/formatador/index.js +488 -0
  118. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -0
  119. package/node_modules/@sema/nucleo/dist/index.d.ts +35 -0
  120. package/node_modules/@sema/nucleo/dist/index.js +96 -0
  121. package/node_modules/@sema/nucleo/dist/index.js.map +1 -0
  122. package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +5 -0
  123. package/node_modules/@sema/nucleo/dist/ir/conversor.js +1072 -0
  124. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -0
  125. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +377 -0
  126. package/node_modules/@sema/nucleo/dist/ir/modelos.js +2 -0
  127. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +1 -0
  128. package/node_modules/@sema/nucleo/dist/lexer/lexer.d.ts +7 -0
  129. package/node_modules/@sema/nucleo/dist/lexer/lexer.js +122 -0
  130. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +1 -0
  131. package/node_modules/@sema/nucleo/dist/lexer/tokens.d.ts +8 -0
  132. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +82 -0
  133. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -0
  134. package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +9 -0
  135. package/node_modules/@sema/nucleo/dist/parser/parser.js +807 -0
  136. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -0
  137. package/node_modules/@sema/nucleo/dist/persistencia/contratos.d.ts +39 -0
  138. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js +294 -0
  139. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +1 -0
  140. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +58 -0
  141. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1912 -0
  142. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -0
  143. package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +104 -0
  144. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +445 -0
  145. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +1 -0
  146. package/node_modules/@sema/nucleo/dist/semantico/seguranca.d.ts +91 -0
  147. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js +258 -0
  148. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +1 -0
  149. package/node_modules/@sema/nucleo/dist/util/arquivos.d.ts +2 -0
  150. package/node_modules/@sema/nucleo/dist/util/arquivos.js +25 -0
  151. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +1 -0
  152. package/node_modules/@sema/nucleo/package.json +7 -0
  153. package/node_modules/@sema/padroes/dist/index.d.ts +25 -0
  154. package/node_modules/@sema/padroes/dist/index.js +316 -0
  155. package/node_modules/@sema/padroes/dist/index.js.map +1 -0
  156. package/node_modules/@sema/padroes/package.json +7 -0
  157. package/package.json +35 -26
  158. package/semacode-cli-1.3.1.tgz +0 -0
  159. package/src/angular-consumer-standalone.ts +0 -312
  160. package/src/cpp-symbols.ts +0 -82
  161. package/src/docs.ts +0 -535
  162. package/src/dotnet-http.ts +0 -355
  163. package/src/drift.ts +0 -4933
  164. package/src/go-http.ts +0 -118
  165. package/src/importador.ts +0 -3891
  166. package/src/index.ts +0 -5641
  167. package/src/java-http.ts +0 -247
  168. package/src/lua-symbols.ts +0 -114
  169. package/src/php-symbols.ts +0 -462
  170. package/src/projeto.ts +0 -862
  171. package/src/python-http.ts +0 -258
  172. package/src/rust-http.ts +0 -125
  173. package/src/tipos.ts +0 -24
  174. package/src/typescript-http.ts +0 -1076
  175. 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
- }