@semacode/cli 1.5.31 → 1.5.34

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 (160) hide show
  1. package/AGENTS.md +308 -0
  2. package/AGENT_CONTEXT_PACK.json +288 -0
  3. package/LICENSE +22 -0
  4. package/README.md +85 -144
  5. package/SEMA_BRIEF.curto.txt +11 -0
  6. package/SEMA_BRIEF.md +617 -0
  7. package/SEMA_BRIEF.micro.txt +9 -0
  8. package/SEMA_INDEX.json +9805 -0
  9. package/dist/billing/index.d.ts +46 -0
  10. package/dist/billing/index.js +143 -0
  11. package/dist/billing/index.js.map +1 -0
  12. package/dist/controleComercialSupabase.d.ts +7 -0
  13. package/dist/controleComercialSupabase.js +6 -0
  14. package/dist/controleComercialSupabase.js.map +1 -0
  15. package/dist/controleComercialSupabaseAdmin.d.ts +7 -0
  16. package/dist/controleComercialSupabaseAdmin.js +138 -0
  17. package/dist/controleComercialSupabaseAdmin.js.map +1 -0
  18. package/dist/controleComercialSupabaseCadastro.d.ts +4 -0
  19. package/dist/controleComercialSupabaseCadastro.js +85 -0
  20. package/dist/controleComercialSupabaseCadastro.js.map +1 -0
  21. package/dist/controleComercialSupabaseConstantes.d.ts +28 -0
  22. package/dist/controleComercialSupabaseConstantes.js +44 -0
  23. package/dist/controleComercialSupabaseConstantes.js.map +1 -0
  24. package/dist/controleComercialSupabaseConsumo.d.ts +2 -0
  25. package/dist/controleComercialSupabaseConsumo.js +77 -0
  26. package/dist/controleComercialSupabaseConsumo.js.map +1 -0
  27. package/dist/controleComercialSupabaseConta.d.ts +11 -0
  28. package/dist/controleComercialSupabaseConta.js +157 -0
  29. package/dist/controleComercialSupabaseConta.js.map +1 -0
  30. package/dist/controleComercialSupabaseProfiles.d.ts +4 -0
  31. package/dist/controleComercialSupabaseProfiles.js +55 -0
  32. package/dist/controleComercialSupabaseProfiles.js.map +1 -0
  33. package/dist/controleComercialSupabaseTipos.d.ts +3 -0
  34. package/dist/controleComercialSupabaseTipos.js +2 -0
  35. package/dist/controleComercialSupabaseTipos.js.map +1 -0
  36. package/dist/controleComercialSupabaseTiposAdmin.d.ts +152 -0
  37. package/dist/controleComercialSupabaseTiposAdmin.js +2 -0
  38. package/dist/controleComercialSupabaseTiposAdmin.js.map +1 -0
  39. package/dist/controleComercialSupabaseTiposBase.d.ts +169 -0
  40. package/dist/controleComercialSupabaseTiposBase.js +2 -0
  41. package/dist/controleComercialSupabaseTiposBase.js.map +1 -0
  42. package/dist/controleComercialSupabaseTiposConta.d.ts +220 -0
  43. package/dist/controleComercialSupabaseTiposConta.js +2 -0
  44. package/dist/controleComercialSupabaseTiposConta.js.map +1 -0
  45. package/dist/docs.js +72 -5
  46. package/dist/docs.js.map +1 -1
  47. package/dist/index.js +701 -185
  48. package/dist/index.js.map +1 -1
  49. package/dist/runnerValidacaoRemota.d.ts +9 -0
  50. package/dist/runnerValidacaoRemota.js +9 -0
  51. package/dist/runnerValidacaoRemota.js.map +1 -0
  52. package/dist/runnerValidacaoRemotaBateria.d.ts +10 -0
  53. package/dist/runnerValidacaoRemotaBateria.js +115 -0
  54. package/dist/runnerValidacaoRemotaBateria.js.map +1 -0
  55. package/dist/runnerValidacaoRemotaCli.d.ts +4 -0
  56. package/dist/runnerValidacaoRemotaCli.js +86 -0
  57. package/dist/runnerValidacaoRemotaCli.js.map +1 -0
  58. package/dist/runnerValidacaoRemotaComandos.d.ts +7 -0
  59. package/dist/runnerValidacaoRemotaComandos.js +123 -0
  60. package/dist/runnerValidacaoRemotaComandos.js.map +1 -0
  61. package/dist/runnerValidacaoRemotaEscopo.d.ts +4 -0
  62. package/dist/runnerValidacaoRemotaEscopo.js +79 -0
  63. package/dist/runnerValidacaoRemotaEscopo.js.map +1 -0
  64. package/dist/runnerValidacaoRemotaExecucao.d.ts +2 -0
  65. package/dist/runnerValidacaoRemotaExecucao.js +102 -0
  66. package/dist/runnerValidacaoRemotaExecucao.js.map +1 -0
  67. package/dist/runnerValidacaoRemotaRelatorio.d.ts +3 -0
  68. package/dist/runnerValidacaoRemotaRelatorio.js +93 -0
  69. package/dist/runnerValidacaoRemotaRelatorio.js.map +1 -0
  70. package/dist/runnerValidacaoRemotaServidor.d.ts +3 -0
  71. package/dist/runnerValidacaoRemotaServidor.js +157 -0
  72. package/dist/runnerValidacaoRemotaServidor.js.map +1 -0
  73. package/dist/runnerValidacaoRemotaSnapshot.d.ts +10 -0
  74. package/dist/runnerValidacaoRemotaSnapshot.js +217 -0
  75. package/dist/runnerValidacaoRemotaSnapshot.js.map +1 -0
  76. package/dist/runnerValidacaoRemotaTipos.d.ts +158 -0
  77. package/dist/runnerValidacaoRemotaTipos.js +35 -0
  78. package/dist/runnerValidacaoRemotaTipos.js.map +1 -0
  79. package/dist/runnerValidacaoRemotaUtil.d.ts +3 -0
  80. package/dist/runnerValidacaoRemotaUtil.js +18 -0
  81. package/dist/runnerValidacaoRemotaUtil.js.map +1 -0
  82. package/dist/runnerValidacaoRemotaWorkspace.d.ts +2 -0
  83. package/dist/runnerValidacaoRemotaWorkspace.js +110 -0
  84. package/dist/runnerValidacaoRemotaWorkspace.js.map +1 -0
  85. package/docs/AGENT_STARTER.md +109 -0
  86. package/docs/agentes-por-capacidade.md +42 -0
  87. package/docs/api.md +82 -0
  88. package/docs/cli.md +93 -0
  89. package/docs/como-ensinar-a-sema-para-ia.md +30 -0
  90. package/docs/deploy.md +45 -0
  91. package/docs/documentacao.md +88 -0
  92. package/docs/env.md +115 -0
  93. package/docs/extensao-vscode.md +42 -0
  94. package/docs/fluxo-pratico-ia-sema.md +195 -0
  95. package/docs/instalacao-e-primeiro-uso.md +48 -0
  96. package/docs/integracao-com-ia.md +38 -0
  97. package/docs/mcp.md +54 -0
  98. package/docs/pagamento-ponta-a-ponta.md +171 -0
  99. package/docs/persistencia-vendor-first.md +151 -0
  100. package/docs/prompt-base-ia-sema.md +111 -0
  101. package/docs/repositories.md +69 -0
  102. package/docs/rollback.md +24 -0
  103. package/docs/seguranca.md +126 -0
  104. package/docs/sintaxe.md +218 -0
  105. package/exemplos/profile_conversas.sema +165 -0
  106. package/llms-full.txt +35 -0
  107. package/llms.txt +18 -0
  108. package/node_modules/@sema/gerador-css/package.json +7 -14
  109. package/node_modules/@sema/gerador-dart/package.json +7 -14
  110. package/node_modules/@sema/gerador-html/package.json +7 -14
  111. package/node_modules/@sema/gerador-javascript/package.json +7 -14
  112. package/node_modules/@sema/gerador-lua/package.json +7 -14
  113. package/node_modules/@sema/gerador-python/package.json +7 -14
  114. package/node_modules/@sema/gerador-typescript/package.json +7 -14
  115. package/node_modules/@sema/nucleo/package.json +7 -10
  116. package/node_modules/@sema/padroes/package.json +7 -10
  117. package/package.json +75 -74
  118. package/exemplos/.prepack-generated +0 -1
  119. package/node_modules/@sema/gerador-css/src/index.ts +0 -605
  120. package/node_modules/@sema/gerador-css/tsconfig.json +0 -13
  121. package/node_modules/@sema/gerador-css/tsconfig.tsbuildinfo +0 -1
  122. package/node_modules/@sema/gerador-dart/src/index.ts +0 -52
  123. package/node_modules/@sema/gerador-dart/tsconfig.json +0 -13
  124. package/node_modules/@sema/gerador-dart/tsconfig.tsbuildinfo +0 -1
  125. package/node_modules/@sema/gerador-html/src/index.ts +0 -185
  126. package/node_modules/@sema/gerador-html/tsconfig.json +0 -13
  127. package/node_modules/@sema/gerador-html/tsconfig.tsbuildinfo +0 -1
  128. package/node_modules/@sema/gerador-javascript/src/index.ts +0 -461
  129. package/node_modules/@sema/gerador-javascript/tsconfig.json +0 -13
  130. package/node_modules/@sema/gerador-javascript/tsconfig.tsbuildinfo +0 -1
  131. package/node_modules/@sema/gerador-lua/src/index.ts +0 -359
  132. package/node_modules/@sema/gerador-lua/tsconfig.json +0 -13
  133. package/node_modules/@sema/gerador-lua/tsconfig.tsbuildinfo +0 -1
  134. package/node_modules/@sema/gerador-python/src/index.ts +0 -850
  135. package/node_modules/@sema/gerador-python/tsconfig.json +0 -13
  136. package/node_modules/@sema/gerador-python/tsconfig.tsbuildinfo +0 -1
  137. package/node_modules/@sema/gerador-typescript/src/index.ts +0 -876
  138. package/node_modules/@sema/gerador-typescript/tsconfig.json +0 -13
  139. package/node_modules/@sema/gerador-typescript/tsconfig.tsbuildinfo +0 -1
  140. package/node_modules/@sema/nucleo/src/ast/tipos.ts +0 -207
  141. package/node_modules/@sema/nucleo/src/diagnosticos/index.ts +0 -43
  142. package/node_modules/@sema/nucleo/src/diagnosticos/melhorador.ts +0 -130
  143. package/node_modules/@sema/nucleo/src/formatador/index.ts +0 -530
  144. package/node_modules/@sema/nucleo/src/index.ts +0 -184
  145. package/node_modules/@sema/nucleo/src/ir/conversor.ts +0 -1037
  146. package/node_modules/@sema/nucleo/src/ir/modelos.ts +0 -403
  147. package/node_modules/@sema/nucleo/src/lexer/lexer.ts +0 -166
  148. package/node_modules/@sema/nucleo/src/lexer/tokens.ts +0 -79
  149. package/node_modules/@sema/nucleo/src/parser/gramatica.ebnf +0 -41
  150. package/node_modules/@sema/nucleo/src/parser/parser.ts +0 -936
  151. package/node_modules/@sema/nucleo/src/persistencia/contratos.ts +0 -379
  152. package/node_modules/@sema/nucleo/src/semantico/analisador.ts +0 -3126
  153. package/node_modules/@sema/nucleo/src/semantico/estruturas.ts +0 -665
  154. package/node_modules/@sema/nucleo/src/semantico/seguranca.ts +0 -362
  155. package/node_modules/@sema/nucleo/src/util/arquivos.ts +0 -28
  156. package/node_modules/@sema/nucleo/tsconfig.json +0 -9
  157. package/node_modules/@sema/nucleo/tsconfig.tsbuildinfo +0 -1
  158. package/node_modules/@sema/padroes/src/index.ts +0 -382
  159. package/node_modules/@sema/padroes/tsconfig.json +0 -9
  160. package/node_modules/@sema/padroes/tsconfig.tsbuildinfo +0 -1
