@openrails/billing-ui 0.233.2 → 0.234.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.
@@ -382,6 +382,13 @@ var P = e.string().refine(i, "amount must be an int64 string"), F = e.string(),
382
382
  type: e.string(),
383
383
  redirect_to_url: e.object({ url: e.string().nullish() }).nullish(),
384
384
  transactions: e.array(e.string()).nullish()
385
+ }), _e = e.object({
386
+ attempts: e.number(),
387
+ retries_left: e.number().nullish(),
388
+ next_retry_at: F.nullish(),
389
+ final_retry_at: F.nullish(),
390
+ waiting_for_new_card: e.boolean(),
391
+ last_failure_reason: e.string().nullish()
385
392
  }), W = e.object({
386
393
  id: e.string(),
387
394
  status: L,
@@ -404,18 +411,23 @@ var P = e.string().refine(i, "amount must be an int64 string"), F = e.string(),
404
411
  starts_at: F,
405
412
  ends_at: F.nullish()
406
413
  }).nullish(),
407
- grace_ends_at: F.nullish(),
408
- next_retry_at: F.nullish(),
414
+ dunning: _e.nullish(),
409
415
  price: z.nullish(),
410
416
  product: B.nullish(),
411
- scheduled_price: z.nullish(),
412
- scheduled_product: B.nullish(),
417
+ scheduled_change: e.object({
418
+ price_id: e.string(),
419
+ quantity: e.number().nullish(),
420
+ effective_at: F,
421
+ source: e.string(),
422
+ price: z.nullish(),
423
+ product: B.nullish()
424
+ }).nullish(),
413
425
  card: V.nullish(),
414
426
  recovery: H.nullish(),
415
427
  next_action: U.nullish(),
416
428
  created_at: F.nullish(),
417
429
  updated_at: F.nullish()
418
- }), _e = e.object({
430
+ }), ve = e.object({
419
431
  name: e.string().nullish(),
420
432
  email: e.string().nullish(),
421
433
  phone: e.string().nullish(),
@@ -432,7 +444,7 @@ var P = e.string().refine(i, "amount must be an int64 string"), F = e.string(),
432
444
  rail: e.string().nullish(),
433
445
  psp_id: e.string().nullish(),
434
446
  card: V.nullish(),
435
- billing_details: _e.nullish(),
447
+ billing_details: ve.nullish(),
436
448
  health: e.object({
437
449
  expiry_status: e.string().nullish(),
438
450
  last_charged_at: F.nullish(),
@@ -445,7 +457,7 @@ var P = e.string().refine(i, "amount must be an int64 string"), F = e.string(),
445
457
  })).nullish(),
446
458
  collection_currencies: e.array(e.string()).nullish(),
447
459
  created_at: F.nullish()
448
- }), ve = e.object({
460
+ }), ye = e.object({
449
461
  id: e.string(),
450
462
  key: e.string(),
451
463
  revision: e.number().int().nonnegative().optional(),
@@ -464,7 +476,7 @@ var P = e.string().refine(i, "amount must be an int64 string"), F = e.string(),
464
476
  prices: e.array(z).nullish().transform((e) => e ?? []),
465
477
  created_at: F,
466
478
  updated_at: F
467
- }), ye = e.object({
479
+ }), be = e.object({
468
480
  id: e.string(),
469
481
  kind: e.string(),
470
482
  status: e.string(),
@@ -484,6 +496,21 @@ var P = e.string().refine(i, "amount must be an int64 string"), F = e.string(),
484
496
  message: e.string(),
485
497
  field: e.string().nullish()
486
498
  }).nullish()
