@semacode/cli 1.3.6 → 1.4.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.
- package/AGENTS.md +272 -0
- package/LICENSE +22 -0
- package/README.md +93 -0
- package/SEMA_BRIEF.curto.txt +9 -0
- package/SEMA_BRIEF.md +49 -0
- package/SEMA_BRIEF.micro.txt +7 -0
- package/SEMA_INDEX.json +546 -0
- package/dist/drift.d.ts +5 -3
- package/dist/drift.js +532 -27
- package/dist/drift.js.map +1 -1
- package/dist/importador.d.ts +2 -0
- package/dist/importador.js +166 -7
- package/dist/importador.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/projeto.d.ts +6 -1
- package/dist/projeto.js +1 -3
- package/dist/projeto.js.map +1 -1
- package/dist/typescript-http.js +1 -1
- package/dist/typescript-http.js.map +1 -1
- package/docs/AGENT_STARTER.md +102 -0
- package/docs/cli.md +101 -0
- package/docs/como-ensinar-a-sema-para-ia.md +149 -0
- package/docs/fluxo-pratico-ia-sema.md +177 -0
- package/docs/instalacao-e-primeiro-uso.md +108 -0
- package/docs/integracao-com-ia.md +71 -0
- package/docs/pagamento-ponta-a-ponta.md +155 -0
- package/docs/persistencia-vendor-first.md +145 -0
- package/docs/prompt-base-ia-sema.md +104 -0
- package/docs/sintaxe.md +177 -0
- package/exemplos/agendamento.sema +106 -0
- package/exemplos/assinatura.sema +136 -0
- package/exemplos/auditoria.sema +88 -0
- package/exemplos/autenticacao.sema +125 -0
- package/exemplos/automacao.sema +107 -0
- package/exemplos/cadastro_usuario.sema +54 -0
- package/exemplos/calculadora.sema +78 -0
- package/exemplos/crud_simples.sema +89 -0
- package/exemplos/estoque.sema +126 -0
- package/exemplos/exportacao.sema +94 -0
- package/exemplos/fila.sema +131 -0
- package/exemplos/integracao_externa.sema +94 -0
- package/exemplos/multi_tenant.sema +140 -0
- package/exemplos/notificacao.sema +98 -0
- package/exemplos/operacao_estrategia.sema +402 -0
- package/exemplos/pagamento.sema +222 -0
- package/exemplos/pagamento_dominio.sema +35 -0
- package/exemplos/pedido.sema +119 -0
- package/exemplos/permissao.sema +121 -0
- package/exemplos/persistencia_vendor_first.sema +86 -0
- package/exemplos/relatorio.sema +93 -0
- package/exemplos/testes_embutidos.sema +45 -0
- package/exemplos/tratamento_erro.sema +157 -0
- package/exemplos/upload_arquivo.sema +93 -0
- package/exemplos/webhook.sema +96 -0
- package/llms-full.txt +34 -0
- package/llms.txt +17 -0
- package/logo.png +0 -0
- package/node_modules/@sema/gerador-css/package.json +3 -10
- package/node_modules/@sema/gerador-dart/package.json +3 -10
- package/node_modules/@sema/gerador-html/package.json +3 -10
- package/node_modules/@sema/gerador-javascript/package.json +3 -10
- package/node_modules/@sema/gerador-lua/package.json +3 -10
- package/node_modules/@sema/gerador-python/package.json +3 -10
- package/node_modules/@sema/gerador-typescript/package.json +3 -10
- package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +2 -1
- package/node_modules/@sema/nucleo/dist/formatador/index.js +32 -17
- package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/index.d.ts +1 -0
- package/node_modules/@sema/nucleo/dist/index.js +1 -0
- package/node_modules/@sema/nucleo/dist/index.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.js +94 -0
- package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +60 -0
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js +15 -0
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.js +98 -3
- package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/persistencia/contratos.d.ts +39 -0
- package/node_modules/@sema/nucleo/dist/persistencia/contratos.js +294 -0
- package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +1 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js +118 -2
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
- package/node_modules/@sema/nucleo/package.json +3 -6
- package/node_modules/@sema/padroes/package.json +3 -6
- package/package.json +33 -21
- package/node_modules/@sema/gerador-css/src/index.ts +0 -605
- package/node_modules/@sema/gerador-css/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-css/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-dart/src/index.ts +0 -52
- package/node_modules/@sema/gerador-dart/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-dart/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-html/src/index.ts +0 -185
- package/node_modules/@sema/gerador-html/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-html/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-javascript/src/index.ts +0 -461
- package/node_modules/@sema/gerador-javascript/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-javascript/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-lua/src/index.d.ts +0 -3
- package/node_modules/@sema/gerador-lua/src/index.js.map +0 -1
- package/node_modules/@sema/gerador-lua/src/index.ts +0 -359
- package/node_modules/@sema/gerador-lua/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-lua/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-python/src/index.ts +0 -706
- package/node_modules/@sema/gerador-python/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-python/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-typescript/src/index.ts +0 -728
- package/node_modules/@sema/gerador-typescript/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-typescript/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/nucleo/src/ast/tipos.ts +0 -191
- package/node_modules/@sema/nucleo/src/diagnosticos/index.ts +0 -43
- package/node_modules/@sema/nucleo/src/formatador/index.ts +0 -507
- package/node_modules/@sema/nucleo/src/index.ts +0 -133
- package/node_modules/@sema/nucleo/src/ir/conversor.ts +0 -912
- package/node_modules/@sema/nucleo/src/ir/modelos.ts +0 -331
- package/node_modules/@sema/nucleo/src/lexer/lexer.ts +0 -166
- package/node_modules/@sema/nucleo/src/lexer/tokens.ts +0 -64
- package/node_modules/@sema/nucleo/src/parser/gramatica.ebnf +0 -39
- package/node_modules/@sema/nucleo/src/parser/parser.ts +0 -790
- package/node_modules/@sema/nucleo/src/semantico/analisador.ts +0 -2692
- package/node_modules/@sema/nucleo/src/semantico/estruturas.ts +0 -632
- package/node_modules/@sema/nucleo/src/semantico/seguranca.ts +0 -362
- package/node_modules/@sema/nucleo/src/util/arquivos.ts +0 -28
- package/node_modules/@sema/nucleo/tsconfig.json +0 -9
- package/node_modules/@sema/nucleo/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/padroes/src/index.ts +0 -251
- package/node_modules/@sema/padroes/tsconfig.json +0 -9
- package/node_modules/@sema/padroes/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
export const ENGINES_BANCO_SUPORTADOS = new Set([
|
|
2
|
+
"postgres",
|
|
3
|
+
"mysql",
|
|
4
|
+
"sqlite",
|
|
5
|
+
"mongodb",
|
|
6
|
+
"redis",
|
|
7
|
+
]);
|
|
8
|
+
export const TIPOS_RECURSO_PERSISTENCIA = new Set([
|
|
9
|
+
"table",
|
|
10
|
+
"view",
|
|
11
|
+
"query",
|
|
12
|
+
"transaction",
|
|
13
|
+
"index",
|
|
14
|
+
"constraint",
|
|
15
|
+
"relationship",
|
|
16
|
+
"collection",
|
|
17
|
+
"document",
|
|
18
|
+
"keyspace",
|
|
19
|
+
"stream",
|
|
20
|
+
"lock",
|
|
21
|
+
"retention",
|
|
22
|
+
"replication",
|
|
23
|
+
]);
|
|
24
|
+
export const CAMPOS_DATABASE_SUPORTADOS = new Set([
|
|
25
|
+
"engine",
|
|
26
|
+
"schema",
|
|
27
|
+
"database",
|
|
28
|
+
"consistency",
|
|
29
|
+
"durability",
|
|
30
|
+
"transaction_model",
|
|
31
|
+
"query_model",
|
|
32
|
+
"portavel",
|
|
33
|
+
"adapter",
|
|
34
|
+
"perfil",
|
|
35
|
+
"compatibilidade",
|
|
36
|
+
]);
|
|
37
|
+
export const CAMPOS_RECURSO_PERSISTENCIA_SUPORTADOS = new Set([
|
|
38
|
+
"entity",
|
|
39
|
+
"consistency",
|
|
40
|
+
"durability",
|
|
41
|
+
"transaction_model",
|
|
42
|
+
"query_model",
|
|
43
|
+
"portavel",
|
|
44
|
+
"mode",
|
|
45
|
+
"isolation",
|
|
46
|
+
"strategy",
|
|
47
|
+
"ttl",
|
|
48
|
+
"retention",
|
|
49
|
+
"path",
|
|
50
|
+
"from",
|
|
51
|
+
"to",
|
|
52
|
+
"surface",
|
|
53
|
+
"adapter",
|
|
54
|
+
"resource_kind",
|
|
55
|
+
"collection",
|
|
56
|
+
"table",
|
|
57
|
+
"compatibilidade",
|
|
58
|
+
]);
|
|
59
|
+
const CONSISTENCIAS_SUPORTADAS = new Set([
|
|
60
|
+
"eventual",
|
|
61
|
+
"forte",
|
|
62
|
+
"serializable",
|
|
63
|
+
"snapshot",
|
|
64
|
+
"causal",
|
|
65
|
+
]);
|
|
66
|
+
const DURABILIDADES_SUPORTADAS = new Set([
|
|
67
|
+
"baixa",
|
|
68
|
+
"media",
|
|
69
|
+
"alta",
|
|
70
|
+
]);
|
|
71
|
+
const MODELOS_TRANSACAO_SUPORTADOS = new Set([
|
|
72
|
+
"mvcc",
|
|
73
|
+
"bloqueio",
|
|
74
|
+
"documento",
|
|
75
|
+
"otimista",
|
|
76
|
+
"single_thread",
|
|
77
|
+
]);
|
|
78
|
+
const MODELOS_CONSULTA_SUPORTADOS = new Set([
|
|
79
|
+
"sql",
|
|
80
|
+
"documento",
|
|
81
|
+
"chave_valor",
|
|
82
|
+
"pipeline",
|
|
83
|
+
"stream",
|
|
84
|
+
]);
|
|
85
|
+
export function valorCampoCompletoPersistencia(campo) {
|
|
86
|
+
if (!campo) {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
return [campo.valor, ...campo.modificadores].join(" ").trim() || undefined;
|
|
90
|
+
}
|
|
91
|
+
export function localizarCampoPersistencia(bloco, ...nomes) {
|
|
92
|
+
return bloco?.campos.find((campo) => nomes.includes(campo.nome));
|
|
93
|
+
}
|
|
94
|
+
export function parsearBooleanoPersistencia(valor) {
|
|
95
|
+
if (!valor) {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
const normalizado = valor.toLowerCase();
|
|
99
|
+
if (normalizado === "verdadeiro" || normalizado === "true") {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
if (normalizado === "falso" || normalizado === "false") {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
export function normalizarEngineBanco(valor) {
|
|
108
|
+
switch ((valor ?? "").toLowerCase()) {
|
|
109
|
+
case "postgres":
|
|
110
|
+
case "postgresql":
|
|
111
|
+
return "postgres";
|
|
112
|
+
case "mysql":
|
|
113
|
+
return "mysql";
|
|
114
|
+
case "sqlite":
|
|
115
|
+
case "sqlite3":
|
|
116
|
+
return "sqlite";
|
|
117
|
+
case "mongo":
|
|
118
|
+
case "mongodb":
|
|
119
|
+
return "mongodb";
|
|
120
|
+
case "redis":
|
|
121
|
+
return "redis";
|
|
122
|
+
default:
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export function normalizarConsistenciaPersistencia(valor) {
|
|
127
|
+
if (!valor) {
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
const normalizado = valor.toLowerCase();
|
|
131
|
+
return CONSISTENCIAS_SUPORTADAS.has(normalizado) ? normalizado : undefined;
|
|
132
|
+
}
|
|
133
|
+
export function normalizarDurabilidadePersistencia(valor) {
|
|
134
|
+
if (!valor) {
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
const normalizado = valor.toLowerCase();
|
|
138
|
+
return DURABILIDADES_SUPORTADAS.has(normalizado) ? normalizado : undefined;
|
|
139
|
+
}
|
|
140
|
+
export function normalizarModeloTransacaoPersistencia(valor) {
|
|
141
|
+
if (!valor) {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
const normalizado = valor.toLowerCase();
|
|
145
|
+
return MODELOS_TRANSACAO_SUPORTADOS.has(normalizado) ? normalizado : undefined;
|
|
146
|
+
}
|
|
147
|
+
export function normalizarModeloConsultaPersistencia(valor) {
|
|
148
|
+
if (!valor) {
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
const normalizado = valor.toLowerCase();
|
|
152
|
+
return MODELOS_CONSULTA_SUPORTADOS.has(normalizado) ? normalizado : undefined;
|
|
153
|
+
}
|
|
154
|
+
export function nomeTipoRecursoPersistencia(bloco) {
|
|
155
|
+
const candidato = (bloco.palavraChave === "desconhecido"
|
|
156
|
+
? bloco.nome
|
|
157
|
+
: bloco.palavraChave)?.toLowerCase();
|
|
158
|
+
if (!candidato) {
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
161
|
+
return TIPOS_RECURSO_PERSISTENCIA.has(candidato)
|
|
162
|
+
? candidato
|
|
163
|
+
: undefined;
|
|
164
|
+
}
|
|
165
|
+
export function listarRecursosPersistencia(bloco) {
|
|
166
|
+
if (!bloco) {
|
|
167
|
+
return [];
|
|
168
|
+
}
|
|
169
|
+
return bloco.blocos.filter((item) => item.tipo === "bloco_generico" && Boolean(nomeTipoRecursoPersistencia(item)));
|
|
170
|
+
}
|
|
171
|
+
function compatibilidadeBasica(engine, status, motivo) {
|
|
172
|
+
return { engine, status, motivo };
|
|
173
|
+
}
|
|
174
|
+
function classificarCompatibilidadePorTipo(tipo, engine) {
|
|
175
|
+
switch (tipo) {
|
|
176
|
+
case "table":
|
|
177
|
+
case "view":
|
|
178
|
+
if (engine === "postgres" || engine === "mysql" || engine === "sqlite") {
|
|
179
|
+
return compatibilidadeBasica(engine, "nativo", `${tipo} e nativo em motores relacionais.`);
|
|
180
|
+
}
|
|
181
|
+
return compatibilidadeBasica(engine, "invalido", `${tipo} nao existe como primitivo em ${engine}.`);
|
|
182
|
+
case "query":
|
|
183
|
+
if (engine === "postgres" || engine === "mysql" || engine === "sqlite" || engine === "mongodb") {
|
|
184
|
+
return compatibilidadeBasica(engine, "nativo", `query e suportado de forma nativa em ${engine}.`);
|
|
185
|
+
}
|
|
186
|
+
return compatibilidadeBasica(engine, "parcial", "Redis consulta dados, mas a expressividade depende da estrutura escolhida.");
|
|
187
|
+
case "transaction":
|
|
188
|
+
if (engine === "postgres" || engine === "mysql" || engine === "sqlite") {
|
|
189
|
+
return compatibilidadeBasica(engine, "nativo", "Transacao ACID e parte do contrato principal do engine.");
|
|
190
|
+
}
|
|
191
|
+
if (engine === "mongodb") {
|
|
192
|
+
return compatibilidadeBasica(engine, "parcial", "MongoDB suporta transacoes, mas com restricoes operacionais e de topologia.");
|
|
193
|
+
}
|
|
194
|
+
return compatibilidadeBasica(engine, "invalido", "Redis nao oferece transacao de banco relacional como primitivo equivalente.");
|
|
195
|
+
case "index":
|
|
196
|
+
if (engine === "postgres" || engine === "mysql" || engine === "sqlite" || engine === "mongodb") {
|
|
197
|
+
return compatibilidadeBasica(engine, "nativo", "Indexacao e um recurso nativo do engine.");
|
|
198
|
+
}
|
|
199
|
+
return compatibilidadeBasica(engine, "parcial", "Redis indexa via modulos/estrategias especificas, nao como indice generico universal.");
|
|
200
|
+
case "constraint":
|
|
201
|
+
if (engine === "postgres" || engine === "mysql") {
|
|
202
|
+
return compatibilidadeBasica(engine, "nativo", "Constraints fazem parte do contrato relacional do engine.");
|
|
203
|
+
}
|
|
204
|
+
if (engine === "sqlite") {
|
|
205
|
+
return compatibilidadeBasica(engine, "parcial", "SQLite suporta constraints, mas com escopo e enforcement mais limitados.");
|
|
206
|
+
}
|
|
207
|
+
return compatibilidadeBasica(engine, "invalido", `Constraint relacional nao e nativo em ${engine}.`);
|
|
208
|
+
case "relationship":
|
|
209
|
+
if (engine === "postgres" || engine === "mysql" || engine === "sqlite") {
|
|
210
|
+
return compatibilidadeBasica(engine, "nativo", "Relacionamentos por chave e join sao nativos em motores relacionais.");
|
|
211
|
+
}
|
|
212
|
+
if (engine === "mongodb") {
|
|
213
|
+
return compatibilidadeBasica(engine, "adaptado", "MongoDB modela relacionamento por referencia ou embutimento.");
|
|
214
|
+
}
|
|
215
|
+
return compatibilidadeBasica(engine, "invalido", "Redis nao modela relacionamento com garantias relacionais nativas.");
|
|
216
|
+
case "collection":
|
|
217
|
+
return engine === "mongodb"
|
|
218
|
+
? compatibilidadeBasica(engine, "nativo", "Collection e o recurso estrutural principal do MongoDB.")
|
|
219
|
+
: compatibilidadeBasica(engine, "invalido", `Collection nao e recurso estrutural nativo de ${engine}.`);
|
|
220
|
+
case "document":
|
|
221
|
+
if (engine === "mongodb") {
|
|
222
|
+
return compatibilidadeBasica(engine, "nativo", "Documentos sao o recurso central do MongoDB.");
|
|
223
|
+
}
|
|
224
|
+
if (engine === "postgres" || engine === "mysql" || engine === "sqlite") {
|
|
225
|
+
return compatibilidadeBasica(engine, "adaptado", "Documentos podem ser modelados sobre JSON ou blobs estruturados.");
|
|
226
|
+
}
|
|
227
|
+
return compatibilidadeBasica(engine, "parcial", "Redis suporta documentos por modulos, mas nao como baseline universal.");
|
|
228
|
+
case "keyspace":
|
|
229
|
+
return engine === "redis"
|
|
230
|
+
? compatibilidadeBasica(engine, "nativo", "Keyspace e o modelo estrutural primario do Redis.")
|
|
231
|
+
: compatibilidadeBasica(engine, "invalido", `Keyspace nao e primitivo nativo em ${engine}.`);
|
|
232
|
+
case "stream":
|
|
233
|
+
if (engine === "redis") {
|
|
234
|
+
return compatibilidadeBasica(engine, "nativo", "Streams sao nativos em Redis.");
|
|
235
|
+
}
|
|
236
|
+
if (engine === "postgres" || engine === "mysql") {
|
|
237
|
+
return compatibilidadeBasica(engine, "adaptado", "Stream exige adaptacao sobre log, outbox ou fila auxiliar.");
|
|
238
|
+
}
|
|
239
|
+
if (engine === "mongodb") {
|
|
240
|
+
return compatibilidadeBasica(engine, "parcial", "MongoDB oferece change streams, mas nao um stream geral identico.");
|
|
241
|
+
}
|
|
242
|
+
return compatibilidadeBasica(engine, "invalido", "SQLite nao oferece stream nativo comparavel.");
|
|
243
|
+
case "lock":
|
|
244
|
+
if (engine === "postgres" || engine === "mysql") {
|
|
245
|
+
return compatibilidadeBasica(engine, "nativo", "Locks e concorrencia controlada sao nativos do engine.");
|
|
246
|
+
}
|
|
247
|
+
if (engine === "sqlite" || engine === "mongodb") {
|
|
248
|
+
return compatibilidadeBasica(engine, "parcial", "O engine controla concorrencia, mas com semantica diferente de lock explicito relacional.");
|
|
249
|
+
}
|
|
250
|
+
return compatibilidadeBasica(engine, "adaptado", "Redis consegue coordenar lock, mas por convencao e nao por contrato relacional.");
|
|
251
|
+
case "retention":
|
|
252
|
+
if (engine === "redis" || engine === "mongodb") {
|
|
253
|
+
return compatibilidadeBasica(engine, "nativo", "Retencao/TTL faz parte do repertorio nativo do engine.");
|
|
254
|
+
}
|
|
255
|
+
return compatibilidadeBasica(engine, "adaptado", "Retencao exige politica auxiliar, cleanup agendado ou particionamento.");
|
|
256
|
+
case "replication":
|
|
257
|
+
if (engine === "sqlite") {
|
|
258
|
+
return compatibilidadeBasica(engine, "invalido", "SQLite nao trata replicacao como capacidade nativa principal.");
|
|
259
|
+
}
|
|
260
|
+
return compatibilidadeBasica(engine, "nativo", "Replicacao e tratada como capacidade oficial do engine ou da plataforma gerenciada.");
|
|
261
|
+
default:
|
|
262
|
+
return compatibilidadeBasica(engine, "invalido", `Recurso ${tipo} ainda nao foi classificado para ${engine}.`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
export function classificarCompatibilidadePersistencia(tipo, engine, opcoes = {}) {
|
|
266
|
+
const compatibilidade = classificarCompatibilidadePorTipo(tipo, engine);
|
|
267
|
+
if (tipo === "query") {
|
|
268
|
+
const modo = normalizarModeloConsultaPersistencia(opcoes.mode);
|
|
269
|
+
if (modo === "sql" && (engine === "mongodb" || engine === "redis")) {
|
|
270
|
+
return compatibilidadeBasica(engine, "invalido", `Query em modo sql nao e nativo em ${engine}.`);
|
|
271
|
+
}
|
|
272
|
+
if (modo === "documento" && (engine === "postgres" || engine === "mysql" || engine === "sqlite")) {
|
|
273
|
+
return compatibilidadeBasica(engine, "adaptado", `Query documental em ${engine} depende de JSON e adaptacao do runtime.`);
|
|
274
|
+
}
|
|
275
|
+
if (modo === "pipeline" && engine !== "mongodb") {
|
|
276
|
+
return compatibilidadeBasica(engine, engine === "redis" ? "parcial" : "invalido", `Pipeline foi pedido, mas ${engine} nao tem pipeline documental nativo equivalente ao MongoDB.`);
|
|
277
|
+
}
|
|
278
|
+
if (modo === "stream" && engine !== "redis") {
|
|
279
|
+
return compatibilidadeBasica(engine, compatibilidade.status === "nativo" ? "adaptado" : compatibilidade.status, `Query orientada a stream em ${engine} exige adaptacao fora do baseline do engine.`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
if (tipo === "transaction" && opcoes.isolation && (engine === "mongodb" || engine === "redis")) {
|
|
283
|
+
return compatibilidadeBasica(engine, "invalido", `Transaction com isolation explicita nao e suportada de forma equivalente em ${engine}.`);
|
|
284
|
+
}
|
|
285
|
+
return compatibilidade;
|
|
286
|
+
}
|
|
287
|
+
export function matrizCompatibilidadePersistencia(tipo, opcoes = {}) {
|
|
288
|
+
return [...ENGINES_BANCO_SUPORTADOS].map((engine) => classificarCompatibilidadePersistencia(tipo, engine, opcoes));
|
|
289
|
+
}
|
|
290
|
+
export function recursoPersistenciaPodeSerPortavel(tipo, opcoes = {}) {
|
|
291
|
+
return matrizCompatibilidadePersistencia(tipo, opcoes)
|
|
292
|
+
.every((item) => item.status === "nativo" || item.status === "adaptado");
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=contratos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contratos.js","sourceRoot":"","sources":["../../src/persistencia/contratos.ts"],"names":[],"mappings":"AA8BA,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAc;IAC3D,UAAU;IACV,OAAO;IACP,QAAQ;IACR,SAAS;IACT,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAA0B;IACzE,OAAO;IACP,MAAM;IACN,OAAO;IACP,aAAa;IACb,OAAO;IACP,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,UAAU;IACV,UAAU;IACV,QAAQ;IACR,MAAM;IACN,WAAW;IACX,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC;IAChD,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,aAAa;IACb,YAAY;IACZ,mBAAmB;IACnB,aAAa;IACb,UAAU;IACV,SAAS;IACT,QAAQ;IACR,iBAAiB;CAClB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sCAAsC,GAAG,IAAI,GAAG,CAAC;IAC5D,QAAQ;IACR,aAAa;IACb,YAAY;IACZ,mBAAmB;IACnB,aAAa;IACb,UAAU;IACV,MAAM;IACN,WAAW;IACX,UAAU;IACV,KAAK;IACL,WAAW;IACX,MAAM;IACN,MAAM;IACN,IAAI;IACJ,SAAS;IACT,SAAS;IACT,eAAe;IACf,YAAY;IACZ,OAAO;IACP,iBAAiB;CAClB,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAA2B;IACjE,UAAU;IACV,OAAO;IACP,cAAc;IACd,UAAU;IACV,QAAQ;CACT,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAA2B;IACjE,OAAO;IACP,OAAO;IACP,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAA8B;IACxE,MAAM;IACN,UAAU;IACV,WAAW;IACX,UAAU;IACV,eAAe;CAChB,CAAC,CAAC;AAEH,MAAM,2BAA2B,GAAG,IAAI,GAAG,CAA6B;IACtE,KAAK;IACL,WAAW;IACX,aAAa;IACb,UAAU;IACV,QAAQ;CACT,CAAC,CAAC;AAEH,MAAM,UAAU,8BAA8B,CAAC,KAAgB;IAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAmC,EAAE,GAAG,KAAe;IAChG,OAAO,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAc;IACxD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACxC,IAAI,WAAW,KAAK,YAAY,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,WAAW,KAAK,OAAO,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACpC,KAAK,UAAU,CAAC;QAChB,KAAK,YAAY;YACf,OAAO,UAAU,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC;QAClB,KAAK,OAAO,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,KAAc;IAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAA8B,CAAC;IACpE,OAAO,wBAAwB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,KAAc;IAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAA8B,CAAC;IACpE,OAAO,wBAAwB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,qCAAqC,CAAC,KAAc;IAClE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAAiC,CAAC;IACvE,OAAO,4BAA4B,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,oCAAoC,CAAC,KAAc;IACjE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAAgC,CAAC;IACtE,OAAO,2BAA2B,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAuB;IACjE,MAAM,SAAS,GAAG,CAChB,KAAK,CAAC,YAAY,KAAK,cAAc;QACnC,CAAC,CAAC,KAAK,CAAC,IAAI;QACZ,CAAC,CAAC,KAAK,CAAC,YAAY,CACvB,EAAE,WAAW,EAAE,CAAC;IAEjB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,0BAA0B,CAAC,GAAG,CAAC,SAAoC,CAAC;QACzE,CAAC,CAAC,SAAoC;QACtC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAmC;IAC5E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAA4B,EAAE,CAC5D,IAAI,CAAC,IAAI,KAAK,gBAAgB,IAAI,OAAO,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,qBAAqB,CAC5B,MAAmB,EACnB,MAAyC,EACzC,MAAc;IAEd,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,iCAAiC,CACxC,IAA6B,EAC7B,MAAmB;IAEnB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO,CAAC;QACb,KAAK,MAAM;YACT,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACvE,OAAO,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,mCAAmC,CAAC,CAAC;YAC7F,CAAC;YACD,OAAO,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,iCAAiC,MAAM,GAAG,CAAC,CAAC;QACtG,KAAK,OAAO;YACV,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC/F,OAAO,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,wCAAwC,MAAM,GAAG,CAAC,CAAC;YACpG,CAAC;YACD,OAAO,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,4EAA4E,CAAC,CAAC;QAChI,KAAK,aAAa;YAChB,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACvE,OAAO,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,yDAAyD,CAAC,CAAC;YAC5G,CAAC;YACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,6EAA6E,CAAC,CAAC;YACjI,CAAC;YACD,OAAO,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,6EAA6E,CAAC,CAAC;QAClI,KAAK,OAAO;YACV,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC/F,OAAO,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,0CAA0C,CAAC,CAAC;YAC7F,CAAC;YACD,OAAO,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,uFAAuF,CAAC,CAAC;QAC3I,KAAK,YAAY;YACf,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBAChD,OAAO,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,2DAA2D,CAAC,CAAC;YAC9G,CAAC;YACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxB,OAAO,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,0EAA0E,CAAC,CAAC;YAC9H,CAAC;YACD,OAAO,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,yCAAyC,MAAM,GAAG,CAAC,CAAC;QACvG,KAAK,cAAc;YACjB,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACvE,OAAO,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,sEAAsE,CAAC,CAAC;YACzH,CAAC;YACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,8DAA8D,CAAC,CAAC;YACnH,CAAC;YACD,OAAO,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,oEAAoE,CAAC,CAAC;QACzH,KAAK,YAAY;YACf,OAAO,MAAM,KAAK,SAAS;gBACzB,CAAC,CAAC,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,yDAAyD,CAAC;gBACpG,CAAC,CAAC,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,iDAAiD,MAAM,GAAG,CAAC,CAAC;QAC5G,KAAK,UAAU;YACb,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,8CAA8C,CAAC,CAAC;YACjG,CAAC;YACD,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACvE,OAAO,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,kEAAkE,CAAC,CAAC;YACvH,CAAC;YACD,OAAO,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,wEAAwE,CAAC,CAAC;QAC5H,KAAK,UAAU;YACb,OAAO,MAAM,KAAK,OAAO;gBACvB,CAAC,CAAC,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,mDAAmD,CAAC;gBAC9F,CAAC,CAAC,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,sCAAsC,MAAM,GAAG,CAAC,CAAC;QACjG,KAAK,QAAQ;YACX,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,OAAO,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,+BAA+B,CAAC,CAAC;YAClF,CAAC;YACD,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBAChD,OAAO,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,4DAA4D,CAAC,CAAC;YACjH,CAAC;YACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,mEAAmE,CAAC,CAAC;YACvH,CAAC;YACD,OAAO,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,8CAA8C,CAAC,CAAC;QACnG,KAAK,MAAM;YACT,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBAChD,OAAO,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,wDAAwD,CAAC,CAAC;YAC3G,CAAC;YACD,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChD,OAAO,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,2FAA2F,CAAC,CAAC;YAC/I,CAAC;YACD,OAAO,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,iFAAiF,CAAC,CAAC;QACtI,KAAK,WAAW;YACd,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC/C,OAAO,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,wDAAwD,CAAC,CAAC;YAC3G,CAAC;YACD,OAAO,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,wEAAwE,CAAC,CAAC;QAC7H,KAAK,aAAa;YAChB,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxB,OAAO,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,+DAA+D,CAAC,CAAC;YACpH,CAAC;YACD,OAAO,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,qFAAqF,CAAC,CAAC;QACxI;YACE,OAAO,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,IAAI,oCAAoC,MAAM,GAAG,CAAC,CAAC;IACnH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sCAAsC,CACpD,IAA6B,EAC7B,MAAmB,EACnB,SAGI,EAAE;IAEN,MAAM,eAAe,GAAG,iCAAiC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAExE,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,oCAAoC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,OAAO,CAAC,EAAE,CAAC;YACnE,OAAO,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,qCAAqC,MAAM,GAAG,CAAC,CAAC;QACnG,CAAC;QACD,IAAI,IAAI,KAAK,WAAW,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;YACjG,OAAO,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,uBAAuB,MAAM,0CAA0C,CAAC,CAAC;QAC5H,CAAC;QACD,IAAI,IAAI,KAAK,UAAU,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAChD,OAAO,qBAAqB,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,4BAA4B,MAAM,6DAA6D,CAAC,CAAC;QACrL,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YAC5C,OAAO,qBAAqB,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,+BAA+B,MAAM,8CAA8C,CAAC,CAAC;QACvM,CAAC;IACH,CAAC;IAED,IAAI,IAAI,KAAK,aAAa,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,OAAO,CAAC,EAAE,CAAC;QAC/F,OAAO,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,+EAA+E,MAAM,GAAG,CAAC,CAAC;IAC7I,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,IAA6B,EAC7B,SAGI,EAAE;IAEN,OAAO,CAAC,GAAG,wBAAwB,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,sCAAsC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AACrH,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,IAA6B,EAC7B,SAGI,EAAE;IAEN,OAAO,iCAAiC,CAAC,IAAI,EAAE,MAAM,CAAC;SACnD,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { type Diagnostico } from "../diagnosticos/index.js";
|
|
|
2
2
|
import type { ModuloAst } from "../ast/tipos.js";
|
|
3
3
|
export interface SimboloSemantico {
|
|
4
4
|
nome: string;
|
|
5
|
-
categoria: "tipo" | "entity" | "enum" | "task" | "flow" | "route" | "state" | "worker" | "evento" | "fila" | "cron" | "webhook" | "cache" | "storage" | "policy";
|
|
5
|
+
categoria: "tipo" | "entity" | "enum" | "task" | "flow" | "route" | "state" | "worker" | "evento" | "fila" | "cron" | "webhook" | "cache" | "storage" | "policy" | "database";
|
|
6
6
|
}
|
|
7
7
|
export interface CampoSemantico {
|
|
8
8
|
nome: string;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { criarDiagnostico } from "../diagnosticos/index.js";
|
|
2
|
+
import { CAMPOS_DATABASE_SUPORTADOS, CAMPOS_RECURSO_PERSISTENCIA_SUPORTADOS, classificarCompatibilidadePersistencia, nomeTipoRecursoPersistencia, normalizarConsistenciaPersistencia, normalizarDurabilidadePersistencia, normalizarEngineBanco, normalizarModeloConsultaPersistencia, normalizarModeloTransacaoPersistencia, parsearBooleanoPersistencia, recursoPersistenciaPodeSerPortavel, } from "../persistencia/contratos.js";
|
|
2
3
|
import { ehCategoriaEfeitoSemantico, ehCriticidadeEfeitoSemantico, extrairReferenciasDaExpressao, parsearEfeitoSemantico, parsearEtapaFlow, parsearExpressaoSemantica, parsearTransicaoEstado, } from "./estruturas.js";
|
|
3
4
|
import { CLASSIFICACOES_DADO_SUPORTADAS, MODOS_AUTH_SUPORTADOS, MOTIVOS_AUDIT_SUPORTADOS, ORIGENS_AUTH_SUPORTADAS, PRINCIPAIS_AUTH_SUPORTADOS, REDACOES_LOG_SUPORTADAS, TENANTS_AUTHZ_SUPORTADOS, contratoDadosTemSegredoOuCredencial, contratoDadosTemSensivel, extrairContratoAudit, extrairContratoAuth, extrairContratoAuthz, extrairContratoDados, extrairContratoForbidden, extrairContratoSegredos, efeitoEhPrivilegiado, efeitoRequerSegredo, forbiddenContemRegra, } from "./seguranca.js";
|
|
4
5
|
function ehUseInterop(use) {
|
|
@@ -285,6 +286,104 @@ function extrairPerfilCompatibilidade(bloco, padrao = "interno") {
|
|
|
285
286
|
}
|
|
286
287
|
return padrao;
|
|
287
288
|
}
|
|
289
|
+
function validarCamposSuportadosPersistencia(bloco, camposSuportados, diagnosticos, contexto, codigo, dica) {
|
|
290
|
+
for (const campo of bloco.campos) {
|
|
291
|
+
if (camposSuportados.has(campo.nome)) {
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
diagnosticos.push(criarDiagnostico(codigo, `Campo de persistencia "${campo.nome}" nao e suportado em ${contexto}.`, "erro", campo.intervalo, dica));
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
function validarBooleanoPersistencia(valor, intervalo, diagnosticos, codigo, mensagem) {
|
|
298
|
+
if (!valor) {
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
if (parsearBooleanoPersistencia(valor) !== undefined) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
diagnosticos.push(criarDiagnostico(codigo, mensagem, "erro", intervalo, "Use verdadeiro/falso ou true/false."));
|
|
305
|
+
}
|
|
306
|
+
function validarRecursoPersistencia(database, recurso, diagnosticos) {
|
|
307
|
+
const engine = normalizarEngineBanco(valorCampoCompleto(localizarCampo(database, "engine")));
|
|
308
|
+
if (!engine) {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
validarCamposSuportadosPersistencia(recurso, CAMPOS_RECURSO_PERSISTENCIA_SUPORTADOS, diagnosticos, `resource "${recurso.nome ?? recurso.palavraChave}" do database "${database.nome ?? "database"}"`, "SEM106", "Use apenas entity, consistency, durability, transaction_model, query_model, portavel, mode, isolation, strategy, ttl, retention, path, from, to, surface, adapter, resource_kind, collection, table ou compatibilidade.");
|
|
312
|
+
const tipoRecurso = nomeTipoRecursoPersistencia(recurso);
|
|
313
|
+
if (!tipoRecurso) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const nomeRecurso = recurso.nome ?? tipoRecurso;
|
|
317
|
+
const contexto = `resource "${nomeRecurso}" do database "${database.nome ?? "database"}"`;
|
|
318
|
+
const consistency = valorCampoCompleto(localizarCampo(recurso, "consistency"));
|
|
319
|
+
const durability = valorCampoCompleto(localizarCampo(recurso, "durability"));
|
|
320
|
+
const transactionModel = valorCampoCompleto(localizarCampo(recurso, "transaction_model"));
|
|
321
|
+
const queryModel = valorCampoCompleto(localizarCampo(recurso, "query_model"));
|
|
322
|
+
const mode = valorCampoCompleto(localizarCampo(recurso, "mode"));
|
|
323
|
+
const portavel = valorCampoCompleto(localizarCampo(recurso, "portavel"));
|
|
324
|
+
const isolation = valorCampoCompleto(localizarCampo(recurso, "isolation"));
|
|
325
|
+
if (consistency && !normalizarConsistenciaPersistencia(consistency)) {
|
|
326
|
+
diagnosticos.push(criarDiagnostico("SEM107", `${contexto} declarou consistency invalida: "${consistency}".`, "erro", localizarCampo(recurso, "consistency")?.intervalo, "Use eventual, forte, serializable, snapshot ou causal."));
|
|
327
|
+
}
|
|
328
|
+
if (durability && !normalizarDurabilidadePersistencia(durability)) {
|
|
329
|
+
diagnosticos.push(criarDiagnostico("SEM108", `${contexto} declarou durability invalida: "${durability}".`, "erro", localizarCampo(recurso, "durability")?.intervalo, "Use baixa, media ou alta."));
|
|
330
|
+
}
|
|
331
|
+
if (transactionModel && !normalizarModeloTransacaoPersistencia(transactionModel)) {
|
|
332
|
+
diagnosticos.push(criarDiagnostico("SEM109", `${contexto} declarou transaction_model invalido: "${transactionModel}".`, "erro", localizarCampo(recurso, "transaction_model")?.intervalo, "Use mvcc, bloqueio, documento, otimista ou single_thread."));
|
|
333
|
+
}
|
|
334
|
+
if (queryModel && !normalizarModeloConsultaPersistencia(queryModel)) {
|
|
335
|
+
diagnosticos.push(criarDiagnostico("SEM110", `${contexto} declarou query_model invalido: "${queryModel}".`, "erro", localizarCampo(recurso, "query_model")?.intervalo, "Use sql, documento, chave_valor, pipeline ou stream."));
|
|
336
|
+
}
|
|
337
|
+
if (mode && !normalizarModeloConsultaPersistencia(mode)) {
|
|
338
|
+
diagnosticos.push(criarDiagnostico("SEM111", `${contexto} declarou mode invalido: "${mode}".`, "erro", localizarCampo(recurso, "mode")?.intervalo, "Use sql, documento, chave_valor, pipeline ou stream."));
|
|
339
|
+
}
|
|
340
|
+
const compatibilidade = classificarCompatibilidadePersistencia(tipoRecurso, engine, { mode, isolation });
|
|
341
|
+
if (compatibilidade.status === "invalido") {
|
|
342
|
+
diagnosticos.push(criarDiagnostico("SEM112", `${contexto} nao e compativel com o engine ${engine}.`, "erro", recurso.intervalo, compatibilidade.motivo));
|
|
343
|
+
}
|
|
344
|
+
validarBooleanoPersistencia(portavel, localizarCampo(recurso, "portavel")?.intervalo ?? recurso.intervalo, diagnosticos, "SEM113", `${contexto} declarou portavel com valor invalido: "${portavel}".`);
|
|
345
|
+
if (parsearBooleanoPersistencia(portavel) && !recursoPersistenciaPodeSerPortavel(tipoRecurso, { mode, isolation })) {
|
|
346
|
+
diagnosticos.push(criarDiagnostico("SEM114", `${contexto} foi marcado como portavel, mas a compatibilidade entre os cinco bancos nao fecha sem perdas reais.`, "aviso", localizarCampo(recurso, "portavel")?.intervalo ?? recurso.intervalo, "Remova portavel ou reduza o recurso para um baseline comum entre postgres, mysql, sqlite, mongodb e redis."));
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
function validarDatabase(database, diagnosticos) {
|
|
350
|
+
validarCamposSuportadosPersistencia(database, CAMPOS_DATABASE_SUPORTADOS, diagnosticos, `database "${database.nome ?? "database"}"`, "SEM100", "Use apenas engine, schema, database, consistency, durability, transaction_model, query_model, portavel, adapter, perfil ou compatibilidade.");
|
|
351
|
+
const campoEngine = localizarCampo(database, "engine");
|
|
352
|
+
const engineBruto = valorCampoCompleto(campoEngine);
|
|
353
|
+
if (!engineBruto) {
|
|
354
|
+
diagnosticos.push(criarDiagnostico("SEM101", `Database "${database.nome ?? "database"}" precisa declarar engine.`, "erro", database.intervalo, "Use postgres, mysql, sqlite, mongodb ou redis."));
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
const engine = normalizarEngineBanco(engineBruto);
|
|
358
|
+
if (!engine) {
|
|
359
|
+
diagnosticos.push(criarDiagnostico("SEM102", `Database "${database.nome ?? "database"}" declarou engine invalido: "${engineBruto}".`, "erro", campoEngine?.intervalo ?? database.intervalo, "Use postgres, mysql, sqlite, mongodb ou redis."));
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
const consistency = valorCampoCompleto(localizarCampo(database, "consistency"));
|
|
363
|
+
const durability = valorCampoCompleto(localizarCampo(database, "durability"));
|
|
364
|
+
const transactionModel = valorCampoCompleto(localizarCampo(database, "transaction_model"));
|
|
365
|
+
const queryModel = valorCampoCompleto(localizarCampo(database, "query_model"));
|
|
366
|
+
const portavel = valorCampoCompleto(localizarCampo(database, "portavel"));
|
|
367
|
+
if (consistency && !normalizarConsistenciaPersistencia(consistency)) {
|
|
368
|
+
diagnosticos.push(criarDiagnostico("SEM103", `Database "${database.nome ?? "database"}" declarou consistency invalida: "${consistency}".`, "erro", localizarCampo(database, "consistency")?.intervalo, "Use eventual, forte, serializable, snapshot ou causal."));
|
|
369
|
+
}
|
|
370
|
+
if (durability && !normalizarDurabilidadePersistencia(durability)) {
|
|
371
|
+
diagnosticos.push(criarDiagnostico("SEM104", `Database "${database.nome ?? "database"}" declarou durability invalida: "${durability}".`, "erro", localizarCampo(database, "durability")?.intervalo, "Use baixa, media ou alta."));
|
|
372
|
+
}
|
|
373
|
+
if (transactionModel && !normalizarModeloTransacaoPersistencia(transactionModel)) {
|
|
374
|
+
diagnosticos.push(criarDiagnostico("SEM105", `Database "${database.nome ?? "database"}" declarou transaction_model invalido: "${transactionModel}".`, "erro", localizarCampo(database, "transaction_model")?.intervalo, "Use mvcc, bloqueio, documento, otimista ou single_thread."));
|
|
375
|
+
}
|
|
376
|
+
if (queryModel && !normalizarModeloConsultaPersistencia(queryModel)) {
|
|
377
|
+
diagnosticos.push(criarDiagnostico("SEM115", `Database "${database.nome ?? "database"}" declarou query_model invalido: "${queryModel}".`, "erro", localizarCampo(database, "query_model")?.intervalo, "Use sql, documento, chave_valor, pipeline ou stream."));
|
|
378
|
+
}
|
|
379
|
+
validarBooleanoPersistencia(portavel, localizarCampo(database, "portavel")?.intervalo ?? database.intervalo, diagnosticos, "SEM116", `Database "${database.nome ?? "database"}" declarou portavel com valor invalido: "${portavel}".`);
|
|
380
|
+
for (const recurso of database.blocos) {
|
|
381
|
+
if (recurso.tipo !== "bloco_generico") {
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
validarRecursoPersistencia(database, recurso, diagnosticos);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
288
387
|
function coletarSuperficiesModulo(modulo) {
|
|
289
388
|
return [
|
|
290
389
|
...modulo.workers.map((superficie) => ({ tipo: "worker", superficie })),
|
|
@@ -1102,7 +1201,9 @@ export function criarContextoLocal(modulo) {
|
|
|
1102
1201
|
tasksConhecidas.add(nome);
|
|
1103
1202
|
return;
|
|
1104
1203
|
}
|
|
1105
|
-
|
|
1204
|
+
if (categoria !== "database") {
|
|
1205
|
+
tiposConhecidos.add(nome);
|
|
1206
|
+
}
|
|
1106
1207
|
};
|
|
1107
1208
|
for (const type of modulo.types) {
|
|
1108
1209
|
registrar(type.nome, "tipo");
|
|
@@ -1164,6 +1265,11 @@ export function criarContextoLocal(modulo) {
|
|
|
1164
1265
|
registrar(policy.nome, "policy");
|
|
1165
1266
|
}
|
|
1166
1267
|
}
|
|
1268
|
+
for (const database of modulo.databases) {
|
|
1269
|
+
if (database.nome) {
|
|
1270
|
+
registrar(database.nome, "database");
|
|
1271
|
+
}
|
|
1272
|
+
}
|
|
1167
1273
|
for (const state of modulo.states) {
|
|
1168
1274
|
if (state.nome) {
|
|
1169
1275
|
registrar(state.nome, "state");
|
|
@@ -1336,7 +1442,9 @@ export function analisarSemantica(modulo, opcoes = {}) {
|
|
|
1336
1442
|
tasksConhecidas.add(nome);
|
|
1337
1443
|
return;
|
|
1338
1444
|
}
|
|
1339
|
-
|
|
1445
|
+
if (categoria !== "database") {
|
|
1446
|
+
tiposConhecidos.add(nome);
|
|
1447
|
+
}
|
|
1340
1448
|
};
|
|
1341
1449
|
for (const type of modulo.types) {
|
|
1342
1450
|
registrar(type.nome, "tipo", type.intervalo);
|
|
@@ -1398,6 +1506,11 @@ export function analisarSemantica(modulo, opcoes = {}) {
|
|
|
1398
1506
|
registrar(policy.nome, "policy", policy.intervalo);
|
|
1399
1507
|
}
|
|
1400
1508
|
}
|
|
1509
|
+
for (const database of modulo.databases) {
|
|
1510
|
+
if (database.nome) {
|
|
1511
|
+
registrar(database.nome, "database", database.intervalo);
|
|
1512
|
+
}
|
|
1513
|
+
}
|
|
1401
1514
|
for (const state of modulo.states) {
|
|
1402
1515
|
if (state.nome) {
|
|
1403
1516
|
registrar(state.nome, "state", state.intervalo);
|
|
@@ -1460,6 +1573,9 @@ export function analisarSemantica(modulo, opcoes = {}) {
|
|
|
1460
1573
|
for (const policy of modulo.policies) {
|
|
1461
1574
|
validarSuperficie(policy, "policy", tasksConhecidas, tiposConhecidos, diagnosticos);
|
|
1462
1575
|
}
|
|
1576
|
+
for (const database of modulo.databases) {
|
|
1577
|
+
validarDatabase(database, diagnosticos);
|
|
1578
|
+
}
|
|
1463
1579
|
validarGuardrailsSeguranca(modulo, diagnosticos);
|
|
1464
1580
|
const assinaturasRoute = new Map();
|
|
1465
1581
|
for (const route of modulo.routes) {
|