@neetru/sdk 3.4.3 → 3.4.4

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 (52) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/ai.d.cts +1 -1
  3. package/dist/ai.d.ts +1 -1
  4. package/dist/auth.cjs +17 -7
  5. package/dist/auth.cjs.map +1 -1
  6. package/dist/auth.d.cts +1 -1
  7. package/dist/auth.d.ts +1 -1
  8. package/dist/auth.mjs +17 -7
  9. package/dist/auth.mjs.map +1 -1
  10. package/dist/catalog.d.cts +1 -1
  11. package/dist/catalog.d.ts +1 -1
  12. package/dist/checkout.cjs +17 -7
  13. package/dist/checkout.cjs.map +1 -1
  14. package/dist/checkout.d.cts +1 -1
  15. package/dist/checkout.d.ts +1 -1
  16. package/dist/checkout.mjs +17 -7
  17. package/dist/checkout.mjs.map +1 -1
  18. package/dist/db-react.d.cts +1 -1
  19. package/dist/db-react.d.ts +1 -1
  20. package/dist/db.d.cts +1 -1
  21. package/dist/db.d.ts +1 -1
  22. package/dist/entitlements.d.cts +1 -1
  23. package/dist/entitlements.d.ts +1 -1
  24. package/dist/firestore-compat.d.cts +1 -1
  25. package/dist/firestore-compat.d.ts +1 -1
  26. package/dist/index.cjs +18 -8
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.d.cts +2 -2
  29. package/dist/index.d.ts +2 -2
  30. package/dist/index.mjs +18 -8
  31. package/dist/index.mjs.map +1 -1
  32. package/dist/mocks.d.cts +1 -1
  33. package/dist/mocks.d.ts +1 -1
  34. package/dist/notifications.d.cts +1 -1
  35. package/dist/notifications.d.ts +1 -1
  36. package/dist/react.cjs +62 -3
  37. package/dist/react.cjs.map +1 -1
  38. package/dist/react.d.cts +38 -7
  39. package/dist/react.d.ts +38 -7
  40. package/dist/react.mjs +62 -3
  41. package/dist/react.mjs.map +1 -1
  42. package/dist/support.d.cts +1 -1
  43. package/dist/support.d.ts +1 -1
  44. package/dist/telemetry.d.cts +1 -1
  45. package/dist/telemetry.d.ts +1 -1
  46. package/dist/{types-BlOLDMR0.d.ts → types-Bzxb5rlF.d.ts} +26 -8
  47. package/dist/{types-D-QdG502.d.cts → types-Dw0fqhHm.d.cts} +26 -8
  48. package/dist/usage.d.cts +1 -1
  49. package/dist/usage.d.ts +1 -1
  50. package/dist/webhooks.d.cts +1 -1
  51. package/dist/webhooks.d.ts +1 -1
  52. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/idempotency.ts","../src/http.ts","../src/checkout.ts"],"names":["err","message"],"mappings":"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","file":"checkout.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 /** 3.0: runtime não expõe API necessária (ex: WebCrypto ausente). */\r\n | 'runtime_unsupported'\r\n /**\r\n * 3.1.3 (bug_c1c96a00): o `state` retornado pelo IdP no callback OIDC não bate com o gerado em\r\n * `signIn` (CSRF). Também usado quando não há transação OIDC pendente.\r\n */\r\n | 'oidc_state_mismatch'\r\n /**\r\n * 3.1.12 (incidente pdv-agiliza 2026-07-10): o `nonce` do `id_token` retornado\r\n * pelo `/token` não bate com o gerado em `signIn` (possível replay). O token\r\n * é descartado sem tocar o storage.\r\n */\r\n | 'oidc_nonce_mismatch'\r\n /**\r\n * 3.1.12: o POST `/api/v1/oauth/token` (troca do authorization_code por\r\n * tokens em `completeSignIn`) falhou — HTTP não-2xx, corpo com `error`, ou\r\n * resposta sem `id_token`.\r\n */\r\n | 'token_exchange_failed'\r\n /** HTTP 409 — colisão de idempotência ou conflito de recurso. */\r\n | 'conflict'\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 * Motivo semântico opcional propagado pelo Core no corpo do erro (campo\r\n * `reason` no TOPO do body, fora de `error`). Usado principalmente pelo 503\r\n * de lease de DB, onde `reason` discrimina o estado do ambiente\r\n * (`suspended` | `archived` | `revoked` | `provisioning` | `degraded` |\r\n * `no_route` | `expired`). Camadas superiores (ex.: `db/sql`) mapeiam isso\r\n * para um `NeetruDbErrorCode` mais específico (recuperável vs não).\r\n */\r\n public readonly reason?: 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 reason?: 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 this.reason = reason;\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 * Idempotency-Key helper — gera UUID v4 cripto-seguro para identificar\r\n * mutations não-idempotentes (`usage.report`, `support.createTicket`,\r\n * `notifications.send`, `webhooks.test`).\r\n *\r\n * Estratégia 3.0:\r\n * - SDK gera UUID v4 por chamada via `randomUUID()` (WebCrypto.subtle não\r\n * necessário aqui — `crypto.randomUUID()` está em Node 14.17+ e em todos\r\n * os browsers/Edge runtimes modernos).\r\n * - Header `Idempotency-Key: <uuid>` é injetado pelo `httpRequest` quando\r\n * `opts.idempotencyKey === true` OU caller passa explicit `opts.idempotencyKeyValue`.\r\n * - Core dedup em coleção `usage_idempotency_keys/{key}` TTL 24h (vide\r\n * `docs/CORE_CHANGES_REQUIRED.md` §2). Se Core ainda não dedupa, o header\r\n * é benign (ignorado).\r\n *\r\n * Defesa em camadas: combinado com `retries: 0` em POSTs (vide http.ts), o\r\n * risco de double-write em transientes vai pra zero.\r\n */\r\nimport { NeetruError } from './errors';\r\n\r\n/**\r\n * Gera UUID v4 criptograficamente seguro. Universal: Node 14.17+, browsers\r\n * modernos, Edge runtimes (Workers/Vercel Edge/Cloudflare).\r\n *\r\n * Fallback puro-JS removido em 3.0 — `crypto.randomUUID()` é ubíquo desde\r\n * 2022. Se runtime não tem, lança `NeetruError('runtime_unsupported')`\r\n * (consumer deve polyfillar).\r\n *\r\n * **L-01 fix (Opus review 2026-05-27):** antes lançava `Error` cru, que\r\n * não era pego por `catch (err) { if (err instanceof NeetruError) ... }`\r\n * dos consumers. Agora throw canonical.\r\n *\r\n * @throws NeetruError('runtime_unsupported') se `crypto.randomUUID` não disponível.\r\n */\r\nexport function generateIdempotencyKey(): string {\r\n // WebCrypto (browser/Edge) e Node 14.17+ expõem `crypto.randomUUID()`.\r\n // Node anterior precisa de `node:crypto` mas SDK 3.0 exige Node ≥20 (vide engines).\r\n const cryptoObj: { randomUUID?: () => string } | undefined =\r\n typeof globalThis !== 'undefined' && 'crypto' in globalThis\r\n ? (globalThis as { crypto?: { randomUUID?: () => string } }).crypto\r\n : undefined;\r\n if (cryptoObj && typeof cryptoObj.randomUUID === 'function') {\r\n return cryptoObj.randomUUID();\r\n }\r\n throw new NeetruError(\r\n 'runtime_unsupported',\r\n 'crypto.randomUUID not available in this runtime. SDK 3.0 requires Node ≥20 or modern browser/Edge.',\r\n );\r\n}\r\n\r\n/** Regex UUID v4 — validação para uso interno. */\r\nexport const UUID_V4_RE =\r\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\r\n","/**\r\n * HTTP transport interno do SDK.\r\n *\r\n * Responsabilidades:\r\n * - Construir URL absoluta a partir de `baseUrl` + path\r\n * - Injetar Bearer token quando `requireAuth=true`\r\n * - Mapear status HTTP → `NeetruError` com `code` estável\r\n * - Parse defensivo de JSON (não lança em body vazio em 204)\r\n * - Retry/backoff exponencial em `rate_limited` (429), `server_error` (5xx)\r\n * e `network_error` (timeout/falha de rede). Honra `Retry-After` quando\r\n * presente.\r\n * - **Captura `X-Neetru-Version`** das respostas e emite `console.warn` quando\r\n * o Core está abaixo da versão mínima para a major do SDK.\r\n *\r\n * Política de retries (mudança breaking 3.0):\r\n * - GET/HEAD: default 2 retries (3 tentativas total) — idempotente, seguro.\r\n * - POST/PUT/PATCH/DELETE: default **0 retries** — mutations podem duplicar\r\n * side effects (ex: `usage.report` incrementa contador). Caller pode\r\n * reativar passando `retries: N` explicitamente ou usar `Idempotency-Key`\r\n * header (gerado automaticamente se `opts.idempotencyKey=true`).\r\n *\r\n * Idempotency-Key (3.0):\r\n * - `opts.idempotencyKey === true` → SDK gera UUID v4 e injeta header.\r\n * - `opts.idempotencyKey === 'uuid-string'` → usa o valor passado.\r\n * - Caller mantém retentos client-side se quiser; Core dedup serverside\r\n * (vide `docs/CORE_CHANGES_REQUIRED.md` §2).\r\n */\r\nimport { NeetruError, type NeetruErrorCode } from './errors';\r\nimport { generateIdempotencyKey } from './idempotency';\r\nimport type { ResolvedConfig } from './types';\r\n\r\n// ─── Compat Matrix SDK↔Core ──────────────────────────────────────────────────\r\n\r\n/**\r\n * Matriz de compatibilidade SDK major → versão mínima do Core.\r\n *\r\n * Formato do Core: CalVer `YYYY.MM.patch+revision` (ex: `2026.05.1+neetru-core-00096-79t`).\r\n * A comparação é feita apenas nas partes `YYYY.MM.patch` (prefixo antes de `+`).\r\n *\r\n * Quando o Core reporta `X-Neetru-Version` abaixo do mínimo para a SDK major\r\n * corrente, o SDK emite `console.warn` uma única vez por sessão de processo.\r\n *\r\n * Atualize esta tabela a cada major de SDK.\r\n */\r\nconst COMPAT_MATRIX: Record<number, string> = {\r\n // SDK major 3.x requer Core ≥ 2026.05.1 (suporte a X-Neetru-Version header,\r\n // runTransaction write-after-read, verifyWebhookRequest, webhooks 3.0+)\r\n 3: '2026.05.1',\r\n};\r\n\r\n/** CalVer sem sufixo `+revision`. Ex: `2026.05.1+abc` → `2026.05.1`. */\r\nfunction stripRevision(v: string): string {\r\n return v.split('+')[0] ?? v;\r\n}\r\n\r\n/**\r\n * Compara dois CalVer (`YYYY.MM.patch`). Retorna negativo se `a < b`,\r\n * positivo se `a > b`, 0 se iguais. Partes não numéricas tratadas como 0.\r\n */\r\nfunction compareCalVer(a: string, b: string): number {\r\n const partsA = stripRevision(a).split('.').map(Number);\r\n const partsB = stripRevision(b).split('.').map(Number);\r\n const len = Math.max(partsA.length, partsB.length);\r\n for (let i = 0; i < len; i++) {\r\n const pa = partsA[i] ?? 0;\r\n const pb = partsB[i] ?? 0;\r\n if (pa !== pb) return pa - pb;\r\n }\r\n return 0;\r\n}\r\n\r\n/** Lê a SDK major a partir da string `VERSION` exportada de `./index`. Fallback 3. */\r\nfunction getSdkMajor(): number {\r\n try {\r\n // Importação estática não disponível aqui (evita ciclo). Usa variável injetada\r\n // em tempo de build pela tsup via `define`. Fallback para 3 (current major).\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const ver = (globalThis as any).__NEETRU_SDK_VERSION__ as string | undefined;\r\n if (ver) return parseInt(ver.split('.')[0] ?? '3', 10);\r\n } catch {\r\n // ignore\r\n }\r\n return 3;\r\n}\r\n\r\n/** Aviso emitido no máximo uma vez por major detectada pra não spammar logs. */\r\nconst _warnedCoreTooOld = new Set<string>();\r\n\r\n/**\r\n * Verifica se a versão do Core (`X-Neetru-Version`) é compatível com a SDK major.\r\n * Emite `console.warn` quando incompatível (uma vez por processo por versão detectada).\r\n */\r\nexport function checkCoreVersionCompat(coreVersion: string): void {\r\n if (!coreVersion) return;\r\n const sdkMajor = getSdkMajor();\r\n const minCore = COMPAT_MATRIX[sdkMajor];\r\n if (!minCore) return; // sem restrição para esta major\r\n const stripped = stripRevision(coreVersion);\r\n if (compareCalVer(stripped, minCore) < 0) {\r\n const key = `${sdkMajor}:${stripped}`;\r\n if (!_warnedCoreTooOld.has(key)) {\r\n _warnedCoreTooOld.add(key);\r\n console.warn(\r\n `[Neetru SDK] Atenção: Core versão \"${coreVersion}\" é anterior ao mínimo recomendado` +\r\n ` \"${minCore}\" para SDK major ${sdkMajor}. Alguns recursos podem não funcionar` +\r\n ` corretamente. Atualize o Core para a versão mais recente.`,\r\n );\r\n }\r\n }\r\n}\r\n\r\n/** Opções da request HTTP. */\r\nexport interface HttpRequestOptions {\r\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\r\n /** Path relativo (ex: `/api/v1/cli/catalog`). Concatenado a `baseUrl`. */\r\n path: string;\r\n /** Query string params (chave → valor primitivo). Valores `undefined` ignorados. */\r\n query?: Record<string, string | number | boolean | undefined>;\r\n /** Body JSON-serializável. Ignorado em GET/DELETE. */\r\n body?: unknown;\r\n /**\r\n * Se true, injeta `Authorization: Bearer <apiKey>`. Lança `missing_api_key`\r\n * se config.apiKey ausente. Default false.\r\n */\r\n requireAuth?: boolean;\r\n /** Cabeçalhos extras. */\r\n headers?: Record<string, string>;\r\n /**\r\n * Número de retries em códigos transientes (`rate_limited`, `server_error`,\r\n * `network_error`).\r\n *\r\n * Default (3.0):\r\n * - GET/HEAD: 2 (= 3 tentativas total) — idempotente, seguro.\r\n * - POST/PUT/PATCH/DELETE: 0 — mutations podem duplicar side effects.\r\n *\r\n * Caller pode reativar passando explicitamente: `retries: 2`.\r\n */\r\n retries?: number;\r\n /**\r\n * Injeta `Idempotency-Key` header pra dedup serverside (3.0):\r\n * - `true` → SDK gera UUID v4 cripto-seguro automaticamente.\r\n * - string → usa o valor passado (deve ser UUID v4).\r\n * - `undefined`/`false` → sem header.\r\n */\r\n idempotencyKey?: boolean | string;\r\n}\r\n\r\nconst DEFAULT_RETRIES_READ = 2;\r\nconst DEFAULT_RETRIES_WRITE = 0;\r\nconst READ_METHODS = new Set(['GET', 'HEAD']);\r\nconst RETRYABLE_CODES = new Set<NeetruErrorCode>([\r\n 'rate_limited',\r\n 'server_error',\r\n 'network_error',\r\n]);\r\n\r\n/** Backoff exponencial com jitter ±20%. attempt: 0=primeira, 1=primeiro retry, ... */\r\nfunction backoffMs(attempt: number): number {\r\n const base = 200 * Math.pow(4, attempt); // 200ms, 800ms, 3.2s, ...\r\n const jitter = base * 0.2 * (Math.random() * 2 - 1);\r\n return Math.max(50, Math.round(base + jitter));\r\n}\r\n\r\n/**\r\n * Honra `Retry-After` header (segundos ou HTTP-date). Retorna ms ou null se\r\n * inválido. RFC 9110 §10.2.3.\r\n *\r\n * Bug fix: sem teto, um servidor hostil/mal-configurado poderia retornar\r\n * `Retry-After: 86400` (24h) ou uma HTTP-date anos no futuro, pendurando o\r\n * processo indefinidamente. Aplica teto de MAX_RETRY_AFTER_MS em ambos os caminhos.\r\n */\r\nconst MAX_RETRY_AFTER_MS = 60_000; // 60s — teto razoável para retry automático\r\n\r\nfunction parseRetryAfter(value: string | null): number | null {\r\n if (!value) return null;\r\n const secs = Number(value);\r\n if (Number.isFinite(secs) && secs >= 0) return Math.min(Math.round(secs * 1000), MAX_RETRY_AFTER_MS);\r\n const dateMs = Date.parse(value);\r\n if (Number.isFinite(dateMs)) {\r\n const delta = dateMs - Date.now();\r\n if (delta > 0) return Math.min(delta, MAX_RETRY_AFTER_MS);\r\n }\r\n return null;\r\n}\r\n\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\n/** Mapeamento status → code estável do NeetruError. */\r\nfunction statusToCode(status: number): NeetruErrorCode {\r\n if (status === 401) return 'unauthorized';\r\n if (status === 403) return 'forbidden';\r\n if (status === 404) return 'not_found';\r\n if (status === 409) return 'conflict'; // Bug fix: 409 vira 'conflict' (não 'unknown')\r\n if (status === 422 || status === 400) return 'validation_failed';\r\n if (status === 429) return 'rate_limited';\r\n if (status >= 500) return 'server_error';\r\n return 'unknown';\r\n}\r\n\r\nfunction buildUrl(baseUrl: string, path: string, query?: HttpRequestOptions['query']): string {\r\n // Trim trailing slash em base e leading em path pra evitar `//`.\r\n const base = baseUrl.replace(/\\/+$/, '');\r\n const p = path.startsWith('/') ? path : `/${path}`;\r\n const url = new URL(`${base}${p}`);\r\n if (query) {\r\n for (const [k, v] of Object.entries(query)) {\r\n if (v === undefined) continue;\r\n url.searchParams.set(k, String(v));\r\n }\r\n }\r\n return url.toString();\r\n}\r\n\r\n/** Parse JSON defensivo — retorna `undefined` em body vazio. */\r\nasync function safeJson(res: Response): Promise<unknown> {\r\n const text = await res.text();\r\n if (!text) return undefined;\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Executa request HTTP. Em sucesso retorna body parseado; em erro lança\r\n * `NeetruError` com `code` derivado do status. Aplica retry/backoff\r\n * automático em códigos transientes (rate_limited/server_error/network_error)\r\n * conforme `opts.retries` (default 2 = 3 tentativas).\r\n */\r\nexport async function httpRequest<T>(\r\n config: ResolvedConfig,\r\n opts: HttpRequestOptions,\r\n): Promise<T> {\r\n const method = opts.method ?? 'GET';\r\n const url = buildUrl(config.baseUrl, opts.path, opts.query);\r\n // Default por método: reads tentam 2x, writes 0x. Caller override sempre vence.\r\n const defaultRetries = READ_METHODS.has(method)\r\n ? DEFAULT_RETRIES_READ\r\n : DEFAULT_RETRIES_WRITE;\r\n const maxRetries = opts.retries ?? defaultRetries;\r\n\r\n const headers: Record<string, string> = {\r\n accept: 'application/json',\r\n ...opts.headers,\r\n };\r\n\r\n if (opts.requireAuth) {\r\n if (!config.apiKey) {\r\n throw new NeetruError(\r\n 'missing_api_key',\r\n 'This operation requires an apiKey. Pass it to createNeetruClient({ apiKey }) or set NEETRU_API_KEY env var.',\r\n );\r\n }\r\n headers.authorization = `Bearer ${config.apiKey}`;\r\n }\r\n\r\n // Idempotency-Key: gerado por chamada se solicitado. UUID v4 cripto-seguro.\r\n if (opts.idempotencyKey) {\r\n const key =\r\n typeof opts.idempotencyKey === 'string'\r\n ? opts.idempotencyKey\r\n : generateIdempotencyKey();\r\n headers['idempotency-key'] = key;\r\n }\r\n\r\n // Body só é serializado uma vez — reusado entre tentativas.\r\n const bodyString =\r\n opts.body !== undefined && method !== 'GET' && method !== 'DELETE'\r\n ? JSON.stringify(opts.body)\r\n : undefined;\r\n if (bodyString !== undefined) {\r\n headers['content-type'] = 'application/json';\r\n }\r\n\r\n let lastError: NeetruError | null = null;\r\n\r\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\r\n const init: RequestInit = { method, headers };\r\n if (bodyString !== undefined) init.body = bodyString;\r\n // BUG-020 fix (2026-05-13): timeout default 30s. AbortSignal.timeout\r\n // requer Node 18+ ou browsers recentes.\r\n init.signal = AbortSignal.timeout(30_000);\r\n\r\n let res: Response;\r\n try {\r\n res = await config.fetch(url, init);\r\n } catch (err) {\r\n const message =\r\n err instanceof DOMException && err.name === 'TimeoutError'\r\n ? 'Network error: timeout after 30s'\r\n : `Network error: ${err instanceof Error ? err.message : 'fetch failed'}`;\r\n lastError = new NeetruError('network_error', message);\r\n if (attempt < maxRetries) {\r\n await sleep(backoffMs(attempt));\r\n continue;\r\n }\r\n throw lastError;\r\n }\r\n\r\n const requestId =\r\n res.headers.get('x-request-id') ?? res.headers.get('x-correlation-id') ?? undefined;\r\n\r\n if (res.ok) {\r\n // Captura X-Neetru-Version e verifica compat com a SDK major.\r\n const coreVersion = res.headers.get('x-neetru-version');\r\n if (coreVersion) checkCoreVersionCompat(coreVersion);\r\n const parsed = await safeJson(res);\r\n return parsed as T;\r\n }\r\n\r\n // O contrato clássico de erro do Core é `{ error: { code, message } }`.\r\n // O 503 de lease de DB (e alguns endpoints novos) coloca `code`/`reason`/\r\n // `message` no TOPO do corpo, SEM envelope `error`. Lemos ambos: preferimos\r\n // `body.error` quando presente; caímos nos campos do topo caso contrário.\r\n // `reason` é sempre considerado no topo (o 503 de lease o coloca lá mesmo\r\n // quando há `error`), pra que a camada de DB discrimine suspended/archived/\r\n // revoked de provisioning/degraded.\r\n const body = (await safeJson(res)) as\r\n | {\r\n error?: { code?: string; message?: string; reason?: string } | string;\r\n code?: string;\r\n reason?: string;\r\n message?: string;\r\n }\r\n | undefined;\r\n let code: string = statusToCode(res.status);\r\n let message = `HTTP ${res.status}`;\r\n let reason: string | undefined;\r\n if (body && typeof body === 'object') {\r\n const errField = body.error;\r\n if (typeof errField === 'string') {\r\n message = errField;\r\n } else if (errField && typeof errField === 'object') {\r\n if (typeof errField.code === 'string') code = errField.code;\r\n if (typeof errField.message === 'string') message = errField.message;\r\n if (typeof errField.reason === 'string') reason = errField.reason;\r\n } else {\r\n // Sem envelope `error` — lê os campos no TOPO do corpo (contrato do 503\r\n // de lease: `{ code, reason }` no topo).\r\n if (typeof body.code === 'string') code = body.code;\r\n if (typeof body.message === 'string') message = body.message;\r\n }\r\n // `reason` no topo tem prioridade final (o 503 de lease o coloca no topo\r\n // mesmo quando também há `error`).\r\n if (typeof body.reason === 'string') reason = body.reason;\r\n }\r\n const err = new NeetruError(code, message, res.status, requestId, reason);\r\n lastError = err;\r\n\r\n const isRetryable = RETRYABLE_CODES.has(code as NeetruErrorCode);\r\n if (isRetryable && attempt < maxRetries) {\r\n const retryAfter = parseRetryAfter(res.headers.get('retry-after'));\r\n const delay = retryAfter ?? backoffMs(attempt);\r\n await sleep(delay);\r\n continue;\r\n }\r\n throw err;\r\n }\r\n\r\n // Unreachable — loop sempre retorna ou lança. Safety net.\r\n throw lastError ?? new NeetruError('unknown', 'unexpected httpRequest exit');\r\n}\r\n","/**\r\n * Checkout namespace (v1.1) — `client.checkout.*`\r\n *\r\n * Fluxo canônico (vide `docs/FLUXO_SIGNUP_BILLING_CHECKOUT.md` §6):\r\n * 1. SaaS produto chama `client.checkout.start({productId, planId, callbackUrl})`.\r\n * 2. SDK posta em `POST /api/v1/checkout/intents` (Bearer access_token OIDC).\r\n * 3. Core cria `checkout_intents/{intentId}` (TTL 15min) + retorna `redirectUrl`.\r\n * 4. Em browser, SDK redireciona automaticamente pra `redirectUrl`. Em\r\n * Node/SSR, retorna o objeto `{intentId, redirectUrl}` sem redirect.\r\n * 5. Portal (`minhaconta.neetru.com/portal/kyc/{intentId}`) coleta KYC + cartão.\r\n * 6. Usuário volta pra `callbackUrl?status=success&intentId=...` quando completo.\r\n *\r\n * **Dev mode** (`NEETRU_ENV=dev`): `start()` retorna URL fake sem network call.\r\n * Útil pra dev externo SaaS testar UI sem provisionar conta Neetru.\r\n *\r\n * **Estabilidade**: minor bump v1.0 → v1.1 (feature add, sem breaking).\r\n */\r\nimport { NeetruError } from './errors';\r\nimport { httpRequest } from './http';\r\nimport type { ResolvedConfig } from './types';\r\n\r\n// ─── Types públicos ─────────────────────────────────────────────────────────\r\n\r\n/** Tipo do tenant alvo da subscription (PF=uid, PJ=orgId). */\r\nexport type CheckoutTenantType = 'pf' | 'pj';\r\n\r\n/** Status do `checkout_intents/{intentId}` no Core. */\r\nexport type CheckoutIntentStatus =\r\n | 'pending'\r\n | 'kyc_in_progress'\r\n | 'stripe_redirected'\r\n | 'completed'\r\n | 'expired'\r\n | 'cancelled';\r\n\r\nexport interface CheckoutStartInput {\r\n /** Slug do produto no catálogo (ex: `neetru-pulse`). */\r\n productId: string;\r\n /** Slug do plano no catálogo do produto (ex: `pro_monthly`). */\r\n planId: string;\r\n /** Pra onde o produto SaaS quer voltar pós-checkout. https obrigatório (ou http://localhost em dev). */\r\n callbackUrl: string;\r\n /** Override pra checkout em nome de uma org. Default: PF do uid logado. */\r\n tenantType?: CheckoutTenantType;\r\n /** Quando `tenantType='pj'`, id da org. Ignorado quando PF. */\r\n tenantId?: string;\r\n /**\r\n * Em browsers, default `true` — SDK faz `window.location.href = redirectUrl`.\r\n * Passe `false` se quiser controlar o redirect manualmente.\r\n */\r\n autoRedirect?: boolean;\r\n /**\r\n * **C2 (auditoria 2026-06-10):** access_token OIDC do **usuário final** que\r\n * está assinando. OBRIGATÓRIO no modo HTTP real — o endpoint de checkout do\r\n * Core (`/api/v1/checkout/intents`) autentica a identidade do cliente (Bearer\r\n * access_token OIDC ou cookie de sessão), NÃO a chave de API do SDK (`nrt_*`).\r\n * Enviar a chave `nrt_*` resultava em 401 sempre. O SDK é BFF-pattern: o app\r\n * consumidor gerencia o ciclo OIDC e passa o access_token aqui.\r\n */\r\n accessToken?: string;\r\n}\r\n\r\n/** Auth por chamada do checkout — access_token OIDC do usuário final. */\r\nexport interface CheckoutAuthOpts {\r\n /** access_token OIDC do usuário final (vide CheckoutStartInput.accessToken). */\r\n accessToken?: string;\r\n}\r\n\r\nexport interface CheckoutStartResult {\r\n intentId: string;\r\n redirectUrl: string;\r\n status: CheckoutIntentStatus;\r\n expiresAt: string;\r\n /** True se KYC ainda precisa ser coletado no portal. UI pode mostrar hint. */\r\n requiresKyc: boolean;\r\n}\r\n\r\nexport interface CheckoutIntentInfo {\r\n intentId: string;\r\n uid: string;\r\n targetTenantId: string;\r\n targetTenantType: CheckoutTenantType;\r\n productId: string;\r\n planId: string;\r\n callbackUrl: string;\r\n status: CheckoutIntentStatus;\r\n /** Stripe Checkout Session id quando avançou pra `stripe_redirected`. */\r\n stripeSessionId?: string | null;\r\n expiresAt: string;\r\n /** True se já passou `expiresAt` mas Core ainda não marcou expired. */\r\n isStale?: boolean;\r\n}\r\n\r\nexport interface CheckoutNamespace {\r\n /**\r\n * Inicia checkout. Em browser, redireciona automaticamente pro portal.\r\n * Em Node/SSR, retorna o resultado sem efeitos colaterais — caller decide\r\n * o que fazer com `redirectUrl`.\r\n *\r\n * Dev mode (`NEETRU_ENV=dev`): retorna URL fake `https://localhost:9003/portal/checkout/mock-XXXX`.\r\n */\r\n start(input: CheckoutStartInput): Promise<CheckoutStartResult>;\r\n /** Lê estado atual do intent (Core). Requer `opts.accessToken` no HTTP real. */\r\n get(intentId: string, opts?: CheckoutAuthOpts): Promise<CheckoutIntentInfo>;\r\n /** Cancela um intent que ainda não virou `stripe_redirected`. Requer `opts.accessToken` no HTTP real. */\r\n cancel(intentId: string, opts?: CheckoutAuthOpts): Promise<{ ok: true; alreadyCancelled: boolean }>;\r\n}\r\n\r\n/**\r\n * C2: monta a auth do checkout a partir do access_token OIDC do usuário final.\r\n * Fail-closed: sem token, lança erro claro em vez de mandar a chave `nrt_*`\r\n * (que o endpoint rejeita com 401). Retorna requireAuth:false + header Bearer\r\n * manual — httpRequest preserva `headers.authorization` quando requireAuth=false.\r\n */\r\nfunction checkoutAuth(\r\n accessToken: string | undefined,\r\n method: string,\r\n): { requireAuth: false; headers: Record<string, string> } {\r\n if (!accessToken || typeof accessToken !== 'string') {\r\n throw new NeetruError(\r\n 'validation_failed',\r\n `checkout.${method} requer o access_token OIDC do usuário final (passe \\`accessToken\\`). ` +\r\n `A chave de API do SDK (nrt_*) NÃO é aceita pelo endpoint de checkout — ele autentica a ` +\r\n `identidade do cliente que está assinando (Bearer access_token OIDC ou cookie de sessão).`,\r\n );\r\n }\r\n return { requireAuth: false, headers: { authorization: `Bearer ${accessToken}` } };\r\n}\r\n\r\n// ─── Implementação real (HTTP) ─────────────────────────────────────────────\r\n\r\ninterface RawStartCheckoutResponse {\r\n ok?: boolean;\r\n intentId?: string;\r\n redirectUrl?: string;\r\n status?: string;\r\n expiresAt?: string;\r\n requiresKyc?: boolean;\r\n}\r\n\r\ninterface RawGetCheckoutResponse {\r\n ok?: boolean;\r\n intent?: {\r\n intentId?: string;\r\n uid?: string;\r\n targetTenantId?: string;\r\n targetTenantType?: string;\r\n productId?: string;\r\n planId?: string;\r\n callbackUrl?: string;\r\n status?: string;\r\n stripeSessionId?: string | null;\r\n expiresAt?: string;\r\n };\r\n isStale?: boolean;\r\n}\r\n\r\nfunction parseStartResponse(raw: unknown): CheckoutStartResult {\r\n if (!raw || typeof raw !== 'object') {\r\n throw new NeetruError('invalid_response', 'checkout.start response is not an object');\r\n }\r\n const r = raw as RawStartCheckoutResponse;\r\n if (typeof r.intentId !== 'string' || !r.intentId) {\r\n throw new NeetruError('invalid_response', 'checkout.start response missing intentId');\r\n }\r\n if (typeof r.redirectUrl !== 'string' || !r.redirectUrl) {\r\n throw new NeetruError('invalid_response', 'checkout.start response missing redirectUrl');\r\n }\r\n return {\r\n intentId: r.intentId,\r\n redirectUrl: r.redirectUrl,\r\n status: (r.status as CheckoutIntentStatus | undefined) ?? 'pending',\r\n expiresAt: typeof r.expiresAt === 'string' ? r.expiresAt : new Date().toISOString(),\r\n requiresKyc: r.requiresKyc === true,\r\n };\r\n}\r\n\r\nfunction parseGetResponse(raw: unknown): CheckoutIntentInfo {\r\n if (!raw || typeof raw !== 'object') {\r\n throw new NeetruError('invalid_response', 'checkout.get response is not an object');\r\n }\r\n const r = raw as RawGetCheckoutResponse;\r\n const intent = r.intent;\r\n if (!intent || typeof intent !== 'object') {\r\n throw new NeetruError('invalid_response', 'checkout.get response missing intent');\r\n }\r\n if (typeof intent.intentId !== 'string') {\r\n throw new NeetruError('invalid_response', 'checkout.get response missing intentId');\r\n }\r\n return {\r\n intentId: intent.intentId,\r\n uid: intent.uid ?? '',\r\n targetTenantId: intent.targetTenantId ?? '',\r\n targetTenantType: (intent.targetTenantType as CheckoutTenantType | undefined) ?? 'pf',\r\n productId: intent.productId ?? '',\r\n planId: intent.planId ?? '',\r\n callbackUrl: intent.callbackUrl ?? '',\r\n status: (intent.status as CheckoutIntentStatus | undefined) ?? 'pending',\r\n stripeSessionId: intent.stripeSessionId ?? null,\r\n expiresAt: intent.expiresAt ?? new Date().toISOString(),\r\n isStale: r.isStale === true,\r\n };\r\n}\r\n\r\n/**\r\n * Detecta se estamos em browser context. Em SSR / Node / Edge, `window`\r\n * pode não existir — fazemos check defensivo.\r\n */\r\nfunction inBrowser(): boolean {\r\n try {\r\n return (\r\n typeof globalThis !== 'undefined' &&\r\n typeof (globalThis as { window?: { location?: { href?: string } } }).window !== 'undefined' &&\r\n typeof globalThis.location !== 'undefined' &&\r\n typeof globalThis.location.assign === 'function'\r\n );\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction performRedirect(url: string): void {\r\n try {\r\n globalThis.location.assign(url);\r\n } catch {\r\n /* noop em runtimes sem location.assign — caller decide */\r\n }\r\n}\r\n\r\n/**\r\n * Implementação HTTP real. Posta no Core, parse response, redireciona se browser.\r\n */\r\nfunction createHttpCheckoutNamespace(config: ResolvedConfig): CheckoutNamespace {\r\n return {\r\n async start(input: CheckoutStartInput): Promise<CheckoutStartResult> {\r\n if (!input?.productId) {\r\n throw new NeetruError('validation_failed', 'checkout.start: productId is required');\r\n }\r\n if (!input?.planId) {\r\n throw new NeetruError('validation_failed', 'checkout.start: planId is required');\r\n }\r\n if (!input?.callbackUrl) {\r\n throw new NeetruError('validation_failed', 'checkout.start: callbackUrl is required');\r\n }\r\n\r\n const body: Record<string, unknown> = {\r\n productId: input.productId,\r\n planId: input.planId,\r\n callbackUrl: input.callbackUrl,\r\n };\r\n if (input.tenantType) body.targetTenantType = input.tenantType;\r\n if (input.tenantId) body.targetTenantId = input.tenantId;\r\n\r\n // bug: sem idempotencyKey → retry criava intents duplicados (fix: alinhar com usage.report/support.createTicket)\r\n const { requireAuth, headers } = checkoutAuth(input.accessToken, 'start');\r\n const raw = await httpRequest<RawStartCheckoutResponse>(config, {\r\n method: 'POST',\r\n path: '/api/v1/checkout/intents',\r\n body,\r\n requireAuth,\r\n headers,\r\n idempotencyKey: true,\r\n });\r\n const result = parseStartResponse(raw);\r\n\r\n const shouldRedirect = input.autoRedirect !== false;\r\n if (shouldRedirect && inBrowser()) {\r\n performRedirect(result.redirectUrl);\r\n }\r\n return result;\r\n },\r\n\r\n async get(intentId: string, opts?: CheckoutAuthOpts): Promise<CheckoutIntentInfo> {\r\n if (!intentId || typeof intentId !== 'string') {\r\n throw new NeetruError('validation_failed', 'checkout.get: intentId is required');\r\n }\r\n const { requireAuth, headers } = checkoutAuth(opts?.accessToken, 'get');\r\n const raw = await httpRequest<RawGetCheckoutResponse>(config, {\r\n method: 'GET',\r\n path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,\r\n requireAuth,\r\n headers,\r\n });\r\n return parseGetResponse(raw);\r\n },\r\n\r\n async cancel(intentId: string, opts?: CheckoutAuthOpts): Promise<{ ok: true; alreadyCancelled: boolean }> {\r\n if (!intentId || typeof intentId !== 'string') {\r\n throw new NeetruError('validation_failed', 'checkout.cancel: intentId is required');\r\n }\r\n const { requireAuth, headers } = checkoutAuth(opts?.accessToken, 'cancel');\r\n const raw = await httpRequest<{ ok?: boolean; alreadyCancelled?: boolean }>(config, {\r\n method: 'DELETE',\r\n path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,\r\n requireAuth,\r\n headers,\r\n });\r\n return {\r\n ok: true,\r\n alreadyCancelled: (raw as { alreadyCancelled?: boolean })?.alreadyCancelled === true,\r\n };\r\n },\r\n };\r\n}\r\n\r\n// ─── Mock dev (sem network) ─────────────────────────────────────────────────\r\n\r\n/**\r\n * Mock dev — retorna URL fake `https://localhost:9003/portal/checkout/mock-XXXX`\r\n * sem tocar no Core. Útil pra dev externo SaaS testar UI/redirect sem precisar\r\n * de Bearer token Neetru.\r\n *\r\n * Dev mode persiste intents em mapa in-memory pro `get`/`cancel` retornarem\r\n * resultado consistente.\r\n */\r\nexport class MockCheckout implements CheckoutNamespace {\r\n private readonly intents = new Map<string, CheckoutIntentInfo>();\r\n\r\n async start(input: CheckoutStartInput): Promise<CheckoutStartResult> {\r\n if (!input?.productId) {\r\n throw new NeetruError('validation_failed', 'checkout.start: productId is required');\r\n }\r\n if (!input?.planId) {\r\n throw new NeetruError('validation_failed', 'checkout.start: planId is required');\r\n }\r\n if (!input?.callbackUrl) {\r\n throw new NeetruError('validation_failed', 'checkout.start: callbackUrl is required');\r\n }\r\n\r\n const intentId = `chk_mock_${Math.random().toString(36).slice(2, 10)}`;\r\n const expiresAt = new Date(Date.now() + 15 * 60 * 1000).toISOString();\r\n const redirectUrl = `https://localhost:9003/portal/checkout/${intentId}`;\r\n\r\n this.intents.set(intentId, {\r\n intentId,\r\n uid: 'dev-fixture-uid',\r\n targetTenantId: input.tenantId ?? 'dev-fixture-uid',\r\n targetTenantType: input.tenantType ?? 'pf',\r\n productId: input.productId,\r\n planId: input.planId,\r\n callbackUrl: input.callbackUrl,\r\n status: 'pending',\r\n stripeSessionId: null,\r\n expiresAt,\r\n });\r\n\r\n return {\r\n intentId,\r\n redirectUrl,\r\n status: 'pending',\r\n expiresAt,\r\n requiresKyc: false,\r\n };\r\n }\r\n\r\n async get(intentId: string, _opts?: CheckoutAuthOpts): Promise<CheckoutIntentInfo> {\r\n const found = this.intents.get(intentId);\r\n if (!found) {\r\n throw new NeetruError('not_found', `Mock intent ${intentId} not found`);\r\n }\r\n return { ...found };\r\n }\r\n\r\n async cancel(intentId: string, _opts?: CheckoutAuthOpts): Promise<{ ok: true; alreadyCancelled: boolean }> {\r\n const found = this.intents.get(intentId);\r\n if (!found) {\r\n throw new NeetruError('not_found', `Mock intent ${intentId} not found`);\r\n }\r\n const alreadyCancelled = found.status === 'cancelled';\r\n this.intents.set(intentId, { ...found, status: 'cancelled' });\r\n return { ok: true, alreadyCancelled };\r\n }\r\n}\r\n\r\n// ─── Factory ────────────────────────────────────────────────────────────────\r\n\r\nexport function createCheckoutNamespace(config: ResolvedConfig): CheckoutNamespace {\r\n if (config.env === 'dev') return new MockCheckout();\r\n return createHttpCheckoutNamespace(config);\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/idempotency.ts","../src/http.ts","../src/checkout.ts"],"names":["err","message"],"mappings":"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","file":"checkout.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 /** 3.0: runtime não expõe API necessária (ex: WebCrypto ausente). */\r\n | 'runtime_unsupported'\r\n /**\r\n * 3.1.3 (bug_c1c96a00): o `state` retornado pelo IdP no callback OIDC não bate com o gerado em\r\n * `signIn` (CSRF). Também usado quando não há transação OIDC pendente.\r\n */\r\n | 'oidc_state_mismatch'\r\n /**\r\n * 3.1.12 (incidente pdv-agiliza 2026-07-10): o `nonce` do `id_token` retornado\r\n * pelo `/token` não bate com o gerado em `signIn` (possível replay). O token\r\n * é descartado sem tocar o storage.\r\n */\r\n | 'oidc_nonce_mismatch'\r\n /**\r\n * 3.1.12: o POST `/api/v1/oauth/token` (troca do authorization_code por\r\n * tokens em `completeSignIn`) falhou — HTTP não-2xx, corpo com `error`, ou\r\n * resposta sem `id_token`.\r\n */\r\n | 'token_exchange_failed'\r\n /** HTTP 409 — colisão de idempotência ou conflito de recurso. */\r\n | 'conflict'\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 * Motivo semântico opcional propagado pelo Core no corpo do erro (campo\r\n * `reason` no TOPO do body, fora de `error`). Usado principalmente pelo 503\r\n * de lease de DB, onde `reason` discrimina o estado do ambiente\r\n * (`suspended` | `archived` | `revoked` | `provisioning` | `degraded` |\r\n * `no_route` | `expired`). Camadas superiores (ex.: `db/sql`) mapeiam isso\r\n * para um `NeetruDbErrorCode` mais específico (recuperável vs não).\r\n */\r\n public readonly reason?: 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 reason?: 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 this.reason = reason;\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 * Idempotency-Key helper — gera UUID v4 cripto-seguro para identificar\r\n * mutations não-idempotentes (`usage.report`, `support.createTicket`,\r\n * `notifications.send`, `webhooks.test`).\r\n *\r\n * Estratégia 3.0:\r\n * - SDK gera UUID v4 por chamada via `randomUUID()` (WebCrypto.subtle não\r\n * necessário aqui — `crypto.randomUUID()` está em Node 14.17+ e em todos\r\n * os browsers/Edge runtimes modernos).\r\n * - Header `Idempotency-Key: <uuid>` é injetado pelo `httpRequest` quando\r\n * `opts.idempotencyKey === true` OU caller passa explicit `opts.idempotencyKeyValue`.\r\n * - Core dedup em coleção `usage_idempotency_keys/{key}` TTL 24h (vide\r\n * `docs/CORE_CHANGES_REQUIRED.md` §2). Se Core ainda não dedupa, o header\r\n * é benign (ignorado).\r\n *\r\n * Defesa em camadas: combinado com `retries: 0` em POSTs (vide http.ts), o\r\n * risco de double-write em transientes vai pra zero.\r\n */\r\nimport { NeetruError } from './errors';\r\n\r\n/**\r\n * Gera UUID v4 criptograficamente seguro. Universal: Node 14.17+, browsers\r\n * modernos, Edge runtimes (Workers/Vercel Edge/Cloudflare).\r\n *\r\n * Fallback puro-JS removido em 3.0 — `crypto.randomUUID()` é ubíquo desde\r\n * 2022. Se runtime não tem, lança `NeetruError('runtime_unsupported')`\r\n * (consumer deve polyfillar).\r\n *\r\n * **L-01 fix (Opus review 2026-05-27):** antes lançava `Error` cru, que\r\n * não era pego por `catch (err) { if (err instanceof NeetruError) ... }`\r\n * dos consumers. Agora throw canonical.\r\n *\r\n * @throws NeetruError('runtime_unsupported') se `crypto.randomUUID` não disponível.\r\n */\r\nexport function generateIdempotencyKey(): string {\r\n // WebCrypto (browser/Edge) e Node 14.17+ expõem `crypto.randomUUID()`.\r\n // Node anterior precisa de `node:crypto` mas SDK 3.0 exige Node ≥20 (vide engines).\r\n const cryptoObj: { randomUUID?: () => string } | undefined =\r\n typeof globalThis !== 'undefined' && 'crypto' in globalThis\r\n ? (globalThis as { crypto?: { randomUUID?: () => string } }).crypto\r\n : undefined;\r\n if (cryptoObj && typeof cryptoObj.randomUUID === 'function') {\r\n return cryptoObj.randomUUID();\r\n }\r\n throw new NeetruError(\r\n 'runtime_unsupported',\r\n 'crypto.randomUUID not available in this runtime. SDK 3.0 requires Node ≥20 or modern browser/Edge.',\r\n );\r\n}\r\n\r\n/** Regex UUID v4 — validação para uso interno. */\r\nexport const UUID_V4_RE =\r\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\r\n","/**\r\n * HTTP transport interno do SDK.\r\n *\r\n * Responsabilidades:\r\n * - Construir URL absoluta a partir de `baseUrl` + path\r\n * - Injetar Bearer token quando `requireAuth=true`\r\n * - Mapear status HTTP → `NeetruError` com `code` estável\r\n * - Parse defensivo de JSON (não lança em body vazio em 204)\r\n * - Retry/backoff exponencial em `rate_limited` (429), `server_error` (5xx)\r\n * e `network_error` (timeout/falha de rede). Honra `Retry-After` quando\r\n * presente.\r\n * - **Captura `X-Neetru-Version`** das respostas e emite `console.warn` quando\r\n * o Core está abaixo da versão mínima para a major do SDK.\r\n *\r\n * Política de retries (mudança breaking 3.0):\r\n * - GET/HEAD: default 2 retries (3 tentativas total) — idempotente, seguro.\r\n * - POST/PUT/PATCH/DELETE: default **0 retries** — mutations podem duplicar\r\n * side effects (ex: `usage.report` incrementa contador). Caller pode\r\n * reativar passando `retries: N` explicitamente ou usar `Idempotency-Key`\r\n * header (gerado automaticamente se `opts.idempotencyKey=true`).\r\n *\r\n * Idempotency-Key (3.0):\r\n * - `opts.idempotencyKey === true` → SDK gera UUID v4 e injeta header.\r\n * - `opts.idempotencyKey === 'uuid-string'` → usa o valor passado.\r\n * - Caller mantém retentos client-side se quiser; Core dedup serverside\r\n * (vide `docs/CORE_CHANGES_REQUIRED.md` §2).\r\n */\r\nimport { NeetruError, type NeetruErrorCode } from './errors';\r\nimport { generateIdempotencyKey } from './idempotency';\r\nimport type { ResolvedConfig } from './types';\r\n\r\n// ─── Compat Matrix SDK↔Core ──────────────────────────────────────────────────\r\n\r\n/**\r\n * Matriz de compatibilidade SDK major → versão mínima do Core.\r\n *\r\n * Formato do Core: CalVer `YYYY.MM.patch+revision` (ex: `2026.05.1+neetru-core-00096-79t`).\r\n * A comparação é feita apenas nas partes `YYYY.MM.patch` (prefixo antes de `+`).\r\n *\r\n * Quando o Core reporta `X-Neetru-Version` abaixo do mínimo para a SDK major\r\n * corrente, o SDK emite `console.warn` uma única vez por sessão de processo.\r\n *\r\n * Atualize esta tabela a cada major de SDK.\r\n */\r\nconst COMPAT_MATRIX: Record<number, string> = {\r\n // SDK major 3.x requer Core ≥ 2026.05.1 (suporte a X-Neetru-Version header,\r\n // runTransaction write-after-read, verifyWebhookRequest, webhooks 3.0+)\r\n 3: '2026.05.1',\r\n};\r\n\r\n/** CalVer sem sufixo `+revision`. Ex: `2026.05.1+abc` → `2026.05.1`. */\r\nfunction stripRevision(v: string): string {\r\n return v.split('+')[0] ?? v;\r\n}\r\n\r\n/**\r\n * Compara dois CalVer (`YYYY.MM.patch`). Retorna negativo se `a < b`,\r\n * positivo se `a > b`, 0 se iguais. Partes não numéricas tratadas como 0.\r\n */\r\nfunction compareCalVer(a: string, b: string): number {\r\n const partsA = stripRevision(a).split('.').map(Number);\r\n const partsB = stripRevision(b).split('.').map(Number);\r\n const len = Math.max(partsA.length, partsB.length);\r\n for (let i = 0; i < len; i++) {\r\n const pa = partsA[i] ?? 0;\r\n const pb = partsB[i] ?? 0;\r\n if (pa !== pb) return pa - pb;\r\n }\r\n return 0;\r\n}\r\n\r\n/** Lê a SDK major a partir da string `VERSION` exportada de `./index`. Fallback 3. */\r\nfunction getSdkMajor(): number {\r\n try {\r\n // Importação estática não disponível aqui (evita ciclo). Usa variável injetada\r\n // em tempo de build pela tsup via `define`. Fallback para 3 (current major).\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const ver = (globalThis as any).__NEETRU_SDK_VERSION__ as string | undefined;\r\n if (ver) return parseInt(ver.split('.')[0] ?? '3', 10);\r\n } catch {\r\n // ignore\r\n }\r\n return 3;\r\n}\r\n\r\n/** Aviso emitido no máximo uma vez por major detectada pra não spammar logs. */\r\nconst _warnedCoreTooOld = new Set<string>();\r\n\r\n/**\r\n * Verifica se a versão do Core (`X-Neetru-Version`) é compatível com a SDK major.\r\n * Emite `console.warn` quando incompatível (uma vez por processo por versão detectada).\r\n */\r\nexport function checkCoreVersionCompat(coreVersion: string): void {\r\n if (!coreVersion) return;\r\n const sdkMajor = getSdkMajor();\r\n const minCore = COMPAT_MATRIX[sdkMajor];\r\n if (!minCore) return; // sem restrição para esta major\r\n const stripped = stripRevision(coreVersion);\r\n if (compareCalVer(stripped, minCore) < 0) {\r\n const key = `${sdkMajor}:${stripped}`;\r\n if (!_warnedCoreTooOld.has(key)) {\r\n _warnedCoreTooOld.add(key);\r\n console.warn(\r\n `[Neetru SDK] Atenção: Core versão \"${coreVersion}\" é anterior ao mínimo recomendado` +\r\n ` \"${minCore}\" para SDK major ${sdkMajor}. Alguns recursos podem não funcionar` +\r\n ` corretamente. Atualize o Core para a versão mais recente.`,\r\n );\r\n }\r\n }\r\n}\r\n\r\n/** Opções da request HTTP. */\r\nexport interface HttpRequestOptions {\r\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\r\n /** Path relativo (ex: `/api/v1/cli/catalog`). Concatenado a `baseUrl`. */\r\n path: string;\r\n /** Query string params (chave → valor primitivo). Valores `undefined` ignorados. */\r\n query?: Record<string, string | number | boolean | undefined>;\r\n /** Body JSON-serializável. Ignorado em GET/DELETE. */\r\n body?: unknown;\r\n /**\r\n * Se true, injeta `Authorization: Bearer <apiKey>`. Lança `missing_api_key`\r\n * se config.apiKey ausente. Default false.\r\n */\r\n requireAuth?: boolean;\r\n /** Cabeçalhos extras. */\r\n headers?: Record<string, string>;\r\n /**\r\n * Número de retries em códigos transientes (`rate_limited`, `server_error`,\r\n * `network_error`).\r\n *\r\n * Default (3.0):\r\n * - GET/HEAD: 2 (= 3 tentativas total) — idempotente, seguro.\r\n * - POST/PUT/PATCH/DELETE: 0 — mutations podem duplicar side effects.\r\n *\r\n * Caller pode reativar passando explicitamente: `retries: 2`.\r\n */\r\n retries?: number;\r\n /**\r\n * Injeta `Idempotency-Key` header pra dedup serverside (3.0):\r\n * - `true` → SDK gera UUID v4 cripto-seguro automaticamente.\r\n * - string → usa o valor passado (deve ser UUID v4).\r\n * - `undefined`/`false` → sem header.\r\n */\r\n idempotencyKey?: boolean | string;\r\n}\r\n\r\nconst DEFAULT_RETRIES_READ = 2;\r\nconst DEFAULT_RETRIES_WRITE = 0;\r\nconst READ_METHODS = new Set(['GET', 'HEAD']);\r\nconst RETRYABLE_CODES = new Set<NeetruErrorCode>([\r\n 'rate_limited',\r\n 'server_error',\r\n 'network_error',\r\n]);\r\n\r\n/** Backoff exponencial com jitter ±20%. attempt: 0=primeira, 1=primeiro retry, ... */\r\nfunction backoffMs(attempt: number): number {\r\n const base = 200 * Math.pow(4, attempt); // 200ms, 800ms, 3.2s, ...\r\n const jitter = base * 0.2 * (Math.random() * 2 - 1);\r\n return Math.max(50, Math.round(base + jitter));\r\n}\r\n\r\n/**\r\n * Honra `Retry-After` header (segundos ou HTTP-date). Retorna ms ou null se\r\n * inválido. RFC 9110 §10.2.3.\r\n *\r\n * Bug fix: sem teto, um servidor hostil/mal-configurado poderia retornar\r\n * `Retry-After: 86400` (24h) ou uma HTTP-date anos no futuro, pendurando o\r\n * processo indefinidamente. Aplica teto de MAX_RETRY_AFTER_MS em ambos os caminhos.\r\n */\r\nconst MAX_RETRY_AFTER_MS = 60_000; // 60s — teto razoável para retry automático\r\n\r\nfunction parseRetryAfter(value: string | null): number | null {\r\n if (!value) return null;\r\n const secs = Number(value);\r\n if (Number.isFinite(secs) && secs >= 0) return Math.min(Math.round(secs * 1000), MAX_RETRY_AFTER_MS);\r\n const dateMs = Date.parse(value);\r\n if (Number.isFinite(dateMs)) {\r\n const delta = dateMs - Date.now();\r\n if (delta > 0) return Math.min(delta, MAX_RETRY_AFTER_MS);\r\n }\r\n return null;\r\n}\r\n\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\n/** Mapeamento status → code estável do NeetruError. */\r\nfunction statusToCode(status: number): NeetruErrorCode {\r\n if (status === 401) return 'unauthorized';\r\n if (status === 403) return 'forbidden';\r\n if (status === 404) return 'not_found';\r\n if (status === 409) return 'conflict'; // Bug fix: 409 vira 'conflict' (não 'unknown')\r\n if (status === 422 || status === 400) return 'validation_failed';\r\n if (status === 429) return 'rate_limited';\r\n if (status >= 500) return 'server_error';\r\n return 'unknown';\r\n}\r\n\r\nfunction buildUrl(baseUrl: string, path: string, query?: HttpRequestOptions['query']): string {\r\n // Trim trailing slash em base e leading em path pra evitar `//`.\r\n const base = baseUrl.replace(/\\/+$/, '');\r\n const p = path.startsWith('/') ? path : `/${path}`;\r\n const url = new URL(`${base}${p}`);\r\n if (query) {\r\n for (const [k, v] of Object.entries(query)) {\r\n if (v === undefined) continue;\r\n url.searchParams.set(k, String(v));\r\n }\r\n }\r\n return url.toString();\r\n}\r\n\r\n/** Parse JSON defensivo — retorna `undefined` em body vazio. */\r\nasync function safeJson(res: Response): Promise<unknown> {\r\n const text = await res.text();\r\n if (!text) return undefined;\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Executa request HTTP. Em sucesso retorna body parseado; em erro lança\r\n * `NeetruError` com `code` derivado do status. Aplica retry/backoff\r\n * automático em códigos transientes (rate_limited/server_error/network_error)\r\n * conforme `opts.retries` (default 2 = 3 tentativas).\r\n */\r\nexport async function httpRequest<T>(\r\n config: ResolvedConfig,\r\n opts: HttpRequestOptions,\r\n): Promise<T> {\r\n const method = opts.method ?? 'GET';\r\n const url = buildUrl(config.baseUrl, opts.path, opts.query);\r\n // Default por método: reads tentam 2x, writes 0x. Caller override sempre vence.\r\n const defaultRetries = READ_METHODS.has(method)\r\n ? DEFAULT_RETRIES_READ\r\n : DEFAULT_RETRIES_WRITE;\r\n const maxRetries = opts.retries ?? defaultRetries;\r\n\r\n const headers: Record<string, string> = {\r\n accept: 'application/json',\r\n ...opts.headers,\r\n };\r\n\r\n if (opts.requireAuth) {\r\n if (!config.apiKey) {\r\n throw new NeetruError(\r\n 'missing_api_key',\r\n 'This operation requires an apiKey. Pass it to createNeetruClient({ apiKey }) or set NEETRU_API_KEY env var.',\r\n );\r\n }\r\n headers.authorization = `Bearer ${config.apiKey}`;\r\n }\r\n\r\n // Idempotency-Key: gerado por chamada se solicitado. UUID v4 cripto-seguro.\r\n if (opts.idempotencyKey) {\r\n const key =\r\n typeof opts.idempotencyKey === 'string'\r\n ? opts.idempotencyKey\r\n : generateIdempotencyKey();\r\n headers['idempotency-key'] = key;\r\n }\r\n\r\n // Body só é serializado uma vez — reusado entre tentativas.\r\n const bodyString =\r\n opts.body !== undefined && method !== 'GET' && method !== 'DELETE'\r\n ? JSON.stringify(opts.body)\r\n : undefined;\r\n if (bodyString !== undefined) {\r\n headers['content-type'] = 'application/json';\r\n }\r\n\r\n let lastError: NeetruError | null = null;\r\n\r\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\r\n const init: RequestInit = { method, headers };\r\n if (bodyString !== undefined) init.body = bodyString;\r\n // BUG-020 fix (2026-05-13): timeout default 30s. AbortSignal.timeout\r\n // requer Node 18+ ou browsers recentes.\r\n init.signal = AbortSignal.timeout(30_000);\r\n\r\n let res: Response;\r\n try {\r\n res = await config.fetch(url, init);\r\n } catch (err) {\r\n const message =\r\n err instanceof DOMException && err.name === 'TimeoutError'\r\n ? 'Network error: timeout after 30s'\r\n : `Network error: ${err instanceof Error ? err.message : 'fetch failed'}`;\r\n lastError = new NeetruError('network_error', message);\r\n if (attempt < maxRetries) {\r\n await sleep(backoffMs(attempt));\r\n continue;\r\n }\r\n throw lastError;\r\n }\r\n\r\n const requestId =\r\n res.headers.get('x-request-id') ?? res.headers.get('x-correlation-id') ?? undefined;\r\n\r\n if (res.ok) {\r\n // Captura X-Neetru-Version e verifica compat com a SDK major.\r\n const coreVersion = res.headers.get('x-neetru-version');\r\n if (coreVersion) checkCoreVersionCompat(coreVersion);\r\n const parsed = await safeJson(res);\r\n return parsed as T;\r\n }\r\n\r\n // O contrato clássico de erro do Core é `{ error: { code, message } }`.\r\n // O 503 de lease de DB (e alguns endpoints novos) coloca `code`/`reason`/\r\n // `message` no TOPO do corpo, SEM envelope `error`. Lemos ambos: preferimos\r\n // `body.error` quando presente; caímos nos campos do topo caso contrário.\r\n // `reason` é sempre considerado no topo (o 503 de lease o coloca lá mesmo\r\n // quando há `error`), pra que a camada de DB discrimine suspended/archived/\r\n // revoked de provisioning/degraded.\r\n const body = (await safeJson(res)) as\r\n | {\r\n error?: { code?: string; message?: string; reason?: string } | string;\r\n code?: string;\r\n reason?: string;\r\n message?: string;\r\n }\r\n | undefined;\r\n let code: string = statusToCode(res.status);\r\n let message = `HTTP ${res.status}`;\r\n let reason: string | undefined;\r\n if (body && typeof body === 'object') {\r\n const errField = body.error;\r\n if (typeof errField === 'string') {\r\n message = errField;\r\n } else if (errField && typeof errField === 'object') {\r\n if (typeof errField.code === 'string') code = errField.code;\r\n if (typeof errField.message === 'string') message = errField.message;\r\n if (typeof errField.reason === 'string') reason = errField.reason;\r\n } else {\r\n // Sem envelope `error` — lê os campos no TOPO do corpo (contrato do 503\r\n // de lease: `{ code, reason }` no topo).\r\n if (typeof body.code === 'string') code = body.code;\r\n if (typeof body.message === 'string') message = body.message;\r\n }\r\n // `reason` no topo tem prioridade final (o 503 de lease o coloca no topo\r\n // mesmo quando também há `error`).\r\n if (typeof body.reason === 'string') reason = body.reason;\r\n }\r\n const err = new NeetruError(code, message, res.status, requestId, reason);\r\n lastError = err;\r\n\r\n const isRetryable = RETRYABLE_CODES.has(code as NeetruErrorCode);\r\n if (isRetryable && attempt < maxRetries) {\r\n const retryAfter = parseRetryAfter(res.headers.get('retry-after'));\r\n const delay = retryAfter ?? backoffMs(attempt);\r\n await sleep(delay);\r\n continue;\r\n }\r\n throw err;\r\n }\r\n\r\n // Unreachable — loop sempre retorna ou lança. Safety net.\r\n throw lastError ?? new NeetruError('unknown', 'unexpected httpRequest exit');\r\n}\r\n","/**\r\n * Checkout namespace (v1.1) — `client.checkout.*`\r\n *\r\n * Fluxo canônico (vide `docs/FLUXO_SIGNUP_BILLING_CHECKOUT.md` §6):\r\n * 1. SaaS produto chama `client.checkout.start({productId, planId, callbackUrl})`.\r\n * 2. SDK posta em `POST /api/v1/checkout/intents` (Bearer access_token OIDC).\r\n * 3. Core cria `checkout_intents/{intentId}` (TTL 15min) + retorna `redirectUrl`.\r\n * 4. Em browser, SDK redireciona automaticamente pra `redirectUrl`. Em\r\n * Node/SSR, retorna o objeto `{intentId, redirectUrl}` sem redirect.\r\n * 5. Portal (`minhaconta.neetru.com/portal/kyc/{intentId}`) coleta KYC + cartão.\r\n * 6. Usuário volta pra `callbackUrl?status=success&intentId=...` quando completo.\r\n *\r\n * **Dev mode** (`NEETRU_ENV=dev`): `start()` retorna URL fake sem network call.\r\n * Útil pra dev externo SaaS testar UI sem provisionar conta Neetru.\r\n *\r\n * **Estabilidade**: minor bump v1.0 → v1.1 (feature add, sem breaking).\r\n */\r\nimport { NeetruError } from './errors';\r\nimport { httpRequest } from './http';\r\nimport type { ResolvedConfig } from './types';\r\n\r\n// ─── Types públicos ─────────────────────────────────────────────────────────\r\n\r\n/** Tipo do tenant alvo da subscription (PF=uid, PJ=orgId). */\r\nexport type CheckoutTenantType = 'pf' | 'pj';\r\n\r\n/** Status do `checkout_intents/{intentId}` no Core. */\r\nexport type CheckoutIntentStatus =\r\n | 'pending'\r\n | 'kyc_in_progress'\r\n | 'stripe_redirected'\r\n | 'completed'\r\n | 'expired'\r\n | 'cancelled';\r\n\r\nexport interface CheckoutStartInput {\r\n /** Slug do produto no catálogo (ex: `neetru-pulse`). */\r\n productId: string;\r\n /** Slug do plano no catálogo do produto (ex: `pro_monthly`). */\r\n planId: string;\r\n /** Pra onde o produto SaaS quer voltar pós-checkout. https obrigatório (ou http://localhost em dev). */\r\n callbackUrl: string;\r\n /** Override pra checkout em nome de uma org. Default: PF do uid logado. */\r\n tenantType?: CheckoutTenantType;\r\n /** Quando `tenantType='pj'`, id da org. Ignorado quando PF. */\r\n tenantId?: string;\r\n /**\r\n * Em browsers, default `true` — SDK faz `window.location.href = redirectUrl`.\r\n * Passe `false` se quiser controlar o redirect manualmente.\r\n */\r\n autoRedirect?: boolean;\r\n /**\r\n * **C2 (auditoria 2026-06-10):** access_token OIDC do **usuário final** que\r\n * está assinando. Usado no modo HTTP real — o endpoint de checkout do\r\n * Core (`/api/v1/checkout/intents`) autentica a identidade do cliente (Bearer\r\n * access_token/id_token OIDC ou cookie de sessão), NÃO a chave de API do SDK\r\n * (`nrt_*`). Enviar a chave `nrt_*` resultava em 401 sempre.\r\n *\r\n * Passe `accessToken` **ou** `idToken` (pelo menos um é obrigatório no HTTP\r\n * real). Veja `idToken` para o padrão BFF/cookie recomendado.\r\n */\r\n accessToken?: string;\r\n /**\r\n * **BFF/cookie (padrão recomendado):** id_token OIDC do **usuário final**.\r\n *\r\n * No padrão BFF, o app troca `code`→tokens **no servidor**, guarda só o\r\n * `id_token` num cookie **httpOnly** e **descarta o access_token** — logo o\r\n * browser NUNCA tem o access_token. O endpoint de checkout do Core aceita o\r\n * id_token no header Bearer (via `verifyIdToken`, mesma validação forte de\r\n * assinatura/kid/iss/exp do access_token), então o **BFF do app** passa aqui\r\n * o id_token que ele TEM (lido do cookie httpOnly, server-side).\r\n *\r\n * Quando ambos são passados, `accessToken` tem prioridade (é revogável no\r\n * servidor via o espelho `jti`; o id_token não é revogável, só expira ~15min).\r\n */\r\n idToken?: string;\r\n}\r\n\r\n/** Auth por chamada do checkout — access_token OU id_token OIDC do usuário final. */\r\nexport interface CheckoutAuthOpts {\r\n /** access_token OIDC do usuário final (vide `CheckoutStartInput.accessToken`). */\r\n accessToken?: string;\r\n /** id_token OIDC do usuário final — padrão BFF/cookie (vide `CheckoutStartInput.idToken`). */\r\n idToken?: string;\r\n}\r\n\r\nexport interface CheckoutStartResult {\r\n intentId: string;\r\n redirectUrl: string;\r\n status: CheckoutIntentStatus;\r\n expiresAt: string;\r\n /** True se KYC ainda precisa ser coletado no portal. UI pode mostrar hint. */\r\n requiresKyc: boolean;\r\n}\r\n\r\nexport interface CheckoutIntentInfo {\r\n intentId: string;\r\n uid: string;\r\n targetTenantId: string;\r\n targetTenantType: CheckoutTenantType;\r\n productId: string;\r\n planId: string;\r\n callbackUrl: string;\r\n status: CheckoutIntentStatus;\r\n /** Stripe Checkout Session id quando avançou pra `stripe_redirected`. */\r\n stripeSessionId?: string | null;\r\n expiresAt: string;\r\n /** True se já passou `expiresAt` mas Core ainda não marcou expired. */\r\n isStale?: boolean;\r\n}\r\n\r\nexport interface CheckoutNamespace {\r\n /**\r\n * Inicia checkout. Em browser, redireciona automaticamente pro portal.\r\n * Em Node/SSR, retorna o resultado sem efeitos colaterais — caller decide\r\n * o que fazer com `redirectUrl`.\r\n *\r\n * Dev mode (`NEETRU_ENV=dev`): retorna URL fake `https://localhost:9003/portal/checkout/mock-XXXX`.\r\n */\r\n start(input: CheckoutStartInput): Promise<CheckoutStartResult>;\r\n /** Lê estado atual do intent (Core). Requer `opts.accessToken` **ou** `opts.idToken` no HTTP real. */\r\n get(intentId: string, opts?: CheckoutAuthOpts): Promise<CheckoutIntentInfo>;\r\n /** Cancela um intent que ainda não virou `stripe_redirected`. Requer `opts.accessToken` **ou** `opts.idToken` no HTTP real. */\r\n cancel(intentId: string, opts?: CheckoutAuthOpts): Promise<{ ok: true; alreadyCancelled: boolean }>;\r\n}\r\n\r\n/**\r\n * C2 + BFF: monta a auth do checkout a partir do access_token **ou** do id_token\r\n * OIDC do usuário final. Fail-closed: sem nenhum token, lança erro claro em vez\r\n * de mandar a chave `nrt_*` (que o endpoint rejeita com 401). Retorna\r\n * requireAuth:false + header Bearer manual — httpRequest preserva\r\n * `headers.authorization` quando requireAuth=false.\r\n *\r\n * `accessToken` tem prioridade sobre `idToken` quando os dois vierem: o\r\n * access_token é revogável no servidor (espelho `jti`); o id_token só expira.\r\n * No padrão BFF/cookie recomendado o browser só tem o id_token (httpOnly,\r\n * legível server-side), então o BFF passa `idToken`.\r\n */\r\nfunction checkoutAuth(\r\n auth: { accessToken?: string; idToken?: string } | undefined,\r\n method: string,\r\n): { requireAuth: false; headers: Record<string, string> } {\r\n const token = auth?.accessToken || auth?.idToken;\r\n if (!token || typeof token !== 'string') {\r\n throw new NeetruError(\r\n 'validation_failed',\r\n `checkout.${method} requer o access_token OU o id_token OIDC do usuário final ` +\r\n `(passe \\`accessToken\\` ou \\`idToken\\`). A chave de API do SDK (nrt_*) NÃO é aceita pelo ` +\r\n `endpoint de checkout — ele autentica a identidade do cliente que está assinando ` +\r\n `(Bearer access_token/id_token OIDC ou cookie de sessão). No padrão BFF/cookie, passe o ` +\r\n `\\`idToken\\` que seu servidor guardou no cookie httpOnly.`,\r\n );\r\n }\r\n return { requireAuth: false, headers: { authorization: `Bearer ${token}` } };\r\n}\r\n\r\n// ─── Implementação real (HTTP) ─────────────────────────────────────────────\r\n\r\ninterface RawStartCheckoutResponse {\r\n ok?: boolean;\r\n intentId?: string;\r\n redirectUrl?: string;\r\n status?: string;\r\n expiresAt?: string;\r\n requiresKyc?: boolean;\r\n}\r\n\r\ninterface RawGetCheckoutResponse {\r\n ok?: boolean;\r\n intent?: {\r\n intentId?: string;\r\n uid?: string;\r\n targetTenantId?: string;\r\n targetTenantType?: string;\r\n productId?: string;\r\n planId?: string;\r\n callbackUrl?: string;\r\n status?: string;\r\n stripeSessionId?: string | null;\r\n expiresAt?: string;\r\n };\r\n isStale?: boolean;\r\n}\r\n\r\nfunction parseStartResponse(raw: unknown): CheckoutStartResult {\r\n if (!raw || typeof raw !== 'object') {\r\n throw new NeetruError('invalid_response', 'checkout.start response is not an object');\r\n }\r\n const r = raw as RawStartCheckoutResponse;\r\n if (typeof r.intentId !== 'string' || !r.intentId) {\r\n throw new NeetruError('invalid_response', 'checkout.start response missing intentId');\r\n }\r\n if (typeof r.redirectUrl !== 'string' || !r.redirectUrl) {\r\n throw new NeetruError('invalid_response', 'checkout.start response missing redirectUrl');\r\n }\r\n return {\r\n intentId: r.intentId,\r\n redirectUrl: r.redirectUrl,\r\n status: (r.status as CheckoutIntentStatus | undefined) ?? 'pending',\r\n expiresAt: typeof r.expiresAt === 'string' ? r.expiresAt : new Date().toISOString(),\r\n requiresKyc: r.requiresKyc === true,\r\n };\r\n}\r\n\r\nfunction parseGetResponse(raw: unknown): CheckoutIntentInfo {\r\n if (!raw || typeof raw !== 'object') {\r\n throw new NeetruError('invalid_response', 'checkout.get response is not an object');\r\n }\r\n const r = raw as RawGetCheckoutResponse;\r\n const intent = r.intent;\r\n if (!intent || typeof intent !== 'object') {\r\n throw new NeetruError('invalid_response', 'checkout.get response missing intent');\r\n }\r\n if (typeof intent.intentId !== 'string') {\r\n throw new NeetruError('invalid_response', 'checkout.get response missing intentId');\r\n }\r\n return {\r\n intentId: intent.intentId,\r\n uid: intent.uid ?? '',\r\n targetTenantId: intent.targetTenantId ?? '',\r\n targetTenantType: (intent.targetTenantType as CheckoutTenantType | undefined) ?? 'pf',\r\n productId: intent.productId ?? '',\r\n planId: intent.planId ?? '',\r\n callbackUrl: intent.callbackUrl ?? '',\r\n status: (intent.status as CheckoutIntentStatus | undefined) ?? 'pending',\r\n stripeSessionId: intent.stripeSessionId ?? null,\r\n expiresAt: intent.expiresAt ?? new Date().toISOString(),\r\n isStale: r.isStale === true,\r\n };\r\n}\r\n\r\n/**\r\n * Detecta se estamos em browser context. Em SSR / Node / Edge, `window`\r\n * pode não existir — fazemos check defensivo.\r\n */\r\nfunction inBrowser(): boolean {\r\n try {\r\n return (\r\n typeof globalThis !== 'undefined' &&\r\n typeof (globalThis as { window?: { location?: { href?: string } } }).window !== 'undefined' &&\r\n typeof globalThis.location !== 'undefined' &&\r\n typeof globalThis.location.assign === 'function'\r\n );\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction performRedirect(url: string): void {\r\n try {\r\n globalThis.location.assign(url);\r\n } catch {\r\n /* noop em runtimes sem location.assign — caller decide */\r\n }\r\n}\r\n\r\n/**\r\n * Implementação HTTP real. Posta no Core, parse response, redireciona se browser.\r\n */\r\nfunction createHttpCheckoutNamespace(config: ResolvedConfig): CheckoutNamespace {\r\n return {\r\n async start(input: CheckoutStartInput): Promise<CheckoutStartResult> {\r\n if (!input?.productId) {\r\n throw new NeetruError('validation_failed', 'checkout.start: productId is required');\r\n }\r\n if (!input?.planId) {\r\n throw new NeetruError('validation_failed', 'checkout.start: planId is required');\r\n }\r\n if (!input?.callbackUrl) {\r\n throw new NeetruError('validation_failed', 'checkout.start: callbackUrl is required');\r\n }\r\n\r\n const body: Record<string, unknown> = {\r\n productId: input.productId,\r\n planId: input.planId,\r\n callbackUrl: input.callbackUrl,\r\n };\r\n if (input.tenantType) body.targetTenantType = input.tenantType;\r\n if (input.tenantId) body.targetTenantId = input.tenantId;\r\n\r\n // bug: sem idempotencyKey → retry criava intents duplicados (fix: alinhar com usage.report/support.createTicket)\r\n const { requireAuth, headers } = checkoutAuth(\r\n { accessToken: input.accessToken, idToken: input.idToken },\r\n 'start',\r\n );\r\n const raw = await httpRequest<RawStartCheckoutResponse>(config, {\r\n method: 'POST',\r\n path: '/api/v1/checkout/intents',\r\n body,\r\n requireAuth,\r\n headers,\r\n idempotencyKey: true,\r\n });\r\n const result = parseStartResponse(raw);\r\n\r\n const shouldRedirect = input.autoRedirect !== false;\r\n if (shouldRedirect && inBrowser()) {\r\n performRedirect(result.redirectUrl);\r\n }\r\n return result;\r\n },\r\n\r\n async get(intentId: string, opts?: CheckoutAuthOpts): Promise<CheckoutIntentInfo> {\r\n if (!intentId || typeof intentId !== 'string') {\r\n throw new NeetruError('validation_failed', 'checkout.get: intentId is required');\r\n }\r\n const { requireAuth, headers } = checkoutAuth(\r\n { accessToken: opts?.accessToken, idToken: opts?.idToken },\r\n 'get',\r\n );\r\n const raw = await httpRequest<RawGetCheckoutResponse>(config, {\r\n method: 'GET',\r\n path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,\r\n requireAuth,\r\n headers,\r\n });\r\n return parseGetResponse(raw);\r\n },\r\n\r\n async cancel(intentId: string, opts?: CheckoutAuthOpts): Promise<{ ok: true; alreadyCancelled: boolean }> {\r\n if (!intentId || typeof intentId !== 'string') {\r\n throw new NeetruError('validation_failed', 'checkout.cancel: intentId is required');\r\n }\r\n const { requireAuth, headers } = checkoutAuth(\r\n { accessToken: opts?.accessToken, idToken: opts?.idToken },\r\n 'cancel',\r\n );\r\n const raw = await httpRequest<{ ok?: boolean; alreadyCancelled?: boolean }>(config, {\r\n method: 'DELETE',\r\n path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,\r\n requireAuth,\r\n headers,\r\n });\r\n return {\r\n ok: true,\r\n alreadyCancelled: (raw as { alreadyCancelled?: boolean })?.alreadyCancelled === true,\r\n };\r\n },\r\n };\r\n}\r\n\r\n// ─── Mock dev (sem network) ─────────────────────────────────────────────────\r\n\r\n/**\r\n * Mock dev — retorna URL fake `https://localhost:9003/portal/checkout/mock-XXXX`\r\n * sem tocar no Core. Útil pra dev externo SaaS testar UI/redirect sem precisar\r\n * de Bearer token Neetru.\r\n *\r\n * Dev mode persiste intents em mapa in-memory pro `get`/`cancel` retornarem\r\n * resultado consistente.\r\n */\r\nexport class MockCheckout implements CheckoutNamespace {\r\n private readonly intents = new Map<string, CheckoutIntentInfo>();\r\n\r\n async start(input: CheckoutStartInput): Promise<CheckoutStartResult> {\r\n if (!input?.productId) {\r\n throw new NeetruError('validation_failed', 'checkout.start: productId is required');\r\n }\r\n if (!input?.planId) {\r\n throw new NeetruError('validation_failed', 'checkout.start: planId is required');\r\n }\r\n if (!input?.callbackUrl) {\r\n throw new NeetruError('validation_failed', 'checkout.start: callbackUrl is required');\r\n }\r\n\r\n const intentId = `chk_mock_${Math.random().toString(36).slice(2, 10)}`;\r\n const expiresAt = new Date(Date.now() + 15 * 60 * 1000).toISOString();\r\n const redirectUrl = `https://localhost:9003/portal/checkout/${intentId}`;\r\n\r\n this.intents.set(intentId, {\r\n intentId,\r\n uid: 'dev-fixture-uid',\r\n targetTenantId: input.tenantId ?? 'dev-fixture-uid',\r\n targetTenantType: input.tenantType ?? 'pf',\r\n productId: input.productId,\r\n planId: input.planId,\r\n callbackUrl: input.callbackUrl,\r\n status: 'pending',\r\n stripeSessionId: null,\r\n expiresAt,\r\n });\r\n\r\n return {\r\n intentId,\r\n redirectUrl,\r\n status: 'pending',\r\n expiresAt,\r\n requiresKyc: false,\r\n };\r\n }\r\n\r\n async get(intentId: string, _opts?: CheckoutAuthOpts): Promise<CheckoutIntentInfo> {\r\n const found = this.intents.get(intentId);\r\n if (!found) {\r\n throw new NeetruError('not_found', `Mock intent ${intentId} not found`);\r\n }\r\n return { ...found };\r\n }\r\n\r\n async cancel(intentId: string, _opts?: CheckoutAuthOpts): Promise<{ ok: true; alreadyCancelled: boolean }> {\r\n const found = this.intents.get(intentId);\r\n if (!found) {\r\n throw new NeetruError('not_found', `Mock intent ${intentId} not found`);\r\n }\r\n const alreadyCancelled = found.status === 'cancelled';\r\n this.intents.set(intentId, { ...found, status: 'cancelled' });\r\n return { ok: true, alreadyCancelled };\r\n }\r\n}\r\n\r\n// ─── Factory ────────────────────────────────────────────────────────────────\r\n\r\nexport function createCheckoutNamespace(config: ResolvedConfig): CheckoutNamespace {\r\n if (config.env === 'dev') return new MockCheckout();\r\n return createHttpCheckoutNamespace(config);\r\n}\r\n"]}
@@ -1,4 +1,4 @@
1
- import { aq as SyncState, av as Unsubscribe, F as DbDoc, W as NeetruClient, E as DbCollectionRef, K as DbQuery } from './types-D-QdG502.cjs';
1
+ import { aq as SyncState, av as Unsubscribe, F as DbDoc, W as NeetruClient, E as DbCollectionRef, K as DbQuery } from './types-Dw0fqhHm.cjs';
2
2
  import 'drizzle-orm/node-postgres';
3
3
  import './errors.cjs';
4
4
 
@@ -1,4 +1,4 @@
1
- import { aq as SyncState, av as Unsubscribe, F as DbDoc, W as NeetruClient, E as DbCollectionRef, K as DbQuery } from './types-BlOLDMR0.js';
1
+ import { aq as SyncState, av as Unsubscribe, F as DbDoc, W as NeetruClient, E as DbCollectionRef, K as DbQuery } from './types-Bzxb5rlF.js';
2
2
  import 'drizzle-orm/node-postgres';
3
3
  import './errors.js';
4
4
 
package/dist/db.d.cts CHANGED
@@ -1,3 +1,3 @@
1
- export { w as ConflictRecord, x as CreateOfflineDocumentsOptions, z as DbBatchOp, B as DbChangeType, E as DbCollectionRef, F as DbDoc, G as DbDocRef, H as DbGetResult, I as DbListResult, K as DbQuery, L as DbSqlLease, N as DbWhereFilter, P as FieldSentinel, Q as IncrementSentinel, V as NEETRU_SENTINEL_KEY, Y as NeetruDb, Z as NeetruDbDocuments, _ as NeetruDbEngine, $ as NeetruDbError, a0 as NeetruDbErrorCode, a1 as NeetruDbOptions, a2 as NeetruDbTransport, a4 as NeetruSqlClient, ad as RealtimeTransport, ai as ServerTimestampSentinel, ak as SqlOptions, ap as SyncErrorEvent, aq as SyncState, aH as WithFieldSentinels, aI as __resetDbIdWarningForTests, aL as createNeetruDb, aN as createRestSyncTransport, aP as getWebSocketRealtimeClient, aQ as increment, aR as isFieldSentinel, aS as isIncrementSentinel, aT as isServerTimestampSentinel, aU as serverTimestamp } from './types-D-QdG502.cjs';
1
+ export { w as ConflictRecord, x as CreateOfflineDocumentsOptions, z as DbBatchOp, B as DbChangeType, E as DbCollectionRef, F as DbDoc, G as DbDocRef, H as DbGetResult, I as DbListResult, K as DbQuery, L as DbSqlLease, N as DbWhereFilter, P as FieldSentinel, Q as IncrementSentinel, V as NEETRU_SENTINEL_KEY, Y as NeetruDb, Z as NeetruDbDocuments, _ as NeetruDbEngine, $ as NeetruDbError, a0 as NeetruDbErrorCode, a1 as NeetruDbOptions, a2 as NeetruDbTransport, a4 as NeetruSqlClient, ad as RealtimeTransport, ai as ServerTimestampSentinel, ak as SqlOptions, ap as SyncErrorEvent, aq as SyncState, aH as WithFieldSentinels, aI as __resetDbIdWarningForTests, aL as createNeetruDb, aN as createRestSyncTransport, aP as getWebSocketRealtimeClient, aQ as increment, aR as isFieldSentinel, aS as isIncrementSentinel, aT as isServerTimestampSentinel, aU as serverTimestamp } from './types-Dw0fqhHm.cjs';
2
2
  import 'drizzle-orm/node-postgres';
3
3
  import './errors.cjs';
package/dist/db.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { w as ConflictRecord, x as CreateOfflineDocumentsOptions, z as DbBatchOp, B as DbChangeType, E as DbCollectionRef, F as DbDoc, G as DbDocRef, H as DbGetResult, I as DbListResult, K as DbQuery, L as DbSqlLease, N as DbWhereFilter, P as FieldSentinel, Q as IncrementSentinel, V as NEETRU_SENTINEL_KEY, Y as NeetruDb, Z as NeetruDbDocuments, _ as NeetruDbEngine, $ as NeetruDbError, a0 as NeetruDbErrorCode, a1 as NeetruDbOptions, a2 as NeetruDbTransport, a4 as NeetruSqlClient, ad as RealtimeTransport, ai as ServerTimestampSentinel, ak as SqlOptions, ap as SyncErrorEvent, aq as SyncState, aH as WithFieldSentinels, aI as __resetDbIdWarningForTests, aL as createNeetruDb, aN as createRestSyncTransport, aP as getWebSocketRealtimeClient, aQ as increment, aR as isFieldSentinel, aS as isIncrementSentinel, aT as isServerTimestampSentinel, aU as serverTimestamp } from './types-BlOLDMR0.js';
1
+ export { w as ConflictRecord, x as CreateOfflineDocumentsOptions, z as DbBatchOp, B as DbChangeType, E as DbCollectionRef, F as DbDoc, G as DbDocRef, H as DbGetResult, I as DbListResult, K as DbQuery, L as DbSqlLease, N as DbWhereFilter, P as FieldSentinel, Q as IncrementSentinel, V as NEETRU_SENTINEL_KEY, Y as NeetruDb, Z as NeetruDbDocuments, _ as NeetruDbEngine, $ as NeetruDbError, a0 as NeetruDbErrorCode, a1 as NeetruDbOptions, a2 as NeetruDbTransport, a4 as NeetruSqlClient, ad as RealtimeTransport, ai as ServerTimestampSentinel, ak as SqlOptions, ap as SyncErrorEvent, aq as SyncState, aH as WithFieldSentinels, aI as __resetDbIdWarningForTests, aL as createNeetruDb, aN as createRestSyncTransport, aP as getWebSocketRealtimeClient, aQ as increment, aR as isFieldSentinel, aS as isIncrementSentinel, aT as isServerTimestampSentinel, aU as serverTimestamp } from './types-Bzxb5rlF.js';
2
2
  import 'drizzle-orm/node-postgres';
3
3
  import './errors.js';
@@ -1,4 +1,4 @@
1
- import { ag as ResolvedConfig, O as EntitlementCheck } from './types-D-QdG502.cjs';
1
+ import { ag as ResolvedConfig, O as EntitlementCheck } from './types-Dw0fqhHm.cjs';
2
2
  import 'drizzle-orm/node-postgres';
3
3
  import './errors.cjs';
4
4
 
@@ -1,4 +1,4 @@
1
- import { ag as ResolvedConfig, O as EntitlementCheck } from './types-BlOLDMR0.js';
1
+ import { ag as ResolvedConfig, O as EntitlementCheck } from './types-Bzxb5rlF.js';
2
2
  import 'drizzle-orm/node-postgres';
3
3
  import './errors.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { Y as NeetruDb, E as DbCollectionRef, P as FieldSentinel, K as DbQuery } from './types-D-QdG502.cjs';
1
+ import { Y as NeetruDb, E as DbCollectionRef, P as FieldSentinel, K as DbQuery } from './types-Dw0fqhHm.cjs';
2
2
  import 'drizzle-orm/node-postgres';
3
3
  import './errors.cjs';
4
4
 
@@ -1,4 +1,4 @@
1
- import { Y as NeetruDb, E as DbCollectionRef, P as FieldSentinel, K as DbQuery } from './types-BlOLDMR0.js';
1
+ import { Y as NeetruDb, E as DbCollectionRef, P as FieldSentinel, K as DbQuery } from './types-Bzxb5rlF.js';
2
2
  import 'drizzle-orm/node-postgres';
3
3
  import './errors.js';
4
4
 
package/dist/index.cjs CHANGED
@@ -5587,14 +5587,15 @@ function createLazyCollectionRef(name, getDocsPromise) {
5587
5587
  // src/checkout.ts
5588
5588
  init_errors();
5589
5589
  init_http();
5590
- function checkoutAuth(accessToken, method) {
5591
- if (!accessToken || typeof accessToken !== "string") {
5590
+ function checkoutAuth(auth, method) {
5591
+ const token = auth?.accessToken || auth?.idToken;
5592
+ if (!token || typeof token !== "string") {
5592
5593
  throw new exports.NeetruError(
5593
5594
  "validation_failed",
5594
- `checkout.${method} requer o access_token OIDC do usu\xE1rio final (passe \`accessToken\`). A chave de API do SDK (nrt_*) N\xC3O \xE9 aceita pelo endpoint de checkout \u2014 ele autentica a identidade do cliente que est\xE1 assinando (Bearer access_token OIDC ou cookie de sess\xE3o).`
5595
+ `checkout.${method} requer o access_token OU o id_token OIDC do usu\xE1rio final (passe \`accessToken\` ou \`idToken\`). A chave de API do SDK (nrt_*) N\xC3O \xE9 aceita pelo endpoint de checkout \u2014 ele autentica a identidade do cliente que est\xE1 assinando (Bearer access_token/id_token OIDC ou cookie de sess\xE3o). No padr\xE3o BFF/cookie, passe o \`idToken\` que seu servidor guardou no cookie httpOnly.`
5595
5596
  );
5596
5597
  }
5597
- return { requireAuth: false, headers: { authorization: `Bearer ${accessToken}` } };
5598
+ return { requireAuth: false, headers: { authorization: `Bearer ${token}` } };
5598
5599
  }
5599
5600
  function parseStartResponse(raw) {
5600
5601
  if (!raw || typeof raw !== "object") {
@@ -5673,7 +5674,10 @@ function createHttpCheckoutNamespace(config) {
5673
5674
  };
5674
5675
  if (input.tenantType) body.targetTenantType = input.tenantType;
5675
5676
  if (input.tenantId) body.targetTenantId = input.tenantId;
5676
- const { requireAuth, headers } = checkoutAuth(input.accessToken, "start");
5677
+ const { requireAuth, headers } = checkoutAuth(
5678
+ { accessToken: input.accessToken, idToken: input.idToken },
5679
+ "start"
5680
+ );
5677
5681
  const raw = await httpRequest(config, {
5678
5682
  method: "POST",
5679
5683
  path: "/api/v1/checkout/intents",
@@ -5693,7 +5697,10 @@ function createHttpCheckoutNamespace(config) {
5693
5697
  if (!intentId || typeof intentId !== "string") {
5694
5698
  throw new exports.NeetruError("validation_failed", "checkout.get: intentId is required");
5695
5699
  }
5696
- const { requireAuth, headers } = checkoutAuth(opts?.accessToken, "get");
5700
+ const { requireAuth, headers } = checkoutAuth(
5701
+ { accessToken: opts?.accessToken, idToken: opts?.idToken },
5702
+ "get"
5703
+ );
5697
5704
  const raw = await httpRequest(config, {
5698
5705
  method: "GET",
5699
5706
  path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,
@@ -5706,7 +5713,10 @@ function createHttpCheckoutNamespace(config) {
5706
5713
  if (!intentId || typeof intentId !== "string") {
5707
5714
  throw new exports.NeetruError("validation_failed", "checkout.cancel: intentId is required");
5708
5715
  }
5709
- const { requireAuth, headers } = checkoutAuth(opts?.accessToken, "cancel");
5716
+ const { requireAuth, headers } = checkoutAuth(
5717
+ { accessToken: opts?.accessToken, idToken: opts?.idToken },
5718
+ "cancel"
5719
+ );
5710
5720
  const raw = await httpRequest(config, {
5711
5721
  method: "DELETE",
5712
5722
  path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,
@@ -8033,7 +8043,7 @@ function createNeetruClient(config = {}) {
8033
8043
  init_errors();
8034
8044
  init_db_errors();
8035
8045
  init_http();
8036
- var VERSION = "3.4.3";
8046
+ var VERSION = "3.4.4";
8037
8047
 
8038
8048
  exports.DEFAULT_BASE_URL = DEFAULT_BASE_URL;
8039
8049
  exports.DEV_FIXTURE_USER = DEV_FIXTURE_USER;