@semacode/cli 2.3.0 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +39 -39
- package/README.md +251 -228
- package/dist/agentEntryPoints.js +551 -550
- package/dist/angular-consumer-standalone.d.ts +3 -1
- package/dist/angular-consumer-standalone.js +12 -8
- package/dist/drift.part01.d.ts +32 -2
- package/dist/drift.part01.js +2 -0
- package/dist/drift.part04.d.ts +3 -2
- package/dist/drift.part04.js +6 -3
- package/dist/drift.part05.d.ts +2 -1
- package/dist/drift.part05.js +4 -3
- package/dist/drift.part06.d.ts +2 -1
- package/dist/drift.part06.js +9 -5
- package/dist/drift.part07.d.ts +11 -10
- package/dist/drift.part07.js +40 -30
- package/dist/drift.part08.d.ts +2 -1
- package/dist/drift.part08.js +4 -3
- package/dist/drift.part11.js +71 -6
- package/dist/drift.part12.js +14 -1
- package/dist/drift.part13.d.ts +42 -7
- package/dist/drift.part13.js +660 -36
- package/dist/driftCache.d.ts +49 -0
- package/dist/driftCache.js +311 -0
- package/dist/driftCacheIncremental.d.ts +98 -0
- package/dist/driftCacheIncremental.js +596 -0
- package/dist/driftCatalogo.d.ts +91 -0
- package/dist/driftCatalogo.js +657 -0
- package/dist/driftCatalogoPersistente.d.ts +8 -0
- package/dist/driftCatalogoPersistente.js +77 -0
- package/dist/driftEscopo.d.ts +23 -0
- package/dist/driftEscopo.js +563 -0
- package/dist/driftEscopoReferencias.d.ts +4 -0
- package/dist/driftEscopoReferencias.js +265 -0
- package/dist/driftOrcamento.d.ts +12 -0
- package/dist/driftOrcamento.js +19 -3
- package/dist/execucoesExternas.js +5 -19
- package/dist/iaPrompts.js +310 -310
- package/dist/index.part01.d.ts +16 -1
- package/dist/index.part01.js +80 -4
- package/dist/index.part02.js +21 -21
- package/dist/index.part03.d.ts +2 -2
- package/dist/index.part03.js +14 -3
- package/dist/index.part04.d.ts +2 -2
- package/dist/index.part04.js +113 -101
- package/dist/index.part05.d.ts +1 -1
- package/dist/index.part05.js +99 -22
- package/dist/index.part06.js +3 -2
- package/dist/index.part07.js +24 -24
- package/dist/index.part08.js +1 -1
- package/dist/init/templates.part01.js +393 -393
- package/dist/init/templates.part02.js +189 -189
- package/dist/initTemplatesBackend.js +73 -73
- package/dist/initTemplatesBase.js +81 -81
- package/dist/initTemplatesFlutter.js +137 -137
- package/dist/initTemplatesRuntime.js +350 -350
- package/dist/initTemplatesWeb.js +309 -309
- package/dist/pipelineConteudo/command.js +1 -36
- package/dist/projeto.d.ts +1 -1
- package/dist/projetoCarregar.d.ts +2 -2
- package/dist/projetoCarregar.js +47 -24
- package/dist/projetoCatalogo.d.ts +7 -0
- package/dist/projetoCatalogo.js +125 -0
- package/dist/projetoTipos.d.ts +14 -5
- package/dist/sync/index.js +35 -35
- package/docs/README.md +34 -34
- package/docs/ai-integration.md +1 -7
- package/docs/ai-onboarding.md +62 -62
- package/docs/ai-workflow.md +4 -0
- package/docs/auth.md +26 -26
- package/docs/cli.md +79 -79
- package/docs/commands.md +16 -13
- package/docs/database.md +15 -15
- package/docs/deploy.md +41 -41
- package/docs/descoberta-capacidades.md +106 -106
- package/docs/documentation.md +37 -46
- package/docs/env.md +16 -16
- package/docs/frontend.md +41 -41
- package/docs/getting-started.md +57 -57
- package/docs/i18n.md +15 -15
- package/docs/pipeline-conteudo.md +246 -246
- package/docs/profiles.md +54 -54
- package/docs/repositories.md +43 -43
- package/docs/rollback.md +31 -31
- package/docs/security.md +32 -32
- package/docs/sistemas-interativos.md +373 -378
- package/docs/support.md +8 -8
- package/docs/testing.md +51 -44
- package/docs/vocabulary.md +29 -29
- package/exemplos/agendamento.sema +1 -1
- package/exemplos/assinatura.sema +1 -1
- package/exemplos/auditoria.sema +1 -1
- package/exemplos/autenticacao.sema +1 -1
- package/exemplos/author_obra_comum.sema +1 -1
- package/exemplos/author_tema_sensivel.sema +1 -1
- package/exemplos/automacao.sema +1 -1
- package/exemplos/cadastro_usuario.sema +1 -1
- package/exemplos/calculadora.sema +1 -1
- package/exemplos/crud_simples.sema +1 -1
- package/exemplos/estoque.sema +1 -1
- package/exemplos/exportacao.sema +1 -1
- package/exemplos/fila.sema +1 -1
- package/exemplos/integracao_externa.sema +1 -1
- package/exemplos/multi_tenant.sema +1 -1
- package/exemplos/notificacao.sema +1 -1
- package/exemplos/operacao_estrategia.sema +132 -132
- package/exemplos/operacao_estrategia_discovery.sema +220 -220
- package/exemplos/operacao_estrategia_fluxo.sema +114 -114
- package/exemplos/operacao_estrategia_gates.sema +106 -106
- package/exemplos/operacao_estrategia_quarentena.sema +133 -133
- package/exemplos/operacao_estrategia_rollout.sema +124 -124
- package/exemplos/pagamento.sema +1 -1
- package/exemplos/pagamento_dominio.sema +1 -1
- package/exemplos/pedido.sema +1 -1
- package/exemplos/permissao.sema +1 -1
- package/exemplos/persistencia_vendor_first.sema +1 -1
- package/exemplos/pipeline-conteudo/README.md +44 -44
- package/exemplos/pipeline-conteudo/alvos.json +23 -23
- package/exemplos/pipeline-conteudo/definicao.json +136 -136
- package/exemplos/profile_conversas.sema +165 -165
- package/exemplos/profile_game.sema +1 -1
- package/exemplos/profile_legal.sema +1 -1
- package/exemplos/profile_ops.sema +1 -1
- package/exemplos/profile_research.sema +1 -1
- package/exemplos/profile_simulation.sema +211 -211
- package/exemplos/profile_software.sema +1 -1
- package/exemplos/profile_workflow_n8n.sema +1 -1
- package/exemplos/relatorio.sema +1 -1
- package/exemplos/replica_analitica_erp.sema +1 -1
- package/exemplos/sistemas-interativos/README.md +100 -100
- package/exemplos/sistemas-interativos/advanced/acceptance-context-evaluate-valid.json +5 -5
- package/exemplos/sistemas-interativos/advanced/acceptance-lock-valid.json +16 -16
- package/exemplos/sistemas-interativos/advanced/asset-provenance-valid.json +32 -32
- package/exemplos/sistemas-interativos/advanced/autonomy-repair-valid.json +93 -93
- package/exemplos/sistemas-interativos/advanced/control-run-definition-valid.json +78 -78
- package/exemplos/sistemas-interativos/advanced/control-run-valid.json +27 -27
- package/exemplos/sistemas-interativos/advanced/distributed-workers-valid.json +79 -79
- package/exemplos/sistemas-interativos/advanced/editor-state-valid.json +42 -42
- package/exemplos/sistemas-interativos/advanced/engine-snapshot-after-valid.json +32 -32
- package/exemplos/sistemas-interativos/advanced/engine-snapshot-before-valid.json +23 -23
- package/exemplos/sistemas-interativos/advanced/job-orchestration-valid.json +39 -39
- package/exemplos/sistemas-interativos/advanced/multimodal-evidence-valid.json +46 -46
- package/exemplos/sistemas-interativos/advanced/multiplayer-authority-valid.json +39 -39
- package/exemplos/sistemas-interativos/advanced/playtest-fuzz-valid.json +37 -37
- package/exemplos/sistemas-interativos/advanced/portability-valid.json +104 -104
- package/exemplos/sistemas-interativos/advanced/temporal-evidence-valid.json +27 -27
- package/exemplos/sistemas-interativos/advanced/temporal-valid.json +118 -118
- package/exemplos/sistemas-interativos/experience-ir-valid.json +459 -459
- package/exemplos/sistemas-interativos/game-2d.json +83 -83
- package/exemplos/sistemas-interativos/game-3d-human.json +81 -81
- package/exemplos/sistemas-interativos/game-pixel-16-bit.json +97 -97
- package/exemplos/sistemas-interativos/game-pixel-8-bit.json +94 -94
- package/exemplos/sistemas-interativos/game-xr-human.json +80 -80
- package/exemplos/sistemas-interativos/hybrid-2-5d.json +108 -108
- package/exemplos/sistemas-interativos/protocol-mutating-rollback-valid.json +75 -75
- package/exemplos/sistemas-interativos/protocol-read-only-valid.json +58 -58
- package/exemplos/sistemas-interativos/simulation-2d-controlled.json +97 -97
- package/exemplos/sistemas-interativos/simulation-3d-calibrated-autonomous.json +141 -141
- package/exemplos/sistemas-interativos/simulation-headless-autonomous-batch.json +112 -112
- package/exemplos/sistemas-interativos/simulation-pixel-16-bit.json +103 -103
- package/exemplos/sistemas-interativos/simulation-text-controlled.json +95 -95
- package/exemplos/testes_embutidos.sema +1 -1
- package/exemplos/tratamento_erro.sema +1 -1
- package/exemplos/upload_arquivo.sema +1 -1
- package/exemplos/webhook.sema +1 -1
- package/node_modules/@sema/gerador-cpp/dist/index.js +176 -176
- package/node_modules/@sema/gerador-cpp/package.json +1 -1
- package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
- package/node_modules/@sema/gerador-css/dist/index.part02.js +460 -460
- package/node_modules/@sema/gerador-dotnet/dist/index.js +169 -169
- package/node_modules/@sema/gerador-dotnet/package.json +1 -1
- package/node_modules/@sema/gerador-html/dist/index.js +17 -17
- package/node_modules/@sema/gerador-lua/dist/index.js +51 -51
- package/node_modules/@sema/gerador-php/dist/index.js +113 -113
- package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
- package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
- package/package.json +3 -3
package/dist/drift.part13.js
CHANGED
|
@@ -1,26 +1,256 @@
|
|
|
1
|
-
// SEMA-GOVERNED: sema.
|
|
2
|
-
// Descricao:
|
|
3
|
-
import
|
|
4
|
-
import
|
|
1
|
+
// SEMA-GOVERNED: sema.produto.governanca_ia.drift
|
|
2
|
+
// Descricao: planeja antes de catalogar e indexa unidades incrementais com uma unica leitura fisica por arquivo.
|
|
3
|
+
import pacoteCli from "../package.json" with { type: "json" };
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { performance } from "node:perf_hooks";
|
|
6
|
+
import ts from "typescript";
|
|
7
|
+
import { resolverDiretoriosIgnoradosAtivos } from "./drift.part01.js";
|
|
8
|
+
import { EXTENSOES_ARQUIVOS_RASTREAVEIS_DRIFT, indexarArquivosRastreaveis } from "./drift.part04.js";
|
|
5
9
|
import { indexarTypeScript } from "./drift.part06.js";
|
|
6
|
-
import { indexarCpp, indexarDart, indexarDotnet, indexarGo, indexarJava, indexarLua, indexarPersistenciaDeclarativa, indexarPhp, indexarPython, indexarRust } from "./drift.part07.js";
|
|
10
|
+
import { indexarCpp, indexarDart, indexarDotnet, indexarGo, indexarJava, indexarLua, indexarPersistenciaDeclarativa, indexarPhp, indexarPython, indexarRust, } from "./drift.part07.js";
|
|
7
11
|
import { indexarPersistenciaDetalhada } from "./drift.part08.js";
|
|
8
12
|
import { construirMapaRecursos } from "./drift.part10.js";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
13
|
+
import { emitirDiagnosticosArquivosOrcamento, workspaceExigeCabecalhoCodigoGovernado, } from "./driftOrcamento.js";
|
|
14
|
+
import { criarCatalogoPersistenteDrift } from "./driftCatalogoPersistente.js";
|
|
15
|
+
import { CacheIncrementalDrift, FILE_INDEX_SCHEMA, } from "./driftCacheIncremental.js";
|
|
16
|
+
import { expandirDependenciasPlanoDrift, extrairReferenciasLocaisDrift, mapearDependenciasCatalogadasDrift, planejarEscopoDrift, } from "./driftEscopo.js";
|
|
17
|
+
const EXTENSOES_ANALISE_DRIFT = new Set([
|
|
18
|
+
".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
|
|
19
|
+
".py", ".dart", ".lua", ".cs", ".java", ".go", ".rs", ".php",
|
|
20
|
+
".cpp", ".cc", ".cxx", ".hpp", ".h",
|
|
21
|
+
".sql", ".psql", ".ddl", ".prisma",
|
|
22
|
+
]);
|
|
23
|
+
const EXTENSOES_TYPESCRIPT_DRIFT = new Set([
|
|
24
|
+
".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
|
|
25
|
+
]);
|
|
26
|
+
const EXTENSOES_DEPENDENCIA_TYPESCRIPT_DRIFT = new Set([
|
|
27
|
+
...EXTENSOES_TYPESCRIPT_DRIFT,
|
|
28
|
+
".html", ".htm", ".css",
|
|
29
|
+
]);
|
|
30
|
+
function chaveCaminho(caminho) {
|
|
31
|
+
const absoluto = path.normalize(path.resolve(caminho));
|
|
32
|
+
return process.platform === "win32" ? absoluto.toLowerCase() : absoluto;
|
|
33
|
+
}
|
|
34
|
+
function chaveRelativa(caminho) {
|
|
35
|
+
const normalizado = caminho.replace(/\\/g, "/");
|
|
36
|
+
return process.platform === "win32" ? normalizado.toLowerCase() : normalizado;
|
|
37
|
+
}
|
|
38
|
+
function paraJsonCache(valor) {
|
|
39
|
+
return JSON.parse(JSON.stringify(valor));
|
|
40
|
+
}
|
|
41
|
+
function registroObjeto(valor) {
|
|
42
|
+
return typeof valor === "object" && valor !== null && !Array.isArray(valor);
|
|
43
|
+
}
|
|
44
|
+
function textoNaoVazio(valor) {
|
|
45
|
+
return typeof valor === "string" && valor.length > 0;
|
|
46
|
+
}
|
|
47
|
+
function pertenceAoConjunto(valor, conjunto) {
|
|
48
|
+
return typeof valor === "string" && conjunto.has(valor);
|
|
49
|
+
}
|
|
50
|
+
function inteiroNaoNegativo(valor) {
|
|
51
|
+
return typeof valor === "number" && Number.isSafeInteger(valor) && valor >= 0;
|
|
52
|
+
}
|
|
53
|
+
const ORIGENS_SIMBOLO_DRIFT = new Set([
|
|
54
|
+
"ts", "js", "py", "dart", "lua", "cs", "java", "go", "rust", "cpp", "php", "sql",
|
|
55
|
+
]);
|
|
56
|
+
const ORIGENS_ROTA_DRIFT = new Set([
|
|
57
|
+
"nestjs", "fastapi", "flask", "nextjs", "nextjs-consumer", "react-vite-consumer",
|
|
58
|
+
"angular-consumer", "flutter-consumer", "firebase", "dotnet", "java", "go", "rust", "php",
|
|
59
|
+
]);
|
|
60
|
+
const ORIGENS_RECURSO_DRIFT = new Set([
|
|
61
|
+
"firebase", "postgres", "mysql", "sqlite", "mongodb", "redis", "arquivo",
|
|
62
|
+
]);
|
|
63
|
+
const TIPOS_RECURSO_DRIFT = new Set([
|
|
64
|
+
"colecao", "arquivo_local", "table", "view", "query", "transaction", "index", "constraint",
|
|
65
|
+
"relationship", "collection", "document", "keyspace", "stream", "lock", "retention", "replication",
|
|
66
|
+
]);
|
|
67
|
+
const CATEGORIAS_PERSISTENCIA_DRIFT = new Set([
|
|
68
|
+
"relacional", "documental", "chave_valor", "local_arquivo", "desconhecida",
|
|
69
|
+
]);
|
|
70
|
+
const TIPOS_DIAGNOSTICO_ORCAMENTO = new Set([
|
|
71
|
+
"contrato_monolitico", "codigo_monolitico", "codigo_governado_sem_cabecalho",
|
|
72
|
+
]);
|
|
73
|
+
function simboloResolvidoValido(valor) {
|
|
74
|
+
return registroObjeto(valor)
|
|
75
|
+
&& pertenceAoConjunto(valor.origem, ORIGENS_SIMBOLO_DRIFT)
|
|
76
|
+
&& textoNaoVazio(valor.caminho)
|
|
77
|
+
&& textoNaoVazio(valor.arquivo)
|
|
78
|
+
&& textoNaoVazio(valor.simbolo);
|
|
79
|
+
}
|
|
80
|
+
function rotaResolvidaValida(valor) {
|
|
81
|
+
return registroObjeto(valor)
|
|
82
|
+
&& pertenceAoConjunto(valor.origem, ORIGENS_ROTA_DRIFT)
|
|
83
|
+
&& textoNaoVazio(valor.metodo)
|
|
84
|
+
&& textoNaoVazio(valor.caminho)
|
|
85
|
+
&& textoNaoVazio(valor.arquivo)
|
|
86
|
+
&& textoNaoVazio(valor.simbolo);
|
|
87
|
+
}
|
|
88
|
+
function recursoResolvidoValido(valor) {
|
|
89
|
+
return registroObjeto(valor)
|
|
90
|
+
&& pertenceAoConjunto(valor.origem, ORIGENS_RECURSO_DRIFT)
|
|
91
|
+
&& textoNaoVazio(valor.nome)
|
|
92
|
+
&& textoNaoVazio(valor.arquivo)
|
|
93
|
+
&& (valor.simbolo === undefined || textoNaoVazio(valor.simbolo))
|
|
94
|
+
&& pertenceAoConjunto(valor.tipo, TIPOS_RECURSO_DRIFT);
|
|
95
|
+
}
|
|
96
|
+
function consumerSurfaceValida(valor) {
|
|
97
|
+
return registroObjeto(valor)
|
|
98
|
+
&& textoNaoVazio(valor.rota)
|
|
99
|
+
&& textoNaoVazio(valor.arquivo)
|
|
100
|
+
&& textoNaoVazio(valor.tipoArquivo);
|
|
101
|
+
}
|
|
102
|
+
function colunaPersistenciaValida(valor) {
|
|
103
|
+
return registroObjeto(valor)
|
|
104
|
+
&& pertenceAoConjunto(valor.origem, ORIGENS_RECURSO_DRIFT)
|
|
105
|
+
&& pertenceAoConjunto(valor.categoriaPersistencia, CATEGORIAS_PERSISTENCIA_DRIFT)
|
|
106
|
+
&& textoNaoVazio(valor.recurso)
|
|
107
|
+
&& textoNaoVazio(valor.coluna)
|
|
108
|
+
&& textoNaoVazio(valor.arquivo);
|
|
109
|
+
}
|
|
110
|
+
function repositorioPersistenciaValido(valor) {
|
|
111
|
+
return registroObjeto(valor)
|
|
112
|
+
&& pertenceAoConjunto(valor.origem, ORIGENS_RECURSO_DRIFT)
|
|
113
|
+
&& pertenceAoConjunto(valor.categoriaPersistencia, CATEGORIAS_PERSISTENCIA_DRIFT)
|
|
114
|
+
&& textoNaoVazio(valor.recurso)
|
|
115
|
+
&& textoNaoVazio(valor.arquivo);
|
|
116
|
+
}
|
|
117
|
+
function diagnosticoOrcamentoValido(valor) {
|
|
118
|
+
return registroObjeto(valor)
|
|
119
|
+
&& pertenceAoConjunto(valor.tipo, TIPOS_DIAGNOSTICO_ORCAMENTO)
|
|
120
|
+
&& textoNaoVazio(valor.arquivo)
|
|
121
|
+
&& inteiroNaoNegativo(valor.linhas)
|
|
122
|
+
&& (valor.severidade === "aviso" || valor.severidade === "erro")
|
|
123
|
+
&& typeof valor.bloqueia === "boolean"
|
|
124
|
+
&& textoNaoVazio(valor.mensagem)
|
|
125
|
+
&& inteiroNaoNegativo(valor.limite_aviso_linhas)
|
|
126
|
+
&& inteiroNaoNegativo(valor.limite_bloqueio_linhas);
|
|
127
|
+
}
|
|
128
|
+
function listaValida(valor, validar) {
|
|
129
|
+
return Array.isArray(valor) && valor.every(validar);
|
|
130
|
+
}
|
|
131
|
+
function indiceLinguagemValido(valor) {
|
|
132
|
+
return registroObjeto(valor)
|
|
133
|
+
&& listaValida(valor.simbolos, simboloResolvidoValido)
|
|
134
|
+
&& listaValida(valor.rotas, rotaResolvidaValida)
|
|
135
|
+
&& listaValida(valor.recursos, recursoResolvidoValido)
|
|
136
|
+
&& Array.isArray(valor.consumerSurfaces)
|
|
137
|
+
&& valor.consumerSurfaces.every(consumerSurfaceValida);
|
|
138
|
+
}
|
|
139
|
+
function validarIndicesSerializaveis(valor) {
|
|
140
|
+
if (!registroObjeto(valor) || !registroObjeto(valor.detalhesPersistencia)) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
const detalhes = valor.detalhesPersistencia;
|
|
144
|
+
return listaValida(detalhes.colunas, colunaPersistenciaValida)
|
|
145
|
+
&& listaValida(detalhes.repositorios, repositorioPersistenciaValido)
|
|
146
|
+
&& Array.isArray(valor.arquivosOrcamentoAvaliados)
|
|
147
|
+
&& valor.arquivosOrcamentoAvaliados.every(textoNaoVazio)
|
|
148
|
+
&& listaValida(valor.diagnosticosOrcamento, diagnosticoOrcamentoValido)
|
|
149
|
+
&& indiceLinguagemValido(valor.indexDart)
|
|
150
|
+
&& indiceLinguagemValido(valor.indexTs)
|
|
151
|
+
&& listaValida(valor.todasRotasIndexadas, rotaResolvidaValida)
|
|
152
|
+
&& Array.isArray(valor.todosArquivosConhecidos)
|
|
153
|
+
&& valor.todosArquivosConhecidos.every(textoNaoVazio)
|
|
154
|
+
&& listaValida(valor.todosRecursos, recursoResolvidoValido)
|
|
155
|
+
&& listaValida(valor.todosSimbolos, simboloResolvidoValido);
|
|
156
|
+
}
|
|
157
|
+
function indicesPermanecemNoCatalogo(valor, catalogo) {
|
|
158
|
+
const registros = [
|
|
159
|
+
...valor.detalhesPersistencia.colunas,
|
|
160
|
+
...valor.detalhesPersistencia.repositorios,
|
|
161
|
+
...valor.indexDart.simbolos,
|
|
162
|
+
...valor.indexDart.rotas,
|
|
163
|
+
...valor.indexDart.recursos,
|
|
164
|
+
...valor.indexDart.consumerSurfaces,
|
|
165
|
+
...valor.indexTs.simbolos,
|
|
166
|
+
...valor.indexTs.rotas,
|
|
167
|
+
...valor.indexTs.recursos,
|
|
168
|
+
...valor.indexTs.consumerSurfaces,
|
|
169
|
+
...valor.todasRotasIndexadas,
|
|
170
|
+
...valor.todosRecursos,
|
|
171
|
+
...valor.todosSimbolos,
|
|
172
|
+
];
|
|
173
|
+
return registros.every((item) => catalogo.contem(item.arquivo))
|
|
174
|
+
&& valor.todosArquivosConhecidos.every((arquivo) => catalogo.contem(arquivo))
|
|
175
|
+
&& valor.arquivosOrcamentoAvaliados.every((arquivo) => catalogo.contem(path.resolve(catalogo.baseDiretorio, arquivo)))
|
|
176
|
+
&& valor.diagnosticosOrcamento.every((item) => catalogo.contem(path.resolve(catalogo.baseDiretorio, item.arquivo)));
|
|
177
|
+
}
|
|
178
|
+
function reconstruirIndices(serializaveis, planoEscopo, cache, catalogo, leitorArquivosPlanejados) {
|
|
179
|
+
const mapaImpl = new Map(serializaveis.todosSimbolos
|
|
180
|
+
.filter((item) => item.origem !== "sql")
|
|
181
|
+
.map((item) => [item.caminho, item]));
|
|
182
|
+
return {
|
|
183
|
+
...serializaveis,
|
|
184
|
+
mapaImpl,
|
|
185
|
+
mapaRecursos: construirMapaRecursos(serializaveis.todosRecursos),
|
|
186
|
+
planoEscopo,
|
|
187
|
+
cache,
|
|
188
|
+
catalogo,
|
|
189
|
+
leitorArquivosPlanejados,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function indicesVazios() {
|
|
193
|
+
return {
|
|
194
|
+
arquivosOrcamentoAvaliados: [],
|
|
195
|
+
detalhesPersistencia: { colunas: [], repositorios: [] },
|
|
196
|
+
diagnosticosOrcamento: [],
|
|
197
|
+
indexDart: { simbolos: [], rotas: [], recursos: [], consumerSurfaces: [] },
|
|
198
|
+
indexTs: { simbolos: [], rotas: [], recursos: [], consumerSurfaces: [] },
|
|
199
|
+
todasRotasIndexadas: [],
|
|
200
|
+
todosArquivosConhecidos: [],
|
|
201
|
+
todosRecursos: [],
|
|
202
|
+
todosSimbolos: [],
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
function deduplicar(itens, chave) {
|
|
206
|
+
return [...new Map(itens.map((item) => [chave(item), item])).values()];
|
|
207
|
+
}
|
|
208
|
+
function filtrarAoCatalogo(itens, catalogo) {
|
|
209
|
+
return itens.filter((item) => catalogo.contem(item.arquivo));
|
|
210
|
+
}
|
|
211
|
+
function sanitizarIndices(indices, catalogo) {
|
|
212
|
+
const diagnosticosOrcamento = indices.diagnosticosOrcamento.filter((item) => catalogo.contem(path.resolve(catalogo.baseDiretorio, item.arquivo)));
|
|
213
|
+
return {
|
|
214
|
+
arquivosOrcamentoAvaliados: indices.arquivosOrcamentoAvaliados.filter((arquivo) => catalogo.contem(path.resolve(catalogo.baseDiretorio, arquivo))),
|
|
215
|
+
detalhesPersistencia: {
|
|
216
|
+
colunas: filtrarAoCatalogo(indices.detalhesPersistencia.colunas, catalogo),
|
|
217
|
+
repositorios: filtrarAoCatalogo(indices.detalhesPersistencia.repositorios, catalogo),
|
|
218
|
+
},
|
|
219
|
+
diagnosticosOrcamento,
|
|
220
|
+
indexDart: {
|
|
221
|
+
simbolos: filtrarAoCatalogo(indices.indexDart.simbolos, catalogo),
|
|
222
|
+
rotas: filtrarAoCatalogo(indices.indexDart.rotas, catalogo),
|
|
223
|
+
recursos: filtrarAoCatalogo(indices.indexDart.recursos, catalogo),
|
|
224
|
+
consumerSurfaces: filtrarAoCatalogo(indices.indexDart.consumerSurfaces, catalogo),
|
|
225
|
+
},
|
|
226
|
+
indexTs: {
|
|
227
|
+
simbolos: filtrarAoCatalogo(indices.indexTs.simbolos, catalogo),
|
|
228
|
+
rotas: filtrarAoCatalogo(indices.indexTs.rotas, catalogo),
|
|
229
|
+
recursos: filtrarAoCatalogo(indices.indexTs.recursos, catalogo),
|
|
230
|
+
consumerSurfaces: filtrarAoCatalogo(indices.indexTs.consumerSurfaces, catalogo),
|
|
231
|
+
},
|
|
232
|
+
todasRotasIndexadas: filtrarAoCatalogo(indices.todasRotasIndexadas, catalogo),
|
|
233
|
+
todosArquivosConhecidos: indices.todosArquivosConhecidos.filter((arquivo) => catalogo.contem(arquivo)),
|
|
234
|
+
todosRecursos: filtrarAoCatalogo(indices.todosRecursos, catalogo),
|
|
235
|
+
todosSimbolos: filtrarAoCatalogo(indices.todosSimbolos, catalogo),
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
async function calcularIndices(diretorios, catalogo, exigirCabecalhoCodigoGovernado) {
|
|
239
|
+
const [indexTs, indexPy, indexDart, indexDotnet, indexJava, indexGo, indexRust, indexLua, indexPhp, indexPersistencia, detalhesPersistencia, indexCpp, arquivosRastreaveis,] = await Promise.all([
|
|
240
|
+
indexarTypeScript(diretorios, catalogo),
|
|
241
|
+
indexarPython(diretorios, catalogo),
|
|
242
|
+
indexarDart(diretorios, catalogo),
|
|
243
|
+
indexarDotnet(diretorios, catalogo),
|
|
244
|
+
indexarJava(diretorios, catalogo),
|
|
245
|
+
indexarGo(diretorios, catalogo),
|
|
246
|
+
indexarRust(diretorios, catalogo),
|
|
247
|
+
indexarLua(diretorios, catalogo),
|
|
248
|
+
indexarPhp(diretorios, catalogo),
|
|
249
|
+
indexarPersistenciaDeclarativa(diretorios, catalogo),
|
|
250
|
+
indexarPersistenciaDetalhada(diretorios, catalogo),
|
|
251
|
+
indexarCpp(diretorios, catalogo),
|
|
252
|
+
indexarArquivosRastreaveis(diretorios, catalogo),
|
|
253
|
+
]);
|
|
24
254
|
const todosSimbolos = [
|
|
25
255
|
...indexTs.simbolos,
|
|
26
256
|
...indexPy.simbolos,
|
|
@@ -34,18 +264,6 @@ export async function prepararIndicesDrift(contexto, configuracaoEscopo) {
|
|
|
34
264
|
...indexPhp.simbolos,
|
|
35
265
|
...indexPersistencia.simbolos,
|
|
36
266
|
];
|
|
37
|
-
const mapaImpl = new Map([
|
|
38
|
-
...indexTs.simbolos.map((item) => [item.caminho, item]),
|
|
39
|
-
...indexPy.simbolos.map((item) => [item.caminho, item]),
|
|
40
|
-
...indexDart.simbolos.map((item) => [item.caminho, item]),
|
|
41
|
-
...indexDotnet.simbolos.map((item) => [item.caminho, item]),
|
|
42
|
-
...indexJava.simbolos.map((item) => [item.caminho, item]),
|
|
43
|
-
...indexGo.simbolos.map((item) => [item.caminho, item]),
|
|
44
|
-
...indexRust.simbolos.map((item) => [item.caminho, item]),
|
|
45
|
-
...indexLua.simbolos.map((item) => [item.caminho, item]),
|
|
46
|
-
...indexCpp.simbolos.map((item) => [item.caminho, item]),
|
|
47
|
-
...indexPhp.simbolos.map((item) => [item.caminho, item]),
|
|
48
|
-
]);
|
|
49
267
|
const todosRecursos = [
|
|
50
268
|
...indexTs.recursos,
|
|
51
269
|
...indexPy.recursos,
|
|
@@ -59,7 +277,6 @@ export async function prepararIndicesDrift(contexto, configuracaoEscopo) {
|
|
|
59
277
|
...indexPhp.recursos,
|
|
60
278
|
...indexPersistencia.recursos,
|
|
61
279
|
];
|
|
62
|
-
const mapaRecursos = construirMapaRecursos(todosRecursos);
|
|
63
280
|
const todasRotasIndexadas = [
|
|
64
281
|
...indexTs.rotas,
|
|
65
282
|
...indexPy.rotas,
|
|
@@ -76,16 +293,423 @@ export async function prepararIndicesDrift(contexto, configuracaoEscopo) {
|
|
|
76
293
|
...todasRotasIndexadas.map((item) => item.arquivo),
|
|
77
294
|
...todosRecursos.map((item) => item.arquivo),
|
|
78
295
|
])].sort((a, b) => a.localeCompare(b, "pt-BR"));
|
|
79
|
-
|
|
296
|
+
const diagnosticosOrcamento = await emitirDiagnosticosArquivosOrcamento({
|
|
297
|
+
arquivos: catalogo.arquivosCatalogados(),
|
|
298
|
+
baseProjeto: catalogo.baseDiretorio,
|
|
299
|
+
exigirCabecalhoCodigoGovernado,
|
|
300
|
+
leitorArquivos: catalogo,
|
|
301
|
+
});
|
|
302
|
+
return sanitizarIndices(paraJsonCache({
|
|
303
|
+
arquivosOrcamentoAvaliados: catalogo.arquivosCatalogados()
|
|
304
|
+
.map((arquivo) => pathRelativo(catalogo.baseDiretorio, arquivo)),
|
|
80
305
|
detalhesPersistencia,
|
|
306
|
+
diagnosticosOrcamento,
|
|
81
307
|
indexDart,
|
|
82
308
|
indexTs,
|
|
83
|
-
mapaImpl,
|
|
84
|
-
mapaRecursos,
|
|
85
309
|
todasRotasIndexadas,
|
|
86
310
|
todosArquivosConhecidos,
|
|
87
311
|
todosRecursos,
|
|
88
312
|
todosSimbolos,
|
|
313
|
+
}), catalogo);
|
|
314
|
+
}
|
|
315
|
+
function mesclarIndices(resumos, todosArquivosCatalogados) {
|
|
316
|
+
const simbolos = deduplicar(resumos.flatMap((item) => item.todosSimbolos), (item) => item.caminho);
|
|
317
|
+
const rotas = deduplicar(resumos.flatMap((item) => item.todasRotasIndexadas), (item) => `${item.origem}:${item.metodo}:${item.caminho}:${item.arquivo}:${item.simbolo}`);
|
|
318
|
+
const recursos = deduplicar(resumos.flatMap((item) => item.todosRecursos), (item) => `${item.origem}:${item.tipo}:${item.nome}:${item.arquivo}:${item.simbolo ?? ""}`);
|
|
319
|
+
const simbolosTs = deduplicar(resumos.flatMap((item) => item.indexTs.simbolos), (item) => item.caminho);
|
|
320
|
+
const rotasTs = deduplicar(resumos.flatMap((item) => item.indexTs.rotas), (item) => `${item.origem}:${item.metodo}:${item.caminho}:${item.arquivo}:${item.simbolo}`);
|
|
321
|
+
const recursosTs = deduplicar(resumos.flatMap((item) => item.indexTs.recursos), (item) => `${item.origem}:${item.tipo}:${item.nome}:${item.arquivo}:${item.simbolo ?? ""}`);
|
|
322
|
+
const surfacesTs = deduplicar(resumos.flatMap((item) => item.indexTs.consumerSurfaces), (item) => `${item.rota}:${item.arquivo}:${item.tipoArquivo}`);
|
|
323
|
+
const simbolosDart = deduplicar(resumos.flatMap((item) => item.indexDart.simbolos), (item) => item.caminho);
|
|
324
|
+
const rotasDart = deduplicar(resumos.flatMap((item) => item.indexDart.rotas), (item) => `${item.origem}:${item.metodo}:${item.caminho}:${item.arquivo}:${item.simbolo}`);
|
|
325
|
+
const recursosDart = deduplicar(resumos.flatMap((item) => item.indexDart.recursos), (item) => `${item.origem}:${item.tipo}:${item.nome}:${item.arquivo}:${item.simbolo ?? ""}`);
|
|
326
|
+
const surfacesDart = deduplicar(resumos.flatMap((item) => item.indexDart.consumerSurfaces), (item) => `${item.rota}:${item.arquivo}:${item.tipoArquivo}`);
|
|
327
|
+
const colunas = deduplicar(resumos.flatMap((item) => item.detalhesPersistencia.colunas), (item) => `${item.origem}:${item.recurso}:${item.coluna}:${item.arquivo}`);
|
|
328
|
+
const repositorios = deduplicar(resumos.flatMap((item) => item.detalhesPersistencia.repositorios), (item) => `${item.origem}:${item.recurso}:${item.arquivo}`);
|
|
329
|
+
const diagnosticosOrcamento = deduplicar(resumos.flatMap((item) => item.diagnosticosOrcamento), (item) => `${item.tipo}:${item.arquivo}:${item.severidade}:${item.mensagem}`);
|
|
330
|
+
return paraJsonCache({
|
|
331
|
+
arquivosOrcamentoAvaliados: [...new Set(resumos.flatMap((item) => item.arquivosOrcamentoAvaliados))].sort((a, b) => a.localeCompare(b, "pt-BR")),
|
|
332
|
+
detalhesPersistencia: { colunas, repositorios },
|
|
333
|
+
diagnosticosOrcamento,
|
|
334
|
+
indexDart: {
|
|
335
|
+
simbolos: simbolosDart,
|
|
336
|
+
rotas: rotasDart,
|
|
337
|
+
recursos: recursosDart,
|
|
338
|
+
consumerSurfaces: surfacesDart,
|
|
339
|
+
},
|
|
340
|
+
indexTs: {
|
|
341
|
+
simbolos: simbolosTs,
|
|
342
|
+
rotas: rotasTs,
|
|
343
|
+
recursos: recursosTs,
|
|
344
|
+
consumerSurfaces: surfacesTs,
|
|
345
|
+
},
|
|
346
|
+
todasRotasIndexadas: rotas,
|
|
347
|
+
todosArquivosConhecidos: [...new Set(todosArquivosCatalogados)].sort((a, b) => a.localeCompare(b, "pt-BR")),
|
|
348
|
+
todosRecursos: recursos,
|
|
349
|
+
todosSimbolos: simbolos,
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
class CatalogoFiltradoDrift {
|
|
353
|
+
origem;
|
|
354
|
+
baseDiretorio;
|
|
355
|
+
raizes;
|
|
356
|
+
permitidos;
|
|
357
|
+
constructor(origem, arquivos) {
|
|
358
|
+
this.origem = origem;
|
|
359
|
+
this.baseDiretorio = origem.baseDiretorio;
|
|
360
|
+
this.raizes = origem.raizes;
|
|
361
|
+
this.permitidos = new Set(arquivos.map(chaveCaminho));
|
|
362
|
+
}
|
|
363
|
+
listar(extensoesOuFiltro = [], raizes) {
|
|
364
|
+
const arquivos = Array.isArray(extensoesOuFiltro)
|
|
365
|
+
? this.origem.listar(extensoesOuFiltro, raizes)
|
|
366
|
+
: this.origem.listar(extensoesOuFiltro);
|
|
367
|
+
return arquivos.filter((arquivo) => this.permitidos.has(chaveCaminho(arquivo)));
|
|
368
|
+
}
|
|
369
|
+
listarEntradas(filtro = {}) {
|
|
370
|
+
return this.origem.listarEntradas(filtro)
|
|
371
|
+
.filter((arquivo) => this.permitidos.has(chaveCaminho(arquivo.caminho)));
|
|
372
|
+
}
|
|
373
|
+
listarPorExtensoes(extensoes, raiz) {
|
|
374
|
+
return this.listarEntradas({ extensoes, raiz }).map((arquivo) => arquivo.caminho);
|
|
375
|
+
}
|
|
376
|
+
listarPorRaiz(raiz, extensoes) {
|
|
377
|
+
return this.listarEntradas({ raiz, extensoes }).map((arquivo) => arquivo.caminho);
|
|
378
|
+
}
|
|
379
|
+
arquivosCatalogados() {
|
|
380
|
+
return this.listar();
|
|
381
|
+
}
|
|
382
|
+
async incluir(arquivos) {
|
|
383
|
+
const fora = arquivos.find((arquivo) => !this.permitidos.has(chaveCaminho(arquivo)));
|
|
384
|
+
if (fora) {
|
|
385
|
+
throw new Error(`Arquivo fora da unidade incremental do drift: ${fora}`);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
contem(caminho) {
|
|
389
|
+
return this.permitidos.has(chaveCaminho(caminho)) && this.origem.contem(caminho);
|
|
390
|
+
}
|
|
391
|
+
ler(caminho) {
|
|
392
|
+
return this.contem(caminho)
|
|
393
|
+
? this.origem.ler(caminho)
|
|
394
|
+
: Promise.reject(new Error(`Arquivo fora da unidade incremental do drift: ${caminho}`));
|
|
395
|
+
}
|
|
396
|
+
async lerTexto(caminho) {
|
|
397
|
+
return (await this.ler(caminho)).texto;
|
|
398
|
+
}
|
|
399
|
+
async digest(caminho) {
|
|
400
|
+
return (await this.ler(caminho)).digest;
|
|
401
|
+
}
|
|
402
|
+
fingerprint(caminhos) {
|
|
403
|
+
const selecionados = (caminhos ?? this.arquivosCatalogados())
|
|
404
|
+
.filter((arquivo) => this.contem(arquivo));
|
|
405
|
+
return this.origem.fingerprint(selecionados);
|
|
406
|
+
}
|
|
407
|
+
obterFingerprint(caminhos) {
|
|
408
|
+
return this.fingerprint(caminhos);
|
|
409
|
+
}
|
|
410
|
+
emitir(tipo, arquivo) {
|
|
411
|
+
if (tipo === "ast.create") {
|
|
412
|
+
this.origem.emitir(tipo, arquivo);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
metricas() {
|
|
416
|
+
return this.origem.metricas();
|
|
417
|
+
}
|
|
418
|
+
snapshot() {
|
|
419
|
+
const snapshot = this.origem.snapshot();
|
|
420
|
+
return {
|
|
421
|
+
...snapshot,
|
|
422
|
+
arquivos: snapshot.arquivos.filter((arquivo) => this.permitidos.has(chaveCaminho(path.resolve(this.baseDiretorio, arquivo.caminho)))),
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
function extrairPerfilAgrupamentoTypeScript(arquivo, codigo) {
|
|
427
|
+
const relacao = arquivo.replace(/\\/g, "/");
|
|
428
|
+
const motivos = new Set();
|
|
429
|
+
if (/(?:^|\n)\s*export\s+(?:type\s+)?(?:\*|\{[\s\S]{0,4000}?\})\s+from\s*["'`][^"'`]+["'`]/mu.test(codigo)) {
|
|
430
|
+
motivos.add("reexportacao");
|
|
431
|
+
}
|
|
432
|
+
if (/(?:^|\/)(?:app\.)?(?:routes?|router|routing)(?:\.[^/]*)?\.(?:ts|tsx|js|jsx|mjs|cjs)$/iu.test(relacao)
|
|
433
|
+
|| /\b(?:createBrowserRouter|useRoutes|loadChildren|loadComponent)\s*[:(]/u.test(codigo)
|
|
434
|
+
|| /\bRouterModule\.(?:forRoot|forChild)\s*\(/u.test(codigo)
|
|
435
|
+
|| /<Routes?\b/u.test(codigo)) {
|
|
436
|
+
motivos.add("roteamento_consumer");
|
|
437
|
+
}
|
|
438
|
+
if (/(?:^|\/)(?:src\/)?(?:app\/)?app\.component\.(?:ts|js)$/iu.test(relacao)) {
|
|
439
|
+
motivos.add("angular_standalone_raiz");
|
|
440
|
+
}
|
|
441
|
+
return {
|
|
442
|
+
acoplarDependencias: motivos.size > 0,
|
|
443
|
+
motivos: [...motivos].sort((a, b) => a.localeCompare(b, "pt-BR")),
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
function perfilAgrupamentoTypeScriptValido(valor) {
|
|
447
|
+
return registroObjeto(valor)
|
|
448
|
+
&& typeof valor.acoplarDependencias === "boolean"
|
|
449
|
+
&& Array.isArray(valor.motivos)
|
|
450
|
+
&& valor.motivos.every(textoNaoVazio);
|
|
451
|
+
}
|
|
452
|
+
function construirGruposIncrementais(arquivos, dependencias, perfisTypeScript) {
|
|
453
|
+
const porChave = new Map(arquivos.map((arquivo) => [chaveCaminho(arquivo), arquivo]));
|
|
454
|
+
const analisaveis = arquivos.filter((arquivo) => EXTENSOES_ANALISE_DRIFT.has(path.extname(arquivo).toLowerCase()));
|
|
455
|
+
const typescript = analisaveis.filter((arquivo) => EXTENSOES_TYPESCRIPT_DRIFT.has(path.extname(arquivo).toLowerCase()));
|
|
456
|
+
const dependenciasPorChave = new Map();
|
|
457
|
+
for (const arquivo of typescript) {
|
|
458
|
+
const destinos = (dependencias[arquivo] ?? [])
|
|
459
|
+
.map((dependencia) => porChave.get(chaveCaminho(dependencia)))
|
|
460
|
+
.filter((dependencia) => Boolean(dependencia))
|
|
461
|
+
.filter((dependencia) => EXTENSOES_DEPENDENCIA_TYPESCRIPT_DRIFT.has(path.extname(dependencia).toLowerCase()));
|
|
462
|
+
dependenciasPorChave.set(chaveCaminho(arquivo), destinos);
|
|
463
|
+
}
|
|
464
|
+
const pai = new Map();
|
|
465
|
+
const encontrar = (chave) => {
|
|
466
|
+
const atual = pai.get(chave) ?? chave;
|
|
467
|
+
if (atual === chave) {
|
|
468
|
+
pai.set(chave, chave);
|
|
469
|
+
return chave;
|
|
470
|
+
}
|
|
471
|
+
const raiz = encontrar(atual);
|
|
472
|
+
pai.set(chave, raiz);
|
|
473
|
+
return raiz;
|
|
474
|
+
};
|
|
475
|
+
const unir = (a, b) => {
|
|
476
|
+
const raizA = encontrar(a);
|
|
477
|
+
const raizB = encontrar(b);
|
|
478
|
+
if (raizA !== raizB) {
|
|
479
|
+
pai.set(raizB, raizA.localeCompare(raizB, "en") <= 0 ? raizA : raizB);
|
|
480
|
+
pai.set(raizA, raizA.localeCompare(raizB, "en") <= 0 ? raizA : raizB);
|
|
481
|
+
}
|
|
89
482
|
};
|
|
483
|
+
for (const semente of typescript) {
|
|
484
|
+
if (!perfisTypeScript.get(chaveCaminho(semente))?.acoplarDependencias) {
|
|
485
|
+
continue;
|
|
486
|
+
}
|
|
487
|
+
const chaveSemente = chaveCaminho(semente);
|
|
488
|
+
const fila = [chaveSemente];
|
|
489
|
+
const fechamento = new Set();
|
|
490
|
+
while (fila.length > 0) {
|
|
491
|
+
const atual = fila.shift();
|
|
492
|
+
if (fechamento.has(atual)) {
|
|
493
|
+
continue;
|
|
494
|
+
}
|
|
495
|
+
fechamento.add(atual);
|
|
496
|
+
for (const dependencia of dependenciasPorChave.get(atual) ?? []) {
|
|
497
|
+
const chaveDependencia = chaveCaminho(dependencia);
|
|
498
|
+
if (!fechamento.has(chaveDependencia)) {
|
|
499
|
+
fila.push(chaveDependencia);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
for (const membro of fechamento) {
|
|
504
|
+
unir(chaveSemente, membro);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
const gruposPorRaiz = new Map();
|
|
508
|
+
const usados = new Set();
|
|
509
|
+
for (const arquivo of arquivos) {
|
|
510
|
+
const chave = chaveCaminho(arquivo);
|
|
511
|
+
if (!pai.has(chave)) {
|
|
512
|
+
continue;
|
|
513
|
+
}
|
|
514
|
+
usados.add(chave);
|
|
515
|
+
const raiz = encontrar(chave);
|
|
516
|
+
const grupo = gruposPorRaiz.get(raiz) ?? [];
|
|
517
|
+
grupo.push(arquivo);
|
|
518
|
+
gruposPorRaiz.set(raiz, grupo);
|
|
519
|
+
}
|
|
520
|
+
const grupos = [...gruposPorRaiz.values()]
|
|
521
|
+
.map((grupo) => grupo.sort((a, b) => a.localeCompare(b, "pt-BR")));
|
|
522
|
+
for (const arquivo of analisaveis.sort((a, b) => a.localeCompare(b, "pt-BR"))) {
|
|
523
|
+
const chave = chaveCaminho(arquivo);
|
|
524
|
+
if (!usados.has(chave)) {
|
|
525
|
+
usados.add(chave);
|
|
526
|
+
grupos.push([arquivo]);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
return grupos
|
|
530
|
+
.filter((grupo) => grupo.length > 0)
|
|
531
|
+
.sort((a, b) => a[0].localeCompare(b[0], "pt-BR"));
|
|
532
|
+
}
|
|
533
|
+
async function mapearComLimite(itens, limite, executar) {
|
|
534
|
+
const resultados = new Array(itens.length);
|
|
535
|
+
let proximo = 0;
|
|
536
|
+
const trabalhador = async () => {
|
|
537
|
+
for (;;) {
|
|
538
|
+
const indice = proximo;
|
|
539
|
+
proximo += 1;
|
|
540
|
+
if (indice >= itens.length) {
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
resultados[indice] = await executar(itens[indice]);
|
|
544
|
+
}
|
|
545
|
+
};
|
|
546
|
+
await Promise.all(Array.from({ length: Math.min(limite, itens.length) }, trabalhador));
|
|
547
|
+
return resultados;
|
|
548
|
+
}
|
|
549
|
+
function pathRelativo(baseProjeto, alvo) {
|
|
550
|
+
const relativo = path.relative(baseProjeto, alvo).replace(/\\/g, "/");
|
|
551
|
+
return relativo || ".";
|
|
552
|
+
}
|
|
553
|
+
function criarIdentidadeCache(contexto, configuracaoEscopo, plano, exigirCabecalhoCodigoGovernado) {
|
|
554
|
+
const ordenarCaminhos = (caminhos) => [...new Set(caminhos.map((caminho) => path.normalize(path.resolve(caminho))))].sort((a, b) => a.localeCompare(b, "pt-BR"));
|
|
555
|
+
const representarDiretorios = (diretorios) => {
|
|
556
|
+
const fisicos = ordenarCaminhos(diretorios);
|
|
557
|
+
return {
|
|
558
|
+
fisicos,
|
|
559
|
+
semanticos: fisicos.map((diretorio) => pathRelativo(contexto.baseProjeto, diretorio)),
|
|
560
|
+
};
|
|
561
|
+
};
|
|
562
|
+
return paraJsonCache({
|
|
563
|
+
cliVersion: pacoteCli.version,
|
|
564
|
+
typescriptVersion: ts.version,
|
|
565
|
+
fileIndexSchema: FILE_INDEX_SCHEMA,
|
|
566
|
+
extractorBuild: "drift-file-index-v4-2026-07-21",
|
|
567
|
+
escopo: {
|
|
568
|
+
solicitado: configuracaoEscopo.escopo,
|
|
569
|
+
estrategia: plano.estrategia,
|
|
570
|
+
cobertura: plano.cobertura,
|
|
571
|
+
termos: [...configuracaoEscopo.termosEscopo].sort((a, b) => a.localeCompare(b, "pt-BR")),
|
|
572
|
+
modulos: [...plano.modulos].sort((a, b) => a.localeCompare(b, "pt-BR")),
|
|
573
|
+
arquivosFisicos: ordenarCaminhos(plano.arquivos),
|
|
574
|
+
arquivosSemanticos: plano.arquivos
|
|
575
|
+
.map((arquivo) => pathRelativo(contexto.baseProjeto, arquivo))
|
|
576
|
+
.sort((a, b) => a.localeCompare(b, "pt-BR")),
|
|
577
|
+
},
|
|
578
|
+
diretoriosPlano: representarDiretorios(plano.diretorios),
|
|
579
|
+
diretoriosContexto: representarDiretorios(contexto.diretoriosCodigo),
|
|
580
|
+
exigirCabecalhoCodigoGovernado,
|
|
581
|
+
ignorarWorktrees: configuracaoEscopo.ignorarWorktrees,
|
|
582
|
+
ignorarConsumidoresLaterais: configuracaoEscopo.ignorarConsumidoresLaterais,
|
|
583
|
+
fontesLegado: contexto.fontesLegado,
|
|
584
|
+
configuracao: contexto.configCarregada?.config ?? null,
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
export async function prepararIndicesDrift(contexto, configuracaoEscopo, opcoes = {}) {
|
|
588
|
+
const inicioTotal = performance.now();
|
|
589
|
+
let planoEscopo = await planejarEscopoDrift(contexto, configuracaoEscopo);
|
|
590
|
+
const fimPlanejamento = performance.now();
|
|
591
|
+
const politicaCache = opcoes.politicaCache ?? "auto";
|
|
592
|
+
if (planoEscopo.bloqueios.length > 0) {
|
|
593
|
+
return reconstruirIndices(indicesVazios(), planoEscopo, {
|
|
594
|
+
politica: politicaCache,
|
|
595
|
+
origem: "nao_aplicavel",
|
|
596
|
+
fasesMs: {
|
|
597
|
+
planejamento: Number((fimPlanejamento - inicioTotal).toFixed(3)),
|
|
598
|
+
catalogacao: 0,
|
|
599
|
+
dependencias: 0,
|
|
600
|
+
assinaturas: 0,
|
|
601
|
+
indexacao: 0,
|
|
602
|
+
total: Number((performance.now() - inicioTotal).toFixed(3)),
|
|
603
|
+
},
|
|
604
|
+
}, {
|
|
605
|
+
diretoriosVisitados: 0,
|
|
606
|
+
arquivosCatalogados: 0,
|
|
607
|
+
leiturasConteudo: 0,
|
|
608
|
+
bytesLidos: 0,
|
|
609
|
+
acertosMemoriaConteudo: 0,
|
|
610
|
+
origem: "plano_explicito",
|
|
611
|
+
diretoriosValidadosCache: 0,
|
|
612
|
+
});
|
|
613
|
+
}
|
|
614
|
+
const exigirCabecalhoCodigoGovernado = await workspaceExigeCabecalhoCodigoGovernado(contexto.baseProjeto, contexto.configCarregada?.config.modoEstrito === true);
|
|
615
|
+
const identidadeCache = criarIdentidadeCache(contexto, configuracaoEscopo, planoEscopo, exigirCabecalhoCodigoGovernado);
|
|
616
|
+
const cache = new CacheIncrementalDrift({
|
|
617
|
+
baseProjeto: contexto.baseProjeto,
|
|
618
|
+
politica: politicaCache,
|
|
619
|
+
identidade: identidadeCache,
|
|
620
|
+
observador: opcoes.observador,
|
|
621
|
+
});
|
|
622
|
+
const catalogo = await criarCatalogoPersistenteDrift({
|
|
623
|
+
baseDiretorio: contexto.baseProjeto,
|
|
624
|
+
arquivos: planoEscopo.estrategia === "arquivos_vinculados" ? planoEscopo.arquivos : [],
|
|
625
|
+
raizes: planoEscopo.estrategia === "projeto" ? planoEscopo.diretorios : [],
|
|
626
|
+
extensoes: EXTENSOES_ARQUIVOS_RASTREAVEIS_DRIFT,
|
|
627
|
+
diretoriosIgnorados: resolverDiretoriosIgnoradosAtivos({
|
|
628
|
+
escopo: configuracaoEscopo.escopo,
|
|
629
|
+
ignorarWorktrees: configuracaoEscopo.ignorarWorktrees,
|
|
630
|
+
ignorarConsumidoresLaterais: configuracaoEscopo.ignorarConsumidoresLaterais,
|
|
631
|
+
}),
|
|
632
|
+
observador: opcoes.observador,
|
|
633
|
+
}, { politica: politicaCache, identidade: identidadeCache });
|
|
634
|
+
const fimCatalogacao = performance.now();
|
|
635
|
+
try {
|
|
636
|
+
planoEscopo = await expandirDependenciasPlanoDrift(contexto, planoEscopo, catalogo, cache);
|
|
637
|
+
if (planoEscopo.estrategia === "projeto") {
|
|
638
|
+
const arquivosTypeScript = catalogo.arquivosCatalogados()
|
|
639
|
+
.filter((arquivo) => EXTENSOES_TYPESCRIPT_DRIFT.has(path.extname(arquivo).toLowerCase()));
|
|
640
|
+
planoEscopo.dependencias = await mapearDependenciasCatalogadasDrift(contexto, catalogo, cache, arquivosTypeScript);
|
|
641
|
+
}
|
|
642
|
+
const fimDependencias = performance.now();
|
|
643
|
+
const membrosUnicos = catalogo.arquivosCatalogados()
|
|
644
|
+
.filter((arquivo) => {
|
|
645
|
+
const extensao = path.extname(arquivo).toLowerCase();
|
|
646
|
+
return EXTENSOES_ANALISE_DRIFT.has(extensao)
|
|
647
|
+
|| EXTENSOES_DEPENDENCIA_TYPESCRIPT_DRIFT.has(extensao);
|
|
648
|
+
});
|
|
649
|
+
const estados = await mapearComLimite(membrosUnicos, 8, async (arquivo) => cache.resolverArquivo({
|
|
650
|
+
arquivo,
|
|
651
|
+
analise: "dependencias-v4",
|
|
652
|
+
ler: () => catalogo.ler(arquivo),
|
|
653
|
+
extrair: (conteudo) => extrairReferenciasLocaisDrift(conteudo.texto),
|
|
654
|
+
validar: (valor) => Array.isArray(valor) && valor.every((item) => typeof item === "string"),
|
|
655
|
+
}));
|
|
656
|
+
const arquivosTypeScript = membrosUnicos
|
|
657
|
+
.filter((arquivo) => EXTENSOES_TYPESCRIPT_DRIFT.has(path.extname(arquivo).toLowerCase()));
|
|
658
|
+
const perfis = await mapearComLimite(arquivosTypeScript, 8, async (arquivo) => cache.resolverArquivo({
|
|
659
|
+
arquivo,
|
|
660
|
+
analise: "agrupamento-semantico-ts-v1",
|
|
661
|
+
ler: () => catalogo.ler(arquivo),
|
|
662
|
+
extrair: (conteudo) => extrairPerfilAgrupamentoTypeScript(arquivo, conteudo.texto),
|
|
663
|
+
validar: perfilAgrupamentoTypeScriptValido,
|
|
664
|
+
}));
|
|
665
|
+
const perfisPorArquivo = new Map(perfis.map((perfil) => [
|
|
666
|
+
chaveCaminho(path.resolve(contexto.baseProjeto, perfil.caminho)),
|
|
667
|
+
perfil.valor,
|
|
668
|
+
]));
|
|
669
|
+
const grupos = construirGruposIncrementais(catalogo.arquivosCatalogados(), planoEscopo.dependencias, perfisPorArquivo);
|
|
670
|
+
const estadoPorArquivo = new Map(estados.map((estado) => [chaveRelativa(estado.caminho), estado]));
|
|
671
|
+
const fimAssinaturas = performance.now();
|
|
672
|
+
const resultadosGrupos = await mapearComLimite(grupos, 8, async (grupo) => {
|
|
673
|
+
const membros = grupo.map((arquivo) => {
|
|
674
|
+
const estado = estadoPorArquivo.get(chaveRelativa(pathRelativo(contexto.baseProjeto, arquivo)));
|
|
675
|
+
if (!estado) {
|
|
676
|
+
throw new Error(`estado_cache_arquivo_ausente:${arquivo}`);
|
|
677
|
+
}
|
|
678
|
+
return { caminho: arquivo, contentHash: estado.contentHash };
|
|
679
|
+
});
|
|
680
|
+
const catalogoGrupo = new CatalogoFiltradoDrift(catalogo, grupo);
|
|
681
|
+
return cache.resolverGrupo({
|
|
682
|
+
membros,
|
|
683
|
+
calcular: () => calcularIndices(planoEscopo.diretorios, catalogoGrupo, exigirCabecalhoCodigoGovernado),
|
|
684
|
+
validar: (valor) => (validarIndicesSerializaveis(valor)
|
|
685
|
+
&& indicesPermanecemNoCatalogo(valor, catalogoGrupo)),
|
|
686
|
+
});
|
|
687
|
+
});
|
|
688
|
+
await cache.finalizar();
|
|
689
|
+
const fimIndexacao = performance.now();
|
|
690
|
+
const serializaveis = mesclarIndices(resultadosGrupos.map((resultado) => resultado.valor), catalogo.arquivosCatalogados());
|
|
691
|
+
const metricasIncrementais = cache.metricas();
|
|
692
|
+
const origem = resultadosGrupos.length > 0
|
|
693
|
+
&& resultadosGrupos.every((resultado) => resultado.origem === "cache")
|
|
694
|
+
? "cache"
|
|
695
|
+
: "calculado";
|
|
696
|
+
return reconstruirIndices(serializaveis, planoEscopo, {
|
|
697
|
+
politica: politicaCache,
|
|
698
|
+
origem,
|
|
699
|
+
chave: cache.identidadeDigest,
|
|
700
|
+
incremental: metricasIncrementais,
|
|
701
|
+
fasesMs: {
|
|
702
|
+
planejamento: Number((fimPlanejamento - inicioTotal).toFixed(3)),
|
|
703
|
+
catalogacao: Number((fimCatalogacao - fimPlanejamento).toFixed(3)),
|
|
704
|
+
dependencias: Number((fimDependencias - fimCatalogacao).toFixed(3)),
|
|
705
|
+
assinaturas: Number((fimAssinaturas - fimDependencias).toFixed(3)),
|
|
706
|
+
indexacao: Number((fimIndexacao - fimAssinaturas).toFixed(3)),
|
|
707
|
+
total: Number((fimIndexacao - inicioTotal).toFixed(3)),
|
|
708
|
+
},
|
|
709
|
+
}, catalogo.metricas(), catalogo);
|
|
710
|
+
}
|
|
711
|
+
finally {
|
|
712
|
+
await cache.finalizar();
|
|
713
|
+
}
|
|
90
714
|
}
|
|
91
715
|
//# sourceMappingURL=drift.part13.js.map
|