@semacode/cli 2.3.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/LICENSE +39 -39
  2. package/README.md +112 -41
  3. package/dist/agentContextPack.js +14 -10
  4. package/dist/agentEntryPoints.d.ts +5 -0
  5. package/dist/agentEntryPoints.js +102 -91
  6. package/dist/angular-consumer-standalone.d.ts +3 -1
  7. package/dist/angular-consumer-standalone.js +12 -8
  8. package/dist/bin.d.ts +6 -0
  9. package/dist/bin.js +130 -0
  10. package/dist/cliArgs.js +4 -4
  11. package/dist/cliControlError.d.ts +12 -0
  12. package/dist/cliControlError.js +47 -0
  13. package/dist/cliGrammar.d.ts +11 -0
  14. package/dist/cliGrammar.js +551 -0
  15. package/dist/cliHelp.d.ts +13 -0
  16. package/dist/cliHelp.js +19 -0
  17. package/dist/cliHelpTexto.d.ts +3 -0
  18. package/dist/cliHelpTexto.js +168 -0
  19. package/dist/cliRuntime.d.ts +2 -0
  20. package/dist/cliRuntime.js +31 -0
  21. package/dist/comandos.js +9 -22
  22. package/dist/contexto.js +5 -5
  23. package/dist/dev/index.d.ts +1 -0
  24. package/dist/dev/index.js +51 -9
  25. package/dist/discovery/catalog.js +3 -3
  26. package/dist/distribuicao/filesystemGlobal.d.ts +63 -0
  27. package/dist/distribuicao/filesystemGlobal.js +701 -0
  28. package/dist/distribuicao/index.d.ts +7 -0
  29. package/dist/distribuicao/index.js +227 -0
  30. package/dist/distribuicao/launcherGlobal.d.ts +53 -0
  31. package/dist/distribuicao/launcherGlobal.js +643 -0
  32. package/dist/distribuicao/launcherWindows.d.ts +28 -0
  33. package/dist/distribuicao/launcherWindows.js +326 -0
  34. package/dist/distribuicao/lockContextGlobal.d.ts +10 -0
  35. package/dist/distribuicao/lockContextGlobal.js +17 -0
  36. package/dist/distribuicao/lockGlobal.d.ts +6 -0
  37. package/dist/distribuicao/lockGlobal.js +520 -0
  38. package/dist/distribuicao/skillGlobal.d.ts +48 -0
  39. package/dist/distribuicao/skillGlobal.js +652 -0
  40. package/dist/distribuicao/skillIntentPolicy.d.ts +21 -0
  41. package/dist/distribuicao/skillIntentPolicy.js +115 -0
  42. package/dist/distribuicao/tipos.d.ts +50 -0
  43. package/dist/distribuicao/tipos.js +10 -0
  44. package/dist/distribuicao/versaoSemantica.d.ts +3 -0
  45. package/dist/distribuicao/versaoSemantica.js +62 -0
  46. package/dist/drift.part01.d.ts +34 -2
  47. package/dist/drift.part01.js +3 -0
  48. package/dist/drift.part04.d.ts +12 -2
  49. package/dist/drift.part04.js +89 -15
  50. package/dist/drift.part05.d.ts +2 -1
  51. package/dist/drift.part05.js +9 -6
  52. package/dist/drift.part06.d.ts +2 -1
  53. package/dist/drift.part06.js +115 -24
  54. package/dist/drift.part07.d.ts +11 -10
  55. package/dist/drift.part07.js +261 -255
  56. package/dist/drift.part08.d.ts +2 -1
  57. package/dist/drift.part08.js +35 -25
  58. package/dist/drift.part11.js +279 -32
  59. package/dist/drift.part12.d.ts +1 -1
  60. package/dist/drift.part12.js +196 -11
  61. package/dist/drift.part13.d.ts +18 -2
  62. package/dist/drift.part13.js +654 -76
  63. package/dist/drift.part14.js +21 -7
  64. package/dist/driftCacheCas.d.ts +43 -0
  65. package/dist/driftCacheCas.js +351 -0
  66. package/dist/driftCacheFilesystem.d.ts +64 -0
  67. package/dist/driftCacheFilesystem.js +313 -0
  68. package/dist/driftCacheModes.d.ts +38 -0
  69. package/dist/driftCacheModes.js +147 -0
  70. package/dist/driftCacheStore.d.ts +80 -0
  71. package/dist/driftCacheStore.js +603 -0
  72. package/dist/driftCatalogo.d.ts +65 -0
  73. package/dist/driftCatalogo.js +516 -0
  74. package/dist/driftEscopo.d.ts +21 -0
  75. package/dist/driftEscopo.js +647 -0
  76. package/dist/driftEscopoReferencias.d.ts +8 -0
  77. package/dist/driftEscopoReferencias.js +612 -0
  78. package/dist/driftOrcamento.d.ts +6 -0
  79. package/dist/driftOrcamento.js +20 -3
  80. package/dist/geracaoCore.js +4 -6
  81. package/dist/iaPrompts.d.ts +3 -3
  82. package/dist/iaPrompts.js +13 -14
  83. package/dist/index.d.ts +4 -1
  84. package/dist/index.js +6 -25
  85. package/dist/index.part01.d.ts +21 -14
  86. package/dist/index.part01.js +20 -165
  87. package/dist/index.part02.js +57 -43
  88. package/dist/index.part03.d.ts +23 -1
  89. package/dist/index.part03.js +83 -8
  90. package/dist/index.part04.d.ts +10 -2
  91. package/dist/index.part04.js +48 -14
  92. package/dist/index.part05.d.ts +1 -1
  93. package/dist/index.part05.js +109 -30
  94. package/dist/index.part06.js +34 -16
  95. package/dist/index.part07.js +31 -27
  96. package/dist/index.part08.d.ts +1 -1
  97. package/dist/index.part08.js +23 -28
  98. package/dist/init/templates.part01.js +393 -393
  99. package/dist/init/templates.part02.js +189 -189
  100. package/dist/initCommand.js +5 -1
  101. package/dist/initTemplatesBackend.js +73 -73
  102. package/dist/initTemplatesBase.js +7 -5
  103. package/dist/initTemplatesFlutter.js +137 -137
  104. package/dist/initTemplatesRuntime.js +350 -350
  105. package/dist/initTemplatesWeb.js +309 -309
  106. package/dist/pipelineConteudo/command.d.ts +1 -0
  107. package/dist/pipelineConteudo/command.js +4 -32
  108. package/dist/pipelineConteudo/help.d.ts +2 -0
  109. package/dist/pipelineConteudo/help.js +33 -0
  110. package/dist/profileAuthorCommand.js +3 -7
  111. package/dist/profileCommand.js +3 -7
  112. package/dist/projeto.d.ts +1 -1
  113. package/dist/projetoCarregar.d.ts +2 -2
  114. package/dist/projetoCarregar.js +69 -28
  115. package/dist/projetoCatalogo.d.ts +8 -0
  116. package/dist/projetoCatalogo.js +164 -0
  117. package/dist/projetoOrigens.d.ts +2 -0
  118. package/dist/projetoOrigens.js +65 -9
  119. package/dist/projetoTipos.d.ts +15 -5
  120. package/dist/resultadoCli.d.ts +20 -0
  121. package/dist/resultadoCli.js +57 -0
  122. package/dist/saidaCli.d.ts +35 -0
  123. package/dist/saidaCli.js +118 -0
  124. package/dist/sistemasInterativos/acceptanceEvidence.d.ts +22 -0
  125. package/dist/sistemasInterativos/acceptanceEvidence.js +345 -0
  126. package/dist/sistemasInterativos/engineObservation.d.ts +12 -0
  127. package/dist/sistemasInterativos/engineObservation.js +438 -0
  128. package/dist/sistemasInterativos/jobOrchestration.d.ts +2 -0
  129. package/dist/sistemasInterativos/jobOrchestration.js +204 -0
  130. package/dist/sistemasInterativos/operationPrimitives.d.ts +21 -0
  131. package/dist/sistemasInterativos/operationPrimitives.js +194 -0
  132. package/dist/sistemasInterativos/operations.d.ts +4 -39
  133. package/dist/sistemasInterativos/operations.js +5 -1164
  134. package/dist/skillCommand.d.ts +5 -0
  135. package/dist/skillCommand.js +88 -0
  136. package/dist/sync/index.js +35 -35
  137. package/docs/README.md +11 -7
  138. package/docs/ai-integration.md +18 -11
  139. package/docs/ai-onboarding.md +81 -62
  140. package/docs/ai-workflow.md +10 -4
  141. package/docs/auth.md +26 -26
  142. package/docs/cli.md +197 -79
  143. package/docs/commands.md +30 -6
  144. package/docs/database.md +15 -15
  145. package/docs/deploy.md +54 -41
  146. package/docs/documentation.md +11 -10
  147. package/docs/drift-cache.md +108 -0
  148. package/docs/env.md +16 -16
  149. package/docs/frontend.md +41 -41
  150. package/docs/getting-started.md +82 -57
  151. package/docs/i18n.md +15 -15
  152. package/docs/repositories.md +60 -43
  153. package/docs/rollback.md +38 -31
  154. package/docs/security.md +54 -32
  155. package/docs/sistemas-interativos.md +27 -27
  156. package/docs/support.md +8 -8
  157. package/docs/testing.md +123 -17
  158. package/docs/vocabulary.md +29 -29
  159. package/exemplos/agendamento.sema +1 -1
  160. package/exemplos/assinatura.sema +1 -1
  161. package/exemplos/auditoria.sema +1 -1
  162. package/exemplos/autenticacao.sema +1 -1
  163. package/exemplos/author_obra_comum.sema +1 -1
  164. package/exemplos/author_tema_sensivel.sema +1 -1
  165. package/exemplos/automacao.sema +1 -1
  166. package/exemplos/cadastro_usuario.sema +1 -1
  167. package/exemplos/calculadora.sema +1 -1
  168. package/exemplos/crud_simples.sema +1 -1
  169. package/exemplos/estoque.sema +1 -1
  170. package/exemplos/exportacao.sema +1 -1
  171. package/exemplos/fila.sema +1 -1
  172. package/exemplos/integracao_externa.sema +1 -1
  173. package/exemplos/multi_tenant.sema +1 -1
  174. package/exemplos/notificacao.sema +1 -1
  175. package/exemplos/operacao_estrategia.sema +132 -132
  176. package/exemplos/operacao_estrategia_discovery.sema +220 -220
  177. package/exemplos/operacao_estrategia_fluxo.sema +114 -114
  178. package/exemplos/operacao_estrategia_gates.sema +106 -106
  179. package/exemplos/operacao_estrategia_quarentena.sema +133 -133
  180. package/exemplos/operacao_estrategia_rollout.sema +124 -124
  181. package/exemplos/pagamento.sema +1 -1
  182. package/exemplos/pagamento_dominio.sema +1 -1
  183. package/exemplos/pedido.sema +1 -1
  184. package/exemplos/permissao.sema +1 -1
  185. package/exemplos/persistencia_vendor_first.sema +1 -1
  186. package/exemplos/profile_conversas.sema +165 -165
  187. package/exemplos/profile_game.sema +1 -1
  188. package/exemplos/profile_legal.sema +1 -1
  189. package/exemplos/profile_ops.sema +1 -1
  190. package/exemplos/profile_research.sema +1 -1
  191. package/exemplos/profile_software.sema +1 -1
  192. package/exemplos/profile_workflow_n8n.sema +1 -1
  193. package/exemplos/relatorio.sema +1 -1
  194. package/exemplos/replica_analitica_erp.sema +1 -1
  195. package/exemplos/testes_embutidos.sema +1 -1
  196. package/exemplos/tratamento_erro.sema +1 -1
  197. package/exemplos/upload_arquivo.sema +1 -1
  198. package/exemplos/webhook.sema +1 -1
  199. package/node_modules/@sema/gerador-cpp/dist/index.js +176 -176
  200. package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
  201. package/node_modules/@sema/gerador-css/dist/index.part02.js +460 -460
  202. package/node_modules/@sema/gerador-dotnet/dist/index.js +169 -169
  203. package/node_modules/@sema/gerador-html/dist/index.js +17 -17
  204. package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
  205. package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
  206. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
  207. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +1 -0
  208. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1 -0
  209. package/package.json +7 -2
  210. package/scripts/postinstall.mjs +148 -0
  211. package/skills/sema/SKILL.md +199 -0
  212. package/skills/sema/agents/openai.yaml +4 -0
  213. package/node_modules/@sema/gerador-cpp/dist/index.js.map +0 -1
  214. package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
  215. package/node_modules/@sema/gerador-css/dist/index.part01.js.map +0 -1
  216. package/node_modules/@sema/gerador-css/dist/index.part02.js.map +0 -1
  217. package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
  218. package/node_modules/@sema/gerador-dotnet/dist/index.js.map +0 -1
  219. package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
  220. package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
  221. package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
  222. package/node_modules/@sema/gerador-php/dist/index.js.map +0 -1
  223. package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
  224. package/node_modules/@sema/gerador-python/dist/index.part01.js.map +0 -1
  225. package/node_modules/@sema/gerador-python/dist/index.part02.js.map +0 -1
  226. package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
  227. package/node_modules/@sema/gerador-typescript/dist/index.part01.js.map +0 -1
  228. package/node_modules/@sema/gerador-typescript/dist/index.part02.js.map +0 -1
  229. package/node_modules/@sema/gerador-typescript/dist/index.part03.js.map +0 -1
  230. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
  231. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
  232. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +0 -1
  233. package/node_modules/@sema/nucleo/dist/diagnosticos/snippets.js.map +0 -1
  234. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
  235. package/node_modules/@sema/nucleo/dist/formatador/index.part01.js.map +0 -1
  236. package/node_modules/@sema/nucleo/dist/formatador/index.part02.js.map +0 -1
  237. package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
  238. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
  239. package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js.map +0 -1
  240. package/node_modules/@sema/nucleo/dist/ir/conversor.part02.js.map +0 -1
  241. package/node_modules/@sema/nucleo/dist/ir/conversor.part03.js.map +0 -1
  242. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
  243. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
  244. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
  245. package/node_modules/@sema/nucleo/dist/parser/parser.declaracoes.js.map +0 -1
  246. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
  247. package/node_modules/@sema/nucleo/dist/parser/parser.modulo.js.map +0 -1
  248. package/node_modules/@sema/nucleo/dist/parser/parser.part01.js.map +0 -1
  249. package/node_modules/@sema/nucleo/dist/parser/parser.part02.js.map +0 -1
  250. package/node_modules/@sema/nucleo/dist/parser/parser.part03.js.map +0 -1
  251. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
  252. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
  253. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js.map +0 -1
  254. package/node_modules/@sema/nucleo/dist/semantico/analisador.part02.js.map +0 -1
  255. package/node_modules/@sema/nucleo/dist/semantico/analisador.part03.js.map +0 -1
  256. package/node_modules/@sema/nucleo/dist/semantico/analisador.part04.js.map +0 -1
  257. package/node_modules/@sema/nucleo/dist/semantico/analisador.part05.js.map +0 -1
  258. package/node_modules/@sema/nucleo/dist/semantico/analisador.part06.js.map +0 -1
  259. package/node_modules/@sema/nucleo/dist/semantico/analisador.part07.js.map +0 -1
  260. package/node_modules/@sema/nucleo/dist/semantico/analisador.part08.js.map +0 -1
  261. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
  262. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part01.js.map +0 -1
  263. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part02.js.map +0 -1
  264. package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.js.map +0 -1
  265. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
  266. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
  267. package/node_modules/@sema/padroes/dist/index.js.map +0 -1