499
+ }), xe = e.object({
500
+ currency: e.string(),
501
+ billing_mode: e.string(),
502
+ balance_amount: P,
503
+ held_amount: P,
504
+ available_amount: P,
505
+ owed_amount: P
506
+ }), Se = e.object({
507
+ id: e.string(),
508
+ balances: e.array(xe),
509
+ collection_payment_methods: e.array(e.object({
510
+ currency: e.string(),
511
+ payment_method_id: e.string()
512
+ })),
513
+ unread_notifications: e.number()
487
514
  }), K = e.object({
488
515
  id: e.string(),
489
516
  currency: e.string(),
@@ -496,14 +523,15 @@ var P = e.string().refine(i, "amount must be an int64 string"), F = e.string(),
496
523
  status: e.string(),
497
524
  issued_at: F.nullish(),
498
525
  due_at: F.nullish(),
526
+ delinquent: e.boolean().nullish(),
499
527
  paid_at: F.nullish(),
500
528
  recovery: H.nullish(),
501
529
  created_at: F
502
- }), be = e.object({
530
+ }), Ce = e.object({
503
531
  code: e.string(),
504
532
  decimals: e.number(),
505
533
  minor_decimals: e.number().nullish()
506
- }), xe = e.object({
534
+ }), we = e.object({
507
535
  action: e.string(),
508
536
  price_id: e.string(),
509
537
  rail: e.string().nullish(),
@@ -514,7 +542,7 @@ var P = e.string().refine(i, "amount must be an int64 string"), F = e.string(),
514
542
  effective: e.string(),
515
543
  is_estimate: e.boolean().nullish(),
516
544
  message: e.string().nullish()
517
- }), Se = e.object({
545
+ }), Te = e.object({
518
546
  status: e.string(),
519
547
  action: e.string().nullish(),
520
548
  effective: e.string().nullish(),
@@ -528,7 +556,7 @@ var P = e.string().refine(i, "amount must be an int64 string"), F = e.string(),
528
556
  next_charge_date: F.nullish(),
529
557
  message: e.string().nullish(),
530
558
  operation_id: e.string().nullish()
531
- }), q = e.string().regex(/^\d+$/, "units must be a uint64 string"), Ce = e.object({
559
+ }), q = e.string().regex(/^\d+$/, "units must be a uint64 string"), Ee = e.object({
532
560
  symbol: e.string(),
533
561
  name: e.string().nullish(),
534
562
  mint: e.string(),
@@ -550,7 +578,7 @@ var P = e.string().refine(i, "amount must be an int64 string"), F = e.string(),
550
578
  units: q,
551
579
  sufficient: e.boolean().nullish()
552
580
  }).nullish()
553
- }), we = e.object({ tokens: e.array(Ce).nullish().transform((e) => e ?? []) }), Te = e.object({
581
+ }), De = e.object({ tokens: e.array(Ee).nullish().transform((e) => e ?? []) }), Oe = e.object({
554
582
  psps: e.array(j).nullish().transform((e) => e ?? []),
555
583
  solana: e.object({
556
584
  network: e.string(),
@@ -565,19 +593,19 @@ var P = e.string().refine(i, "amount must be an int64 string"), F = e.string(),
565
593
  recurring_eligible: e.boolean().nullish()
566
594
  })).nullish().transform((e) => e ?? [])
567
595
  }).nullish()
