@neetru/sdk 1.2.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/CHANGELOG.md +284 -244
  2. package/README.md +194 -194
  3. package/dist/auth.cjs +3740 -345
  4. package/dist/auth.cjs.map +1 -1
  5. package/dist/auth.d.cts +5 -1
  6. package/dist/auth.d.ts +5 -1
  7. package/dist/auth.mjs +3740 -345
  8. package/dist/auth.mjs.map +1 -1
  9. package/dist/catalog.cjs.map +1 -1
  10. package/dist/catalog.d.cts +5 -1
  11. package/dist/catalog.d.ts +5 -1
  12. package/dist/catalog.mjs.map +1 -1
  13. package/dist/checkout.cjs.map +1 -1
  14. package/dist/checkout.d.cts +5 -1
  15. package/dist/checkout.d.ts +5 -1
  16. package/dist/checkout.mjs.map +1 -1
  17. package/dist/collection-ref-BBvTTXoG.d.cts +423 -0
  18. package/dist/collection-ref-BBvTTXoG.d.ts +423 -0
  19. package/dist/db-react.cjs +136 -0
  20. package/dist/db-react.cjs.map +1 -0
  21. package/dist/db-react.d.cts +99 -0
  22. package/dist/db-react.d.ts +99 -0
  23. package/dist/db-react.mjs +112 -0
  24. package/dist/db-react.mjs.map +1 -0
  25. package/dist/db.cjs +3599 -131
  26. package/dist/db.cjs.map +1 -1
  27. package/dist/db.d.cts +5 -8
  28. package/dist/db.d.ts +5 -8
  29. package/dist/db.mjs +3596 -131
  30. package/dist/db.mjs.map +1 -1
  31. package/dist/entitlements.cjs.map +1 -1
  32. package/dist/entitlements.d.cts +5 -1
  33. package/dist/entitlements.d.ts +5 -1
  34. package/dist/entitlements.mjs.map +1 -1
  35. package/dist/errors.cjs.map +1 -1
  36. package/dist/errors.mjs.map +1 -1
  37. package/dist/index.cjs +3957 -342
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.d.cts +13 -6
  40. package/dist/index.d.ts +13 -6
  41. package/dist/index.mjs +3877 -263
  42. package/dist/index.mjs.map +1 -1
  43. package/dist/mocks.cjs +183 -7
  44. package/dist/mocks.cjs.map +1 -1
  45. package/dist/mocks.d.cts +18 -5
  46. package/dist/mocks.d.ts +18 -5
  47. package/dist/mocks.mjs +183 -7
  48. package/dist/mocks.mjs.map +1 -1
  49. package/dist/notifications.cjs.map +1 -1
  50. package/dist/notifications.d.cts +5 -1
  51. package/dist/notifications.d.ts +5 -1
  52. package/dist/notifications.mjs.map +1 -1
  53. package/dist/react.cjs.map +1 -1
  54. package/dist/react.d.cts +5 -1
  55. package/dist/react.d.ts +5 -1
  56. package/dist/react.mjs.map +1 -1
  57. package/dist/support.cjs.map +1 -1
  58. package/dist/support.d.cts +5 -1
  59. package/dist/support.d.ts +5 -1
  60. package/dist/support.mjs.map +1 -1
  61. package/dist/telemetry.cjs.map +1 -1
  62. package/dist/telemetry.d.cts +5 -1
  63. package/dist/telemetry.d.ts +5 -1
  64. package/dist/telemetry.mjs.map +1 -1
  65. package/dist/types-B1jylbMC.d.ts +1364 -0
  66. package/dist/types-Kmt4y1FQ.d.cts +1364 -0
  67. package/dist/usage.cjs.map +1 -1
  68. package/dist/usage.d.cts +5 -1
  69. package/dist/usage.d.ts +5 -1
  70. package/dist/usage.mjs.map +1 -1
  71. package/dist/webhooks.cjs.map +1 -1
  72. package/dist/webhooks.d.cts +5 -1
  73. package/dist/webhooks.d.ts +5 -1
  74. package/dist/webhooks.mjs.map +1 -1
  75. package/package.json +133 -111
  76. package/dist/types-CQAfwqUS.d.cts +0 -654
  77. package/dist/types-CQAfwqUS.d.ts +0 -654