@@ -1,379 +0,0 @@
1
- import type { BlocoGenericoAst, CampoAst } from "../ast/tipos.js";
2
-
3
- export type EngineBanco = "postgres" | "mysql" | "sqlite" | "mongodb" | "redis";
4
- export type TipoRecursoPersistencia =
5
- | "table"
6
- | "view"
7
- | "query"
8
- | "transaction"
9
- | "index"
10
- | "constraint"
11
- | "relationship"
12
- | "collection"
13
- | "document"
14
- | "keyspace"
15
- | "stream"
16
- | "lock"
17
- | "retention"
18
- | "replication";
19
- export type StatusCompatibilidadePersistencia = "nativo" | "adaptado" | "parcial" | "invalido";
20
- export type ConsistenciaPersistencia = "eventual" | "forte" | "serializable" | "snapshot" | "causal";
21
- export type DurabilidadePersistencia = "baixa" | "media" | "alta";
22
- export type ModeloTransacaoPersistencia = "mvcc" | "bloqueio" | "documento" | "otimista" | "single_thread";
23
- export type ModeloConsultaPersistencia = "sql" | "documento" | "chave_valor" | "pipeline" | "stream";
24
-
25
- export interface CompatibilidadePersistencia {
26
- engine: EngineBanco;
27
- status: StatusCompatibilidadePersistencia;
28
- motivo: string;
29
- }
30
-
31
- export const ENGINES_BANCO_SUPORTADOS = new Set<EngineBanco>([
32
- "postgres",
33
- "mysql",
34
- "sqlite",
35
- "mongodb",
36
- "redis",
37
- ]);
38
-
39
- export const TIPOS_RECURSO_PERSISTENCIA = new Set<TipoRecursoPersistencia>([
40
- "table",
41
- "view",
42
- "query",
43
- "transaction",
44
- "index",
45
- "constraint",
46
- "relationship",
47
- "collection",
48
- "document",
49
- "keyspace",
50
- "stream",
51
- "lock",
52
- "retention",
53
- "replication",
54
- ]);
55
-
56
- export const CAMPOS_DATABASE_SUPORTADOS = new Set([
57
- "engine",
58
- "schema",
59
- "database",
60
- "consistency",
61
- "durability",
62
- "transaction_model",
63
- "query_model",
64
- "portavel",
65
- "adapter",
66
- "perfil",
67
- "compatibilidade",
68
- ]);
69
-
70
- export const CAMPOS_RECURSO_PERSISTENCIA_SUPORTADOS = new Set([
71
- "entity",
72
- "consistency",
73
- "durability",
74
- "transaction_model",
75
- "query_model",
76
- "portavel",
77
- "mode",
78
- "isolation",
79
- "strategy",
80
- "ttl",
81
- "retention",
82
- "path",
83
- "from",
84
- "to",
85
- "surface",
86
- "adapter",
87
- "resource_kind",
88
- "collection",
89
- "table",
90
- "compatibilidade",
91
- ]);
92
-
93
- const CONSISTENCIAS_SUPORTADAS = new Set<ConsistenciaPersistencia>([
94
- "eventual",
95
- "forte",
96
- "serializable",
97
- "snapshot",
98
- "causal",
99
- ]);
100
-
101
- const DURABILIDADES_SUPORTADAS = new Set<DurabilidadePersistencia>([
102
- "baixa",
103
- "media",
104
- "alta",
105
- ]);
106
-
107
- const MODELOS_TRANSACAO_SUPORTADOS = new Set<ModeloTransacaoPersistencia>([
108
- "mvcc",
109
- "bloqueio",
110
- "documento",
111
- "otimista",
112
- "single_thread",
113
- ]);
114
-
115
- const MODELOS_CONSULTA_SUPORTADOS = new Set<ModeloConsultaPersistencia>([
116
- "sql",
117
- "documento",
118
- "chave_valor",
119
- "pipeline",
120
- "stream",
121
- ]);
122
-
123
- export function valorCampoCompletoPersistencia(campo?: CampoAst): string | undefined {
124
- if (!campo) {
125
- return undefined;
126
- }
127
- return [campo.valor, ...campo.modificadores].join(" ").trim() || undefined;
128
- }
129
-
130
- export function localizarCampoPersistencia(bloco: BlocoGenericoAst | undefined, ...nomes: string[]): CampoAst | undefined {
131
- return bloco?.campos.find((campo) => nomes.includes(campo.nome));
132
- }
133
-
134
- export function parsearBooleanoPersistencia(valor?: string): boolean | undefined {
135
- if (!valor) {
136
- return undefined;
137
- }
138
- const normalizado = valor.toLowerCase();
139
- if (normalizado === "verdadeiro" || normalizado === "true") {
140
- return true;
141
- }
142
- if (normalizado === "falso" || normalizado === "false") {
143
- return false;
144
- }
145
- return undefined;
146
- }
147
-
148
- export function normalizarEngineBanco(valor?: string): EngineBanco | undefined {
149
- switch ((valor ?? "").toLowerCase()) {
150
- case "postgres":
151
- case "postgresql":
152
- return "postgres";
153
- case "mysql":
154
- return "mysql";
155
- case "sqlite":
156
- case "sqlite3":
157
- return "sqlite";
158
- case "mongo":
159
- case "mongodb":
160
- return "mongodb";
161
- case "redis":
162
- return "redis";
163
- default:
164
- return undefined;
165
- }
166
- }
167
-
168
- export function normalizarConsistenciaPersistencia(valor?: string): ConsistenciaPersistencia | undefined {
169
- if (!valor) {
170
- return undefined;
171
- }
172
- const normalizado = valor.toLowerCase() as ConsistenciaPersistencia;
173
- return CONSISTENCIAS_SUPORTADAS.has(normalizado) ? normalizado : undefined;
174
- }
175
-
176
- export function normalizarDurabilidadePersistencia(valor?: string): DurabilidadePersistencia | undefined {
177
- if (!valor) {
178
- return undefined;
179
- }
180
- const normalizado = valor.toLowerCase() as DurabilidadePersistencia;
181
- return DURABILIDADES_SUPORTADAS.has(normalizado) ? normalizado : undefined;
182
- }
183
-
184
- export function normalizarModeloTransacaoPersistencia(valor?: string): ModeloTransacaoPersistencia | undefined {
185
- if (!valor) {
186
- return undefined;
187
- }
188
- const normalizado = valor.toLowerCase() as ModeloTransacaoPersistencia;
189
- return MODELOS_TRANSACAO_SUPORTADOS.has(normalizado) ? normalizado : undefined;
190
- }
191
-
192
- export function normalizarModeloConsultaPersistencia(valor?: string): ModeloConsultaPersistencia | undefined {
193
- if (!valor) {
194
- return undefined;
195
- }
196
- const normalizado = valor.toLowerCase() as ModeloConsultaPersistencia;
197
- return MODELOS_CONSULTA_SUPORTADOS.has(normalizado) ? normalizado : undefined;
198
- }
199
-
200
- export function nomeTipoRecursoPersistencia(bloco: BlocoGenericoAst): TipoRecursoPersistencia | undefined {
201
- const candidato = (
202
- bloco.palavraChave === "desconhecido"
203
- ? bloco.nome
204
- : bloco.palavraChave
205
- )?.toLowerCase();
206
-
207
- if (!candidato) {
208
- return undefined;
209
- }
210
-
211
- return TIPOS_RECURSO_PERSISTENCIA.has(candidato as TipoRecursoPersistencia)
212
- ? candidato as TipoRecursoPersistencia
213
- : undefined;
214
- }
215
-
216
- export function listarRecursosPersistencia(bloco: BlocoGenericoAst | undefined): BlocoGenericoAst[] {
217
- if (!bloco) {
218
- return [];
219
- }
220
- return bloco.blocos.filter((item): item is BlocoGenericoAst =>
221
- item.tipo === "bloco_generico" && Boolean(nomeTipoRecursoPersistencia(item)));
222
- }
223
-
224
- function compatibilidadeBasica(
225
- engine: EngineBanco,
226
- status: StatusCompatibilidadePersistencia,
227
- motivo: string,
228
- ): CompatibilidadePersistencia {
229
- return { engine, status, motivo };
230
- }
231
-
232
- function classificarCompatibilidadePorTipo(
233
- tipo: TipoRecursoPersistencia,
234
- engine: EngineBanco,
235
- ): CompatibilidadePersistencia {
236
- switch (tipo) {
237
- case "table":
238
- case "view":
239
- if (engine === "postgres" || engine === "mysql" || engine === "sqlite") {
240
- return compatibilidadeBasica(engine, "nativo", `${tipo} e nativo em motores relacionais.`);
241
- }
242
- return compatibilidadeBasica(engine, "invalido", `${tipo} nao existe como primitivo em ${engine}.`);
243
- case "query":
244
- if (engine === "postgres" || engine === "mysql" || engine === "sqlite" || engine === "mongodb") {
245
- return compatibilidadeBasica(engine, "nativo", `query e suportado de forma nativa em ${engine}.`);
246
- }
247
- return compatibilidadeBasica(engine, "parcial", "Redis consulta dados, mas a expressividade depende da estrutura escolhida.");
248
- case "transaction":
249
- if (engine === "postgres" || engine === "mysql" || engine === "sqlite") {
250
- return compatibilidadeBasica(engine, "nativo", "Transacao ACID e parte do contrato principal do engine.");
251
- }
252
- if (engine === "mongodb") {
253
- return compatibilidadeBasica(engine, "parcial", "MongoDB suporta transacoes, mas com restricoes operacionais e de topologia.");
254
- }
255
- return compatibilidadeBasica(engine, "invalido", "Redis nao oferece transacao de banco relacional como primitivo equivalente.");
256
- case "index":
257
- if (engine === "postgres" || engine === "mysql" || engine === "sqlite" || engine === "mongodb") {
258
- return compatibilidadeBasica(engine, "nativo", "Indexacao e um recurso nativo do engine.");
259
- }
260
- return compatibilidadeBasica(engine, "parcial", "Redis indexa via modulos/estrategias especificas, nao como indice generico universal.");
261
- case "constraint":
262
- if (engine === "postgres" || engine === "mysql") {
263
- return compatibilidadeBasica(engine, "nativo", "Constraints fazem parte do contrato relacional do engine.");
264
- }
265
- if (engine === "sqlite") {
266
- return compatibilidadeBasica(engine, "parcial", "SQLite suporta constraints, mas com escopo e enforcement mais limitados.");
267
- }
268
- return compatibilidadeBasica(engine, "invalido", `Constraint relacional nao e nativo em ${engine}.`);
269
- case "relationship":
270
- if (engine === "postgres" || engine === "mysql" || engine === "sqlite") {
271
- return compatibilidadeBasica(engine, "nativo", "Relacionamentos por chave e join sao nativos em motores relacionais.");
272
- }
273
- if (engine === "mongodb") {
274
- return compatibilidadeBasica(engine, "adaptado", "MongoDB modela relacionamento por referencia ou embutimento.");
275
- }
276
- return compatibilidadeBasica(engine, "invalido", "Redis nao modela relacionamento com garantias relacionais nativas.");
277
- case "collection":
278
- return engine === "mongodb"
279
- ? compatibilidadeBasica(engine, "nativo", "Collection e o recurso estrutural principal do MongoDB.")
280
- : compatibilidadeBasica(engine, "invalido", `Collection nao e recurso estrutural nativo de ${engine}.`);
281
- case "document":
282
- if (engine === "mongodb") {
283
- return compatibilidadeBasica(engine, "nativo", "Documentos sao o recurso central do MongoDB.");
284
- }
285
- if (engine === "postgres" || engine === "mysql" || engine === "sqlite") {
286
- return compatibilidadeBasica(engine, "adaptado", "Documentos podem ser modelados sobre JSON ou blobs estruturados.");
287
- }
288
- return compatibilidadeBasica(engine, "parcial", "Redis suporta documentos por modulos, mas nao como baseline universal.");
289
- case "keyspace":
290
- return engine === "redis"
291
- ? compatibilidadeBasica(engine, "nativo", "Keyspace e o modelo estrutural primario do Redis.")
292
- : compatibilidadeBasica(engine, "invalido", `Keyspace nao e primitivo nativo em ${engine}.`);
293
- case "stream":
294
- if (engine === "redis") {
295
- return compatibilidadeBasica(engine, "nativo", "Streams sao nativos em Redis.");
296
- }
297
- if (engine === "postgres" || engine === "mysql") {
298
- return compatibilidadeBasica(engine, "adaptado", "Stream exige adaptacao sobre log, outbox ou fila auxiliar.");
299
- }
300
- if (engine === "mongodb") {
301
- return compatibilidadeBasica(engine, "parcial", "MongoDB oferece change streams, mas nao um stream geral identico.");
302
- }
303
- return compatibilidadeBasica(engine, "invalido", "SQLite nao oferece stream nativo comparavel.");
304
- case "lock":
305
- if (engine === "postgres" || engine === "mysql") {
306
- return compatibilidadeBasica(engine, "nativo", "Locks e concorrencia controlada sao nativos do engine.");
307
- }
308
- if (engine === "sqlite" || engine === "mongodb") {
309
- return compatibilidadeBasica(engine, "parcial", "O engine controla concorrencia, mas com semantica diferente de lock explicito relacional.");
310
- }
311
- return compatibilidadeBasica(engine, "adaptado", "Redis consegue coordenar lock, mas por convencao e nao por contrato relacional.");
312
- case "retention":
313
- if (engine === "redis" || engine === "mongodb") {
314
- return compatibilidadeBasica(engine, "nativo", "Retencao/TTL faz parte do repertorio nativo do engine.");
315
- }
316
- return compatibilidadeBasica(engine, "adaptado", "Retencao exige politica auxiliar, cleanup agendado ou particionamento.");
317
- case "replication":
318
- if (engine === "sqlite") {
319
- return compatibilidadeBasica(engine, "invalido", "SQLite nao trata replicacao como capacidade nativa principal.");
320
- }
321
- return compatibilidadeBasica(engine, "nativo", "Replicacao e tratada como capacidade oficial do engine ou da plataforma gerenciada.");
322
- default:
323
- return compatibilidadeBasica(engine, "invalido", `Recurso ${tipo} ainda nao foi classificado para ${engine}.`);
324
- }
325
- }
326
-
327
- export function classificarCompatibilidadePersistencia(
328
- tipo: TipoRecursoPersistencia,
329
- engine: EngineBanco,
330
- opcoes: {
331
- mode?: string;
332
- isolation?: string;
333
- } = {},
334
- ): CompatibilidadePersistencia {
335
- const compatibilidade = classificarCompatibilidadePorTipo(tipo, engine);
336
-
337
- if (tipo === "query") {
338
- const modo = normalizarModeloConsultaPersistencia(opcoes.mode);
339
- if (modo === "sql" && (engine === "mongodb" || engine === "redis")) {
340
- return compatibilidadeBasica(engine, "invalido", `Query em modo sql nao e nativo em ${engine}.`);
341
- }
342
- if (modo === "documento" && (engine === "postgres" || engine === "mysql" || engine === "sqlite")) {
343
- return compatibilidadeBasica(engine, "adaptado", `Query documental em ${engine} depende de JSON e adaptacao do runtime.`);
344
- }
345
- if (modo === "pipeline" && engine !== "mongodb") {
346
- return compatibilidadeBasica(engine, engine === "redis" ? "parcial" : "invalido", `Pipeline foi pedido, mas ${engine} nao tem pipeline documental nativo equivalente ao MongoDB.`);
347
- }
348
- if (modo === "stream" && engine !== "redis") {
349
- return compatibilidadeBasica(engine, compatibilidade.status === "nativo" ? "adaptado" : compatibilidade.status, `Query orientada a stream em ${engine} exige adaptacao fora do baseline do engine.`);
350
- }
351
- }
352
-
353
- if (tipo === "transaction" && opcoes.isolation && (engine === "mongodb" || engine === "redis")) {
354
- return compatibilidadeBasica(engine, "invalido", `Transaction com isolation explicita nao e suportada de forma equivalente em ${engine}.`);
355
- }
356
-
357
- return compatibilidade;
358
- }
359
-
360
- export function matrizCompatibilidadePersistencia(
361
- tipo: TipoRecursoPersistencia,
362
- opcoes: {
363
- mode?: string;
364
- isolation?: string;
365
- } = {},
366
- ): CompatibilidadePersistencia[] {
367
- return [...ENGINES_BANCO_SUPORTADOS].map((engine) => classificarCompatibilidadePersistencia(tipo, engine, opcoes));
368
- }
369
-
370
- export function recursoPersistenciaPodeSerPortavel(
371
- tipo: TipoRecursoPersistencia,
372
- opcoes: {
373
- mode?: string;
374
- isolation?: string;
375
- } = {},
376
- ): boolean {
377
- return matrizCompatibilidadePersistencia(tipo, opcoes)
378
- .every((item) => item.status === "nativo" || item.status === "adaptado");
379
- }