@@ -1,5 +1,5 @@
1
- // SEMA-GOVERNED: sema.governanca_ia_contexto
2
- // Descricao: CLI particionada; consulte contratos/sema/governanca_ia_contexto.sema antes de editar.
1
+ // SEMA-GOVERNED: sema.produto.governanca_ia.drift
2
+ // Descricao: indexa linguagens legadas sem reabrir fontes fora do catalogo do drift.
3
3
  import { readFile } from "node:fs/promises";
4
4
  import path from "node:path";
5
5
  import { extrairSimbolosCpp } from "./cpp-symbols.js";
@@ -11,134 +11,149 @@ import { extrairRotasPhp, extrairSimbolosPhp } from "./php-http.js";
11
11
  import { contarIndentacaoPython, extrairRotasFlaskDecoradas } from "./python-http.js";
12
12
  import { extrairRotasRust, extrairSimbolosRust } from "./rust-http.js";
13
13
  import { categorizarPersistenciaPorOrigem } from "./drift.part01.js";
14
- import { caminhosSimbolicos, listarArquivosRecursivos } from "./drift.part04.js";
14
+ import { caminhosSimbolicos, chaveCaminhoCanonicoDrift, deduplicarRaizesSobrepostasDrift, listarArquivosRecursivos, } from "./drift.part04.js";
15
15
  import { extrairRecursosPersistenciaCodigoVivo, extrairRecursosPrisma, extrairSimbolosSqlDeclarativos, recursoEhIgnorado, registrarRecursoDrift } from "./drift.part03.js";
