@neetru/sdk 2.1.0 → 2.2.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 (70) hide show
  1. package/CHANGELOG.md +94 -1
  2. package/dist/auth.cjs +156 -7
  3. package/dist/auth.cjs.map +1 -1
  4. package/dist/auth.d.cts +5 -3
  5. package/dist/auth.d.ts +5 -3
  6. package/dist/auth.mjs +156 -8
  7. package/dist/auth.mjs.map +1 -1
  8. package/dist/catalog.cjs.map +1 -1
  9. package/dist/catalog.d.cts +2 -2
  10. package/dist/catalog.d.ts +2 -2
  11. package/dist/catalog.mjs.map +1 -1
  12. package/dist/checkout.cjs.map +1 -1
  13. package/dist/checkout.d.cts +2 -2
  14. package/dist/checkout.d.ts +2 -2
  15. package/dist/checkout.mjs.map +1 -1
  16. package/dist/{collection-ref-BBvTTXoG.d.cts → collection-ref-DqAAhuhX.d.cts} +56 -7
  17. package/dist/{collection-ref-BBvTTXoG.d.ts → collection-ref-DqAAhuhX.d.ts} +56 -7
  18. package/dist/db-react.d.cts +1 -1
  19. package/dist/db-react.d.ts +1 -1
  20. package/dist/db.cjs +29 -7
  21. package/dist/db.cjs.map +1 -1
  22. package/dist/db.d.cts +2 -2
  23. package/dist/db.d.ts +2 -2
  24. package/dist/db.mjs +29 -7
  25. package/dist/db.mjs.map +1 -1
  26. package/dist/entitlements.cjs.map +1 -1
  27. package/dist/entitlements.d.cts +2 -2
  28. package/dist/entitlements.d.ts +2 -2
  29. package/dist/entitlements.mjs.map +1 -1
  30. package/dist/errors.cjs.map +1 -1
  31. package/dist/errors.d.cts +1 -1
  32. package/dist/errors.d.ts +1 -1
  33. package/dist/errors.mjs.map +1 -1
  34. package/dist/index.cjs +172 -21
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.cts +3 -3
  37. package/dist/index.d.ts +3 -3
  38. package/dist/index.mjs +172 -21
  39. package/dist/index.mjs.map +1 -1
  40. package/dist/mocks.cjs +75 -14
  41. package/dist/mocks.cjs.map +1 -1
  42. package/dist/mocks.d.cts +22 -2
  43. package/dist/mocks.d.ts +22 -2
  44. package/dist/mocks.mjs +75 -14
  45. package/dist/mocks.mjs.map +1 -1
  46. package/dist/notifications.cjs.map +1 -1
  47. package/dist/notifications.d.cts +2 -2
  48. package/dist/notifications.d.ts +2 -2
  49. package/dist/notifications.mjs.map +1 -1
  50. package/dist/react.d.cts +2 -2
  51. package/dist/react.d.ts +2 -2
  52. package/dist/support.cjs.map +1 -1
  53. package/dist/support.d.cts +2 -2
  54. package/dist/support.d.ts +2 -2
  55. package/dist/support.mjs.map +1 -1
  56. package/dist/telemetry.cjs.map +1 -1
  57. package/dist/telemetry.d.cts +2 -2
  58. package/dist/telemetry.d.ts +2 -2
  59. package/dist/telemetry.mjs.map +1 -1
  60. package/dist/{types-B1jylbMC.d.ts → types-CvTje138.d.ts} +46 -2
  61. package/dist/{types-Kmt4y1FQ.d.cts → types-DlDxttiG.d.cts} +46 -2
  62. package/dist/usage.cjs.map +1 -1
  63. package/dist/usage.d.cts +2 -2
  64. package/dist/usage.d.ts +2 -2
  65. package/dist/usage.mjs.map +1 -1
  66. package/dist/webhooks.cjs.map +1 -1
  67. package/dist/webhooks.d.cts +2 -2
  68. package/dist/webhooks.d.ts +2 -2
  69. package/dist/webhooks.mjs.map +1 -1
  70. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.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 | 'unknown';\r\n\r\n/**\r\n * Erro tipado padrão do SDK. Sempre lançado em vez de Error genérico.\r\n *\r\n * @example\r\n * ```ts\r\n * try { await client.catalog.list(); }\r\n * catch (e) {\r\n * if (e instanceof NeetruError && e.code === 'rate_limited') retry();\r\n * }\r\n * ```\r\n */\r\nexport class NeetruError extends Error {\r\n public readonly code: NeetruErrorCode | string;\r\n public readonly status?: number;\r\n public readonly requestId?: string;\r\n\r\n constructor(\r\n code: NeetruErrorCode | string,\r\n message: string,\r\n status?: number,\r\n requestId?: string,\r\n ) {\r\n super(message);\r\n this.name = 'NeetruError';\r\n this.code = code;\r\n this.status = status;\r\n this.requestId = requestId;\r\n // Preserva o prototype chain ao herdar de Error (downlevel quirk de TS).\r\n Object.setPrototypeOf(this, NeetruError.prototype);\r\n }\r\n}\r\n","/**\r\n * 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. Default 2 retries (3 tentativas no total). Caller opta-out\r\n * com `retries: 0`.\r\n */\r\nimport { NeetruError, type NeetruErrorCode } from './errors';\r\nimport type { ResolvedConfig } from './types';\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`). Default 2 (= 3 tentativas total). Caller passa `0` pra\r\n * desativar (útil em operações não-idempotentes específicas).\r\n */\r\n retries?: number;\r\n}\r\n\r\nconst DEFAULT_RETRIES = 2;\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\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.round(secs * 1000);\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 delta;\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 === 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 const maxRetries = opts.retries ?? DEFAULT_RETRIES;\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 // 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 const parsed = await safeJson(res);\r\n return parsed as T;\r\n }\r\n\r\n const body = (await safeJson(res)) as\r\n | { error?: { code?: string; message?: string } | string }\r\n | undefined;\r\n let code: string = statusToCode(res.status);\r\n let message = `HTTP ${res.status}`;\r\n if (body && typeof body === 'object' && 'error' in body) {\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 }\r\n }\r\n const err = new NeetruError(code, message, res.status, requestId);\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\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). */\r\n get(intentId: string): Promise<CheckoutIntentInfo>;\r\n /** Cancela um intent que ainda não virou `stripe_redirected`. */\r\n cancel(intentId: string): Promise<{ ok: true; alreadyCancelled: boolean }>;\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 const raw = await httpRequest<RawStartCheckoutResponse>(config, {\r\n method: 'POST',\r\n path: '/api/v1/checkout/intents',\r\n body,\r\n requireAuth: 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): 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 raw = await httpRequest<RawGetCheckoutResponse>(config, {\r\n method: 'GET',\r\n path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,\r\n requireAuth: true,\r\n });\r\n return parseGetResponse(raw);\r\n },\r\n\r\n async cancel(intentId: string): 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 raw = await httpRequest<{ ok?: boolean; alreadyCancelled?: boolean }>(config, {\r\n method: 'DELETE',\r\n path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,\r\n requireAuth: true,\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): 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): 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/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 | 'unknown';\r\n\r\n/**\r\n * Erro tipado padrão do SDK. Sempre lançado em vez de Error genérico.\r\n *\r\n * @example\r\n * ```ts\r\n * try { await client.catalog.list(); }\r\n * catch (e) {\r\n * if (e instanceof NeetruError && e.code === 'rate_limited') retry();\r\n * }\r\n * ```\r\n */\r\nexport class NeetruError extends Error {\r\n public readonly code: NeetruErrorCode | string;\r\n public readonly status?: number;\r\n public readonly requestId?: string;\r\n\r\n constructor(\r\n code: NeetruErrorCode | string,\r\n message: string,\r\n status?: number,\r\n requestId?: string,\r\n ) {\r\n super(message);\r\n this.name = 'NeetruError';\r\n this.code = code;\r\n this.status = status;\r\n this.requestId = requestId;\r\n // Preserva o prototype chain ao herdar de Error (downlevel quirk de TS).\r\n Object.setPrototypeOf(this, NeetruError.prototype);\r\n }\r\n}\r\n","/**\r\n * 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. Default 2 retries (3 tentativas no total). Caller opta-out\r\n * com `retries: 0`.\r\n */\r\nimport { NeetruError, type NeetruErrorCode } from './errors';\r\nimport type { ResolvedConfig } from './types';\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`). Default 2 (= 3 tentativas total). Caller passa `0` pra\r\n * desativar (útil em operações não-idempotentes específicas).\r\n */\r\n retries?: number;\r\n}\r\n\r\nconst DEFAULT_RETRIES = 2;\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\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.round(secs * 1000);\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 delta;\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 === 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 const maxRetries = opts.retries ?? DEFAULT_RETRIES;\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 // 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 const parsed = await safeJson(res);\r\n return parsed as T;\r\n }\r\n\r\n const body = (await safeJson(res)) as\r\n | { error?: { code?: string; message?: string } | string }\r\n | undefined;\r\n let code: string = statusToCode(res.status);\r\n let message = `HTTP ${res.status}`;\r\n if (body && typeof body === 'object' && 'error' in body) {\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 }\r\n }\r\n const err = new NeetruError(code, message, res.status, requestId);\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\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). */\r\n get(intentId: string): Promise<CheckoutIntentInfo>;\r\n /** Cancela um intent que ainda não virou `stripe_redirected`. */\r\n cancel(intentId: string): Promise<{ ok: true; alreadyCancelled: boolean }>;\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 const raw = await httpRequest<RawStartCheckoutResponse>(config, {\r\n method: 'POST',\r\n path: '/api/v1/checkout/intents',\r\n body,\r\n requireAuth: 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): 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 raw = await httpRequest<RawGetCheckoutResponse>(config, {\r\n method: 'GET',\r\n path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,\r\n requireAuth: true,\r\n });\r\n return parseGetResponse(raw);\r\n },\r\n\r\n async cancel(intentId: string): 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 raw = await httpRequest<{ ok?: boolean; alreadyCancelled?: boolean }>(config, {\r\n method: 'DELETE',\r\n path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,\r\n requireAuth: true,\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): 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): 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"]}
@@ -293,12 +293,43 @@ interface DbGetResult<T = Record<string, unknown>> {
293
293
  }>;
294
294
  }
295
295
  type DbChangeType = 'added' | 'modified' | 'removed';
296
- interface DbBatchOp {
297
- op: 'add' | 'set' | 'update' | 'remove';
298
- collection: string;
299
- id?: string;
300
- data?: Record<string, unknown>;
301
- }
296
+ /**
297
+ * Operação atômica para uso em `DbCollectionRef.batch()`.
298
+ *
299
+ * Discriminated union pelo campo `kind` — cada variante deixa claro
300
+ * quais campos são obrigatórios:
301
+ *
302
+ * - `add` — insere com id gerado pelo cliente; `data` obrigatório.
303
+ * - `set` — cria ou sobrescreve pelo `id`; `data` obrigatório.
304
+ * - `update` — mescla campos em doc existente pelo `id`; `data` obrigatório.
305
+ * - `remove` — tombstone pelo `id`; sem `data`.
306
+ *
307
+ * @example
308
+ * ```ts
309
+ * const ops: DbBatchOp[] = [
310
+ * { kind: 'add', data: { name: 'produto A', price: 10 } },
311
+ * { kind: 'set', id: 'sku-1', data: { name: 'produto B', price: 20 } },
312
+ * { kind: 'update', id: 'sku-2', data: { price: 25 } },
313
+ * { kind: 'remove', id: 'sku-3' },
314
+ * ];
315
+ * await col.batch(ops);
316
+ * ```
317
+ */
318
+ type DbBatchOp<T = Record<string, unknown>> = {
319
+ kind: 'add';
320
+ data: Omit<T, 'id'>;
321
+ } | {
322
+ kind: 'set';
323
+ id: string;
324
+ data: Omit<T, 'id'>;
325
+ } | {
326
+ kind: 'update';
327
+ id: string;
328
+ data: Partial<Omit<T, 'id'>>;
329
+ } | {
330
+ kind: 'remove';
331
+ id: string;
332
+ };
302
333
  /**
303
334
  * Contrato do transporte de realtime — injetado no namespace.
304
335
  *
@@ -313,8 +344,26 @@ type RealtimeTransport = SyncTransport;
313
344
  /**
314
345
  * Referência a um documento específico.
315
346
  * Parte da superfície `DbCollectionRef.doc(id)`.
347
+ *
348
+ * Expõe as propriedades de identidade do documento de forma análoga ao
349
+ * `DocumentReference` do Firestore SDK, evitando a necessidade de adaptadores
350
+ * externos que reattachavam `collection` + `id` manualmente.
351
+ *
352
+ * @example
353
+ * ```ts
354
+ * const ref = orders.doc('order-123');
355
+ * console.log(ref.id); // "order-123"
356
+ * console.log(ref.collection); // "orders"
357
+ * console.log(ref.path); // "orders/order-123"
358
+ * ```
316
359
  */
317
360
  interface DbDocRef<T = Record<string, unknown>> {
361
+ /** ID do documento dentro da coleção. */
362
+ readonly id: string;
363
+ /** Caminho completo no formato "collection/docId". */
364
+ readonly path: string;
365
+ /** Nome da coleção parent. */
366
+ readonly collection: string;
318
367
  get(): Promise<DbGetResult<T> | null>;
319
368
  set(data: Omit<T, 'id'>): Promise<{
320
369
  ok: true;
@@ -355,7 +404,7 @@ interface DbCollectionRef<T = Record<string, unknown>> {
355
404
  ok: true;
356
405
  }>;
357
406
  /** Aplica múltiplas operações atomicamente na fila. */
358
- batch(ops: DbBatchOp[]): Promise<{
407
+ batch(ops: DbBatchOp<T>[]): Promise<{
359
408
  ok: true;
360
409
  }>;
361
410
  /** Escuta um documento específico. */
@@ -293,12 +293,43 @@ interface DbGetResult<T = Record<string, unknown>> {
293
293
  }>;
294
294
  }
295
295
  type DbChangeType = 'added' | 'modified' | 'removed';
296
- interface DbBatchOp {
297
- op: 'add' | 'set' | 'update' | 'remove';
298
- collection: string;
299
- id?: string;
300
- data?: Record<string, unknown>;
301
- }
296
+ /**
297
+ * Operação atômica para uso em `DbCollectionRef.batch()`.
298
+ *
299
+ * Discriminated union pelo campo `kind` — cada variante deixa claro
300
+ * quais campos são obrigatórios:
301
+ *
302
+ * - `add` — insere com id gerado pelo cliente; `data` obrigatório.
303
+ * - `set` — cria ou sobrescreve pelo `id`; `data` obrigatório.
304
+ * - `update` — mescla campos em doc existente pelo `id`; `data` obrigatório.
305
+ * - `remove` — tombstone pelo `id`; sem `data`.
306
+ *
307
+ * @example
308
+ * ```ts
309
+ * const ops: DbBatchOp[] = [
310
+ * { kind: 'add', data: { name: 'produto A', price: 10 } },
311
+ * { kind: 'set', id: 'sku-1', data: { name: 'produto B', price: 20 } },
312
+ * { kind: 'update', id: 'sku-2', data: { price: 25 } },
313
+ * { kind: 'remove', id: 'sku-3' },
314
+ * ];
315
+ * await col.batch(ops);
316
+ * ```
317
+ */
318
+ type DbBatchOp<T = Record<string, unknown>> = {
319
+ kind: 'add';
320
+ data: Omit<T, 'id'>;
321
+ } | {
322
+ kind: 'set';
323
+ id: string;
324
+ data: Omit<T, 'id'>;
325
+ } | {
326
+ kind: 'update';
327
+ id: string;
328
+ data: Partial<Omit<T, 'id'>>;
329
+ } | {
330
+ kind: 'remove';
331
+ id: string;
332
+ };
302
333
  /**
303
334
  * Contrato do transporte de realtime — injetado no namespace.
304
335
  *
@@ -313,8 +344,26 @@ type RealtimeTransport = SyncTransport;
313
344
  /**
314
345
  * Referência a um documento específico.
315
346
  * Parte da superfície `DbCollectionRef.doc(id)`.
347
+ *
348
+ * Expõe as propriedades de identidade do documento de forma análoga ao
349
+ * `DocumentReference` do Firestore SDK, evitando a necessidade de adaptadores
350
+ * externos que reattachavam `collection` + `id` manualmente.
351
+ *
352
+ * @example
353
+ * ```ts
354
+ * const ref = orders.doc('order-123');
355
+ * console.log(ref.id); // "order-123"
356
+ * console.log(ref.collection); // "orders"
357
+ * console.log(ref.path); // "orders/order-123"
358
+ * ```
316
359
  */
317
360
  interface DbDocRef<T = Record<string, unknown>> {
361
+ /** ID do documento dentro da coleção. */
362
+ readonly id: string;
363
+ /** Caminho completo no formato "collection/docId". */
364
+ readonly path: string;
365
+ /** Nome da coleção parent. */
366
+ readonly collection: string;
318
367
  get(): Promise<DbGetResult<T> | null>;
319
368
  set(data: Omit<T, 'id'>): Promise<{
320
369
  ok: true;
@@ -355,7 +404,7 @@ interface DbCollectionRef<T = Record<string, unknown>> {
355
404
  ok: true;
356
405
  }>;
357
406
  /** Aplica múltiplas operações atomicamente na fila. */
358
- batch(ops: DbBatchOp[]): Promise<{
407
+ batch(ops: DbBatchOp<T>[]): Promise<{
359
408
  ok: true;
360
409
  }>;
361
410
  /** Escuta um documento específico. */
@@ -1,4 +1,4 @@
1
- import { S as SyncState, U as Unsubscribe, d as DbDoc, c as DbCollectionRef, h as DbQuery } from './collection-ref-BBvTTXoG.cjs';
1
+ import { S as SyncState, U as Unsubscribe, d as DbDoc, c as DbCollectionRef, h as DbQuery } from './collection-ref-DqAAhuhX.cjs';
2
2
 
3
3
  /**
4
4
  * Resultado de `useDocument`.
@@ -1,4 +1,4 @@
1
- import { S as SyncState, U as Unsubscribe, d as DbDoc, c as DbCollectionRef, h as DbQuery } from './collection-ref-BBvTTXoG.js';
1
+ import { S as SyncState, U as Unsubscribe, d as DbDoc, c as DbCollectionRef, h as DbQuery } from './collection-ref-DqAAhuhX.js';
2
2
 
3
3
  /**
4
4
  * Resultado de `useDocument`.
package/dist/db.cjs CHANGED
@@ -2377,10 +2377,9 @@ var DbCollectionRefImpl = class {
2377
2377
  const batchId = `batch-${Date.now()}-${Math.random().toString(36).slice(2)}`;
2378
2378
  const busChanges = [];
2379
2379
  for (const op of ops) {
2380
- const id = op.id ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`;
2381
- const data = op.data ?? {};
2382
- const collection = op.collection;
2383
- if (op.op === "add") {
2380
+ const collection = this._collection;
2381
+ if (op.kind === "add") {
2382
+ const data = op.data;
2384
2383
  const mutation = await this._queue.enqueue({
2385
2384
  collection,
2386
2385
  op: "add",
@@ -2404,7 +2403,9 @@ var DbCollectionRefImpl = class {
2404
2403
  }
2405
2404
  });
2406
2405
  busChanges.push({ type: "added", collection, doc: { id: docId, data } });
2407
- } else if (op.op === "set") {
2406
+ } else if (op.kind === "set") {
2407
+ const id = op.id;
2408
+ const data = op.data;
2408
2409
  const existing = await this._store.getDoc(collection, id);
2409
2410
  const mutation = await this._queue.enqueue({
2410
2411
  collection,
@@ -2433,7 +2434,9 @@ var DbCollectionRefImpl = class {
2433
2434
  collection,
2434
2435
  doc: { id, data }
2435
2436
  });
2436
- } else if (op.op === "update") {
2437
+ } else if (op.kind === "update") {
2438
+ const id = op.id;
2439
+ const data = op.data;
2437
2440
  const existing = await this._store.getDoc(collection, id);
2438
2441
  const merged = { ...existing?.data ?? {}, ...data };
2439
2442
  const mutation = await this._queue.enqueue({
@@ -2462,7 +2465,8 @@ var DbCollectionRefImpl = class {
2462
2465
  }
2463
2466
  });
2464
2467
  busChanges.push({ type: "modified", collection, doc: { id, data: merged } });
2465
- } else if (op.op === "remove") {
2468
+ } else if (op.kind === "remove") {
2469
+ const id = op.id;
2466
2470
  const existing = await this._store.getDoc(collection, id);
2467
2471
  await this._queue.enqueue({
2468
2472
  collection,
@@ -2571,6 +2575,15 @@ var DbCollectionRefImpl = class {
2571
2575
  assertValidId(id);
2572
2576
  const self = this;
2573
2577
  return {
2578
+ get id() {
2579
+ return id;
2580
+ },
2581
+ get path() {
2582
+ return `${self._collection}/${id}`;
2583
+ },
2584
+ get collection() {
2585
+ return self._collection;
2586
+ },
2574
2587
  async get() {
2575
2588
  return self._buildGetResult(id);
2576
2589
  },
@@ -3707,6 +3720,15 @@ function createLazyCollectionRef(name, getDocsPromise) {
3707
3720
  },
3708
3721
  doc(id) {
3709
3722
  return {
3723
+ get id() {
3724
+ return id;
3725
+ },
3726
+ get path() {
3727
+ return `${name}/${id}`;
3728
+ },
3729
+ get collection() {
3730
+ return name;
3731
+ },
3710
3732
  async get() {
3711
3733
  return (await getRef()).doc(id).get();
3712
3734
  },