@neetru/sdk 1.1.1 → 1.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 (83) hide show
  1. package/CHANGELOG.md +33 -3
  2. package/README.md +135 -159
  3. package/dist/auth.cjs +482 -42
  4. package/dist/auth.cjs.map +1 -1
  5. package/dist/auth.d.cts +1 -1
  6. package/dist/auth.d.ts +1 -1
  7. package/dist/auth.mjs +482 -42
  8. package/dist/auth.mjs.map +1 -1
  9. package/dist/catalog.cjs +63 -24
  10. package/dist/catalog.cjs.map +1 -1
  11. package/dist/catalog.d.cts +2 -2
  12. package/dist/catalog.d.ts +2 -2
  13. package/dist/catalog.mjs +63 -24
  14. package/dist/catalog.mjs.map +1 -1
  15. package/dist/checkout.cjs +60 -18
  16. package/dist/checkout.cjs.map +1 -1
  17. package/dist/checkout.d.cts +1 -1
  18. package/dist/checkout.d.ts +1 -1
  19. package/dist/checkout.mjs +60 -18
  20. package/dist/checkout.mjs.map +1 -1
  21. package/dist/db.cjs +66 -25
  22. package/dist/db.cjs.map +1 -1
  23. package/dist/db.d.cts +1 -1
  24. package/dist/db.d.ts +1 -1
  25. package/dist/db.mjs +66 -25
  26. package/dist/db.mjs.map +1 -1
  27. package/dist/entitlements.cjs +101 -24
  28. package/dist/entitlements.cjs.map +1 -1
  29. package/dist/entitlements.d.cts +11 -5
  30. package/dist/entitlements.d.ts +11 -5
  31. package/dist/entitlements.mjs +101 -24
  32. package/dist/entitlements.mjs.map +1 -1
  33. package/dist/index.cjs +487 -43
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.cts +3 -3
  36. package/dist/index.d.ts +3 -3
  37. package/dist/index.mjs +484 -44
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/mocks.cjs +3 -2
  40. package/dist/mocks.cjs.map +1 -1
  41. package/dist/mocks.d.cts +4 -2
  42. package/dist/mocks.d.ts +4 -2
  43. package/dist/mocks.mjs +3 -2
  44. package/dist/mocks.mjs.map +1 -1
  45. package/dist/notifications.cjs +296 -0
  46. package/dist/notifications.cjs.map +1 -0
  47. package/dist/notifications.d.cts +1 -0
  48. package/dist/notifications.d.ts +1 -0
  49. package/dist/notifications.mjs +293 -0
  50. package/dist/notifications.mjs.map +1 -0
  51. package/dist/react.cjs +7 -3
  52. package/dist/react.cjs.map +1 -1
  53. package/dist/react.d.cts +1 -1
  54. package/dist/react.d.ts +1 -1
  55. package/dist/react.mjs +7 -3
  56. package/dist/react.mjs.map +1 -1
  57. package/dist/support.cjs +60 -18
  58. package/dist/support.cjs.map +1 -1
  59. package/dist/support.d.cts +1 -1
  60. package/dist/support.d.ts +1 -1
  61. package/dist/support.mjs +60 -18
  62. package/dist/support.mjs.map +1 -1
  63. package/dist/telemetry.cjs +130 -19
  64. package/dist/telemetry.cjs.map +1 -1
  65. package/dist/telemetry.d.cts +17 -1
  66. package/dist/telemetry.d.ts +17 -1
  67. package/dist/telemetry.mjs +130 -19
  68. package/dist/telemetry.mjs.map +1 -1
  69. package/dist/{types-BA53dd8S.d.cts → types-CQAfwqUS.d.cts} +172 -8
  70. package/dist/{types-BA53dd8S.d.ts → types-CQAfwqUS.d.ts} +172 -8
  71. package/dist/usage.cjs +60 -18
  72. package/dist/usage.cjs.map +1 -1
  73. package/dist/usage.d.cts +1 -1
  74. package/dist/usage.d.ts +1 -1
  75. package/dist/usage.mjs +60 -18
  76. package/dist/usage.mjs.map +1 -1
  77. package/dist/webhooks.cjs +316 -0
  78. package/dist/webhooks.cjs.map +1 -0
  79. package/dist/webhooks.d.cts +1 -0
  80. package/dist/webhooks.d.ts +1 -0
  81. package/dist/webhooks.mjs +312 -0
  82. package/dist/webhooks.mjs.map +1 -0
  83. package/package.json +12 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/checkout.ts"],"names":[],"mappings":"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","file":"checkout.cjs","sourcesContent":["/**\n * Erros tipados do SDK.\n *\n * Todo erro lançado pelo SDK estende `NeetruError` — caller pode discriminar\n * por `.code` (string estável) sem parsing de message.\n */\n\n/** Códigos de erro estáveis do SDK. Adicionar aqui requer minor bump. */\nexport type NeetruErrorCode =\n | 'invalid_config'\n | 'missing_api_key'\n | 'unauthorized'\n | 'forbidden'\n | 'not_found'\n | 'rate_limited'\n | 'validation_failed'\n | 'network_error'\n | 'invalid_response'\n | 'server_error'\n | 'unknown';\n\n/**\n * Erro tipado padrão do SDK. Sempre lançado em vez de Error genérico.\n *\n * @example\n * ```ts\n * try { await client.catalog.list(); }\n * catch (e) {\n * if (e instanceof NeetruError && e.code === 'rate_limited') retry();\n * }\n * ```\n */\nexport class NeetruError extends Error {\n public readonly code: NeetruErrorCode | string;\n public readonly status?: number;\n public readonly requestId?: string;\n\n constructor(\n code: NeetruErrorCode | string,\n message: string,\n status?: number,\n requestId?: string,\n ) {\n super(message);\n this.name = 'NeetruError';\n this.code = code;\n this.status = status;\n this.requestId = requestId;\n // Preserva o prototype chain ao herdar de Error (downlevel quirk de TS).\n Object.setPrototypeOf(this, NeetruError.prototype);\n }\n}\n","/**\n * HTTP transport interno do SDK.\n *\n * Responsabilidades:\n * - Construir URL absoluta a partir de `baseUrl` + path\n * - Injetar Bearer token quando `requireAuth=true`\n * - Mapear status HTTP → `NeetruError` com `code` estável\n * - Parse defensivo de JSON (não lança em body vazio em 204)\n *\n * Não faz retry/backoff em v0.1 (carry-over Sprint 3+).\n */\nimport { NeetruError, type NeetruErrorCode } from './errors';\nimport type { ResolvedConfig } from './types';\n\n/** Opções da request HTTP. */\nexport interface HttpRequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n /** Path relativo (ex: `/api/v1/cli/catalog`). Concatenado a `baseUrl`. */\n path: string;\n /** Query string params (chave → valor primitivo). Valores `undefined` ignorados. */\n query?: Record<string, string | number | boolean | undefined>;\n /** Body JSON-serializável. Ignorado em GET/DELETE. */\n body?: unknown;\n /**\n * Se true, injeta `Authorization: Bearer <apiKey>`. Lança `missing_api_key`\n * se config.apiKey ausente. Default false.\n */\n requireAuth?: boolean;\n /** Cabeçalhos extras. */\n headers?: Record<string, string>;\n}\n\n/** Mapeamento status → code estável do NeetruError. */\nfunction statusToCode(status: number): NeetruErrorCode {\n if (status === 401) return 'unauthorized';\n if (status === 403) return 'forbidden';\n if (status === 404) return 'not_found';\n if (status === 422 || status === 400) return 'validation_failed';\n if (status === 429) return 'rate_limited';\n if (status >= 500) return 'server_error';\n return 'unknown';\n}\n\nfunction buildUrl(baseUrl: string, path: string, query?: HttpRequestOptions['query']): string {\n // Trim trailing slash em base e leading em path pra evitar `//`.\n const base = baseUrl.replace(/\\/+$/, '');\n const p = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(`${base}${p}`);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\n/** Parse JSON defensivo — retorna `undefined` em body vazio. */\nasync function safeJson(res: Response): Promise<unknown> {\n const text = await res.text();\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Executa request HTTP. Em sucesso retorna body parseado; em erro lança\n * `NeetruError` com `code` derivado do status.\n */\nexport async function httpRequest<T>(\n config: ResolvedConfig,\n opts: HttpRequestOptions,\n): Promise<T> {\n const method = opts.method ?? 'GET';\n const url = buildUrl(config.baseUrl, opts.path, opts.query);\n\n const headers: Record<string, string> = {\n accept: 'application/json',\n ...opts.headers,\n };\n\n if (opts.requireAuth) {\n if (!config.apiKey) {\n throw new NeetruError(\n 'missing_api_key',\n 'This operation requires an apiKey. Pass it to createNeetruClient({ apiKey }) or set NEETRU_API_KEY env var.',\n );\n }\n headers.authorization = `Bearer ${config.apiKey}`;\n }\n\n const init: RequestInit = { method, headers };\n if (opts.body !== undefined && method !== 'GET' && method !== 'DELETE') {\n headers['content-type'] = 'application/json';\n init.body = JSON.stringify(opts.body);\n }\n\n // BUG-020 fix (2026-05-13): timeout default 30s. Sem isso, em SSR/ISR do\n // Next.js o request pode travar a request inteira; em build estático\n // bloqueia o pipeline. AbortSignal.timeout requer Node 18+ ou browsers\n // recentes — alvo do SDK é Node 18+ e Chrome/Firefox/Safari modernos.\n init.signal = AbortSignal.timeout(30_000);\n\n let res: Response;\n try {\n res = await config.fetch(url, init);\n } catch (err) {\n if (err instanceof DOMException && err.name === 'TimeoutError') {\n throw new NeetruError('network_error', 'Network error: timeout after 30s');\n }\n const message = err instanceof Error ? err.message : 'fetch failed';\n throw new NeetruError('network_error', `Network error: ${message}`);\n }\n\n const requestId = res.headers.get('x-request-id') ?? res.headers.get('x-correlation-id') ?? undefined;\n\n if (!res.ok) {\n const body = (await safeJson(res)) as { error?: { code?: string; message?: string } | string } | undefined;\n let code: string = statusToCode(res.status);\n let message = `HTTP ${res.status}`;\n if (body && typeof body === 'object' && 'error' in body) {\n const errField = body.error;\n if (typeof errField === 'string') {\n message = errField;\n } else if (errField && typeof errField === 'object') {\n if (typeof errField.code === 'string') code = errField.code;\n if (typeof errField.message === 'string') message = errField.message;\n }\n }\n throw new NeetruError(code, message, res.status, requestId);\n }\n\n const parsed = await safeJson(res);\n // Caller é responsável por validar shape; SDK assume backend correto.\n return parsed as T;\n}\n","/**\n * Checkout namespace (v1.1) — `client.checkout.*`\n *\n * Fluxo canônico (vide `docs/FLUXO_SIGNUP_BILLING_CHECKOUT.md` §6):\n * 1. SaaS produto chama `client.checkout.start({productId, planId, callbackUrl})`.\n * 2. SDK posta em `POST /api/v1/checkout/intents` (Bearer access_token OIDC).\n * 3. Core cria `checkout_intents/{intentId}` (TTL 15min) + retorna `redirectUrl`.\n * 4. Em browser, SDK redireciona automaticamente pra `redirectUrl`. Em\n * Node/SSR, retorna o objeto `{intentId, redirectUrl}` sem redirect.\n * 5. Portal (`minhaconta.neetru.com/portal/kyc/{intentId}`) coleta KYC + cartão.\n * 6. Usuário volta pra `callbackUrl?status=success&intentId=...` quando completo.\n *\n * **Dev mode** (`NEETRU_ENV=dev`): `start()` retorna URL fake sem network call.\n * Útil pra dev externo SaaS testar UI sem provisionar conta Neetru.\n *\n * **Estabilidade**: minor bump v1.0 → v1.1 (feature add, sem breaking).\n */\nimport { NeetruError } from './errors';\nimport { httpRequest } from './http';\nimport type { ResolvedConfig } from './types';\n\n// ─── Types públicos ─────────────────────────────────────────────────────────\n\n/** Tipo do tenant alvo da subscription (PF=uid, PJ=orgId). */\nexport type CheckoutTenantType = 'pf' | 'pj';\n\n/** Status do `checkout_intents/{intentId}` no Core. */\nexport type CheckoutIntentStatus =\n | 'pending'\n | 'kyc_in_progress'\n | 'stripe_redirected'\n | 'completed'\n | 'expired'\n | 'cancelled';\n\nexport interface CheckoutStartInput {\n /** Slug do produto no catálogo (ex: `neetru-pulse`). */\n productId: string;\n /** Slug do plano no catálogo do produto (ex: `pro_monthly`). */\n planId: string;\n /** Pra onde o produto SaaS quer voltar pós-checkout. https obrigatório (ou http://localhost em dev). */\n callbackUrl: string;\n /** Override pra checkout em nome de uma org. Default: PF do uid logado. */\n tenantType?: CheckoutTenantType;\n /** Quando `tenantType='pj'`, id da org. Ignorado quando PF. */\n tenantId?: string;\n /**\n * Em browsers, default `true` — SDK faz `window.location.href = redirectUrl`.\n * Passe `false` se quiser controlar o redirect manualmente.\n */\n autoRedirect?: boolean;\n}\n\nexport interface CheckoutStartResult {\n intentId: string;\n redirectUrl: string;\n status: CheckoutIntentStatus;\n expiresAt: string;\n /** True se KYC ainda precisa ser coletado no portal. UI pode mostrar hint. */\n requiresKyc: boolean;\n}\n\nexport interface CheckoutIntentInfo {\n intentId: string;\n uid: string;\n targetTenantId: string;\n targetTenantType: CheckoutTenantType;\n productId: string;\n planId: string;\n callbackUrl: string;\n status: CheckoutIntentStatus;\n /** Stripe Checkout Session id quando avançou pra `stripe_redirected`. */\n stripeSessionId?: string | null;\n expiresAt: string;\n /** True se já passou `expiresAt` mas Core ainda não marcou expired. */\n isStale?: boolean;\n}\n\nexport interface CheckoutNamespace {\n /**\n * Inicia checkout. Em browser, redireciona automaticamente pro portal.\n * Em Node/SSR, retorna o resultado sem efeitos colaterais — caller decide\n * o que fazer com `redirectUrl`.\n *\n * Dev mode (`NEETRU_ENV=dev`): retorna URL fake `https://localhost:9003/portal/checkout/mock-XXXX`.\n */\n start(input: CheckoutStartInput): Promise<CheckoutStartResult>;\n /** Lê estado atual do intent (Core). */\n get(intentId: string): Promise<CheckoutIntentInfo>;\n /** Cancela um intent que ainda não virou `stripe_redirected`. */\n cancel(intentId: string): Promise<{ ok: true; alreadyCancelled: boolean }>;\n}\n\n// ─── Implementação real (HTTP) ─────────────────────────────────────────────\n\ninterface RawStartCheckoutResponse {\n ok?: boolean;\n intentId?: string;\n redirectUrl?: string;\n status?: string;\n expiresAt?: string;\n requiresKyc?: boolean;\n}\n\ninterface RawGetCheckoutResponse {\n ok?: boolean;\n intent?: {\n intentId?: string;\n uid?: string;\n targetTenantId?: string;\n targetTenantType?: string;\n productId?: string;\n planId?: string;\n callbackUrl?: string;\n status?: string;\n stripeSessionId?: string | null;\n expiresAt?: string;\n };\n isStale?: boolean;\n}\n\nfunction parseStartResponse(raw: unknown): CheckoutStartResult {\n if (!raw || typeof raw !== 'object') {\n throw new NeetruError('invalid_response', 'checkout.start response is not an object');\n }\n const r = raw as RawStartCheckoutResponse;\n if (typeof r.intentId !== 'string' || !r.intentId) {\n throw new NeetruError('invalid_response', 'checkout.start response missing intentId');\n }\n if (typeof r.redirectUrl !== 'string' || !r.redirectUrl) {\n throw new NeetruError('invalid_response', 'checkout.start response missing redirectUrl');\n }\n return {\n intentId: r.intentId,\n redirectUrl: r.redirectUrl,\n status: (r.status as CheckoutIntentStatus | undefined) ?? 'pending',\n expiresAt: typeof r.expiresAt === 'string' ? r.expiresAt : new Date().toISOString(),\n requiresKyc: r.requiresKyc === true,\n };\n}\n\nfunction parseGetResponse(raw: unknown): CheckoutIntentInfo {\n if (!raw || typeof raw !== 'object') {\n throw new NeetruError('invalid_response', 'checkout.get response is not an object');\n }\n const r = raw as RawGetCheckoutResponse;\n const intent = r.intent;\n if (!intent || typeof intent !== 'object') {\n throw new NeetruError('invalid_response', 'checkout.get response missing intent');\n }\n if (typeof intent.intentId !== 'string') {\n throw new NeetruError('invalid_response', 'checkout.get response missing intentId');\n }\n return {\n intentId: intent.intentId,\n uid: intent.uid ?? '',\n targetTenantId: intent.targetTenantId ?? '',\n targetTenantType: (intent.targetTenantType as CheckoutTenantType | undefined) ?? 'pf',\n productId: intent.productId ?? '',\n planId: intent.planId ?? '',\n callbackUrl: intent.callbackUrl ?? '',\n status: (intent.status as CheckoutIntentStatus | undefined) ?? 'pending',\n stripeSessionId: intent.stripeSessionId ?? null,\n expiresAt: intent.expiresAt ?? new Date().toISOString(),\n isStale: r.isStale === true,\n };\n}\n\n/**\n * Detecta se estamos em browser context. Em SSR / Node / Edge, `window`\n * pode não existir — fazemos check defensivo.\n */\nfunction inBrowser(): boolean {\n try {\n return (\n typeof globalThis !== 'undefined' &&\n typeof (globalThis as { window?: { location?: { href?: string } } }).window !== 'undefined' &&\n typeof globalThis.location !== 'undefined' &&\n typeof globalThis.location.assign === 'function'\n );\n } catch {\n return false;\n }\n}\n\nfunction performRedirect(url: string): void {\n try {\n globalThis.location.assign(url);\n } catch {\n /* noop em runtimes sem location.assign — caller decide */\n }\n}\n\n/**\n * Implementação HTTP real. Posta no Core, parse response, redireciona se browser.\n */\nfunction createHttpCheckoutNamespace(config: ResolvedConfig): CheckoutNamespace {\n return {\n async start(input: CheckoutStartInput): Promise<CheckoutStartResult> {\n if (!input?.productId) {\n throw new NeetruError('validation_failed', 'checkout.start: productId is required');\n }\n if (!input?.planId) {\n throw new NeetruError('validation_failed', 'checkout.start: planId is required');\n }\n if (!input?.callbackUrl) {\n throw new NeetruError('validation_failed', 'checkout.start: callbackUrl is required');\n }\n\n const body: Record<string, unknown> = {\n productId: input.productId,\n planId: input.planId,\n callbackUrl: input.callbackUrl,\n };\n if (input.tenantType) body.targetTenantType = input.tenantType;\n if (input.tenantId) body.targetTenantId = input.tenantId;\n\n const raw = await httpRequest<RawStartCheckoutResponse>(config, {\n method: 'POST',\n path: '/api/v1/checkout/intents',\n body,\n requireAuth: true,\n });\n const result = parseStartResponse(raw);\n\n const shouldRedirect = input.autoRedirect !== false;\n if (shouldRedirect && inBrowser()) {\n performRedirect(result.redirectUrl);\n }\n return result;\n },\n\n async get(intentId: string): Promise<CheckoutIntentInfo> {\n if (!intentId || typeof intentId !== 'string') {\n throw new NeetruError('validation_failed', 'checkout.get: intentId is required');\n }\n const raw = await httpRequest<RawGetCheckoutResponse>(config, {\n method: 'GET',\n path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,\n requireAuth: true,\n });\n return parseGetResponse(raw);\n },\n\n async cancel(intentId: string): Promise<{ ok: true; alreadyCancelled: boolean }> {\n if (!intentId || typeof intentId !== 'string') {\n throw new NeetruError('validation_failed', 'checkout.cancel: intentId is required');\n }\n const raw = await httpRequest<{ ok?: boolean; alreadyCancelled?: boolean }>(config, {\n method: 'DELETE',\n path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,\n requireAuth: true,\n });\n return {\n ok: true,\n alreadyCancelled: (raw as { alreadyCancelled?: boolean })?.alreadyCancelled === true,\n };\n },\n };\n}\n\n// ─── Mock dev (sem network) ─────────────────────────────────────────────────\n\n/**\n * Mock dev — retorna URL fake `https://localhost:9003/portal/checkout/mock-XXXX`\n * sem tocar no Core. Útil pra dev externo SaaS testar UI/redirect sem precisar\n * de Bearer token Neetru.\n *\n * Dev mode persiste intents em mapa in-memory pro `get`/`cancel` retornarem\n * resultado consistente.\n */\nexport class MockCheckout implements CheckoutNamespace {\n private readonly intents = new Map<string, CheckoutIntentInfo>();\n\n async start(input: CheckoutStartInput): Promise<CheckoutStartResult> {\n if (!input?.productId) {\n throw new NeetruError('validation_failed', 'checkout.start: productId is required');\n }\n if (!input?.planId) {\n throw new NeetruError('validation_failed', 'checkout.start: planId is required');\n }\n if (!input?.callbackUrl) {\n throw new NeetruError('validation_failed', 'checkout.start: callbackUrl is required');\n }\n\n const intentId = `chk_mock_${Math.random().toString(36).slice(2, 10)}`;\n const expiresAt = new Date(Date.now() + 15 * 60 * 1000).toISOString();\n const redirectUrl = `https://localhost:9003/portal/checkout/${intentId}`;\n\n this.intents.set(intentId, {\n intentId,\n uid: 'dev-fixture-uid',\n targetTenantId: input.tenantId ?? 'dev-fixture-uid',\n targetTenantType: input.tenantType ?? 'pf',\n productId: input.productId,\n planId: input.planId,\n callbackUrl: input.callbackUrl,\n status: 'pending',\n stripeSessionId: null,\n expiresAt,\n });\n\n return {\n intentId,\n redirectUrl,\n status: 'pending',\n expiresAt,\n requiresKyc: false,\n };\n }\n\n async get(intentId: string): Promise<CheckoutIntentInfo> {\n const found = this.intents.get(intentId);\n if (!found) {\n throw new NeetruError('not_found', `Mock intent ${intentId} not found`);\n }\n return { ...found };\n }\n\n async cancel(intentId: string): Promise<{ ok: true; alreadyCancelled: boolean }> {\n const found = this.intents.get(intentId);\n if (!found) {\n throw new NeetruError('not_found', `Mock intent ${intentId} not found`);\n }\n const alreadyCancelled = found.status === 'cancelled';\n this.intents.set(intentId, { ...found, status: 'cancelled' });\n return { ok: true, alreadyCancelled };\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────────────────\n\nexport function createCheckoutNamespace(config: ResolvedConfig): CheckoutNamespace {\n if (config.env === 'dev') return new MockCheckout();\n return createHttpCheckoutNamespace(config);\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/checkout.ts"],"names":["err","message"],"mappings":"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","file":"checkout.cjs","sourcesContent":["/**\n * Erros tipados do SDK.\n *\n * Todo erro lançado pelo SDK estende `NeetruError` — caller pode discriminar\n * por `.code` (string estável) sem parsing de message.\n */\n\n/** Códigos de erro estáveis do SDK. Adicionar aqui requer minor bump. */\nexport type NeetruErrorCode =\n | 'invalid_config'\n | 'missing_api_key'\n | 'unauthorized'\n | 'forbidden'\n | 'not_found'\n | 'rate_limited'\n | 'validation_failed'\n | 'network_error'\n | 'invalid_response'\n | 'server_error'\n | 'unknown';\n\n/**\n * Erro tipado padrão do SDK. Sempre lançado em vez de Error genérico.\n *\n * @example\n * ```ts\n * try { await client.catalog.list(); }\n * catch (e) {\n * if (e instanceof NeetruError && e.code === 'rate_limited') retry();\n * }\n * ```\n */\nexport class NeetruError extends Error {\n public readonly code: NeetruErrorCode | string;\n public readonly status?: number;\n public readonly requestId?: string;\n\n constructor(\n code: NeetruErrorCode | string,\n message: string,\n status?: number,\n requestId?: string,\n ) {\n super(message);\n this.name = 'NeetruError';\n this.code = code;\n this.status = status;\n this.requestId = requestId;\n // Preserva o prototype chain ao herdar de Error (downlevel quirk de TS).\n Object.setPrototypeOf(this, NeetruError.prototype);\n }\n}\n","/**\n * HTTP transport interno do SDK.\n *\n * Responsabilidades:\n * - Construir URL absoluta a partir de `baseUrl` + path\n * - Injetar Bearer token quando `requireAuth=true`\n * - Mapear status HTTP → `NeetruError` com `code` estável\n * - Parse defensivo de JSON (não lança em body vazio em 204)\n * - Retry/backoff exponencial em `rate_limited` (429), `server_error` (5xx)\n * e `network_error` (timeout/falha de rede). Honra `Retry-After` quando\n * presente. Default 2 retries (3 tentativas no total). Caller opta-out\n * com `retries: 0`.\n */\nimport { NeetruError, type NeetruErrorCode } from './errors';\nimport type { ResolvedConfig } from './types';\n\n/** Opções da request HTTP. */\nexport interface HttpRequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n /** Path relativo (ex: `/api/v1/cli/catalog`). Concatenado a `baseUrl`. */\n path: string;\n /** Query string params (chave → valor primitivo). Valores `undefined` ignorados. */\n query?: Record<string, string | number | boolean | undefined>;\n /** Body JSON-serializável. Ignorado em GET/DELETE. */\n body?: unknown;\n /**\n * Se true, injeta `Authorization: Bearer <apiKey>`. Lança `missing_api_key`\n * se config.apiKey ausente. Default false.\n */\n requireAuth?: boolean;\n /** Cabeçalhos extras. */\n headers?: Record<string, string>;\n /**\n * Número de retries em códigos transientes (`rate_limited`, `server_error`,\n * `network_error`). Default 2 (= 3 tentativas total). Caller passa `0` pra\n * desativar (útil em operações não-idempotentes específicas).\n */\n retries?: number;\n}\n\nconst DEFAULT_RETRIES = 2;\nconst RETRYABLE_CODES = new Set<NeetruErrorCode>([\n 'rate_limited',\n 'server_error',\n 'network_error',\n]);\n\n/** Backoff exponencial com jitter ±20%. attempt: 0=primeira, 1=primeiro retry, ... */\nfunction backoffMs(attempt: number): number {\n const base = 200 * Math.pow(4, attempt); // 200ms, 800ms, 3.2s, ...\n const jitter = base * 0.2 * (Math.random() * 2 - 1);\n return Math.max(50, Math.round(base + jitter));\n}\n\n/**\n * Honra `Retry-After` header (segundos ou HTTP-date). Retorna ms ou null se\n * inválido. RFC 9110 §10.2.3.\n */\nfunction parseRetryAfter(value: string | null): number | null {\n if (!value) return null;\n const secs = Number(value);\n if (Number.isFinite(secs) && secs >= 0) return Math.round(secs * 1000);\n const dateMs = Date.parse(value);\n if (Number.isFinite(dateMs)) {\n const delta = dateMs - Date.now();\n if (delta > 0) return delta;\n }\n return null;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Mapeamento status → code estável do NeetruError. */\nfunction statusToCode(status: number): NeetruErrorCode {\n if (status === 401) return 'unauthorized';\n if (status === 403) return 'forbidden';\n if (status === 404) return 'not_found';\n if (status === 422 || status === 400) return 'validation_failed';\n if (status === 429) return 'rate_limited';\n if (status >= 500) return 'server_error';\n return 'unknown';\n}\n\nfunction buildUrl(baseUrl: string, path: string, query?: HttpRequestOptions['query']): string {\n // Trim trailing slash em base e leading em path pra evitar `//`.\n const base = baseUrl.replace(/\\/+$/, '');\n const p = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(`${base}${p}`);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\n/** Parse JSON defensivo — retorna `undefined` em body vazio. */\nasync function safeJson(res: Response): Promise<unknown> {\n const text = await res.text();\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Executa request HTTP. Em sucesso retorna body parseado; em erro lança\n * `NeetruError` com `code` derivado do status. Aplica retry/backoff\n * automático em códigos transientes (rate_limited/server_error/network_error)\n * conforme `opts.retries` (default 2 = 3 tentativas).\n */\nexport async function httpRequest<T>(\n config: ResolvedConfig,\n opts: HttpRequestOptions,\n): Promise<T> {\n const method = opts.method ?? 'GET';\n const url = buildUrl(config.baseUrl, opts.path, opts.query);\n const maxRetries = opts.retries ?? DEFAULT_RETRIES;\n\n const headers: Record<string, string> = {\n accept: 'application/json',\n ...opts.headers,\n };\n\n if (opts.requireAuth) {\n if (!config.apiKey) {\n throw new NeetruError(\n 'missing_api_key',\n 'This operation requires an apiKey. Pass it to createNeetruClient({ apiKey }) or set NEETRU_API_KEY env var.',\n );\n }\n headers.authorization = `Bearer ${config.apiKey}`;\n }\n\n // Body só é serializado uma vez — reusado entre tentativas.\n const bodyString =\n opts.body !== undefined && method !== 'GET' && method !== 'DELETE'\n ? JSON.stringify(opts.body)\n : undefined;\n if (bodyString !== undefined) {\n headers['content-type'] = 'application/json';\n }\n\n let lastError: NeetruError | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const init: RequestInit = { method, headers };\n if (bodyString !== undefined) init.body = bodyString;\n // BUG-020 fix (2026-05-13): timeout default 30s. AbortSignal.timeout\n // requer Node 18+ ou browsers recentes.\n init.signal = AbortSignal.timeout(30_000);\n\n let res: Response;\n try {\n res = await config.fetch(url, init);\n } catch (err) {\n const message =\n err instanceof DOMException && err.name === 'TimeoutError'\n ? 'Network error: timeout after 30s'\n : `Network error: ${err instanceof Error ? err.message : 'fetch failed'}`;\n lastError = new NeetruError('network_error', message);\n if (attempt < maxRetries) {\n await sleep(backoffMs(attempt));\n continue;\n }\n throw lastError;\n }\n\n const requestId =\n res.headers.get('x-request-id') ?? res.headers.get('x-correlation-id') ?? undefined;\n\n if (res.ok) {\n const parsed = await safeJson(res);\n return parsed as T;\n }\n\n const body = (await safeJson(res)) as\n | { error?: { code?: string; message?: string } | string }\n | undefined;\n let code: string = statusToCode(res.status);\n let message = `HTTP ${res.status}`;\n if (body && typeof body === 'object' && 'error' in body) {\n const errField = body.error;\n if (typeof errField === 'string') {\n message = errField;\n } else if (errField && typeof errField === 'object') {\n if (typeof errField.code === 'string') code = errField.code;\n if (typeof errField.message === 'string') message = errField.message;\n }\n }\n const err = new NeetruError(code, message, res.status, requestId);\n lastError = err;\n\n const isRetryable = RETRYABLE_CODES.has(code as NeetruErrorCode);\n if (isRetryable && attempt < maxRetries) {\n const retryAfter = parseRetryAfter(res.headers.get('retry-after'));\n const delay = retryAfter ?? backoffMs(attempt);\n await sleep(delay);\n continue;\n }\n throw err;\n }\n\n // Unreachable — loop sempre retorna ou lança. Safety net.\n throw lastError ?? new NeetruError('unknown', 'unexpected httpRequest exit');\n}\n","/**\n * Checkout namespace (v1.1) — `client.checkout.*`\n *\n * Fluxo canônico (vide `docs/FLUXO_SIGNUP_BILLING_CHECKOUT.md` §6):\n * 1. SaaS produto chama `client.checkout.start({productId, planId, callbackUrl})`.\n * 2. SDK posta em `POST /api/v1/checkout/intents` (Bearer access_token OIDC).\n * 3. Core cria `checkout_intents/{intentId}` (TTL 15min) + retorna `redirectUrl`.\n * 4. Em browser, SDK redireciona automaticamente pra `redirectUrl`. Em\n * Node/SSR, retorna o objeto `{intentId, redirectUrl}` sem redirect.\n * 5. Portal (`minhaconta.neetru.com/portal/kyc/{intentId}`) coleta KYC + cartão.\n * 6. Usuário volta pra `callbackUrl?status=success&intentId=...` quando completo.\n *\n * **Dev mode** (`NEETRU_ENV=dev`): `start()` retorna URL fake sem network call.\n * Útil pra dev externo SaaS testar UI sem provisionar conta Neetru.\n *\n * **Estabilidade**: minor bump v1.0 → v1.1 (feature add, sem breaking).\n */\nimport { NeetruError } from './errors';\nimport { httpRequest } from './http';\nimport type { ResolvedConfig } from './types';\n\n// ─── Types públicos ─────────────────────────────────────────────────────────\n\n/** Tipo do tenant alvo da subscription (PF=uid, PJ=orgId). */\nexport type CheckoutTenantType = 'pf' | 'pj';\n\n/** Status do `checkout_intents/{intentId}` no Core. */\nexport type CheckoutIntentStatus =\n | 'pending'\n | 'kyc_in_progress'\n | 'stripe_redirected'\n | 'completed'\n | 'expired'\n | 'cancelled';\n\nexport interface CheckoutStartInput {\n /** Slug do produto no catálogo (ex: `neetru-pulse`). */\n productId: string;\n /** Slug do plano no catálogo do produto (ex: `pro_monthly`). */\n planId: string;\n /** Pra onde o produto SaaS quer voltar pós-checkout. https obrigatório (ou http://localhost em dev). */\n callbackUrl: string;\n /** Override pra checkout em nome de uma org. Default: PF do uid logado. */\n tenantType?: CheckoutTenantType;\n /** Quando `tenantType='pj'`, id da org. Ignorado quando PF. */\n tenantId?: string;\n /**\n * Em browsers, default `true` — SDK faz `window.location.href = redirectUrl`.\n * Passe `false` se quiser controlar o redirect manualmente.\n */\n autoRedirect?: boolean;\n}\n\nexport interface CheckoutStartResult {\n intentId: string;\n redirectUrl: string;\n status: CheckoutIntentStatus;\n expiresAt: string;\n /** True se KYC ainda precisa ser coletado no portal. UI pode mostrar hint. */\n requiresKyc: boolean;\n}\n\nexport interface CheckoutIntentInfo {\n intentId: string;\n uid: string;\n targetTenantId: string;\n targetTenantType: CheckoutTenantType;\n productId: string;\n planId: string;\n callbackUrl: string;\n status: CheckoutIntentStatus;\n /** Stripe Checkout Session id quando avançou pra `stripe_redirected`. */\n stripeSessionId?: string | null;\n expiresAt: string;\n /** True se já passou `expiresAt` mas Core ainda não marcou expired. */\n isStale?: boolean;\n}\n\nexport interface CheckoutNamespace {\n /**\n * Inicia checkout. Em browser, redireciona automaticamente pro portal.\n * Em Node/SSR, retorna o resultado sem efeitos colaterais — caller decide\n * o que fazer com `redirectUrl`.\n *\n * Dev mode (`NEETRU_ENV=dev`): retorna URL fake `https://localhost:9003/portal/checkout/mock-XXXX`.\n */\n start(input: CheckoutStartInput): Promise<CheckoutStartResult>;\n /** Lê estado atual do intent (Core). */\n get(intentId: string): Promise<CheckoutIntentInfo>;\n /** Cancela um intent que ainda não virou `stripe_redirected`. */\n cancel(intentId: string): Promise<{ ok: true; alreadyCancelled: boolean }>;\n}\n\n// ─── Implementação real (HTTP) ─────────────────────────────────────────────\n\ninterface RawStartCheckoutResponse {\n ok?: boolean;\n intentId?: string;\n redirectUrl?: string;\n status?: string;\n expiresAt?: string;\n requiresKyc?: boolean;\n}\n\ninterface RawGetCheckoutResponse {\n ok?: boolean;\n intent?: {\n intentId?: string;\n uid?: string;\n targetTenantId?: string;\n targetTenantType?: string;\n productId?: string;\n planId?: string;\n callbackUrl?: string;\n status?: string;\n stripeSessionId?: string | null;\n expiresAt?: string;\n };\n isStale?: boolean;\n}\n\nfunction parseStartResponse(raw: unknown): CheckoutStartResult {\n if (!raw || typeof raw !== 'object') {\n throw new NeetruError('invalid_response', 'checkout.start response is not an object');\n }\n const r = raw as RawStartCheckoutResponse;\n if (typeof r.intentId !== 'string' || !r.intentId) {\n throw new NeetruError('invalid_response', 'checkout.start response missing intentId');\n }\n if (typeof r.redirectUrl !== 'string' || !r.redirectUrl) {\n throw new NeetruError('invalid_response', 'checkout.start response missing redirectUrl');\n }\n return {\n intentId: r.intentId,\n redirectUrl: r.redirectUrl,\n status: (r.status as CheckoutIntentStatus | undefined) ?? 'pending',\n expiresAt: typeof r.expiresAt === 'string' ? r.expiresAt : new Date().toISOString(),\n requiresKyc: r.requiresKyc === true,\n };\n}\n\nfunction parseGetResponse(raw: unknown): CheckoutIntentInfo {\n if (!raw || typeof raw !== 'object') {\n throw new NeetruError('invalid_response', 'checkout.get response is not an object');\n }\n const r = raw as RawGetCheckoutResponse;\n const intent = r.intent;\n if (!intent || typeof intent !== 'object') {\n throw new NeetruError('invalid_response', 'checkout.get response missing intent');\n }\n if (typeof intent.intentId !== 'string') {\n throw new NeetruError('invalid_response', 'checkout.get response missing intentId');\n }\n return {\n intentId: intent.intentId,\n uid: intent.uid ?? '',\n targetTenantId: intent.targetTenantId ?? '',\n targetTenantType: (intent.targetTenantType as CheckoutTenantType | undefined) ?? 'pf',\n productId: intent.productId ?? '',\n planId: intent.planId ?? '',\n callbackUrl: intent.callbackUrl ?? '',\n status: (intent.status as CheckoutIntentStatus | undefined) ?? 'pending',\n stripeSessionId: intent.stripeSessionId ?? null,\n expiresAt: intent.expiresAt ?? new Date().toISOString(),\n isStale: r.isStale === true,\n };\n}\n\n/**\n * Detecta se estamos em browser context. Em SSR / Node / Edge, `window`\n * pode não existir — fazemos check defensivo.\n */\nfunction inBrowser(): boolean {\n try {\n return (\n typeof globalThis !== 'undefined' &&\n typeof (globalThis as { window?: { location?: { href?: string } } }).window !== 'undefined' &&\n typeof globalThis.location !== 'undefined' &&\n typeof globalThis.location.assign === 'function'\n );\n } catch {\n return false;\n }\n}\n\nfunction performRedirect(url: string): void {\n try {\n globalThis.location.assign(url);\n } catch {\n /* noop em runtimes sem location.assign — caller decide */\n }\n}\n\n/**\n * Implementação HTTP real. Posta no Core, parse response, redireciona se browser.\n */\nfunction createHttpCheckoutNamespace(config: ResolvedConfig): CheckoutNamespace {\n return {\n async start(input: CheckoutStartInput): Promise<CheckoutStartResult> {\n if (!input?.productId) {\n throw new NeetruError('validation_failed', 'checkout.start: productId is required');\n }\n if (!input?.planId) {\n throw new NeetruError('validation_failed', 'checkout.start: planId is required');\n }\n if (!input?.callbackUrl) {\n throw new NeetruError('validation_failed', 'checkout.start: callbackUrl is required');\n }\n\n const body: Record<string, unknown> = {\n productId: input.productId,\n planId: input.planId,\n callbackUrl: input.callbackUrl,\n };\n if (input.tenantType) body.targetTenantType = input.tenantType;\n if (input.tenantId) body.targetTenantId = input.tenantId;\n\n const raw = await httpRequest<RawStartCheckoutResponse>(config, {\n method: 'POST',\n path: '/api/v1/checkout/intents',\n body,\n requireAuth: true,\n });\n const result = parseStartResponse(raw);\n\n const shouldRedirect = input.autoRedirect !== false;\n if (shouldRedirect && inBrowser()) {\n performRedirect(result.redirectUrl);\n }\n return result;\n },\n\n async get(intentId: string): Promise<CheckoutIntentInfo> {\n if (!intentId || typeof intentId !== 'string') {\n throw new NeetruError('validation_failed', 'checkout.get: intentId is required');\n }\n const raw = await httpRequest<RawGetCheckoutResponse>(config, {\n method: 'GET',\n path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,\n requireAuth: true,\n });\n return parseGetResponse(raw);\n },\n\n async cancel(intentId: string): Promise<{ ok: true; alreadyCancelled: boolean }> {\n if (!intentId || typeof intentId !== 'string') {\n throw new NeetruError('validation_failed', 'checkout.cancel: intentId is required');\n }\n const raw = await httpRequest<{ ok?: boolean; alreadyCancelled?: boolean }>(config, {\n method: 'DELETE',\n path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,\n requireAuth: true,\n });\n return {\n ok: true,\n alreadyCancelled: (raw as { alreadyCancelled?: boolean })?.alreadyCancelled === true,\n };\n },\n };\n}\n\n// ─── Mock dev (sem network) ─────────────────────────────────────────────────\n\n/**\n * Mock dev — retorna URL fake `https://localhost:9003/portal/checkout/mock-XXXX`\n * sem tocar no Core. Útil pra dev externo SaaS testar UI/redirect sem precisar\n * de Bearer token Neetru.\n *\n * Dev mode persiste intents em mapa in-memory pro `get`/`cancel` retornarem\n * resultado consistente.\n */\nexport class MockCheckout implements CheckoutNamespace {\n private readonly intents = new Map<string, CheckoutIntentInfo>();\n\n async start(input: CheckoutStartInput): Promise<CheckoutStartResult> {\n if (!input?.productId) {\n throw new NeetruError('validation_failed', 'checkout.start: productId is required');\n }\n if (!input?.planId) {\n throw new NeetruError('validation_failed', 'checkout.start: planId is required');\n }\n if (!input?.callbackUrl) {\n throw new NeetruError('validation_failed', 'checkout.start: callbackUrl is required');\n }\n\n const intentId = `chk_mock_${Math.random().toString(36).slice(2, 10)}`;\n const expiresAt = new Date(Date.now() + 15 * 60 * 1000).toISOString();\n const redirectUrl = `https://localhost:9003/portal/checkout/${intentId}`;\n\n this.intents.set(intentId, {\n intentId,\n uid: 'dev-fixture-uid',\n targetTenantId: input.tenantId ?? 'dev-fixture-uid',\n targetTenantType: input.tenantType ?? 'pf',\n productId: input.productId,\n planId: input.planId,\n callbackUrl: input.callbackUrl,\n status: 'pending',\n stripeSessionId: null,\n expiresAt,\n });\n\n return {\n intentId,\n redirectUrl,\n status: 'pending',\n expiresAt,\n requiresKyc: false,\n };\n }\n\n async get(intentId: string): Promise<CheckoutIntentInfo> {\n const found = this.intents.get(intentId);\n if (!found) {\n throw new NeetruError('not_found', `Mock intent ${intentId} not found`);\n }\n return { ...found };\n }\n\n async cancel(intentId: string): Promise<{ ok: true; alreadyCancelled: boolean }> {\n const found = this.intents.get(intentId);\n if (!found) {\n throw new NeetruError('not_found', `Mock intent ${intentId} not found`);\n }\n const alreadyCancelled = found.status === 'cancelled';\n this.intents.set(intentId, { ...found, status: 'cancelled' });\n return { ok: true, alreadyCancelled };\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────────────────\n\nexport function createCheckoutNamespace(config: ResolvedConfig): CheckoutNamespace {\n if (config.env === 'dev') return new MockCheckout();\n return createHttpCheckoutNamespace(config);\n}\n"]}
@@ -1 +1 @@
1
- export { d as CheckoutIntentInfo, e as CheckoutIntentStatus, f as CheckoutNamespace, g as CheckoutStartInput, h as CheckoutStartResult, i as CheckoutTenantType, M as MockCheckout, z as createCheckoutNamespace } from './types-BA53dd8S.cjs';
1
+ export { d as CheckoutIntentInfo, e as CheckoutIntentStatus, f as CheckoutNamespace, g as CheckoutStartInput, h as CheckoutStartResult, i as CheckoutTenantType, M as MockCheckout, V as createCheckoutNamespace } from './types-CQAfwqUS.cjs';
@@ -1 +1 @@
1
- export { d as CheckoutIntentInfo, e as CheckoutIntentStatus, f as CheckoutNamespace, g as CheckoutStartInput, h as CheckoutStartResult, i as CheckoutTenantType, M as MockCheckout, z as createCheckoutNamespace } from './types-BA53dd8S.js';
1
+ export { d as CheckoutIntentInfo, e as CheckoutIntentStatus, f as CheckoutNamespace, g as CheckoutStartInput, h as CheckoutStartResult, i as CheckoutTenantType, M as MockCheckout, V as createCheckoutNamespace } from './types-CQAfwqUS.js';
package/dist/checkout.mjs CHANGED
@@ -14,6 +14,31 @@ var NeetruError = class _NeetruError extends Error {
14
14
  };
15
15
 
16
16
  // src/http.ts
17
+ var DEFAULT_RETRIES = 2;
18
+ var RETRYABLE_CODES = /* @__PURE__ */ new Set([
19
+ "rate_limited",
20
+ "server_error",
21
+ "network_error"
22
+ ]);
23
+ function backoffMs(attempt) {
24
+ const base = 200 * Math.pow(4, attempt);
25
+ const jitter = base * 0.2 * (Math.random() * 2 - 1);
26
+ return Math.max(50, Math.round(base + jitter));
27
+ }
28
+ function parseRetryAfter(value) {
29
+ if (!value) return null;
30
+ const secs = Number(value);
31
+ if (Number.isFinite(secs) && secs >= 0) return Math.round(secs * 1e3);
32
+ const dateMs = Date.parse(value);
33
+ if (Number.isFinite(dateMs)) {
34
+ const delta = dateMs - Date.now();
35
+ if (delta > 0) return delta;
36
+ }
37
+ return null;
38
+ }
39
+ function sleep(ms) {
40
+ return new Promise((resolve) => setTimeout(resolve, ms));
41
+ }
17
42
  function statusToCode(status) {
18
43
  if (status === 401) return "unauthorized";
19
44
  if (status === 403) return "forbidden";
@@ -47,6 +72,7 @@ async function safeJson(res) {
47
72
  async function httpRequest(config, opts) {
48
73
  const method = opts.method ?? "GET";
49
74
  const url = buildUrl(config.baseUrl, opts.path, opts.query);
75
+ const maxRetries = opts.retries ?? DEFAULT_RETRIES;
50
76
  const headers = {
51
77
  accept: "application/json",
52
78
  ...opts.headers
@@ -60,24 +86,32 @@ async function httpRequest(config, opts) {
60
86
  }
61
87
  headers.authorization = `Bearer ${config.apiKey}`;
62
88
  }
63
- const init = { method, headers };
64
- if (opts.body !== void 0 && method !== "GET" && method !== "DELETE") {
89
+ const bodyString = opts.body !== void 0 && method !== "GET" && method !== "DELETE" ? JSON.stringify(opts.body) : void 0;
90
+ if (bodyString !== void 0) {
65
91
  headers["content-type"] = "application/json";
66
- init.body = JSON.stringify(opts.body);
67
92
  }
68
- init.signal = AbortSignal.timeout(3e4);
69
- let res;
70
- try {
71
- res = await config.fetch(url, init);
72
- } catch (err) {
73
- if (err instanceof DOMException && err.name === "TimeoutError") {
74
- throw new NeetruError("network_error", "Network error: timeout after 30s");
93
+ let lastError = null;
94
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
95
+ const init = { method, headers };
96
+ if (bodyString !== void 0) init.body = bodyString;
97
+ init.signal = AbortSignal.timeout(3e4);
98
+ let res;
99
+ try {
100
+ res = await config.fetch(url, init);
101
+ } catch (err2) {
102
+ const message2 = err2 instanceof DOMException && err2.name === "TimeoutError" ? "Network error: timeout after 30s" : `Network error: ${err2 instanceof Error ? err2.message : "fetch failed"}`;
103
+ lastError = new NeetruError("network_error", message2);
104
+ if (attempt < maxRetries) {
105
+ await sleep(backoffMs(attempt));
106
+ continue;
107
+ }
108
+ throw lastError;
109
+ }
110
+ const requestId = res.headers.get("x-request-id") ?? res.headers.get("x-correlation-id") ?? void 0;
111
+ if (res.ok) {
112
+ const parsed = await safeJson(res);
113
+ return parsed;
75
114
  }
76
- const message = err instanceof Error ? err.message : "fetch failed";
77
- throw new NeetruError("network_error", `Network error: ${message}`);
78
- }
79
- const requestId = res.headers.get("x-request-id") ?? res.headers.get("x-correlation-id") ?? void 0;
80
- if (!res.ok) {
81
115
  const body = await safeJson(res);
82
116
  let code = statusToCode(res.status);
83
117
  let message = `HTTP ${res.status}`;
@@ -90,10 +124,18 @@ async function httpRequest(config, opts) {
90
124
  if (typeof errField.message === "string") message = errField.message;
91
125
  }
92
126
  }
93
- throw new NeetruError(code, message, res.status, requestId);
127
+ const err = new NeetruError(code, message, res.status, requestId);
128
+ lastError = err;
129
+ const isRetryable = RETRYABLE_CODES.has(code);
130
+ if (isRetryable && attempt < maxRetries) {
131
+ const retryAfter = parseRetryAfter(res.headers.get("retry-after"));
132
+ const delay = retryAfter ?? backoffMs(attempt);
133
+ await sleep(delay);
134
+ continue;
135
+ }
136
+ throw err;
94
137
  }
95
- const parsed = await safeJson(res);
96
- return parsed;
138
+ throw lastError ?? new NeetruError("unknown", "unexpected httpRequest exit");
97
139
  }
98
140
 
99
141
  // src/checkout.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/checkout.ts"],"names":[],"mappings":"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","file":"checkout.mjs","sourcesContent":["/**\n * Erros tipados do SDK.\n *\n * Todo erro lançado pelo SDK estende `NeetruError` — caller pode discriminar\n * por `.code` (string estável) sem parsing de message.\n */\n\n/** Códigos de erro estáveis do SDK. Adicionar aqui requer minor bump. */\nexport type NeetruErrorCode =\n | 'invalid_config'\n | 'missing_api_key'\n | 'unauthorized'\n | 'forbidden'\n | 'not_found'\n | 'rate_limited'\n | 'validation_failed'\n | 'network_error'\n | 'invalid_response'\n | 'server_error'\n | 'unknown';\n\n/**\n * Erro tipado padrão do SDK. Sempre lançado em vez de Error genérico.\n *\n * @example\n * ```ts\n * try { await client.catalog.list(); }\n * catch (e) {\n * if (e instanceof NeetruError && e.code === 'rate_limited') retry();\n * }\n * ```\n */\nexport class NeetruError extends Error {\n public readonly code: NeetruErrorCode | string;\n public readonly status?: number;\n public readonly requestId?: string;\n\n constructor(\n code: NeetruErrorCode | string,\n message: string,\n status?: number,\n requestId?: string,\n ) {\n super(message);\n this.name = 'NeetruError';\n this.code = code;\n this.status = status;\n this.requestId = requestId;\n // Preserva o prototype chain ao herdar de Error (downlevel quirk de TS).\n Object.setPrototypeOf(this, NeetruError.prototype);\n }\n}\n","/**\n * HTTP transport interno do SDK.\n *\n * Responsabilidades:\n * - Construir URL absoluta a partir de `baseUrl` + path\n * - Injetar Bearer token quando `requireAuth=true`\n * - Mapear status HTTP → `NeetruError` com `code` estável\n * - Parse defensivo de JSON (não lança em body vazio em 204)\n *\n * Não faz retry/backoff em v0.1 (carry-over Sprint 3+).\n */\nimport { NeetruError, type NeetruErrorCode } from './errors';\nimport type { ResolvedConfig } from './types';\n\n/** Opções da request HTTP. */\nexport interface HttpRequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n /** Path relativo (ex: `/api/v1/cli/catalog`). Concatenado a `baseUrl`. */\n path: string;\n /** Query string params (chave → valor primitivo). Valores `undefined` ignorados. */\n query?: Record<string, string | number | boolean | undefined>;\n /** Body JSON-serializável. Ignorado em GET/DELETE. */\n body?: unknown;\n /**\n * Se true, injeta `Authorization: Bearer <apiKey>`. Lança `missing_api_key`\n * se config.apiKey ausente. Default false.\n */\n requireAuth?: boolean;\n /** Cabeçalhos extras. */\n headers?: Record<string, string>;\n}\n\n/** Mapeamento status → code estável do NeetruError. */\nfunction statusToCode(status: number): NeetruErrorCode {\n if (status === 401) return 'unauthorized';\n if (status === 403) return 'forbidden';\n if (status === 404) return 'not_found';\n if (status === 422 || status === 400) return 'validation_failed';\n if (status === 429) return 'rate_limited';\n if (status >= 500) return 'server_error';\n return 'unknown';\n}\n\nfunction buildUrl(baseUrl: string, path: string, query?: HttpRequestOptions['query']): string {\n // Trim trailing slash em base e leading em path pra evitar `//`.\n const base = baseUrl.replace(/\\/+$/, '');\n const p = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(`${base}${p}`);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\n/** Parse JSON defensivo — retorna `undefined` em body vazio. */\nasync function safeJson(res: Response): Promise<unknown> {\n const text = await res.text();\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Executa request HTTP. Em sucesso retorna body parseado; em erro lança\n * `NeetruError` com `code` derivado do status.\n */\nexport async function httpRequest<T>(\n config: ResolvedConfig,\n opts: HttpRequestOptions,\n): Promise<T> {\n const method = opts.method ?? 'GET';\n const url = buildUrl(config.baseUrl, opts.path, opts.query);\n\n const headers: Record<string, string> = {\n accept: 'application/json',\n ...opts.headers,\n };\n\n if (opts.requireAuth) {\n if (!config.apiKey) {\n throw new NeetruError(\n 'missing_api_key',\n 'This operation requires an apiKey. Pass it to createNeetruClient({ apiKey }) or set NEETRU_API_KEY env var.',\n );\n }\n headers.authorization = `Bearer ${config.apiKey}`;\n }\n\n const init: RequestInit = { method, headers };\n if (opts.body !== undefined && method !== 'GET' && method !== 'DELETE') {\n headers['content-type'] = 'application/json';\n init.body = JSON.stringify(opts.body);\n }\n\n // BUG-020 fix (2026-05-13): timeout default 30s. Sem isso, em SSR/ISR do\n // Next.js o request pode travar a request inteira; em build estático\n // bloqueia o pipeline. AbortSignal.timeout requer Node 18+ ou browsers\n // recentes — alvo do SDK é Node 18+ e Chrome/Firefox/Safari modernos.\n init.signal = AbortSignal.timeout(30_000);\n\n let res: Response;\n try {\n res = await config.fetch(url, init);\n } catch (err) {\n if (err instanceof DOMException && err.name === 'TimeoutError') {\n throw new NeetruError('network_error', 'Network error: timeout after 30s');\n }\n const message = err instanceof Error ? err.message : 'fetch failed';\n throw new NeetruError('network_error', `Network error: ${message}`);\n }\n\n const requestId = res.headers.get('x-request-id') ?? res.headers.get('x-correlation-id') ?? undefined;\n\n if (!res.ok) {\n const body = (await safeJson(res)) as { error?: { code?: string; message?: string } | string } | undefined;\n let code: string = statusToCode(res.status);\n let message = `HTTP ${res.status}`;\n if (body && typeof body === 'object' && 'error' in body) {\n const errField = body.error;\n if (typeof errField === 'string') {\n message = errField;\n } else if (errField && typeof errField === 'object') {\n if (typeof errField.code === 'string') code = errField.code;\n if (typeof errField.message === 'string') message = errField.message;\n }\n }\n throw new NeetruError(code, message, res.status, requestId);\n }\n\n const parsed = await safeJson(res);\n // Caller é responsável por validar shape; SDK assume backend correto.\n return parsed as T;\n}\n","/**\n * Checkout namespace (v1.1) — `client.checkout.*`\n *\n * Fluxo canônico (vide `docs/FLUXO_SIGNUP_BILLING_CHECKOUT.md` §6):\n * 1. SaaS produto chama `client.checkout.start({productId, planId, callbackUrl})`.\n * 2. SDK posta em `POST /api/v1/checkout/intents` (Bearer access_token OIDC).\n * 3. Core cria `checkout_intents/{intentId}` (TTL 15min) + retorna `redirectUrl`.\n * 4. Em browser, SDK redireciona automaticamente pra `redirectUrl`. Em\n * Node/SSR, retorna o objeto `{intentId, redirectUrl}` sem redirect.\n * 5. Portal (`minhaconta.neetru.com/portal/kyc/{intentId}`) coleta KYC + cartão.\n * 6. Usuário volta pra `callbackUrl?status=success&intentId=...` quando completo.\n *\n * **Dev mode** (`NEETRU_ENV=dev`): `start()` retorna URL fake sem network call.\n * Útil pra dev externo SaaS testar UI sem provisionar conta Neetru.\n *\n * **Estabilidade**: minor bump v1.0 → v1.1 (feature add, sem breaking).\n */\nimport { NeetruError } from './errors';\nimport { httpRequest } from './http';\nimport type { ResolvedConfig } from './types';\n\n// ─── Types públicos ─────────────────────────────────────────────────────────\n\n/** Tipo do tenant alvo da subscription (PF=uid, PJ=orgId). */\nexport type CheckoutTenantType = 'pf' | 'pj';\n\n/** Status do `checkout_intents/{intentId}` no Core. */\nexport type CheckoutIntentStatus =\n | 'pending'\n | 'kyc_in_progress'\n | 'stripe_redirected'\n | 'completed'\n | 'expired'\n | 'cancelled';\n\nexport interface CheckoutStartInput {\n /** Slug do produto no catálogo (ex: `neetru-pulse`). */\n productId: string;\n /** Slug do plano no catálogo do produto (ex: `pro_monthly`). */\n planId: string;\n /** Pra onde o produto SaaS quer voltar pós-checkout. https obrigatório (ou http://localhost em dev). */\n callbackUrl: string;\n /** Override pra checkout em nome de uma org. Default: PF do uid logado. */\n tenantType?: CheckoutTenantType;\n /** Quando `tenantType='pj'`, id da org. Ignorado quando PF. */\n tenantId?: string;\n /**\n * Em browsers, default `true` — SDK faz `window.location.href = redirectUrl`.\n * Passe `false` se quiser controlar o redirect manualmente.\n */\n autoRedirect?: boolean;\n}\n\nexport interface CheckoutStartResult {\n intentId: string;\n redirectUrl: string;\n status: CheckoutIntentStatus;\n expiresAt: string;\n /** True se KYC ainda precisa ser coletado no portal. UI pode mostrar hint. */\n requiresKyc: boolean;\n}\n\nexport interface CheckoutIntentInfo {\n intentId: string;\n uid: string;\n targetTenantId: string;\n targetTenantType: CheckoutTenantType;\n productId: string;\n planId: string;\n callbackUrl: string;\n status: CheckoutIntentStatus;\n /** Stripe Checkout Session id quando avançou pra `stripe_redirected`. */\n stripeSessionId?: string | null;\n expiresAt: string;\n /** True se já passou `expiresAt` mas Core ainda não marcou expired. */\n isStale?: boolean;\n}\n\nexport interface CheckoutNamespace {\n /**\n * Inicia checkout. Em browser, redireciona automaticamente pro portal.\n * Em Node/SSR, retorna o resultado sem efeitos colaterais — caller decide\n * o que fazer com `redirectUrl`.\n *\n * Dev mode (`NEETRU_ENV=dev`): retorna URL fake `https://localhost:9003/portal/checkout/mock-XXXX`.\n */\n start(input: CheckoutStartInput): Promise<CheckoutStartResult>;\n /** Lê estado atual do intent (Core). */\n get(intentId: string): Promise<CheckoutIntentInfo>;\n /** Cancela um intent que ainda não virou `stripe_redirected`. */\n cancel(intentId: string): Promise<{ ok: true; alreadyCancelled: boolean }>;\n}\n\n// ─── Implementação real (HTTP) ─────────────────────────────────────────────\n\ninterface RawStartCheckoutResponse {\n ok?: boolean;\n intentId?: string;\n redirectUrl?: string;\n status?: string;\n expiresAt?: string;\n requiresKyc?: boolean;\n}\n\ninterface RawGetCheckoutResponse {\n ok?: boolean;\n intent?: {\n intentId?: string;\n uid?: string;\n targetTenantId?: string;\n targetTenantType?: string;\n productId?: string;\n planId?: string;\n callbackUrl?: string;\n status?: string;\n stripeSessionId?: string | null;\n expiresAt?: string;\n };\n isStale?: boolean;\n}\n\nfunction parseStartResponse(raw: unknown): CheckoutStartResult {\n if (!raw || typeof raw !== 'object') {\n throw new NeetruError('invalid_response', 'checkout.start response is not an object');\n }\n const r = raw as RawStartCheckoutResponse;\n if (typeof r.intentId !== 'string' || !r.intentId) {\n throw new NeetruError('invalid_response', 'checkout.start response missing intentId');\n }\n if (typeof r.redirectUrl !== 'string' || !r.redirectUrl) {\n throw new NeetruError('invalid_response', 'checkout.start response missing redirectUrl');\n }\n return {\n intentId: r.intentId,\n redirectUrl: r.redirectUrl,\n status: (r.status as CheckoutIntentStatus | undefined) ?? 'pending',\n expiresAt: typeof r.expiresAt === 'string' ? r.expiresAt : new Date().toISOString(),\n requiresKyc: r.requiresKyc === true,\n };\n}\n\nfunction parseGetResponse(raw: unknown): CheckoutIntentInfo {\n if (!raw || typeof raw !== 'object') {\n throw new NeetruError('invalid_response', 'checkout.get response is not an object');\n }\n const r = raw as RawGetCheckoutResponse;\n const intent = r.intent;\n if (!intent || typeof intent !== 'object') {\n throw new NeetruError('invalid_response', 'checkout.get response missing intent');\n }\n if (typeof intent.intentId !== 'string') {\n throw new NeetruError('invalid_response', 'checkout.get response missing intentId');\n }\n return {\n intentId: intent.intentId,\n uid: intent.uid ?? '',\n targetTenantId: intent.targetTenantId ?? '',\n targetTenantType: (intent.targetTenantType as CheckoutTenantType | undefined) ?? 'pf',\n productId: intent.productId ?? '',\n planId: intent.planId ?? '',\n callbackUrl: intent.callbackUrl ?? '',\n status: (intent.status as CheckoutIntentStatus | undefined) ?? 'pending',\n stripeSessionId: intent.stripeSessionId ?? null,\n expiresAt: intent.expiresAt ?? new Date().toISOString(),\n isStale: r.isStale === true,\n };\n}\n\n/**\n * Detecta se estamos em browser context. Em SSR / Node / Edge, `window`\n * pode não existir — fazemos check defensivo.\n */\nfunction inBrowser(): boolean {\n try {\n return (\n typeof globalThis !== 'undefined' &&\n typeof (globalThis as { window?: { location?: { href?: string } } }).window !== 'undefined' &&\n typeof globalThis.location !== 'undefined' &&\n typeof globalThis.location.assign === 'function'\n );\n } catch {\n return false;\n }\n}\n\nfunction performRedirect(url: string): void {\n try {\n globalThis.location.assign(url);\n } catch {\n /* noop em runtimes sem location.assign — caller decide */\n }\n}\n\n/**\n * Implementação HTTP real. Posta no Core, parse response, redireciona se browser.\n */\nfunction createHttpCheckoutNamespace(config: ResolvedConfig): CheckoutNamespace {\n return {\n async start(input: CheckoutStartInput): Promise<CheckoutStartResult> {\n if (!input?.productId) {\n throw new NeetruError('validation_failed', 'checkout.start: productId is required');\n }\n if (!input?.planId) {\n throw new NeetruError('validation_failed', 'checkout.start: planId is required');\n }\n if (!input?.callbackUrl) {\n throw new NeetruError('validation_failed', 'checkout.start: callbackUrl is required');\n }\n\n const body: Record<string, unknown> = {\n productId: input.productId,\n planId: input.planId,\n callbackUrl: input.callbackUrl,\n };\n if (input.tenantType) body.targetTenantType = input.tenantType;\n if (input.tenantId) body.targetTenantId = input.tenantId;\n\n const raw = await httpRequest<RawStartCheckoutResponse>(config, {\n method: 'POST',\n path: '/api/v1/checkout/intents',\n body,\n requireAuth: true,\n });\n const result = parseStartResponse(raw);\n\n const shouldRedirect = input.autoRedirect !== false;\n if (shouldRedirect && inBrowser()) {\n performRedirect(result.redirectUrl);\n }\n return result;\n },\n\n async get(intentId: string): Promise<CheckoutIntentInfo> {\n if (!intentId || typeof intentId !== 'string') {\n throw new NeetruError('validation_failed', 'checkout.get: intentId is required');\n }\n const raw = await httpRequest<RawGetCheckoutResponse>(config, {\n method: 'GET',\n path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,\n requireAuth: true,\n });\n return parseGetResponse(raw);\n },\n\n async cancel(intentId: string): Promise<{ ok: true; alreadyCancelled: boolean }> {\n if (!intentId || typeof intentId !== 'string') {\n throw new NeetruError('validation_failed', 'checkout.cancel: intentId is required');\n }\n const raw = await httpRequest<{ ok?: boolean; alreadyCancelled?: boolean }>(config, {\n method: 'DELETE',\n path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,\n requireAuth: true,\n });\n return {\n ok: true,\n alreadyCancelled: (raw as { alreadyCancelled?: boolean })?.alreadyCancelled === true,\n };\n },\n };\n}\n\n// ─── Mock dev (sem network) ─────────────────────────────────────────────────\n\n/**\n * Mock dev — retorna URL fake `https://localhost:9003/portal/checkout/mock-XXXX`\n * sem tocar no Core. Útil pra dev externo SaaS testar UI/redirect sem precisar\n * de Bearer token Neetru.\n *\n * Dev mode persiste intents em mapa in-memory pro `get`/`cancel` retornarem\n * resultado consistente.\n */\nexport class MockCheckout implements CheckoutNamespace {\n private readonly intents = new Map<string, CheckoutIntentInfo>();\n\n async start(input: CheckoutStartInput): Promise<CheckoutStartResult> {\n if (!input?.productId) {\n throw new NeetruError('validation_failed', 'checkout.start: productId is required');\n }\n if (!input?.planId) {\n throw new NeetruError('validation_failed', 'checkout.start: planId is required');\n }\n if (!input?.callbackUrl) {\n throw new NeetruError('validation_failed', 'checkout.start: callbackUrl is required');\n }\n\n const intentId = `chk_mock_${Math.random().toString(36).slice(2, 10)}`;\n const expiresAt = new Date(Date.now() + 15 * 60 * 1000).toISOString();\n const redirectUrl = `https://localhost:9003/portal/checkout/${intentId}`;\n\n this.intents.set(intentId, {\n intentId,\n uid: 'dev-fixture-uid',\n targetTenantId: input.tenantId ?? 'dev-fixture-uid',\n targetTenantType: input.tenantType ?? 'pf',\n productId: input.productId,\n planId: input.planId,\n callbackUrl: input.callbackUrl,\n status: 'pending',\n stripeSessionId: null,\n expiresAt,\n });\n\n return {\n intentId,\n redirectUrl,\n status: 'pending',\n expiresAt,\n requiresKyc: false,\n };\n }\n\n async get(intentId: string): Promise<CheckoutIntentInfo> {\n const found = this.intents.get(intentId);\n if (!found) {\n throw new NeetruError('not_found', `Mock intent ${intentId} not found`);\n }\n return { ...found };\n }\n\n async cancel(intentId: string): Promise<{ ok: true; alreadyCancelled: boolean }> {\n const found = this.intents.get(intentId);\n if (!found) {\n throw new NeetruError('not_found', `Mock intent ${intentId} not found`);\n }\n const alreadyCancelled = found.status === 'cancelled';\n this.intents.set(intentId, { ...found, status: 'cancelled' });\n return { ok: true, alreadyCancelled };\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────────────────\n\nexport function createCheckoutNamespace(config: ResolvedConfig): CheckoutNamespace {\n if (config.env === 'dev') return new MockCheckout();\n return createHttpCheckoutNamespace(config);\n}\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":["/**\n * Erros tipados do SDK.\n *\n * Todo erro lançado pelo SDK estende `NeetruError` — caller pode discriminar\n * por `.code` (string estável) sem parsing de message.\n */\n\n/** Códigos de erro estáveis do SDK. Adicionar aqui requer minor bump. */\nexport type NeetruErrorCode =\n | 'invalid_config'\n | 'missing_api_key'\n | 'unauthorized'\n | 'forbidden'\n | 'not_found'\n | 'rate_limited'\n | 'validation_failed'\n | 'network_error'\n | 'invalid_response'\n | 'server_error'\n | 'unknown';\n\n/**\n * Erro tipado padrão do SDK. Sempre lançado em vez de Error genérico.\n *\n * @example\n * ```ts\n * try { await client.catalog.list(); }\n * catch (e) {\n * if (e instanceof NeetruError && e.code === 'rate_limited') retry();\n * }\n * ```\n */\nexport class NeetruError extends Error {\n public readonly code: NeetruErrorCode | string;\n public readonly status?: number;\n public readonly requestId?: string;\n\n constructor(\n code: NeetruErrorCode | string,\n message: string,\n status?: number,\n requestId?: string,\n ) {\n super(message);\n this.name = 'NeetruError';\n this.code = code;\n this.status = status;\n this.requestId = requestId;\n // Preserva o prototype chain ao herdar de Error (downlevel quirk de TS).\n Object.setPrototypeOf(this, NeetruError.prototype);\n }\n}\n","/**\n * HTTP transport interno do SDK.\n *\n * Responsabilidades:\n * - Construir URL absoluta a partir de `baseUrl` + path\n * - Injetar Bearer token quando `requireAuth=true`\n * - Mapear status HTTP → `NeetruError` com `code` estável\n * - Parse defensivo de JSON (não lança em body vazio em 204)\n * - Retry/backoff exponencial em `rate_limited` (429), `server_error` (5xx)\n * e `network_error` (timeout/falha de rede). Honra `Retry-After` quando\n * presente. Default 2 retries (3 tentativas no total). Caller opta-out\n * com `retries: 0`.\n */\nimport { NeetruError, type NeetruErrorCode } from './errors';\nimport type { ResolvedConfig } from './types';\n\n/** Opções da request HTTP. */\nexport interface HttpRequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n /** Path relativo (ex: `/api/v1/cli/catalog`). Concatenado a `baseUrl`. */\n path: string;\n /** Query string params (chave → valor primitivo). Valores `undefined` ignorados. */\n query?: Record<string, string | number | boolean | undefined>;\n /** Body JSON-serializável. Ignorado em GET/DELETE. */\n body?: unknown;\n /**\n * Se true, injeta `Authorization: Bearer <apiKey>`. Lança `missing_api_key`\n * se config.apiKey ausente. Default false.\n */\n requireAuth?: boolean;\n /** Cabeçalhos extras. */\n headers?: Record<string, string>;\n /**\n * Número de retries em códigos transientes (`rate_limited`, `server_error`,\n * `network_error`). Default 2 (= 3 tentativas total). Caller passa `0` pra\n * desativar (útil em operações não-idempotentes específicas).\n */\n retries?: number;\n}\n\nconst DEFAULT_RETRIES = 2;\nconst RETRYABLE_CODES = new Set<NeetruErrorCode>([\n 'rate_limited',\n 'server_error',\n 'network_error',\n]);\n\n/** Backoff exponencial com jitter ±20%. attempt: 0=primeira, 1=primeiro retry, ... */\nfunction backoffMs(attempt: number): number {\n const base = 200 * Math.pow(4, attempt); // 200ms, 800ms, 3.2s, ...\n const jitter = base * 0.2 * (Math.random() * 2 - 1);\n return Math.max(50, Math.round(base + jitter));\n}\n\n/**\n * Honra `Retry-After` header (segundos ou HTTP-date). Retorna ms ou null se\n * inválido. RFC 9110 §10.2.3.\n */\nfunction parseRetryAfter(value: string | null): number | null {\n if (!value) return null;\n const secs = Number(value);\n if (Number.isFinite(secs) && secs >= 0) return Math.round(secs * 1000);\n const dateMs = Date.parse(value);\n if (Number.isFinite(dateMs)) {\n const delta = dateMs - Date.now();\n if (delta > 0) return delta;\n }\n return null;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Mapeamento status → code estável do NeetruError. */\nfunction statusToCode(status: number): NeetruErrorCode {\n if (status === 401) return 'unauthorized';\n if (status === 403) return 'forbidden';\n if (status === 404) return 'not_found';\n if (status === 422 || status === 400) return 'validation_failed';\n if (status === 429) return 'rate_limited';\n if (status >= 500) return 'server_error';\n return 'unknown';\n}\n\nfunction buildUrl(baseUrl: string, path: string, query?: HttpRequestOptions['query']): string {\n // Trim trailing slash em base e leading em path pra evitar `//`.\n const base = baseUrl.replace(/\\/+$/, '');\n const p = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(`${base}${p}`);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\n/** Parse JSON defensivo — retorna `undefined` em body vazio. */\nasync function safeJson(res: Response): Promise<unknown> {\n const text = await res.text();\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Executa request HTTP. Em sucesso retorna body parseado; em erro lança\n * `NeetruError` com `code` derivado do status. Aplica retry/backoff\n * automático em códigos transientes (rate_limited/server_error/network_error)\n * conforme `opts.retries` (default 2 = 3 tentativas).\n */\nexport async function httpRequest<T>(\n config: ResolvedConfig,\n opts: HttpRequestOptions,\n): Promise<T> {\n const method = opts.method ?? 'GET';\n const url = buildUrl(config.baseUrl, opts.path, opts.query);\n const maxRetries = opts.retries ?? DEFAULT_RETRIES;\n\n const headers: Record<string, string> = {\n accept: 'application/json',\n ...opts.headers,\n };\n\n if (opts.requireAuth) {\n if (!config.apiKey) {\n throw new NeetruError(\n 'missing_api_key',\n 'This operation requires an apiKey. Pass it to createNeetruClient({ apiKey }) or set NEETRU_API_KEY env var.',\n );\n }\n headers.authorization = `Bearer ${config.apiKey}`;\n }\n\n // Body só é serializado uma vez — reusado entre tentativas.\n const bodyString =\n opts.body !== undefined && method !== 'GET' && method !== 'DELETE'\n ? JSON.stringify(opts.body)\n : undefined;\n if (bodyString !== undefined) {\n headers['content-type'] = 'application/json';\n }\n\n let lastError: NeetruError | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const init: RequestInit = { method, headers };\n if (bodyString !== undefined) init.body = bodyString;\n // BUG-020 fix (2026-05-13): timeout default 30s. AbortSignal.timeout\n // requer Node 18+ ou browsers recentes.\n init.signal = AbortSignal.timeout(30_000);\n\n let res: Response;\n try {\n res = await config.fetch(url, init);\n } catch (err) {\n const message =\n err instanceof DOMException && err.name === 'TimeoutError'\n ? 'Network error: timeout after 30s'\n : `Network error: ${err instanceof Error ? err.message : 'fetch failed'}`;\n lastError = new NeetruError('network_error', message);\n if (attempt < maxRetries) {\n await sleep(backoffMs(attempt));\n continue;\n }\n throw lastError;\n }\n\n const requestId =\n res.headers.get('x-request-id') ?? res.headers.get('x-correlation-id') ?? undefined;\n\n if (res.ok) {\n const parsed = await safeJson(res);\n return parsed as T;\n }\n\n const body = (await safeJson(res)) as\n | { error?: { code?: string; message?: string } | string }\n | undefined;\n let code: string = statusToCode(res.status);\n let message = `HTTP ${res.status}`;\n if (body && typeof body === 'object' && 'error' in body) {\n const errField = body.error;\n if (typeof errField === 'string') {\n message = errField;\n } else if (errField && typeof errField === 'object') {\n if (typeof errField.code === 'string') code = errField.code;\n if (typeof errField.message === 'string') message = errField.message;\n }\n }\n const err = new NeetruError(code, message, res.status, requestId);\n lastError = err;\n\n const isRetryable = RETRYABLE_CODES.has(code as NeetruErrorCode);\n if (isRetryable && attempt < maxRetries) {\n const retryAfter = parseRetryAfter(res.headers.get('retry-after'));\n const delay = retryAfter ?? backoffMs(attempt);\n await sleep(delay);\n continue;\n }\n throw err;\n }\n\n // Unreachable — loop sempre retorna ou lança. Safety net.\n throw lastError ?? new NeetruError('unknown', 'unexpected httpRequest exit');\n}\n","/**\n * Checkout namespace (v1.1) — `client.checkout.*`\n *\n * Fluxo canônico (vide `docs/FLUXO_SIGNUP_BILLING_CHECKOUT.md` §6):\n * 1. SaaS produto chama `client.checkout.start({productId, planId, callbackUrl})`.\n * 2. SDK posta em `POST /api/v1/checkout/intents` (Bearer access_token OIDC).\n * 3. Core cria `checkout_intents/{intentId}` (TTL 15min) + retorna `redirectUrl`.\n * 4. Em browser, SDK redireciona automaticamente pra `redirectUrl`. Em\n * Node/SSR, retorna o objeto `{intentId, redirectUrl}` sem redirect.\n * 5. Portal (`minhaconta.neetru.com/portal/kyc/{intentId}`) coleta KYC + cartão.\n * 6. Usuário volta pra `callbackUrl?status=success&intentId=...` quando completo.\n *\n * **Dev mode** (`NEETRU_ENV=dev`): `start()` retorna URL fake sem network call.\n * Útil pra dev externo SaaS testar UI sem provisionar conta Neetru.\n *\n * **Estabilidade**: minor bump v1.0 → v1.1 (feature add, sem breaking).\n */\nimport { NeetruError } from './errors';\nimport { httpRequest } from './http';\nimport type { ResolvedConfig } from './types';\n\n// ─── Types públicos ─────────────────────────────────────────────────────────\n\n/** Tipo do tenant alvo da subscription (PF=uid, PJ=orgId). */\nexport type CheckoutTenantType = 'pf' | 'pj';\n\n/** Status do `checkout_intents/{intentId}` no Core. */\nexport type CheckoutIntentStatus =\n | 'pending'\n | 'kyc_in_progress'\n | 'stripe_redirected'\n | 'completed'\n | 'expired'\n | 'cancelled';\n\nexport interface CheckoutStartInput {\n /** Slug do produto no catálogo (ex: `neetru-pulse`). */\n productId: string;\n /** Slug do plano no catálogo do produto (ex: `pro_monthly`). */\n planId: string;\n /** Pra onde o produto SaaS quer voltar pós-checkout. https obrigatório (ou http://localhost em dev). */\n callbackUrl: string;\n /** Override pra checkout em nome de uma org. Default: PF do uid logado. */\n tenantType?: CheckoutTenantType;\n /** Quando `tenantType='pj'`, id da org. Ignorado quando PF. */\n tenantId?: string;\n /**\n * Em browsers, default `true` — SDK faz `window.location.href = redirectUrl`.\n * Passe `false` se quiser controlar o redirect manualmente.\n */\n autoRedirect?: boolean;\n}\n\nexport interface CheckoutStartResult {\n intentId: string;\n redirectUrl: string;\n status: CheckoutIntentStatus;\n expiresAt: string;\n /** True se KYC ainda precisa ser coletado no portal. UI pode mostrar hint. */\n requiresKyc: boolean;\n}\n\nexport interface CheckoutIntentInfo {\n intentId: string;\n uid: string;\n targetTenantId: string;\n targetTenantType: CheckoutTenantType;\n productId: string;\n planId: string;\n callbackUrl: string;\n status: CheckoutIntentStatus;\n /** Stripe Checkout Session id quando avançou pra `stripe_redirected`. */\n stripeSessionId?: string | null;\n expiresAt: string;\n /** True se já passou `expiresAt` mas Core ainda não marcou expired. */\n isStale?: boolean;\n}\n\nexport interface CheckoutNamespace {\n /**\n * Inicia checkout. Em browser, redireciona automaticamente pro portal.\n * Em Node/SSR, retorna o resultado sem efeitos colaterais — caller decide\n * o que fazer com `redirectUrl`.\n *\n * Dev mode (`NEETRU_ENV=dev`): retorna URL fake `https://localhost:9003/portal/checkout/mock-XXXX`.\n */\n start(input: CheckoutStartInput): Promise<CheckoutStartResult>;\n /** Lê estado atual do intent (Core). */\n get(intentId: string): Promise<CheckoutIntentInfo>;\n /** Cancela um intent que ainda não virou `stripe_redirected`. */\n cancel(intentId: string): Promise<{ ok: true; alreadyCancelled: boolean }>;\n}\n\n// ─── Implementação real (HTTP) ─────────────────────────────────────────────\n\ninterface RawStartCheckoutResponse {\n ok?: boolean;\n intentId?: string;\n redirectUrl?: string;\n status?: string;\n expiresAt?: string;\n requiresKyc?: boolean;\n}\n\ninterface RawGetCheckoutResponse {\n ok?: boolean;\n intent?: {\n intentId?: string;\n uid?: string;\n targetTenantId?: string;\n targetTenantType?: string;\n productId?: string;\n planId?: string;\n callbackUrl?: string;\n status?: string;\n stripeSessionId?: string | null;\n expiresAt?: string;\n };\n isStale?: boolean;\n}\n\nfunction parseStartResponse(raw: unknown): CheckoutStartResult {\n if (!raw || typeof raw !== 'object') {\n throw new NeetruError('invalid_response', 'checkout.start response is not an object');\n }\n const r = raw as RawStartCheckoutResponse;\n if (typeof r.intentId !== 'string' || !r.intentId) {\n throw new NeetruError('invalid_response', 'checkout.start response missing intentId');\n }\n if (typeof r.redirectUrl !== 'string' || !r.redirectUrl) {\n throw new NeetruError('invalid_response', 'checkout.start response missing redirectUrl');\n }\n return {\n intentId: r.intentId,\n redirectUrl: r.redirectUrl,\n status: (r.status as CheckoutIntentStatus | undefined) ?? 'pending',\n expiresAt: typeof r.expiresAt === 'string' ? r.expiresAt : new Date().toISOString(),\n requiresKyc: r.requiresKyc === true,\n };\n}\n\nfunction parseGetResponse(raw: unknown): CheckoutIntentInfo {\n if (!raw || typeof raw !== 'object') {\n throw new NeetruError('invalid_response', 'checkout.get response is not an object');\n }\n const r = raw as RawGetCheckoutResponse;\n const intent = r.intent;\n if (!intent || typeof intent !== 'object') {\n throw new NeetruError('invalid_response', 'checkout.get response missing intent');\n }\n if (typeof intent.intentId !== 'string') {\n throw new NeetruError('invalid_response', 'checkout.get response missing intentId');\n }\n return {\n intentId: intent.intentId,\n uid: intent.uid ?? '',\n targetTenantId: intent.targetTenantId ?? '',\n targetTenantType: (intent.targetTenantType as CheckoutTenantType | undefined) ?? 'pf',\n productId: intent.productId ?? '',\n planId: intent.planId ?? '',\n callbackUrl: intent.callbackUrl ?? '',\n status: (intent.status as CheckoutIntentStatus | undefined) ?? 'pending',\n stripeSessionId: intent.stripeSessionId ?? null,\n expiresAt: intent.expiresAt ?? new Date().toISOString(),\n isStale: r.isStale === true,\n };\n}\n\n/**\n * Detecta se estamos em browser context. Em SSR / Node / Edge, `window`\n * pode não existir — fazemos check defensivo.\n */\nfunction inBrowser(): boolean {\n try {\n return (\n typeof globalThis !== 'undefined' &&\n typeof (globalThis as { window?: { location?: { href?: string } } }).window !== 'undefined' &&\n typeof globalThis.location !== 'undefined' &&\n typeof globalThis.location.assign === 'function'\n );\n } catch {\n return false;\n }\n}\n\nfunction performRedirect(url: string): void {\n try {\n globalThis.location.assign(url);\n } catch {\n /* noop em runtimes sem location.assign — caller decide */\n }\n}\n\n/**\n * Implementação HTTP real. Posta no Core, parse response, redireciona se browser.\n */\nfunction createHttpCheckoutNamespace(config: ResolvedConfig): CheckoutNamespace {\n return {\n async start(input: CheckoutStartInput): Promise<CheckoutStartResult> {\n if (!input?.productId) {\n throw new NeetruError('validation_failed', 'checkout.start: productId is required');\n }\n if (!input?.planId) {\n throw new NeetruError('validation_failed', 'checkout.start: planId is required');\n }\n if (!input?.callbackUrl) {\n throw new NeetruError('validation_failed', 'checkout.start: callbackUrl is required');\n }\n\n const body: Record<string, unknown> = {\n productId: input.productId,\n planId: input.planId,\n callbackUrl: input.callbackUrl,\n };\n if (input.tenantType) body.targetTenantType = input.tenantType;\n if (input.tenantId) body.targetTenantId = input.tenantId;\n\n const raw = await httpRequest<RawStartCheckoutResponse>(config, {\n method: 'POST',\n path: '/api/v1/checkout/intents',\n body,\n requireAuth: true,\n });\n const result = parseStartResponse(raw);\n\n const shouldRedirect = input.autoRedirect !== false;\n if (shouldRedirect && inBrowser()) {\n performRedirect(result.redirectUrl);\n }\n return result;\n },\n\n async get(intentId: string): Promise<CheckoutIntentInfo> {\n if (!intentId || typeof intentId !== 'string') {\n throw new NeetruError('validation_failed', 'checkout.get: intentId is required');\n }\n const raw = await httpRequest<RawGetCheckoutResponse>(config, {\n method: 'GET',\n path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,\n requireAuth: true,\n });\n return parseGetResponse(raw);\n },\n\n async cancel(intentId: string): Promise<{ ok: true; alreadyCancelled: boolean }> {\n if (!intentId || typeof intentId !== 'string') {\n throw new NeetruError('validation_failed', 'checkout.cancel: intentId is required');\n }\n const raw = await httpRequest<{ ok?: boolean; alreadyCancelled?: boolean }>(config, {\n method: 'DELETE',\n path: `/api/v1/checkout/intents/${encodeURIComponent(intentId)}`,\n requireAuth: true,\n });\n return {\n ok: true,\n alreadyCancelled: (raw as { alreadyCancelled?: boolean })?.alreadyCancelled === true,\n };\n },\n };\n}\n\n// ─── Mock dev (sem network) ─────────────────────────────────────────────────\n\n/**\n * Mock dev — retorna URL fake `https://localhost:9003/portal/checkout/mock-XXXX`\n * sem tocar no Core. Útil pra dev externo SaaS testar UI/redirect sem precisar\n * de Bearer token Neetru.\n *\n * Dev mode persiste intents em mapa in-memory pro `get`/`cancel` retornarem\n * resultado consistente.\n */\nexport class MockCheckout implements CheckoutNamespace {\n private readonly intents = new Map<string, CheckoutIntentInfo>();\n\n async start(input: CheckoutStartInput): Promise<CheckoutStartResult> {\n if (!input?.productId) {\n throw new NeetruError('validation_failed', 'checkout.start: productId is required');\n }\n if (!input?.planId) {\n throw new NeetruError('validation_failed', 'checkout.start: planId is required');\n }\n if (!input?.callbackUrl) {\n throw new NeetruError('validation_failed', 'checkout.start: callbackUrl is required');\n }\n\n const intentId = `chk_mock_${Math.random().toString(36).slice(2, 10)}`;\n const expiresAt = new Date(Date.now() + 15 * 60 * 1000).toISOString();\n const redirectUrl = `https://localhost:9003/portal/checkout/${intentId}`;\n\n this.intents.set(intentId, {\n intentId,\n uid: 'dev-fixture-uid',\n targetTenantId: input.tenantId ?? 'dev-fixture-uid',\n targetTenantType: input.tenantType ?? 'pf',\n productId: input.productId,\n planId: input.planId,\n callbackUrl: input.callbackUrl,\n status: 'pending',\n stripeSessionId: null,\n expiresAt,\n });\n\n return {\n intentId,\n redirectUrl,\n status: 'pending',\n expiresAt,\n requiresKyc: false,\n };\n }\n\n async get(intentId: string): Promise<CheckoutIntentInfo> {\n const found = this.intents.get(intentId);\n if (!found) {\n throw new NeetruError('not_found', `Mock intent ${intentId} not found`);\n }\n return { ...found };\n }\n\n async cancel(intentId: string): Promise<{ ok: true; alreadyCancelled: boolean }> {\n const found = this.intents.get(intentId);\n if (!found) {\n throw new NeetruError('not_found', `Mock intent ${intentId} not found`);\n }\n const alreadyCancelled = found.status === 'cancelled';\n this.intents.set(intentId, { ...found, status: 'cancelled' });\n return { ok: true, alreadyCancelled };\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────────────────\n\nexport function createCheckoutNamespace(config: ResolvedConfig): CheckoutNamespace {\n if (config.env === 'dev') return new MockCheckout();\n return createHttpCheckoutNamespace(config);\n}\n"]}
package/dist/db.cjs CHANGED
@@ -16,6 +16,31 @@ var NeetruError = class _NeetruError extends Error {
16
16
  };
17
17
 
18
18
  // src/http.ts
19
+ var DEFAULT_RETRIES = 2;
20
+ var RETRYABLE_CODES = /* @__PURE__ */ new Set([
21
+ "rate_limited",
22
+ "server_error",
23
+ "network_error"
24
+ ]);
25
+ function backoffMs(attempt) {
26
+ const base = 200 * Math.pow(4, attempt);
27
+ const jitter = base * 0.2 * (Math.random() * 2 - 1);
28
+ return Math.max(50, Math.round(base + jitter));
29
+ }
30
+ function parseRetryAfter(value) {
31
+ if (!value) return null;
32
+ const secs = Number(value);
33
+ if (Number.isFinite(secs) && secs >= 0) return Math.round(secs * 1e3);
34
+ const dateMs = Date.parse(value);
35
+ if (Number.isFinite(dateMs)) {
36
+ const delta = dateMs - Date.now();
37
+ if (delta > 0) return delta;
38
+ }
39
+ return null;
40
+ }
41
+ function sleep(ms) {
42
+ return new Promise((resolve) => setTimeout(resolve, ms));
43
+ }
19
44
  function statusToCode(status) {
20
45
  if (status === 401) return "unauthorized";
21
46
  if (status === 403) return "forbidden";
@@ -49,6 +74,7 @@ async function safeJson(res) {
49
74
  async function httpRequest(config, opts) {
50
75
  const method = opts.method ?? "GET";
51
76
  const url = buildUrl(config.baseUrl, opts.path, opts.query);
77
+ const maxRetries = opts.retries ?? DEFAULT_RETRIES;
52
78
  const headers = {
53
79
  accept: "application/json",
54
80
  ...opts.headers
@@ -62,24 +88,32 @@ async function httpRequest(config, opts) {
62
88
  }
63
89
  headers.authorization = `Bearer ${config.apiKey}`;
64
90
  }
65
- const init = { method, headers };
66
- if (opts.body !== void 0 && method !== "GET" && method !== "DELETE") {
91
+ const bodyString = opts.body !== void 0 && method !== "GET" && method !== "DELETE" ? JSON.stringify(opts.body) : void 0;
92
+ if (bodyString !== void 0) {
67
93
  headers["content-type"] = "application/json";
68
- init.body = JSON.stringify(opts.body);
69
94
  }
70
- init.signal = AbortSignal.timeout(3e4);
71
- let res;
72
- try {
73
- res = await config.fetch(url, init);
74
- } catch (err) {
75
- if (err instanceof DOMException && err.name === "TimeoutError") {
76
- throw new NeetruError("network_error", "Network error: timeout after 30s");
95
+ let lastError = null;
96
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
97
+ const init = { method, headers };
98
+ if (bodyString !== void 0) init.body = bodyString;
99
+ init.signal = AbortSignal.timeout(3e4);
100
+ let res;
101
+ try {
102
+ res = await config.fetch(url, init);
103
+ } catch (err2) {
104
+ const message2 = err2 instanceof DOMException && err2.name === "TimeoutError" ? "Network error: timeout after 30s" : `Network error: ${err2 instanceof Error ? err2.message : "fetch failed"}`;
105
+ lastError = new NeetruError("network_error", message2);
106
+ if (attempt < maxRetries) {
107
+ await sleep(backoffMs(attempt));
108
+ continue;
109
+ }
110
+ throw lastError;
111
+ }
112
+ const requestId = res.headers.get("x-request-id") ?? res.headers.get("x-correlation-id") ?? void 0;
113
+ if (res.ok) {
114
+ const parsed = await safeJson(res);
115
+ return parsed;
77
116
  }
78
- const message = err instanceof Error ? err.message : "fetch failed";
79
- throw new NeetruError("network_error", `Network error: ${message}`);
80
- }
81
- const requestId = res.headers.get("x-request-id") ?? res.headers.get("x-correlation-id") ?? void 0;
82
- if (!res.ok) {
83
117
  const body = await safeJson(res);
84
118
  let code = statusToCode(res.status);
85
119
  let message = `HTTP ${res.status}`;
@@ -92,10 +126,18 @@ async function httpRequest(config, opts) {
92
126
  if (typeof errField.message === "string") message = errField.message;
93
127
  }
94
128
  }
95
- throw new NeetruError(code, message, res.status, requestId);
129
+ const err = new NeetruError(code, message, res.status, requestId);
130
+ lastError = err;
131
+ const isRetryable = RETRYABLE_CODES.has(code);
132
+ if (isRetryable && attempt < maxRetries) {
133
+ const retryAfter = parseRetryAfter(res.headers.get("retry-after"));
134
+ const delay = retryAfter ?? backoffMs(attempt);
135
+ await sleep(delay);
136
+ continue;
137
+ }
138
+ throw err;
96
139
  }
97
- const parsed = await safeJson(res);
98
- return parsed;
140
+ throw lastError ?? new NeetruError("unknown", "unexpected httpRequest exit");
99
141
  }
100
142
 
101
143
  // src/db.ts
@@ -129,8 +171,7 @@ function createDbNamespace(config) {
129
171
  if (config.tenantId) headers["x-neetru-tenant"] = config.tenantId;
130
172
  return {
131
173
  async list(opts) {
132
- if (opts?.limit !== void 0) opts.limit;
133
- let path = `/sdk/v1/datastore/${name}`;
174
+ let path = `/api/sdk/v1/datastore/${name}`;
134
175
  const params = new URLSearchParams();
135
176
  if (opts?.limit !== void 0) params.set("limit", String(opts.limit));
136
177
  if (opts?.where && opts.where.length > 0) {
@@ -162,7 +203,7 @@ function createDbNamespace(config) {
162
203
  try {
163
204
  const raw = await httpRequest(config, {
164
205
  method: "GET",
165
- path: `/sdk/v1/datastore/${name}/${encodeURIComponent(id)}`,
206
+ path: `/api/sdk/v1/datastore/${name}/${encodeURIComponent(id)}`,
166
207
  requireAuth: true,
167
208
  headers
168
209
  });
@@ -178,7 +219,7 @@ function createDbNamespace(config) {
178
219
  }
179
220
  const raw = await httpRequest(config, {
180
221
  method: "POST",
181
- path: `/sdk/v1/datastore/${name}`,
222
+ path: `/api/sdk/v1/datastore/${name}`,
182
223
  body: { data },
183
224
  requireAuth: true,
184
225
  headers
@@ -194,7 +235,7 @@ function createDbNamespace(config) {
194
235
  }
195
236
  await httpRequest(config, {
196
237
  method: "PUT",
197
- path: `/sdk/v1/datastore/${name}/${encodeURIComponent(id)}`,
238
+ path: `/api/sdk/v1/datastore/${name}/${encodeURIComponent(id)}`,
198
239
  body: { data },
199
240
  requireAuth: true,
200
241
  headers
@@ -207,7 +248,7 @@ function createDbNamespace(config) {
207
248
  }
208
249
  await httpRequest(config, {
209
250
  method: "PATCH",
210
- path: `/sdk/v1/datastore/${name}/${encodeURIComponent(id)}`,
251
+ path: `/api/sdk/v1/datastore/${name}/${encodeURIComponent(id)}`,
211
252
  body: { data },
212
253
  requireAuth: true,
213
254
  headers
@@ -220,7 +261,7 @@ function createDbNamespace(config) {
220
261
  }
221
262
  await httpRequest(config, {
222
263
  method: "DELETE",
223
- path: `/sdk/v1/datastore/${name}/${encodeURIComponent(id)}`,
264
+ path: `/api/sdk/v1/datastore/${name}/${encodeURIComponent(id)}`,
224
265
  requireAuth: true,
225
266
  headers
226
267
  });