@@ -0,0 +1,423 @@
1
+ /**
2
+ * Tipos internos da camada offline do @neetru/sdk.
3
+ *
4
+ * Estes tipos SÃO internos ao módulo `db/offline/` — não fazem parte da
5
+ * superfície pública do SDK. A superfície pública é o `DbCollectionRef` e
6
+ * o `DbSnapshot` de `src/types.ts`.
7
+ *
8
+ * Derivados de:
9
+ * - I3-sdk-offline.md §3 (store schemas)
10
+ * - I3-sdk-offline.md §4 (fila de escritas)
11
+ * - I3-sdk-offline.md §5 (query descriptor)
12
+ * - I3-sdk-offline.md §7 (conflito LWW)
13
+ * - 02-sdk.md §3.2 (DbSnapshot, DbWhereFilter, DbQuery)
14
+ */
15
+ /** Identificador de um documento (string opaca). */
16
+ type DocId = string;
17
+ /** Identificador de uma mutação (UUID v4 client-generated). */
18
+ type MutationId = string;
19
+ /** Operações possíveis na fila de escritas. */
20
+ type MutationKind = 'add' | 'set' | 'update' | 'remove';
21
+ /**
22
+ * Uma mutação enfileirada (escrita durável pendente).
23
+ * Equivalente a `QueuedMutation` do I3 §3.3 (`mutations` store).
24
+ */
25
+ interface Mutation {
26
+ /** Número de sequência autoincrement — define a ordem total da fila. */
27
+ seq: number;
28
+ /** UUID v4 client-generated — chave de idempotência. */
29
+ mutationId: MutationId;
30
+ /** Nome da coleção. */
31
+ collection: string;
32
+ /** ID do documento alvo (client-gen para `add`, existente para os demais). */
33
+ docId: DocId;
34
+ /** Operação. */
35
+ op: MutationKind;
36
+ /** Dados da operação. `null` para `remove`. */
37
+ payload: Record<string, unknown> | null;
38
+ /**
39
+ * `serverVersion` que o cliente viu ao escrever.
40
+ * `null` para `add` (doc não existia) ou quando o cliente nunca sincronizou.
41
+ * Usado pelo servidor para detectar conflito (I3 §7.4).
42
+ */
43
+ baseVersion: string | null;
44
+ /** Epoch ms do relógio do CLIENTE — só para diagnóstico e ordenação local. */
45
+ enqueuedAt: number;
46
+ /** Número de tentativas de replay. */
47
+ attempts: number;
48
+ /** Último erro de replay (string). `null` se nenhuma tentativa ainda. */
49
+ lastError: string | null;
50
+ /** Estado de envio desta mutação. */
51
+ status: 'queued' | 'inflight' | 'failed';
52
+ /** Agrupa mutações de um `batch()` atômico. `null` se mutação individual. */
53
+ batchId: string | null;
54
+ }
55
+ /**
56
+ * Razão pela qual uma escrita foi descartada no LWW (I3 §3.3 `conflict_log`).
57
+ */
58
+ type ConflictReason = 'lww_server_newer' | 'rejected_permission' | 'rejected_validation';
59
+ /**
60
+ * Registro de uma escrita perdedora — gravado no `conflict_log` (I3 §3.3).
61
+ * Entregue ao produto via `onWriteResult` (status: `'superseded'`).
62
+ */
63
+ interface ConflictRecord {
64
+ id?: number;
65
+ collection: string;
66
+ docId: DocId;
67
+ mutationId: MutationId;
68
+ losingData: Record<string, unknown>;
69
+ winningData: Record<string, unknown>;
70
+ reason: ConflictReason;
71
+ detectedAt: number;
72
+ delivered: boolean;
73
+ }
74
+ /**
75
+ * Estado de sincronização da camada offline (I3 §10 / 02-sdk §3.4).
76
+ * Exposto em `client.db.syncState`.
77
+ *
78
+ * - `idle` — online e em repouso (sem sync ativo).
79
+ * - `syncing` — sync em progresso (push + pull + realtime).
80
+ * - `offline` — conexão perdida ou inexistente.
81
+ * - `error` — erro persistente após retries (reservado para uso futuro).
82
+ */
83
+ type SyncStatus = 'idle' | 'offline' | 'syncing' | 'error';
84
+ interface SyncState {
85
+ status: SyncStatus;
86
+ pendingWrites: number;
87
+ lastSyncedAt: number | null;
88
+ isLeaderTab: boolean;
89
+ }
90
+ /** Função para cancelar uma subscrição (onSnapshot, onDoc, onSyncStateChanged). */
91
+ type Unsubscribe = () => void;
92
+
93
+ /**
94
+ * SyncEngine — orquestrador da camada offline do @neetru/sdk.
95
+ *
96
+ * Implementa as 3 fases de sincronização definidas em I3 §6:
97
+ *
98
+ * FASE 1 — DRENAR A FILA (push)
99
+ * Envia mutações pendentes ao Core via SyncTransport.
100
+ * Cada mutação é marcada inflight, enviada e depois:
101
+ * - CONFIRMADA → removida da fila (markApplied)
102
+ * - SUPERADA (LWW)→ ConflictRecord gravado, cache atualizado
103
+ * - REJEITADA → resolveRejected + ConflictRecord + removida
104
+ * - FALHA TRANSIENTE → markRetry + PARA a drenagem (ordem preservada)
105
+ *
106
+ * FASE 2 — RECONCILIAR O CACHE (pull)
107
+ * Busca mudanças do servidor desde o watermark ou resume token.
108
+ * Cada documento passa pelo ConflictResolver (LWW) e é gravado no LocalStore.
109
+ * Changes são emitidos pelo ChangeBus.
110
+ * Se `resyncRequired` → aciona full resync em vez de pull incremental.
111
+ *
112
+ * FASE 3 — REABRIR LISTENERS (realtime)
113
+ * Atualiza SyncState para refletir que o cache está reconciliado.
114
+ * O ChangeBus já foi alimentado nas fases anteriores — os listeners
115
+ * ativos na camada superior (onSnapshot/onDoc) recebem snapshots frescos.
116
+ *
117
+ * Garantias:
118
+ * - SOMENTE a aba LÍDER executa o sync (TabCoordinator.isLeader()).
119
+ * - Re-entrante-safe: um sync em progresso bloqueia novos disparos.
120
+ * - Fail-closed: falha transiente retém a mutação; falha de pull não
121
+ * corrompe o cache nem o watermark.
122
+ * - Idempotente: o SyncTransport usa mutationId como chave de idempotência.
123
+ *
124
+ * O SyncTransport é INJETADO — a ligação real com o Core acontece na camada
125
+ * de adaptação, não aqui. Isso torna o SyncEngine 100% testável com fake.
126
+ */
127
+
128
+ /**
129
+ * Documento retornado pelo servidor em push/pull/resync.
130
+ */
131
+ interface ServerDoc {
132
+ collection: string;
133
+ id: string;
134
+ data: Record<string, unknown>;
135
+ serverVersion: string;
136
+ serverTimestamp: number;
137
+ /** `true` se o doc foi deletado no servidor. */
138
+ deleted: boolean;
139
+ }
140
+ /**
141
+ * Resultado individual de uma mutação enviada ao Core (FASE 1).
142
+ */
143
+ type MutationResult = {
144
+ mutationId: string;
145
+ outcome: 'confirmed';
146
+ serverVersion: string;
147
+ serverTimestamp: number;
148
+ } | {
149
+ mutationId: string;
150
+ outcome: 'superseded';
151
+ serverVersion: string;
152
+ serverTimestamp: number;
153
+ serverData: Record<string, unknown>;
154
+ } | {
155
+ mutationId: string;
156
+ outcome: 'rejected';
157
+ reason: 'rejected_permission' | 'rejected_validation';
158
+ serverVersion: string | null;
159
+ serverData: Record<string, unknown> | null;
160
+ };
161
+ /** Retorno de pushMutations. */
162
+ interface PushMutationsResult {
163
+ results: MutationResult[];
164
+ }
165
+ /** Retorno de pullChanges. */
166
+ interface PullChangesResult {
167
+ docs: ServerDoc[];
168
+ newWatermark: number | null;
169
+ /** `true` quando o resume token / watermark ficou inválido (gap grande). */
170
+ resyncRequired: boolean;
171
+ }
172
+ /** Retorno de fullResync. */
173
+ interface FullResyncResult {
174
+ docs: ServerDoc[];
175
+ newWatermark: number | null;
176
+ }
177
+ /**
178
+ * Contrato do transporte de sync — injetado no SyncEngine.
179
+ *
180
+ * A implementação real usa os endpoints `/api/sdk/v1/db/*` do Core.
181
+ * Em testes, usa-se um FakeSyncTransport.
182
+ *
183
+ * Per I3 §6:
184
+ * - `pushMutations` → FASE 1: envia mutações em ordem de seq.
185
+ * - `pullChanges` → FASE 2: busca delta desde o watermark/resumeToken.
186
+ * - `fullResync` → FASE 2 (fallback): lista completa das coleções ativas.
187
+ */
188
+ interface SyncTransport {
189
+ /**
190
+ * Envia um lote de mutações ao Core.
191
+ * O Core aplica, verifica conflito LWW e retorna um resultado por mutação.
192
+ * A ordem do array deve ser preservada (seq crescente).
193
+ */
194
+ pushMutations(mutations: Mutation[]): Promise<PushMutationsResult>;
195
+ /**
196
+ * Busca documentos modificados no servidor desde `sinceWatermark`.
197
+ * `sinceWatermark === null` indica primeiro sync (sem base conhecida).
198
+ * `resumeToken` é o token de change stream (nosql-vm); pode ser null.
199
+ *
200
+ * Retorna `resyncRequired: true` se o gap é grande demais para pull incremental.
201
+ */
202
+ pullChanges(sinceWatermark: number | null, resumeToken: string | null): Promise<PullChangesResult>;
203
+ /**
204
+ * Faz um full resync das coleções informadas.
205
+ * Retorna TODOS os documentos atuais (paginado internamente pelo transporte).
206
+ * Docs ausentes na resposta foram deletados durante o gap.
207
+ */
208
+ fullResync(collections: string[]): Promise<FullResyncResult>;
209
+ /**
210
+ * (Opcional) Registra uma subscription realtime para uma coleção específica.
211
+ *
212
+ * Implementado pelo WebSocket transport (nosql-vm): chama
213
+ * `NeetruRealtimeClient.subscribe()` e alimenta os frames delta/resync
214
+ * no `ChangeBus` da camada offline.
215
+ *
216
+ * Transportes REST e Firestore não implementam este método (undefined).
217
+ * O chamador (`DbCollectionRefImpl.onSnapshot`) verifica antes de invocar.
218
+ *
219
+ * @param collection - Nome da coleção a subscrever.
220
+ * @param onChange - Callback que recebe changes quando um delta/resync chega.
221
+ * `null` payload = resync full necessário.
222
+ * @returns Função de unsubscribe.
223
+ */
224
+ subscribeCollection?: (collection: string, onChange: (changes: Array<{
225
+ type: 'added' | 'modified' | 'removed';
226
+ docId: string;
227
+ data: Record<string, unknown> | null;
228
+ }>, needsResync: boolean) => void) => () => void;
229
+ }
230
+
231
+ /**
232
+ * DbCollectionRef — superfície de Documentos offline-first do @neetru/sdk (M2).
233
+ *
234
+ * Implementa a API pública conforme especificada em:
235
+ * - 02-sdk.md §3.2 (contrato TypeScript DbCollectionRef)
236
+ * - I2-mundo-documentos.md §3.2 (superfície dupla CRUD + realtime)
237
+ * - I3-sdk-offline.md §10 (camada offline, lifecycle, SyncState)
238
+ *
239
+ * ### Semântica de Promise de escrita (02-sdk.md §3.2 nota negrito)
240
+ * `add/set/update/remove` resolvem quando a escrita está **durável localmente**
241
+ * (cache + fila), NÃO quando o servidor confirma. Isso é offline-first por design:
242
+ * sem rede, `add()` resolve imediatamente. Para saber quando sincronizou, o produto
243
+ * observa `onWriteResult` (future / SyncEngine). A Promise só rejeita por:
244
+ * - validação síncrona (nome de coleção inválido, id vazio)
245
+ * - `offline_quota_exceeded` (IndexedDB cheio)
246
+ *
247
+ * ### Injeção do transporte realtime
248
+ * O `RealtimeTransport` é injetado via `createOfflineDocumentsNamespace({ transport })`.
249
+ * A implementação atual usa o `SyncEngine` para push/pull (sync offline ↔ servidor).
250
+ * Transportes futuros (Firestore Web SDK / WebSocket gateway) são injetados aqui —
251
+ * sem alterar a superfície pública.
252
+ */
253
+
254
+ interface DbWhereFilter {
255
+ field: string;
256
+ op: '==' | '!=' | '<' | '<=' | '>' | '>=' | 'array-contains' | 'in' | 'not-in';
257
+ value: unknown;
258
+ }
259
+ interface DbQuery {
260
+ where?: DbWhereFilter[];
261
+ orderBy?: {
262
+ field: string;
263
+ direction?: 'asc' | 'desc';
264
+ };
265
+ /** Máximo de documentos. Default 20, max 500. */
266
+ limit?: number;
267
+ /** Cursor opaco — devolvido em `DbListResult.nextCursor`. */
268
+ cursor?: string;
269
+ }
270
+ interface DbDoc<T = Record<string, unknown>> {
271
+ id: string;
272
+ data: T;
273
+ }
274
+ interface DbListResult<T = Record<string, unknown>> {
275
+ docs: DbDoc<T>[];
276
+ nextCursor: string | null;
277
+ fromCache: boolean;
278
+ stale: boolean;
279
+ hasPendingWrites: boolean;
280
+ changes: Array<{
281
+ type: 'added' | 'modified' | 'removed';
282
+ doc: DbDoc<T>;
283
+ }>;
284
+ }
285
+ interface DbGetResult<T = Record<string, unknown>> {
286
+ docs: Array<DbDoc<T>>;
287
+ fromCache: boolean;
288
+ stale: boolean;
289
+ hasPendingWrites: boolean;
290
+ changes: Array<{
291
+ type: 'added' | 'modified' | 'removed';
292
+ doc: DbDoc<T>;
293
+ }>;
294
+ }
295
+ type DbChangeType = 'added' | 'modified' | 'removed';
296
+ interface DbBatchOp {
297
+ op: 'add' | 'set' | 'update' | 'remove';
298
+ collection: string;
299
+ id?: string;
300
+ data?: Record<string, unknown>;
301
+ }
302
+ /**
303
+ * Contrato do transporte de realtime — injetado no namespace.
304
+ *
305
+ * A implementação real usa os endpoints `/api/sdk/v1/db/*` do Core.
306
+ * Em testes, usa-se um fake in-memory.
307
+ *
308
+ * Este é o **seam de injeção** que conecta a camada offline ao servidor real.
309
+ * Transportes futuros (Firestore Web SDK direto / WebSocket gateway) são
310
+ * implementados aqui, sem modificar a superfície pública `DbCollectionRef`.
311
+ */
312
+ type RealtimeTransport = SyncTransport;
313
+ /**
314
+ * Referência a um documento específico.
315
+ * Parte da superfície `DbCollectionRef.doc(id)`.
316
+ */
317
+ interface DbDocRef<T = Record<string, unknown>> {
318
+ get(): Promise<DbGetResult<T> | null>;
319
+ set(data: Omit<T, 'id'>): Promise<{
320
+ ok: true;
321
+ }>;
322
+ update(data: Partial<Omit<T, 'id'>>): Promise<{
323
+ ok: true;
324
+ }>;
325
+ remove(): Promise<{
326
+ ok: true;
327
+ }>;
328
+ onSnapshot(cb: (snap: DbGetResult<T> | null) => void): Unsubscribe;
329
+ }
330
+ /**
331
+ * Referência a uma coleção — superfície dupla CRUD + realtime.
332
+ *
333
+ * Conforme 02-sdk.md §3.2 / I2 §3.2.
334
+ */
335
+ interface DbCollectionRef<T = Record<string, unknown>> {
336
+ /** Retorna snapshot de um documento. `null` se não existir (nem no cache). */
337
+ get(id: string): Promise<DbGetResult<T> | null>;
338
+ /** Lista documentos com query opcional. */
339
+ list(q?: DbQuery): Promise<DbListResult<T>>;
340
+ /** Adiciona doc com id gerado pelo cliente (UUID v4). Durável localmente. */
341
+ add(data: Omit<T, 'id'>): Promise<{
342
+ ok: true;
343
+ id: string;
344
+ }>;
345
+ /** Cria ou sobrescreve um doc pelo id. Durável localmente. */
346
+ set(id: string, data: Omit<T, 'id'>): Promise<{
347
+ ok: true;
348
+ }>;
349
+ /** Atualiza campos de um doc (merge). Durável localmente. */
350
+ update(id: string, data: Partial<Omit<T, 'id'>>): Promise<{
351
+ ok: true;
352
+ }>;
353
+ /** Remove um doc (tombstone local). Durável localmente. */
354
+ remove(id: string): Promise<{
355
+ ok: true;
356
+ }>;
357
+ /** Aplica múltiplas operações atomicamente na fila. */
358
+ batch(ops: DbBatchOp[]): Promise<{
359
+ ok: true;
360
+ }>;
361
+ /** Escuta um documento específico. */
362
+ onDoc(id: string, cb: (doc: T | null) => void): Unsubscribe;
363
+ /** Escuta a coleção inteira (ou subconjunto via query). */
364
+ onSnapshot(q: DbQuery | undefined, cb: (snap: DbListResult<T>) => void): Unsubscribe;
365
+ /** Retorna uma referência ao documento `id`. */
366
+ doc(id: string): DbDocRef<T>;
367
+ }
368
+ /**
369
+ * Namespace `db.documents` — ponto de entrada para coleções de documentos.
370
+ *
371
+ * Analogia a `NeetruDb` de 02-sdk.md §3.1 mas escoped para o Mundo Documentos.
372
+ */
373
+ interface NeetruDbDocuments {
374
+ collection<T = Record<string, unknown>>(name: string): DbCollectionRef<T>;
375
+ /** Estado atual de sincronização (offline/online/syncing). */
376
+ readonly syncState: SyncState;
377
+ onSyncStateChanged(cb: (s: SyncState) => void): Unsubscribe;
378
+ /** Força flush da fila de mutações pendentes. */
379
+ flush(): Promise<void>;
380
+ /** Limpa o cache local (IndexedDB) — operação destrutiva. */
381
+ clearCache(): Promise<void>;
382
+ /**
383
+ * Retorna os registros do log de conflitos LWW gravados pelo SyncEngine.
384
+ * Um conflito ocorre quando a mutação local é descartada porque o servidor
385
+ * já avançou a versão do documento (Last-Write-Wins).
386
+ */
387
+ getConflicts(): Promise<ConflictRecord[]>;
388
+ }
389
+ interface CreateOfflineDocumentsOptions {
390
+ /**
391
+ * Nome do banco IndexedDB — deve ser único por produto × dbId × env.
392
+ * Convenção: `neetru-db__{productSlug}__{dbId}__{env}`.
393
+ */
394
+ dbName: string;
395
+ /**
396
+ * Transporte de sync — implementa `SyncTransport` do SyncEngine.
397
+ * Este é o **seam de injeção** do transporte real.
398
+ *
399
+ * Implementações possíveis:
400
+ * - `RestSyncTransport` — REST → Core (padrão em staging/prod)
401
+ * - `FirestoreRealtimeTransport` — Firestore Web SDK direto (engine=firestore)
402
+ * - `WebSocketTransport` — WebSocket → gateway (engine=nosql-vm)
403
+ * - `FakeRealtimeTransport` — in-memory (testes)
404
+ */
405
+ transport: RealtimeTransport;
406
+ /**
407
+ * Estado inicial de conectividade.
408
+ * Default: `navigator.onLine` se disponível, senão `true`.
409
+ */
410
+ startOnline?: boolean;
411
+ /**
412
+ * `true` = sem contenção multi-aba (sempre líder).
413
+ * Padrão em testes; em produção usa Web Locks.
414
+ */
415
+ singleTab?: boolean;
416
+ /**
417
+ * Intervalo do sync periódico em ms. `0` desativa.
418
+ * Default: 5 * 60 * 1000 (5min).
419
+ */
420
+ periodicSyncIntervalMs?: number;
421
+ }
422
+
423
+ export type { ConflictRecord as C, DbBatchOp as D, NeetruDbDocuments as N, RealtimeTransport as R, SyncState as S, Unsubscribe as U, CreateOfflineDocumentsOptions as a, DbChangeType as b, DbCollectionRef as c, DbDoc as d, DbDocRef as e, DbGetResult as f, DbListResult as g, DbQuery as h, DbWhereFilter as i };