@neetru/sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/CHANGELOG.md +183 -0
  2. package/README.md +218 -0
  3. package/dist/auth.cjs +1137 -0
  4. package/dist/auth.cjs.map +1 -0
  5. package/dist/auth.d.cts +25 -0
  6. package/dist/auth.d.ts +25 -0
  7. package/dist/auth.mjs +1135 -0
  8. package/dist/auth.mjs.map +1 -0
  9. package/dist/catalog.cjs +179 -0
  10. package/dist/catalog.cjs.map +1 -0
  11. package/dist/catalog.d.cts +17 -0
  12. package/dist/catalog.d.ts +17 -0
  13. package/dist/catalog.mjs +177 -0
  14. package/dist/catalog.mjs.map +1 -0
  15. package/dist/db.cjs +232 -0
  16. package/dist/db.cjs.map +1 -0
  17. package/dist/db.d.cts +8 -0
  18. package/dist/db.d.ts +8 -0
  19. package/dist/db.mjs +230 -0
  20. package/dist/db.mjs.map +1 -0
  21. package/dist/entitlements.cjs +140 -0
  22. package/dist/entitlements.cjs.map +1 -0
  23. package/dist/entitlements.d.cts +14 -0
  24. package/dist/entitlements.d.ts +14 -0
  25. package/dist/entitlements.mjs +138 -0
  26. package/dist/entitlements.mjs.map +1 -0
  27. package/dist/errors.cjs +20 -0
  28. package/dist/errors.cjs.map +1 -0
  29. package/dist/errors.d.cts +27 -0
  30. package/dist/errors.d.ts +27 -0
  31. package/dist/errors.mjs +18 -0
  32. package/dist/errors.mjs.map +1 -0
  33. package/dist/index.cjs +1154 -0
  34. package/dist/index.cjs.map +1 -0
  35. package/dist/index.d.cts +24 -0
  36. package/dist/index.d.ts +24 -0
  37. package/dist/index.mjs +1142 -0
  38. package/dist/index.mjs.map +1 -0
  39. package/dist/mocks.cjs +281 -0
  40. package/dist/mocks.cjs.map +1 -0
  41. package/dist/mocks.d.cts +138 -0
  42. package/dist/mocks.d.ts +138 -0
  43. package/dist/mocks.mjs +274 -0
  44. package/dist/mocks.mjs.map +1 -0
  45. package/dist/support.cjs +176 -0
  46. package/dist/support.cjs.map +1 -0
  47. package/dist/support.d.cts +5 -0
  48. package/dist/support.d.ts +5 -0
  49. package/dist/support.mjs +174 -0
  50. package/dist/support.mjs.map +1 -0
  51. package/dist/telemetry.cjs +225 -0
  52. package/dist/telemetry.cjs.map +1 -0
  53. package/dist/telemetry.d.cts +35 -0
  54. package/dist/telemetry.d.ts +35 -0
  55. package/dist/telemetry.mjs +223 -0
  56. package/dist/telemetry.mjs.map +1 -0
  57. package/dist/types-PKUaFtBY.d.cts +408 -0
  58. package/dist/types-PKUaFtBY.d.ts +408 -0
  59. package/dist/usage.cjs +235 -0
  60. package/dist/usage.cjs.map +1 -0
  61. package/dist/usage.d.cts +5 -0
  62. package/dist/usage.d.ts +5 -0
  63. package/dist/usage.mjs +233 -0
  64. package/dist/usage.mjs.map +1 -0
  65. package/package.json +79 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/types.ts","../src/http.ts","../src/catalog.ts","../src/entitlements.ts","../src/telemetry.ts","../src/usage.ts","../src/support.ts","../src/db.ts","../src/mocks.ts","../src/auth.ts"],"names":[],"mappings":"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","file":"auth.cjs","sourcesContent":["/**\n * Erros tipados do SDK.\n *\n * Todo erro lançado pelo SDK estende `NeetruError` — caller pode discriminar\n * por `.code` (string estável) sem parsing de message.\n */\n\n/** Códigos de erro estáveis do SDK. Adicionar aqui requer minor bump. */\nexport type NeetruErrorCode =\n | 'invalid_config'\n | 'missing_api_key'\n | 'unauthorized'\n | 'forbidden'\n | 'not_found'\n | 'rate_limited'\n | 'validation_failed'\n | 'network_error'\n | 'invalid_response'\n | 'server_error'\n | 'unknown';\n\n/**\n * Erro tipado padrão do SDK. Sempre lançado em vez de Error genérico.\n *\n * @example\n * ```ts\n * try { await client.catalog.list(); }\n * catch (e) {\n * if (e instanceof NeetruError && e.code === 'rate_limited') retry();\n * }\n * ```\n */\nexport class NeetruError extends Error {\n public readonly code: NeetruErrorCode | string;\n public readonly status?: number;\n public readonly requestId?: string;\n\n constructor(\n code: NeetruErrorCode | string,\n message: string,\n status?: number,\n requestId?: string,\n ) {\n super(message);\n this.name = 'NeetruError';\n this.code = code;\n this.status = status;\n this.requestId = requestId;\n // Preserva o prototype chain ao herdar de Error (downlevel quirk de TS).\n Object.setPrototypeOf(this, NeetruError.prototype);\n }\n}\n","/**\n * Tipos públicos do SDK Neetru.\n *\n * Vendor-neutral: nada aqui referencia `firebase/*`, `stripe`, ou qualquer\n * provider interno. Caller só vê superfície neutra (Product, Entitlement, ...).\n */\n\n/** Default base URL pra API pública Neetru. */\nexport const DEFAULT_BASE_URL = 'https://api.neetru.com';\n\n/**\n * Configuração passada pra `createNeetruClient`.\n */\nexport interface NeetruClientConfig {\n /**\n * Bearer token Neetru (formato `nrt_<keyId>_<secret>`). Opcional —\n * se ausente, o SDK tenta `process.env.NEETRU_API_KEY` em Node.\n *\n * Endpoints públicos (catalog) funcionam sem apiKey. Endpoints autenticados\n * (entitlements, telemetry) lançam `missing_api_key` se ausente.\n */\n apiKey?: string;\n /**\n * URL base da API Neetru. Default: `https://api.neetru.com`.\n * Útil em testes apontando pra staging ou mock server.\n */\n baseUrl?: string;\n /**\n * Implementação de fetch customizada. Default: `globalThis.fetch`.\n * Necessário em runtimes que não exponham fetch global por default.\n */\n fetch?: typeof globalThis.fetch;\n /**\n * Modo de runtime. `dev` ativa mocks (auth retorna user fixture, usage só\n * loga, support retorna lista fake). `workspace` e `prod` chamam HTTP real.\n *\n * Default: lê `process.env.NEETRU_ENV` (Node) ou `globalThis.NEETRU_ENV`\n * (browser); fallback `prod`.\n */\n env?: 'dev' | 'workspace' | 'prod';\n /**\n * Override de mocks — útil em tests do consumer pra injetar fixtures\n * determinísticos (sem depender de NEETRU_ENV=dev).\n */\n mocks?: {\n auth?: AuthNamespace;\n usage?: UsageNamespace;\n support?: SupportNamespace;\n entitlements?: NeetruClient['entitlements'];\n db?: DbNamespace;\n };\n /**\n * v0.3 — productId default usado por `usage.report()` / `usage.check()` /\n * `db.collection()` quando não passado explicitamente nas options.\n */\n productId?: string;\n /**\n * v0.3 — tenantId default usado por `usage.report()` / `usage.check()` /\n * `db.collection()` quando não passado explicitamente nas options.\n */\n tenantId?: string;\n}\n\n/**\n * Status do produto no catálogo público.\n */\nexport type ProductStatus = 'live' | 'soon' | 'beta';\n\n/**\n * Produto SaaS publicado pelo Neetru Core.\n *\n * Schema neutro — alinhado com `public_products/{slug}` no backend mas\n * nunca expõe campos internos (Firestore Timestamps, draft state, etc).\n */\nexport interface Product {\n /** Identificador estável do produto, ex: `neetru-pulse`. */\n slug: string;\n /** Nome de exibição, ex: `Neetru Pulse`. */\n name: string;\n /** Subtítulo curto, ex: `Gestão de operações`. */\n tagline?: string;\n /** Descrição longa em prosa. */\n description?: string;\n /** Status público do produto. */\n status?: ProductStatus;\n /** Hint de ícone (catálogo de keys interno do Core). */\n iconKey?: string;\n /** Link override do CTA principal (default: página do produto). */\n ctaHref?: string;\n /** Label override do CTA. */\n ctaLabel?: string;\n /** Lista opcional de planos cobrados. Pode ser preenchida v0.2+. */\n plans?: ProductPlan[];\n}\n\n/** Plano cobrado de um produto (placeholder v0.1 — schema final v0.2). */\nexport interface ProductPlan {\n id: string;\n name: string;\n /** Preço mensal em centavos (BRL). Pode ser undefined em planos custom. */\n amountCents?: number;\n features?: string[];\n}\n\n/**\n * Resposta do `client.catalog.list()`.\n */\nexport interface CatalogListResponse {\n products: Product[];\n fetchedAt: string;\n}\n\n/**\n * Resposta do `client.entitlements.check(productSlug, feature)`.\n *\n * `allowed` é o sinal forte; `reason` ajuda a debugar (não exibir pro user\n * final).\n */\nexport interface EntitlementCheck {\n allowed: boolean;\n productSlug: string;\n feature: string;\n /** Reason code estável: `granted` | `not_subscribed` | `feature_not_in_plan` | `expired`. */\n reason?: string;\n}\n\n/**\n * Payload pra `client.telemetry.event()`.\n */\nexport interface TelemetryEventInput {\n /** Nome do evento, ex: `dashboard_opened`, `report_exported`. */\n name: string;\n /** Atributos adicionais (chave → valor primitivo). */\n properties?: Record<string, string | number | boolean | null>;\n /** Timestamp ISO opcional; default = server time. */\n timestamp?: string;\n}\n\n/**\n * Confirmação de aceitação do evento de telemetria.\n */\nexport interface TelemetryEventAck {\n ok: true;\n /** ID gerado pelo backend pra evento (`usage_events/{id}`). */\n eventId: string;\n}\n\n// ─── Sprint 6 — Telemetry log per-product ──────────────────────────────────\n\nexport type TelemetryLogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n\nexport interface TelemetryLogInput {\n level: TelemetryLogLevel;\n message: string;\n metadata?: Record<string, unknown>;\n /** Override correlationId (default: lê dos headers/env automaticamente). */\n correlationId?: string;\n /** Slug do produto referenciado. Backend infere do escopo do token se ausente. */\n productSlug?: string;\n}\n\nexport interface TelemetryLogAck {\n ok: true;\n /** ID do log gravado (`logs/{productId}/{yyyymmdd}/{logId}`) — opcional em mocks. */\n logId?: string;\n /** Indicador de modo (mock vs http). */\n mode: 'mock' | 'http';\n}\n\n/**\n * Handle imutável retornado por `createNeetruClient`. Carrega namespaces\n * `auth`, `catalog`, `entitlements`, `telemetry`, `usage`, `support`.\n *\n * Cada namespace é exposto como objeto chamável — espelha API Firebase\n * (`auth`, `firestore`) ou Stripe (`paymentIntents`, `customers`).\n */\nexport interface NeetruClient {\n /** Configuração resolvida (apiKey, baseUrl, fetch). Read-only. */\n readonly config: ResolvedConfig;\n /** Namespace auth (v0.2 — OIDC + mocks dev). */\n readonly auth: AuthNamespace;\n /** Namespace catálogo público de produtos. */\n readonly catalog: {\n /** Lista produtos publicados. */\n list(opts?: CatalogListOptions): Promise<CatalogListResponse>;\n /** Busca produto único por slug. */\n get(slug: string): Promise<Product>;\n };\n /** Namespace entitlements. */\n readonly entitlements: {\n /**\n * Verifica se o portador da apiKey pode usar `feature` do produto `slug`.\n * Retorna boolean por contrato simplificado v0.1.\n */\n check(productSlug: string, feature: string): Promise<boolean>;\n /** Variante que retorna o objeto completo com `reason`. */\n checkDetailed(productSlug: string, feature: string): Promise<EntitlementCheck>;\n };\n /** Namespace telemetria. */\n readonly telemetry: {\n /** Persiste um evento. Não lança em rate-limit não-fatal — relança outros erros. */\n event(input: TelemetryEventInput): Promise<TelemetryEventAck>;\n /**\n * Registra um log estruturado per-product (Sprint 6).\n *\n * - Em `NEETRU_ENV=dev`: apenas console.{level} (sem network).\n * - Em `workspace`/`prod`: POST `/sdk/v1/telemetry/log` com Bearer + correlationId.\n */\n log(input: TelemetryLogInput): Promise<TelemetryLogAck>;\n };\n /** Namespace usage (v0.2 — track + quota; v0.3 — report + check). */\n readonly usage: UsageNamespace;\n /** Namespace support (v0.2 — tickets). */\n readonly support: SupportNamespace;\n /** Namespace db (v0.3 — coleções tenant-scoped). */\n readonly db: DbNamespace;\n}\n\n// ─── v0.2 — Auth namespace ──────────────────────────────────────────────────\n\n/**\n * User retornado pelo OIDC ID token. Schema neutro — não vaza Firebase\n * decoded token shape. Subset estável do RFC 7519 + custom claims Neetru.\n */\nexport interface NeetruUser {\n /** Subject — uid estável. */\n uid: string;\n email: string;\n emailVerified?: boolean;\n displayName?: string;\n photoURL?: string;\n /** Custom claim Neetru — true quando staff. */\n isStaff?: boolean;\n /** Custom claim Neetru — true quando customer enrolled. */\n isCustomer?: boolean;\n /** Tenant assigned (multi-tenant deployments). */\n tenantId?: string;\n /** Outros claims OIDC (aud, iss, iat, exp). */\n [extra: string]: unknown;\n}\n\nexport interface SignInOptions {\n /** OIDC redirect_uri override. Default = window.location origin. */\n redirectUri?: string;\n /** OIDC scope. Default `openid profile email`. */\n scope?: string;\n /** Onde mandar após login completo. Default = window.location.href. */\n postLoginRedirect?: string;\n}\n\nexport type AuthStateListener = (user: NeetruUser | null) => void;\n\nexport interface AuthNamespace {\n /**\n * Inicia fluxo de login OIDC. Em dev (`NEETRU_ENV=dev`) retorna mock user\n * direto sem redirect. Em prod redireciona pro authorize endpoint.\n */\n signIn(options?: SignInOptions): Promise<NeetruUser | void>;\n /** Limpa session local + revoga refresh token no servidor. */\n signOut(): Promise<void>;\n /** Retorna o user atual (do id_token cached) ou `null` se não logado. */\n getUser(): NeetruUser | null;\n /**\n * Subscreve a mudanças de estado de auth. Listener é invocado imediatamente\n * com user atual. Retorna função de unsubscribe.\n */\n onAuthStateChanged(listener: AuthStateListener): () => void;\n}\n\n// ─── v0.2 — Usage namespace ─────────────────────────────────────────────────\n\nexport interface UsageEventInput {\n /** Nome do evento, ex: `report_generated`, `api_call`. */\n event: string;\n /** Atributos do evento. Valores primitivos serializáveis. */\n properties?: Record<string, string | number | boolean | null>;\n /** Quantidade — default 1 (1 evento). Útil pra batch. */\n quantity?: number;\n}\n\nexport interface UsageQuota {\n metric: string;\n /** Quantidade já consumida no período. */\n used: number;\n /** Limite total. -1 = unlimited. */\n limit: number;\n /** ISO timestamp do reset (próximo período). */\n resetsAt?: string;\n /** Plano que define o limite. */\n plan?: string;\n}\n\nexport interface UsageNamespace {\n /** Persiste um evento de uso. Mock em dev, POST `/sdk/v1/usage/record` em prod. */\n track(event: string, props?: UsageEventInput['properties']): Promise<{ ok: true }>;\n /** Lê quota atual de uma métrica. Mock em dev, GET `/sdk/v1/usage/quota` em prod. */\n getQuota(metric: string): Promise<UsageQuota>;\n /**\n * v0.3 — Reporta consumo de um resource metered (POST /sdk/v1/usage/record\n * com `{productId, tenantId, resource, qty}`). Em dev acumula no mock.\n *\n * Diferente de `track()`: usa o endpoint canônico Sprint 7 que incrementa\n * `usage_counters/{tenantId}_{productId}_{resource}_{yyyymm}` atomicamente.\n *\n * `productId`/`tenantId` são lidos do contexto resolvido do client se\n * ausentes nas options.\n */\n report(\n resource: string,\n qty?: number,\n options?: { productId?: string; tenantId?: string },\n ): Promise<{\n ok: true;\n counterId?: string;\n value?: number;\n limit?: number;\n remaining?: number;\n status?: string;\n }>;\n /**\n * v0.3 — Verifica entitlement de um resource/feature. Wrapper em\n * GET /sdk/v1/entitlements. Em dev consulta MockEntitlements + MockUsage.\n */\n check(\n resource: string,\n options?: { productId?: string; tenantId?: string },\n ): Promise<{\n allowed: boolean;\n reason?: string;\n remaining?: number;\n limit?: number;\n planId?: string | null;\n planFeatures?: string[];\n }>;\n}\n\n// ─── v0.3 — Datastore namespace ────────────────────────────────────────────\n\n/**\n * Namespace `db` (v0.3) — wrapper minimalista para CRUD em coleções tenant-scoped\n * via Core REST. Em dev retorna fixtures in-memory por collection.\n *\n * O Core injeta automaticamente o tenantId no path do Firestore:\n * `tenant_{tid}_{name}/{docId}`.\n */\n/** Filtro `where` simples — alinhado com endpoint REST `field:op:value`. */\nexport interface DbWhereFilter {\n field: string;\n op: '==' | '!=' | '<' | '<=' | '>' | '>=' | 'in';\n value: string | number | boolean | null | Array<string | number | boolean>;\n}\n\nexport interface DbListOptions {\n limit?: number;\n /** Lista de filtros — máximo 5 (alinhado ao backend). */\n where?: DbWhereFilter[];\n}\n\nexport interface DbCollectionRef {\n /** Lista documentos com filtros opcionais. */\n list<T = Record<string, unknown>>(opts?: DbListOptions): Promise<T[]>;\n /** Lê um documento por id. Retorna `null` se não existe. */\n get<T = Record<string, unknown>>(id: string): Promise<T | null>;\n /** Cria/upsert um documento com id explícito. */\n set(id: string, data: Record<string, unknown>): Promise<{ ok: true }>;\n /**\n * v0.3.1 — Adiciona doc com id auto-gerado pelo backend. Retorna `{id}` do\n * doc criado. Diferente de `set(id, data)` que requer caller fornecer id.\n */\n add(data: Record<string, unknown>): Promise<{ ok: true; id: string }>;\n /** Atualiza doc com merge — só campos passados em `data`. */\n update(id: string, data: Record<string, unknown>): Promise<{ ok: true }>;\n /** Deleta um documento. */\n remove(id: string): Promise<{ ok: true }>;\n}\n\nexport interface DbNamespace {\n collection(name: string): DbCollectionRef;\n}\n\n// ─── v0.2 — Support namespace ───────────────────────────────────────────────\n\nexport type SupportSeverity = 'low' | 'normal' | 'high' | 'urgent';\nexport type SupportStatus = 'open' | 'pending' | 'resolved' | 'closed';\n\nexport interface SupportTicket {\n id: string;\n subject: string;\n message: string;\n severity: SupportSeverity;\n status: SupportStatus;\n createdAt: string;\n updatedAt?: string;\n /** Slug do produto referenciado. */\n productSlug?: string;\n}\n\nexport interface CreateTicketInput {\n subject: string;\n message: string;\n severity?: SupportSeverity;\n productSlug?: string;\n}\n\nexport interface SupportNamespace {\n /** Cria um novo ticket. Mock em dev, POST `/api/v1/products/{slug}/tickets` em prod. */\n createTicket(input: CreateTicketInput): Promise<SupportTicket>;\n /** Lista meus tickets abertos. */\n listMyTickets(): Promise<SupportTicket[]>;\n}\n\n// ─── v0.2 — Env detection ───────────────────────────────────────────────────\n\n/**\n * Modo do SDK. `dev` ativa mocks automáticos (úteis pra testes e\n * desenvolvimento sem precisar de backend rodando).\n */\nexport type NeetruEnv = 'dev' | 'workspace' | 'prod';\n\n/**\n * Configuração resolvida (defaults aplicados, fetch garantido).\n */\nexport interface ResolvedConfig {\n readonly apiKey?: string;\n readonly baseUrl: string;\n readonly fetch: typeof globalThis.fetch;\n /** Resolved env — `dev` | `workspace` | `prod`. Default `prod`. */\n readonly env: NeetruEnv;\n /** Default productId (v0.3). */\n readonly productId?: string;\n /** Default tenantId (v0.3). */\n readonly tenantId?: string;\n}\n\n/** Opções pra `catalog.list()`. */\nexport interface CatalogListOptions {\n /** Inclui rascunhos (apenas com Bearer staff). Default false. */\n includeDrafts?: boolean;\n}\n","/**\n * HTTP transport interno do SDK.\n *\n * Responsabilidades:\n * - Construir URL absoluta a partir de `baseUrl` + path\n * - Injetar Bearer token quando `requireAuth=true`\n * - Mapear status HTTP → `NeetruError` com `code` estável\n * - Parse defensivo de JSON (não lança em body vazio em 204)\n *\n * Não faz retry/backoff em v0.1 (carry-over Sprint 3+).\n */\nimport { NeetruError, type NeetruErrorCode } from './errors';\nimport type { ResolvedConfig } from './types';\n\n/** Opções da request HTTP. */\nexport interface HttpRequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n /** Path relativo (ex: `/api/v1/cli/catalog`). Concatenado a `baseUrl`. */\n path: string;\n /** Query string params (chave → valor primitivo). Valores `undefined` ignorados. */\n query?: Record<string, string | number | boolean | undefined>;\n /** Body JSON-serializável. Ignorado em GET/DELETE. */\n body?: unknown;\n /**\n * Se true, injeta `Authorization: Bearer <apiKey>`. Lança `missing_api_key`\n * se config.apiKey ausente. Default false.\n */\n requireAuth?: boolean;\n /** Cabeçalhos extras. */\n headers?: Record<string, string>;\n}\n\n/** Mapeamento status → code estável do NeetruError. */\nfunction statusToCode(status: number): NeetruErrorCode {\n if (status === 401) return 'unauthorized';\n if (status === 403) return 'forbidden';\n if (status === 404) return 'not_found';\n if (status === 422 || status === 400) return 'validation_failed';\n if (status === 429) return 'rate_limited';\n if (status >= 500) return 'server_error';\n return 'unknown';\n}\n\nfunction buildUrl(baseUrl: string, path: string, query?: HttpRequestOptions['query']): string {\n // Trim trailing slash em base e leading em path pra evitar `//`.\n const base = baseUrl.replace(/\\/+$/, '');\n const p = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(`${base}${p}`);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\n/** Parse JSON defensivo — retorna `undefined` em body vazio. */\nasync function safeJson(res: Response): Promise<unknown> {\n const text = await res.text();\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Executa request HTTP. Em sucesso retorna body parseado; em erro lança\n * `NeetruError` com `code` derivado do status.\n */\nexport async function httpRequest<T>(\n config: ResolvedConfig,\n opts: HttpRequestOptions,\n): Promise<T> {\n const method = opts.method ?? 'GET';\n const url = buildUrl(config.baseUrl, opts.path, opts.query);\n\n const headers: Record<string, string> = {\n accept: 'application/json',\n ...opts.headers,\n };\n\n if (opts.requireAuth) {\n if (!config.apiKey) {\n throw new NeetruError(\n 'missing_api_key',\n 'This operation requires an apiKey. Pass it to createNeetruClient({ apiKey }) or set NEETRU_API_KEY env var.',\n );\n }\n headers.authorization = `Bearer ${config.apiKey}`;\n }\n\n const init: RequestInit = { method, headers };\n if (opts.body !== undefined && method !== 'GET' && method !== 'DELETE') {\n headers['content-type'] = 'application/json';\n init.body = JSON.stringify(opts.body);\n }\n\n let res: Response;\n try {\n res = await config.fetch(url, init);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'fetch failed';\n throw new NeetruError('network_error', `Network error: ${message}`);\n }\n\n const requestId = res.headers.get('x-request-id') ?? res.headers.get('x-correlation-id') ?? undefined;\n\n if (!res.ok) {\n const body = (await safeJson(res)) as { error?: { code?: string; message?: string } | string } | undefined;\n let code: string = statusToCode(res.status);\n let message = `HTTP ${res.status}`;\n if (body && typeof body === 'object' && 'error' in body) {\n const errField = body.error;\n if (typeof errField === 'string') {\n message = errField;\n } else if (errField && typeof errField === 'object') {\n if (typeof errField.code === 'string') code = errField.code;\n if (typeof errField.message === 'string') message = errField.message;\n }\n }\n throw new NeetruError(code, message, res.status, requestId);\n }\n\n const parsed = await safeJson(res);\n // Caller é responsável por validar shape; SDK assume backend correto.\n return parsed as T;\n}\n","/**\n * Catálogo público de produtos SaaS Neetru.\n *\n * Endpoints consumidos:\n * - `GET /api/v1/cli/catalog` — listagem (Bearer required)\n * - `GET /api/v1/cli/catalog/{slug}` — produto único (Bearer required)\n *\n * Read-only. v0.1 não expõe escrita — publicação de produto é via CLI\n * `neetru publish`, não cabe em SDK runtime.\n */\nimport { NeetruError } from './errors';\nimport { httpRequest } from './http';\nimport type {\n CatalogListOptions,\n CatalogListResponse,\n Product,\n ResolvedConfig,\n} from './types';\n\ninterface RawCatalogListResponse {\n ok?: boolean;\n count?: number;\n products?: unknown[];\n fetchedAt?: string;\n}\n\ninterface RawCatalogGetResponse {\n ok?: boolean;\n product?: unknown;\n}\n\nfunction toProduct(raw: unknown): Product {\n if (!raw || typeof raw !== 'object') {\n throw new NeetruError('invalid_response', 'Catalog response item is not an object');\n }\n const r = raw as Record<string, unknown>;\n if (typeof r.slug !== 'string' || !r.slug) {\n throw new NeetruError('invalid_response', 'Catalog product missing slug');\n }\n if (typeof r.name !== 'string' || !r.name) {\n throw new NeetruError('invalid_response', 'Catalog product missing name');\n }\n const product: Product = {\n slug: r.slug,\n name: r.name,\n };\n if (typeof r.tagline === 'string') product.tagline = r.tagline;\n if (typeof r.description === 'string') product.description = r.description;\n if (r.status === 'live' || r.status === 'soon' || r.status === 'beta') {\n product.status = r.status;\n }\n if (typeof r.iconKey === 'string') product.iconKey = r.iconKey;\n if (typeof r.ctaHref === 'string') product.ctaHref = r.ctaHref;\n if (typeof r.ctaLabel === 'string') product.ctaLabel = r.ctaLabel;\n // plans é placeholder v0.2 — preservar se backend mandar\n if (Array.isArray(r.plans)) {\n product.plans = r.plans.filter(\n (p): p is { id: string; name: string } =>\n typeof p === 'object' &&\n p !== null &&\n typeof (p as Record<string, unknown>).id === 'string' &&\n typeof (p as Record<string, unknown>).name === 'string',\n ) as Product['plans'];\n }\n return product;\n}\n\nexport function createCatalogNamespace(config: ResolvedConfig) {\n return {\n /**\n * Lista produtos publicados. Por default só `published=true`; staff\n * pode passar `includeDrafts: true` (requer Bearer com role admin/operator).\n */\n async list(opts: CatalogListOptions = {}): Promise<CatalogListResponse> {\n const raw = await httpRequest<RawCatalogListResponse>(config, {\n method: 'GET',\n path: '/api/v1/cli/catalog',\n query: opts.includeDrafts ? { drafts: 'true' } : undefined,\n requireAuth: true,\n });\n\n if (!raw || !Array.isArray(raw.products)) {\n throw new NeetruError(\n 'invalid_response',\n 'Catalog list response missing products array',\n );\n }\n\n return {\n products: raw.products.map(toProduct),\n fetchedAt: typeof raw.fetchedAt === 'string'\n ? raw.fetchedAt\n : new Date().toISOString(),\n };\n },\n\n /**\n * Busca produto único por slug.\n *\n * @throws {NeetruError} `not_found` se slug inexistente ou não publicado.\n */\n async get(slug: string): Promise<Product> {\n if (!slug || typeof slug !== 'string') {\n throw new NeetruError('validation_failed', 'slug is required');\n }\n const raw = await httpRequest<RawCatalogGetResponse>(config, {\n method: 'GET',\n path: `/api/v1/cli/catalog/${encodeURIComponent(slug)}`,\n requireAuth: true,\n });\n\n if (!raw || !raw.product) {\n throw new NeetruError(\n 'invalid_response',\n 'Catalog get response missing product',\n );\n }\n return toProduct(raw.product);\n },\n };\n}\n","/**\n * Entitlements — verifica se o portador da apiKey pode usar feature X\n * do produto Y.\n *\n * Endpoint: `GET /api/v1/sdk/entitlements/check?slug=X&feature=Y`\n * Schema Firestore consultado pelo backend:\n * `entitlements/{userId}/products/{slug}` → `{ features: string[], plan, expiresAt }`\n *\n * v0.1 sem cache local — cada `check()` é uma request. Cache LRU é Sprint 3\n * (vide `docs/PLAN_SDK_NEETRU.md` Sprint 3).\n */\nimport { NeetruError } from './errors';\nimport { httpRequest } from './http';\nimport type { EntitlementCheck, ResolvedConfig } from './types';\n\ninterface RawEntitlementCheck {\n allowed?: boolean;\n productSlug?: string;\n feature?: string;\n reason?: string;\n}\n\nfunction toEntitlementCheck(raw: unknown): EntitlementCheck {\n if (!raw || typeof raw !== 'object') {\n throw new NeetruError('invalid_response', 'Entitlement response is not an object');\n }\n const r = raw as RawEntitlementCheck;\n if (typeof r.allowed !== 'boolean') {\n throw new NeetruError('invalid_response', 'Entitlement response missing `allowed` boolean');\n }\n return {\n allowed: r.allowed,\n productSlug: typeof r.productSlug === 'string' ? r.productSlug : '',\n feature: typeof r.feature === 'string' ? r.feature : '',\n reason: typeof r.reason === 'string' ? r.reason : undefined,\n };\n}\n\nexport function createEntitlementsNamespace(config: ResolvedConfig) {\n async function checkDetailed(productSlug: string, feature: string): Promise<EntitlementCheck> {\n if (!productSlug) throw new NeetruError('validation_failed', 'productSlug is required');\n if (!feature) throw new NeetruError('validation_failed', 'feature is required');\n\n const raw = await httpRequest<RawEntitlementCheck>(config, {\n method: 'GET',\n path: '/api/v1/sdk/entitlements/check',\n query: { slug: productSlug, feature },\n requireAuth: true,\n });\n return toEntitlementCheck(raw);\n }\n\n return {\n /**\n * Verifica se o caller pode usar `feature` no produto `productSlug`.\n * Retorno simples: `true` libera, `false` bloqueia.\n *\n * Use `checkDetailed` se precisar do `reason` pra mensagem de upgrade.\n */\n async check(productSlug: string, feature: string): Promise<boolean> {\n const result = await checkDetailed(productSlug, feature);\n return result.allowed;\n },\n checkDetailed,\n };\n}\n","/**\n * Telemetria — emite eventos do produto cliente pro Core.\n *\n * Endpoint legacy `event()`:\n * `POST /api/v1/sdk/telemetry/event` — persiste em `usage_events/{id}`.\n *\n * Sprint 6 — `log()`:\n * - Em `NEETRU_ENV=dev`: console.{level} apenas (sem network).\n * - Em `workspace`/`prod`: `POST /sdk/v1/telemetry/log` com Bearer +\n * correlationId injetado.\n *\n * v0.1 sem batching — cada chamada é uma request.\n */\nimport { NeetruError } from './errors';\nimport { httpRequest } from './http';\nimport type {\n ResolvedConfig,\n TelemetryEventAck,\n TelemetryEventInput,\n TelemetryLogAck,\n TelemetryLogInput,\n TelemetryLogLevel,\n} from './types';\n\ninterface RawTelemetryAck {\n ok?: boolean;\n eventId?: string;\n}\n\ninterface RawLogAck {\n ok?: boolean;\n logId?: string;\n}\n\nconst VALID_LOG_LEVELS: readonly TelemetryLogLevel[] = ['debug', 'info', 'warn', 'error', 'fatal'];\n\nfunction consoleFor(level: TelemetryLogLevel): (message?: unknown, ...optional: unknown[]) => void {\n switch (level) {\n case 'debug': return console.debug.bind(console);\n case 'info': return console.info.bind(console);\n case 'warn': return console.warn.bind(console);\n case 'error': return console.error.bind(console);\n case 'fatal': return console.error.bind(console);\n default: return console.log.bind(console);\n }\n}\n\nexport function createTelemetryNamespace(config: ResolvedConfig) {\n return {\n /**\n * Persiste um evento de uso. Lança `NeetruError` em qualquer falha\n * (incluindo rate-limit).\n *\n * @example\n * ```ts\n * await client.telemetry.event({\n * name: 'dashboard_opened',\n * properties: { plan: 'pro', tab: 'overview' },\n * });\n * ```\n */\n async event(input: TelemetryEventInput): Promise<TelemetryEventAck> {\n if (!input || typeof input !== 'object') {\n throw new NeetruError('validation_failed', 'event input is required');\n }\n if (typeof input.name !== 'string' || input.name.length === 0) {\n throw new NeetruError('validation_failed', 'event.name is required');\n }\n if (input.name.length > 128) {\n throw new NeetruError('validation_failed', 'event.name max 128 chars');\n }\n\n const body: Record<string, unknown> = { name: input.name };\n if (input.properties && typeof input.properties === 'object') {\n body.properties = input.properties;\n }\n if (input.timestamp) body.timestamp = input.timestamp;\n\n const raw = await httpRequest<RawTelemetryAck>(config, {\n method: 'POST',\n path: '/api/v1/sdk/telemetry/event',\n body,\n requireAuth: true,\n });\n\n if (!raw || raw.ok !== true || typeof raw.eventId !== 'string') {\n throw new NeetruError('invalid_response', 'Telemetry response missing eventId');\n }\n return { ok: true, eventId: raw.eventId };\n },\n\n /**\n * Registra um log estruturado per-product (Sprint 6).\n *\n * - `NEETRU_ENV=dev`: console.{level}, retorna ack mock.\n * - workspace/prod: HTTP POST com Bearer auth + correlationId no header.\n *\n * @example\n * ```ts\n * await client.telemetry.log({\n * level: 'error',\n * message: 'Falha ao calcular total',\n * metadata: { orderId: 'o-123' },\n * });\n * ```\n */\n async log(input: TelemetryLogInput): Promise<TelemetryLogAck> {\n if (!input || typeof input !== 'object') {\n throw new NeetruError('validation_failed', 'log input is required');\n }\n if (!VALID_LOG_LEVELS.includes(input.level)) {\n throw new NeetruError('validation_failed', `level must be one of ${VALID_LOG_LEVELS.join(', ')}`);\n }\n if (typeof input.message !== 'string' || input.message.length === 0) {\n throw new NeetruError('validation_failed', 'message is required');\n }\n if (input.message.length > 4_000) {\n throw new NeetruError('validation_failed', 'message max 4000 chars');\n }\n\n // Dev mode: console only, no network.\n if (config.env === 'dev') {\n const fn = consoleFor(input.level);\n fn(`[neetru-sdk] ${input.level}: ${input.message}`, input.metadata ?? {});\n return { ok: true, mode: 'mock' };\n }\n\n const body: Record<string, unknown> = {\n level: input.level,\n message: input.message,\n };\n if (input.metadata) body.metadata = input.metadata;\n if (input.productSlug) body.productSlug = input.productSlug;\n\n // CorrelationId: explicit input wins; senão tenta lê de globalThis (set\n // por instrumentação do consumer).\n let cid = input.correlationId;\n if (!cid) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const g = (globalThis as any).NEETRU_CORRELATION_ID;\n if (typeof g === 'string' && g.length > 0) cid = g;\n } catch {\n /* ignore */\n }\n }\n\n const headers: Record<string, string> = {};\n if (cid) headers['x-correlation-id'] = cid;\n\n const raw = await httpRequest<RawLogAck>(config, {\n method: 'POST',\n path: '/sdk/v1/telemetry/log',\n body,\n requireAuth: true,\n headers,\n });\n\n if (!raw || raw.ok !== true) {\n throw new NeetruError('invalid_response', 'Telemetry log response missing ok');\n }\n return {\n ok: true,\n logId: typeof raw.logId === 'string' ? raw.logId : undefined,\n mode: 'http',\n };\n },\n };\n}\n","/**\n * Usage namespace — track usage events e ler quotas (v0.2).\n *\n * Endpoints consumidos (em prod):\n * - `POST /sdk/v1/usage/record` — record event\n * - `GET /sdk/v1/usage/quota?metric=X` — ler quota da metric\n *\n * Comportamento por env:\n * - `dev` → MockUsage (in-memory, retornado pelo factory).\n * - `workspace`/`prod` → HTTP real.\n *\n * Diferença vs `telemetry`: telemetry é evento analítico (event sourcing pra\n * BigQuery). usage é meterado (consumo cobrado), com quota explícita por plano.\n */\nimport { NeetruError } from './errors';\nimport { httpRequest } from './http';\nimport type { ResolvedConfig, UsageNamespace, UsageQuota } from './types';\n\ninterface RawUsageAck {\n ok?: boolean;\n recordId?: string;\n}\n\ninterface RawUsageQuota {\n metric?: string;\n used?: number;\n limit?: number;\n resetsAt?: string;\n plan?: string;\n}\n\nfunction toQuota(metric: string, raw: unknown): UsageQuota {\n if (!raw || typeof raw !== 'object') {\n throw new NeetruError('invalid_response', 'Quota response is not an object');\n }\n const r = raw as RawUsageQuota;\n if (typeof r.used !== 'number' || typeof r.limit !== 'number') {\n throw new NeetruError('invalid_response', 'Quota response missing used/limit numbers');\n }\n return {\n metric: typeof r.metric === 'string' ? r.metric : metric,\n used: r.used,\n limit: r.limit,\n resetsAt: typeof r.resetsAt === 'string' ? r.resetsAt : undefined,\n plan: typeof r.plan === 'string' ? r.plan : undefined,\n };\n}\n\nexport function createUsageNamespace(config: ResolvedConfig): UsageNamespace {\n return {\n /**\n * Persiste um evento de usage. Em dev (mocks ativos via factory) só loga.\n * Em workspace/prod chama POST /sdk/v1/usage/record.\n */\n async track(\n event: string,\n properties?: Record<string, string | number | boolean | null>,\n ): Promise<{ ok: true }> {\n if (!event || typeof event !== 'string') {\n throw new NeetruError('validation_failed', 'event name is required');\n }\n if (event.length > 128) {\n throw new NeetruError('validation_failed', 'event name max 128 chars');\n }\n\n const body: Record<string, unknown> = { event };\n if (properties && typeof properties === 'object') body.properties = properties;\n\n const raw = await httpRequest<RawUsageAck>(config, {\n method: 'POST',\n path: '/sdk/v1/usage/record',\n body,\n requireAuth: true,\n });\n\n if (!raw || raw.ok !== true) {\n throw new NeetruError('invalid_response', 'Usage record response missing ok');\n }\n return { ok: true };\n },\n\n /**\n * Lê quota atual de uma métrica. Cacheável (caller decide), SDK não cacheia.\n */\n async getQuota(metric: string): Promise<UsageQuota> {\n if (!metric || typeof metric !== 'string') {\n throw new NeetruError('validation_failed', 'metric is required');\n }\n const raw = await httpRequest<RawUsageQuota>(config, {\n method: 'GET',\n path: '/sdk/v1/usage/quota',\n query: { metric },\n requireAuth: true,\n });\n return toQuota(metric, raw);\n },\n\n /**\n * v0.3 — Reporta consumo metered. Hit no endpoint canônico Sprint 7.\n */\n async report(\n resource: string,\n qty: number = 1,\n options?: { productId?: string; tenantId?: string },\n ) {\n if (!resource || typeof resource !== 'string') {\n throw new NeetruError('validation_failed', 'resource is required');\n }\n if (!Number.isFinite(qty) || qty <= 0) {\n throw new NeetruError('validation_failed', 'qty must be positive integer');\n }\n const productId = options?.productId ?? config.productId;\n const tenantId = options?.tenantId ?? config.tenantId;\n if (!productId) {\n throw new NeetruError(\n 'validation_failed',\n 'productId required (pass to options or set on createNeetruClient)',\n );\n }\n if (!tenantId) {\n throw new NeetruError(\n 'validation_failed',\n 'tenantId required (pass to options or set on createNeetruClient)',\n );\n }\n\n const raw = await httpRequest<{\n ok?: boolean;\n counterId?: string;\n value?: number;\n limit?: number;\n remaining?: number;\n status?: string;\n }>(config, {\n method: 'POST',\n path: '/sdk/v1/usage/record',\n body: { productId, tenantId, resource, qty: Math.floor(qty) },\n requireAuth: true,\n });\n if (!raw || raw.ok !== true) {\n throw new NeetruError('invalid_response', 'usage.report response missing ok');\n }\n return {\n ok: true as const,\n counterId: raw.counterId,\n value: raw.value,\n limit: raw.limit,\n remaining: raw.remaining,\n status: raw.status,\n };\n },\n\n /**\n * v0.3 — Verifica entitlement de um resource via GET /sdk/v1/entitlements.\n */\n async check(\n resource: string,\n options?: { productId?: string; tenantId?: string },\n ) {\n if (!resource || typeof resource !== 'string') {\n throw new NeetruError('validation_failed', 'resource is required');\n }\n const productId = options?.productId ?? config.productId;\n const tenantId = options?.tenantId ?? config.tenantId;\n if (!productId || !tenantId) {\n throw new NeetruError(\n 'validation_failed',\n 'productId and tenantId required',\n );\n }\n const raw = await httpRequest<{\n allowed?: boolean;\n reason?: string;\n remaining?: number;\n limit?: number;\n planId?: string | null;\n planFeatures?: string[];\n }>(config, {\n method: 'GET',\n path: '/sdk/v1/entitlements',\n query: { productId, tenantId, feature: resource },\n requireAuth: true,\n });\n if (!raw || typeof raw.allowed !== 'boolean') {\n throw new NeetruError('invalid_response', 'usage.check response missing allowed');\n }\n return {\n allowed: raw.allowed,\n reason: raw.reason,\n remaining: raw.remaining,\n limit: raw.limit,\n planId: raw.planId,\n planFeatures: raw.planFeatures,\n };\n },\n };\n}\n","/**\n * Support namespace — criar e listar tickets do customer (v0.2).\n *\n * Endpoints (em prod):\n * - `POST /api/v1/products/{slug}/tickets` — criar ticket\n * - `GET /api/v1/products/{slug}/tickets` — listar meus tickets do produto\n *\n * Em dev (mocks ativos via factory) tudo é in-memory.\n *\n * Decisão: severity default é `normal`. `low` indica feature requests; `urgent`\n * pra outages production (paginating ops imediatamente em prod).\n */\nimport { NeetruError } from './errors';\nimport { httpRequest } from './http';\nimport type {\n CreateTicketInput,\n ResolvedConfig,\n SupportNamespace,\n SupportSeverity,\n SupportStatus,\n SupportTicket,\n} from './types';\n\nconst VALID_SEVERITIES: readonly SupportSeverity[] = ['low', 'normal', 'high', 'urgent'];\nconst VALID_STATUSES: readonly SupportStatus[] = ['open', 'pending', 'resolved', 'closed'];\n\ninterface RawTicket {\n id?: string;\n subject?: string;\n message?: string;\n severity?: string;\n status?: string;\n createdAt?: string;\n updatedAt?: string;\n productSlug?: string;\n}\n\nfunction toTicket(raw: unknown): SupportTicket {\n if (!raw || typeof raw !== 'object') {\n throw new NeetruError('invalid_response', 'Ticket response is not an object');\n }\n const r = raw as RawTicket;\n if (typeof r.id !== 'string') {\n throw new NeetruError('invalid_response', 'Ticket missing id');\n }\n return {\n id: r.id,\n subject: typeof r.subject === 'string' ? r.subject : '',\n message: typeof r.message === 'string' ? r.message : '',\n severity: VALID_SEVERITIES.includes(r.severity as SupportSeverity)\n ? (r.severity as SupportSeverity)\n : 'normal',\n status: VALID_STATUSES.includes(r.status as SupportStatus)\n ? (r.status as SupportStatus)\n : 'open',\n createdAt: typeof r.createdAt === 'string' ? r.createdAt : new Date().toISOString(),\n updatedAt: typeof r.updatedAt === 'string' ? r.updatedAt : undefined,\n productSlug: typeof r.productSlug === 'string' ? r.productSlug : undefined,\n };\n}\n\nexport function createSupportNamespace(config: ResolvedConfig): SupportNamespace {\n return {\n /**\n * Cria um ticket de suporte. Requer Bearer auth. Se `productSlug` não é\n * passado, o backend infere do escopo do token.\n */\n async createTicket(input: CreateTicketInput): Promise<SupportTicket> {\n if (!input || typeof input !== 'object') {\n throw new NeetruError('validation_failed', 'input is required');\n }\n if (!input.subject || typeof input.subject !== 'string') {\n throw new NeetruError('validation_failed', 'subject is required');\n }\n if (input.subject.length > 200) {\n throw new NeetruError('validation_failed', 'subject max 200 chars');\n }\n if (!input.message || typeof input.message !== 'string') {\n throw new NeetruError('validation_failed', 'message is required');\n }\n if (input.message.length > 10_000) {\n throw new NeetruError('validation_failed', 'message max 10000 chars');\n }\n if (input.severity && !VALID_SEVERITIES.includes(input.severity)) {\n throw new NeetruError('validation_failed', `severity must be one of ${VALID_SEVERITIES.join(', ')}`);\n }\n\n const slug = input.productSlug ?? '_default';\n const body: Record<string, unknown> = {\n subject: input.subject,\n message: input.message,\n severity: input.severity ?? 'normal',\n };\n\n const raw = await httpRequest<RawTicket | { ticket?: RawTicket }>(config, {\n method: 'POST',\n path: `/api/v1/products/${encodeURIComponent(slug)}/tickets`,\n body,\n requireAuth: true,\n });\n\n // Backend pode envelopar como { ticket: {...} } ou retornar direto.\n const candidate =\n raw && typeof raw === 'object' && 'ticket' in raw\n ? (raw as { ticket?: RawTicket }).ticket\n : raw;\n return toTicket(candidate);\n },\n\n /**\n * Lista tickets do customer no produto atual (escopo do token).\n */\n async listMyTickets(): Promise<SupportTicket[]> {\n const raw = await httpRequest<{ tickets?: unknown[] } | unknown[]>(config, {\n method: 'GET',\n path: '/api/v1/products/_default/tickets',\n requireAuth: true,\n });\n const list = Array.isArray(raw) ? raw : raw && typeof raw === 'object' && 'tickets' in raw ? (raw as { tickets?: unknown[] }).tickets ?? [] : [];\n return list.map(toTicket);\n },\n };\n}\n","/**\n * Datastore namespace (v0.3.1) — Sprint 8.\n *\n * `client.db.collection(name)` retorna um `DbCollectionRef` que mapeia para\n * `tenant_{tid}_{name}` no Core. Endpoints REST disponíveis (Sprint 8 LIVE):\n * - `GET /sdk/v1/datastore/{collection}?limit&where`\n * - `POST /sdk/v1/datastore/{collection}` (add)\n * - `GET /sdk/v1/datastore/{collection}/{id}`\n * - `PATCH /sdk/v1/datastore/{collection}/{id}` (update merge)\n * - `PUT /sdk/v1/datastore/{collection}/{id}` (set replace)\n * - `DELETE /sdk/v1/datastore/{collection}/{id}`\n *\n * O Core resolve `tenantId` via Bearer token. SDK passa `x-neetru-tenant`\n * pra dar visibilidade explícita; backend valida match com o token.\n *\n * Em dev (NEETRU_ENV=dev), `client.db` é `MockDb` (in-memory).\n */\nimport { httpRequest } from './http';\nimport { NeetruError } from './errors';\nimport type {\n DbCollectionRef,\n DbListOptions,\n DbNamespace,\n DbWhereFilter,\n ResolvedConfig,\n} from './types';\n\nconst COLL_RE = /^[a-z0-9][a-z0-9_-]{0,62}$/;\n\nfunction assertValidCollection(name: string): void {\n if (!COLL_RE.test(name)) {\n throw new NeetruError(\n 'validation_failed',\n `Invalid collection name: \"${name}\". Must match ${COLL_RE}.`,\n );\n }\n}\n\n/** Serializa filtro pro formato `field:op:value` aceito pelo backend. */\nfunction serializeWhere(filter: DbWhereFilter): string {\n const { field, op, value } = filter;\n if (op === 'in') {\n if (!Array.isArray(value)) {\n throw new NeetruError(\n 'validation_failed',\n `where op=\"in\" requer value array (recebido: ${typeof value})`,\n );\n }\n return `${field}:in:${value.map((v) => String(v)).join(',')}`;\n }\n return `${field}:${op}:${String(value)}`;\n}\n\n/**\n * Constrói o namespace `db` real (HTTP) com binding ao tenantId resolvido.\n */\nexport function createDbNamespace(config: ResolvedConfig): DbNamespace {\n return {\n collection(name: string): DbCollectionRef {\n assertValidCollection(name);\n\n const headers: Record<string, string> = {};\n if (config.tenantId) headers['x-neetru-tenant'] = config.tenantId;\n\n return {\n async list<T = Record<string, unknown>>(\n opts?: DbListOptions,\n ): Promise<T[]> {\n const query: Record<string, string | number> = {};\n if (opts?.limit !== undefined) query.limit = opts.limit;\n\n // multi-where → request URL múltiplo `where=...&where=...`. Como\n // `httpRequest.query` é Record<>, monta path manualmente quando há\n // filtros pra preservar repetição da chave.\n let path = `/sdk/v1/datastore/${name}`;\n const params = new URLSearchParams();\n if (opts?.limit !== undefined) params.set('limit', String(opts.limit));\n if (opts?.where && opts.where.length > 0) {\n for (const f of opts.where) {\n params.append('where', serializeWhere(f));\n }\n }\n if (config.tenantId) params.set('tenantId', config.tenantId);\n const qs = params.toString();\n if (qs) path += `?${qs}`;\n\n const raw = await httpRequest<{ items?: unknown[] }>(config, {\n method: 'GET',\n path,\n requireAuth: true,\n headers,\n });\n if (!raw || !Array.isArray(raw.items)) {\n throw new NeetruError(\n 'invalid_response',\n 'datastore.list missing items[]',\n );\n }\n return raw.items as T[];\n },\n\n async get<T = Record<string, unknown>>(id: string): Promise<T | null> {\n if (!id || typeof id !== 'string') {\n throw new NeetruError('validation_failed', 'id required');\n }\n try {\n const raw = await httpRequest<{ item?: T | null }>(config, {\n method: 'GET',\n path: `/sdk/v1/datastore/${name}/${encodeURIComponent(id)}`,\n requireAuth: true,\n headers,\n });\n return raw?.item ?? null;\n } catch (err) {\n if (err instanceof NeetruError && err.code === 'not_found') return null;\n throw err;\n }\n },\n\n async add(data: Record<string, unknown>): Promise<{ ok: true; id: string }> {\n if (!data || typeof data !== 'object') {\n throw new NeetruError('validation_failed', 'data object required');\n }\n const raw = await httpRequest<{ ok?: boolean; id?: string }>(config, {\n method: 'POST',\n path: `/sdk/v1/datastore/${name}`,\n body: { data },\n requireAuth: true,\n headers,\n });\n if (!raw || typeof raw.id !== 'string') {\n throw new NeetruError('invalid_response', 'datastore.add missing id');\n }\n return { ok: true, id: raw.id };\n },\n\n async set(id: string, data: Record<string, unknown>): Promise<{ ok: true }> {\n if (!id || typeof id !== 'string') {\n throw new NeetruError('validation_failed', 'id required');\n }\n await httpRequest(config, {\n method: 'PUT',\n path: `/sdk/v1/datastore/${name}/${encodeURIComponent(id)}`,\n body: { data },\n requireAuth: true,\n headers,\n });\n return { ok: true };\n },\n\n async update(id: string, data: Record<string, unknown>): Promise<{ ok: true }> {\n if (!id || typeof id !== 'string') {\n throw new NeetruError('validation_failed', 'id required');\n }\n await httpRequest(config, {\n method: 'PATCH',\n path: `/sdk/v1/datastore/${name}/${encodeURIComponent(id)}`,\n body: { data },\n requireAuth: true,\n headers,\n });\n return { ok: true };\n },\n\n async remove(id: string): Promise<{ ok: true }> {\n if (!id || typeof id !== 'string') {\n throw new NeetruError('validation_failed', 'id required');\n }\n await httpRequest(config, {\n method: 'DELETE',\n path: `/sdk/v1/datastore/${name}/${encodeURIComponent(id)}`,\n requireAuth: true,\n headers,\n });\n return { ok: true };\n },\n };\n },\n };\n}\n","/**\n * Mocks determinísticos do SDK — overridáveis em tests do consumer ou\n * ativados automaticamente quando `NEETRU_ENV=dev`.\n *\n * Nada aqui faz I/O. Tudo é puro/sincrono/in-memory. Compat total com\n * runtimes browser/Node/Edge — sem `node:` builtins.\n *\n * Cada mock implementa o mesmo namespace interface das implementações reais\n * (`AuthNamespace`, `UsageNamespace`, `SupportNamespace`) — caller pode\n * substituir 1:1 sem branching.\n *\n * @example\n * ```ts\n * import { createNeetruClient, MockAuth } from '@neetru/sdk';\n *\n * const client = createNeetruClient({\n * mocks: { auth: new MockAuth({ uid: 'fake-user', email: 'x@x.com' }) },\n * });\n * ```\n */\n\nimport type {\n AuthNamespace,\n AuthStateListener,\n CreateTicketInput,\n DbCollectionRef,\n DbListOptions,\n DbNamespace,\n DbWhereFilter,\n EntitlementCheck,\n NeetruUser,\n SignInOptions,\n SupportNamespace,\n SupportTicket,\n UsageNamespace,\n UsageQuota,\n} from './types';\n\n// ─── User fixture default ──────────────────────────────────────────────────\n\n/**\n * User fixture determinístico — usado quando `NEETRU_ENV=dev` e nenhum mock\n * custom é injetado. Email/uid estáveis pra snapshot tests.\n */\nexport const DEV_FIXTURE_USER: NeetruUser = Object.freeze({\n uid: 'dev-fixture-uid-0001',\n email: 'dev@neetru.local',\n emailVerified: true,\n displayName: 'Dev Fixture',\n isCustomer: true,\n isStaff: false,\n}) as NeetruUser;\n\n// ─── MockAuth ──────────────────────────────────────────────────────────────\n\n/**\n * Implementação in-memory do `AuthNamespace`. signIn marca o user como\n * logado; signOut limpa. onAuthStateChanged dispara callback síncrono no\n * subscribe + a cada mudança.\n */\nexport class MockAuth implements AuthNamespace {\n private _user: NeetruUser | null;\n private _listeners: Set<AuthStateListener>;\n\n constructor(initialUser: NeetruUser | null = null) {\n this._user = initialUser;\n this._listeners = new Set();\n }\n\n async signIn(_options?: SignInOptions): Promise<NeetruUser> {\n // Mock: apenas marca user como logado (usa fixture se não havia).\n if (!this._user) this._user = { ...DEV_FIXTURE_USER };\n this._notify();\n return this._user;\n }\n\n async signOut(): Promise<void> {\n this._user = null;\n this._notify();\n }\n\n getUser(): NeetruUser | null {\n return this._user;\n }\n\n onAuthStateChanged(listener: AuthStateListener): () => void {\n this._listeners.add(listener);\n // Dispara imediatamente com estado atual (espelha API Firebase Auth).\n try {\n listener(this._user);\n } catch {\n // Callback do consumer não pode quebrar o subscribe.\n }\n return () => {\n this._listeners.delete(listener);\n };\n }\n\n /** Helper de tests — força um user state arbitrário. */\n __setUser(user: NeetruUser | null): void {\n this._user = user;\n this._notify();\n }\n\n private _notify(): void {\n for (const l of this._listeners) {\n try {\n l(this._user);\n } catch {\n // ignore consumer errors\n }\n }\n }\n}\n\n// ─── MockUsage ─────────────────────────────────────────────────────────────\n\ninterface UsageRecord {\n event: string;\n properties?: Record<string, string | number | boolean | null>;\n timestamp: string;\n}\n\n/**\n * In-memory `UsageNamespace`. `track()` apenas acumula no array\n * `__getRecords()` (útil pra asserts em test). `getQuota()` retorna fixture\n * com `used = trackedCount` da metric.\n */\nexport class MockUsage implements UsageNamespace {\n private _records: UsageRecord[] = [];\n private _quotas: Map<string, UsageQuota>;\n /** v0.3 — counters in-memory pra `report()` / `check()`. */\n private _counters: Map<string, number> = new Map();\n\n constructor(initialQuotas: Record<string, UsageQuota> = {}) {\n this._quotas = new Map(Object.entries(initialQuotas));\n }\n\n async track(\n event: string,\n properties?: Record<string, string | number | boolean | null>,\n ): Promise<{ ok: true }> {\n this._records.push({\n event,\n properties,\n timestamp: new Date().toISOString(),\n });\n return { ok: true };\n }\n\n async getQuota(metric: string): Promise<UsageQuota> {\n const existing = this._quotas.get(metric);\n if (existing) return existing;\n return {\n metric,\n used: this._records.filter((r) => r.event === metric).length,\n limit: -1, // unlimited em mock por default\n plan: 'mock',\n };\n }\n\n /** v0.3 — Mock report incrementa o counter local. */\n async report(\n resource: string,\n qty: number = 1,\n _options?: { productId?: string; tenantId?: string },\n ): Promise<{\n ok: true;\n counterId?: string;\n value?: number;\n limit?: number;\n remaining?: number;\n status?: string;\n }> {\n if (!resource) throw new Error('resource required');\n const safeQty = Number.isFinite(qty) && qty > 0 ? Math.floor(qty) : 1;\n const existing = this._counters.get(resource) ?? 0;\n const next = existing + safeQty;\n this._counters.set(resource, next);\n const limitFixture = this._quotas.get(resource);\n const limit = limitFixture?.limit ?? -1;\n return {\n ok: true,\n counterId: `mock_${resource}`,\n value: next,\n limit,\n remaining: limit < 0 ? -1 : Math.max(0, limit - next),\n status: limit > 0 && next >= limit ? 'read_only_overlimit' : 'ok',\n };\n }\n\n /** v0.3 — Mock check usa quotas + counters in-memory. */\n async check(\n resource: string,\n _options?: { productId?: string; tenantId?: string },\n ): Promise<{\n allowed: boolean;\n reason?: string;\n remaining?: number;\n limit?: number;\n planId?: string | null;\n planFeatures?: string[];\n }> {\n const quota = this._quotas.get(resource);\n const used = this._counters.get(resource) ?? 0;\n if (!quota) {\n return { allowed: true, reason: 'granted', limit: -1, remaining: -1 };\n }\n const remaining = quota.limit < 0 ? -1 : Math.max(0, quota.limit - used);\n if (remaining === 0) {\n return {\n allowed: false,\n reason: 'limit_exceeded',\n limit: quota.limit,\n remaining: 0,\n };\n }\n return {\n allowed: true,\n reason: 'granted',\n limit: quota.limit,\n remaining,\n };\n }\n\n /** Test helper. */\n __getRecords(): readonly UsageRecord[] {\n return [...this._records];\n }\n /** Test helper — substitui quota fixture. */\n __setQuota(metric: string, quota: UsageQuota): void {\n this._quotas.set(metric, quota);\n }\n /** Test helper — limpa estado. */\n __reset(): void {\n this._records = [];\n this._quotas.clear();\n this._counters.clear();\n }\n}\n\n// ─── MockSupport ───────────────────────────────────────────────────────────\n\nlet mockTicketSeq = 0;\n\n/**\n * In-memory `SupportNamespace`. createTicket gera ID `mock-ticket-{n}`;\n * listMyTickets retorna todos criados (FIFO).\n */\nexport class MockSupport implements SupportNamespace {\n private _tickets: SupportTicket[] = [];\n\n async createTicket(input: CreateTicketInput): Promise<SupportTicket> {\n if (!input?.subject) throw new Error('subject required');\n if (!input?.message) throw new Error('message required');\n const ticket: SupportTicket = {\n id: `mock-ticket-${++mockTicketSeq}`,\n subject: input.subject,\n message: input.message,\n severity: input.severity ?? 'normal',\n status: 'open',\n createdAt: new Date().toISOString(),\n productSlug: input.productSlug,\n };\n this._tickets.push(ticket);\n return ticket;\n }\n\n async listMyTickets(): Promise<SupportTicket[]> {\n return [...this._tickets];\n }\n\n /** Test helper. */\n __reset(): void {\n this._tickets = [];\n }\n}\n\n// ─── MockEntitlements ──────────────────────────────────────────────────────\n\n/**\n * In-memory entitlements. Por default `allowed=true` em tudo (dev convém).\n * Use `__deny(slug, feature)` em tests pra simular bloqueio.\n */\nexport class MockEntitlements {\n private _denied: Set<string> = new Set();\n\n async check(productSlug: string, feature: string): Promise<boolean> {\n return !this._denied.has(`${productSlug}:${feature}`);\n }\n\n async checkDetailed(productSlug: string, feature: string): Promise<EntitlementCheck> {\n const allowed = await this.check(productSlug, feature);\n return {\n allowed,\n productSlug,\n feature,\n reason: allowed ? 'granted' : 'mock_denied',\n };\n }\n\n /** Test helper. */\n __deny(productSlug: string, feature: string): void {\n this._denied.add(`${productSlug}:${feature}`);\n }\n /** Test helper. */\n __reset(): void {\n this._denied.clear();\n }\n}\n\n// ─── MockDb (v0.3) ─────────────────────────────────────────────────────────\n\n/**\n * In-memory `DbNamespace`. Cada `collection(name)` aponta para um Map; ops\n * são totalmente síncronas (mas API await-friendly).\n *\n * Útil para testar produtos consumidores sem rodar Core REST.\n */\nexport class MockDb implements DbNamespace {\n private _store: Map<string, Map<string, Record<string, unknown>>> = new Map();\n private _fixtures: Map<string, Record<string, Record<string, unknown>>>;\n\n constructor(initialFixtures: Record<string, Record<string, Record<string, unknown>>> = {}) {\n this._fixtures = new Map(Object.entries(initialFixtures));\n }\n\n collection(name: string): DbCollectionRef {\n const _store = this._store;\n const _fixtures = this._fixtures;\n if (!_store.has(name)) {\n const init = _fixtures.get(name);\n _store.set(\n name,\n init ? new Map(Object.entries(init)) : new Map(),\n );\n }\n const coll = _store.get(name)!;\n\n const matchesFilter = (\n doc: Record<string, unknown>,\n f: DbWhereFilter,\n ): boolean => {\n const v = doc[f.field];\n switch (f.op) {\n case '==':\n return v === f.value;\n case '!=':\n return v !== f.value;\n case '<':\n return typeof v === 'number' && typeof f.value === 'number' && v < f.value;\n case '<=':\n return typeof v === 'number' && typeof f.value === 'number' && v <= f.value;\n case '>':\n return typeof v === 'number' && typeof f.value === 'number' && v > f.value;\n case '>=':\n return typeof v === 'number' && typeof f.value === 'number' && v >= f.value;\n case 'in':\n return Array.isArray(f.value) && (f.value as unknown[]).includes(v);\n default:\n return true;\n }\n };\n\n let autoSeq = 0;\n\n return {\n async list<T = Record<string, unknown>>(opts?: DbListOptions): Promise<T[]> {\n let items = Array.from(coll.values());\n if (opts?.where && opts.where.length > 0) {\n items = items.filter((doc) =>\n (opts.where as DbWhereFilter[]).every((f) => matchesFilter(doc, f)),\n );\n }\n if (opts?.limit !== undefined) items = items.slice(0, opts.limit);\n return items as T[];\n },\n async get<T = Record<string, unknown>>(id: string): Promise<T | null> {\n return (coll.get(id) as T | undefined) ?? null;\n },\n async add(data: Record<string, unknown>): Promise<{ ok: true; id: string }> {\n const id = `mock-${++autoSeq}-${Math.random().toString(36).slice(2, 8)}`;\n coll.set(id, { ...data, id });\n return { ok: true, id };\n },\n async set(id: string, data: Record<string, unknown>): Promise<{ ok: true }> {\n coll.set(id, { ...data, id });\n return { ok: true };\n },\n async update(id: string, data: Record<string, unknown>): Promise<{ ok: true }> {\n const cur = coll.get(id);\n if (!cur) {\n // mock-friendly: cria se não existir (mimic Firestore set merge).\n coll.set(id, { ...data, id });\n } else {\n coll.set(id, { ...cur, ...data });\n }\n return { ok: true };\n },\n async remove(id: string): Promise<{ ok: true }> {\n coll.delete(id);\n return { ok: true };\n },\n };\n }\n\n /** Test helper — substitui fixture inteira de uma collection. */\n __setFixture(name: string, items: Record<string, Record<string, unknown>>): void {\n this._store.set(name, new Map(Object.entries(items)));\n }\n\n /** Test helper — reset total. */\n __reset(): void {\n this._store.clear();\n }\n}\n","/**\n * Factory `createNeetruClient` + namespace `auth` (v0.2).\n *\n * Responsabilidades:\n * - Factory: resolver `apiKey`, `baseUrl`, `fetch`, `env`, e montar handle\n * imutável com namespaces (`auth`, `catalog`, `entitlements`, `telemetry`,\n * `usage`, `support`).\n * - Auth namespace: signIn (OIDC redirect ou mock dev), signOut, getUser,\n * onAuthStateChanged.\n *\n * v0.1 expunha apenas Bearer estático (long-lived `nrt_*_*`). v0.2 adiciona\n * camada de auth para SaaS produtos consumirem identity Neetru via OIDC\n * (auth.neetru.com já live).\n */\nimport { NeetruError } from './errors';\nimport {\n DEFAULT_BASE_URL,\n type AuthNamespace,\n type AuthStateListener,\n type NeetruClient,\n type NeetruClientConfig,\n type NeetruEnv,\n type NeetruUser,\n type ResolvedConfig,\n type SignInOptions,\n} from './types';\nimport { createCatalogNamespace } from './catalog';\nimport { createEntitlementsNamespace } from './entitlements';\nimport { createTelemetryNamespace } from './telemetry';\nimport { createUsageNamespace } from './usage';\nimport { createSupportNamespace } from './support';\nimport { createDbNamespace } from './db';\nimport { DEV_FIXTURE_USER, MockAuth, MockDb, MockUsage, MockSupport, MockEntitlements } from './mocks';\n\n/**\n * Lê `NEETRU_API_KEY` do ambiente Node de forma defensiva. Em browser,\n * `process` não existe — try/catch evita ReferenceError. Em Edge runtimes\n * que polyfillam `process` parcialmente, optional chaining absorve undefined.\n */\nfunction readEnvApiKey(): string | undefined {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const proc = (globalThis as any).process;\n const val = proc?.env?.NEETRU_API_KEY;\n return typeof val === 'string' && val.length > 0 ? val : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolve `NEETRU_ENV` de várias fontes:\n * 1. Config arg `env`.\n * 2. `process.env.NEETRU_ENV` em Node.\n * 3. `globalThis.NEETRU_ENV` em browser/Edge (se setado por bundler).\n * 4. Default `prod`.\n */\nfunction resolveEnv(configEnv?: NeetruEnv): NeetruEnv {\n if (configEnv) return configEnv;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const proc = (globalThis as any).process;\n const val = proc?.env?.NEETRU_ENV;\n if (val === 'dev' || val === 'workspace' || val === 'prod') return val;\n } catch {\n /* ignore */\n }\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const g = (globalThis as any).NEETRU_ENV;\n if (g === 'dev' || g === 'workspace' || g === 'prod') return g;\n } catch {\n /* ignore */\n }\n return 'prod';\n}\n\n// ─── Real OIDC auth namespace ──────────────────────────────────────────────\n\n/**\n * Implementação real do namespace auth — redireciona pra auth.neetru.com\n * em signIn, lê id_token do localStorage (se browser) ou do env em Node.\n *\n * Storage key: `neetru_id_token`. JWT decoded inline (sem verifyJWT — backend\n * já validou; SDK só lê claims pra populate getUser).\n */\nfunction createOidcAuthNamespace(config: ResolvedConfig): AuthNamespace {\n const STORAGE_KEY = 'neetru_id_token';\n const listeners = new Set<AuthStateListener>();\n let cachedUser: NeetruUser | null = null;\n\n function getStorage(): Storage | null {\n try {\n return typeof globalThis.localStorage !== 'undefined' ? globalThis.localStorage : null;\n } catch {\n return null;\n }\n }\n\n function decodeJwtPayload(token: string): Record<string, unknown> | null {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n try {\n // base64url decode (browser/Node compat).\n const b64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n const pad = '='.repeat((4 - (b64.length % 4)) % 4);\n const decoded =\n typeof atob === 'function'\n ? atob(b64 + pad)\n : Buffer.from(b64 + pad, 'base64').toString('utf-8');\n return JSON.parse(decoded);\n } catch {\n return null;\n }\n }\n\n function tokenToUser(token: string): NeetruUser | null {\n const payload = decodeJwtPayload(token);\n if (!payload || typeof payload.sub !== 'string') return null;\n return {\n uid: payload.sub,\n email: typeof payload.email === 'string' ? payload.email : '',\n emailVerified: typeof payload.email_verified === 'boolean' ? payload.email_verified : undefined,\n displayName: typeof payload.name === 'string' ? payload.name : undefined,\n photoURL: typeof payload.picture === 'string' ? payload.picture : undefined,\n isStaff: payload.is_staff === true,\n isCustomer: payload.is_customer === true,\n tenantId: typeof payload.tenant_id === 'string' ? payload.tenant_id : undefined,\n ...payload,\n };\n }\n\n function loadCachedUser(): NeetruUser | null {\n if (cachedUser) return cachedUser;\n const storage = getStorage();\n if (!storage) return null;\n const token = storage.getItem(STORAGE_KEY);\n if (!token) return null;\n cachedUser = tokenToUser(token);\n return cachedUser;\n }\n\n function notify(): void {\n for (const l of listeners) {\n try {\n l(cachedUser);\n } catch {\n /* ignore consumer errors */\n }\n }\n }\n\n return {\n async signIn(options?: SignInOptions): Promise<NeetruUser | void> {\n // Em browser, redireciona pro authorize endpoint.\n if (typeof globalThis.location !== 'undefined' && typeof globalThis.location.assign === 'function') {\n const redirectUri = options?.redirectUri ?? globalThis.location.origin;\n const scope = options?.scope ?? 'openid profile email';\n const state = options?.postLoginRedirect ?? globalThis.location.href;\n const url = new URL('/oauth/authorize', config.baseUrl.replace(/\\/api$/, ''));\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('redirect_uri', redirectUri);\n url.searchParams.set('scope', scope);\n url.searchParams.set('state', state);\n if (config.apiKey) {\n // apiKey aqui age como client_id (formato `nrt_{client_id}_{secret}`).\n const clientId = config.apiKey.split('_')[1] ?? config.apiKey;\n url.searchParams.set('client_id', clientId);\n }\n globalThis.location.assign(url.toString());\n return;\n }\n // Não-browser sem mock — não dá pra signIn interativo.\n throw new NeetruError(\n 'invalid_config',\n 'auth.signIn requires a browser context or mocks. Use NEETRU_ENV=dev or pass mocks.auth.',\n );\n },\n\n async signOut(): Promise<void> {\n const storage = getStorage();\n if (storage) storage.removeItem(STORAGE_KEY);\n cachedUser = null;\n // Best-effort revoke no server (não bloqueia se falhar).\n try {\n await config.fetch(`${config.baseUrl}/oauth/revoke`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n });\n } catch {\n /* network failure non-fatal */\n }\n notify();\n },\n\n getUser(): NeetruUser | null {\n return loadCachedUser();\n },\n\n onAuthStateChanged(listener: AuthStateListener): () => void {\n listeners.add(listener);\n try {\n listener(loadCachedUser());\n } catch {\n /* ignore */\n }\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n\n/**\n * Cria uma instância imutável do cliente Neetru SDK.\n *\n * @example\n * ```ts\n * import { createNeetruClient } from '@neetru/sdk';\n *\n * const client = createNeetruClient({\n * apiKey: 'nrt_a1b2c3d4_xY9z...',\n * });\n *\n * const { products } = await client.catalog.list();\n * const can = await client.entitlements.check('neetru-pulse', 'export-pdf');\n * await client.telemetry.event({ name: 'report_exported' });\n * await client.usage.track('api_call', { route: '/x' });\n * await client.support.createTicket({ subject: 'help', message: '...' });\n * ```\n *\n * @throws {NeetruError} `invalid_config` se fetch não disponível no runtime.\n */\nexport function createNeetruClient(config: NeetruClientConfig = {}): NeetruClient {\n const fetchImpl = config.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== 'function') {\n throw new NeetruError(\n 'invalid_config',\n 'fetch is not available in this runtime. Pass `fetch` explicitly to createNeetruClient.',\n );\n }\n\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n const apiKey = config.apiKey ?? readEnvApiKey();\n const env = resolveEnv(config.env);\n\n // `bind` garante `this` correto em runtimes que validam (ex: undici).\n const resolved: ResolvedConfig = Object.freeze({\n apiKey,\n baseUrl,\n fetch: fetchImpl.bind(globalThis),\n env,\n productId: config.productId,\n tenantId: config.tenantId,\n });\n\n // Em dev, sempre ativa mocks. Mocks explícitos sempre vencem.\n const isDev = env === 'dev';\n const auth = config.mocks?.auth ?? (isDev ? new MockAuth({ ...DEV_FIXTURE_USER }) : createOidcAuthNamespace(resolved));\n const usage = config.mocks?.usage ?? (isDev ? new MockUsage() : createUsageNamespace(resolved));\n const support = config.mocks?.support ?? (isDev ? new MockSupport() : createSupportNamespace(resolved));\n const entitlements = config.mocks?.entitlements ?? (isDev ? new MockEntitlements() : createEntitlementsNamespace(resolved));\n const db = config.mocks?.db ?? (isDev ? new MockDb() : createDbNamespace(resolved));\n\n const client: NeetruClient = Object.freeze({\n config: resolved,\n auth,\n catalog: createCatalogNamespace(resolved),\n entitlements,\n telemetry: createTelemetryNamespace(resolved),\n usage,\n support,\n db,\n });\n\n return client;\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import { N as NeetruClientConfig, a as NeetruClient } from './types-PKUaFtBY.cjs';
2
+
3
+ /**
4
+ * Cria uma instância imutável do cliente Neetru SDK.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { createNeetruClient } from '@neetru/sdk';
9
+ *
10
+ * const client = createNeetruClient({
11
+ * apiKey: 'nrt_a1b2c3d4_xY9z...',
12
+ * });
13
+ *
14
+ * const { products } = await client.catalog.list();
15
+ * const can = await client.entitlements.check('neetru-pulse', 'export-pdf');
16
+ * await client.telemetry.event({ name: 'report_exported' });
17
+ * await client.usage.track('api_call', { route: '/x' });
18
+ * await client.support.createTicket({ subject: 'help', message: '...' });
19
+ * ```
20
+ *
21
+ * @throws {NeetruError} `invalid_config` se fetch não disponível no runtime.
22
+ */
23
+ declare function createNeetruClient(config?: NeetruClientConfig): NeetruClient;
24
+
25
+ export { createNeetruClient };
package/dist/auth.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ import { N as NeetruClientConfig, a as NeetruClient } from './types-PKUaFtBY.js';
2
+
3
+ /**
4
+ * Cria uma instância imutável do cliente Neetru SDK.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { createNeetruClient } from '@neetru/sdk';
9
+ *
10
+ * const client = createNeetruClient({
11
+ * apiKey: 'nrt_a1b2c3d4_xY9z...',
12
+ * });
13
+ *
14
+ * const { products } = await client.catalog.list();
15
+ * const can = await client.entitlements.check('neetru-pulse', 'export-pdf');
16
+ * await client.telemetry.event({ name: 'report_exported' });
17
+ * await client.usage.track('api_call', { route: '/x' });
18
+ * await client.support.createTicket({ subject: 'help', message: '...' });
19
+ * ```
20
+ *
21
+ * @throws {NeetruError} `invalid_config` se fetch não disponível no runtime.
22
+ */
23
+ declare function createNeetruClient(config?: NeetruClientConfig): NeetruClient;
24
+
25
+ export { createNeetruClient };