568
- }), Ee = e.object({
596
+ }), ke = e.object({
569
597
  capabilities: e.object({
570
598
  route_groups: e.record(e.string(), e.boolean()),
571
599
  features: e.record(e.string(), e.boolean())
572
600
  }),
573
- currencies: e.array(be).nullish().transform((e) => e ?? []),
574
- payment: Te.nullish()
601
+ currencies: e.array(Ce).nullish().transform((e) => e ?? []),
602
+ payment: Oe.nullish()
575
603
  }), J = e.object({
576
604
  id: e.string(),
577
605
  status: e.string(),
578
606
  client_secret: e.string().nullish(),
579
607
  payment_method_id: e.string().nullish()
580
- }), De = e.object({ client_secret: e.string().nullish() }), Oe = e.object({
608
+ }), Ae = e.object({ client_secret: e.string().nullish() }), je = e.object({
581
609
  id: e.string().startsWith("ocs_"),
582
610
  url: e.string().url().nullish(),
583
611
  expires_at: F
@@ -585,8 +613,8 @@ var P = e.string().refine(i, "amount must be an int64 string"), F = e.string(),
585
613
  constructor(e = "The wallet request was declined.") {
586
614
  super(e), this.name = "WalletRejectedError";
587
615
  }
588
- }, ke = 4, Ae = 500, X = (e) => e?.type === "solana_sign_transactions" && !!e.transactions?.length;
589
- async function je(e, t) {
616
+ }, Me = 4, Ne = 500, X = (e) => e?.type === "solana_sign_transactions" && !!e.transactions?.length;
617
+ async function Pe(e, t) {
590
618
  let n = "";
591
619
  for (let r of e.transactions ?? []) {
592
620
  try {
@@ -599,9 +627,9 @@ async function je(e, t) {
599
627
  if (!n) throw O("wallet_no_signature", "The wallet returned no signature.");
600
628
  return n;
601
629
  }
602
- var Me = 2e3, Z = 300;
603
- function Ne(e) {
604
- let t = Pe(e.headers.get("Retry-After"));
630
+ var Fe = 2e3, Z = 300;
631
+ function Ie(e) {
632
+ let t = Le(e.headers.get("Retry-After"));
605
633
  switch (e.status) {
606
634
  case 429: return t;
607
635
  case 503: return t ?? Z;
@@ -610,7 +638,7 @@ function Ne(e) {
610
638
  default: return null;
611
639
  }
612
640
  }
613
- function Pe(e) {
641
+ function Le(e) {
614
642
  if (!e) return null;
615
643
  if (/^\d+$/.test(e.trim())) return Number(e.trim()) * 1e3;
616
644
  let t = Date.parse(e);
@@ -627,8 +655,8 @@ function Q(e, t) {
627
655
  t?.addEventListener("abort", a, { once: !0 });
628
656
  });
629
657
  }
630
- function Fe(e = {}) {
631
- let t = (e.baseUrl ?? "/billing/v1").replace(/\/+$/, ""), n = e.fetch ?? ((e, t) => fetch(e, t)), r = Ie({
658
+ function Re(e = {}) {
659
+ let t = (e.baseUrl ?? "/billing/v1").replace(/\/+$/, ""), n = e.fetch ?? ((e, t) => fetch(e, t)), r = ze({
632
660
  ...A,
633
661
  ...e.currencies
634
662
  });
@@ -665,7 +693,7 @@ function Fe(e = {}) {
665
693
  continue;
666
694
  }
667
695
  if (a.ok) return a;
668
- let o = Ne(a);
696
+ let o = Ie(a);
669
697
  if (e >= u || o === null || d + o > 2e3) throw await k(a);
670
698
  await a.body?.cancel().catch(() => void 0), d += await Q(o, r.signal);
671
699
  }
@@ -681,10 +709,10 @@ function Fe(e = {}) {
681
709
  if (!o.success) throw O("invalid_response", `${t}: ${o.error.issues[0]?.path.join(".")} ${o.error.issues[0]?.message}`);
682
710
  return o.data;
683
711
  }
684
- let s = (e) => encodeURIComponent(e), c = I(W), l = I(G), u = I(ye), d = I(K), f = (e, t) => ({
712
+ let s = (e) => encodeURIComponent(e), c = I(W), l = I(G), u = I(be), d = I(K), f = (e, t) => ({
685
713
  limit: e.limit ?? t,
686
714
  cursor: e.cursor ?? void 0
687
- }), p = he(ve);
715
+ }), p = he(ye);
688
716
  return {
689
717
  baseUrl: t,
690
718
  listSubscriptions(e = {}) {
@@ -721,14 +749,14 @@ function Fe(e = {}) {
721
749
  });
722
750
  },
723
751
  previewTierChange(e, t, n) {
724
- return o(xe, `/me/subscriptions/${s(e)}/change-tier/preview`, {
752
+ return o(we, `/me/subscriptions/${s(e)}/change-tier/preview`, {
725
753
  method: "POST",
726
754
  body: { price_id: t },
727
755
  signal: n
728
756
  });
729
757
  },
730
758
  changeTier(e, t) {
731
- return o(Se, `/me/subscriptions/${s(e)}/change-tier`, {
759
+ return o(Te, `/me/subscriptions/${s(e)}/change-tier`, {
732
760
  method: "POST",
733
761
  body: {
734
762
  price_id: t.priceId,
@@ -769,7 +797,7 @@ function Fe(e = {}) {
769
797
  });
770
798
  },
771
799
  getPaymentAuthentication(e) {
772
- return o(De, `/me/payment-operations/${s(e)}/authentication`);
800
+ return o(Ae, `/me/payment-operations/${s(e)}/authentication`);
773
801
  },
774
802
  async confirmPaymentAuthentication(e) {
775
803
  await a(`/me/payment-operations/${s(e)}/authentication/confirm`, {
@@ -804,6 +832,9 @@ function Fe(e = {}) {
804
832
  signal: e.signal
805
833
  });
806
834
  },
835
+ getAccount(e) {
836
+ return o(Se, "/me", { signal: e });
837
+ },
807
838
  getInvoice(e, t) {
808
839
  return o(K, `/me/invoices/${s(e)}`, { signal: t });
809
840
  },
@@ -817,7 +848,7 @@ function Fe(e = {}) {
817
848
  });
818
849
  },
819
850
  createCheckoutSession(e) {
820
- return !e.priceKey == !e.priceId || !!e.priceKey != !!e.productKey ? Promise.reject(O("invalid_request", "Pass priceId, or both productKey and priceKey.")) : o(Oe, "/me/checkout-sessions", {
851
+ return !e.priceKey == !e.priceId || !!e.priceKey != !!e.productKey ? Promise.reject(O("invalid_request", "Pass priceId, or both productKey and priceKey.")) : o(je, "/me/checkout-sessions", {
821
852
  method: "POST",
822
853
  body: {
823
854
  price_key: e.priceKey,
@@ -861,13 +892,13 @@ function Fe(e = {}) {
861
892
  };
862
893
  },
863
894
  getConfig(e) {
864
- return o(Ee, "/config", {
895
+ return o(ke, "/config", {
865
896
  signal: e,
866
897
  anonymous: !0
867
898
  });
868
899
  },
869
900
  async listSolanaTokens(e = {}) {
870
- let { tokens: t } = await o(we, "/solana/tokens", {
901
+ let { tokens: t } = await o(De, "/solana/tokens", {
871
902
  query: {
872
903
  price_id: e.priceId,
873
904
  wallet: e.wallet
@@ -879,11 +910,11 @@ function Fe(e = {}) {
879
910
  currencies: r
880
911
  };
881
912
  }
882
- function Ie(e) {
913
+ function ze(e) {
883
914
  return Object.fromEntries(Object.entries(e).map(([e, t]) => [e.toUpperCase(), t]));
884
915
  }
885
916
  var $ = (e) => e instanceof Y || e instanceof Error && e.name === "WalletRejectedError" || e instanceof E && e.code === "wallet_rejected";
886
917
  //#endregion
887
- export { ne as A, i as B, ie as C, w as D, C as E, h as F, o as I, u as L, _ as M, y as N, g as O, x as P, d as R, k as S, S as T, le as _, Fe as a, re as b, je as c, ce as d, N as f, me as g, j as h, Y as i, T as j, b as k, pe as l, M as m, ke as n, X as o, oe as p, Me as r, $ as s, Ae as t, fe as u, E as v, m as w, O as x, D as y, f as z };
918
+ export { ne as A, i as B, ie as C, w as D, C as E, h as F, o as I, u as L, _ as M, y as N, g as O, x as P, d as R, k as S, S as T, le as _, Re as a, re as b, Pe as c, ce as d, N as f, me as g, j as h, Y as i, T as j, b as k, pe as l, M as m, Me as n, X as o, oe as p, Fe as r, $ as s, Ne as t, fe as u, E as v, m as w, O as x, D as y, f as z };
888
919
 
889
- //# sourceMappingURL=client-DXUPzA8C.js.map
920
+ //# sourceMappingURL=client-CWX6QpLa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-CWX6QpLa.js","names":[],"sources":["../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":["// Exact money. Every amount the host serves is a signed int64 decimal string\n// of the plan currency's native unit; plan.unit_decimals is that currency's\n// registered scale (OpenRails' currency registry, GET /v1/config). Nothing\n// here converts an amount to a JS number: values are scaled with BigInt and\n// only the exact major-unit decimal is handed to 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// 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 a canonical fixture (testdata/wire/checkout_session.json) that\n// src/types.test.ts decodes.\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 registered scale from OpenRails' currency registry\n// (openrails.LookupCurrency / GET /v1/config), stamped by the host.\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 the host 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}\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\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 }\n}\n\nexport const isBillingError = (value: unknown): value is BillingError =>\n value instanceof BillingError\n\n/**\n * A server failure (HTTP 5xx) from any client or host source that carries a\n * numeric `status`. It is surfaced at once, never retried behind the caller.\n */\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 })\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: src/test/fixtures/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 /** Revision within this product/key pair; absent on older servers. */\n revision: 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})\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 psp_id: z.string().nullish(),\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 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 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 collection_currencies: z.array(z.string()).nullish(),\n created_at: time.nullish(),\n})\nexport type PaymentMethod = z.infer<typeof paymentMethodSchema>\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 card\n * that pays each currency's invoices, and how many notices are unread.\n */\nexport const accountSchema = z.object({\n id: z.string(),\n balances: z.array(balanceSchema),\n collection_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 tierChangePreviewSchema = z.object({\n /** `upgrade | downgrade` */\n action: z.string(),\n price_id: z.string(),\n rail: z.string().nullish(),\n currency: z.string(),\n /** Charged immediately; `\"0\"` for a downgrade. */\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 upgrades). */\n is_estimate: z.boolean().nullish(),\n message: z.string().nullish(),\n})\nexport type TierChangePreview = z.infer<typeof tierChangePreviewSchema>\n\nexport const tierChangeSchema = z.object({\n /** `succeeded | processing | requires_action | blocked` */\n status: z.string(),\n /** `upgrade | downgrade` */\n action: z.string().nullish(),\n /** `now | period_end` */\n effective: z.string().nullish(),\n price_id: z.string().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 scheduled downgrade 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 TierChange = z.infer<typeof tierChangeSchema>\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 * What a browser needs to know about the deployment and its merchant\n * (`GET /config`): the mount's capabilities, the currency registry and the\n * merchant's payment setup (null when the request resolves no merchant).\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})\nexport type PublicConfig = z.infer<typeof publicConfigSchema>\n\n/** An in-page card setup; `payment_method_id` is set once the card is saved. */\nexport const cardSetupSchema = z.object({\n id: z.string(),\n status: z.string(),\n client_secret: z.string().nullish(),\n payment_method_id: z.string().nullish(),\n})\nexport type CardSetup = z.infer<typeof cardSetupSchema>\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: a token from the PSP's own fields (`payment_token`), or,\n * for a PSP whose card_entry is server (`cardSetupDriver` \"card\"), the card\n * itself, posted to OpenRails and never kept by this package.\n */\nexport type NewCard = NewCardFields &\n (\n | { payment_token: string; card?: never }\n | { card: CardEntry; payment_token?: never }\n )\n\n/**\n * A minted checkout session. `id` reads and pays it with no other credential\n * (`client.checkoutSource(id)`); hand it to this customer's browser only.\n * `url` is the shared payment page (`<CheckoutFrame url>`), null when the app\n * renders `<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 {\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 cardSetupSchema,\n checkoutSessionLinkSchema,\n publicConfigSchema,\n paymentAuthenticationSchema,\n invoiceSchema,\n listPageSchema,\n pageSchema,\n paymentMethodSchema,\n paymentSchema,\n productSchema,\n solanaTokensSchema,\n subscriptionSchema,\n tierChangePreviewSchema,\n tierChangeSchema,\n type Account,\n type CardSetup,\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 Page,\n type Payment,\n type PaymentMethod,\n type Product,\n type SolanaToken,\n type Subscription,\n type TierChange,\n type TierChangePreview,\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\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 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/** A cursor list read: pass the previous page's `next_cursor` for the next. */\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 | 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\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 (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 return {\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 setSubscriptionPaymentMethod(\n subscriptionId: string,\n paymentMethodId: string\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 `changeTier` would charge now and at the next renewal. */\n previewTierChange(\n subscriptionId: string,\n priceId: string,\n signal?: AbortSignal\n ): Promise<TierChangePreview> {\n return json(\n tierChangePreviewSchema,\n `/me/subscriptions/${id(subscriptionId)}/change-tier/preview`,\n {\n method: \"POST\",\n body: { price_id: priceId } satisfies wire.ChangeTierParams,\n signal,\n }\n )\n },\n\n /**\n * Moves the subscription to another price of its tier group: an upgrade\n * charges the saved card now, a downgrade applies at period end.\n * `idempotencyKey` identifies this attempt; reuse it until the change\n * resolves (`processing`, a `tier_change_in_flight` refusal or a lost\n * response) so the stored result replays instead of charging twice. A\n * wallet next action (Solana) is completed with `signWalletAction` and\n * the change repeated with `signature`.\n */\n changeTier(\n subscriptionId: string,\n input: { priceId: string; idempotencyKey: string; signature?: string }\n ): Promise<TierChange> {\n return json(\n tierChangeSchema,\n `/me/subscriptions/${id(subscriptionId)}/change-tier`,\n {\n method: \"POST\",\n body: {\n price_id: input.priceId,\n signature: input.signature,\n } satisfies wire.CustomerChangeTierParams,\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 * Stores a card entered in the page with the PSP `psp_id`: a Collect.js\n * token (`cardSetupDriver` \"collect_js\") or the card itself (\"card\").\n */\n addPaymentMethod(card: NewCard): Promise<PaymentMethod> {\n return json(paymentMethodSchema, \"/me/payment-methods\", {\n method: \"POST\",\n body: card,\n })\n },\n\n /**\n * Starts an in-page card setup with a PSP whose browser SDK collects the\n * card (see `cardSetupDriver`). `idempotencyKey` identifies this attempt.\n */\n createCardSetup(input: {\n pspId: string\n idempotencyKey: string\n }): Promise<CardSetup> {\n return json(cardSetupSchema, \"/me/payment-method-setups\", {\n method: \"POST\",\n body: { psp_id: input.pspId, consent: true },\n headers: { \"Idempotency-Key\": input.idempotencyKey },\n })\n },\n\n getCardSetup(setupId: string, signal?: AbortSignal): Promise<CardSetup> {\n return json(cardSetupSchema, `/me/payment-method-setups/${id(setupId)}`, {\n signal,\n })\n },\n\n /** Verifies the setup with the provider; `payment_method_id` once saved. */\n confirmCardSetup(setupId: string): Promise<CardSetup> {\n return json(\n cardSetupSchema,\n `/me/payment-method-setups/${id(setupId)}/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 /** Makes the card the one that collects one currency's invoices. */\n async setCollectionPaymentMethod(input: {\n currency: string\n paymentMethodId: string\n }): Promise<void> {\n await send(\"/me/collection-payment-method\", {\n method: \"PUT\",\n body: {\n currency: input.currency.toUpperCase(),\n payment_method_id: input.paymentMethodId,\n } satisfies wire.CollectionPaymentMethod,\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 /** Products on sale, each with its current prices. */\n listProducts(opts: ListOptions = {}): Promise<Page<Product>> {\n return json(productPage, \"/catalog/products\", {\n query: { limit: opts.limit ?? 100, cursor: opts.cursor },\n signal: opts.signal,\n })\n },\n\n\n /**\n * Mints a hosted checkout session for the signed-in customer and one\n * price. Render it with `<CheckoutFrame url>` when the session has a\n * `url`, else with `<Checkout source={client.checkoutSource(id)}>`.\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<wire.PayCheckoutSessionParams, \"billing_details\">,\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 /**\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}\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-DXUPzA8C.js";
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-CWX6QpLa.js";
2
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,4 +1,4 @@
1
- import { C as e, c as t, o as n, x as r } from "./client-DXUPzA8C.js";
1
+ import { C as e, c as t, o as n, x as r } from "./client-CWX6QpLa.js";
2
2
  import { createContext as i, useCallback as a, useContext as o, useEffect as s, useMemo as c, useRef as l, useState as u, useSyncExternalStore as d } from "react";
3
3
  //#region src/react/context.ts
4
4
  var f = i(null);
@@ -338,4 +338,4 @@ function E() {
338
338
  //#endregion
339
339
  export { C as a, f as c, h as d, g as f, S as i, m as l, T as n, x as o, E as r, b as s, w as t, p as u };
340
340
 
341
- //# sourceMappingURL=config-BQELtBh4.js.map
341
+ //# sourceMappingURL=config-DZ97SQG2.js.map