@openrails/billing-ui 0.235.0 → 0.236.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 (60) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/README.md +103 -73
  3. package/dist/account/account-billing.d.ts +1 -3
  4. package/dist/account/payment-methods-panel.d.ts +1 -3
  5. package/dist/buy-button.d.ts +35 -0
  6. package/dist/cart.d.ts +18 -0
  7. package/dist/checkout.d.ts +1 -3
  8. package/dist/client/checkout.d.ts +28 -0
  9. package/dist/client/client.d.ts +71 -47
  10. package/dist/client/errors.d.ts +4 -0
  11. package/dist/client/generated/error-codes.d.ts +1 -1
  12. package/dist/client/generated/routes.d.ts +117 -88
  13. package/dist/client/generated/wire.d.ts +88 -66
  14. package/dist/client/index.d.ts +2 -2
  15. package/dist/client/types.d.ts +230 -17
  16. package/dist/{client-BpzCZes3.js → client-BuvolBPT.js} +477 -316
  17. package/dist/client-BuvolBPT.js.map +1 -0
  18. package/dist/client.js +2 -2
  19. package/dist/components/stripe-card.d.ts +8 -2
  20. package/dist/components/stripe-wallets.d.ts +12 -0
  21. package/dist/components/ui/badge.d.ts +1 -1
  22. package/dist/components/ui/button.d.ts +1 -1
  23. package/dist/frame.d.ts +5 -5
  24. package/dist/hooks-2d-XjpuI.js +526 -0
  25. package/dist/hooks-2d-XjpuI.js.map +1 -0
  26. package/dist/i18n/context.d.ts +1 -1
  27. package/dist/index.d.ts +7 -5
  28. package/dist/index.js +1966 -1655
  29. package/dist/index.js.map +1 -1
  30. package/dist/lib/money.d.ts +1 -0
  31. package/dist/lib/offer-label.d.ts +4 -0
  32. package/dist/locales/de.js +20 -0
  33. package/dist/locales/de.js.map +1 -1
  34. package/dist/locales/en.d.ts +20 -0
  35. package/dist/locales/en.js +20 -0
  36. package/dist/locales/en.js.map +1 -1
  37. package/dist/locales/es.js +20 -0
  38. package/dist/locales/es.js.map +1 -1
  39. package/dist/locales/ja.js +11 -0
  40. package/dist/locales/ja.js.map +1 -1
  41. package/dist/locales/ko.js +11 -0
  42. package/dist/locales/ko.js.map +1 -1
  43. package/dist/locales/zh.js +11 -0
  44. package/dist/locales/zh.js.map +1 -1
  45. package/dist/offers.d.ts +33 -0
  46. package/dist/order-checkout.d.ts +30 -0
  47. package/dist/react/hooks.d.ts +8 -7
  48. package/dist/react/index.d.ts +1 -1
  49. package/dist/react/provider.d.ts +24 -2
  50. package/dist/react.js +2 -33
  51. package/dist/save-payment-method.d.ts +0 -6
  52. package/dist/styles.css +1 -1
  53. package/dist/types.d.ts +16 -16
  54. package/docs/payment-form-contract.md +6 -6
  55. package/package.json +1 -1
  56. package/dist/client-BpzCZes3.js.map +0 -1
  57. package/dist/config-qLcHvK0Q.js +0 -341
  58. package/dist/config-qLcHvK0Q.js.map +0 -1
  59. package/dist/provider.d.ts +0 -18
  60. package/dist/react.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-BuvolBPT.js","names":[],"sources":["../src/client/checkout.ts","../src/lib/money.ts","../src/types.ts","../src/client/errors.ts","../src/client/generated/currencies.ts","../src/psp.ts","../src/client/types.ts","../src/client/client.ts"],"sourcesContent":["// The purchase calls billing-ui's own components make: an app buys through\n// <BuyButton> and <Offers>, never with these, so they are not exported. With\n// orders (#1168) BuyButton creates an order instead, and apps don't change.\nimport type { CheckoutSource } from \"../source\"\nimport type { CheckoutSessionLink } from \"./types\"\n\nexport interface CheckoutSourceOptions {\n /**\n * A customer surface's base: its `/me` prefix, such as `/billing/v1/me` or\n * a host's own `/api/v1/merchants/acme/billing/me`. The session is read and\n * paid there with this client's credential, which proves the session's\n * customer, so its saved cards pay. Default: the session id alone, at\n * `{baseUrl}/checkout-sessions`.\n */\n customerBase?: string\n}\n\nexport interface CheckoutCalls {\n createCheckoutSession(input: {\n priceKey?: string\n productKey?: string\n priceId?: string\n /** Customer-selected deposit in the price currency's native units. */\n amount?: string\n /** Defaults to true for recurring prices; false buys the initial term only. */\n autoRenew?: boolean\n successUrl?: string\n }): Promise<CheckoutSessionLink>\n checkoutSource(sessionId: string, opts?: CheckoutSourceOptions): CheckoutSource\n}\n\nconst calls = new WeakMap<object, CheckoutCalls>()\n\nexport function registerCheckout(client: object, checkout: CheckoutCalls) {\n calls.set(client, checkout)\n}\n\n/** The checkout calls of a client from createBillingClient. */\nexport function checkoutOf(client: object): CheckoutCalls {\n const checkout = calls.get(client)\n if (!checkout)\n throw new Error(\"billing-ui: the client must come from createBillingClient\")\n return checkout\n}\n","// Exact money. Every amount OpenRails serves is a signed int64 decimal string\n// of the plan currency's native unit, at plan.unit_decimals (the currency\n// registry's scale). Amounts are scaled with BigInt, never a JS number; only\n// the exact major-unit decimal reaches Intl.\n\n// Amount is an int64 decimal string, e.g. \"99000000\" (99 USD at 6 decimals).\nexport type Amount = string\n\nconst INT64_MIN = -(1n << 63n)\nconst INT64_MAX = (1n << 63n) - 1n\nexport const MAX_UNIT_DECIMALS = 18\n\n// amountUnits parses an exact int64 decimal string, or null.\nexport function amountUnits(amount: unknown): bigint | null {\n if (typeof amount !== \"string\" || !/^-?\\d{1,19}$/.test(amount)) return null\n const value = BigInt(amount)\n return value < INT64_MIN || value > INT64_MAX ? null : value\n}\n\nexport function isAmount(value: unknown): value is Amount {\n return amountUnits(value) !== null\n}\n\nexport function isUnitDecimals(value: unknown): value is number {\n return (\n typeof value === \"number\" &&\n Number.isInteger(value) &&\n value >= 0 &&\n value <= MAX_UNIT_DECIMALS\n )\n}\n\n// addAmounts sums exact amounts; null when an input or the sum leaves int64.\nexport function addAmounts(...amounts: Amount[]): Amount | null {\n let total = 0n\n for (const amount of amounts) {\n const units = amountUnits(amount)\n if (units === null) return null\n total += units\n }\n return total < INT64_MIN || total > INT64_MAX ? null : total.toString()\n}\n\n// Intl.NumberFormat formats a decimal string exactly only since ECMA-402 2023\n// (Chrome/Edge 106, Firefox 116, Safari 15.4); older engines coerce it through\n// Number. Probed once with 2^53 + 1, which a Number cannot hold.\nexport const intlFormatsDecimalStringsExactly: boolean = (() => {\n try {\n return (\n new Intl.NumberFormat(\"en\", { useGrouping: false }).format(\n \"9007199254740993\" as `${number}`\n ) === \"9007199254740993\"\n )\n } catch {\n return false\n }\n})()\n\n// Below 10^15 native units a Number-coerced decimal still rounds back to the\n// exact digits at every registry scale; from 10^15 the coerced value can differ\n// in the last digit, so a legacy engine refuses instead of misformatting.\nconst LEGACY_EXACT_UNITS = 10n ** 15n\n\nfunction decimalFromUnits(value: bigint, decimals: number): string {\n const absolute = value < 0n ? -value : value\n const scale = 10n ** BigInt(decimals)\n const fraction = (absolute % scale)\n .toString()\n .padStart(decimals, \"0\")\n .replace(/0+$/, \"\")\n return `${value < 0n ? \"-\" : \"\"}${absolute / scale}${fraction ? `.${fraction}` : \"\"}`\n}\n\n// amountToDecimal renders native units as the exact major-unit decimal with\n// trailing zeros trimmed (\"99000000\" at 6 -> \"99\", \"1234567\" -> \"1.234567\"),\n// or null when the amount or scale is invalid.\nexport function amountToDecimal(\n amount: Amount,\n decimals: number\n): string | null {\n const units = amountUnits(amount)\n if (units === null || !isUnitDecimals(decimals)) return null\n return decimalFromUnits(units, decimals)\n}\n\n// amountToMinorUnits is an amount in the provider's minor units (Stripe's\n// `amount`: \"12500000\" USD at 6 and 2 -> 1250), or null when the amount is not\n// a whole number of them or leaves the exact range of a JS number.\nexport function amountToMinorUnits(\n amount: Amount,\n decimals: number,\n minorDecimals: number\n): number | null {\n const units = amountUnits(amount)\n if (\n units === null ||\n !isUnitDecimals(decimals) ||\n !isUnitDecimals(minorDecimals) ||\n minorDecimals > decimals\n )\n return null\n const scale = 10n ** BigInt(decimals - minorDecimals)\n if (units % scale !== 0n) return null\n const minor = units / scale\n return minor > BigInt(Number.MAX_SAFE_INTEGER) ||\n minor < -BigInt(Number.MAX_SAFE_INTEGER)\n ? null\n : Number(minor)\n}\n\n// decimalToAmount parses a major-unit decimal exactly (\"100.25\" at 6 ->\n// \"100250000\"). Excess precision, scientific notation and int64 overflow\n// are refused; input is never rounded or converted through a JS number.\nexport function decimalToAmount(\n decimal: string,\n decimals: number\n): Amount | null {\n if (!isUnitDecimals(decimals) || decimal.length > 40) return null\n const match = /^(-?)(\\d+)(?:\\.(\\d+))?$/.exec(decimal)\n if (!match) return null\n const fraction = match[3] ?? \"\"\n if (fraction.length > decimals) return null\n const units =\n BigInt(match[2]) * 10n ** BigInt(decimals) +\n BigInt(fraction.padEnd(decimals, \"0\") || \"0\")\n const signed = match[1] ? -units : units\n return signed < INT64_MIN || signed > INT64_MAX ? null : signed.toString()\n}\n\n// formatAmount renders an exact amount in its currency for the buyer. It never\n// passes money through a JS number; an amount it cannot show exactly is\n// refused with a visible notice rather than a rounded figure.\nexport function formatAmount(\n amount: Amount | null | undefined,\n currency: string,\n decimals: number,\n locale?: string\n): string {\n const code = currency.trim().toUpperCase()\n const units = amountUnits(amount)\n if (units === null || !isUnitDecimals(decimals))\n return `${code} amount exceeds the exact display range`\n if (\n !intlFormatsDecimalStringsExactly &&\n (units >= LEGACY_EXACT_UNITS || units <= -LEGACY_EXACT_UNITS)\n )\n return `${code} amount exceeds this browser's exact display range`\n const decimal = decimalFromUnits(units, decimals) as `${number}`\n try {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency: code,\n maximumFractionDigits: decimals,\n }).format(decimal)\n } catch {\n return `${decimal} ${code}`\n }\n}\n","// Wire types for the checkout session surface, validated at runtime with zod\n// so a drifting API fails loudly at the boundary instead of rendering garbage.\n// OpenRails serves the session (GET /v1/checkout-sessions/{id}) and pins its\n// shape in testdata/wire/checkout_session.json; src/types.test.ts decodes a copy.\nimport { z } from \"zod\"\n\nimport { isAmount, isUnitDecimals, MAX_UNIT_DECIMALS } from \"./lib/money\"\n\n// optional reads a field OpenRails always sends, null when empty, as\n// undefined.\nconst optional = <T extends z.ZodType>(schema: T) =>\n schema\n .nullish()\n .transform((value) => value ?? undefined)\n .optional()\n\n// Money is an exact signed int64 decimal string of the plan currency's native\n// unit (\"99000000\" is 99 USD at unit_decimals 6). A JSON number is refused:\n// it cannot carry every int64 and a scale must never be assumed.\nexport const amountSchema = z\n .string()\n .refine(isAmount, \"amount must be an int64 decimal string\")\n\n// The currency's scale from OpenRails' currency registry\n// (billing.LookupCurrency / GET /v1/config).\nexport const unitDecimalsSchema = z\n .number()\n .refine(\n isUnitDecimals,\n `unit_decimals must be an integer from 0 to ${MAX_UNIT_DECIMALS}`\n )\n\nconst httpsURLSchema = z\n .string()\n .url()\n .refine((value) => {\n try {\n const parsed = new URL(value)\n return (\n parsed.protocol === \"https:\" && !parsed.username && !parsed.password\n )\n } catch {\n return false\n }\n }, \"redirect URL must be HTTPS\")\n\nconst returnURLSchema = z\n .string()\n .url()\n .refine((value) => {\n try {\n const parsed = new URL(value)\n return (\n (parsed.protocol === \"https:\" || parsed.protocol === \"http:\") &&\n !parsed.username &&\n !parsed.password\n )\n } catch {\n return false\n }\n }, \"return URL must be HTTP(S)\")\n\nexport const checkoutSessionStatusSchema = z.enum([\n \"created\",\n \"requires_action\",\n \"processing\",\n \"succeeded\",\n \"failed\",\n \"blocked\",\n \"expired\",\n \"canceled\",\n])\nexport type CheckoutSessionStatus = z.infer<typeof checkoutSessionStatusSchema>\n\n// A definite decline, normalized by OpenRails. `field` places the message\n// next to the card field it concerns (\"\" = the card as a whole).\nexport const paymentFailureSchema = z.object({\n reason: z.string(),\n message: z.string(),\n field: z.string().nullish(),\n})\nexport type PaymentFailure = z.infer<typeof paymentFailureSchema>\n\n// The accepted payment operation; `requires_action` sessions authenticate it.\nexport const checkoutOperationSchema = z.object({\n id: z.string(),\n status: z.string(),\n})\n\nexport const paymentOptionSchema = z.object({\n id: z.string().min(1),\n /** The PSP the option pays on; saving a Stripe Elements card names it. */\n psp_id: optional(z.string()),\n rail: z.string(),\n mode: z.enum([\"one_off\", \"subscription\"]),\n // card: the PSP takes cards on OpenRails itself (card_entry: server); the\n // page posts the card and loads no gateway script.\n driver: z.enum([\n \"collect_js\",\n \"card\",\n \"stripe_elements\",\n \"redirect\",\n \"solana_pay\",\n ]),\n /** The PSP's checkout key; saving a new card names it. */\n psp_key: optional(z.string()),\n // Browser-safe rail config (nmi: Collect.js tokenization_key +\n // tokenization_url; stripe: publishable_key; driver card: none).\n public_config: optional(z.record(z.string(), z.string())),\n})\nexport type PaymentOption = z.infer<typeof paymentOptionSchema>\n\n// The step a payment awaits: Stripe's or CCBill's page (an https URL, opened\n// in the top window), or a Solana Pay link shown as a QR code.\nexport const nextActionSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"redirect_to_url\"), url: httpsURLSchema }),\n z.object({\n type: z.literal(\"solana_pay\"),\n url: z.string().startsWith(\"solana:\"),\n }),\n])\nexport type NextAction = z.infer<typeof nextActionSchema>\n\n// A card the session's customer has already stored with this merchant. Display\n// data only — paying with one sends its id, which OpenRails resolves.\nexport const savedPaymentMethodSchema = z.object({\n id: z.string(),\n option_id: z.string(),\n rail: z.string(),\n card: z\n .object({\n brand: z.string().nullish(),\n last4: z.string().nullish(),\n exp_month: z.number().nullish(),\n exp_year: z.number().nullish(),\n })\n .nullish(),\n})\nexport type SavedPaymentMethod = z.infer<typeof savedPaymentMethodSchema>\n\n// Amounts are in the plan's currency at the plan's unit_decimals.\nexport const checkoutLineItemSchema = z.object({\n label: z.string(),\n sublabel: optional(z.string()),\n amount: amountSchema,\n})\nexport type CheckoutLineItem = z.infer<typeof checkoutLineItemSchema>\n\nexport const checkoutPlanSchema = z.object({\n auto_renew: z.boolean(),\n display_name: z.string(),\n unit_amount: amountSchema,\n currency: z.string().min(1),\n unit_decimals: unitDecimalsSchema,\n billing_interval_hours: optional(z.number()),\n access_duration_hours: optional(z.number()),\n})\nexport type CheckoutPlan = z.infer<typeof checkoutPlanSchema>\n\nexport const checkoutSessionSchema = z.object({\n id: z.string(),\n status: checkoutSessionStatusSchema,\n merchant: z.object({ display_name: z.string() }),\n plan: checkoutPlanSchema,\n line_items: optional(z.array(checkoutLineItemSchema)),\n tax: optional(amountSchema),\n due_today: optional(amountSchema),\n options: z.array(paymentOptionSchema),\n saved_methods: optional(z.array(savedPaymentMethodSchema)),\n next_action: nextActionSchema.nullish(),\n payment_id: optional(z.string()),\n subscription_id: optional(z.string()),\n failure_message: optional(z.string()),\n failure: paymentFailureSchema.nullish(),\n operation: checkoutOperationSchema.nullish(),\n // Lets the page's host redirect on success.\n success_url: optional(returnURLSchema),\n // The origin of the app that framed the payment page: the only origin the\n // page exchanges frame messages with.\n embed_origin: optional(z.string().url()),\n expires_at: optional(z.string()),\n})\nexport type CheckoutSession = z.infer<typeof checkoutSessionSchema>\n\nexport const payRequestSchema = z.object({\n option_id: z.string(),\n payment_token: z.string().optional(),\n payment_method_id: z.string().optional(),\n // A new card for a rail whose driver is card; never beside payment_token.\n card: z\n .object({\n number: z.string(),\n exp_month: z.number(),\n exp_year: z.number(),\n cvc: z.string(),\n })\n .optional(),\n // A new card's billing identity; the compact card form sends the name,\n // postal code and country.\n billing_details: z\n .object({\n name: z.string().optional(),\n email: z.string().optional(),\n phone: z.string().optional(),\n address: z\n .object({\n line1: z.string().optional(),\n line2: z.string().optional(),\n city: z.string().optional(),\n state: z.string().optional(),\n postal_code: z.string().optional(),\n country: z.string().optional(),\n })\n .optional(),\n })\n .optional(),\n token_symbol: z.string().optional(),\n})\nexport type PayRequest = z.infer<typeof payRequestSchema>\n\nexport const payResultSchema = z.object({\n status: checkoutSessionStatusSchema,\n next_action: nextActionSchema.nullish(),\n /** The card payment to authenticate when status is requires_action. */\n operation: checkoutOperationSchema.nullish(),\n payment_id: optional(z.string()),\n subscription_id: optional(z.string()),\n failure_message: optional(z.string()),\n failure: paymentFailureSchema.nullish(),\n})\nexport type PayResult = z.infer<typeof payResultSchema>\n\n// The lifecycle phases the Checkout component moves through. Superset of\n// session statuses: load/ready concerns are the component's, not the wire's.\nexport type CheckoutPhase =\n | \"loading\"\n | \"ready\"\n | \"processing\"\n | \"succeeded\"\n | \"failed\"\n | \"blocked\"\n | \"expired\"\n | \"unavailable\"\n | \"error\"\n","// Mirrors OpenRails internal/api.ErrorResponse:\n// {\"error\":{\"type\",\"code\",\"message\",\"request_id?\",\"param?\",\"metadata?\"}}.\nexport interface BillingErrorBody {\n type: string\n code: string\n message: string\n request_id?: string\n param?: string\n metadata?: Record<string, unknown>\n /** The order a failed payment left open (402 card_error). */\n order?: unknown\n}\n\n// Local codes: network_error, invalid_response, unknown_error, and the wallet\n// codes a wallet next action raises (wallet_rejected, wallet_no_signature,\n// wallet_required).\nexport class BillingError extends Error {\n readonly status: number\n readonly type: string\n readonly code: string\n readonly param?: string\n readonly requestId?: string\n readonly metadata: Record<string, unknown>\n /** The order a failed payment left open, unvalidated. */\n readonly order?: unknown\n\n constructor(status: number, body: BillingErrorBody) {\n super(body.message)\n this.name = \"BillingError\"\n this.status = status\n this.type = body.type\n this.code = body.code\n this.param = body.param\n this.requestId = body.request_id\n this.metadata = body.metadata ?? {}\n this.order = body.order\n }\n}\n\nexport const isBillingError = (value: unknown): value is BillingError =>\n value instanceof BillingError\n\n/** A server failure (HTTP 5xx) from any client or host source that carries a numeric `status`. */\nexport const isServerError = (value: unknown): boolean => {\n const status = (value as { status?: unknown } | null)?.status\n return typeof status === \"number\" && status >= 500 && status < 600\n}\n\nexport function localError(code: string, message: string): BillingError {\n return new BillingError(0, { type: \"local\", code, message })\n}\n\nexport async function readBillingError(res: Response): Promise<BillingError> {\n let body: unknown\n try {\n body = await res.json()\n } catch {\n body = undefined\n }\n const err = (body as { error?: unknown } | undefined)?.error\n if (err && typeof err === \"object\") {\n const e = err as Partial<BillingErrorBody>\n if (typeof e.code === \"string\" && e.code) {\n return new BillingError(res.status, {\n type: typeof e.type === \"string\" ? e.type : \"\",\n code: e.code,\n message: typeof e.message === \"string\" ? e.message : e.code,\n request_id:\n typeof e.request_id === \"string\"\n ? e.request_id\n : (res.headers.get(\"X-Request-ID\") ?? undefined),\n param: typeof e.param === \"string\" ? e.param : undefined,\n metadata:\n e.metadata && typeof e.metadata === \"object\" ? e.metadata : undefined,\n order: e.order,\n })\n }\n }\n return new BillingError(res.status, {\n type: res.status >= 500 ? \"api_error\" : \"\",\n code:\n typeof err === \"string\" && err\n ? err\n : res.status >= 500\n ? \"server_error\"\n : \"unknown_error\",\n message: `HTTP ${res.status}`,\n })\n}\n\n// Normalizes anything a client call can throw into a BillingError.\nexport function toBillingError(error: unknown): BillingError {\n if (error instanceof BillingError) return error\n if (error instanceof TypeError)\n return localError(\"network_error\", error.message)\n return localError(\n \"unknown_error\",\n error instanceof Error ? error.message : String(error)\n )\n}\n","// Generated by `go run ./scripts/contracts -write` from the currency registry (billing.Currencies). Do not edit.\n\n// Currency code to native-unit decimals.\nexport const OPENRAILS_CURRENCY_SCALES: Readonly<Record<string, number>> = {\n AED: 6,\n AUD: 6,\n BRL: 6,\n CAD: 6,\n CHF: 6,\n CNY: 6,\n CZK: 6,\n DKK: 6,\n EUR: 6,\n GBP: 6,\n HKD: 6,\n ILS: 6,\n INR: 6,\n JPY: 4,\n KRW: 4,\n MXN: 6,\n MYR: 6,\n NOK: 6,\n NZD: 6,\n PHP: 6,\n PLN: 6,\n PYUSD: 6,\n SAR: 6,\n SEK: 6,\n SGD: 6,\n SOL: 9,\n THB: 6,\n TRY: 6,\n USD: 6,\n USD1: 6,\n USDC: 6,\n USDG: 6,\n USDT: 6,\n ZAR: 6,\n}\n","// OpenRails's browser-safe PSP projection (GET /config's payment). Which\n// browser flow a PSP needs is decided here, never by the host.\nimport { z } from \"zod\"\n\nimport type { PaymentMethod } from \"./client/types\"\nimport type { PaymentOption, SavedPaymentMethod } from \"./types\"\n\nexport const pspConfigSchema = z.object({\n psp_id: z.string().min(1),\n /** The PSP's key. */\n key: z.string().min(1),\n rail: z.string(),\n /** Who holds the card: \"psp\" or a third-party custodian. */\n custodian: z.string(),\n display_name: z.string(),\n /** `tokenize | card | elements | redirect | wallet` */\n flow: z.string(),\n config: z.record(z.string(), z.string()).nullish(),\n /**\n * New purchases and new cards use this PSP (the operator's checkout PSP).\n * Other PSPs stay listed so existing cards and subscriptions keep working.\n */\n checkout: z.boolean().nullish(),\n /**\n * `temporarily_unavailable`: the PSP could not be checked just now and is\n * listed without `config`; ask again after `retry_after` seconds.\n */\n status: z.string().nullish(),\n retry_after: z.number().int().nullish(),\n})\nexport type PspConfig = z.infer<typeof pspConfigSchema>\n\nconst cardDrivers = new Set<PaymentOption[\"driver\"]>([\n \"collect_js\",\n \"card\",\n \"stripe_elements\",\n])\n\n/** Whether a rail takes a card in the page (saved or new). */\nexport const isCardRail = (rail: PaymentOption): boolean =>\n cardDrivers.has(rail.driver)\n\n/** PSPs that take new purchases and new cards. */\nexport const checkoutPsps = (psps: readonly PspConfig[]): PspConfig[] =>\n psps.filter((psp) => psp.checkout !== false)\n\nconst cardFlows = new Set([\"tokenize\", \"card\", \"elements\"])\n\n/**\n * Seconds until a card PSP listed as temporarily unavailable is worth asking\n * for again; null when none is.\n */\nexport function cardRetryAfter(psps: readonly PspConfig[]): number | null {\n const waits = psps\n .filter(\n (psp) =>\n !!psp.status && psp.custodian === \"psp\" && cardFlows.has(psp.flow)\n )\n .map((psp) => psp.retry_after ?? 30)\n return waits.length > 0 ? Math.min(...waits) : null\n}\n\n/** Saved cards the checkout can charge in place, for the given rails, newest first. */\nexport function savedMethodsFor(\n methods: readonly PaymentMethod[],\n rails: readonly PaymentOption[]\n): SavedPaymentMethod[] {\n const recent = [...methods].sort((a, b) =>\n (b.created_at ?? \"\").localeCompare(a.created_at ?? \"\")\n )\n return recent.flatMap((method) => {\n const rail = rails.find(\n (item) => (item.psp_id ?? item.id) === method.psp_id && isCardRail(item)\n )\n if (!rail || method.health?.active === false) return []\n return [\n {\n id: method.id,\n option_id: rail.id,\n rail: rail.rail,\n card: method.card ?? null,\n },\n ]\n })\n}\n\nexport type CardSetupDriver = \"collect_js\" | \"card\" | \"stripe_elements\"\n\nconst usable = (value?: string) => !!value && !value.startsWith(\"preview_\")\n\nconst stripeKey = (psp: PspConfig) =>\n psp.rail === \"stripe\" && !!psp.config?.publishable_key?.startsWith(\"pk_\")\n\n/** How a card is saved with this PSP in the page, or null when it cannot be. */\nexport function cardSetupDriver(psp: PspConfig): CardSetupDriver | null {\n if (psp.custodian !== \"psp\" || psp.status) return null\n // The PSP takes cards on OpenRails itself (card_entry: server).\n if (psp.flow === \"card\" && psp.rail === \"nmi\") return \"card\"\n if (\n psp.flow === \"tokenize\" &&\n usable(psp.config?.tokenization_key) &&\n !!psp.config?.tokenization_url\n )\n return \"collect_js\"\n if (stripeKey(psp)) return \"stripe_elements\"\n return null\n}\n\nexport const canSavePaymentMethod = (psp: PspConfig): boolean =>\n cardSetupDriver(psp) !== null\n\n/** Whether a pending payment on this PSP can be authenticated in the page. */\nexport const canAuthenticatePayment = (psp: PspConfig): boolean =>\n cardSetupDriver(psp) === \"stripe_elements\"\n\n/** The PSP config behind a checkout rail, for card setup and authentication. */\nexport function railPsp(rail: PaymentOption): PspConfig {\n return {\n psp_id: rail.psp_id ?? rail.id,\n key: rail.psp_key ?? rail.rail,\n rail: rail.rail,\n custodian: \"psp\",\n display_name: \"\",\n flow:\n rail.driver === \"stripe_elements\"\n ? \"elements\"\n : rail.driver === \"card\"\n ? \"card\"\n : \"tokenize\",\n config: rail.public_config ?? null,\n }\n}\n","// Wire types of the OpenRails customer surface (`/billing/v1/me/*`) and public\n// catalog, validated at the boundary. Money is an int64 string in the\n// currency's native unit; its scale comes from GET /config's currencies.\n// Fixtures: the repository's canonical testdata/wire.\nimport { z } from \"zod\"\n\nimport { pspConfigSchema } from \"../psp\"\n\nimport type { CardEntry } from \"../lib/card-entry\"\nimport { isAmount } from \"../lib/money\"\n\nconst amount = z.string().refine(isAmount, \"amount must be an int64 string\")\nconst time = z.string()\n\nexport const pageSchema = <T extends z.ZodType>(item: T) =>\n z.object({\n data: z\n .array(item)\n .nullish()\n .transform((v) => v ?? []),\n total: z.number().nullish(),\n limit: z.number().nullish(),\n offset: z.number().nullish(),\n has_more: z.boolean().nullish(),\n next_cursor: z.string().nullish(),\n })\n\nexport interface Page<T> {\n data: T[]\n total?: number | null\n limit?: number | null\n offset?: number | null\n has_more?: boolean | null\n /** The next page's cursor; null on the last page of a cursor list. */\n next_cursor?: string | null\n}\n\n/** One page of a cursor list; `next_cursor` is null on the last page. */\nexport const listPageSchema = <T extends z.ZodType>(item: T) =>\n z.object({\n data: z\n .array(item)\n .nullish()\n .transform((v) => v ?? []),\n next_cursor: z\n .string()\n .nullish()\n .transform((v) => v ?? null),\n })\n\nexport interface ListPage<T> {\n data: T[]\n next_cursor: string | null\n}\n\nexport const subscriptionStatusSchema = z.string()\n/** `pending | active | past_due | awaiting_method | unverified | canceled`; kept open for new values. */\nexport type SubscriptionStatus =\n | \"pending\"\n | \"active\"\n | \"past_due\"\n | \"awaiting_method\"\n | \"unverified\"\n | \"canceled\"\n | (string & {})\n\nexport const pspLinkStateSchema = z.object({\n /** `linked | pending_manual_link | sync_disabled | error` */\n status: z.string(),\n ids: z.record(z.string(), z.string()).nullish(),\n sync_status: z.string().nullish(),\n})\n\n/**\n * A catalog price, embedded in a product (`GET /catalog/products`): `unit_amount` of\n * `currency` for `access_duration_hours` of access (null: for good),\n * charging every `billing_interval_hours` (null: one-time).\n */\nexport const priceSchema = z.object({\n id: z.string(),\n key: z.string(),\n /** The price key's revision: every change to any of its versions; absent on older servers. */\n revision: z.number().int().nonnegative().optional(),\n /** This price's terms within its key, from zero; absent on older servers. */\n version: z.number().int().nonnegative().optional(),\n product_id: z.string(),\n archived: z.boolean(),\n unit_amount: amount,\n /** Optional bounds for a deposit whose amount is selected before checkout. */\n customer_amount: z\n .object({ min_amount: amount, max_amount: amount })\n .nullish(),\n currency: z.string(),\n access_duration_hours: z.number().nullable(),\n billing_interval_hours: z.number().nullable(),\n trial_unit_amount: amount.nullable(),\n trial_duration_hours: z.number().nullable(),\n /** Keyed by PSP key. */\n psps: z.record(z.string(), pspLinkStateSchema).nullish(),\n created_at: time,\n updated_at: time,\n})\nexport type Price = z.infer<typeof priceSchema>\n\nexport const subscriptionProductSchema = z.object({\n id: z.string(),\n key: z.string().nullish(),\n revision: z.number().int().nonnegative().optional(),\n display_name: z.string().nullish(),\n description: z.string().nullish(),\n tier_group: z.string().nullish(),\n tier_rank: z.number().nullish(),\n})\nexport type SubscriptionProduct = z.infer<typeof subscriptionProductSchema>\n\nexport const cardSummarySchema = z.object({\n brand: z.string().nullish(),\n last4: z.string().nullish(),\n exp_month: z.number().nullish(),\n exp_year: z.number().nullish(),\n})\nexport type CardSummary = z.infer<typeof cardSummarySchema>\n\nexport const paymentOperationSchema = z.object({\n id: z.string(),\n status: z.string(),\n})\nexport type PaymentOperation = z.infer<typeof paymentOperationSchema>\n\nexport const paymentRecoverySchema = z.object({\n last_failure_reason: z.string().nullish(),\n retryable: z.boolean(),\n blocked_reason: z.string().nullish(),\n operation: paymentOperationSchema.nullish(),\n /** An engine-owned subscription's unpaid renewal: the order to pay. */\n order_id: z.string().nullish(),\n})\nexport type PaymentRecovery = z.infer<typeof paymentRecoverySchema>\n\n/**\n * A step the customer takes before an action completes. With\n * `solana_sign_transactions` the wallet signs and sends `transactions` in\n * order; the action is then repeated with the last signature.\n */\nexport const nextActionSchema = z.object({\n /** `redirect_to_url | payment_authentication | solana_sign_transactions` */\n type: z.string(),\n redirect_to_url: z.object({ url: z.string().nullish() }).nullish(),\n transactions: z.array(z.string()).nullish(),\n})\nexport type NextAction = z.infer<typeof nextActionSchema>\n\n/**\n * A declined renewal being collected. `retries_left` and `final_retry_at`\n * follow the merchant's dunning policy; both are null when the provider runs\n * the retries. While `waiting_for_new_card`, nothing is charged until the card\n * is replaced, and the subscription ends at `final_retry_at`.\n */\nexport const subscriptionDunningSchema = z.object({\n attempts: z.number(),\n retries_left: z.number().nullish(),\n next_retry_at: time.nullish(),\n final_retry_at: time.nullish(),\n waiting_for_new_card: z.boolean(),\n last_failure_reason: z.string().nullish(),\n})\nexport type SubscriptionDunning = z.infer<typeof subscriptionDunningSchema>\n\nexport const subscriptionSchema = z.object({\n id: z.string(),\n status: subscriptionStatusSchema,\n rail: z.string().nullish(),\n product_id: z.string().nullish(),\n price_id: z.string().nullish(),\n /** Seats of a per-seat price; null otherwise. */\n quantity: z.number().nullish(),\n psp_id: z.string().nullish(),\n /** `engine | nmi_schedule | provider` */\n collection_policy: z.string().nullish(),\n /** The subscription's own card; null follows the default card. */\n payment_method_id: z.string().nullish(),\n started_at: time.nullish(),\n ended_at: time.nullish(),\n current_period_starts_at: time.nullish(),\n current_period_ends_at: time.nullish(),\n canceled_at: time.nullish(),\n cancel_type: z.string().nullish(),\n resumable: z.boolean().nullish(),\n cancel_scheduled: z.boolean().nullish(),\n /** `reversible | destructive | external_portal` */\n cancel_mode: z.string().nullish(),\n cancel_portal_url: z.string().nullish(),\n access: z.object({ starts_at: time, ends_at: time.nullish() }).nullish(),\n /** Null unless the subscription is `past_due` or `awaiting_method`. */\n dunning: subscriptionDunningSchema.nullish(),\n price: priceSchema.nullish(),\n product: subscriptionProductSchema.nullish(),\n /** The change waiting for the next renewal, with its price and product. */\n scheduled_change: z\n .object({\n price_id: z.string(),\n quantity: z.number().nullish(),\n effective_at: time,\n /** `change | migration` */\n source: z.string(),\n price: priceSchema.nullish(),\n product: subscriptionProductSchema.nullish(),\n })\n .nullish(),\n card: cardSummarySchema.nullish(),\n recovery: paymentRecoverySchema.nullish(),\n /** Set on an action's answer when the rail needs the customer's step. */\n next_action: nextActionSchema.nullish(),\n created_at: time.nullish(),\n updated_at: time.nullish(),\n})\nexport type Subscription = z.infer<typeof subscriptionSchema> & {\n status: SubscriptionStatus\n}\n\nexport const billingDetailsSchema = z.object({\n name: z.string().nullish(),\n email: z.string().nullish(),\n phone: z.string().nullish(),\n address: z\n .object({\n line1: z.string().nullish(),\n line2: z.string().nullish(),\n city: z.string().nullish(),\n state: z.string().nullish(),\n postal_code: z.string().nullish(),\n country: z.string().nullish(),\n })\n .nullish(),\n})\nexport type BillingDetails = z.infer<typeof billingDetailsSchema>\n\nexport const paymentMethodSchema = z.object({\n id: z.string(),\n /** `requires_action` while the bank's authentication of a new card waits. */\n status: z.string().nullish(),\n /** The bank's authentication of a card being saved. */\n next_action: z\n .object({\n type: z.string(),\n psp_id: z.string().nullish(),\n payload: z.record(z.string(), z.string()).nullish(),\n })\n .nullish(),\n rail: z.string().nullish(),\n /** The PSP holding the card; null for a card a custodian holds. */\n psp_id: z.string().nullish(),\n card: cardSummarySchema.nullish(),\n billing_details: billingDetailsSchema.nullish(),\n /** Kept for one-click buys; a card stored only for a subscription is not. */\n reusable: z.boolean().nullish(),\n health: z\n .object({\n /** `valid | expiring_soon | expired` */\n expiry_status: z.string().nullish(),\n last_charged_at: time.nullish(),\n last_charge_outcome: z.string().nullish(),\n active: z.boolean().nullish(),\n })\n .nullish(),\n subscriptions: z\n .array(\n z.object({\n id: z.string(),\n display_name: z.string().nullish(),\n })\n )\n .nullish(),\n /** Currencies whose invoices this card collects. */\n default_currencies: z.array(z.string()).nullish(),\n created_at: time.nullish(),\n})\nexport type PaymentMethod = z.infer<typeof paymentMethodSchema>\n\n/** Why the latest payment attempt failed, in the customer's words. */\nexport const paymentFailureSchema = z.object({\n reason: z.string(),\n message: z.string(),\n field: z.string().nullish(),\n})\nexport type PaymentFailure = z.infer<typeof paymentFailureSchema>\n\n/**\n * What the customer completes before a payment can finish: `authenticate`\n * runs the PSP's own script with `payload` (Stripe.js `handleNextAction`\n * with `client_secret`); `redirect_to_url` leaves for `url`.\n */\nexport const orderNextActionSchema = z.object({\n type: z.string(),\n url: z.string().nullish(),\n psp_id: z.string().nullish(),\n transactions: z.array(z.string()).nullish(),\n payload: z.record(z.string(), z.string()).nullish(),\n})\nexport type OrderNextAction = z.infer<typeof orderNextActionSchema>\n\nexport const orderLineSchema = z.object({\n id: z.string(),\n price_id: z.string(),\n product_id: z.string(),\n description: z.string(),\n quantity: z.number().nullish(),\n unit_amount: amount,\n amount: amount,\n billing_interval_hours: z.number().nullish(),\n access_duration_hours: z.number().nullish(),\n subscription_id: z.string().nullish(),\n product_access_id: z.string().nullish(),\n})\nexport type OrderLine = z.infer<typeof orderLineSchema>\n\n/**\n * A purchase, or a subscription's renewal (`origin: subscription`): frozen\n * lines and total, read and paid by its own customer. `status` is the\n * order's (`open | processing | complete | canceled | expired | void`);\n * `payment.status` its payment's (`requires_payment_method |\n * requires_action | processing | succeeded`).\n */\nexport const orderSchema = z.object({\n id: z.string(),\n customer_id: z.string(),\n origin: z.string(),\n status: z.string(),\n number: z.string().nullish(),\n currency: z.string(),\n total: amount,\n lines: z.array(orderLineSchema),\n payment: z.object({\n status: z.string(),\n next_action: orderNextActionSchema.nullish(),\n last_payment_error: paymentFailureSchema.nullish(),\n payment_method_id: z.string().nullish(),\n payment_id: z.string().nullish(),\n }),\n payment_options: z\n .array(\n z.object({\n psp_id: z.string(),\n rail: z.string(),\n accepts: z.array(z.string()),\n })\n )\n .nullish()\n .transform((v) => v ?? []),\n /** The order's hosted checkout; `url` only on the answer that made it. */\n checkout: z\n .object({\n url: z.string().nullish(),\n success_url: z.string(),\n cancel_url: z.string().nullish(),\n saved_payment_methods: z.boolean(),\n })\n .nullish(),\n renewal: z\n .object({\n subscription_id: z.string(),\n period_starts_at: time,\n period_ends_at: time,\n due_at: time,\n })\n .nullish(),\n expires_at: time.nullish(),\n completed_at: time.nullish(),\n canceled_at: time.nullish(),\n expired_at: time.nullish(),\n voided_at: time.nullish(),\n created_at: time,\n})\nexport type Order = z.infer<typeof orderSchema>\n\n/** Why a line cannot be bought: `already_owned`, `unavailable`, ... */\nexport const orderLineRefusalSchema = z.object({\n code: z.string(),\n message: z.string(),\n owned_by: z.string().nullish(),\n hint: z.string().nullish(),\n})\nexport type OrderLineRefusal = z.infer<typeof orderLineRefusalSchema>\n\n/** One line priced as an order would freeze it, or why it cannot be bought. */\nexport const orderPreviewLineSchema = z.object({\n price_id: z.string(),\n product_id: z.string(),\n description: z.string(),\n quantity: z.number().nullish(),\n unit_amount: amount,\n amount: amount,\n ownership: z.string(),\n billing_interval_hours: z.number().nullish(),\n access_duration_hours: z.number().nullish(),\n refusal: orderLineRefusalSchema.nullish(),\n})\nexport type OrderPreviewLine = z.infer<typeof orderPreviewLineSchema>\n\n/**\n * The customer's cart, priced live: one per customer of a merchant, shared by\n * the merchant's sites. `last_changed_at` and `expires_at` are null while it\n * is empty.\n */\nexport const cartSchema = z.object({\n currency: z.string(),\n total: amount,\n lines: z.array(orderPreviewLineSchema),\n payment_options: orderSchema.shape.payment_options,\n last_changed_at: time.nullish(),\n expires_at: time.nullish(),\n})\nexport type Cart = z.infer<typeof cartSchema>\n\n/**\n * How to pay an order: a saved card, a card just entered (the token of the\n * PSP's own fields, its `psp_id`), a Solana wallet (`token_symbol`, the\n * token it pays in) or the PSP's hosted page (`return_url`).\n */\nexport type OrderPaymentInput =\n | { payment_method_id: string }\n | {\n token: string\n psp_id?: string\n billing_details?: NewCard[\"billing_details\"]\n }\n | { token_symbol: string; psp_id?: string }\n | { return_url: string; psp_id?: string }\n\n/** A price's state on one PSP; public routes carry the status only. */\nexport const productSchema = z.object({\n id: z.string(),\n key: z.string(),\n /** Current mutation counter; absent on older servers. */\n revision: z.number().int().nonnegative().optional(),\n display_name: z.string(),\n description: z.string(),\n /** Opaque entitlement keys granted by the product. */\n entitlements: z.array(z.string()),\n /** Prepaid balance fulfilled once for each qualifying successful payment. */\n credit_grant: z\n .object({\n currency: z.string(),\n amount: amount.nullish(),\n from_payment: z.boolean().optional(),\n expires_after_days: z.number().int().positive().nullish(),\n })\n .nullish(),\n /** Products sharing a group are tiers a subscription can change between. */\n tier_group: z.string().nullable(),\n tier_rank: z.number(),\n archived: z.boolean(),\n prices: z\n .array(priceSchema)\n .nullish()\n .transform((v) => v ?? []),\n created_at: time,\n updated_at: time,\n})\nexport type Product = z.infer<typeof productSchema>\n\nexport const paymentSchema = z.object({\n id: z.string(),\n /** `charge | refund | chargeback | dispute_reversal` */\n kind: z.string(),\n /** `succeeded | pending | failed | refunded | partially_refunded` */\n status: z.string(),\n /** Negative for a refund or chargeback. */\n amount: amount,\n amount_refunded: amount.nullish(),\n currency: z.string(),\n subscription_id: z.string().nullish(),\n price_id: z.string().nullish(),\n /** `rail | manual | admin` */\n channel: z.string().nullish(),\n rail: z.string().nullish(),\n created_at: time,\n /** What was bought. */\n price: priceSchema.nullish(),\n product: subscriptionProductSchema.nullish(),\n card: cardSummarySchema.nullish(),\n /** Normalized decline of a failed payment. */\n failure: z\n .object({\n reason: z.string(),\n message: z.string(),\n field: z.string().nullish(),\n })\n .nullish(),\n})\nexport type Payment = z.infer<typeof paymentSchema>\n\n/** A customer's money in one currency. */\nexport const balanceSchema = z.object({\n currency: z.string(),\n billing_mode: z.string(),\n balance_amount: amount,\n held_amount: amount,\n available_amount: amount,\n owed_amount: amount,\n})\nexport type Balance = z.infer<typeof balanceSchema>\n\n/**\n * The signed-in customer's summary (`GET /me`): money per currency, the\n * default card of each currency, and how many notices are unread.\n */\nexport const accountSchema = z.object({\n id: z.string(),\n balances: z.array(balanceSchema),\n default_payment_methods: z.array(\n z.object({ currency: z.string(), payment_method_id: z.string() })\n ),\n unread_notifications: z.number(),\n})\nexport type Account = z.infer<typeof accountSchema>\n\nexport const invoiceSchema = z.object({\n id: z.string(),\n currency: z.string(),\n invoice_number: z.string().nullish(),\n period_starts_at: time,\n period_ends_at: time,\n total_amount: amount,\n amount_paid: amount,\n amount_due: amount,\n status: z.string(),\n issued_at: time.nullish(),\n due_at: time.nullish(),\n /** Overdue past grace: new usage in its currency is refused until paid. */\n delinquent: z.boolean().nullish(),\n paid_at: time.nullish(),\n recovery: paymentRecoverySchema.nullish(),\n created_at: time,\n})\nexport type Invoice = z.infer<typeof invoiceSchema>\n\n/** Currency code (upper case) to its native-unit scale. */\nexport type CurrencyScales = Readonly<Record<string, number>>\n\nexport const currencySchema = z.object({\n code: z.string(),\n /** Native-unit decimals of every amount on the wire. */\n decimals: z.number(),\n /** Decimals the provider settles in. */\n minor_decimals: z.number().nullish(),\n})\nexport type Currency = z.infer<typeof currencySchema>\n\nexport const subscriptionChangePreviewSchema = z.object({\n price_id: z.string(),\n /** Seats of a per-seat price; null otherwise. */\n quantity: z.number().nullish(),\n rail: z.string().nullish(),\n currency: z.string(),\n /** Charged immediately; `\"0\"` for a change at period end. */\n amount_due_now: amount,\n /** The new price, charged at the next renewal. */\n next_charge_amount: amount,\n next_charge_date: time.nullish(),\n /** `now | period_end` */\n effective: z.string(),\n /** The rail finalizes the exact amount (Stripe provider changes). */\n is_estimate: z.boolean().nullish(),\n message: z.string().nullish(),\n})\nexport type SubscriptionChangePreview = z.infer<\n typeof subscriptionChangePreviewSchema\n>\n\nexport const subscriptionChangeSchema = z.object({\n /** `succeeded | processing | requires_action | blocked` */\n status: z.string(),\n /** `now | period_end` */\n effective: z.string().nullish(),\n price_id: z.string().nullish(),\n quantity: z.number().nullish(),\n /** The subscription now carrying the plan (an upgrade may open a successor). */\n subscription_id: z.string().nullish(),\n /** `payment_authentication` uses `operation_id`. */\n next_action: nextActionSchema.nullish(),\n /** When a change at period end takes effect. */\n delayed_start: time.nullish(),\n currency: z.string().nullish(),\n amount_due_now: amount.nullish(),\n next_charge_amount: amount.nullish(),\n next_charge_date: time.nullish(),\n message: z.string().nullish(),\n /** The durable operation: unresolved while `processing`, the payment to authenticate on `requires_action`. */\n operation_id: z.string().nullish(),\n})\nexport type SubscriptionChange = z.infer<typeof subscriptionChangeSchema>\n\nconst tokenUnits = z.string().regex(/^\\d+$/, \"units must be a uint64 string\")\n\nexport const solanaTokenSchema = z.object({\n symbol: z.string(),\n name: z.string().nullish(),\n mint: z.string(),\n decimals: z.number(),\n /** USD price as an exact decimal string; absent without a feed quote. */\n price: z.string().nullish(),\n /** The stablecoin to present first. */\n preferred: z.boolean().nullish(),\n /** Can back a recurring subscription, not only a one-off payment. */\n recurring_eligible: z.boolean().nullish(),\n /** What the requested price costs in this token. */\n quote: z\n .object({\n /** Display decimal of `units`. */\n amount: z.string(),\n /** Exact on-chain base units. */\n units: tokenUnits,\n token_price_usd: z.string().nullish(),\n fx_rate: z.string().nullish(),\n fx_currency: z.string().nullish(),\n quoted_at: time.nullish(),\n expires_at: time.nullish(),\n })\n .nullish(),\n /** The requested wallet's holding. */\n balance: z\n .object({\n amount: z.string(),\n units: tokenUnits,\n /** Covers `quote`. */\n sufficient: z.boolean().nullish(),\n })\n .nullish(),\n})\nexport type SolanaToken = z.infer<typeof solanaTokenSchema>\n\nexport const solanaTokensSchema = z.object({\n tokens: z\n .array(solanaTokenSchema)\n .nullish()\n .transform((v) => v ?? []),\n})\n\n/**\n * The merchant's browser payment setup: its armed PSPs with their public\n * values and, with a Solana PSP, the network and accepted tokens a wallet\n * adapter is configured with.\n */\nexport const paymentConfigSchema = z.object({\n psps: z\n .array(pspConfigSchema)\n .nullish()\n .transform((v) => v ?? []),\n solana: z\n .object({\n /** `mainnet | devnet | testnet` */\n network: z.string(),\n /** `solana:<network>` */\n chain: z.string(),\n preferred_token: z.string().nullish(),\n tokens: z\n .array(\n z.object({\n symbol: z.string(),\n name: z.string().nullish(),\n mint: z.string(),\n decimals: z.number().int(),\n preferred: z.boolean().nullish(),\n recurring_eligible: z.boolean().nullish(),\n })\n )\n .nullish()\n .transform((v) => v ?? []),\n })\n .nullish(),\n})\nexport type PaymentConfig = z.infer<typeof paymentConfigSchema>\n\n/**\n * The challenge to solve when a request answers 403 `captcha_required`: load\n * `script_url`, solve with `site_key` and `action`, and resend the request\n * with the token in the `token_header` header.\n */\nexport const captchaConfigSchema = z.object({\n provider: z.string(),\n site_key: z.string(),\n script_url: z.string(),\n action: z.string(),\n token_header: z.string(),\n})\nexport type CaptchaConfig = z.infer<typeof captchaConfigSchema>\n\n/**\n * What a browser needs to know about the deployment and its merchant\n * (`GET /config`): the mount's capabilities, the currency registry, the\n * merchant's payment setup (null when the request resolves no merchant) and\n * the captcha (null when the deployment challenges nobody).\n */\n/** The merchant as its customers see it; logo and support are https. */\nexport const publicMerchantSchema = z.object({\n display_name: z.string(),\n logo_url: z.string().nullish(),\n support_url: z.string().nullish(),\n})\nexport type PublicMerchant = z.infer<typeof publicMerchantSchema>\n\nexport const publicConfigSchema = z.object({\n capabilities: z.object({\n route_groups: z.record(z.string(), z.boolean()),\n features: z.record(z.string(), z.boolean()),\n }),\n currencies: z\n .array(currencySchema)\n .nullish()\n .transform((v) => v ?? []),\n payment: paymentConfigSchema.nullish(),\n merchant: publicMerchantSchema.nullish(),\n captcha: captchaConfigSchema.nullish(),\n})\nexport type PublicConfig = z.infer<typeof publicConfigSchema>\n\nexport const paymentAuthenticationSchema = z.object({\n client_secret: z.string().nullish(),\n})\nexport type PaymentAuthentication = z.infer<typeof paymentAuthenticationSchema>\n\n/**\n * What a card setup hands the server: tokenized data only, never a PAN.\n * OpenRails reads the saved card's brand, last four and expiry from the PSP.\n */\ninterface NewCardFields {\n /** The PSP the card is saved with (`psp_id` of a rail option); required. */\n psp_id: string\n billing_details?: {\n name?: string\n email?: string\n address?: { postal_code?: string; country?: string }\n }\n}\n\n/**\n * A card to save: the single-use token of the PSP's own fields (a Collect.js\n * token, a Stripe `pm_`), or, for a PSP whose card_entry is server\n * (`cardSetupDriver` \"card\"), the card itself, posted to OpenRails and never\n * kept by this package.\n */\nexport type NewCard = NewCardFields &\n ({ token: string; card?: never } | { card: CardEntry; token?: never })\n\n/**\n * A minted checkout session. `id` reads and pays it with no other credential;\n * hand it to this customer's browser only. `url` is the shared payment page\n * (`<CheckoutFrame url>`), null when BuyButton renders the checkout itself.\n */\nexport const checkoutSessionLinkSchema = z.object({\n id: z.string().startsWith(\"ocs_\"),\n url: z.string().url().nullish(),\n expires_at: time,\n})\nexport type CheckoutSessionLink = z.infer<typeof checkoutSessionLinkSchema>\n","import type { z } from \"zod\"\n\nimport type { CheckoutSource } from \"../source\"\nimport { registerCheckout, type CheckoutSourceOptions } from \"./checkout\"\nimport {\n checkoutSessionSchema,\n payResultSchema,\n type PayRequest,\n type PayResult,\n} from \"../types\"\nimport {\n BillingError,\n isBillingError,\n localError,\n readBillingError,\n} from \"./errors\"\nimport { OPENRAILS_CURRENCY_SCALES } from \"./generated/currencies\"\nimport type * as wire from \"./generated/wire\"\nimport {\n accountSchema,\n checkoutSessionLinkSchema,\n publicConfigSchema,\n paymentAuthenticationSchema,\n invoiceSchema,\n listPageSchema,\n orderSchema,\n cartSchema,\n pageSchema,\n paymentMethodSchema,\n paymentSchema,\n productSchema,\n solanaTokensSchema,\n subscriptionSchema,\n subscriptionChangePreviewSchema,\n subscriptionChangeSchema,\n type Account,\n type CheckoutSessionLink,\n type PublicConfig,\n type PaymentAuthentication,\n type CurrencyScales,\n type Invoice,\n type ListPage,\n type NewCard,\n type NextAction,\n type Cart,\n type Order,\n type OrderPaymentInput,\n type Page,\n type Payment,\n type PaymentMethod,\n type Product,\n type SolanaToken,\n type Subscription,\n type SubscriptionChange,\n type SubscriptionChangePreview,\n} from \"./types\"\n\nexport interface BillingClientOptions {\n /** OpenRails embedded mount. Default \"/billing/v1\". */\n baseUrl?: string\n /**\n * Transport. Pass an authenticating fetch (auth-ui's `client.authFetch`)\n * or combine the default with `getToken`.\n */\n fetch?: (input: string, init: RequestInit) => Promise<Response>\n /** Bearer for each request; omit when `fetch` authenticates. */\n getToken?: () =>\n string | null | undefined | Promise<string | null | undefined>\n /** Sent as Accept-Language. */\n language?: () => string | null | undefined\n /**\n * Extra or overriding currency scales (code -> native-unit decimals). The\n * pinned OpenRails registry is built in; `/me` amounts carry no scale.\n */\n currencies?: CurrencyScales\n}\n\n/**\n * A public catalog lookup: the products named by `keys` (at most 100 product\n * keys), in one page.\n */\nexport interface ProductListOptions {\n keys: string[]\n signal?: AbortSignal\n}\n\nexport interface ListOptions {\n limit?: number\n offset?: number\n /** A cursor list's next page: the previous page's `next_cursor`. */\n cursor?: string\n signal?: AbortSignal\n}\n\n/**\n * A subscription change: another price of its tier group, other seats of a\n * per-seat price, or both. A quantity for a price that is not per seat is\n * refused (`quantity_not_allowed`).\n */\nexport interface SubscriptionChangeInput {\n priceId?: string\n quantity?: number\n}\n\nexport interface CursorOptions {\n limit?: number\n cursor?: string | null\n signal?: AbortSignal\n}\n\n/**\n * Signs and submits a base64 transaction with the customer's wallet and\n * returns its signature. Throw `WalletRejectedError` when the user declines.\n */\nexport type SendSolanaTransaction = (\n transactionBase64: string\n) => Promise<string>\n\nexport class WalletRejectedError extends Error {\n constructor(message = \"The wallet request was declined.\") {\n super(message)\n this.name = \"WalletRejectedError\"\n }\n}\n\nexport const CANCEL_REASON_MIN = 4\nexport const CANCEL_REASON_MAX = 500\n\n/** A next action the customer's wallet completes. */\nexport const isWalletAction = (next: NextAction | null | undefined): boolean =>\n next?.type === \"solana_sign_transactions\" && !!next.transactions?.length\n\n/**\n * Signs and sends a `solana_sign_transactions` next action's transactions in\n * order and returns the last signature, the value the action is repeated\n * with. A declined prompt is a local `wallet_rejected` error.\n */\nexport async function signWalletAction(\n next: NextAction,\n sendTransaction: SendSolanaTransaction\n): Promise<string> {\n let signature = \"\"\n for (const transaction of next.transactions ?? []) {\n try {\n signature = await sendTransaction(transaction)\n } catch (err) {\n if (isWalletRejection(err))\n throw localError(\"wallet_rejected\", \"The wallet request was declined.\")\n throw err\n }\n if (!signature)\n throw localError(\n \"wallet_no_signature\",\n \"The wallet returned no signature.\"\n )\n }\n if (!signature)\n throw localError(\"wallet_no_signature\", \"The wallet returned no signature.\")\n return signature\n}\n\ntype Query = Record<string, string | number | boolean | string[] | undefined>\n\ninterface RequestOptions {\n method?: string\n query?: Query\n body?: unknown\n signal?: AbortSignal\n headers?: Record<string, string>\n /** Sends no bearer: the hosted checkout session id is the credential. */\n anonymous?: boolean\n /** Replaces `baseUrl` for this request. */\n root?: string\n}\n\n/** Total wait a GET may spend on its one retry. */\nexport const RETRY_BUDGET_MS = 2_000\nconst RETRY_DELAY_MS = 300\n\n// The wait before retrying a GET answered with res, or null if it is final.\nfunction retryDelay(res: Response): number | null {\n const retryAfter = parseRetryAfter(res.headers.get(\"Retry-After\"))\n switch (res.status) {\n case 429:\n return retryAfter\n case 503:\n return retryAfter ?? RETRY_DELAY_MS\n case 502:\n case 504:\n return RETRY_DELAY_MS\n default:\n return null\n }\n}\n\nfunction parseRetryAfter(value: string | null): number | null {\n if (!value) return null\n if (/^\\d+$/.test(value.trim())) return Number(value.trim()) * 1000\n const at = Date.parse(value)\n return Number.isNaN(at) ? null : Math.max(0, at - Date.now())\n}\n\nfunction pause(ms: number, signal?: AbortSignal): Promise<number> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason)\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", abort)\n resolve(ms)\n }, ms)\n const abort = () => {\n clearTimeout(timer)\n reject(signal?.reason)\n }\n signal?.addEventListener(\"abort\", abort, { once: true })\n })\n}\n\n/**\n * An order request's answer. `error` is set when the payment failed: the\n * order is open again and its `payment.last_payment_error` says why.\n */\nexport interface OrderResult {\n order: Order\n error?: BillingError\n}\n\nexport function createBillingClient(options: BillingClientOptions = {}) {\n const base = (options.baseUrl ?? \"/billing/v1\").replace(/\\/+$/, \"\")\n const doFetch =\n options.fetch ?? ((input: string, init: RequestInit) => fetch(input, init))\n const currencies = normalizeScales({\n ...OPENRAILS_CURRENCY_SCALES,\n ...options.currencies,\n })\n\n function url(path: string, query?: Query, root = base): string {\n const qs = new URLSearchParams()\n for (const [k, v] of Object.entries(query ?? {}))\n if (Array.isArray(v)) for (const item of v) qs.append(k, item)\n else if (v !== undefined && v !== \"\") qs.set(k, String(v))\n const q = qs.toString()\n return `${root}${path}${q ? `?${q}` : \"\"}`\n }\n\n async function send(\n path: string,\n opts: RequestOptions = {}\n ): Promise<Response> {\n const headers = new Headers({ Accept: \"application/json\", ...opts.headers })\n if (opts.body !== undefined) headers.set(\"Content-Type\", \"application/json\")\n const token = opts.anonymous ? undefined : await options.getToken?.()\n if (token) headers.set(\"Authorization\", `Bearer ${token}`)\n const lang = options.language?.()\n if (lang) headers.set(\"Accept-Language\", lang)\n const method = opts.method ?? \"GET\"\n const init = {\n method,\n headers,\n body: opts.body === undefined ? undefined : JSON.stringify(opts.body),\n signal: opts.signal,\n }\n // Only a GET is retried: once, on a network error or 502/503/504 (and a\n // 429 that names its wait), within RETRY_BUDGET_MS. Writes never are.\n const retries = method === \"GET\" ? 1 : 0\n let waited = 0\n for (let attempt = 0; ; attempt++) {\n let res: Response\n try {\n res = await doFetch(url(path, opts.query, opts.root), init)\n } catch (cause) {\n const delay = RETRY_DELAY_MS\n if (\n attempt >= retries ||\n opts.signal?.aborted ||\n !(cause instanceof TypeError) ||\n waited + delay > RETRY_BUDGET_MS\n )\n throw cause\n waited += await pause(delay, opts.signal)\n continue\n }\n if (res.ok) return res\n const delay = retryDelay(res)\n if (\n attempt >= retries ||\n delay === null ||\n waited + delay > RETRY_BUDGET_MS\n )\n throw await readBillingError(res)\n await res.body?.cancel().catch(() => undefined)\n waited += await pause(delay, opts.signal)\n }\n }\n\n async function json<S extends z.ZodType>(\n schema: S,\n path: string,\n opts?: RequestOptions\n ): Promise<z.output<S>> {\n const res = await send(path, opts)\n let body: unknown\n try {\n body = await res.json()\n } catch {\n throw localError(\"invalid_response\", `${path}: body is not JSON`)\n }\n const parsed = schema.safeParse(body)\n if (!parsed.success)\n throw localError(\n \"invalid_response\",\n `${path}: ${parsed.error.issues[0]?.path.join(\".\")} ${parsed.error.issues[0]?.message}`\n )\n return parsed.data\n }\n\n const id = (value: string) => encodeURIComponent(value)\n const subscriptionPage = listPageSchema(subscriptionSchema)\n const methodPage = listPageSchema(paymentMethodSchema)\n const paymentPage = listPageSchema(paymentSchema)\n const invoicePage = listPageSchema(invoiceSchema)\n const cursorQuery = (opts: CursorOptions, limit: number) => ({\n limit: opts.limit ?? limit,\n cursor: opts.cursor ?? undefined,\n })\n const productPage = pageSchema(productSchema)\n\n // An order answer: the order, or a failed payment's 402 with it.\n async function orderResult(\n path: string,\n opts: RequestOptions\n ): Promise<OrderResult> {\n try {\n return { order: await json(orderSchema, path, opts) }\n } catch (cause) {\n if (isBillingError(cause) && cause.status === 402 && cause.order) {\n const order = orderSchema.safeParse(cause.order)\n if (order.success) return { order: order.data, error: cause }\n }\n throw cause\n }\n }\n\n const client = {\n baseUrl: base,\n\n /** One page of the customer's subscriptions, newest first. */\n listSubscriptions(\n opts: CursorOptions & { status?: string } = {}\n ): Promise<ListPage<Subscription>> {\n return json(subscriptionPage, \"/me/subscriptions\", {\n query: { status: opts.status ?? \"all\", ...cursorQuery(opts, 100) },\n signal: opts.signal,\n })\n },\n\n /** Includes `recovery` (list rows do not). */\n getSubscription(\n subscriptionId: string,\n signal?: AbortSignal\n ): Promise<Subscription> {\n return json(\n subscriptionSchema,\n `/me/subscriptions/${id(subscriptionId)}`,\n {\n signal,\n }\n )\n },\n\n /**\n * Cancels at period end and answers the subscription. When the rail needs\n * the customer's step (`next_action`, a Solana wallet signature), the\n * subscription is unchanged: complete it with `signWalletAction` and\n * repeat with `signature`.\n */\n cancelSubscription(\n subscriptionId: string,\n input: { reason: string; signature?: string }\n ): Promise<Subscription> {\n return json(\n subscriptionSchema,\n `/me/subscriptions/${id(subscriptionId)}/cancel`,\n {\n method: \"POST\",\n body: {\n reason: input.reason.trim(),\n signature: input.signature,\n } satisfies wire.CustomerCancelSubscriptionParams,\n }\n )\n },\n\n /** Undoes a scheduled cancel before the period ends. */\n resumeSubscription(subscriptionId: string): Promise<Subscription> {\n return json(\n subscriptionSchema,\n `/me/subscriptions/${id(subscriptionId)}/resume`,\n { method: \"POST\", body: {} }\n )\n },\n\n /** Gives the subscription its own card; `null` makes it follow the default. */\n setSubscriptionPaymentMethod(\n subscriptionId: string,\n paymentMethodId: string | null\n ): Promise<Subscription> {\n return json(\n subscriptionSchema,\n `/me/subscriptions/${id(subscriptionId)}/payment-method`,\n {\n method: \"PUT\",\n body: {\n payment_method_id: paymentMethodId,\n } satisfies wire.SetSubscriptionPaymentMethodParams,\n }\n )\n },\n\n /** What `changeSubscription` would charge now and at the next renewal. */\n previewSubscriptionChange(\n subscriptionId: string,\n change: SubscriptionChangeInput,\n signal?: AbortSignal\n ): Promise<SubscriptionChangePreview> {\n return json(\n subscriptionChangePreviewSchema,\n `/me/subscriptions/${id(subscriptionId)}/change/preview`,\n {\n method: \"POST\",\n body: {\n price_id: change.priceId,\n quantity: change.quantity,\n } satisfies wire.PreviewSubscriptionChangeParams,\n signal,\n }\n )\n },\n\n /**\n * Moves the subscription to another price of its tier group, to other\n * seats of a per-seat price, or both. An upgrade and more seats charge\n * the saved card now; a downgrade and fewer seats apply at period end.\n * Reuse `idempotencyKey` until the change resolves (`processing`, a\n * `subscription_change_in_flight` refusal or a lost response) so the\n * stored result replays instead of charging twice. A Solana wallet next\n * action is completed with `signWalletAction`, then repeated with `signature`.\n */\n changeSubscription(\n subscriptionId: string,\n input: SubscriptionChangeInput & {\n idempotencyKey: string\n signature?: string\n }\n ): Promise<SubscriptionChange> {\n return json(\n subscriptionChangeSchema,\n `/me/subscriptions/${id(subscriptionId)}/change`,\n {\n method: \"POST\",\n body: {\n price_id: input.priceId,\n quantity: input.quantity,\n signature: input.signature,\n } satisfies wire.CustomerChangeSubscriptionParams,\n headers: { \"Idempotency-Key\": input.idempotencyKey },\n }\n )\n },\n\n listPaymentMethods(\n opts: CursorOptions = {}\n ): Promise<ListPage<PaymentMethod>> {\n return json(methodPage, \"/me/payment-methods\", {\n query: cursorQuery(opts, 100),\n signal: opts.signal,\n })\n },\n\n /**\n * Saves a card entered in the page with the PSP `psp_id` in one call: the\n * token of its own fields, or the card itself (\"card\"). A Stripe card the\n * bank wants authenticated answers `requires_action`.\n */\n addPaymentMethod(card: NewCard): Promise<PaymentMethod> {\n return json(paymentMethodSchema, \"/me/payment-methods\", {\n method: \"POST\",\n body: card,\n })\n },\n\n /** The customer's cart, priced now. */\n getCart(signal?: AbortSignal): Promise<Cart> {\n return json(cartSchema, \"/me/cart\", { signal })\n },\n\n /**\n * Puts a price in the cart or changes its line, and answers the cart.\n * `quantity` 0 removes the line; omitted, the price's default. `amount`\n * is the customer's choice on a price that takes one.\n */\n setCartLine(\n priceId: string,\n input: { quantity?: number; amount?: string } = {}\n ): Promise<Cart> {\n return json(cartSchema, `/me/cart/lines/${id(priceId)}`, {\n method: \"PUT\",\n body: input satisfies wire.SetCartLineParams,\n })\n },\n\n /** Empties the cart. */\n async clearCart(): Promise<void> {\n await send(\"/me/cart\", { method: \"DELETE\" })\n },\n\n /**\n * Creates an order from `lines` or the cart (`cart: true`), and with\n * `payment` pays it in the same call; `expectedTotal` is the total the\n * customer saw. A failed payment resolves as payOrder's does.\n */\n createOrder(input: {\n lines?: { price_id: string; quantity?: number; amount?: string }[]\n cart?: boolean\n expectedTotal?: string\n payment?: OrderPaymentInput\n reusable?: boolean\n idempotencyKey: string\n }): Promise<OrderResult> {\n return orderResult(\"/me/orders\", {\n method: \"POST\",\n body: {\n ...(input.cart ? { cart: true } : { lines: input.lines ?? [] }),\n ...(input.expectedTotal === undefined\n ? {}\n : { expected_total: input.expectedTotal }),\n ...(input.payment === undefined ? {} : { payment: input.payment }),\n ...(input.reusable === undefined ? {} : { reusable: input.reusable }),\n },\n headers: { \"Idempotency-Key\": input.idempotencyKey },\n })\n },\n\n /** One of the customer's orders: the resumable handle of a purchase. */\n getOrder(orderId: string, signal?: AbortSignal): Promise<Order> {\n return json(orderSchema, `/me/orders/${id(orderId)}`, { signal })\n },\n\n /**\n * Pays an open order. A failed payment resolves with the order (open,\n * `payment.last_payment_error` saying why) and `error`, the 402.\n * `idempotencyKey` is minted when the pay button renders: a retry with it\n * answers what the first request answered.\n */\n payOrder(\n orderId: string,\n input: {\n payment: OrderPaymentInput\n expectedTotal: string\n reusable?: boolean\n idempotencyKey: string\n }\n ): Promise<OrderResult> {\n return orderResult(`/me/orders/${id(orderId)}/pay`, {\n method: \"POST\",\n body: {\n payment: input.payment,\n expected_total: input.expectedTotal,\n ...(input.reusable === undefined ? {} : { reusable: input.reusable }),\n },\n headers: { \"Idempotency-Key\": input.idempotencyKey },\n })\n },\n\n /** Reads the provider after the customer completed `next_action`. */\n confirmOrder(orderId: string): Promise<OrderResult> {\n return orderResult(`/me/orders/${id(orderId)}/confirm`, {\n method: \"POST\",\n body: {},\n })\n },\n\n /**\n * Finishes saving a card the bank asked to authenticate, after the PSP's\n * script answered its `next_action`.\n */\n confirmPaymentMethod(paymentMethodId: string): Promise<PaymentMethod> {\n return json(\n paymentMethodSchema,\n `/me/payment-methods/${id(paymentMethodId)}/confirm`,\n { method: \"POST\", body: {} }\n )\n },\n\n /** The provider challenge a pending payment operation is waiting on. */\n getPaymentAuthentication(\n operationId: string\n ): Promise<PaymentAuthentication> {\n return json(\n paymentAuthenticationSchema,\n `/me/payment-operations/${id(operationId)}/authentication`\n )\n },\n\n async confirmPaymentAuthentication(operationId: string): Promise<void> {\n await send(\n `/me/payment-operations/${id(operationId)}/authentication/confirm`,\n { method: \"POST\", body: {} }\n )\n },\n\n /** `pending` when the provider is still converging (202). */\n async removePaymentMethod(\n paymentMethodId: string\n ): Promise<\"removed\" | \"pending\"> {\n const res = await send(`/me/payment-methods/${id(paymentMethodId)}`, {\n method: \"DELETE\",\n })\n return res.status === 202 ? \"pending\" : \"removed\"\n },\n\n /**\n * Makes the card the default for one currency: it pays the currency's\n * invoices and every subscription in it without its own card.\n */\n async setDefaultPaymentMethod(input: {\n currency: string\n paymentMethodId: string\n }): Promise<void> {\n await send(\n `/me/default-payment-methods/${id(input.currency.toUpperCase())}`,\n {\n method: \"PUT\",\n body: {\n payment_method_id: input.paymentMethodId,\n } satisfies wire.SetDefaultPaymentMethodParams,\n }\n )\n },\n\n /** Charges and refunds, newest first. `rail` filters by rail. */\n listPayments(\n opts: CursorOptions & { rail?: string } = {}\n ): Promise<ListPage<Payment>> {\n return json(paymentPage, \"/me/payments\", {\n query: { ...cursorQuery(opts, 20), rail: opts.rail },\n signal: opts.signal,\n })\n },\n\n listInvoices(opts: CursorOptions = {}): Promise<ListPage<Invoice>> {\n return json(invoicePage, \"/me/invoices\", {\n query: cursorQuery(opts, 20),\n signal: opts.signal,\n })\n },\n\n /**\n * The customer's summary: balance and amount owed per currency, the card\n * that pays each currency, and unread notices.\n */\n getAccount(signal?: AbortSignal): Promise<Account> {\n return json(accountSchema, \"/me\", { signal })\n },\n\n getInvoice(invoiceId: string, signal?: AbortSignal): Promise<Invoice> {\n return json(invoiceSchema, `/me/invoices/${id(invoiceId)}`, { signal })\n },\n\n /**\n * The products on sale named by `keys`, each with its current prices.\n * No keys name no products: nothing is fetched.\n */\n async listProducts(opts: ProductListOptions): Promise<Page<Product>> {\n if (opts.keys.length === 0) return { data: [], next_cursor: null }\n return json(productPage, \"/catalog/products\", {\n query: { keys: opts.keys },\n signal: opts.signal,\n })\n },\n\n /**\n * The deployment's public configuration: what the mount serves, the\n * currency registry and the merchant's payment setup. React components\n * share one copy through `useConfig()`.\n */\n getConfig(signal?: AbortSignal): Promise<PublicConfig> {\n return json(publicConfigSchema, \"/config\", { signal, anonymous: true })\n },\n\n /**\n * Accepted tokens with live prices. `priceId` adds each token's `quote`;\n * `wallet` adds its `balance`.\n */\n async listSolanaTokens(\n opts: {\n priceId?: string\n wallet?: string\n signal?: AbortSignal\n } = {}\n ): Promise<SolanaToken[]> {\n const { tokens } = await json(solanaTokensSchema, \"/solana/tokens\", {\n query: {\n price_id: opts.priceId,\n wallet: opts.wallet,\n },\n signal: opts.signal,\n })\n return tokens\n },\n\n /** Currency code (upper case) to native-unit decimals. */\n currencies,\n }\n // The purchase calls stay billing-ui's own: apps buy through <BuyButton>.\n registerCheckout(client, {\n /**\n * Mints a hosted checkout session for the signed-in customer and one\n * price; BuyButton renders it.\n * Select a price by `priceId`, or by both `productKey` and `priceKey`.\n * `successUrl` brings the buyer back from a redirect rail; it must be on\n * one of this app's return origins.\n */\n createCheckoutSession(input: {\n priceKey?: string\n productKey?: string\n priceId?: string\n /** Customer-selected deposit in the price currency’s native units. */\n amount?: string\n /** Defaults to true for recurring prices; false buys the initial term only. */\n autoRenew?: boolean\n successUrl?: string\n }): Promise<CheckoutSessionLink> {\n if (\n !input.priceKey === !input.priceId ||\n !!input.priceKey !== !!input.productKey\n )\n return Promise.reject(\n localError(\n \"invalid_request\",\n \"Pass priceId, or both productKey and priceKey.\"\n )\n )\n return json(checkoutSessionLinkSchema, \"/me/checkout-sessions\", {\n method: \"POST\",\n body: {\n price_key: input.priceKey,\n product_key: input.productKey,\n price_id: input.priceId,\n auto_renew: input.autoRenew,\n amount: input.amount,\n success_url: input.successUrl,\n } satisfies wire.MintCheckoutSessionParams,\n })\n },\n\n /**\n * Reads and pays one hosted checkout session. By default the id is the\n * only credential: no bearer is sent. With `customerBase` the session's\n * customer reads and pays it on that customer surface, signed in. A\n * refusal the buyer can answer (an invalid card form, too many attempts)\n * resolves as `failed`; an expired or unknown session as `expired`.\n */\n checkoutSource(\n sessionId: string,\n opts: CheckoutSourceOptions = {}\n ): CheckoutSource {\n const path = `/checkout-sessions/${id(sessionId)}`\n const customer = opts.customerBase?.replace(/\\/+$/, \"\")\n const via: RequestOptions =\n customer === undefined ? { anonymous: true } : { root: customer }\n return {\n getSession: () => json(checkoutSessionSchema, path, via),\n async pay(request: PayRequest): Promise<PayResult> {\n try {\n return await json(payResultSchema, `${path}/pay`, {\n ...via,\n method: \"POST\",\n body: request satisfies Omit<\n wire.PayCheckoutSessionParams,\n \"billing_details\"\n >,\n })\n } catch (err) {\n if (!isBillingError(err)) throw err\n switch (err.status) {\n case 404:\n case 410:\n return { status: \"expired\" }\n case 403:\n return { status: \"blocked\", failure_message: err.message }\n case 422:\n case 429:\n return { status: \"failed\", failure_message: err.message }\n }\n throw err\n }\n },\n }\n },\n })\n return client\n}\n\nfunction normalizeScales(scales: CurrencyScales): CurrencyScales {\n return Object.fromEntries(\n Object.entries(scales).map(([code, decimals]) => [\n code.toUpperCase(),\n decimals,\n ])\n )\n}\n\nexport type BillingClient = ReturnType<typeof createBillingClient>\n\nexport const isWalletRejection = (error: unknown): boolean =>\n error instanceof WalletRejectedError ||\n (error instanceof Error && error.name === \"WalletRejectedError\") ||\n (error instanceof BillingError && error.code === \"wallet_rejected\")\n"],"mappings":"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"}
