@neetru/sdk 2.3.2 → 2.3.3
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/CHANGELOG.md +9 -0
- package/dist/auth.cjs.map +1 -1
- package/dist/auth.mjs.map +1 -1
- package/dist/index.cjs +6 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +6 -0
- package/dist/index.mjs.map +1 -1
- package/dist/mocks.cjs +6 -0
- package/dist/mocks.cjs.map +1 -1
- package/dist/mocks.mjs +6 -0
- package/dist/mocks.mjs.map +1 -1
- package/package.json +1 -1
package/dist/mocks.cjs
CHANGED
|
@@ -510,6 +510,12 @@ var MockDb = class {
|
|
|
510
510
|
const adapters = memDb.adapters.createPg();
|
|
511
511
|
const PoolCtor = adapters.Pool;
|
|
512
512
|
const pool = new PoolCtor();
|
|
513
|
+
const existingTypes = pool.types;
|
|
514
|
+
if (!existingTypes || typeof existingTypes.getTypeParser !== "function") {
|
|
515
|
+
pool.types = {
|
|
516
|
+
getTypeParser: () => (val) => val
|
|
517
|
+
};
|
|
518
|
+
}
|
|
513
519
|
const orm = drizzlePg.drizzle(pool, { schema });
|
|
514
520
|
return {
|
|
515
521
|
orm,
|
package/dist/mocks.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/db-errors.ts","../src/mocks.ts"],"names":[],"mappings":"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","file":"mocks.cjs","sourcesContent":["/**\r\n * Erros tipados do SDK.\r\n *\r\n * Todo erro lançado pelo SDK estende `NeetruError` — caller pode discriminar\r\n * por `.code` (string estável) sem parsing de message.\r\n */\r\n\r\n/** Códigos de erro estáveis do SDK. Adicionar aqui requer minor bump. */\r\nexport type NeetruErrorCode =\r\n | 'invalid_config'\r\n | 'missing_api_key'\r\n | 'unauthorized'\r\n | 'forbidden'\r\n | 'not_found'\r\n | 'rate_limited'\r\n | 'validation_failed'\r\n | 'network_error'\r\n | 'invalid_response'\r\n | 'server_error'\r\n | 'token_expired'\r\n | 'token_invalid_signature'\r\n | 'token_invalid_audience'\r\n | 'token_invalid_issuer'\r\n | 'unknown';\r\n\r\n/**\r\n * Erro tipado padrão do SDK. Sempre lançado em vez de Error genérico.\r\n *\r\n * @example\r\n * ```ts\r\n * try { await client.catalog.list(); }\r\n * catch (e) {\r\n * if (e instanceof NeetruError && e.code === 'rate_limited') retry();\r\n * }\r\n * ```\r\n */\r\nexport class NeetruError extends Error {\r\n public readonly code: NeetruErrorCode | string;\r\n public readonly status?: number;\r\n public readonly requestId?: string;\r\n\r\n constructor(\r\n code: NeetruErrorCode | string,\r\n message: string,\r\n status?: number,\r\n requestId?: string,\r\n ) {\r\n super(message);\r\n this.name = 'NeetruError';\r\n this.code = code;\r\n this.status = status;\r\n this.requestId = requestId;\r\n // Preserva o prototype chain ao herdar de Error (downlevel quirk de TS).\r\n Object.setPrototypeOf(this, NeetruError.prototype);\r\n }\r\n}\r\n","/**\r\n * NeetruDbError — classe de erro especializada para o módulo `db`.\r\n *\r\n * Conforma com 02-sdk.md §3.5: `NeetruDbError extends NeetruError`,\r\n * campo `code` fechado em `NeetruDbErrorCode`, campo `retryable` booleano,\r\n * campo `dbId` opaco para correlação.\r\n *\r\n * Herda de `NeetruError` para que um `catch (e) { if (e instanceof NeetruError) }`\r\n * genérico continue pegando erros de DB. Quem quer granularidade usa\r\n * `instanceof NeetruDbError` e o `code` fechado.\r\n */\r\n\r\nimport { NeetruError } from './errors';\r\n\r\n/**\r\n * Códigos de erro específicos do módulo `db`.\r\n *\r\n * - `db_unavailable` — lifecycle: provisionando / falhou / arquivado.\r\n * NÃO significa \"sem rede\" — offline é transparente.\r\n * - `db_not_found` — documento/coleção não encontrado no servidor.\r\n * - `db_conflict` — conflito de escrita detectado.\r\n * - `db_quota_exceeded` — quota de escrita/leitura excedida no banco.\r\n * - `db_permission_denied` — sem permissão para a operação.\r\n * - `db_invalid_query` — query inválida (campo, operador, tipo).\r\n * - `db_timeout` — operação excedeu o timeout.\r\n * - `offline_quota_exceeded`— IndexedDB cheio; a escrita não pode ser enfileirada.\r\n * - `offline_unavailable` — IndexedDB indisponível; SDK degrado para cache RAM.\r\n */\r\nexport type NeetruDbErrorCode =\r\n | 'db_unavailable'\r\n | 'db_not_found'\r\n | 'db_conflict'\r\n | 'db_quota_exceeded'\r\n | 'db_permission_denied'\r\n | 'db_invalid_query'\r\n | 'db_timeout'\r\n | 'offline_quota_exceeded'\r\n | 'offline_unavailable';\r\n\r\n/**\r\n * Códigos que são retryable por natureza.\r\n */\r\nconst RETRYABLE_CODES = new Set<NeetruDbErrorCode>([\r\n 'db_unavailable',\r\n 'db_conflict',\r\n 'db_timeout',\r\n]);\r\n\r\n/**\r\n * Erro tipado do módulo `db` — estende `NeetruError` para compatibilidade.\r\n *\r\n * @example\r\n * ```ts\r\n * try {\r\n * await client.db.collection('orders').add({ ... });\r\n * } catch (e) {\r\n * if (e instanceof NeetruDbError && e.code === 'offline_quota_exceeded') {\r\n * // IndexedDB cheio — notificar usuário\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class NeetruDbError extends NeetruError {\r\n /** Código de erro fechado — específico de DB. */\r\n public override readonly code: NeetruDbErrorCode;\r\n\r\n /**\r\n * `true` para erros transientes que o produto pode tentar novamente.\r\n * São retryable: `db_unavailable`, `db_conflict`, `db_timeout`.\r\n */\r\n public readonly retryable: boolean;\r\n\r\n /**\r\n * ID opaco do banco lógico — só para correlação com logs do Core.\r\n * Nunca deve ser exibido ao usuário final.\r\n */\r\n public readonly dbId?: string;\r\n\r\n constructor(code: NeetruDbErrorCode, message: string, dbId?: string) {\r\n super(code, message);\r\n this.name = 'NeetruDbError';\r\n this.code = code;\r\n this.retryable = RETRYABLE_CODES.has(code);\r\n this.dbId = dbId;\r\n // Preserva o prototype chain (TypeScript + downlevel).\r\n Object.setPrototypeOf(this, NeetruDbError.prototype);\r\n }\r\n}\r\n","/**\r\n * Mocks determinísticos do SDK — overridáveis em tests do consumer ou\r\n * ativados automaticamente quando `NEETRU_ENV=dev`.\r\n *\r\n * Nada aqui faz I/O. Tudo é puro/sincrono/in-memory. Compat total com\r\n * runtimes browser/Node/Edge — sem `node:` builtins.\r\n *\r\n * Cada mock implementa o mesmo namespace interface das implementações reais\r\n * (`AuthNamespace`, `UsageNamespace`, `SupportNamespace`) — caller pode\r\n * substituir 1:1 sem branching.\r\n *\r\n * @example\r\n * ```ts\r\n * import { createNeetruClient, MockAuth } from '@neetru/sdk';\r\n *\r\n * const client = createNeetruClient({\r\n * mocks: { auth: new MockAuth({ uid: 'fake-user', email: 'x@x.com' }) },\r\n * });\r\n * ```\r\n */\r\n\r\nimport type {\r\n AuthNamespace,\r\n AuthStateListener,\r\n CreateTicketInput,\r\n EntitlementCheck,\r\n NeetruUser,\r\n SignInOptions,\r\n SupportNamespace,\r\n SupportTicket,\r\n UsageNamespace,\r\n UsageQuota,\r\n} from './types';\r\nimport type {\r\n NeetruDb,\r\n NeetruSqlClient,\r\n} from './db/client-db';\r\nimport type { DbCollectionRef, DbWhereFilter, DbListResult, DbGetResult, DbBatchOp, DbDocRef, DbQuery } from './db/collection-ref';\r\nimport type { SyncState, ConflictRecord, Unsubscribe } from './db/offline/types';\r\nimport { NeetruDbError } from './db-errors';\r\n\r\n// ─── User fixture default ──────────────────────────────────────────────────\r\n\r\n/**\r\n * User fixture determinístico — usado quando `NEETRU_ENV=dev` e nenhum mock\r\n * custom é injetado. Email/uid estáveis pra snapshot tests.\r\n */\r\nexport const DEV_FIXTURE_USER: NeetruUser = Object.freeze({\r\n uid: 'dev-fixture-uid-0001',\r\n email: 'dev@neetru.local',\r\n emailVerified: true,\r\n displayName: 'Dev Fixture',\r\n isCustomer: true,\r\n isStaff: false,\r\n}) as NeetruUser;\r\n\r\n// ─── MockAuth ──────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Implementação in-memory do `AuthNamespace`. signIn marca o user como\r\n * logado; signOut limpa. onAuthStateChanged dispara callback síncrono no\r\n * subscribe + a cada mudança.\r\n */\r\nexport class MockAuth implements AuthNamespace {\r\n private _user: NeetruUser | null;\r\n private _listeners: Set<AuthStateListener>;\r\n\r\n constructor(initialUser: NeetruUser | null = null) {\r\n this._user = initialUser;\r\n this._listeners = new Set();\r\n }\r\n\r\n async signIn(_options?: SignInOptions): Promise<NeetruUser> {\r\n // Mock: apenas marca user como logado (usa fixture se não havia).\r\n if (!this._user) this._user = { ...DEV_FIXTURE_USER };\r\n this._notify();\r\n return this._user;\r\n }\r\n\r\n async signOut(): Promise<void> {\r\n this._user = null;\r\n this._notify();\r\n }\r\n\r\n getUser(): NeetruUser | null {\r\n return this._user;\r\n }\r\n\r\n onAuthStateChanged(listener: AuthStateListener): () => void {\r\n this._listeners.add(listener);\r\n // Dispara imediatamente com estado atual (espelha API Firebase Auth).\r\n try {\r\n listener(this._user);\r\n } catch {\r\n // Callback do consumer não pode quebrar o subscribe.\r\n }\r\n return () => {\r\n this._listeners.delete(listener);\r\n };\r\n }\r\n\r\n /**\r\n * Mock de `verifyToken` — decodifica o JWT sem verificar assinatura (pra testes).\r\n * Em dev, retorna o user atual do mock se já estiver logado. Aceita qualquer token\r\n * não-vazio sem chamar rede.\r\n *\r\n * Para simular falhas em testes, use `MockAuth.__mockVerifyToken(fn)`.\r\n */\r\n async verifyToken(token: string): Promise<NeetruUser> {\r\n if (this._verifyTokenOverride) {\r\n return this._verifyTokenOverride(token);\r\n }\r\n if (!token) {\r\n throw Object.assign(new Error('Token inválido'), { code: 'token_invalid_signature' });\r\n }\r\n // Tenta decodificar claims base64 sem verificar assinatura (útil em testes).\r\n try {\r\n const parts = token.split('.');\r\n if (parts.length === 3) {\r\n const b64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');\r\n const pad = '='.repeat((4 - (b64.length % 4)) % 4);\r\n const decoded = JSON.parse(\r\n typeof atob === 'function'\r\n ? atob(b64 + pad)\r\n : Buffer.from(b64 + pad, 'base64').toString('utf-8'),\r\n ) as Record<string, unknown>;\r\n if (typeof decoded.sub === 'string') {\r\n return {\r\n uid: decoded.sub,\r\n email: typeof decoded.email === 'string' ? decoded.email : '',\r\n emailVerified: typeof decoded.email_verified === 'boolean' ? decoded.email_verified : undefined,\r\n displayName: typeof decoded.name === 'string' ? decoded.name : undefined,\r\n photoURL: typeof decoded.picture === 'string' ? decoded.picture : undefined,\r\n isStaff: decoded.is_staff === true,\r\n isCustomer: decoded.is_customer === true,\r\n tenantId: typeof decoded.tenant_id === 'string' ? decoded.tenant_id : undefined,\r\n ...decoded,\r\n };\r\n }\r\n }\r\n } catch {\r\n /* fall through to return current user */\r\n }\r\n // Fallback: retorna o user atual do mock.\r\n if (this._user) return this._user;\r\n throw Object.assign(new Error('Nenhum user mock disponível'), { code: 'token_invalid_signature' });\r\n }\r\n\r\n private _verifyTokenOverride: ((token: string) => Promise<NeetruUser>) | null = null;\r\n\r\n /**\r\n * Injeta override pra `verifyToken` em testes — permite simular expiração,\r\n * assinatura inválida etc sem precisar de JWT real.\r\n *\r\n * @example\r\n * ```ts\r\n * const mock = new MockAuth(null);\r\n * mock.__mockVerifyToken(async () => { throw new NeetruError('token_expired', '...'); });\r\n * ```\r\n */\r\n __mockVerifyToken(fn: ((token: string) => Promise<NeetruUser>) | null): void {\r\n this._verifyTokenOverride = fn;\r\n }\r\n\r\n /** Helper de tests — força um user state arbitrário. */\r\n __setUser(user: NeetruUser | null): void {\r\n this._user = user;\r\n this._notify();\r\n }\r\n\r\n private _notify(): void {\r\n for (const l of this._listeners) {\r\n try {\r\n l(this._user);\r\n } catch {\r\n // ignore consumer errors\r\n }\r\n }\r\n }\r\n}\r\n\r\n// ─── MockUsage ─────────────────────────────────────────────────────────────\r\n\r\ninterface UsageRecord {\r\n event: string;\r\n properties?: Record<string, string | number | boolean | null>;\r\n timestamp: string;\r\n}\r\n\r\n/**\r\n * In-memory `UsageNamespace`. `track()` apenas acumula no array\r\n * `__getRecords()` (útil pra asserts em test). `getQuota()` retorna fixture\r\n * com `used = trackedCount` da metric.\r\n */\r\nexport class MockUsage implements UsageNamespace {\r\n private _records: UsageRecord[] = [];\r\n private _quotas: Map<string, UsageQuota>;\r\n /** v0.3 — counters in-memory pra `report()` / `check()`. */\r\n private _counters: Map<string, number> = new Map();\r\n\r\n constructor(initialQuotas: Record<string, UsageQuota> = {}) {\r\n this._quotas = new Map(Object.entries(initialQuotas));\r\n }\r\n\r\n async track(\r\n event: string,\r\n properties?: Record<string, string | number | boolean | null>,\r\n ): Promise<{ ok: true }> {\r\n this._records.push({\r\n event,\r\n properties,\r\n timestamp: new Date().toISOString(),\r\n });\r\n return { ok: true };\r\n }\r\n\r\n async getQuota(metric: string): Promise<UsageQuota> {\r\n const existing = this._quotas.get(metric);\r\n if (existing) return existing;\r\n return {\r\n metric,\r\n used: this._records.filter((r) => r.event === metric).length,\r\n limit: -1, // unlimited em mock por default\r\n plan: 'mock',\r\n };\r\n }\r\n\r\n /** v0.3 — Mock report incrementa o counter local. */\r\n async report(\r\n resource: string,\r\n qty: number = 1,\r\n _options?: { productId?: string; tenantId?: string },\r\n ): Promise<{\r\n ok: true;\r\n counterId?: string;\r\n value?: number;\r\n limit?: number;\r\n remaining?: number;\r\n status?: string;\r\n }> {\r\n if (!resource) throw new Error('resource required');\r\n const safeQty = Number.isFinite(qty) && qty > 0 ? Math.floor(qty) : 1;\r\n const existing = this._counters.get(resource) ?? 0;\r\n const next = existing + safeQty;\r\n this._counters.set(resource, next);\r\n const limitFixture = this._quotas.get(resource);\r\n const limit = limitFixture?.limit ?? -1;\r\n return {\r\n ok: true,\r\n counterId: `mock_${resource}`,\r\n value: next,\r\n limit,\r\n remaining: limit < 0 ? -1 : Math.max(0, limit - next),\r\n status: limit > 0 && next >= limit ? 'read_only_overlimit' : 'ok',\r\n };\r\n }\r\n\r\n /** v0.3 — Mock check usa quotas + counters in-memory. */\r\n async check(\r\n resource: string,\r\n _options?: { productId?: string; tenantId?: string },\r\n ): Promise<{\r\n allowed: boolean;\r\n reason?: string;\r\n remaining?: number;\r\n limit?: number;\r\n planId?: string | null;\r\n planFeatures?: string[];\r\n }> {\r\n const quota = this._quotas.get(resource);\r\n const used = this._counters.get(resource) ?? 0;\r\n if (!quota) {\r\n return { allowed: true, reason: 'granted', limit: -1, remaining: -1 };\r\n }\r\n const remaining = quota.limit < 0 ? -1 : Math.max(0, quota.limit - used);\r\n if (remaining === 0) {\r\n return {\r\n allowed: false,\r\n reason: 'limit_exceeded',\r\n limit: quota.limit,\r\n remaining: 0,\r\n };\r\n }\r\n return {\r\n allowed: true,\r\n reason: 'granted',\r\n limit: quota.limit,\r\n remaining,\r\n };\r\n }\r\n\r\n /** Test helper. */\r\n __getRecords(): readonly UsageRecord[] {\r\n return [...this._records];\r\n }\r\n /** Test helper — substitui quota fixture. */\r\n __setQuota(metric: string, quota: UsageQuota): void {\r\n this._quotas.set(metric, quota);\r\n }\r\n /** Test helper — limpa estado. */\r\n __reset(): void {\r\n this._records = [];\r\n this._quotas.clear();\r\n this._counters.clear();\r\n }\r\n}\r\n\r\n// ─── MockSupport ───────────────────────────────────────────────────────────\r\n\r\n/**\r\n * In-memory `SupportNamespace`. createTicket gera ID `mock-ticket-{n}`;\r\n * listMyTickets retorna todos criados (FIFO). Sequência por instância\r\n * (evita poluição cross-test do estado de módulo).\r\n */\r\nexport class MockSupport implements SupportNamespace {\r\n private _tickets: SupportTicket[] = [];\r\n private _ticketSeq = 0;\r\n\r\n async createTicket(input: CreateTicketInput): Promise<SupportTicket> {\r\n if (!input?.subject) throw new Error('subject required');\r\n if (!input?.message) throw new Error('message required');\r\n const ticket: SupportTicket = {\r\n id: `mock-ticket-${++this._ticketSeq}`,\r\n subject: input.subject,\r\n message: input.message,\r\n severity: input.severity ?? 'normal',\r\n status: 'open',\r\n createdAt: new Date().toISOString(),\r\n productSlug: input.productSlug,\r\n };\r\n this._tickets.push(ticket);\r\n return ticket;\r\n }\r\n\r\n async listMyTickets(): Promise<SupportTicket[]> {\r\n return [...this._tickets];\r\n }\r\n\r\n /** Test helper. */\r\n __reset(): void {\r\n this._tickets = [];\r\n this._ticketSeq = 0;\r\n }\r\n}\r\n\r\n// ─── MockEntitlements ──────────────────────────────────────────────────────\r\n\r\n/**\r\n * In-memory entitlements. Por default `allowed=true` em tudo (dev convém).\r\n * Use `__deny(slug, feature)` em tests pra simular bloqueio.\r\n */\r\nexport class MockEntitlements {\r\n private _denied: Set<string> = new Set();\r\n\r\n async check(productSlug: string, feature: string): Promise<boolean> {\r\n return !this._denied.has(`${productSlug}:${feature}`);\r\n }\r\n\r\n async checkDetailed(productSlug: string, feature: string): Promise<EntitlementCheck> {\r\n const allowed = await this.check(productSlug, feature);\r\n return {\r\n allowed,\r\n productSlug,\r\n feature,\r\n reason: allowed ? 'granted' : 'mock_denied',\r\n };\r\n }\r\n\r\n /** Test helper. */\r\n __deny(productSlug: string, feature: string): void {\r\n this._denied.add(`${productSlug}:${feature}`);\r\n }\r\n /** Test helper. */\r\n __reset(): void {\r\n this._denied.clear();\r\n }\r\n}\r\n\r\n// ─── MockDb (v2.0) ─────────────────────────────────────────────────────────\r\n\r\n/**\r\n * In-memory `NeetruDb`. Cada `collection(name)` aponta para um Map; ops\r\n * são totalmente síncronas (mas API await-friendly).\r\n *\r\n * v2.0: implementa a interface `NeetruDb` completa (collection, sql, syncState,\r\n * flush, clearCache, getConflicts, onSyncStateChanged).\r\n *\r\n * Útil para testar produtos consumidores sem rodar Core REST nem IndexedDB.\r\n */\r\nexport class MockDb implements NeetruDb {\r\n private _store: Map<string, Map<string, Record<string, unknown>>> = new Map();\r\n private _fixtures: Map<string, Record<string, Record<string, unknown>>>;\r\n\r\n constructor(initialFixtures: Record<string, Record<string, Record<string, unknown>>> = {}) {\r\n this._fixtures = new Map(Object.entries(initialFixtures));\r\n }\r\n\r\n collection<T = Record<string, unknown>>(name: string): DbCollectionRef<T> {\r\n const _store = this._store;\r\n const _fixtures = this._fixtures;\r\n if (!_store.has(name)) {\r\n const init = _fixtures.get(name);\r\n _store.set(\r\n name,\r\n init ? new Map(Object.entries(init)) : new Map(),\r\n );\r\n }\r\n const coll = _store.get(name)!;\r\n\r\n const matchesFilter = (\r\n doc: Record<string, unknown>,\r\n f: DbWhereFilter,\r\n ): boolean => {\r\n const v = doc[f.field];\r\n switch (f.op) {\r\n case '==':\r\n return v === f.value;\r\n case '!=':\r\n return v !== f.value;\r\n case '<':\r\n return typeof v === 'number' && typeof f.value === 'number' && v < f.value;\r\n case '<=':\r\n return typeof v === 'number' && typeof f.value === 'number' && v <= f.value;\r\n case '>':\r\n return typeof v === 'number' && typeof f.value === 'number' && v > f.value;\r\n case '>=':\r\n return typeof v === 'number' && typeof f.value === 'number' && v >= f.value;\r\n case 'in':\r\n return Array.isArray(f.value) && (f.value as unknown[]).includes(v);\r\n case 'array-contains':\r\n return Array.isArray(v) && (v as unknown[]).includes(f.value);\r\n case 'not-in':\r\n return Array.isArray(f.value) && !(f.value as unknown[]).includes(v);\r\n default:\r\n return true;\r\n }\r\n };\r\n\r\n let autoSeq = 0;\r\n\r\n // Helper to build a minimal DbListResult from raw items\r\n function buildListResult<U>(items: Array<Record<string, unknown>>): DbListResult<U> {\r\n return {\r\n docs: items.map((d, i) => ({ id: (d.id as string) ?? String(i), data: d as U })),\r\n nextCursor: null,\r\n fromCache: false,\r\n stale: false,\r\n hasPendingWrites: false,\r\n changes: [],\r\n };\r\n }\r\n\r\n // Helper to build a DbGetResult for a single doc\r\n function buildGetResult<U>(data: Record<string, unknown>, id: string): DbGetResult<U> {\r\n return {\r\n docs: [{ id, data: data as U }],\r\n fromCache: false,\r\n stale: false,\r\n hasPendingWrites: false,\r\n changes: [],\r\n };\r\n }\r\n\r\n const ref: DbCollectionRef<T> = {\r\n async list(q?: DbQuery): Promise<DbListResult<T>> {\r\n let items = Array.from(coll.values());\r\n if (q?.where && q.where.length > 0) {\r\n items = items.filter((doc) =>\r\n (q.where as DbWhereFilter[]).every((f) => matchesFilter(doc, f)),\r\n );\r\n }\r\n if (q?.orderBy) {\r\n const { field, direction } = q.orderBy;\r\n items = items.slice().sort((a, b) => {\r\n const av = a[field];\r\n const bv = b[field];\r\n const avs = av ?? '';\r\n const bvs = bv ?? '';\r\n const cmp = (avs as string) < (bvs as string) ? -1 : (avs as string) > (bvs as string) ? 1 : 0;\r\n return direction === 'desc' ? -cmp : cmp;\r\n });\r\n }\r\n const limit = q?.limit ?? 20;\r\n items = items.slice(0, limit);\r\n return buildListResult<T>(items);\r\n },\r\n async get(id: string): Promise<DbGetResult<T> | null> {\r\n const data = coll.get(id);\r\n if (!data) return null;\r\n return buildGetResult<T>(data, id);\r\n },\r\n async add(data: Omit<T, 'id'>): Promise<{ ok: true; id: string }> {\r\n const id = `mock-${++autoSeq}-${Math.random().toString(36).slice(2, 8)}`;\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n return { ok: true, id };\r\n },\r\n async set(id: string, data: Omit<T, 'id'>): Promise<{ ok: true }> {\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n return { ok: true };\r\n },\r\n async update(id: string, data: Partial<Omit<T, 'id'>>): Promise<{ ok: true }> {\r\n const cur = coll.get(id);\r\n if (!cur) {\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n } else {\r\n coll.set(id, { ...cur, ...(data as Record<string, unknown>) });\r\n }\r\n return { ok: true };\r\n },\r\n async remove(id: string): Promise<{ ok: true }> {\r\n coll.delete(id);\r\n return { ok: true };\r\n },\r\n async batch(ops: DbBatchOp[]): Promise<{ ok: true }> {\r\n for (const op of ops) {\r\n // Mock usa a coleção corrente (collName) — o campo collection foi removido\r\n // do discriminated union em 2.1.1; batch opera sempre na coleção do ref.\r\n const collMap = coll;\r\n if (op.kind === 'add') {\r\n const id = `mock-batch-${++autoSeq}`;\r\n collMap.set(id, { ...(op.data as Record<string, unknown>), id });\r\n } else if (op.kind === 'set') {\r\n collMap.set(op.id, { ...(op.data as Record<string, unknown>), id: op.id });\r\n } else if (op.kind === 'update') {\r\n const cur = collMap.get(op.id);\r\n collMap.set(op.id, { ...(cur ?? {}), ...(op.data as Record<string, unknown>), id: op.id });\r\n } else if (op.kind === 'remove') {\r\n collMap.delete(op.id);\r\n }\r\n }\r\n return { ok: true };\r\n },\r\n onDoc(id: string, cb: (doc: T | null) => void): Unsubscribe {\r\n // Entrega snapshot inicial imediato (sync mock)\r\n const data = coll.get(id);\r\n Promise.resolve().then(() => cb(data ? (data as T) : null));\r\n // Mock: não há feed realtime — retorna no-op unsubscribe\r\n return () => {};\r\n },\r\n onSnapshot(q: DbQuery | undefined, cb: (snap: DbListResult<T>) => void): Unsubscribe {\r\n // Entrega snapshot inicial imediato (sync mock)\r\n Promise.resolve().then(async () => {\r\n const snap = await ref.list(q);\r\n cb(snap);\r\n });\r\n return () => {};\r\n },\r\n doc(id: string): DbDocRef<T> {\r\n return {\r\n get id(): string { return id; },\r\n get path(): string { return `${name}/${id}`; },\r\n get collection(): string { return name; },\r\n async get() {\r\n const data = coll.get(id);\r\n if (!data) return null;\r\n return buildGetResult<T>(data, id);\r\n },\r\n async set(data: Omit<T, 'id'>) {\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n return { ok: true };\r\n },\r\n async update(data: Partial<Omit<T, 'id'>>) {\r\n const cur = coll.get(id);\r\n if (!cur) {\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n } else {\r\n coll.set(id, { ...cur, ...(data as Record<string, unknown>) });\r\n }\r\n return { ok: true };\r\n },\r\n async remove() {\r\n coll.delete(id);\r\n return { ok: true };\r\n },\r\n onSnapshot(cb: (snap: DbGetResult<T> | null) => void): Unsubscribe {\r\n const data = coll.get(id);\r\n Promise.resolve().then(() =>\r\n cb(data ? buildGetResult<T>(data, id) : null),\r\n );\r\n return () => {};\r\n },\r\n };\r\n },\r\n };\r\n\r\n return ref;\r\n }\r\n\r\n /**\r\n * Implementa SQL in-memory via `pg-mem` + `drizzle-orm/node-postgres`.\r\n *\r\n * bug_a7f2ae25fda54129b52b6dd55aaa6050 (HIGH 26/05): antes lançava\r\n * `db_unavailable` sempre, bloqueando vitest server-side dos consumers\r\n * que refatoraram pra `client.db.sql()`. Agora carrega `pg-mem` lazy +\r\n * cria `NodePgDatabase` Drizzle apontando pra DB in-memory.\r\n *\r\n * Requer `pg-mem`, `drizzle-orm` e `pg` como devDependencies do consumer\r\n * (instale com `npm install -D pg-mem drizzle-orm pg`). Se ausentes, joga\r\n * `db_unavailable` com mensagem clara.\r\n *\r\n * Use `options.initSql` pra criar tabelas no test setup — sem isso o orm\r\n * funciona mas qualquer SELECT/INSERT em tabela inexistente vai falhar.\r\n */\r\n async sql<TSchema extends Record<string, unknown>>(\r\n schema: TSchema,\r\n options?: { database?: string; initSql?: string | string[] },\r\n ): Promise<NeetruSqlClient<TSchema>> {\r\n let pgMemMod: typeof import('pg-mem');\r\n let drizzlePg: typeof import('drizzle-orm/node-postgres');\r\n try {\r\n // Lazy-load — sem essas devDeps, MockDb.sql() continua jogando erro claro.\r\n pgMemMod = await import('pg-mem');\r\n drizzlePg = await import('drizzle-orm/node-postgres');\r\n } catch {\r\n throw new NeetruDbError(\r\n 'db_unavailable',\r\n '[MockDb] sql() requer pg-mem + drizzle-orm + pg como devDependencies do consumer. Rode: npm install -D pg-mem drizzle-orm pg.',\r\n );\r\n }\r\n\r\n const memDb = pgMemMod.newDb({ noAstCoverageCheck: true });\r\n\r\n // Aplica DDL inicial (criar tabelas / seed) — só faz sentido em mock.\r\n if (options?.initSql) {\r\n const ddls = Array.isArray(options.initSql) ? options.initSql : [options.initSql];\r\n for (const ddl of ddls) {\r\n memDb.public.none(ddl);\r\n }\r\n }\r\n\r\n const adapters = memDb.adapters.createPg();\r\n const PoolCtor = (adapters as { Pool: new () => unknown }).Pool;\r\n const pool = new PoolCtor();\r\n const orm = drizzlePg.drizzle(pool as never, { schema }) as unknown as\r\n import('drizzle-orm/node-postgres').NodePgDatabase<TSchema>;\r\n\r\n return {\r\n orm,\r\n async transaction(fn, _opts) {\r\n return await orm.transaction(fn as never) as never;\r\n },\r\n async close() {\r\n const p = pool as { end?: () => Promise<void> };\r\n if (p.end) await p.end();\r\n },\r\n } as NeetruSqlClient<TSchema>;\r\n }\r\n\r\n get syncState(): SyncState {\r\n return {\r\n status: 'idle',\r\n pendingWrites: 0,\r\n lastSyncedAt: null,\r\n isLeaderTab: true,\r\n };\r\n }\r\n\r\n onSyncStateChanged(_cb: (s: SyncState) => void): Unsubscribe {\r\n return () => {};\r\n }\r\n\r\n async flush(): Promise<void> {\r\n // no-op in mock\r\n }\r\n\r\n async clearCache(): Promise<void> {\r\n this._store.clear();\r\n }\r\n\r\n async getConflicts(): Promise<ConflictRecord[]> {\r\n return [];\r\n }\r\n\r\n /** Test helper — substitui fixture inteira de uma collection. */\r\n __setFixture(name: string, items: Record<string, Record<string, unknown>>): void {\r\n this._store.set(name, new Map(Object.entries(items)));\r\n }\r\n\r\n /** Test helper — reset total. */\r\n __reset(): void {\r\n this._store.clear();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/db-errors.ts","../src/mocks.ts"],"names":[],"mappings":";;;AAoCO,IAAM,WAAA,GAAN,MAAM,YAAA,SAAoB,KAAA,CAAM;AAAA,EACrB,IAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EAEhB,WAAA,CACE,IAAA,EACA,OAAA,EACA,MAAA,EACA,SAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAEjB,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,YAAA,CAAY,SAAS,CAAA;AAAA,EACnD;AACF,CAAA;;;ACbA,IAAM,eAAA,uBAAsB,GAAA,CAAuB;AAAA,EACjD,gBAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AAgBM,IAAM,aAAA,GAAN,MAAM,cAAA,SAAsB,WAAA,CAAY;AAAA;AAAA,EAEpB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAA;AAAA,EAEhB,WAAA,CAAY,IAAA,EAAyB,OAAA,EAAiB,IAAA,EAAe;AACnE,IAAA,KAAA,CAAM,MAAM,OAAO,CAAA;AACnB,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAEZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,cAAA,CAAc,SAAS,CAAA;AAAA,EACrD;AACF,CAAA;;;ACxCO,IAAM,gBAAA,GAA+B,OAAO,MAAA,CAAO;AAAA,EACxD,GAAA,EAAK,sBAAA;AAAA,EACL,KAAA,EAAO,kBAAA;AAAA,EACP,aAAA,EAAe,IAAA;AAAA,EACf,WAAA,EAAa,aAAA;AAAA,EACb,UAAA,EAAY,IAAA;AAAA,EACZ,OAAA,EAAS;AACX,CAAC;AASM,IAAM,WAAN,MAAwC;AAAA,EACrC,KAAA;AAAA,EACA,UAAA;AAAA,EAER,WAAA,CAAY,cAAiC,IAAA,EAAM;AACjD,IAAA,IAAA,CAAK,KAAA,GAAQ,WAAA;AACb,IAAA,IAAA,CAAK,UAAA,uBAAiB,GAAA,EAAI;AAAA,EAC5B;AAAA,EAEA,MAAM,OAAO,QAAA,EAA+C;AAE1D,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,OAAY,KAAA,GAAQ,EAAE,GAAG,gBAAA,EAAiB;AACpD,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA,EAEA,OAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,mBAAmB,QAAA,EAAyC;AAC1D,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,QAAQ,CAAA;AAE5B,IAAA,IAAI;AACF,MAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,QAAQ,CAAA;AAAA,IACjC,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAY,KAAA,EAAoC;AACpD,IAAA,IAAI,KAAK,oBAAA,EAAsB;AAC7B,MAAA,OAAO,IAAA,CAAK,qBAAqB,KAAK,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,MAAA,CAAO,OAAO,IAAI,KAAA,CAAM,mBAAgB,CAAA,EAAG,EAAE,IAAA,EAAM,yBAAA,EAA2B,CAAA;AAAA,IACtF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AACzD,QAAA,MAAM,MAAM,GAAA,CAAI,MAAA,CAAA,CAAQ,IAAK,GAAA,CAAI,MAAA,GAAS,KAAM,CAAC,CAAA;AACjD,QAAA,MAAM,UAAU,IAAA,CAAK,KAAA;AAAA,UACnB,OAAO,IAAA,KAAS,UAAA,GACZ,IAAA,CAAK,MAAM,GAAG,CAAA,GACd,MAAA,CAAO,IAAA,CAAK,GAAA,GAAM,GAAA,EAAK,QAAQ,CAAA,CAAE,SAAS,OAAO;AAAA,SACvD;AACA,QAAA,IAAI,OAAO,OAAA,CAAQ,GAAA,KAAQ,QAAA,EAAU;AACnC,UAAA,OAAO;AAAA,YACL,KAAK,OAAA,CAAQ,GAAA;AAAA,YACb,OAAO,OAAO,OAAA,CAAQ,KAAA,KAAU,QAAA,GAAW,QAAQ,KAAA,GAAQ,EAAA;AAAA,YAC3D,eAAe,OAAO,OAAA,CAAQ,cAAA,KAAmB,SAAA,GAAY,QAAQ,cAAA,GAAiB,KAAA,CAAA;AAAA,YACtF,aAAa,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,GAAW,QAAQ,IAAA,GAAO,KAAA,CAAA;AAAA,YAC/D,UAAU,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,GAAW,QAAQ,OAAA,GAAU,KAAA,CAAA;AAAA,YAClE,OAAA,EAAS,QAAQ,QAAA,KAAa,IAAA;AAAA,YAC9B,UAAA,EAAY,QAAQ,WAAA,KAAgB,IAAA;AAAA,YACpC,UAAU,OAAO,OAAA,CAAQ,SAAA,KAAc,QAAA,GAAW,QAAQ,SAAA,GAAY,KAAA,CAAA;AAAA,YACtE,GAAG;AAAA,WACL;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAI,IAAA,CAAK,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAC5B,IAAA,MAAM,MAAA,CAAO,OAAO,IAAI,KAAA,CAAM,gCAA6B,CAAA,EAAG,EAAE,IAAA,EAAM,yBAAA,EAA2B,CAAA;AAAA,EACnG;AAAA,EAEQ,oBAAA,GAAwE,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYhF,kBAAkB,EAAA,EAA2D;AAC3E,IAAA,IAAA,CAAK,oBAAA,GAAuB,EAAA;AAAA,EAC9B;AAAA;AAAA,EAGA,UAAU,IAAA,EAA+B;AACvC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,UAAA,EAAY;AAC/B,MAAA,IAAI;AACF,QAAA,CAAA,CAAE,KAAK,KAAK,CAAA;AAAA,MACd,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;AAeO,IAAM,YAAN,MAA0C;AAAA,EACvC,WAA0B,EAAC;AAAA,EAC3B,OAAA;AAAA;AAAA,EAEA,SAAA,uBAAqC,GAAA,EAAI;AAAA,EAEjD,WAAA,CAAY,aAAA,GAA4C,EAAC,EAAG;AAC1D,IAAA,IAAA,CAAK,UAAU,IAAI,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAC,CAAA;AAAA,EACtD;AAAA,EAEA,MAAM,KAAA,CACJ,KAAA,EACA,UAAA,EACuB;AACvB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK;AAAA,MACjB,KAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AACD,IAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,EACpB;AAAA,EAEA,MAAM,SAAS,MAAA,EAAqC;AAClD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AACxC,IAAA,IAAI,UAAU,OAAO,QAAA;AACrB,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,IAAA,EAAM,KAAK,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,MAAM,CAAA,CAAE,MAAA;AAAA,MACtD,KAAA,EAAO,EAAA;AAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,MAAA,CACJ,QAAA,EACA,GAAA,GAAc,GACd,QAAA,EAQC;AACD,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAClD,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,IAAK,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI,CAAA;AACpE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA;AACjD,IAAA,MAAM,OAAO,QAAA,GAAW,OAAA;AACxB,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AACjC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AAC9C,IAAA,MAAM,KAAA,GAAQ,cAAc,KAAA,IAAS,EAAA;AACrC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,SAAA,EAAW,QAAQ,QAAQ,CAAA,CAAA;AAAA,MAC3B,KAAA,EAAO,IAAA;AAAA,MACP,KAAA;AAAA,MACA,SAAA,EAAW,QAAQ,CAAA,GAAI,EAAA,GAAK,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,IAAI,CAAA;AAAA,MACpD,MAAA,EAAQ,KAAA,GAAQ,CAAA,IAAK,IAAA,IAAQ,QAAQ,qBAAA,GAAwB;AAAA,KAC/D;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAA,CACJ,QAAA,EACA,QAAA,EAQC;AACD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA;AAC7C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,EAAE,SAAS,IAAA,EAAM,MAAA,EAAQ,WAAW,KAAA,EAAO,EAAA,EAAI,WAAW,EAAA,EAAG;AAAA,IACtE;AACA,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,GAAQ,CAAA,GAAI,EAAA,GAAK,KAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,KAAA,GAAQ,IAAI,CAAA;AACvE,IAAA,IAAI,cAAc,CAAA,EAAG;AACnB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,gBAAA;AAAA,QACR,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,SAAA,EAAW;AAAA,OACb;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA,MACR,OAAO,KAAA,CAAM,KAAA;AAAA,MACb;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGA,YAAA,GAAuC;AACrC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC1B;AAAA;AAAA,EAEA,UAAA,CAAW,QAAgB,KAAA,EAAyB;AAClD,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA;AAAA,EAChC;AAAA;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AACF;AASO,IAAM,cAAN,MAA8C;AAAA,EAC3C,WAA4B,EAAC;AAAA,EAC7B,UAAA,GAAa,CAAA;AAAA,EAErB,MAAM,aAAa,KAAA,EAAkD;AACnE,IAAA,IAAI,CAAC,KAAA,EAAO,OAAA,EAAS,MAAM,IAAI,MAAM,kBAAkB,CAAA;AACvD,IAAA,IAAI,CAAC,KAAA,EAAO,OAAA,EAAS,MAAM,IAAI,MAAM,kBAAkB,CAAA;AACvD,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC5B,EAAA,EAAI,CAAA,YAAA,EAAe,EAAE,IAAA,CAAK,UAAU,CAAA,CAAA;AAAA,MACpC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,QAAA,EAAU,MAAM,QAAA,IAAY,QAAA;AAAA,MAC5B,MAAA,EAAQ,MAAA;AAAA,MACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,aAAa,KAAA,CAAM;AAAA,KACrB;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,MAAM,CAAA;AACzB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,aAAA,GAA0C;AAC9C,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAAA,EACpB;AACF;AAQO,IAAM,mBAAN,MAAuB;AAAA,EACpB,OAAA,uBAA2B,GAAA,EAAI;AAAA,EAEvC,MAAM,KAAA,CAAM,WAAA,EAAqB,OAAA,EAAmC;AAClE,IAAA,OAAO,CAAC,KAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,WAAW,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAA,EACtD;AAAA,EAEA,MAAM,aAAA,CAAc,WAAA,EAAqB,OAAA,EAA4C;AACnF,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,aAAa,OAAO,CAAA;AACrD,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA,EAAQ,UAAU,SAAA,GAAY;AAAA,KAChC;AAAA,EACF;AAAA;AAAA,EAGA,MAAA,CAAO,aAAqB,OAAA,EAAuB;AACjD,IAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAA,EAC9C;AAAA;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AACF;AAaO,IAAM,SAAN,MAAiC;AAAA,EAC9B,MAAA,uBAAgE,GAAA,EAAI;AAAA,EACpE,SAAA;AAAA,EAER,WAAA,CAAY,eAAA,GAA2E,EAAC,EAAG;AACzF,IAAA,IAAA,CAAK,YAAY,IAAI,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAC,CAAA;AAAA,EAC1D;AAAA,EAEA,WAAwC,IAAA,EAAkC;AACxE,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AACvB,IAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAG;AACrB,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAC/B,MAAA,MAAA,CAAO,GAAA;AAAA,QACL,IAAA;AAAA,QACA,IAAA,GAAO,IAAI,GAAA,CAAI,MAAA,CAAO,QAAQ,IAAI,CAAC,CAAA,mBAAI,IAAI,GAAA;AAAI,OACjD;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAE5B,IAAA,MAAM,aAAA,GAAgB,CACpB,GAAA,EACA,CAAA,KACY;AACZ,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA;AACrB,MAAA,QAAQ,EAAE,EAAA;AAAI,QACZ,KAAK,IAAA;AACH,UAAA,OAAO,MAAM,CAAA,CAAE,KAAA;AAAA,QACjB,KAAK,IAAA;AACH,UAAA,OAAO,MAAM,CAAA,CAAE,KAAA;AAAA,QACjB,KAAK,GAAA;AACH,UAAA,OAAO,OAAO,MAAM,QAAA,IAAY,OAAO,EAAE,KAAA,KAAU,QAAA,IAAY,IAAI,CAAA,CAAE,KAAA;AAAA,QACvE,KAAK,IAAA;AACH,UAAA,OAAO,OAAO,MAAM,QAAA,IAAY,OAAO,EAAE,KAAA,KAAU,QAAA,IAAY,KAAK,CAAA,CAAE,KAAA;AAAA,QACxE,KAAK,GAAA;AACH,UAAA,OAAO,OAAO,MAAM,QAAA,IAAY,OAAO,EAAE,KAAA,KAAU,QAAA,IAAY,IAAI,CAAA,CAAE,KAAA;AAAA,QACvE,KAAK,IAAA;AACH,UAAA,OAAO,OAAO,MAAM,QAAA,IAAY,OAAO,EAAE,KAAA,KAAU,QAAA,IAAY,KAAK,CAAA,CAAE,KAAA;AAAA,QACxE,KAAK,IAAA;AACH,UAAA,OAAO,KAAA,CAAM,QAAQ,CAAA,CAAE,KAAK,KAAM,CAAA,CAAE,KAAA,CAAoB,SAAS,CAAC,CAAA;AAAA,QACpE,KAAK,gBAAA;AACH,UAAA,OAAO,MAAM,OAAA,CAAQ,CAAC,KAAM,CAAA,CAAgB,QAAA,CAAS,EAAE,KAAK,CAAA;AAAA,QAC9D,KAAK,QAAA;AACH,UAAA,OAAO,KAAA,CAAM,QAAQ,CAAA,CAAE,KAAK,KAAK,CAAE,CAAA,CAAE,KAAA,CAAoB,QAAA,CAAS,CAAC,CAAA;AAAA,QACrE;AACE,UAAA,OAAO,IAAA;AAAA;AACX,IACF,CAAA;AAEA,IAAA,IAAI,OAAA,GAAU,CAAA;AAGd,IAAA,SAAS,gBAAmB,KAAA,EAAwD;AAClF,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO,EAAE,EAAA,EAAK,CAAA,CAAE,MAAiB,MAAA,CAAO,CAAC,CAAA,EAAG,IAAA,EAAM,GAAO,CAAE,CAAA;AAAA,QAC/E,UAAA,EAAY,IAAA;AAAA,QACZ,SAAA,EAAW,KAAA;AAAA,QACX,KAAA,EAAO,KAAA;AAAA,QACP,gBAAA,EAAkB,KAAA;AAAA,QAClB,SAAS;AAAC,OACZ;AAAA,IACF;AAGA,IAAA,SAAS,cAAA,CAAkB,MAA+B,EAAA,EAA4B;AACpF,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,CAAC,EAAE,EAAA,EAAI,MAAiB,CAAA;AAAA,QAC9B,SAAA,EAAW,KAAA;AAAA,QACX,KAAA,EAAO,KAAA;AAAA,QACP,gBAAA,EAAkB,KAAA;AAAA,QAClB,SAAS;AAAC,OACZ;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAA0B;AAAA,MAC9B,MAAM,KAAK,CAAA,EAAuC;AAChD,QAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AACpC,QAAA,IAAI,CAAA,EAAG,KAAA,IAAS,CAAA,CAAE,KAAA,CAAM,SAAS,CAAA,EAAG;AAClC,UAAA,KAAA,GAAQ,KAAA,CAAM,MAAA;AAAA,YAAO,CAAC,GAAA,KACnB,CAAA,CAAE,KAAA,CAA0B,KAAA,CAAM,CAAC,CAAA,KAAM,aAAA,CAAc,GAAA,EAAK,CAAC,CAAC;AAAA,WACjE;AAAA,QACF;AACA,QAAA,IAAI,GAAG,OAAA,EAAS;AACd,UAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,CAAA,CAAE,OAAA;AAC/B,UAAA,KAAA,GAAQ,MAAM,KAAA,EAAM,CAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACnC,YAAA,MAAM,EAAA,GAAK,EAAE,KAAK,CAAA;AAClB,YAAA,MAAM,EAAA,GAAK,EAAE,KAAK,CAAA;AAClB,YAAA,MAAM,MAAM,EAAA,IAAM,EAAA;AAClB,YAAA,MAAM,MAAM,EAAA,IAAM,EAAA;AAClB,YAAA,MAAM,MAAO,GAAA,GAAkB,GAAA,GAAiB,EAAA,GAAM,GAAA,GAAkB,MAAiB,CAAA,GAAI,CAAA;AAC7F,YAAA,OAAO,SAAA,KAAc,MAAA,GAAS,CAAC,GAAA,GAAM,GAAA;AAAA,UACvC,CAAC,CAAA;AAAA,QACH;AACA,QAAA,MAAM,KAAA,GAAQ,GAAG,KAAA,IAAS,EAAA;AAC1B,QAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAC5B,QAAA,OAAO,gBAAmB,KAAK,CAAA;AAAA,MACjC,CAAA;AAAA,MACA,MAAM,IAAI,EAAA,EAA4C;AACpD,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACxB,QAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,QAAA,OAAO,cAAA,CAAkB,MAAM,EAAE,CAAA;AAAA,MACnC,CAAA;AAAA,MACA,MAAM,IAAI,IAAA,EAAwD;AAChE,QAAA,MAAM,EAAA,GAAK,CAAA,KAAA,EAAQ,EAAE,OAAO,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACtE,QAAA,IAAA,CAAK,IAAI,EAAA,EAAI,EAAE,GAAI,IAAA,EAAkC,IAAI,CAAA;AACzD,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,EAAA,EAAG;AAAA,MACxB,CAAA;AAAA,MACA,MAAM,GAAA,CAAI,EAAA,EAAY,IAAA,EAA4C;AAChE,QAAA,IAAA,CAAK,IAAI,EAAA,EAAI,EAAE,GAAI,IAAA,EAAkC,IAAI,CAAA;AACzD,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB,CAAA;AAAA,MACA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAAqD;AAC5E,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACvB,QAAA,IAAI,CAAC,GAAA,EAAK;AACR,UAAA,IAAA,CAAK,IAAI,EAAA,EAAI,EAAE,GAAI,IAAA,EAAkC,IAAI,CAAA;AAAA,QAC3D,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,IAAI,EAAA,EAAI,EAAE,GAAG,GAAA,EAAK,GAAI,MAAkC,CAAA;AAAA,QAC/D;AACA,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB,CAAA;AAAA,MACA,MAAM,OAAO,EAAA,EAAmC;AAC9C,QAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AACd,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB,CAAA;AAAA,MACA,MAAM,MAAM,GAAA,EAAyC;AACnD,QAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AAGpB,UAAA,MAAM,OAAA,GAAU,IAAA;AAChB,UAAA,IAAI,EAAA,CAAG,SAAS,KAAA,EAAO;AACrB,YAAA,MAAM,EAAA,GAAK,CAAA,WAAA,EAAc,EAAE,OAAO,CAAA,CAAA;AAClC,YAAA,OAAA,CAAQ,IAAI,EAAA,EAAI,EAAE,GAAI,EAAA,CAAG,IAAA,EAAkC,IAAI,CAAA;AAAA,UACjE,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,KAAA,EAAO;AAC5B,YAAA,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,EAAA,EAAI,EAAE,GAAI,GAAG,IAAA,EAAkC,EAAA,EAAI,EAAA,CAAG,EAAA,EAAI,CAAA;AAAA,UAC3E,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,QAAA,EAAU;AAC/B,YAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA;AAC7B,YAAA,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,EAAA,EAAI,EAAE,GAAI,GAAA,IAAO,EAAC,EAAI,GAAI,EAAA,CAAG,IAAA,EAAkC,EAAA,EAAI,EAAA,CAAG,IAAI,CAAA;AAAA,UAC3F,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,QAAA,EAAU;AAC/B,YAAA,OAAA,CAAQ,MAAA,CAAO,GAAG,EAAE,CAAA;AAAA,UACtB;AAAA,QACF;AACA,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB,CAAA;AAAA,MACA,KAAA,CAAM,IAAY,EAAA,EAA0C;AAE1D,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACxB,QAAA,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,MAAM,GAAG,IAAA,GAAQ,IAAA,GAAa,IAAI,CAAC,CAAA;AAE1D,QAAA,OAAO,MAAM;AAAA,QAAC,CAAA;AAAA,MAChB,CAAA;AAAA,MACA,UAAA,CAAW,GAAwB,EAAA,EAAkD;AAEnF,QAAA,OAAA,CAAQ,OAAA,EAAQ,CAAE,IAAA,CAAK,YAAY;AACjC,UAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AAC7B,UAAA,EAAA,CAAG,IAAI,CAAA;AAAA,QACT,CAAC,CAAA;AACD,QAAA,OAAO,MAAM;AAAA,QAAC,CAAA;AAAA,MAChB,CAAA;AAAA,MACA,IAAI,EAAA,EAAyB;AAC3B,QAAA,OAAO;AAAA,UACL,IAAI,EAAA,GAAa;AAAE,YAAA,OAAO,EAAA;AAAA,UAAI,CAAA;AAAA,UAC9B,IAAI,IAAA,GAAe;AAAE,YAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAAA,UAAI,CAAA;AAAA,UAC7C,IAAI,UAAA,GAAqB;AAAE,YAAA,OAAO,IAAA;AAAA,UAAM,CAAA;AAAA,UACxC,MAAM,GAAA,GAAM;AACV,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACxB,YAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,YAAA,OAAO,cAAA,CAAkB,MAAM,EAAE,CAAA;AAAA,UACnC,CAAA;AAAA,UACA,MAAM,IAAI,IAAA,EAAqB;AAC7B,YAAA,IAAA,CAAK,IAAI,EAAA,EAAI,EAAE,GAAI,IAAA,EAAkC,IAAI,CAAA;AACzD,YAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,UACpB,CAAA;AAAA,UACA,MAAM,OAAO,IAAA,EAA8B;AACzC,YAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACvB,YAAA,IAAI,CAAC,GAAA,EAAK;AACR,cAAA,IAAA,CAAK,IAAI,EAAA,EAAI,EAAE,GAAI,IAAA,EAAkC,IAAI,CAAA;AAAA,YAC3D,CAAA,MAAO;AACL,cAAA,IAAA,CAAK,IAAI,EAAA,EAAI,EAAE,GAAG,GAAA,EAAK,GAAI,MAAkC,CAAA;AAAA,YAC/D;AACA,YAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,UACpB,CAAA;AAAA,UACA,MAAM,MAAA,GAAS;AACb,YAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AACd,YAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,UACpB,CAAA;AAAA,UACA,WAAW,EAAA,EAAwD;AACjE,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACxB,YAAA,OAAA,CAAQ,SAAQ,CAAE,IAAA;AAAA,cAAK,MACrB,EAAA,CAAG,IAAA,GAAO,eAAkB,IAAA,EAAM,EAAE,IAAI,IAAI;AAAA,aAC9C;AACA,YAAA,OAAO,MAAM;AAAA,YAAC,CAAA;AAAA,UAChB;AAAA,SACF;AAAA,MACF;AAAA,KACF;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,GAAA,CACJ,MAAA,EACA,OAAA,EACmC;AACnC,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI;AAEF,MAAA,QAAA,GAAW,MAAM,OAAO,QAAQ,CAAA;AAChC,MAAA,SAAA,GAAY,MAAM,OAAO,2BAA2B,CAAA;AAAA,IACtD,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,gBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,QAAA,CAAS,KAAA,CAAM,EAAE,kBAAA,EAAoB,MAAM,CAAA;AAGzD,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO,IAAI,OAAA,CAAQ,OAAA,GAAU,CAAC,OAAA,CAAQ,OAAO,CAAA;AAChF,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,KAAA,CAAM,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,CAAS,QAAA,EAAS;AACzC,IAAA,MAAM,WAAY,QAAA,CAAyC,IAAA;AAC3D,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,EAAS;AAO1B,IAAA,MAAM,gBAAgB,IAAA,CAAK,KAAA;AAC3B,IAAA,IAAI,CAAC,aAAA,IAAiB,OAAO,aAAA,CAAc,kBAAkB,UAAA,EAAY;AACvE,MAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,QACX,aAAA,EAAe,MAAM,CAAC,GAAA,KAAiB;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,MAAM,MAAM,SAAA,CAAU,OAAA,CAAQ,IAAA,EAAe,EAAE,QAAQ,CAAA;AAGvD,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,MAAM,WAAA,CAAY,EAAA,EAAI,KAAA,EAAO;AAC3B,QAAA,OAAO,MAAM,GAAA,CAAI,WAAA,CAAY,EAAW,CAAA;AAAA,MAC1C,CAAA;AAAA,MACA,MAAM,KAAA,GAAQ;AACZ,QAAA,MAAM,CAAA,GAAI,IAAA;AACV,QAAA,IAAI,CAAA,CAAE,GAAA,EAAK,MAAM,CAAA,CAAE,GAAA,EAAI;AAAA,MACzB;AAAA,KACF;AAAA,EACF;AAAA,EAEA,IAAI,SAAA,GAAuB;AACzB,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAA;AAAA,MACR,aAAA,EAAe,CAAA;AAAA,MACf,YAAA,EAAc,IAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,mBAAmB,GAAA,EAA0C;AAC3D,IAAA,OAAO,MAAM;AAAA,IAAC,CAAA;AAAA,EAChB;AAAA,EAEA,MAAM,KAAA,GAAuB;AAAA,EAE7B;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,EACpB;AAAA,EAEA,MAAM,YAAA,GAA0C;AAC9C,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA,EAGA,YAAA,CAAa,MAAc,KAAA,EAAsD;AAC/E,IAAA,IAAA,CAAK,MAAA,CAAO,IAAI,IAAA,EAAM,IAAI,IAAI,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAA;AAAA,EACtD;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,EACpB;AACF","file":"mocks.cjs","sourcesContent":["/**\r\n * Erros tipados do SDK.\r\n *\r\n * Todo erro lançado pelo SDK estende `NeetruError` — caller pode discriminar\r\n * por `.code` (string estável) sem parsing de message.\r\n */\r\n\r\n/** Códigos de erro estáveis do SDK. Adicionar aqui requer minor bump. */\r\nexport type NeetruErrorCode =\r\n | 'invalid_config'\r\n | 'missing_api_key'\r\n | 'unauthorized'\r\n | 'forbidden'\r\n | 'not_found'\r\n | 'rate_limited'\r\n | 'validation_failed'\r\n | 'network_error'\r\n | 'invalid_response'\r\n | 'server_error'\r\n | 'token_expired'\r\n | 'token_invalid_signature'\r\n | 'token_invalid_audience'\r\n | 'token_invalid_issuer'\r\n | 'unknown';\r\n\r\n/**\r\n * Erro tipado padrão do SDK. Sempre lançado em vez de Error genérico.\r\n *\r\n * @example\r\n * ```ts\r\n * try { await client.catalog.list(); }\r\n * catch (e) {\r\n * if (e instanceof NeetruError && e.code === 'rate_limited') retry();\r\n * }\r\n * ```\r\n */\r\nexport class NeetruError extends Error {\r\n public readonly code: NeetruErrorCode | string;\r\n public readonly status?: number;\r\n public readonly requestId?: string;\r\n\r\n constructor(\r\n code: NeetruErrorCode | string,\r\n message: string,\r\n status?: number,\r\n requestId?: string,\r\n ) {\r\n super(message);\r\n this.name = 'NeetruError';\r\n this.code = code;\r\n this.status = status;\r\n this.requestId = requestId;\r\n // Preserva o prototype chain ao herdar de Error (downlevel quirk de TS).\r\n Object.setPrototypeOf(this, NeetruError.prototype);\r\n }\r\n}\r\n","/**\r\n * NeetruDbError — classe de erro especializada para o módulo `db`.\r\n *\r\n * Conforma com 02-sdk.md §3.5: `NeetruDbError extends NeetruError`,\r\n * campo `code` fechado em `NeetruDbErrorCode`, campo `retryable` booleano,\r\n * campo `dbId` opaco para correlação.\r\n *\r\n * Herda de `NeetruError` para que um `catch (e) { if (e instanceof NeetruError) }`\r\n * genérico continue pegando erros de DB. Quem quer granularidade usa\r\n * `instanceof NeetruDbError` e o `code` fechado.\r\n */\r\n\r\nimport { NeetruError } from './errors';\r\n\r\n/**\r\n * Códigos de erro específicos do módulo `db`.\r\n *\r\n * - `db_unavailable` — lifecycle: provisionando / falhou / arquivado.\r\n * NÃO significa \"sem rede\" — offline é transparente.\r\n * - `db_not_found` — documento/coleção não encontrado no servidor.\r\n * - `db_conflict` — conflito de escrita detectado.\r\n * - `db_quota_exceeded` — quota de escrita/leitura excedida no banco.\r\n * - `db_permission_denied` — sem permissão para a operação.\r\n * - `db_invalid_query` — query inválida (campo, operador, tipo).\r\n * - `db_timeout` — operação excedeu o timeout.\r\n * - `offline_quota_exceeded`— IndexedDB cheio; a escrita não pode ser enfileirada.\r\n * - `offline_unavailable` — IndexedDB indisponível; SDK degrado para cache RAM.\r\n */\r\nexport type NeetruDbErrorCode =\r\n | 'db_unavailable'\r\n | 'db_not_found'\r\n | 'db_conflict'\r\n | 'db_quota_exceeded'\r\n | 'db_permission_denied'\r\n | 'db_invalid_query'\r\n | 'db_timeout'\r\n | 'offline_quota_exceeded'\r\n | 'offline_unavailable';\r\n\r\n/**\r\n * Códigos que são retryable por natureza.\r\n */\r\nconst RETRYABLE_CODES = new Set<NeetruDbErrorCode>([\r\n 'db_unavailable',\r\n 'db_conflict',\r\n 'db_timeout',\r\n]);\r\n\r\n/**\r\n * Erro tipado do módulo `db` — estende `NeetruError` para compatibilidade.\r\n *\r\n * @example\r\n * ```ts\r\n * try {\r\n * await client.db.collection('orders').add({ ... });\r\n * } catch (e) {\r\n * if (e instanceof NeetruDbError && e.code === 'offline_quota_exceeded') {\r\n * // IndexedDB cheio — notificar usuário\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class NeetruDbError extends NeetruError {\r\n /** Código de erro fechado — específico de DB. */\r\n public override readonly code: NeetruDbErrorCode;\r\n\r\n /**\r\n * `true` para erros transientes que o produto pode tentar novamente.\r\n * São retryable: `db_unavailable`, `db_conflict`, `db_timeout`.\r\n */\r\n public readonly retryable: boolean;\r\n\r\n /**\r\n * ID opaco do banco lógico — só para correlação com logs do Core.\r\n * Nunca deve ser exibido ao usuário final.\r\n */\r\n public readonly dbId?: string;\r\n\r\n constructor(code: NeetruDbErrorCode, message: string, dbId?: string) {\r\n super(code, message);\r\n this.name = 'NeetruDbError';\r\n this.code = code;\r\n this.retryable = RETRYABLE_CODES.has(code);\r\n this.dbId = dbId;\r\n // Preserva o prototype chain (TypeScript + downlevel).\r\n Object.setPrototypeOf(this, NeetruDbError.prototype);\r\n }\r\n}\r\n","/**\r\n * Mocks determinísticos do SDK — overridáveis em tests do consumer ou\r\n * ativados automaticamente quando `NEETRU_ENV=dev`.\r\n *\r\n * Nada aqui faz I/O. Tudo é puro/sincrono/in-memory. Compat total com\r\n * runtimes browser/Node/Edge — sem `node:` builtins.\r\n *\r\n * Cada mock implementa o mesmo namespace interface das implementações reais\r\n * (`AuthNamespace`, `UsageNamespace`, `SupportNamespace`) — caller pode\r\n * substituir 1:1 sem branching.\r\n *\r\n * @example\r\n * ```ts\r\n * import { createNeetruClient, MockAuth } from '@neetru/sdk';\r\n *\r\n * const client = createNeetruClient({\r\n * mocks: { auth: new MockAuth({ uid: 'fake-user', email: 'x@x.com' }) },\r\n * });\r\n * ```\r\n */\r\n\r\nimport type {\r\n AuthNamespace,\r\n AuthStateListener,\r\n CreateTicketInput,\r\n EntitlementCheck,\r\n NeetruUser,\r\n SignInOptions,\r\n SupportNamespace,\r\n SupportTicket,\r\n UsageNamespace,\r\n UsageQuota,\r\n} from './types';\r\nimport type {\r\n NeetruDb,\r\n NeetruSqlClient,\r\n} from './db/client-db';\r\nimport type { DbCollectionRef, DbWhereFilter, DbListResult, DbGetResult, DbBatchOp, DbDocRef, DbQuery } from './db/collection-ref';\r\nimport type { SyncState, ConflictRecord, Unsubscribe } from './db/offline/types';\r\nimport { NeetruDbError } from './db-errors';\r\n\r\n// ─── User fixture default ──────────────────────────────────────────────────\r\n\r\n/**\r\n * User fixture determinístico — usado quando `NEETRU_ENV=dev` e nenhum mock\r\n * custom é injetado. Email/uid estáveis pra snapshot tests.\r\n */\r\nexport const DEV_FIXTURE_USER: NeetruUser = Object.freeze({\r\n uid: 'dev-fixture-uid-0001',\r\n email: 'dev@neetru.local',\r\n emailVerified: true,\r\n displayName: 'Dev Fixture',\r\n isCustomer: true,\r\n isStaff: false,\r\n}) as NeetruUser;\r\n\r\n// ─── MockAuth ──────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Implementação in-memory do `AuthNamespace`. signIn marca o user como\r\n * logado; signOut limpa. onAuthStateChanged dispara callback síncrono no\r\n * subscribe + a cada mudança.\r\n */\r\nexport class MockAuth implements AuthNamespace {\r\n private _user: NeetruUser | null;\r\n private _listeners: Set<AuthStateListener>;\r\n\r\n constructor(initialUser: NeetruUser | null = null) {\r\n this._user = initialUser;\r\n this._listeners = new Set();\r\n }\r\n\r\n async signIn(_options?: SignInOptions): Promise<NeetruUser> {\r\n // Mock: apenas marca user como logado (usa fixture se não havia).\r\n if (!this._user) this._user = { ...DEV_FIXTURE_USER };\r\n this._notify();\r\n return this._user;\r\n }\r\n\r\n async signOut(): Promise<void> {\r\n this._user = null;\r\n this._notify();\r\n }\r\n\r\n getUser(): NeetruUser | null {\r\n return this._user;\r\n }\r\n\r\n onAuthStateChanged(listener: AuthStateListener): () => void {\r\n this._listeners.add(listener);\r\n // Dispara imediatamente com estado atual (espelha API Firebase Auth).\r\n try {\r\n listener(this._user);\r\n } catch {\r\n // Callback do consumer não pode quebrar o subscribe.\r\n }\r\n return () => {\r\n this._listeners.delete(listener);\r\n };\r\n }\r\n\r\n /**\r\n * Mock de `verifyToken` — decodifica o JWT sem verificar assinatura (pra testes).\r\n * Em dev, retorna o user atual do mock se já estiver logado. Aceita qualquer token\r\n * não-vazio sem chamar rede.\r\n *\r\n * Para simular falhas em testes, use `MockAuth.__mockVerifyToken(fn)`.\r\n */\r\n async verifyToken(token: string): Promise<NeetruUser> {\r\n if (this._verifyTokenOverride) {\r\n return this._verifyTokenOverride(token);\r\n }\r\n if (!token) {\r\n throw Object.assign(new Error('Token inválido'), { code: 'token_invalid_signature' });\r\n }\r\n // Tenta decodificar claims base64 sem verificar assinatura (útil em testes).\r\n try {\r\n const parts = token.split('.');\r\n if (parts.length === 3) {\r\n const b64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');\r\n const pad = '='.repeat((4 - (b64.length % 4)) % 4);\r\n const decoded = JSON.parse(\r\n typeof atob === 'function'\r\n ? atob(b64 + pad)\r\n : Buffer.from(b64 + pad, 'base64').toString('utf-8'),\r\n ) as Record<string, unknown>;\r\n if (typeof decoded.sub === 'string') {\r\n return {\r\n uid: decoded.sub,\r\n email: typeof decoded.email === 'string' ? decoded.email : '',\r\n emailVerified: typeof decoded.email_verified === 'boolean' ? decoded.email_verified : undefined,\r\n displayName: typeof decoded.name === 'string' ? decoded.name : undefined,\r\n photoURL: typeof decoded.picture === 'string' ? decoded.picture : undefined,\r\n isStaff: decoded.is_staff === true,\r\n isCustomer: decoded.is_customer === true,\r\n tenantId: typeof decoded.tenant_id === 'string' ? decoded.tenant_id : undefined,\r\n ...decoded,\r\n };\r\n }\r\n }\r\n } catch {\r\n /* fall through to return current user */\r\n }\r\n // Fallback: retorna o user atual do mock.\r\n if (this._user) return this._user;\r\n throw Object.assign(new Error('Nenhum user mock disponível'), { code: 'token_invalid_signature' });\r\n }\r\n\r\n private _verifyTokenOverride: ((token: string) => Promise<NeetruUser>) | null = null;\r\n\r\n /**\r\n * Injeta override pra `verifyToken` em testes — permite simular expiração,\r\n * assinatura inválida etc sem precisar de JWT real.\r\n *\r\n * @example\r\n * ```ts\r\n * const mock = new MockAuth(null);\r\n * mock.__mockVerifyToken(async () => { throw new NeetruError('token_expired', '...'); });\r\n * ```\r\n */\r\n __mockVerifyToken(fn: ((token: string) => Promise<NeetruUser>) | null): void {\r\n this._verifyTokenOverride = fn;\r\n }\r\n\r\n /** Helper de tests — força um user state arbitrário. */\r\n __setUser(user: NeetruUser | null): void {\r\n this._user = user;\r\n this._notify();\r\n }\r\n\r\n private _notify(): void {\r\n for (const l of this._listeners) {\r\n try {\r\n l(this._user);\r\n } catch {\r\n // ignore consumer errors\r\n }\r\n }\r\n }\r\n}\r\n\r\n// ─── MockUsage ─────────────────────────────────────────────────────────────\r\n\r\ninterface UsageRecord {\r\n event: string;\r\n properties?: Record<string, string | number | boolean | null>;\r\n timestamp: string;\r\n}\r\n\r\n/**\r\n * In-memory `UsageNamespace`. `track()` apenas acumula no array\r\n * `__getRecords()` (útil pra asserts em test). `getQuota()` retorna fixture\r\n * com `used = trackedCount` da metric.\r\n */\r\nexport class MockUsage implements UsageNamespace {\r\n private _records: UsageRecord[] = [];\r\n private _quotas: Map<string, UsageQuota>;\r\n /** v0.3 — counters in-memory pra `report()` / `check()`. */\r\n private _counters: Map<string, number> = new Map();\r\n\r\n constructor(initialQuotas: Record<string, UsageQuota> = {}) {\r\n this._quotas = new Map(Object.entries(initialQuotas));\r\n }\r\n\r\n async track(\r\n event: string,\r\n properties?: Record<string, string | number | boolean | null>,\r\n ): Promise<{ ok: true }> {\r\n this._records.push({\r\n event,\r\n properties,\r\n timestamp: new Date().toISOString(),\r\n });\r\n return { ok: true };\r\n }\r\n\r\n async getQuota(metric: string): Promise<UsageQuota> {\r\n const existing = this._quotas.get(metric);\r\n if (existing) return existing;\r\n return {\r\n metric,\r\n used: this._records.filter((r) => r.event === metric).length,\r\n limit: -1, // unlimited em mock por default\r\n plan: 'mock',\r\n };\r\n }\r\n\r\n /** v0.3 — Mock report incrementa o counter local. */\r\n async report(\r\n resource: string,\r\n qty: number = 1,\r\n _options?: { productId?: string; tenantId?: string },\r\n ): Promise<{\r\n ok: true;\r\n counterId?: string;\r\n value?: number;\r\n limit?: number;\r\n remaining?: number;\r\n status?: string;\r\n }> {\r\n if (!resource) throw new Error('resource required');\r\n const safeQty = Number.isFinite(qty) && qty > 0 ? Math.floor(qty) : 1;\r\n const existing = this._counters.get(resource) ?? 0;\r\n const next = existing + safeQty;\r\n this._counters.set(resource, next);\r\n const limitFixture = this._quotas.get(resource);\r\n const limit = limitFixture?.limit ?? -1;\r\n return {\r\n ok: true,\r\n counterId: `mock_${resource}`,\r\n value: next,\r\n limit,\r\n remaining: limit < 0 ? -1 : Math.max(0, limit - next),\r\n status: limit > 0 && next >= limit ? 'read_only_overlimit' : 'ok',\r\n };\r\n }\r\n\r\n /** v0.3 — Mock check usa quotas + counters in-memory. */\r\n async check(\r\n resource: string,\r\n _options?: { productId?: string; tenantId?: string },\r\n ): Promise<{\r\n allowed: boolean;\r\n reason?: string;\r\n remaining?: number;\r\n limit?: number;\r\n planId?: string | null;\r\n planFeatures?: string[];\r\n }> {\r\n const quota = this._quotas.get(resource);\r\n const used = this._counters.get(resource) ?? 0;\r\n if (!quota) {\r\n return { allowed: true, reason: 'granted', limit: -1, remaining: -1 };\r\n }\r\n const remaining = quota.limit < 0 ? -1 : Math.max(0, quota.limit - used);\r\n if (remaining === 0) {\r\n return {\r\n allowed: false,\r\n reason: 'limit_exceeded',\r\n limit: quota.limit,\r\n remaining: 0,\r\n };\r\n }\r\n return {\r\n allowed: true,\r\n reason: 'granted',\r\n limit: quota.limit,\r\n remaining,\r\n };\r\n }\r\n\r\n /** Test helper. */\r\n __getRecords(): readonly UsageRecord[] {\r\n return [...this._records];\r\n }\r\n /** Test helper — substitui quota fixture. */\r\n __setQuota(metric: string, quota: UsageQuota): void {\r\n this._quotas.set(metric, quota);\r\n }\r\n /** Test helper — limpa estado. */\r\n __reset(): void {\r\n this._records = [];\r\n this._quotas.clear();\r\n this._counters.clear();\r\n }\r\n}\r\n\r\n// ─── MockSupport ───────────────────────────────────────────────────────────\r\n\r\n/**\r\n * In-memory `SupportNamespace`. createTicket gera ID `mock-ticket-{n}`;\r\n * listMyTickets retorna todos criados (FIFO). Sequência por instância\r\n * (evita poluição cross-test do estado de módulo).\r\n */\r\nexport class MockSupport implements SupportNamespace {\r\n private _tickets: SupportTicket[] = [];\r\n private _ticketSeq = 0;\r\n\r\n async createTicket(input: CreateTicketInput): Promise<SupportTicket> {\r\n if (!input?.subject) throw new Error('subject required');\r\n if (!input?.message) throw new Error('message required');\r\n const ticket: SupportTicket = {\r\n id: `mock-ticket-${++this._ticketSeq}`,\r\n subject: input.subject,\r\n message: input.message,\r\n severity: input.severity ?? 'normal',\r\n status: 'open',\r\n createdAt: new Date().toISOString(),\r\n productSlug: input.productSlug,\r\n };\r\n this._tickets.push(ticket);\r\n return ticket;\r\n }\r\n\r\n async listMyTickets(): Promise<SupportTicket[]> {\r\n return [...this._tickets];\r\n }\r\n\r\n /** Test helper. */\r\n __reset(): void {\r\n this._tickets = [];\r\n this._ticketSeq = 0;\r\n }\r\n}\r\n\r\n// ─── MockEntitlements ──────────────────────────────────────────────────────\r\n\r\n/**\r\n * In-memory entitlements. Por default `allowed=true` em tudo (dev convém).\r\n * Use `__deny(slug, feature)` em tests pra simular bloqueio.\r\n */\r\nexport class MockEntitlements {\r\n private _denied: Set<string> = new Set();\r\n\r\n async check(productSlug: string, feature: string): Promise<boolean> {\r\n return !this._denied.has(`${productSlug}:${feature}`);\r\n }\r\n\r\n async checkDetailed(productSlug: string, feature: string): Promise<EntitlementCheck> {\r\n const allowed = await this.check(productSlug, feature);\r\n return {\r\n allowed,\r\n productSlug,\r\n feature,\r\n reason: allowed ? 'granted' : 'mock_denied',\r\n };\r\n }\r\n\r\n /** Test helper. */\r\n __deny(productSlug: string, feature: string): void {\r\n this._denied.add(`${productSlug}:${feature}`);\r\n }\r\n /** Test helper. */\r\n __reset(): void {\r\n this._denied.clear();\r\n }\r\n}\r\n\r\n// ─── MockDb (v2.0) ─────────────────────────────────────────────────────────\r\n\r\n/**\r\n * In-memory `NeetruDb`. Cada `collection(name)` aponta para um Map; ops\r\n * são totalmente síncronas (mas API await-friendly).\r\n *\r\n * v2.0: implementa a interface `NeetruDb` completa (collection, sql, syncState,\r\n * flush, clearCache, getConflicts, onSyncStateChanged).\r\n *\r\n * Útil para testar produtos consumidores sem rodar Core REST nem IndexedDB.\r\n */\r\nexport class MockDb implements NeetruDb {\r\n private _store: Map<string, Map<string, Record<string, unknown>>> = new Map();\r\n private _fixtures: Map<string, Record<string, Record<string, unknown>>>;\r\n\r\n constructor(initialFixtures: Record<string, Record<string, Record<string, unknown>>> = {}) {\r\n this._fixtures = new Map(Object.entries(initialFixtures));\r\n }\r\n\r\n collection<T = Record<string, unknown>>(name: string): DbCollectionRef<T> {\r\n const _store = this._store;\r\n const _fixtures = this._fixtures;\r\n if (!_store.has(name)) {\r\n const init = _fixtures.get(name);\r\n _store.set(\r\n name,\r\n init ? new Map(Object.entries(init)) : new Map(),\r\n );\r\n }\r\n const coll = _store.get(name)!;\r\n\r\n const matchesFilter = (\r\n doc: Record<string, unknown>,\r\n f: DbWhereFilter,\r\n ): boolean => {\r\n const v = doc[f.field];\r\n switch (f.op) {\r\n case '==':\r\n return v === f.value;\r\n case '!=':\r\n return v !== f.value;\r\n case '<':\r\n return typeof v === 'number' && typeof f.value === 'number' && v < f.value;\r\n case '<=':\r\n return typeof v === 'number' && typeof f.value === 'number' && v <= f.value;\r\n case '>':\r\n return typeof v === 'number' && typeof f.value === 'number' && v > f.value;\r\n case '>=':\r\n return typeof v === 'number' && typeof f.value === 'number' && v >= f.value;\r\n case 'in':\r\n return Array.isArray(f.value) && (f.value as unknown[]).includes(v);\r\n case 'array-contains':\r\n return Array.isArray(v) && (v as unknown[]).includes(f.value);\r\n case 'not-in':\r\n return Array.isArray(f.value) && !(f.value as unknown[]).includes(v);\r\n default:\r\n return true;\r\n }\r\n };\r\n\r\n let autoSeq = 0;\r\n\r\n // Helper to build a minimal DbListResult from raw items\r\n function buildListResult<U>(items: Array<Record<string, unknown>>): DbListResult<U> {\r\n return {\r\n docs: items.map((d, i) => ({ id: (d.id as string) ?? String(i), data: d as U })),\r\n nextCursor: null,\r\n fromCache: false,\r\n stale: false,\r\n hasPendingWrites: false,\r\n changes: [],\r\n };\r\n }\r\n\r\n // Helper to build a DbGetResult for a single doc\r\n function buildGetResult<U>(data: Record<string, unknown>, id: string): DbGetResult<U> {\r\n return {\r\n docs: [{ id, data: data as U }],\r\n fromCache: false,\r\n stale: false,\r\n hasPendingWrites: false,\r\n changes: [],\r\n };\r\n }\r\n\r\n const ref: DbCollectionRef<T> = {\r\n async list(q?: DbQuery): Promise<DbListResult<T>> {\r\n let items = Array.from(coll.values());\r\n if (q?.where && q.where.length > 0) {\r\n items = items.filter((doc) =>\r\n (q.where as DbWhereFilter[]).every((f) => matchesFilter(doc, f)),\r\n );\r\n }\r\n if (q?.orderBy) {\r\n const { field, direction } = q.orderBy;\r\n items = items.slice().sort((a, b) => {\r\n const av = a[field];\r\n const bv = b[field];\r\n const avs = av ?? '';\r\n const bvs = bv ?? '';\r\n const cmp = (avs as string) < (bvs as string) ? -1 : (avs as string) > (bvs as string) ? 1 : 0;\r\n return direction === 'desc' ? -cmp : cmp;\r\n });\r\n }\r\n const limit = q?.limit ?? 20;\r\n items = items.slice(0, limit);\r\n return buildListResult<T>(items);\r\n },\r\n async get(id: string): Promise<DbGetResult<T> | null> {\r\n const data = coll.get(id);\r\n if (!data) return null;\r\n return buildGetResult<T>(data, id);\r\n },\r\n async add(data: Omit<T, 'id'>): Promise<{ ok: true; id: string }> {\r\n const id = `mock-${++autoSeq}-${Math.random().toString(36).slice(2, 8)}`;\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n return { ok: true, id };\r\n },\r\n async set(id: string, data: Omit<T, 'id'>): Promise<{ ok: true }> {\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n return { ok: true };\r\n },\r\n async update(id: string, data: Partial<Omit<T, 'id'>>): Promise<{ ok: true }> {\r\n const cur = coll.get(id);\r\n if (!cur) {\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n } else {\r\n coll.set(id, { ...cur, ...(data as Record<string, unknown>) });\r\n }\r\n return { ok: true };\r\n },\r\n async remove(id: string): Promise<{ ok: true }> {\r\n coll.delete(id);\r\n return { ok: true };\r\n },\r\n async batch(ops: DbBatchOp[]): Promise<{ ok: true }> {\r\n for (const op of ops) {\r\n // Mock usa a coleção corrente (collName) — o campo collection foi removido\r\n // do discriminated union em 2.1.1; batch opera sempre na coleção do ref.\r\n const collMap = coll;\r\n if (op.kind === 'add') {\r\n const id = `mock-batch-${++autoSeq}`;\r\n collMap.set(id, { ...(op.data as Record<string, unknown>), id });\r\n } else if (op.kind === 'set') {\r\n collMap.set(op.id, { ...(op.data as Record<string, unknown>), id: op.id });\r\n } else if (op.kind === 'update') {\r\n const cur = collMap.get(op.id);\r\n collMap.set(op.id, { ...(cur ?? {}), ...(op.data as Record<string, unknown>), id: op.id });\r\n } else if (op.kind === 'remove') {\r\n collMap.delete(op.id);\r\n }\r\n }\r\n return { ok: true };\r\n },\r\n onDoc(id: string, cb: (doc: T | null) => void): Unsubscribe {\r\n // Entrega snapshot inicial imediato (sync mock)\r\n const data = coll.get(id);\r\n Promise.resolve().then(() => cb(data ? (data as T) : null));\r\n // Mock: não há feed realtime — retorna no-op unsubscribe\r\n return () => {};\r\n },\r\n onSnapshot(q: DbQuery | undefined, cb: (snap: DbListResult<T>) => void): Unsubscribe {\r\n // Entrega snapshot inicial imediato (sync mock)\r\n Promise.resolve().then(async () => {\r\n const snap = await ref.list(q);\r\n cb(snap);\r\n });\r\n return () => {};\r\n },\r\n doc(id: string): DbDocRef<T> {\r\n return {\r\n get id(): string { return id; },\r\n get path(): string { return `${name}/${id}`; },\r\n get collection(): string { return name; },\r\n async get() {\r\n const data = coll.get(id);\r\n if (!data) return null;\r\n return buildGetResult<T>(data, id);\r\n },\r\n async set(data: Omit<T, 'id'>) {\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n return { ok: true };\r\n },\r\n async update(data: Partial<Omit<T, 'id'>>) {\r\n const cur = coll.get(id);\r\n if (!cur) {\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n } else {\r\n coll.set(id, { ...cur, ...(data as Record<string, unknown>) });\r\n }\r\n return { ok: true };\r\n },\r\n async remove() {\r\n coll.delete(id);\r\n return { ok: true };\r\n },\r\n onSnapshot(cb: (snap: DbGetResult<T> | null) => void): Unsubscribe {\r\n const data = coll.get(id);\r\n Promise.resolve().then(() =>\r\n cb(data ? buildGetResult<T>(data, id) : null),\r\n );\r\n return () => {};\r\n },\r\n };\r\n },\r\n };\r\n\r\n return ref;\r\n }\r\n\r\n /**\r\n * Implementa SQL in-memory via `pg-mem` + `drizzle-orm/node-postgres`.\r\n *\r\n * bug_a7f2ae25fda54129b52b6dd55aaa6050 (HIGH 26/05): antes lançava\r\n * `db_unavailable` sempre, bloqueando vitest server-side dos consumers\r\n * que refatoraram pra `client.db.sql()`. Agora carrega `pg-mem` lazy +\r\n * cria `NodePgDatabase` Drizzle apontando pra DB in-memory.\r\n *\r\n * Requer `pg-mem`, `drizzle-orm` e `pg` como devDependencies do consumer\r\n * (instale com `npm install -D pg-mem drizzle-orm pg`). Se ausentes, joga\r\n * `db_unavailable` com mensagem clara.\r\n *\r\n * Use `options.initSql` pra criar tabelas no test setup — sem isso o orm\r\n * funciona mas qualquer SELECT/INSERT em tabela inexistente vai falhar.\r\n */\r\n async sql<TSchema extends Record<string, unknown>>(\r\n schema: TSchema,\r\n options?: { database?: string; initSql?: string | string[] },\r\n ): Promise<NeetruSqlClient<TSchema>> {\r\n let pgMemMod: typeof import('pg-mem');\r\n let drizzlePg: typeof import('drizzle-orm/node-postgres');\r\n try {\r\n // Lazy-load — sem essas devDeps, MockDb.sql() continua jogando erro claro.\r\n pgMemMod = await import('pg-mem');\r\n drizzlePg = await import('drizzle-orm/node-postgres');\r\n } catch {\r\n throw new NeetruDbError(\r\n 'db_unavailable',\r\n '[MockDb] sql() requer pg-mem + drizzle-orm + pg como devDependencies do consumer. Rode: npm install -D pg-mem drizzle-orm pg.',\r\n );\r\n }\r\n\r\n const memDb = pgMemMod.newDb({ noAstCoverageCheck: true });\r\n\r\n // Aplica DDL inicial (criar tabelas / seed) — só faz sentido em mock.\r\n if (options?.initSql) {\r\n const ddls = Array.isArray(options.initSql) ? options.initSql : [options.initSql];\r\n for (const ddl of ddls) {\r\n memDb.public.none(ddl);\r\n }\r\n }\r\n\r\n const adapters = memDb.adapters.createPg();\r\n const PoolCtor = (adapters as { Pool: new () => unknown }).Pool;\r\n const pool = new PoolCtor() as Record<string, unknown>;\r\n\r\n // bug_44bcc99f (HIGH 26/05): pg-mem não implementa pool.types.getTypeParser\r\n // que drizzle-orm/node-postgres/session.js chama em TODA query. Sem isso:\r\n // 'Error: Not supported: getTypeParser is not supported'. Injetar identity\r\n // parser resolve — types retornam o valor sem transformação (suficiente\r\n // pra tests in-memory; produção usa pg real com type parsers nativos).\r\n const existingTypes = pool.types as { getTypeParser?: unknown } | undefined;\r\n if (!existingTypes || typeof existingTypes.getTypeParser !== 'function') {\r\n pool.types = {\r\n getTypeParser: () => (val: unknown) => val,\r\n };\r\n }\r\n\r\n const orm = drizzlePg.drizzle(pool as never, { schema }) as unknown as\r\n import('drizzle-orm/node-postgres').NodePgDatabase<TSchema>;\r\n\r\n return {\r\n orm,\r\n async transaction(fn, _opts) {\r\n return await orm.transaction(fn as never) as never;\r\n },\r\n async close() {\r\n const p = pool as { end?: () => Promise<void> };\r\n if (p.end) await p.end();\r\n },\r\n } as NeetruSqlClient<TSchema>;\r\n }\r\n\r\n get syncState(): SyncState {\r\n return {\r\n status: 'idle',\r\n pendingWrites: 0,\r\n lastSyncedAt: null,\r\n isLeaderTab: true,\r\n };\r\n }\r\n\r\n onSyncStateChanged(_cb: (s: SyncState) => void): Unsubscribe {\r\n return () => {};\r\n }\r\n\r\n async flush(): Promise<void> {\r\n // no-op in mock\r\n }\r\n\r\n async clearCache(): Promise<void> {\r\n this._store.clear();\r\n }\r\n\r\n async getConflicts(): Promise<ConflictRecord[]> {\r\n return [];\r\n }\r\n\r\n /** Test helper — substitui fixture inteira de uma collection. */\r\n __setFixture(name: string, items: Record<string, Record<string, unknown>>): void {\r\n this._store.set(name, new Map(Object.entries(items)));\r\n }\r\n\r\n /** Test helper — reset total. */\r\n __reset(): void {\r\n this._store.clear();\r\n }\r\n}\r\n"]}
|
package/dist/mocks.mjs
CHANGED
|
@@ -508,6 +508,12 @@ var MockDb = class {
|
|
|
508
508
|
const adapters = memDb.adapters.createPg();
|
|
509
509
|
const PoolCtor = adapters.Pool;
|
|
510
510
|
const pool = new PoolCtor();
|
|
511
|
+
const existingTypes = pool.types;
|
|
512
|
+
if (!existingTypes || typeof existingTypes.getTypeParser !== "function") {
|
|
513
|
+
pool.types = {
|
|
514
|
+
getTypeParser: () => (val) => val
|
|
515
|
+
};
|
|
516
|
+
}
|
|
511
517
|
const orm = drizzlePg.drizzle(pool, { schema });
|
|
512
518
|
return {
|
|
513
519
|
orm,
|
package/dist/mocks.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/db-errors.ts","../src/mocks.ts"],"names":[],"mappings":"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","file":"mocks.mjs","sourcesContent":["/**\r\n * Erros tipados do SDK.\r\n *\r\n * Todo erro lançado pelo SDK estende `NeetruError` — caller pode discriminar\r\n * por `.code` (string estável) sem parsing de message.\r\n */\r\n\r\n/** Códigos de erro estáveis do SDK. Adicionar aqui requer minor bump. */\r\nexport type NeetruErrorCode =\r\n | 'invalid_config'\r\n | 'missing_api_key'\r\n | 'unauthorized'\r\n | 'forbidden'\r\n | 'not_found'\r\n | 'rate_limited'\r\n | 'validation_failed'\r\n | 'network_error'\r\n | 'invalid_response'\r\n | 'server_error'\r\n | 'token_expired'\r\n | 'token_invalid_signature'\r\n | 'token_invalid_audience'\r\n | 'token_invalid_issuer'\r\n | 'unknown';\r\n\r\n/**\r\n * Erro tipado padrão do SDK. Sempre lançado em vez de Error genérico.\r\n *\r\n * @example\r\n * ```ts\r\n * try { await client.catalog.list(); }\r\n * catch (e) {\r\n * if (e instanceof NeetruError && e.code === 'rate_limited') retry();\r\n * }\r\n * ```\r\n */\r\nexport class NeetruError extends Error {\r\n public readonly code: NeetruErrorCode | string;\r\n public readonly status?: number;\r\n public readonly requestId?: string;\r\n\r\n constructor(\r\n code: NeetruErrorCode | string,\r\n message: string,\r\n status?: number,\r\n requestId?: string,\r\n ) {\r\n super(message);\r\n this.name = 'NeetruError';\r\n this.code = code;\r\n this.status = status;\r\n this.requestId = requestId;\r\n // Preserva o prototype chain ao herdar de Error (downlevel quirk de TS).\r\n Object.setPrototypeOf(this, NeetruError.prototype);\r\n }\r\n}\r\n","/**\r\n * NeetruDbError — classe de erro especializada para o módulo `db`.\r\n *\r\n * Conforma com 02-sdk.md §3.5: `NeetruDbError extends NeetruError`,\r\n * campo `code` fechado em `NeetruDbErrorCode`, campo `retryable` booleano,\r\n * campo `dbId` opaco para correlação.\r\n *\r\n * Herda de `NeetruError` para que um `catch (e) { if (e instanceof NeetruError) }`\r\n * genérico continue pegando erros de DB. Quem quer granularidade usa\r\n * `instanceof NeetruDbError` e o `code` fechado.\r\n */\r\n\r\nimport { NeetruError } from './errors';\r\n\r\n/**\r\n * Códigos de erro específicos do módulo `db`.\r\n *\r\n * - `db_unavailable` — lifecycle: provisionando / falhou / arquivado.\r\n * NÃO significa \"sem rede\" — offline é transparente.\r\n * - `db_not_found` — documento/coleção não encontrado no servidor.\r\n * - `db_conflict` — conflito de escrita detectado.\r\n * - `db_quota_exceeded` — quota de escrita/leitura excedida no banco.\r\n * - `db_permission_denied` — sem permissão para a operação.\r\n * - `db_invalid_query` — query inválida (campo, operador, tipo).\r\n * - `db_timeout` — operação excedeu o timeout.\r\n * - `offline_quota_exceeded`— IndexedDB cheio; a escrita não pode ser enfileirada.\r\n * - `offline_unavailable` — IndexedDB indisponível; SDK degrado para cache RAM.\r\n */\r\nexport type NeetruDbErrorCode =\r\n | 'db_unavailable'\r\n | 'db_not_found'\r\n | 'db_conflict'\r\n | 'db_quota_exceeded'\r\n | 'db_permission_denied'\r\n | 'db_invalid_query'\r\n | 'db_timeout'\r\n | 'offline_quota_exceeded'\r\n | 'offline_unavailable';\r\n\r\n/**\r\n * Códigos que são retryable por natureza.\r\n */\r\nconst RETRYABLE_CODES = new Set<NeetruDbErrorCode>([\r\n 'db_unavailable',\r\n 'db_conflict',\r\n 'db_timeout',\r\n]);\r\n\r\n/**\r\n * Erro tipado do módulo `db` — estende `NeetruError` para compatibilidade.\r\n *\r\n * @example\r\n * ```ts\r\n * try {\r\n * await client.db.collection('orders').add({ ... });\r\n * } catch (e) {\r\n * if (e instanceof NeetruDbError && e.code === 'offline_quota_exceeded') {\r\n * // IndexedDB cheio — notificar usuário\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class NeetruDbError extends NeetruError {\r\n /** Código de erro fechado — específico de DB. */\r\n public override readonly code: NeetruDbErrorCode;\r\n\r\n /**\r\n * `true` para erros transientes que o produto pode tentar novamente.\r\n * São retryable: `db_unavailable`, `db_conflict`, `db_timeout`.\r\n */\r\n public readonly retryable: boolean;\r\n\r\n /**\r\n * ID opaco do banco lógico — só para correlação com logs do Core.\r\n * Nunca deve ser exibido ao usuário final.\r\n */\r\n public readonly dbId?: string;\r\n\r\n constructor(code: NeetruDbErrorCode, message: string, dbId?: string) {\r\n super(code, message);\r\n this.name = 'NeetruDbError';\r\n this.code = code;\r\n this.retryable = RETRYABLE_CODES.has(code);\r\n this.dbId = dbId;\r\n // Preserva o prototype chain (TypeScript + downlevel).\r\n Object.setPrototypeOf(this, NeetruDbError.prototype);\r\n }\r\n}\r\n","/**\r\n * Mocks determinísticos do SDK — overridáveis em tests do consumer ou\r\n * ativados automaticamente quando `NEETRU_ENV=dev`.\r\n *\r\n * Nada aqui faz I/O. Tudo é puro/sincrono/in-memory. Compat total com\r\n * runtimes browser/Node/Edge — sem `node:` builtins.\r\n *\r\n * Cada mock implementa o mesmo namespace interface das implementações reais\r\n * (`AuthNamespace`, `UsageNamespace`, `SupportNamespace`) — caller pode\r\n * substituir 1:1 sem branching.\r\n *\r\n * @example\r\n * ```ts\r\n * import { createNeetruClient, MockAuth } from '@neetru/sdk';\r\n *\r\n * const client = createNeetruClient({\r\n * mocks: { auth: new MockAuth({ uid: 'fake-user', email: 'x@x.com' }) },\r\n * });\r\n * ```\r\n */\r\n\r\nimport type {\r\n AuthNamespace,\r\n AuthStateListener,\r\n CreateTicketInput,\r\n EntitlementCheck,\r\n NeetruUser,\r\n SignInOptions,\r\n SupportNamespace,\r\n SupportTicket,\r\n UsageNamespace,\r\n UsageQuota,\r\n} from './types';\r\nimport type {\r\n NeetruDb,\r\n NeetruSqlClient,\r\n} from './db/client-db';\r\nimport type { DbCollectionRef, DbWhereFilter, DbListResult, DbGetResult, DbBatchOp, DbDocRef, DbQuery } from './db/collection-ref';\r\nimport type { SyncState, ConflictRecord, Unsubscribe } from './db/offline/types';\r\nimport { NeetruDbError } from './db-errors';\r\n\r\n// ─── User fixture default ──────────────────────────────────────────────────\r\n\r\n/**\r\n * User fixture determinístico — usado quando `NEETRU_ENV=dev` e nenhum mock\r\n * custom é injetado. Email/uid estáveis pra snapshot tests.\r\n */\r\nexport const DEV_FIXTURE_USER: NeetruUser = Object.freeze({\r\n uid: 'dev-fixture-uid-0001',\r\n email: 'dev@neetru.local',\r\n emailVerified: true,\r\n displayName: 'Dev Fixture',\r\n isCustomer: true,\r\n isStaff: false,\r\n}) as NeetruUser;\r\n\r\n// ─── MockAuth ──────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Implementação in-memory do `AuthNamespace`. signIn marca o user como\r\n * logado; signOut limpa. onAuthStateChanged dispara callback síncrono no\r\n * subscribe + a cada mudança.\r\n */\r\nexport class MockAuth implements AuthNamespace {\r\n private _user: NeetruUser | null;\r\n private _listeners: Set<AuthStateListener>;\r\n\r\n constructor(initialUser: NeetruUser | null = null) {\r\n this._user = initialUser;\r\n this._listeners = new Set();\r\n }\r\n\r\n async signIn(_options?: SignInOptions): Promise<NeetruUser> {\r\n // Mock: apenas marca user como logado (usa fixture se não havia).\r\n if (!this._user) this._user = { ...DEV_FIXTURE_USER };\r\n this._notify();\r\n return this._user;\r\n }\r\n\r\n async signOut(): Promise<void> {\r\n this._user = null;\r\n this._notify();\r\n }\r\n\r\n getUser(): NeetruUser | null {\r\n return this._user;\r\n }\r\n\r\n onAuthStateChanged(listener: AuthStateListener): () => void {\r\n this._listeners.add(listener);\r\n // Dispara imediatamente com estado atual (espelha API Firebase Auth).\r\n try {\r\n listener(this._user);\r\n } catch {\r\n // Callback do consumer não pode quebrar o subscribe.\r\n }\r\n return () => {\r\n this._listeners.delete(listener);\r\n };\r\n }\r\n\r\n /**\r\n * Mock de `verifyToken` — decodifica o JWT sem verificar assinatura (pra testes).\r\n * Em dev, retorna o user atual do mock se já estiver logado. Aceita qualquer token\r\n * não-vazio sem chamar rede.\r\n *\r\n * Para simular falhas em testes, use `MockAuth.__mockVerifyToken(fn)`.\r\n */\r\n async verifyToken(token: string): Promise<NeetruUser> {\r\n if (this._verifyTokenOverride) {\r\n return this._verifyTokenOverride(token);\r\n }\r\n if (!token) {\r\n throw Object.assign(new Error('Token inválido'), { code: 'token_invalid_signature' });\r\n }\r\n // Tenta decodificar claims base64 sem verificar assinatura (útil em testes).\r\n try {\r\n const parts = token.split('.');\r\n if (parts.length === 3) {\r\n const b64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');\r\n const pad = '='.repeat((4 - (b64.length % 4)) % 4);\r\n const decoded = JSON.parse(\r\n typeof atob === 'function'\r\n ? atob(b64 + pad)\r\n : Buffer.from(b64 + pad, 'base64').toString('utf-8'),\r\n ) as Record<string, unknown>;\r\n if (typeof decoded.sub === 'string') {\r\n return {\r\n uid: decoded.sub,\r\n email: typeof decoded.email === 'string' ? decoded.email : '',\r\n emailVerified: typeof decoded.email_verified === 'boolean' ? decoded.email_verified : undefined,\r\n displayName: typeof decoded.name === 'string' ? decoded.name : undefined,\r\n photoURL: typeof decoded.picture === 'string' ? decoded.picture : undefined,\r\n isStaff: decoded.is_staff === true,\r\n isCustomer: decoded.is_customer === true,\r\n tenantId: typeof decoded.tenant_id === 'string' ? decoded.tenant_id : undefined,\r\n ...decoded,\r\n };\r\n }\r\n }\r\n } catch {\r\n /* fall through to return current user */\r\n }\r\n // Fallback: retorna o user atual do mock.\r\n if (this._user) return this._user;\r\n throw Object.assign(new Error('Nenhum user mock disponível'), { code: 'token_invalid_signature' });\r\n }\r\n\r\n private _verifyTokenOverride: ((token: string) => Promise<NeetruUser>) | null = null;\r\n\r\n /**\r\n * Injeta override pra `verifyToken` em testes — permite simular expiração,\r\n * assinatura inválida etc sem precisar de JWT real.\r\n *\r\n * @example\r\n * ```ts\r\n * const mock = new MockAuth(null);\r\n * mock.__mockVerifyToken(async () => { throw new NeetruError('token_expired', '...'); });\r\n * ```\r\n */\r\n __mockVerifyToken(fn: ((token: string) => Promise<NeetruUser>) | null): void {\r\n this._verifyTokenOverride = fn;\r\n }\r\n\r\n /** Helper de tests — força um user state arbitrário. */\r\n __setUser(user: NeetruUser | null): void {\r\n this._user = user;\r\n this._notify();\r\n }\r\n\r\n private _notify(): void {\r\n for (const l of this._listeners) {\r\n try {\r\n l(this._user);\r\n } catch {\r\n // ignore consumer errors\r\n }\r\n }\r\n }\r\n}\r\n\r\n// ─── MockUsage ─────────────────────────────────────────────────────────────\r\n\r\ninterface UsageRecord {\r\n event: string;\r\n properties?: Record<string, string | number | boolean | null>;\r\n timestamp: string;\r\n}\r\n\r\n/**\r\n * In-memory `UsageNamespace`. `track()` apenas acumula no array\r\n * `__getRecords()` (útil pra asserts em test). `getQuota()` retorna fixture\r\n * com `used = trackedCount` da metric.\r\n */\r\nexport class MockUsage implements UsageNamespace {\r\n private _records: UsageRecord[] = [];\r\n private _quotas: Map<string, UsageQuota>;\r\n /** v0.3 — counters in-memory pra `report()` / `check()`. */\r\n private _counters: Map<string, number> = new Map();\r\n\r\n constructor(initialQuotas: Record<string, UsageQuota> = {}) {\r\n this._quotas = new Map(Object.entries(initialQuotas));\r\n }\r\n\r\n async track(\r\n event: string,\r\n properties?: Record<string, string | number | boolean | null>,\r\n ): Promise<{ ok: true }> {\r\n this._records.push({\r\n event,\r\n properties,\r\n timestamp: new Date().toISOString(),\r\n });\r\n return { ok: true };\r\n }\r\n\r\n async getQuota(metric: string): Promise<UsageQuota> {\r\n const existing = this._quotas.get(metric);\r\n if (existing) return existing;\r\n return {\r\n metric,\r\n used: this._records.filter((r) => r.event === metric).length,\r\n limit: -1, // unlimited em mock por default\r\n plan: 'mock',\r\n };\r\n }\r\n\r\n /** v0.3 — Mock report incrementa o counter local. */\r\n async report(\r\n resource: string,\r\n qty: number = 1,\r\n _options?: { productId?: string; tenantId?: string },\r\n ): Promise<{\r\n ok: true;\r\n counterId?: string;\r\n value?: number;\r\n limit?: number;\r\n remaining?: number;\r\n status?: string;\r\n }> {\r\n if (!resource) throw new Error('resource required');\r\n const safeQty = Number.isFinite(qty) && qty > 0 ? Math.floor(qty) : 1;\r\n const existing = this._counters.get(resource) ?? 0;\r\n const next = existing + safeQty;\r\n this._counters.set(resource, next);\r\n const limitFixture = this._quotas.get(resource);\r\n const limit = limitFixture?.limit ?? -1;\r\n return {\r\n ok: true,\r\n counterId: `mock_${resource}`,\r\n value: next,\r\n limit,\r\n remaining: limit < 0 ? -1 : Math.max(0, limit - next),\r\n status: limit > 0 && next >= limit ? 'read_only_overlimit' : 'ok',\r\n };\r\n }\r\n\r\n /** v0.3 — Mock check usa quotas + counters in-memory. */\r\n async check(\r\n resource: string,\r\n _options?: { productId?: string; tenantId?: string },\r\n ): Promise<{\r\n allowed: boolean;\r\n reason?: string;\r\n remaining?: number;\r\n limit?: number;\r\n planId?: string | null;\r\n planFeatures?: string[];\r\n }> {\r\n const quota = this._quotas.get(resource);\r\n const used = this._counters.get(resource) ?? 0;\r\n if (!quota) {\r\n return { allowed: true, reason: 'granted', limit: -1, remaining: -1 };\r\n }\r\n const remaining = quota.limit < 0 ? -1 : Math.max(0, quota.limit - used);\r\n if (remaining === 0) {\r\n return {\r\n allowed: false,\r\n reason: 'limit_exceeded',\r\n limit: quota.limit,\r\n remaining: 0,\r\n };\r\n }\r\n return {\r\n allowed: true,\r\n reason: 'granted',\r\n limit: quota.limit,\r\n remaining,\r\n };\r\n }\r\n\r\n /** Test helper. */\r\n __getRecords(): readonly UsageRecord[] {\r\n return [...this._records];\r\n }\r\n /** Test helper — substitui quota fixture. */\r\n __setQuota(metric: string, quota: UsageQuota): void {\r\n this._quotas.set(metric, quota);\r\n }\r\n /** Test helper — limpa estado. */\r\n __reset(): void {\r\n this._records = [];\r\n this._quotas.clear();\r\n this._counters.clear();\r\n }\r\n}\r\n\r\n// ─── MockSupport ───────────────────────────────────────────────────────────\r\n\r\n/**\r\n * In-memory `SupportNamespace`. createTicket gera ID `mock-ticket-{n}`;\r\n * listMyTickets retorna todos criados (FIFO). Sequência por instância\r\n * (evita poluição cross-test do estado de módulo).\r\n */\r\nexport class MockSupport implements SupportNamespace {\r\n private _tickets: SupportTicket[] = [];\r\n private _ticketSeq = 0;\r\n\r\n async createTicket(input: CreateTicketInput): Promise<SupportTicket> {\r\n if (!input?.subject) throw new Error('subject required');\r\n if (!input?.message) throw new Error('message required');\r\n const ticket: SupportTicket = {\r\n id: `mock-ticket-${++this._ticketSeq}`,\r\n subject: input.subject,\r\n message: input.message,\r\n severity: input.severity ?? 'normal',\r\n status: 'open',\r\n createdAt: new Date().toISOString(),\r\n productSlug: input.productSlug,\r\n };\r\n this._tickets.push(ticket);\r\n return ticket;\r\n }\r\n\r\n async listMyTickets(): Promise<SupportTicket[]> {\r\n return [...this._tickets];\r\n }\r\n\r\n /** Test helper. */\r\n __reset(): void {\r\n this._tickets = [];\r\n this._ticketSeq = 0;\r\n }\r\n}\r\n\r\n// ─── MockEntitlements ──────────────────────────────────────────────────────\r\n\r\n/**\r\n * In-memory entitlements. Por default `allowed=true` em tudo (dev convém).\r\n * Use `__deny(slug, feature)` em tests pra simular bloqueio.\r\n */\r\nexport class MockEntitlements {\r\n private _denied: Set<string> = new Set();\r\n\r\n async check(productSlug: string, feature: string): Promise<boolean> {\r\n return !this._denied.has(`${productSlug}:${feature}`);\r\n }\r\n\r\n async checkDetailed(productSlug: string, feature: string): Promise<EntitlementCheck> {\r\n const allowed = await this.check(productSlug, feature);\r\n return {\r\n allowed,\r\n productSlug,\r\n feature,\r\n reason: allowed ? 'granted' : 'mock_denied',\r\n };\r\n }\r\n\r\n /** Test helper. */\r\n __deny(productSlug: string, feature: string): void {\r\n this._denied.add(`${productSlug}:${feature}`);\r\n }\r\n /** Test helper. */\r\n __reset(): void {\r\n this._denied.clear();\r\n }\r\n}\r\n\r\n// ─── MockDb (v2.0) ─────────────────────────────────────────────────────────\r\n\r\n/**\r\n * In-memory `NeetruDb`. Cada `collection(name)` aponta para um Map; ops\r\n * são totalmente síncronas (mas API await-friendly).\r\n *\r\n * v2.0: implementa a interface `NeetruDb` completa (collection, sql, syncState,\r\n * flush, clearCache, getConflicts, onSyncStateChanged).\r\n *\r\n * Útil para testar produtos consumidores sem rodar Core REST nem IndexedDB.\r\n */\r\nexport class MockDb implements NeetruDb {\r\n private _store: Map<string, Map<string, Record<string, unknown>>> = new Map();\r\n private _fixtures: Map<string, Record<string, Record<string, unknown>>>;\r\n\r\n constructor(initialFixtures: Record<string, Record<string, Record<string, unknown>>> = {}) {\r\n this._fixtures = new Map(Object.entries(initialFixtures));\r\n }\r\n\r\n collection<T = Record<string, unknown>>(name: string): DbCollectionRef<T> {\r\n const _store = this._store;\r\n const _fixtures = this._fixtures;\r\n if (!_store.has(name)) {\r\n const init = _fixtures.get(name);\r\n _store.set(\r\n name,\r\n init ? new Map(Object.entries(init)) : new Map(),\r\n );\r\n }\r\n const coll = _store.get(name)!;\r\n\r\n const matchesFilter = (\r\n doc: Record<string, unknown>,\r\n f: DbWhereFilter,\r\n ): boolean => {\r\n const v = doc[f.field];\r\n switch (f.op) {\r\n case '==':\r\n return v === f.value;\r\n case '!=':\r\n return v !== f.value;\r\n case '<':\r\n return typeof v === 'number' && typeof f.value === 'number' && v < f.value;\r\n case '<=':\r\n return typeof v === 'number' && typeof f.value === 'number' && v <= f.value;\r\n case '>':\r\n return typeof v === 'number' && typeof f.value === 'number' && v > f.value;\r\n case '>=':\r\n return typeof v === 'number' && typeof f.value === 'number' && v >= f.value;\r\n case 'in':\r\n return Array.isArray(f.value) && (f.value as unknown[]).includes(v);\r\n case 'array-contains':\r\n return Array.isArray(v) && (v as unknown[]).includes(f.value);\r\n case 'not-in':\r\n return Array.isArray(f.value) && !(f.value as unknown[]).includes(v);\r\n default:\r\n return true;\r\n }\r\n };\r\n\r\n let autoSeq = 0;\r\n\r\n // Helper to build a minimal DbListResult from raw items\r\n function buildListResult<U>(items: Array<Record<string, unknown>>): DbListResult<U> {\r\n return {\r\n docs: items.map((d, i) => ({ id: (d.id as string) ?? String(i), data: d as U })),\r\n nextCursor: null,\r\n fromCache: false,\r\n stale: false,\r\n hasPendingWrites: false,\r\n changes: [],\r\n };\r\n }\r\n\r\n // Helper to build a DbGetResult for a single doc\r\n function buildGetResult<U>(data: Record<string, unknown>, id: string): DbGetResult<U> {\r\n return {\r\n docs: [{ id, data: data as U }],\r\n fromCache: false,\r\n stale: false,\r\n hasPendingWrites: false,\r\n changes: [],\r\n };\r\n }\r\n\r\n const ref: DbCollectionRef<T> = {\r\n async list(q?: DbQuery): Promise<DbListResult<T>> {\r\n let items = Array.from(coll.values());\r\n if (q?.where && q.where.length > 0) {\r\n items = items.filter((doc) =>\r\n (q.where as DbWhereFilter[]).every((f) => matchesFilter(doc, f)),\r\n );\r\n }\r\n if (q?.orderBy) {\r\n const { field, direction } = q.orderBy;\r\n items = items.slice().sort((a, b) => {\r\n const av = a[field];\r\n const bv = b[field];\r\n const avs = av ?? '';\r\n const bvs = bv ?? '';\r\n const cmp = (avs as string) < (bvs as string) ? -1 : (avs as string) > (bvs as string) ? 1 : 0;\r\n return direction === 'desc' ? -cmp : cmp;\r\n });\r\n }\r\n const limit = q?.limit ?? 20;\r\n items = items.slice(0, limit);\r\n return buildListResult<T>(items);\r\n },\r\n async get(id: string): Promise<DbGetResult<T> | null> {\r\n const data = coll.get(id);\r\n if (!data) return null;\r\n return buildGetResult<T>(data, id);\r\n },\r\n async add(data: Omit<T, 'id'>): Promise<{ ok: true; id: string }> {\r\n const id = `mock-${++autoSeq}-${Math.random().toString(36).slice(2, 8)}`;\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n return { ok: true, id };\r\n },\r\n async set(id: string, data: Omit<T, 'id'>): Promise<{ ok: true }> {\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n return { ok: true };\r\n },\r\n async update(id: string, data: Partial<Omit<T, 'id'>>): Promise<{ ok: true }> {\r\n const cur = coll.get(id);\r\n if (!cur) {\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n } else {\r\n coll.set(id, { ...cur, ...(data as Record<string, unknown>) });\r\n }\r\n return { ok: true };\r\n },\r\n async remove(id: string): Promise<{ ok: true }> {\r\n coll.delete(id);\r\n return { ok: true };\r\n },\r\n async batch(ops: DbBatchOp[]): Promise<{ ok: true }> {\r\n for (const op of ops) {\r\n // Mock usa a coleção corrente (collName) — o campo collection foi removido\r\n // do discriminated union em 2.1.1; batch opera sempre na coleção do ref.\r\n const collMap = coll;\r\n if (op.kind === 'add') {\r\n const id = `mock-batch-${++autoSeq}`;\r\n collMap.set(id, { ...(op.data as Record<string, unknown>), id });\r\n } else if (op.kind === 'set') {\r\n collMap.set(op.id, { ...(op.data as Record<string, unknown>), id: op.id });\r\n } else if (op.kind === 'update') {\r\n const cur = collMap.get(op.id);\r\n collMap.set(op.id, { ...(cur ?? {}), ...(op.data as Record<string, unknown>), id: op.id });\r\n } else if (op.kind === 'remove') {\r\n collMap.delete(op.id);\r\n }\r\n }\r\n return { ok: true };\r\n },\r\n onDoc(id: string, cb: (doc: T | null) => void): Unsubscribe {\r\n // Entrega snapshot inicial imediato (sync mock)\r\n const data = coll.get(id);\r\n Promise.resolve().then(() => cb(data ? (data as T) : null));\r\n // Mock: não há feed realtime — retorna no-op unsubscribe\r\n return () => {};\r\n },\r\n onSnapshot(q: DbQuery | undefined, cb: (snap: DbListResult<T>) => void): Unsubscribe {\r\n // Entrega snapshot inicial imediato (sync mock)\r\n Promise.resolve().then(async () => {\r\n const snap = await ref.list(q);\r\n cb(snap);\r\n });\r\n return () => {};\r\n },\r\n doc(id: string): DbDocRef<T> {\r\n return {\r\n get id(): string { return id; },\r\n get path(): string { return `${name}/${id}`; },\r\n get collection(): string { return name; },\r\n async get() {\r\n const data = coll.get(id);\r\n if (!data) return null;\r\n return buildGetResult<T>(data, id);\r\n },\r\n async set(data: Omit<T, 'id'>) {\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n return { ok: true };\r\n },\r\n async update(data: Partial<Omit<T, 'id'>>) {\r\n const cur = coll.get(id);\r\n if (!cur) {\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n } else {\r\n coll.set(id, { ...cur, ...(data as Record<string, unknown>) });\r\n }\r\n return { ok: true };\r\n },\r\n async remove() {\r\n coll.delete(id);\r\n return { ok: true };\r\n },\r\n onSnapshot(cb: (snap: DbGetResult<T> | null) => void): Unsubscribe {\r\n const data = coll.get(id);\r\n Promise.resolve().then(() =>\r\n cb(data ? buildGetResult<T>(data, id) : null),\r\n );\r\n return () => {};\r\n },\r\n };\r\n },\r\n };\r\n\r\n return ref;\r\n }\r\n\r\n /**\r\n * Implementa SQL in-memory via `pg-mem` + `drizzle-orm/node-postgres`.\r\n *\r\n * bug_a7f2ae25fda54129b52b6dd55aaa6050 (HIGH 26/05): antes lançava\r\n * `db_unavailable` sempre, bloqueando vitest server-side dos consumers\r\n * que refatoraram pra `client.db.sql()`. Agora carrega `pg-mem` lazy +\r\n * cria `NodePgDatabase` Drizzle apontando pra DB in-memory.\r\n *\r\n * Requer `pg-mem`, `drizzle-orm` e `pg` como devDependencies do consumer\r\n * (instale com `npm install -D pg-mem drizzle-orm pg`). Se ausentes, joga\r\n * `db_unavailable` com mensagem clara.\r\n *\r\n * Use `options.initSql` pra criar tabelas no test setup — sem isso o orm\r\n * funciona mas qualquer SELECT/INSERT em tabela inexistente vai falhar.\r\n */\r\n async sql<TSchema extends Record<string, unknown>>(\r\n schema: TSchema,\r\n options?: { database?: string; initSql?: string | string[] },\r\n ): Promise<NeetruSqlClient<TSchema>> {\r\n let pgMemMod: typeof import('pg-mem');\r\n let drizzlePg: typeof import('drizzle-orm/node-postgres');\r\n try {\r\n // Lazy-load — sem essas devDeps, MockDb.sql() continua jogando erro claro.\r\n pgMemMod = await import('pg-mem');\r\n drizzlePg = await import('drizzle-orm/node-postgres');\r\n } catch {\r\n throw new NeetruDbError(\r\n 'db_unavailable',\r\n '[MockDb] sql() requer pg-mem + drizzle-orm + pg como devDependencies do consumer. Rode: npm install -D pg-mem drizzle-orm pg.',\r\n );\r\n }\r\n\r\n const memDb = pgMemMod.newDb({ noAstCoverageCheck: true });\r\n\r\n // Aplica DDL inicial (criar tabelas / seed) — só faz sentido em mock.\r\n if (options?.initSql) {\r\n const ddls = Array.isArray(options.initSql) ? options.initSql : [options.initSql];\r\n for (const ddl of ddls) {\r\n memDb.public.none(ddl);\r\n }\r\n }\r\n\r\n const adapters = memDb.adapters.createPg();\r\n const PoolCtor = (adapters as { Pool: new () => unknown }).Pool;\r\n const pool = new PoolCtor();\r\n const orm = drizzlePg.drizzle(pool as never, { schema }) as unknown as\r\n import('drizzle-orm/node-postgres').NodePgDatabase<TSchema>;\r\n\r\n return {\r\n orm,\r\n async transaction(fn, _opts) {\r\n return await orm.transaction(fn as never) as never;\r\n },\r\n async close() {\r\n const p = pool as { end?: () => Promise<void> };\r\n if (p.end) await p.end();\r\n },\r\n } as NeetruSqlClient<TSchema>;\r\n }\r\n\r\n get syncState(): SyncState {\r\n return {\r\n status: 'idle',\r\n pendingWrites: 0,\r\n lastSyncedAt: null,\r\n isLeaderTab: true,\r\n };\r\n }\r\n\r\n onSyncStateChanged(_cb: (s: SyncState) => void): Unsubscribe {\r\n return () => {};\r\n }\r\n\r\n async flush(): Promise<void> {\r\n // no-op in mock\r\n }\r\n\r\n async clearCache(): Promise<void> {\r\n this._store.clear();\r\n }\r\n\r\n async getConflicts(): Promise<ConflictRecord[]> {\r\n return [];\r\n }\r\n\r\n /** Test helper — substitui fixture inteira de uma collection. */\r\n __setFixture(name: string, items: Record<string, Record<string, unknown>>): void {\r\n this._store.set(name, new Map(Object.entries(items)));\r\n }\r\n\r\n /** Test helper — reset total. */\r\n __reset(): void {\r\n this._store.clear();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/db-errors.ts","../src/mocks.ts"],"names":[],"mappings":"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","file":"mocks.mjs","sourcesContent":["/**\r\n * Erros tipados do SDK.\r\n *\r\n * Todo erro lançado pelo SDK estende `NeetruError` — caller pode discriminar\r\n * por `.code` (string estável) sem parsing de message.\r\n */\r\n\r\n/** Códigos de erro estáveis do SDK. Adicionar aqui requer minor bump. */\r\nexport type NeetruErrorCode =\r\n | 'invalid_config'\r\n | 'missing_api_key'\r\n | 'unauthorized'\r\n | 'forbidden'\r\n | 'not_found'\r\n | 'rate_limited'\r\n | 'validation_failed'\r\n | 'network_error'\r\n | 'invalid_response'\r\n | 'server_error'\r\n | 'token_expired'\r\n | 'token_invalid_signature'\r\n | 'token_invalid_audience'\r\n | 'token_invalid_issuer'\r\n | 'unknown';\r\n\r\n/**\r\n * Erro tipado padrão do SDK. Sempre lançado em vez de Error genérico.\r\n *\r\n * @example\r\n * ```ts\r\n * try { await client.catalog.list(); }\r\n * catch (e) {\r\n * if (e instanceof NeetruError && e.code === 'rate_limited') retry();\r\n * }\r\n * ```\r\n */\r\nexport class NeetruError extends Error {\r\n public readonly code: NeetruErrorCode | string;\r\n public readonly status?: number;\r\n public readonly requestId?: string;\r\n\r\n constructor(\r\n code: NeetruErrorCode | string,\r\n message: string,\r\n status?: number,\r\n requestId?: string,\r\n ) {\r\n super(message);\r\n this.name = 'NeetruError';\r\n this.code = code;\r\n this.status = status;\r\n this.requestId = requestId;\r\n // Preserva o prototype chain ao herdar de Error (downlevel quirk de TS).\r\n Object.setPrototypeOf(this, NeetruError.prototype);\r\n }\r\n}\r\n","/**\r\n * NeetruDbError — classe de erro especializada para o módulo `db`.\r\n *\r\n * Conforma com 02-sdk.md §3.5: `NeetruDbError extends NeetruError`,\r\n * campo `code` fechado em `NeetruDbErrorCode`, campo `retryable` booleano,\r\n * campo `dbId` opaco para correlação.\r\n *\r\n * Herda de `NeetruError` para que um `catch (e) { if (e instanceof NeetruError) }`\r\n * genérico continue pegando erros de DB. Quem quer granularidade usa\r\n * `instanceof NeetruDbError` e o `code` fechado.\r\n */\r\n\r\nimport { NeetruError } from './errors';\r\n\r\n/**\r\n * Códigos de erro específicos do módulo `db`.\r\n *\r\n * - `db_unavailable` — lifecycle: provisionando / falhou / arquivado.\r\n * NÃO significa \"sem rede\" — offline é transparente.\r\n * - `db_not_found` — documento/coleção não encontrado no servidor.\r\n * - `db_conflict` — conflito de escrita detectado.\r\n * - `db_quota_exceeded` — quota de escrita/leitura excedida no banco.\r\n * - `db_permission_denied` — sem permissão para a operação.\r\n * - `db_invalid_query` — query inválida (campo, operador, tipo).\r\n * - `db_timeout` — operação excedeu o timeout.\r\n * - `offline_quota_exceeded`— IndexedDB cheio; a escrita não pode ser enfileirada.\r\n * - `offline_unavailable` — IndexedDB indisponível; SDK degrado para cache RAM.\r\n */\r\nexport type NeetruDbErrorCode =\r\n | 'db_unavailable'\r\n | 'db_not_found'\r\n | 'db_conflict'\r\n | 'db_quota_exceeded'\r\n | 'db_permission_denied'\r\n | 'db_invalid_query'\r\n | 'db_timeout'\r\n | 'offline_quota_exceeded'\r\n | 'offline_unavailable';\r\n\r\n/**\r\n * Códigos que são retryable por natureza.\r\n */\r\nconst RETRYABLE_CODES = new Set<NeetruDbErrorCode>([\r\n 'db_unavailable',\r\n 'db_conflict',\r\n 'db_timeout',\r\n]);\r\n\r\n/**\r\n * Erro tipado do módulo `db` — estende `NeetruError` para compatibilidade.\r\n *\r\n * @example\r\n * ```ts\r\n * try {\r\n * await client.db.collection('orders').add({ ... });\r\n * } catch (e) {\r\n * if (e instanceof NeetruDbError && e.code === 'offline_quota_exceeded') {\r\n * // IndexedDB cheio — notificar usuário\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class NeetruDbError extends NeetruError {\r\n /** Código de erro fechado — específico de DB. */\r\n public override readonly code: NeetruDbErrorCode;\r\n\r\n /**\r\n * `true` para erros transientes que o produto pode tentar novamente.\r\n * São retryable: `db_unavailable`, `db_conflict`, `db_timeout`.\r\n */\r\n public readonly retryable: boolean;\r\n\r\n /**\r\n * ID opaco do banco lógico — só para correlação com logs do Core.\r\n * Nunca deve ser exibido ao usuário final.\r\n */\r\n public readonly dbId?: string;\r\n\r\n constructor(code: NeetruDbErrorCode, message: string, dbId?: string) {\r\n super(code, message);\r\n this.name = 'NeetruDbError';\r\n this.code = code;\r\n this.retryable = RETRYABLE_CODES.has(code);\r\n this.dbId = dbId;\r\n // Preserva o prototype chain (TypeScript + downlevel).\r\n Object.setPrototypeOf(this, NeetruDbError.prototype);\r\n }\r\n}\r\n","/**\r\n * Mocks determinísticos do SDK — overridáveis em tests do consumer ou\r\n * ativados automaticamente quando `NEETRU_ENV=dev`.\r\n *\r\n * Nada aqui faz I/O. Tudo é puro/sincrono/in-memory. Compat total com\r\n * runtimes browser/Node/Edge — sem `node:` builtins.\r\n *\r\n * Cada mock implementa o mesmo namespace interface das implementações reais\r\n * (`AuthNamespace`, `UsageNamespace`, `SupportNamespace`) — caller pode\r\n * substituir 1:1 sem branching.\r\n *\r\n * @example\r\n * ```ts\r\n * import { createNeetruClient, MockAuth } from '@neetru/sdk';\r\n *\r\n * const client = createNeetruClient({\r\n * mocks: { auth: new MockAuth({ uid: 'fake-user', email: 'x@x.com' }) },\r\n * });\r\n * ```\r\n */\r\n\r\nimport type {\r\n AuthNamespace,\r\n AuthStateListener,\r\n CreateTicketInput,\r\n EntitlementCheck,\r\n NeetruUser,\r\n SignInOptions,\r\n SupportNamespace,\r\n SupportTicket,\r\n UsageNamespace,\r\n UsageQuota,\r\n} from './types';\r\nimport type {\r\n NeetruDb,\r\n NeetruSqlClient,\r\n} from './db/client-db';\r\nimport type { DbCollectionRef, DbWhereFilter, DbListResult, DbGetResult, DbBatchOp, DbDocRef, DbQuery } from './db/collection-ref';\r\nimport type { SyncState, ConflictRecord, Unsubscribe } from './db/offline/types';\r\nimport { NeetruDbError } from './db-errors';\r\n\r\n// ─── User fixture default ──────────────────────────────────────────────────\r\n\r\n/**\r\n * User fixture determinístico — usado quando `NEETRU_ENV=dev` e nenhum mock\r\n * custom é injetado. Email/uid estáveis pra snapshot tests.\r\n */\r\nexport const DEV_FIXTURE_USER: NeetruUser = Object.freeze({\r\n uid: 'dev-fixture-uid-0001',\r\n email: 'dev@neetru.local',\r\n emailVerified: true,\r\n displayName: 'Dev Fixture',\r\n isCustomer: true,\r\n isStaff: false,\r\n}) as NeetruUser;\r\n\r\n// ─── MockAuth ──────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Implementação in-memory do `AuthNamespace`. signIn marca o user como\r\n * logado; signOut limpa. onAuthStateChanged dispara callback síncrono no\r\n * subscribe + a cada mudança.\r\n */\r\nexport class MockAuth implements AuthNamespace {\r\n private _user: NeetruUser | null;\r\n private _listeners: Set<AuthStateListener>;\r\n\r\n constructor(initialUser: NeetruUser | null = null) {\r\n this._user = initialUser;\r\n this._listeners = new Set();\r\n }\r\n\r\n async signIn(_options?: SignInOptions): Promise<NeetruUser> {\r\n // Mock: apenas marca user como logado (usa fixture se não havia).\r\n if (!this._user) this._user = { ...DEV_FIXTURE_USER };\r\n this._notify();\r\n return this._user;\r\n }\r\n\r\n async signOut(): Promise<void> {\r\n this._user = null;\r\n this._notify();\r\n }\r\n\r\n getUser(): NeetruUser | null {\r\n return this._user;\r\n }\r\n\r\n onAuthStateChanged(listener: AuthStateListener): () => void {\r\n this._listeners.add(listener);\r\n // Dispara imediatamente com estado atual (espelha API Firebase Auth).\r\n try {\r\n listener(this._user);\r\n } catch {\r\n // Callback do consumer não pode quebrar o subscribe.\r\n }\r\n return () => {\r\n this._listeners.delete(listener);\r\n };\r\n }\r\n\r\n /**\r\n * Mock de `verifyToken` — decodifica o JWT sem verificar assinatura (pra testes).\r\n * Em dev, retorna o user atual do mock se já estiver logado. Aceita qualquer token\r\n * não-vazio sem chamar rede.\r\n *\r\n * Para simular falhas em testes, use `MockAuth.__mockVerifyToken(fn)`.\r\n */\r\n async verifyToken(token: string): Promise<NeetruUser> {\r\n if (this._verifyTokenOverride) {\r\n return this._verifyTokenOverride(token);\r\n }\r\n if (!token) {\r\n throw Object.assign(new Error('Token inválido'), { code: 'token_invalid_signature' });\r\n }\r\n // Tenta decodificar claims base64 sem verificar assinatura (útil em testes).\r\n try {\r\n const parts = token.split('.');\r\n if (parts.length === 3) {\r\n const b64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');\r\n const pad = '='.repeat((4 - (b64.length % 4)) % 4);\r\n const decoded = JSON.parse(\r\n typeof atob === 'function'\r\n ? atob(b64 + pad)\r\n : Buffer.from(b64 + pad, 'base64').toString('utf-8'),\r\n ) as Record<string, unknown>;\r\n if (typeof decoded.sub === 'string') {\r\n return {\r\n uid: decoded.sub,\r\n email: typeof decoded.email === 'string' ? decoded.email : '',\r\n emailVerified: typeof decoded.email_verified === 'boolean' ? decoded.email_verified : undefined,\r\n displayName: typeof decoded.name === 'string' ? decoded.name : undefined,\r\n photoURL: typeof decoded.picture === 'string' ? decoded.picture : undefined,\r\n isStaff: decoded.is_staff === true,\r\n isCustomer: decoded.is_customer === true,\r\n tenantId: typeof decoded.tenant_id === 'string' ? decoded.tenant_id : undefined,\r\n ...decoded,\r\n };\r\n }\r\n }\r\n } catch {\r\n /* fall through to return current user */\r\n }\r\n // Fallback: retorna o user atual do mock.\r\n if (this._user) return this._user;\r\n throw Object.assign(new Error('Nenhum user mock disponível'), { code: 'token_invalid_signature' });\r\n }\r\n\r\n private _verifyTokenOverride: ((token: string) => Promise<NeetruUser>) | null = null;\r\n\r\n /**\r\n * Injeta override pra `verifyToken` em testes — permite simular expiração,\r\n * assinatura inválida etc sem precisar de JWT real.\r\n *\r\n * @example\r\n * ```ts\r\n * const mock = new MockAuth(null);\r\n * mock.__mockVerifyToken(async () => { throw new NeetruError('token_expired', '...'); });\r\n * ```\r\n */\r\n __mockVerifyToken(fn: ((token: string) => Promise<NeetruUser>) | null): void {\r\n this._verifyTokenOverride = fn;\r\n }\r\n\r\n /** Helper de tests — força um user state arbitrário. */\r\n __setUser(user: NeetruUser | null): void {\r\n this._user = user;\r\n this._notify();\r\n }\r\n\r\n private _notify(): void {\r\n for (const l of this._listeners) {\r\n try {\r\n l(this._user);\r\n } catch {\r\n // ignore consumer errors\r\n }\r\n }\r\n }\r\n}\r\n\r\n// ─── MockUsage ─────────────────────────────────────────────────────────────\r\n\r\ninterface UsageRecord {\r\n event: string;\r\n properties?: Record<string, string | number | boolean | null>;\r\n timestamp: string;\r\n}\r\n\r\n/**\r\n * In-memory `UsageNamespace`. `track()` apenas acumula no array\r\n * `__getRecords()` (útil pra asserts em test). `getQuota()` retorna fixture\r\n * com `used = trackedCount` da metric.\r\n */\r\nexport class MockUsage implements UsageNamespace {\r\n private _records: UsageRecord[] = [];\r\n private _quotas: Map<string, UsageQuota>;\r\n /** v0.3 — counters in-memory pra `report()` / `check()`. */\r\n private _counters: Map<string, number> = new Map();\r\n\r\n constructor(initialQuotas: Record<string, UsageQuota> = {}) {\r\n this._quotas = new Map(Object.entries(initialQuotas));\r\n }\r\n\r\n async track(\r\n event: string,\r\n properties?: Record<string, string | number | boolean | null>,\r\n ): Promise<{ ok: true }> {\r\n this._records.push({\r\n event,\r\n properties,\r\n timestamp: new Date().toISOString(),\r\n });\r\n return { ok: true };\r\n }\r\n\r\n async getQuota(metric: string): Promise<UsageQuota> {\r\n const existing = this._quotas.get(metric);\r\n if (existing) return existing;\r\n return {\r\n metric,\r\n used: this._records.filter((r) => r.event === metric).length,\r\n limit: -1, // unlimited em mock por default\r\n plan: 'mock',\r\n };\r\n }\r\n\r\n /** v0.3 — Mock report incrementa o counter local. */\r\n async report(\r\n resource: string,\r\n qty: number = 1,\r\n _options?: { productId?: string; tenantId?: string },\r\n ): Promise<{\r\n ok: true;\r\n counterId?: string;\r\n value?: number;\r\n limit?: number;\r\n remaining?: number;\r\n status?: string;\r\n }> {\r\n if (!resource) throw new Error('resource required');\r\n const safeQty = Number.isFinite(qty) && qty > 0 ? Math.floor(qty) : 1;\r\n const existing = this._counters.get(resource) ?? 0;\r\n const next = existing + safeQty;\r\n this._counters.set(resource, next);\r\n const limitFixture = this._quotas.get(resource);\r\n const limit = limitFixture?.limit ?? -1;\r\n return {\r\n ok: true,\r\n counterId: `mock_${resource}`,\r\n value: next,\r\n limit,\r\n remaining: limit < 0 ? -1 : Math.max(0, limit - next),\r\n status: limit > 0 && next >= limit ? 'read_only_overlimit' : 'ok',\r\n };\r\n }\r\n\r\n /** v0.3 — Mock check usa quotas + counters in-memory. */\r\n async check(\r\n resource: string,\r\n _options?: { productId?: string; tenantId?: string },\r\n ): Promise<{\r\n allowed: boolean;\r\n reason?: string;\r\n remaining?: number;\r\n limit?: number;\r\n planId?: string | null;\r\n planFeatures?: string[];\r\n }> {\r\n const quota = this._quotas.get(resource);\r\n const used = this._counters.get(resource) ?? 0;\r\n if (!quota) {\r\n return { allowed: true, reason: 'granted', limit: -1, remaining: -1 };\r\n }\r\n const remaining = quota.limit < 0 ? -1 : Math.max(0, quota.limit - used);\r\n if (remaining === 0) {\r\n return {\r\n allowed: false,\r\n reason: 'limit_exceeded',\r\n limit: quota.limit,\r\n remaining: 0,\r\n };\r\n }\r\n return {\r\n allowed: true,\r\n reason: 'granted',\r\n limit: quota.limit,\r\n remaining,\r\n };\r\n }\r\n\r\n /** Test helper. */\r\n __getRecords(): readonly UsageRecord[] {\r\n return [...this._records];\r\n }\r\n /** Test helper — substitui quota fixture. */\r\n __setQuota(metric: string, quota: UsageQuota): void {\r\n this._quotas.set(metric, quota);\r\n }\r\n /** Test helper — limpa estado. */\r\n __reset(): void {\r\n this._records = [];\r\n this._quotas.clear();\r\n this._counters.clear();\r\n }\r\n}\r\n\r\n// ─── MockSupport ───────────────────────────────────────────────────────────\r\n\r\n/**\r\n * In-memory `SupportNamespace`. createTicket gera ID `mock-ticket-{n}`;\r\n * listMyTickets retorna todos criados (FIFO). Sequência por instância\r\n * (evita poluição cross-test do estado de módulo).\r\n */\r\nexport class MockSupport implements SupportNamespace {\r\n private _tickets: SupportTicket[] = [];\r\n private _ticketSeq = 0;\r\n\r\n async createTicket(input: CreateTicketInput): Promise<SupportTicket> {\r\n if (!input?.subject) throw new Error('subject required');\r\n if (!input?.message) throw new Error('message required');\r\n const ticket: SupportTicket = {\r\n id: `mock-ticket-${++this._ticketSeq}`,\r\n subject: input.subject,\r\n message: input.message,\r\n severity: input.severity ?? 'normal',\r\n status: 'open',\r\n createdAt: new Date().toISOString(),\r\n productSlug: input.productSlug,\r\n };\r\n this._tickets.push(ticket);\r\n return ticket;\r\n }\r\n\r\n async listMyTickets(): Promise<SupportTicket[]> {\r\n return [...this._tickets];\r\n }\r\n\r\n /** Test helper. */\r\n __reset(): void {\r\n this._tickets = [];\r\n this._ticketSeq = 0;\r\n }\r\n}\r\n\r\n// ─── MockEntitlements ──────────────────────────────────────────────────────\r\n\r\n/**\r\n * In-memory entitlements. Por default `allowed=true` em tudo (dev convém).\r\n * Use `__deny(slug, feature)` em tests pra simular bloqueio.\r\n */\r\nexport class MockEntitlements {\r\n private _denied: Set<string> = new Set();\r\n\r\n async check(productSlug: string, feature: string): Promise<boolean> {\r\n return !this._denied.has(`${productSlug}:${feature}`);\r\n }\r\n\r\n async checkDetailed(productSlug: string, feature: string): Promise<EntitlementCheck> {\r\n const allowed = await this.check(productSlug, feature);\r\n return {\r\n allowed,\r\n productSlug,\r\n feature,\r\n reason: allowed ? 'granted' : 'mock_denied',\r\n };\r\n }\r\n\r\n /** Test helper. */\r\n __deny(productSlug: string, feature: string): void {\r\n this._denied.add(`${productSlug}:${feature}`);\r\n }\r\n /** Test helper. */\r\n __reset(): void {\r\n this._denied.clear();\r\n }\r\n}\r\n\r\n// ─── MockDb (v2.0) ─────────────────────────────────────────────────────────\r\n\r\n/**\r\n * In-memory `NeetruDb`. Cada `collection(name)` aponta para um Map; ops\r\n * são totalmente síncronas (mas API await-friendly).\r\n *\r\n * v2.0: implementa a interface `NeetruDb` completa (collection, sql, syncState,\r\n * flush, clearCache, getConflicts, onSyncStateChanged).\r\n *\r\n * Útil para testar produtos consumidores sem rodar Core REST nem IndexedDB.\r\n */\r\nexport class MockDb implements NeetruDb {\r\n private _store: Map<string, Map<string, Record<string, unknown>>> = new Map();\r\n private _fixtures: Map<string, Record<string, Record<string, unknown>>>;\r\n\r\n constructor(initialFixtures: Record<string, Record<string, Record<string, unknown>>> = {}) {\r\n this._fixtures = new Map(Object.entries(initialFixtures));\r\n }\r\n\r\n collection<T = Record<string, unknown>>(name: string): DbCollectionRef<T> {\r\n const _store = this._store;\r\n const _fixtures = this._fixtures;\r\n if (!_store.has(name)) {\r\n const init = _fixtures.get(name);\r\n _store.set(\r\n name,\r\n init ? new Map(Object.entries(init)) : new Map(),\r\n );\r\n }\r\n const coll = _store.get(name)!;\r\n\r\n const matchesFilter = (\r\n doc: Record<string, unknown>,\r\n f: DbWhereFilter,\r\n ): boolean => {\r\n const v = doc[f.field];\r\n switch (f.op) {\r\n case '==':\r\n return v === f.value;\r\n case '!=':\r\n return v !== f.value;\r\n case '<':\r\n return typeof v === 'number' && typeof f.value === 'number' && v < f.value;\r\n case '<=':\r\n return typeof v === 'number' && typeof f.value === 'number' && v <= f.value;\r\n case '>':\r\n return typeof v === 'number' && typeof f.value === 'number' && v > f.value;\r\n case '>=':\r\n return typeof v === 'number' && typeof f.value === 'number' && v >= f.value;\r\n case 'in':\r\n return Array.isArray(f.value) && (f.value as unknown[]).includes(v);\r\n case 'array-contains':\r\n return Array.isArray(v) && (v as unknown[]).includes(f.value);\r\n case 'not-in':\r\n return Array.isArray(f.value) && !(f.value as unknown[]).includes(v);\r\n default:\r\n return true;\r\n }\r\n };\r\n\r\n let autoSeq = 0;\r\n\r\n // Helper to build a minimal DbListResult from raw items\r\n function buildListResult<U>(items: Array<Record<string, unknown>>): DbListResult<U> {\r\n return {\r\n docs: items.map((d, i) => ({ id: (d.id as string) ?? String(i), data: d as U })),\r\n nextCursor: null,\r\n fromCache: false,\r\n stale: false,\r\n hasPendingWrites: false,\r\n changes: [],\r\n };\r\n }\r\n\r\n // Helper to build a DbGetResult for a single doc\r\n function buildGetResult<U>(data: Record<string, unknown>, id: string): DbGetResult<U> {\r\n return {\r\n docs: [{ id, data: data as U }],\r\n fromCache: false,\r\n stale: false,\r\n hasPendingWrites: false,\r\n changes: [],\r\n };\r\n }\r\n\r\n const ref: DbCollectionRef<T> = {\r\n async list(q?: DbQuery): Promise<DbListResult<T>> {\r\n let items = Array.from(coll.values());\r\n if (q?.where && q.where.length > 0) {\r\n items = items.filter((doc) =>\r\n (q.where as DbWhereFilter[]).every((f) => matchesFilter(doc, f)),\r\n );\r\n }\r\n if (q?.orderBy) {\r\n const { field, direction } = q.orderBy;\r\n items = items.slice().sort((a, b) => {\r\n const av = a[field];\r\n const bv = b[field];\r\n const avs = av ?? '';\r\n const bvs = bv ?? '';\r\n const cmp = (avs as string) < (bvs as string) ? -1 : (avs as string) > (bvs as string) ? 1 : 0;\r\n return direction === 'desc' ? -cmp : cmp;\r\n });\r\n }\r\n const limit = q?.limit ?? 20;\r\n items = items.slice(0, limit);\r\n return buildListResult<T>(items);\r\n },\r\n async get(id: string): Promise<DbGetResult<T> | null> {\r\n const data = coll.get(id);\r\n if (!data) return null;\r\n return buildGetResult<T>(data, id);\r\n },\r\n async add(data: Omit<T, 'id'>): Promise<{ ok: true; id: string }> {\r\n const id = `mock-${++autoSeq}-${Math.random().toString(36).slice(2, 8)}`;\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n return { ok: true, id };\r\n },\r\n async set(id: string, data: Omit<T, 'id'>): Promise<{ ok: true }> {\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n return { ok: true };\r\n },\r\n async update(id: string, data: Partial<Omit<T, 'id'>>): Promise<{ ok: true }> {\r\n const cur = coll.get(id);\r\n if (!cur) {\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n } else {\r\n coll.set(id, { ...cur, ...(data as Record<string, unknown>) });\r\n }\r\n return { ok: true };\r\n },\r\n async remove(id: string): Promise<{ ok: true }> {\r\n coll.delete(id);\r\n return { ok: true };\r\n },\r\n async batch(ops: DbBatchOp[]): Promise<{ ok: true }> {\r\n for (const op of ops) {\r\n // Mock usa a coleção corrente (collName) — o campo collection foi removido\r\n // do discriminated union em 2.1.1; batch opera sempre na coleção do ref.\r\n const collMap = coll;\r\n if (op.kind === 'add') {\r\n const id = `mock-batch-${++autoSeq}`;\r\n collMap.set(id, { ...(op.data as Record<string, unknown>), id });\r\n } else if (op.kind === 'set') {\r\n collMap.set(op.id, { ...(op.data as Record<string, unknown>), id: op.id });\r\n } else if (op.kind === 'update') {\r\n const cur = collMap.get(op.id);\r\n collMap.set(op.id, { ...(cur ?? {}), ...(op.data as Record<string, unknown>), id: op.id });\r\n } else if (op.kind === 'remove') {\r\n collMap.delete(op.id);\r\n }\r\n }\r\n return { ok: true };\r\n },\r\n onDoc(id: string, cb: (doc: T | null) => void): Unsubscribe {\r\n // Entrega snapshot inicial imediato (sync mock)\r\n const data = coll.get(id);\r\n Promise.resolve().then(() => cb(data ? (data as T) : null));\r\n // Mock: não há feed realtime — retorna no-op unsubscribe\r\n return () => {};\r\n },\r\n onSnapshot(q: DbQuery | undefined, cb: (snap: DbListResult<T>) => void): Unsubscribe {\r\n // Entrega snapshot inicial imediato (sync mock)\r\n Promise.resolve().then(async () => {\r\n const snap = await ref.list(q);\r\n cb(snap);\r\n });\r\n return () => {};\r\n },\r\n doc(id: string): DbDocRef<T> {\r\n return {\r\n get id(): string { return id; },\r\n get path(): string { return `${name}/${id}`; },\r\n get collection(): string { return name; },\r\n async get() {\r\n const data = coll.get(id);\r\n if (!data) return null;\r\n return buildGetResult<T>(data, id);\r\n },\r\n async set(data: Omit<T, 'id'>) {\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n return { ok: true };\r\n },\r\n async update(data: Partial<Omit<T, 'id'>>) {\r\n const cur = coll.get(id);\r\n if (!cur) {\r\n coll.set(id, { ...(data as Record<string, unknown>), id });\r\n } else {\r\n coll.set(id, { ...cur, ...(data as Record<string, unknown>) });\r\n }\r\n return { ok: true };\r\n },\r\n async remove() {\r\n coll.delete(id);\r\n return { ok: true };\r\n },\r\n onSnapshot(cb: (snap: DbGetResult<T> | null) => void): Unsubscribe {\r\n const data = coll.get(id);\r\n Promise.resolve().then(() =>\r\n cb(data ? buildGetResult<T>(data, id) : null),\r\n );\r\n return () => {};\r\n },\r\n };\r\n },\r\n };\r\n\r\n return ref;\r\n }\r\n\r\n /**\r\n * Implementa SQL in-memory via `pg-mem` + `drizzle-orm/node-postgres`.\r\n *\r\n * bug_a7f2ae25fda54129b52b6dd55aaa6050 (HIGH 26/05): antes lançava\r\n * `db_unavailable` sempre, bloqueando vitest server-side dos consumers\r\n * que refatoraram pra `client.db.sql()`. Agora carrega `pg-mem` lazy +\r\n * cria `NodePgDatabase` Drizzle apontando pra DB in-memory.\r\n *\r\n * Requer `pg-mem`, `drizzle-orm` e `pg` como devDependencies do consumer\r\n * (instale com `npm install -D pg-mem drizzle-orm pg`). Se ausentes, joga\r\n * `db_unavailable` com mensagem clara.\r\n *\r\n * Use `options.initSql` pra criar tabelas no test setup — sem isso o orm\r\n * funciona mas qualquer SELECT/INSERT em tabela inexistente vai falhar.\r\n */\r\n async sql<TSchema extends Record<string, unknown>>(\r\n schema: TSchema,\r\n options?: { database?: string; initSql?: string | string[] },\r\n ): Promise<NeetruSqlClient<TSchema>> {\r\n let pgMemMod: typeof import('pg-mem');\r\n let drizzlePg: typeof import('drizzle-orm/node-postgres');\r\n try {\r\n // Lazy-load — sem essas devDeps, MockDb.sql() continua jogando erro claro.\r\n pgMemMod = await import('pg-mem');\r\n drizzlePg = await import('drizzle-orm/node-postgres');\r\n } catch {\r\n throw new NeetruDbError(\r\n 'db_unavailable',\r\n '[MockDb] sql() requer pg-mem + drizzle-orm + pg como devDependencies do consumer. Rode: npm install -D pg-mem drizzle-orm pg.',\r\n );\r\n }\r\n\r\n const memDb = pgMemMod.newDb({ noAstCoverageCheck: true });\r\n\r\n // Aplica DDL inicial (criar tabelas / seed) — só faz sentido em mock.\r\n if (options?.initSql) {\r\n const ddls = Array.isArray(options.initSql) ? options.initSql : [options.initSql];\r\n for (const ddl of ddls) {\r\n memDb.public.none(ddl);\r\n }\r\n }\r\n\r\n const adapters = memDb.adapters.createPg();\r\n const PoolCtor = (adapters as { Pool: new () => unknown }).Pool;\r\n const pool = new PoolCtor() as Record<string, unknown>;\r\n\r\n // bug_44bcc99f (HIGH 26/05): pg-mem não implementa pool.types.getTypeParser\r\n // que drizzle-orm/node-postgres/session.js chama em TODA query. Sem isso:\r\n // 'Error: Not supported: getTypeParser is not supported'. Injetar identity\r\n // parser resolve — types retornam o valor sem transformação (suficiente\r\n // pra tests in-memory; produção usa pg real com type parsers nativos).\r\n const existingTypes = pool.types as { getTypeParser?: unknown } | undefined;\r\n if (!existingTypes || typeof existingTypes.getTypeParser !== 'function') {\r\n pool.types = {\r\n getTypeParser: () => (val: unknown) => val,\r\n };\r\n }\r\n\r\n const orm = drizzlePg.drizzle(pool as never, { schema }) as unknown as\r\n import('drizzle-orm/node-postgres').NodePgDatabase<TSchema>;\r\n\r\n return {\r\n orm,\r\n async transaction(fn, _opts) {\r\n return await orm.transaction(fn as never) as never;\r\n },\r\n async close() {\r\n const p = pool as { end?: () => Promise<void> };\r\n if (p.end) await p.end();\r\n },\r\n } as NeetruSqlClient<TSchema>;\r\n }\r\n\r\n get syncState(): SyncState {\r\n return {\r\n status: 'idle',\r\n pendingWrites: 0,\r\n lastSyncedAt: null,\r\n isLeaderTab: true,\r\n };\r\n }\r\n\r\n onSyncStateChanged(_cb: (s: SyncState) => void): Unsubscribe {\r\n return () => {};\r\n }\r\n\r\n async flush(): Promise<void> {\r\n // no-op in mock\r\n }\r\n\r\n async clearCache(): Promise<void> {\r\n this._store.clear();\r\n }\r\n\r\n async getConflicts(): Promise<ConflictRecord[]> {\r\n return [];\r\n }\r\n\r\n /** Test helper — substitui fixture inteira de uma collection. */\r\n __setFixture(name: string, items: Record<string, Record<string, unknown>>): void {\r\n this._store.set(name, new Map(Object.entries(items)));\r\n }\r\n\r\n /** Test helper — reset total. */\r\n __reset(): void {\r\n this._store.clear();\r\n }\r\n}\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neetru/sdk",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.3",
|
|
4
4
|
"description": "Neetru SDK 1.1 — biblioteca runtime estável para consumir o ecossistema Neetru (auth OIDC, catalog, entitlements, telemetry, usage metering, support tickets, datastore, checkout).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|