16
16
  import { registrarRotasPython, registrarSimboloPython } from "./drift.part06.js";
17
17
  import { arquivoEhRotasFlutterConsumer, extrairRotasFlutterConsumer, inferirRotaFlutterConsumer } from "./drift.part05.js";
18
18
  import { fecharPrefixoRecurso, limparLiteralRecurso, normalizarNomeRecursoDrift } from "./drift.part02.js";
19
- export async function indexarPython(diretorios) {
19
+ async function listarArquivosIndexacaoCompartilhada(diretorios, extensoes, adaptadorLeitura) {
20
+ const arquivos = new Map();
21
+ for (const diretorio of deduplicarRaizesSobrepostasDrift(diretorios)) {
22
+ for (const arquivo of await listarArquivosRecursivos(diretorio, extensoes, adaptadorLeitura)) {
23
+ const chave = chaveCaminhoCanonicoDrift(arquivo);
24
+ if (!arquivos.has(chave)) {
25
+ arquivos.set(chave, { diretorio, arquivo });
26
+ }
27
+ }
28
+ }
29
+ return [...arquivos.values()];
30
+ }
31
+ async function lerTextoIndexacaoCompartilhada(arquivo, adaptadorLeitura) {
32
+ return adaptadorLeitura
33
+ ? adaptadorLeitura.lerTexto(arquivo)
34
+ : readFile(arquivo, "utf8");
35
+ }
36
+ export async function indexarPython(diretorios, adaptadorLeitura) {
37
+ adaptadorLeitura?.emitir?.("extractor.run");
20
38
  const simbolos = new Map();
21
39
  const rotas = [];
22
40
  const recursos = new Map();
23
- for (const diretorio of diretorios) {
24
- const arquivos = (await listarArquivosRecursivos(diretorio, [".py"]))
25
- .filter((arquivo) => !arquivo.endsWith("__init__.py") && !/tests?[\\/]/i.test(arquivo));
26
- for (const arquivo of arquivos) {
27
- const texto = await readFile(arquivo, "utf8");
28
- const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
29
- const prefixo = texto.match(/APIRouter\s*\(\s*prefix\s*=\s*["']([^"']+)["']/)?.[1];
30
- for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, texto)) {
31
- registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
41
+ const arquivos = (await listarArquivosIndexacaoCompartilhada(diretorios, [".py"], adaptadorLeitura))
42
+ .filter(({ arquivo }) => !arquivo.endsWith("__init__.py") && !/tests?[\\/]/i.test(arquivo));
43
+ for (const { diretorio, arquivo } of arquivos) {
44
+ const texto = await lerTextoIndexacaoCompartilhada(arquivo, adaptadorLeitura);
45
+ const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
46
+ const prefixo = texto.match(/APIRouter\s*\(\s*prefix\s*=\s*["']([^"']+)["']/)?.[1];
47
+ for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, texto)) {
48
+ registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
49
+ }
50
+ for (const rota of extrairRotasFlaskDecoradas(texto)) {
51
+ rotas.push({
52
+ origem: "flask",
53
+ metodo: rota.metodo,
54
+ caminho: rota.caminho,
55
+ arquivo,
56
+ simbolo: rota.nomeFuncao,
57
+ });
58
+ }
59
+ const blocos = [];
60
+ let decoratorsPendentes = [];
61
+ for (const linha of texto.split(/\r?\n/)) {
62
+ const trim = linha.trim();
63
+ if (trim === "" || trim.startsWith("#")) {
64
+ decoratorsPendentes = [];
65
+ continue;
32
66
  }
33
- for (const rota of extrairRotasFlaskDecoradas(texto)) {
34
- rotas.push({
35
- origem: "flask",
36
- metodo: rota.metodo,
37
- caminho: rota.caminho,
38
- arquivo,
39
- simbolo: rota.nomeFuncao,
40
- });
67
+ const indentacao = contarIndentacaoPython(linha);
68
+ while (blocos.length > 0 && indentacao <= blocos[blocos.length - 1].indentacao) {
69
+ blocos.pop();
41
70
  }
42
- const blocos = [];
43
- let decoratorsPendentes = [];
44
- for (const linha of texto.split(/\r?\n/)) {
45
- const trim = linha.trim();
46
- if (trim === "" || trim.startsWith("#")) {
47
- decoratorsPendentes = [];
48
- continue;
49
- }
50
- const indentacao = contarIndentacaoPython(linha);
51
- while (blocos.length > 0 && indentacao <= blocos[blocos.length - 1].indentacao) {
52
- blocos.pop();
53
- }
54
- if (trim.startsWith("@")) {
55
- decoratorsPendentes.push(trim);
56
- continue;
57
- }
58
- const classe = trim.match(/^class\s+([A-Za-z_]\w*)(?:\([^)]*\))?:\s*(?:#.*)?$/);
59
- if (classe) {
60
- blocos.push({ tipo: "class", nome: classe[1], indentacao });
61
- decoratorsPendentes = [];
62
- continue;
71
+ if (trim.startsWith("@")) {
72
+ decoratorsPendentes.push(trim);
73
+ continue;
74
+ }
75
+ const classe = trim.match(/^class\s+([A-Za-z_]\w*)(?:\([^)]*\))?:\s*(?:#.*)?$/);
76
+ if (classe) {
77
+ blocos.push({ tipo: "class", nome: classe[1], indentacao });
78
+ decoratorsPendentes = [];
79
+ continue;
80
+ }
81
+ const definicao = trim.match(/^(?:async\s+def|def)\s+([A-Za-z_]\w*)\s*\(/);
82
+ if (definicao) {
83
+ const nomeFuncao = definicao[1];
84
+ const existeDefPai = blocos.some((bloco) => bloco.tipo === "def");
85
+ const classeAtual = [...blocos].reverse().find((bloco) => bloco.tipo === "class");
86
+ if (!existeDefPai && classeAtual) {
87
+ registrarSimboloPython(simbolos, basesSimbolicas, arquivo, nomeFuncao, classeAtual.nome);
63
88
  }
64
- const definicao = trim.match(/^(?:async\s+def|def)\s+([A-Za-z_]\w*)\s*\(/);
65
- if (definicao) {
66
- const nomeFuncao = definicao[1];
67
- const existeDefPai = blocos.some((bloco) => bloco.tipo === "def");
68
- const classeAtual = [...blocos].reverse().find((bloco) => bloco.tipo === "class");
69
- if (!existeDefPai && classeAtual) {
70
- registrarSimboloPython(simbolos, basesSimbolicas, arquivo, nomeFuncao, classeAtual.nome);
71
- }
72
- else if (!existeDefPai) {
73
- registrarSimboloPython(simbolos, basesSimbolicas, arquivo, nomeFuncao);
74
- registrarRotasPython(rotas, decoratorsPendentes, prefixo, arquivo, nomeFuncao);
75
- }
76
- blocos.push({ tipo: "def", nome: nomeFuncao, indentacao });
77
- decoratorsPendentes = [];
78
- continue;
89
+ else if (!existeDefPai) {
90
+ registrarSimboloPython(simbolos, basesSimbolicas, arquivo, nomeFuncao);
91
+ registrarRotasPython(rotas, decoratorsPendentes, prefixo, arquivo, nomeFuncao);
79
92
  }
93
+ blocos.push({ tipo: "def", nome: nomeFuncao, indentacao });
80
94
  decoratorsPendentes = [];
95
+ continue;
81
96
  }
97
+ decoratorsPendentes = [];
82
98
  }
83
99
  }
84
100
  return { simbolos: [...simbolos.values()], rotas, recursos: [...recursos.values()] };
85
101
  }
86
- export async function indexarDart(diretorios) {
102
+ export async function indexarDart(diretorios, adaptadorLeitura) {
103
+ adaptadorLeitura?.emitir?.("extractor.run");
87
104
  const simbolos = new Map();
88
105
  const rotas = [];
89
106
  const recursos = new Map();
90
107
  const consumerSurfaces = new Map();
91
- for (const diretorio of diretorios) {
92
- const arquivos = (await listarArquivosRecursivos(diretorio, [".dart"]))
93
- .filter((arquivo) => !arquivo.endsWith(".g.dart") && !arquivo.endsWith(".freezed.dart"));
94
- for (const arquivo of arquivos) {
95
- const texto = await readFile(arquivo, "utf8");
96
- const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
97
- const relacao = path.relative(diretorio, arquivo);
98
- for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, texto)) {
99
- registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
108
+ const arquivos = (await listarArquivosIndexacaoCompartilhada(diretorios, [".dart"], adaptadorLeitura))
109
+ .filter(({ arquivo }) => !arquivo.endsWith(".g.dart") && !arquivo.endsWith(".freezed.dart"));
110
+ for (const { diretorio, arquivo } of arquivos) {
111
+ const texto = await lerTextoIndexacaoCompartilhada(arquivo, adaptadorLeitura);
112
+ const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
113
+ const relacao = path.relative(diretorio, arquivo);
114
+ for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, texto)) {
115
+ registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
116
+ }
117
+ for (const match of texto.matchAll(/(?:Future<[^\n]+>|[\w?<>.,\s]+)\s+(\w+)\(([^)]*)\)\s*(?:async\s*)?\{/g)) {
118
+ const nome = match[1];
119
+ if (["build", "toString"].includes(nome)) {
120
+ continue;
100
121
  }
101
- for (const match of texto.matchAll(/(?:Future<[^\n]+>|[\w?<>.,\s]+)\s+(\w+)\(([^)]*)\)\s*(?:async\s*)?\{/g)) {
102
- const nome = match[1];
103
- if (["build", "toString"].includes(nome)) {
104
- continue;
105
- }
106
- for (const baseSimbolica of basesSimbolicas) {
107
- const caminho = `${baseSimbolica}.${nome}`;
108
- simbolos.set(caminho, { origem: "dart", caminho, arquivo, simbolo: nome });
109
- }
122
+ for (const baseSimbolica of basesSimbolicas) {
123
+ const caminho = `${baseSimbolica}.${nome}`;
124
+ simbolos.set(caminho, { origem: "dart", caminho, arquivo, simbolo: nome });
110
125
  }
111
- const superficieFlutter = inferirRotaFlutterConsumer(relacao);
112
- if (superficieFlutter) {
113
- consumerSurfaces.set(`${superficieFlutter.rota}:${arquivo}:${superficieFlutter.tipoArquivo}`, {
114
- rota: superficieFlutter.rota,
126
+ }
127
+ const superficieFlutter = inferirRotaFlutterConsumer(relacao);
128
+ if (superficieFlutter) {
129
+ consumerSurfaces.set(`${superficieFlutter.rota}:${arquivo}:${superficieFlutter.tipoArquivo}`, {
130
+ rota: superficieFlutter.rota,
131
+ arquivo,
132
+ tipoArquivo: superficieFlutter.tipoArquivo,
133
+ });
134
+ rotas.push({
135
+ origem: "flutter-consumer",
136
+ metodo: "VIEW",
137
+ caminho: superficieFlutter.rota,
138
+ arquivo,
139
+ simbolo: superficieFlutter.tipoArquivo,
140
+ });
141
+ }
142
+ if (arquivoEhRotasFlutterConsumer(relacao, texto)) {
143
+ for (const rotaFlutter of extrairRotasFlutterConsumer(relacao, texto)) {
144
+ consumerSurfaces.set(`${rotaFlutter.rota}:${arquivo}:router`, {
145
+ rota: rotaFlutter.rota,
115
146
  arquivo,
116
- tipoArquivo: superficieFlutter.tipoArquivo,
147
+ tipoArquivo: "router",
117
148
  });
118
149
  rotas.push({
119
150
  origem: "flutter-consumer",
120
151
  metodo: "VIEW",
121
- caminho: superficieFlutter.rota,
152
+ caminho: rotaFlutter.rota,
122
153
  arquivo,
123
- simbolo: superficieFlutter.tipoArquivo,
154
+ simbolo: "router",
124
155
  });
125
156
  }
126
- if (arquivoEhRotasFlutterConsumer(relacao, texto)) {
127
- for (const rotaFlutter of extrairRotasFlutterConsumer(relacao, texto)) {
128
- consumerSurfaces.set(`${rotaFlutter.rota}:${arquivo}:router`, {
129
- rota: rotaFlutter.rota,
130
- arquivo,
131
- tipoArquivo: "router",
132
- });
133
- rotas.push({
134
- origem: "flutter-consumer",
135
- metodo: "VIEW",
136
- caminho: rotaFlutter.rota,
137
- arquivo,
138
- simbolo: "router",
139
- });
140
- }
141
- }
142
157
  }
143
158
  }
144
159
  return {
@@ -173,135 +188,129 @@ export function registrarSimboloGenerico(simbolos, origem, basesSimbolicas, arqu
173
188
  }
174
189
  }
175
190
  }
176
- export async function indexarDotnet(diretorios) {
191
+ export async function indexarDotnet(diretorios, adaptadorLeitura) {
192
+ adaptadorLeitura?.emitir?.("extractor.run");
177
193
  const simbolos = new Map();
178
194
  const rotas = [];
179
195
  const recursos = new Map();
180
- for (const diretorio of diretorios) {
181
- const arquivos = (await listarArquivosRecursivos(diretorio, [".cs"]))
182
- .filter((arquivo) => !/(^|[\\/])(bin|obj|Test[s]?)([\\/]|$)/i.test(arquivo));
183
- for (const arquivo of arquivos) {
184
- const codigo = await readFile(arquivo, "utf8");
185
- const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
186
- for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
187
- registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
188
- }
189
- for (const simbolo of extrairSimbolosDotnet(codigo)) {
190
- registrarSimboloGenerico(simbolos, "cs", basesSimbolicas, arquivo, simbolo.simbolo);
191
- }
192
- for (const rota of extrairRotasDotnet(codigo)) {
193
- rotas.push({
194
- origem: "dotnet",
195
- metodo: rota.metodo,
196
- caminho: rota.caminho,
197
- arquivo,
198
- simbolo: rota.simbolo,
199
- });
200
- }
196
+ const arquivos = (await listarArquivosIndexacaoCompartilhada(diretorios, [".cs"], adaptadorLeitura))
197
+ .filter(({ arquivo }) => !/(^|[\\/])(bin|obj|Test[s]?)([\\/]|$)/i.test(arquivo));
198
+ for (const { diretorio, arquivo } of arquivos) {
199
+ const codigo = await lerTextoIndexacaoCompartilhada(arquivo, adaptadorLeitura);
200
+ const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
201
+ for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
202
+ registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
203
+ }
204
+ for (const simbolo of extrairSimbolosDotnet(codigo)) {
205
+ registrarSimboloGenerico(simbolos, "cs", basesSimbolicas, arquivo, simbolo.simbolo);
206
+ }
207
+ for (const rota of extrairRotasDotnet(codigo)) {
208
+ rotas.push({
209
+ origem: "dotnet",
210
+ metodo: rota.metodo,
211
+ caminho: rota.caminho,
212
+ arquivo,
213
+ simbolo: rota.simbolo,
214
+ });
201
215
  }
202
216
  }
203
217
  return { simbolos: [...simbolos.values()], rotas, recursos: [...recursos.values()] };
204
218
  }
205
- export async function indexarJava(diretorios) {
219
+ export async function indexarJava(diretorios, adaptadorLeitura) {
220
+ adaptadorLeitura?.emitir?.("extractor.run");
206
221
  const simbolos = new Map();
207
222
  const rotas = [];
208
223
  const recursos = new Map();
209
- for (const diretorio of diretorios) {
210
- const arquivos = (await listarArquivosRecursivos(diretorio, [".java"]))
211
- .filter((arquivo) => !/(^|[\\/])(target|build|out|Test[s]?)([\\/]|$)/i.test(arquivo));
212
- for (const arquivo of arquivos) {
213
- const codigo = await readFile(arquivo, "utf8");
214
- const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
215
- for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
216
- registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
217
- }
218
- for (const simbolo of extrairSimbolosJava(codigo)) {
219
- registrarSimboloGenerico(simbolos, "java", basesSimbolicas, arquivo, simbolo.simbolo);
220
- }
221
- for (const rota of extrairRotasJava(codigo)) {
222
- rotas.push({
223
- origem: "java",
224
- metodo: rota.metodo,
225
- caminho: rota.caminho,
226
- arquivo,
227
- simbolo: rota.simbolo,
228
- });
229
- }
224
+ const arquivos = (await listarArquivosIndexacaoCompartilhada(diretorios, [".java"], adaptadorLeitura))
225
+ .filter(({ arquivo }) => !/(^|[\\/])(target|build|out|Test[s]?)([\\/]|$)/i.test(arquivo));
226
+ for (const { diretorio, arquivo } of arquivos) {
227
+ const codigo = await lerTextoIndexacaoCompartilhada(arquivo, adaptadorLeitura);
228
+ const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
229
+ for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
230
+ registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
231
+ }
232
+ for (const simbolo of extrairSimbolosJava(codigo)) {
233
+ registrarSimboloGenerico(simbolos, "java", basesSimbolicas, arquivo, simbolo.simbolo);
234
+ }
235
+ for (const rota of extrairRotasJava(codigo)) {
236
+ rotas.push({
237
+ origem: "java",
238
+ metodo: rota.metodo,
239
+ caminho: rota.caminho,
240
+ arquivo,
241
+ simbolo: rota.simbolo,
242
+ });
230
243
  }
231
244
  }
232
245
  return { simbolos: [...simbolos.values()], rotas, recursos: [...recursos.values()] };
233
246
  }
234
- export async function indexarGo(diretorios) {
247
+ export async function indexarGo(diretorios, adaptadorLeitura) {
248
+ adaptadorLeitura?.emitir?.("extractor.run");
235
249
  const simbolos = new Map();
236
250
  const rotas = [];
237
251
  const recursos = new Map();
238
- for (const diretorio of diretorios) {
239
- const arquivos = await listarArquivosRecursivos(diretorio, [".go"]);
240
- for (const arquivo of arquivos) {
241
- const codigo = await readFile(arquivo, "utf8");
242
- const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
243
- for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
244
- registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
245
- }
246
- for (const simbolo of extrairSimbolosGo(codigo)) {
247
- registrarSimboloGenerico(simbolos, "go", basesSimbolicas, arquivo, simbolo.simbolo);
248
- }
249
- for (const rota of extrairRotasGo(codigo)) {
250
- rotas.push({
251
- origem: "go",
252
- metodo: rota.metodo,
253
- caminho: rota.caminho,
254
- arquivo,
255
- simbolo: rota.simbolo,
256
- });
257
- }
252
+ const arquivos = await listarArquivosIndexacaoCompartilhada(diretorios, [".go"], adaptadorLeitura);
253
+ for (const { diretorio, arquivo } of arquivos) {
254
+ const codigo = await lerTextoIndexacaoCompartilhada(arquivo, adaptadorLeitura);
255
+ const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
256
+ for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
257
+ registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
258
+ }
259
+ for (const simbolo of extrairSimbolosGo(codigo)) {
260
+ registrarSimboloGenerico(simbolos, "go", basesSimbolicas, arquivo, simbolo.simbolo);
261
+ }
262
+ for (const rota of extrairRotasGo(codigo)) {
263
+ rotas.push({
264
+ origem: "go",
265
+ metodo: rota.metodo,
266
+ caminho: rota.caminho,
267
+ arquivo,
268
+ simbolo: rota.simbolo,
269
+ });
258
270
  }
259
271
  }
260
272
  return { simbolos: [...simbolos.values()], rotas, recursos: [...recursos.values()] };
261
273
  }
262
- export async function indexarRust(diretorios) {
274
+ export async function indexarRust(diretorios, adaptadorLeitura) {
275
+ adaptadorLeitura?.emitir?.("extractor.run");
263
276
  const simbolos = new Map();
264
277
  const rotas = [];
265
278
  const recursos = new Map();
266
- for (const diretorio of diretorios) {
267
- const arquivos = await listarArquivosRecursivos(diretorio, [".rs"]);
268
- for (const arquivo of arquivos) {
269
- const codigo = await readFile(arquivo, "utf8");
270
- const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
271
- for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
272
- registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
273
- }
274
- for (const simbolo of extrairSimbolosRust(codigo)) {
275
- registrarSimboloGenerico(simbolos, "rust", basesSimbolicas, arquivo, simbolo.simbolo);
276
- }
277
- for (const rota of extrairRotasRust(codigo)) {
278
- rotas.push({
279
- origem: "rust",
280
- metodo: rota.metodo,
281
- caminho: rota.caminho,
282
- arquivo,
283
- simbolo: rota.simbolo,
284
- });
285
- }
279
+ const arquivos = await listarArquivosIndexacaoCompartilhada(diretorios, [".rs"], adaptadorLeitura);
280
+ for (const { diretorio, arquivo } of arquivos) {
281
+ const codigo = await lerTextoIndexacaoCompartilhada(arquivo, adaptadorLeitura);
282
+ const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
283
+ for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
284
+ registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
285
+ }
286
+ for (const simbolo of extrairSimbolosRust(codigo)) {
287
+ registrarSimboloGenerico(simbolos, "rust", basesSimbolicas, arquivo, simbolo.simbolo);
288
+ }
289
+ for (const rota of extrairRotasRust(codigo)) {
290
+ rotas.push({
291
+ origem: "rust",
292
+ metodo: rota.metodo,
293
+ caminho: rota.caminho,
294
+ arquivo,
295
+ simbolo: rota.simbolo,
296
+ });
286
297
  }
287
298
  }
288
299
  return { simbolos: [...simbolos.values()], rotas, recursos: [...recursos.values()] };
289
300
  }
290
- export async function indexarCpp(diretorios) {
301
+ export async function indexarCpp(diretorios, adaptadorLeitura) {
302
+ adaptadorLeitura?.emitir?.("extractor.run");
291
303
  const simbolos = new Map();
292
304
  const recursos = new Map();
293
- for (const diretorio of diretorios) {
294
- const arquivos = (await listarArquivosRecursivos(diretorio, [".cpp", ".cc", ".cxx", ".hpp", ".h"]))
295
- .filter((arquivo) => !/(^|[\\/])(windows|linux|macos|runner|flutter|ephemeral|build|vendor)([\\/]|$)/i.test(arquivo));
296
- for (const arquivo of arquivos) {
297
- const codigo = await readFile(arquivo, "utf8");
298
- const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
299
- for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
300
- registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
301
- }
302
- for (const simbolo of extrairSimbolosCpp(codigo)) {
303
- registrarSimboloGenerico(simbolos, "cpp", basesSimbolicas, arquivo, simbolo.simbolo);
304
- }
305
+ const arquivos = (await listarArquivosIndexacaoCompartilhada(diretorios, [".cpp", ".cc", ".cxx", ".hpp", ".h"], adaptadorLeitura)).filter(({ arquivo }) => !/(^|[\\/])(windows|linux|macos|runner|flutter|ephemeral|build|vendor)([\\/]|$)/i.test(arquivo));
306
+ for (const { diretorio, arquivo } of arquivos) {
307
+ const codigo = await lerTextoIndexacaoCompartilhada(arquivo, adaptadorLeitura);
308
+ const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
309
+ for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
310
+ registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
311
+ }
312
+ for (const simbolo of extrairSimbolosCpp(codigo)) {
313
+ registrarSimboloGenerico(simbolos, "cpp", basesSimbolicas, arquivo, simbolo.simbolo);
305
314
  }
306
315
  }
307
316
  return {
@@ -309,40 +318,39 @@ export async function indexarCpp(diretorios) {
309
318
  recursos: [...recursos.values()],
310
319
  };
311
320
  }
312
- export async function indexarPhp(diretorios) {
321
+ export async function indexarPhp(diretorios, adaptadorLeitura) {
322
+ adaptadorLeitura?.emitir?.("extractor.run");
313
323
  const simbolos = new Map();
314
324
  const rotas = [];
315
325
  const recursos = new Map();
316
- for (const diretorio of diretorios) {
317
- const arquivos = (await listarArquivosRecursivos(diretorio, [".php"]))
318
- .filter((arquivo) => !/(^|[\\/])(vendor|storage|bootstrap[\\/]cache|cache|tests?)([\\/]|$)/i.test(arquivo));
319
- for (const arquivo of arquivos) {
320
- const codigo = await readFile(arquivo, "utf8");
321
- const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
322
- for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
323
- registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
324
- }
325
- for (const simbolo of extrairSimbolosPhp(codigo)) {
326
- registrarSimboloGenerico(simbolos, "php", basesSimbolicas, arquivo, simbolo.simbolo);
327
- for (const alias of simbolo.aliases ?? []) {
328
- simbolos.set(alias, {
329
- origem: "php",
330
- caminho: alias,
331
- arquivo,
332
- simbolo: simbolo.simbolo,
333
- });
334
- }
335
- }
336
- for (const rota of extrairRotasPhp(codigo)) {
337
- rotas.push({
326
+ const arquivos = (await listarArquivosIndexacaoCompartilhada(diretorios, [".php"], adaptadorLeitura))
327
+ .filter(({ arquivo }) => !/(^|[\\/])(vendor|storage|bootstrap[\\/]cache|cache|tests?)([\\/]|$)/i.test(arquivo));
328
+ for (const { diretorio, arquivo } of arquivos) {
329
+ const codigo = await lerTextoIndexacaoCompartilhada(arquivo, adaptadorLeitura);
330
+ const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
331
+ for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
332
+ registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
333
+ }
334
+ for (const simbolo of extrairSimbolosPhp(codigo)) {
335
+ registrarSimboloGenerico(simbolos, "php", basesSimbolicas, arquivo, simbolo.simbolo);
336
+ for (const alias of simbolo.aliases ?? []) {
337
+ simbolos.set(alias, {
338
338
  origem: "php",
339
- metodo: rota.metodo,
340
- caminho: rota.caminho,
339
+ caminho: alias,
341
340
  arquivo,
342
- simbolo: rota.simbolo,
341
+ simbolo: simbolo.simbolo,
343
342
  });
344
343
  }
345
344
  }
345
+ for (const rota of extrairRotasPhp(codigo)) {
346
+ rotas.push({
347
+ origem: "php",
348
+ metodo: rota.metodo,
349
+ caminho: rota.caminho,
350
+ arquivo,
351
+ simbolo: rota.simbolo,
352
+ });
353
+ }
346
354
  }
347
355
  return {
348
356
  simbolos: [...simbolos.values()],
@@ -350,21 +358,20 @@ export async function indexarPhp(diretorios) {
350
358
  recursos: [...recursos.values()],
351
359
  };
352
360
  }
353
- export async function indexarLua(diretorios) {
361
+ export async function indexarLua(diretorios, adaptadorLeitura) {
362
+ adaptadorLeitura?.emitir?.("extractor.run");
354
363
  const simbolos = new Map();
355
364
  const recursos = new Map();
356
- for (const diretorio of diretorios) {
357
- const arquivos = (await listarArquivosRecursivos(diretorio, [".lua"]))
358
- .filter((arquivo) => !/(^|[\\/])(vendor|build|dist|generated|tests?)([\\/]|$)/i.test(arquivo));
359
- for (const arquivo of arquivos) {
360
- const codigo = await readFile(arquivo, "utf8");
361
- const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
362
- for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
363
- registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
364
- }
365
- for (const simbolo of extrairSimbolosLua(codigo)) {
366
- registrarSimboloGenerico(simbolos, "lua", basesSimbolicas, arquivo, simbolo.simbolo);
367
- }
365
+ const arquivos = (await listarArquivosIndexacaoCompartilhada(diretorios, [".lua"], adaptadorLeitura))
366
+ .filter(({ arquivo }) => !/(^|[\\/])(vendor|build|dist|generated|tests?)([\\/]|$)/i.test(arquivo));
367
+ for (const { diretorio, arquivo } of arquivos) {
368
+ const codigo = await lerTextoIndexacaoCompartilhada(arquivo, adaptadorLeitura);
369
+ const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
370
+ for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
371
+ registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
372
+ }
373
+ for (const simbolo of extrairSimbolosLua(codigo)) {
374
+ registrarSimboloGenerico(simbolos, "lua", basesSimbolicas, arquivo, simbolo.simbolo);
368
375
  }
369
376
  }
370
377
  return {
@@ -372,26 +379,25 @@ export async function indexarLua(diretorios) {
372
379
  recursos: [...recursos.values()],
373
380
  };
374
381
  }
375
- export async function indexarPersistenciaDeclarativa(diretorios) {
382
+ export async function indexarPersistenciaDeclarativa(diretorios, adaptadorLeitura) {
383
+ adaptadorLeitura?.emitir?.("extractor.run");
376
384
  const recursos = new Map();
377
385
  const simbolos = new Map();
378
- for (const diretorio of diretorios) {
379
- const arquivos = await listarArquivosRecursivos(diretorio, [
380
- ".sql", ".psql", ".ddl", ".prisma",
381
- ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
382
- ".py", ".dart", ".lua", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h", ".php",
383
- ]);
384
- for (const arquivo of arquivos) {
385
- const codigo = await readFile(arquivo, "utf8");
386
- const extracoes = arquivo.endsWith(".prisma")
387
- ? extrairRecursosPrisma(arquivo, codigo)
388
- : extrairRecursosPersistenciaCodigoVivo(arquivo, codigo);
389
- for (const recurso of extracoes) {
390
- registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
391
- }
392
- for (const simbolo of extrairSimbolosSqlDeclarativos(arquivo, codigo)) {
393
- simbolos.set(`${simbolo.caminho}:${simbolo.arquivo}`, simbolo);
394
- }
386
+ const arquivos = await listarArquivosIndexacaoCompartilhada(diretorios, [
387
+ ".sql", ".psql", ".ddl", ".prisma",
388
+ ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
389
+ ".py", ".dart", ".lua", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h", ".php",
390
+ ], adaptadorLeitura);
391
+ for (const { arquivo } of arquivos) {
392
+ const codigo = await lerTextoIndexacaoCompartilhada(arquivo, adaptadorLeitura);
393
+ const extracoes = arquivo.endsWith(".prisma")
394
+ ? extrairRecursosPrisma(arquivo, codigo)
395
+ : extrairRecursosPersistenciaCodigoVivo(arquivo, codigo);
396
+ for (const recurso of extracoes) {
397
+ registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
398
+ }
399
+ for (const simbolo of extrairSimbolosSqlDeclarativos(arquivo, codigo)) {
400
+ simbolos.set(`${simbolo.caminho}:${simbolo.arquivo}`, simbolo);
395
401
  }
396
402
  }
397
403
  return { recursos: [...recursos.values()], simbolos: [...simbolos.values()] };