package/dist/client.js CHANGED
@@ -1,2 +1,2 @@
1
- import { C as e, L as t, R as n, S as r, a as i, b as a, c as o, i as s, n as c, o as l, r as u, s as d, t as f, v as p, y as m, z as h } from "./client-BpzCZes3.js";
2
- export { p as BillingError, f as CANCEL_REASON_MAX, c as CANCEL_REASON_MIN, u as RETRY_BUDGET_MS, s as WalletRejectedError, t as amountToDecimal, i as createBillingClient, n as decimalToAmount, h as formatAmount, m as isBillingError, a as isServerError, l as isWalletAction, d as isWalletRejection, r as readBillingError, o as signWalletAction, e as toBillingError };
1
+ import { B as e, C as t, L as n, S as r, a as i, b as a, c as o, i as s, n as c, o as l, r as u, s as d, t as f, v as p, y as m, z as h } from "./client-BuvolBPT.js";
2
+ export { p as BillingError, f as CANCEL_REASON_MAX, c as CANCEL_REASON_MIN, u as RETRY_BUDGET_MS, s as WalletRejectedError, n as amountToDecimal, i as createBillingClient, h as decimalToAmount, e as formatAmount, m as isBillingError, a as isServerError, l as isWalletAction, d as isWalletRejection, r as readBillingError, o as signWalletAction, t as toBillingError };
@@ -2,13 +2,19 @@ import { BillingClient } from '../client/client';
2
2
  import { PspConfig } from '../psp';
3
3
  import * as React from "react";
4
4
  export interface StripeCardHandle {
5
- /** Confirms the setup and returns the saved payment method id. */
5
+ /** Saves the entered card and returns its payment method id. */
6
6
  save(): Promise<string>;
7
+ /**
8
+ * The entered card as Stripe's single-use payment method (`pm_`), for an
9
+ * order to charge and save in one call.
10
+ */
11
+ tokenize(): Promise<string>;
12
+ /** Answers the bank's authentication of a payment or a card save. */
13
+ handleNextAction(clientSecret: string): Promise<void>;
7
14
  }
8
15
  export declare const StripeCardEntry: React.ForwardRefExoticComponent<{
9
16
  psp: PspConfig;
10
17
  client: BillingClient;
11
- returnURL?: (setupId: string) => string;
12
18
  defaultCountry?: string;
13
19
  /** Completeness of the entered card, from the element's change events. */
14
20
  onCompleteChange?: (complete: boolean) => void;
@@ -0,0 +1,12 @@
1
+ import * as React from "react";
2
+ export interface StripeWalletsProps {
3
+ publishableKey: string;
4
+ /** The total in the currency's minor units (Stripe's `amount`). */
5
+ amount: number;
6
+ currency: string;
7
+ /** Pays with the wallet's payment method; false when the payment failed. */
8
+ onPaymentMethod: (paymentMethod: string) => Promise<boolean>;
9
+ /** Whether a wallet button shows. */
10
+ onAvailable?: (available: boolean) => void;
11
+ }
12
+ export declare function StripeWallets({ publishableKey, amount, currency, onPaymentMethod, onAvailable, }: StripeWalletsProps): React.JSX.Element;
@@ -1,7 +1,7 @@
1
1
  import { useRender } from '@base-ui/react/use-render';
2
2
  import { VariantProps } from 'class-variance-authority';
3
3
  declare const badgeVariants: (props?: ({
4
- variant?: "destructive" | "link" | "default" | "outline" | "secondary" | "ghost" | null | undefined;
4
+ variant?: "default" | "link" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
5
5
  } & import('class-variance-authority/types').ClassProp) | undefined) => string;
6
6
  declare function Badge({ className, variant, render, ...props }: useRender.ComponentProps<"span"> & VariantProps<typeof badgeVariants>): import('react').ReactElement<unknown, string | import('react').JSXElementConstructor<any>>;
7
7
  export { Badge, badgeVariants };
@@ -1,7 +1,7 @@
1
1
  import { Button as ButtonPrimitive } from '@base-ui/react/button';
2
2
  import { VariantProps } from 'class-variance-authority';
3
3
  declare const buttonVariants: (props?: ({
4
- variant?: "destructive" | "link" | "default" | "outline" | "secondary" | "ghost" | null | undefined;
4
+ variant?: "default" | "link" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
5
5
  size?: "default" | "icon" | "xs" | "sm" | "lg" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
6
6
  } & import('class-variance-authority/types').ClassProp) | undefined) => string;
7
7
  declare function Button({ className, variant, size, ...props }: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>): import("react").JSX.Element;
package/dist/frame.d.ts CHANGED
@@ -12,14 +12,14 @@ declare const pageMessageSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
12
12
  source: z.ZodLiteral<"openrails-checkout">;
13
13
  type: z.ZodLiteral<"complete">;
14
14
  status: z.ZodEnum<{
15
- canceled: "canceled";
16
- succeeded: "succeeded";
17
- failed: "failed";
18
- expired: "expired";
19
15
  created: "created";
20
16
  requires_action: "requires_action";
21
17
  processing: "processing";
18
+ succeeded: "succeeded";
19
+ failed: "failed";
22
20
  blocked: "blocked";
21
+ expired: "expired";
22
+ canceled: "canceled";
23
23
  }>;
24
24
  }, z.core.$strip>, z.ZodObject<{
25
25
  source: z.ZodLiteral<"openrails-checkout">;
@@ -31,9 +31,9 @@ declare const appMessageSchema: z.ZodObject<{
31
31
  source: z.ZodLiteral<"openrails-checkout">;
32
32
  type: z.ZodLiteral<"init">;
33
33
  theme: z.ZodEnum<{
34
+ auto: "auto";
34
35
  light: "light";
35
36
  dark: "dark";
36
- auto: "auto";
37
37
  }>;
38
38
  }, z.core.$strip>;
39
39
  export type AppMessage = z.infer<typeof appMessageSchema>;