@happyvertical/accounting 0.94.0 → 0.96.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.
package/README.md CHANGED
@@ -47,6 +47,9 @@ Invoice lines carry more than an amount:
47
47
  as an amount-off coupon on the invoice item (one reusable coupon per
48
48
  currency and amount, id `hv_amount_off_<currency>_<stripe amount>`), so the
49
49
  discount shows on the invoice and Stripe Tax taxes the discounted amount.
50
+ - `taxCode` is the Stripe product tax code (`txcd_...`) for the line, sent
51
+ as the invoice item's `tax_code`, so Stripe Tax classifies it instead of
52
+ using the account's default product tax code.
50
53
 
51
54
  `collectionMethod: 'charge_automatically'` bills the customer's default
52
55
  payment method instead of emailing a payable invoice (the default,
@@ -100,7 +103,10 @@ through unconverted in Stripe's unit. Set `automaticTax: true` to charge tax
100
103
  with Stripe Tax; Stripe needs the buyer's location, so collect it with
101
104
  `billingAddressCollection` or, for an existing customer, save it with
102
105
  `customerUpdate: { address: 'auto' }`. Ad-hoc prices default to
103
- `taxBehavior: 'exclusive'` when tax is on.
106
+ `taxBehavior: 'exclusive'` when tax is on. Set `priceData.taxCode` (a Stripe
107
+ product tax code such as `txcd_10000000`) to classify an ad-hoc line instead
108
+ of using the account's default product tax code; an existing `product`
109
+ carries its own tax code, so `taxCode` is refused with it.
104
110
 
105
111
  ```ts
106
112
  const session = await stripe.billing.createCheckoutSession({
@@ -193,6 +199,54 @@ charged. Pass `paymentMethodExternalId` to keep retries identical when the
193
199
  customer's default card may change in between. Payment webhooks (`payment_intent.*`) carry a normalized `WebhookEvent.payment`
194
200
  summary with the status, minor-unit amount, and `chargeKey`.
195
201
 
202
+ ### Tax on off-session charges
203
+
204
+ Set `automaticTax: true` to tax the charge with Stripe Tax, the way a Checkout
205
+ purchase of the same thing is taxed. `amountMinor` is then the pre-tax
206
+ subtotal: the adapter calculates tax (Stripe Tax Calculations API) from the
207
+ customer's saved address and tax-exempt status, charges subtotal plus tax,
208
+ and links the calculation to the PaymentIntent
209
+ (`hooks[inputs][tax][calculation]`), so Stripe records the tax transaction
210
+ when the payment succeeds, including a `processing` payment that settles
211
+ later, and reverses it on refunds. `taxCode` (a Stripe product tax code)
212
+ classifies the charge instead of the account default.
213
+
214
+ ```ts
215
+ const charge = await stripe.payments.chargeSavedPaymentMethod?.({
216
+ customerExternalId: 'cus_123',
217
+ amountMinor: 2500, // the credit, before tax
218
+ currency: 'USD',
219
+ idempotencyKey: `topup:${policyId}:${sequence}`,
220
+ automaticTax: true,
221
+ taxCode: 'txcd_10000000',
222
+ });
223
+ // charge.amountMinor = 2500 + tax (what was charged)
224
+ // charge.subtotalMinor = 2500 (grant this as credit)
225
+ // charge.taxMinor = tax (book as tax payable)
226
+ ```
227
+
228
+ With `automaticTax`, `amountMinor` in the result and in the payment webhook
229
+ summary is the amount charged, tax included; `subtotalMinor` and `taxMinor`
230
+ report the two parts separately (webhooks read them from the PaymentIntent's
231
+ `hv_subtotal_amount` / `hv_tax_amount` metadata, in Stripe units, so settle
232
+ credit from `subtotalMinor`). A customer whose tax location Stripe cannot
233
+ determine yields `status: 'failed'` with
234
+ `failureCode: 'customer_tax_location_invalid'` and no charge; other Stripe Tax
235
+ errors (for example Stripe Tax not activated) throw. The payment method is
236
+ resolved before tax is calculated, so a customer without a card costs no
237
+ calculation. Every attempt calculates afresh, so a retry with the same key
238
+ succeeds once the customer's address is fixed (a calculation alone records
239
+ no tax). Exactly-once charging is unchanged: the PaymentIntent keeps its
240
+ `<key>:payment_intent` Stripe idempotency key, and the adapter first returns
241
+ any charge already made under the key by `hv_charge_key`. A retry that races
242
+ Stripe's search index (seconds after a lost response) can fail with Stripe's
243
+ `idempotency_error` instead of charging twice; retry it later. A key first used
244
+ with `automaticTax` is refused for an untaxed retry, and the reverse, as is a
245
+ different subtotal. Caller metadata may not use the adapter's tax keys
246
+ (`hv_tax_calculation`, `hv_subtotal_amount`, `hv_tax_amount`). A provider that implements
247
+ `chargeSavedPaymentMethod` without tax support throws on `automaticTax`
248
+ rather than charging untaxed.
249
+
196
250
  Minor-unit amounts (`amountMinor`, `unitAmountMinor`, and the `*Minor` read
197
251
  fields) use ISO 4217 exponents from an explicit table, not the runtime's
198
252
  `Intl` display digits, which differ for some currencies (for example RSD,
@@ -203,7 +203,8 @@ var StripeInvoiceOperations = class {
203
203
  lineItem,
204
204
  unitAmount: moneyToStripeMinorUnits(lineItem.unitPrice, currency),
205
205
  discount: lineDiscountToStripe(lineItem, currency),
206
- period: lineServicePeriod(lineItem)
206
+ period: lineServicePeriod(lineItem),
207
+ taxCode: optionalTaxCode(lineItem.taxCode)
207
208
  }));
208
209
  const existingInvoice = invoice.idempotencyKey ? await this.findInvoiceByLocalId(invoice.customerExternalId, invoice.id) : void 0;
209
210
  if (existingInvoice) return {
@@ -214,7 +215,7 @@ var StripeInvoiceOperations = class {
214
215
  const existingLineItemIndexes = invoice.idempotencyKey ? await this.findPendingLineItemIndexes(invoice.customerExternalId, invoice.id) : /* @__PURE__ */ new Set();
215
216
  for (const [index, line] of lines.entries()) {
216
217
  if (existingLineItemIndexes.has(index)) continue;
217
- const { lineItem, unitAmount, discount, period } = line;
218
+ const { lineItem, unitAmount, discount, period, taxCode } = line;
218
219
  const coupon = discount ? await this.provider.amountOffCoupon(currency, discount) : void 0;
219
220
  await this.provider.request("POST", "/v1/invoiceitems", {
220
221
  customer: invoice.customerExternalId,
@@ -225,6 +226,7 @@ var StripeInvoiceOperations = class {
225
226
  period,
226
227
  discounts: coupon ? [{ coupon }] : void 0,
227
228
  tax_behavior: invoice.automaticTax ? "exclusive" : void 0,
229
+ tax_code: taxCode,
228
230
  metadata: normalizeMetadata({
229
231
  local_invoice_id: invoice.id,
230
232
  local_line_index: index,
@@ -355,20 +357,32 @@ var StripePaymentOperations = class {
355
357
  const currency = normalizeCurrencyCode(input.currency);
356
358
  const stripeAmount = minorUnitsToStripeAmount(input.amountMinor, currency);
357
359
  if (stripeAmount <= 0) throw new Error("Charge amount must be a positive integer of minor units");
360
+ const automaticTax = input.automaticTax === true;
361
+ const taxCode = optionalTaxCode(input.taxCode);
362
+ if (taxCode && !automaticTax) throw new Error("taxCode requires automaticTax");
363
+ const reserved = Object.keys(input.metadata ?? {}).filter((key) => RESERVED_CHARGE_METADATA.has(key));
364
+ if (reserved.length > 0) throw new Error(`Charge metadata keys ${reserved.join(", ")} are reserved by the adapter`);
358
365
  const chargeKey = input.idempotencyKey;
359
366
  const base = {
360
367
  provider: "stripe",
361
368
  customerExternalId: input.customerExternalId,
362
369
  amountMinor: input.amountMinor,
363
370
  currency,
364
- chargeKey
371
+ chargeKey,
372
+ ...automaticTax ? { subtotalMinor: input.amountMinor } : {}
365
373
  };
366
374
  const existing = await this.findByChargeKey(chargeKey);
367
375
  if (existing) {
368
- assertSameCharge(existing, input.customerExternalId, stripeAmount, currency, input.paymentMethodExternalId);
376
+ assertSameCharge(existing, {
377
+ customerExternalId: input.customerExternalId,
378
+ stripeAmount,
379
+ currency,
380
+ automaticTax,
381
+ paymentMethodExternalId: input.paymentMethodExternalId
382
+ });
369
383
  return {
370
384
  ...base,
371
- ...mapChargeOutcome(existing)
385
+ ...mapChargeOutcome(existing, currency)
372
386
  };
373
387
  }
374
388
  let paymentMethod = input.paymentMethodExternalId;
@@ -381,30 +395,61 @@ var StripePaymentOperations = class {
381
395
  failureMessage: "The customer has no default payment method."
382
396
  };
383
397
  }
398
+ let amount = stripeAmount;
399
+ let taxMetadata = {};
400
+ let taxCalculation;
401
+ if (automaticTax) {
402
+ let calculation;
403
+ try {
404
+ calculation = await this.calculateTax(input.customerExternalId, stripeAmount, currency, chargeKey, taxCode);
405
+ } catch (error) {
406
+ if (error instanceof StripeApiError && error.code === "customer_tax_location_invalid") return {
407
+ ...base,
408
+ paymentMethodExternalId: paymentMethod,
409
+ status: "failed",
410
+ failureCode: error.code,
411
+ failureMessage: error.stripeMessage
412
+ };
413
+ throw error;
414
+ }
415
+ amount = calculation.amount_total;
416
+ taxCalculation = calculation.id;
417
+ taxMetadata = {
418
+ [TAX_CALCULATION_METADATA]: calculation.id,
419
+ [SUBTOTAL_AMOUNT_METADATA]: String(stripeAmount),
420
+ [TAX_AMOUNT_METADATA]: String(calculation.tax_amount_exclusive)
421
+ };
422
+ }
384
423
  try {
385
424
  const paymentIntent = await this.provider.request("POST", "/v1/payment_intents", {
386
- amount: stripeAmount,
425
+ amount,
387
426
  currency: currency.toLowerCase(),
388
427
  customer: input.customerExternalId,
389
428
  payment_method: paymentMethod,
390
429
  off_session: true,
391
430
  confirm: true,
392
431
  description: input.description,
432
+ hooks: taxCalculation ? { inputs: { tax: { calculation: taxCalculation } } } : void 0,
393
433
  metadata: normalizeMetadata({
394
434
  ...input.metadata,
435
+ ...taxMetadata,
395
436
  [CHARGE_KEY_METADATA]: chargeKey
396
437
  })
397
438
  }, { idempotencyKey: `${chargeKey}:payment_intent` });
398
439
  return {
399
440
  ...base,
400
- ...mapChargeOutcome(paymentIntent)
441
+ ...mapChargeOutcome(paymentIntent, currency)
401
442
  };
402
443
  } catch (error) {
403
444
  if (error instanceof StripeApiError && error.status === 402 && error.type === "card_error") {
404
445
  const paymentIntent = isRecord(error.paymentIntent) ? error.paymentIntent : void 0;
405
446
  return {
406
447
  ...base,
407
- ...paymentIntent ? mapChargeOutcome(paymentIntent) : {},
448
+ ...taxCalculation ? chargeTaxFields({
449
+ amount,
450
+ metadata: taxMetadata
451
+ }, currency) : {},
452
+ ...paymentIntent ? mapChargeOutcome(paymentIntent, currency) : {},
408
453
  paymentMethodExternalId: idOf(paymentIntent?.payment_method) ?? paymentMethod,
409
454
  status: error.code === "authentication_required" ? "requires_action" : "failed",
410
455
  failureCode: error.code,
@@ -416,6 +461,34 @@ var StripePaymentOperations = class {
416
461
  throw error;
417
462
  }
418
463
  }
464
+ /**
465
+ * Stripe Tax calculation for one tax-exclusive line of `stripeAmount`,
466
+ * from the customer's saved address and tax status. Each attempt makes
467
+ * a fresh calculation: Stripe replays a saved error for a reused
468
+ * idempotency key, so a key per charge would keep failing with
469
+ * `customer_tax_location_invalid` after the customer's address is fixed.
470
+ * A calculation creates no tax transaction until a PaymentIntent linked
471
+ * to it succeeds, so an unused one is harmless; if an earlier attempt's
472
+ * PaymentIntent exists but is not yet searchable, the changed
473
+ * PaymentIntent request is refused by Stripe's idempotency check (the
474
+ * `<key>:payment_intent` key) instead of charging again.
475
+ */
476
+ async calculateTax(customerExternalId, stripeAmount, currency, chargeKey, taxCode) {
477
+ const calculation = await this.provider.request("POST", "/v1/tax/calculations", {
478
+ currency: currency.toLowerCase(),
479
+ customer: customerExternalId,
480
+ line_items: [{
481
+ amount: stripeAmount,
482
+ quantity: 1,
483
+ reference: "off_session_charge",
484
+ tax_behavior: "exclusive",
485
+ tax_code: taxCode
486
+ }]
487
+ }, { idempotencyKey: `hv_tax_calculation:${randomUUID()}` });
488
+ const tax = calculation.tax_amount_exclusive;
489
+ if (!calculation.id || !Number.isSafeInteger(tax) || tax < 0 || calculation.amount_total !== stripeAmount + tax) throw new Error(`Stripe tax calculation ${calculation.id ?? "(no id)"} does not add up to the charge amount plus exclusive tax`);
490
+ return calculation;
491
+ }
419
492
  async findByChargeKey(chargeKey) {
420
493
  return (await this.provider.request("GET", "/v1/payment_intents/search", {
421
494
  query: `metadata['${CHARGE_KEY_METADATA}']:'${escapeSearchValue(chargeKey)}'`,
@@ -713,7 +786,12 @@ function mapCheckoutLineItem(lineItem, automaticTax = false) {
713
786
  };
714
787
  if (!lineItem.priceData) throw new Error("Stripe checkout line item requires price or priceData");
715
788
  const { priceData } = lineItem;
716
- const productData = priceData.product ? void 0 : { name: priceData.productName || "Subscription" };
789
+ const taxCode = optionalTaxCode(priceData.taxCode);
790
+ if (taxCode && priceData.product) throw new Error("Stripe checkout priceData.taxCode applies to ad-hoc products only; set the tax code on the existing product instead");
791
+ const productData = priceData.product ? void 0 : {
792
+ name: priceData.productName || "Subscription",
793
+ tax_code: taxCode
794
+ };
717
795
  const hasStripeAmount = priceData.unitAmount !== void 0;
718
796
  const hasMinorAmount = priceData.unitAmountMinor !== void 0;
719
797
  if (hasStripeAmount === hasMinorAmount) throw new Error("Stripe checkout priceData requires exactly one of unitAmount or unitAmountMinor");
@@ -979,6 +1057,43 @@ function stripeMinorUnitsToMoney(amount, currency) {
979
1057
  return amount / stripeCurrencyMinorUnitFactor(currency);
980
1058
  }
981
1059
  var CHARGE_KEY_METADATA = "hv_charge_key";
1060
+ /** Stripe Tax calculation linked to an `automaticTax` charge. */
1061
+ var TAX_CALCULATION_METADATA = "hv_tax_calculation";
1062
+ /** Pre-tax amount of an `automaticTax` charge, in Stripe units. */
1063
+ var SUBTOTAL_AMOUNT_METADATA = "hv_subtotal_amount";
1064
+ /** Exclusive tax of an `automaticTax` charge, in Stripe units. */
1065
+ var TAX_AMOUNT_METADATA = "hv_tax_amount";
1066
+ var RESERVED_CHARGE_METADATA = /* @__PURE__ */ new Set([
1067
+ TAX_CALCULATION_METADATA,
1068
+ SUBTOTAL_AMOUNT_METADATA,
1069
+ TAX_AMOUNT_METADATA
1070
+ ]);
1071
+ /** A caller-supplied product tax code, trimmed; blank is refused. */
1072
+ function optionalTaxCode(taxCode) {
1073
+ if (taxCode === void 0) return;
1074
+ const code = typeof taxCode === "string" ? taxCode.trim() : "";
1075
+ if (!code) throw new Error("taxCode must be a non-empty string when set");
1076
+ return code;
1077
+ }
1078
+ /**
1079
+ * Amount, subtotal, and tax of an `automaticTax` charge from its
1080
+ * PaymentIntent metadata, in ISO minor units. Empty for untaxed charges.
1081
+ */
1082
+ function chargeTaxFields(paymentIntent, currency) {
1083
+ const metadata = paymentIntent.metadata ?? {};
1084
+ const calculation = metadata[TAX_CALCULATION_METADATA];
1085
+ if (!calculation || !currency) return {};
1086
+ const minor = (value) => {
1087
+ const amount = typeof value === "string" ? Number(value) : value;
1088
+ return typeof amount === "number" && Number.isSafeInteger(amount) ? stripeAmountToMinorUnitsOrUndefined(amount, currency) : void 0;
1089
+ };
1090
+ return {
1091
+ amountMinor: minor(paymentIntent.amount),
1092
+ subtotalMinor: minor(metadata[SUBTOTAL_AMOUNT_METADATA]),
1093
+ taxMinor: minor(metadata[TAX_AMOUNT_METADATA]),
1094
+ taxCalculationExternalId: calculation
1095
+ };
1096
+ }
982
1097
  function assertIdempotencyKey(key) {
983
1098
  if (typeof key !== "string" || key.trim() === "") throw new Error("idempotencyKey must be a non-empty string");
984
1099
  }
@@ -1009,10 +1124,14 @@ function lineServicePeriod(lineItem) {
1009
1124
  end: periodEnd
1010
1125
  };
1011
1126
  }
1012
- function mapChargeOutcome(paymentIntent) {
1127
+ function mapChargeOutcome(paymentIntent, currency) {
1013
1128
  const error = paymentIntent.last_payment_error;
1014
1129
  const status = mapPaymentIntentChargeStatus(paymentIntent.status, error?.code);
1130
+ const tax = chargeTaxFields(paymentIntent, currency);
1131
+ const amountMinor = tax.amountMinor ?? (typeof paymentIntent.amount === "number" ? stripeAmountToMinorUnitsOrUndefined(paymentIntent.amount, currency) : void 0);
1015
1132
  return {
1133
+ ...omitAmount(tax),
1134
+ ...amountMinor === void 0 ? {} : { amountMinor },
1016
1135
  status,
1017
1136
  paymentExternalId: paymentIntent.id,
1018
1137
  paymentMethodExternalId: idOf(paymentIntent.payment_method),
@@ -1027,10 +1146,13 @@ function mapChargeOutcome(paymentIntent) {
1027
1146
  * be the charge this call describes; a key reused for a different amount,
1028
1147
  * currency, or customer is refused instead of reporting the wrong charge.
1029
1148
  */
1030
- function assertSameCharge(paymentIntent, customerExternalId, stripeAmount, currency, paymentMethodExternalId) {
1149
+ function assertSameCharge(paymentIntent, expected) {
1031
1150
  const customer = idOf(paymentIntent.customer);
1032
1151
  const paymentMethod = idOf(paymentIntent.payment_method);
1033
- if (paymentIntent.amount !== stripeAmount || (paymentIntent.currency || "").toUpperCase() !== currency || customer !== void 0 && customer !== customerExternalId || paymentMethodExternalId !== void 0 && paymentMethod !== void 0 && paymentMethod !== paymentMethodExternalId) throw new Error(`idempotencyKey was already used for a different charge (${paymentIntent.id}); use a new key for a new charge`);
1152
+ const metadata = paymentIntent.metadata ?? {};
1153
+ const taxed = Boolean(metadata[TAX_CALCULATION_METADATA]);
1154
+ const requestedAmount = taxed ? Number(metadata[SUBTOTAL_AMOUNT_METADATA]) : paymentIntent.amount;
1155
+ if (taxed !== expected.automaticTax || requestedAmount !== expected.stripeAmount || (paymentIntent.currency || "").toUpperCase() !== expected.currency || customer !== void 0 && customer !== expected.customerExternalId || expected.paymentMethodExternalId !== void 0 && paymentMethod !== void 0 && paymentMethod !== expected.paymentMethodExternalId) throw new Error(`idempotencyKey was already used for a different charge (${paymentIntent.id}); use a new key for a new charge`);
1034
1156
  }
1035
1157
  /** Remove `client_secret` from a Stripe object and its expanded intents. */
1036
1158
  function withoutClientSecrets(value) {
@@ -1075,6 +1197,7 @@ function mapWebhookPayment(paymentIntent, eventType) {
1075
1197
  customerExternalId: idOf(paymentIntent.customer),
1076
1198
  amountMinor: currency && typeof paymentIntent.amount === "number" ? stripeAmountToMinorUnitsOrUndefined(paymentIntent.amount, currency) : void 0,
1077
1199
  currency,
1200
+ ...omitAmount(chargeTaxFields(paymentIntent, currency)),
1078
1201
  chargeKey: metadata[CHARGE_KEY_METADATA],
1079
1202
  failureCode: status === "succeeded" ? void 0 : error?.code || void 0,
1080
1203
  declineCode: status === "succeeded" ? void 0 : error?.decline_code || void 0,
@@ -1082,6 +1205,10 @@ function mapWebhookPayment(paymentIntent, eventType) {
1082
1205
  metadata
1083
1206
  };
1084
1207
  }
1208
+ function omitAmount(fields) {
1209
+ const { amountMinor: _amount, ...rest } = fields;
1210
+ return rest;
1211
+ }
1085
1212
  function idOf(value) {
1086
1213
  if (typeof value === "string") return value || void 0;
1087
1214
  return value?.id || void 0;
@@ -1171,4 +1298,4 @@ function sleep(ms) {
1171
1298
  //#endregion
1172
1299
  export { StripeProvider };
1173
1300
 
1174
- //# sourceMappingURL=stripe-Dc061lPD.js.map
1301
+ //# sourceMappingURL=stripe-CZlx1zrs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-CZlx1zrs.js","names":[],"sources":["../../src/providers/stripe/index.ts"],"sourcesContent":["/**\n * Stripe Provider\n *\n * Implements Stripe AR, payment, webhook, and billing operations using the\n * Stripe HTTP API directly. The SDK keeps Stripe as an optional runtime\n * dependency by relying on the platform fetch implementation.\n */\n\nimport { createHmac, randomUUID, timingSafeEqual } from 'node:crypto';\nimport { StripeApiError } from '../../errors.js';\nimport type {\n AccountingProviderType,\n AuditMatch,\n AuditOperations,\n AuditReport,\n BillInput,\n BillOperations,\n CustomerInput,\n CustomerOperations,\n DateRange,\n ExternalBill,\n ExternalCustomer,\n ExternalInvoice,\n ExternalPayment,\n ExternalRecord,\n ExternalVendor,\n FieldDiff,\n InvoiceInput,\n InvoiceOperations,\n ListOptions,\n PaymentChargeStatus,\n PaymentInput,\n PaymentOperations,\n SavedPaymentMethodChargeInput,\n SavedPaymentMethodChargeResult,\n StripeAccountingProvider,\n StripeBillingOperations,\n StripeCheckoutLineItem,\n StripeCheckoutSession,\n StripeCheckoutSessionDetails,\n StripeCheckoutSessionInput,\n StripeCustomerPortalSession,\n StripeCustomerPortalSessionInput,\n StripeOptions,\n StripeSubscriptionStatus,\n StripeSubscriptionStatusResult,\n SyncResult,\n VendorInput,\n VendorOperations,\n WebhookEvent,\n WebhookOperations,\n WebhookPaymentSummary,\n} from '../../types.js';\n\ntype StripePrimitive = string | number | boolean | Date | null | undefined;\ntype StripeFormValue =\n | StripePrimitive\n | StripeFormValue[]\n | { [key: string]: StripeFormValue };\n\ninterface StripeListResponse<T> {\n object: 'list';\n data: T[];\n has_more?: boolean;\n}\n\ninterface StripeCustomer {\n id: string;\n created?: number | null;\n name?: string | null;\n email?: string | null;\n phone?: string | null;\n address?: StripeAddress | null;\n balance?: number | null;\n currency?: string | null;\n metadata?: Record<string, string> | null;\n invoice_settings?: {\n default_payment_method?: string | { id: string } | null;\n } | null;\n}\n\ninterface StripeSearchResponse<T> {\n object: 'search_result';\n data: T[];\n has_more?: boolean;\n next_page?: string | null;\n}\n\ninterface StripeCoupon {\n id: string;\n amount_off?: number | null;\n currency?: string | null;\n percent_off?: number | null;\n valid?: boolean | null;\n}\n\ninterface StripeAddress {\n line1?: string | null;\n line2?: string | null;\n city?: string | null;\n state?: string | null;\n postal_code?: string | null;\n country?: string | null;\n}\n\ninterface StripeInvoice {\n id: string;\n number?: string | null;\n customer?: string | StripeCustomer | null;\n created?: number | null;\n due_date?: number | null;\n subtotal?: number | null;\n tax?: number | null;\n total_taxes?: Array<{ amount?: number | null }> | null;\n total?: number | null;\n amount_paid?: number | null;\n amount_remaining?: number | null;\n status?: string | null;\n currency?: string | null;\n collection_method?: string | null;\n auto_advance?: boolean | null;\n paid_out_of_band?: boolean | null;\n metadata?: Record<string, string> | null;\n}\n\ninterface StripeInvoiceItem {\n id: string;\n metadata?: Record<string, string> | null;\n}\n\ninterface StripePaymentIntent {\n id: string;\n object?: string | null;\n amount?: number | null;\n currency?: string | null;\n created?: number | null;\n status?: string | null;\n invoice?: string | null;\n customer?: string | { id: string } | null;\n payment_method?: string | { id: string } | null;\n payment_method_types?: string[] | null;\n latest_charge?: string | null;\n metadata?: Record<string, string> | null;\n last_payment_error?: {\n code?: string | null;\n decline_code?: string | null;\n message?: string | null;\n } | null;\n}\n\ninterface StripeTaxCalculation {\n id: string;\n amount_total: number;\n tax_amount_exclusive: number;\n tax_amount_inclusive?: number | null;\n}\n\ninterface StripeSetupIntent {\n id: string;\n payment_method?: string | { id: string } | null;\n}\n\ninterface StripeCheckoutSessionResponse {\n id: string;\n url?: string | null;\n mode?: string | null;\n status?: string | null;\n payment_status?: string | null;\n customer?: string | { id: string } | null;\n subscription?: string | { id: string } | null;\n payment_intent?: string | StripePaymentIntent | null;\n setup_intent?: string | StripeSetupIntent | null;\n currency?: string | null;\n amount_subtotal?: number | null;\n amount_total?: number | null;\n total_details?: { amount_tax?: number | null } | null;\n metadata?: Record<string, string> | null;\n}\n\ninterface StripePortalSessionResponse {\n id: string;\n url: string;\n}\n\ninterface StripeSubscription {\n id: string;\n status: StripeSubscriptionStatus;\n customer: string | StripeCustomer;\n current_period_start?: number | null;\n current_period_end?: number | null;\n cancel_at_period_end?: boolean | null;\n canceled_at?: number | null;\n trial_end?: number | null;\n}\n\ninterface StripeWebhookPayload {\n id?: string | null;\n type?: string | null;\n created?: number | null;\n data?: {\n object?: {\n id?: string | null;\n object?: string | null;\n [key: string]: unknown;\n } | null;\n } | null;\n}\n\n/**\n * Stripe accounting provider.\n */\nexport class StripeProvider implements StripeAccountingProvider {\n readonly type = 'stripe' as const;\n\n private readonly options: StripeOptions;\n private readonly fetchImpl: typeof fetch;\n private readonly couponIds = new Map<string, string>();\n\n readonly customers: CustomerOperations;\n readonly invoices: InvoiceOperations;\n readonly vendors: VendorOperations;\n readonly bills: BillOperations;\n readonly payments: PaymentOperations;\n readonly audit: AuditOperations;\n readonly webhooks: WebhookOperations;\n readonly billing: Required<StripeBillingOperations>;\n\n constructor(options: StripeOptions) {\n this.options = {\n timeout: 30000,\n maxRetries: 3,\n apiBaseUrl: 'https://api.stripe.com',\n webhookTolerance: 300,\n ...options,\n };\n this.fetchImpl = options.fetch || fetch;\n\n this.customers = new StripeCustomerOperations(this);\n this.invoices = new StripeInvoiceOperations(this);\n this.vendors = new UnsupportedVendorOperations();\n this.bills = new UnsupportedBillOperations();\n this.payments = new StripePaymentOperations(this);\n this.audit = new StripeAuditOperations(this);\n this.webhooks = new StripeWebhookOperations(this.options);\n this.billing = new StripeBillingOperationsImpl(this);\n }\n\n async request<T>(\n method: 'GET' | 'POST' | 'DELETE',\n endpoint: string,\n params?: Record<string, StripeFormValue>,\n options: { idempotencyKey?: string } = {},\n ): Promise<T> {\n const timeout = this.options.timeout || 30000;\n const maxRetries = this.options.maxRetries ?? 3;\n const idempotencyKey =\n method === 'POST'\n ? (options.idempotencyKey ?? `sdk-${randomUUID()}`)\n : null;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const url = this.buildUrl(endpoint, method === 'GET' ? params : {});\n const body =\n method === 'POST' && params\n ? encodeStripeForm(params).toString()\n : undefined;\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.options.secretKey}`,\n Accept: 'application/json',\n };\n if (method === 'POST') {\n headers['Content-Type'] = 'application/x-www-form-urlencoded';\n if (idempotencyKey) {\n headers['Idempotency-Key'] = idempotencyKey;\n }\n }\n if (this.options.apiVersion) {\n headers['Stripe-Version'] = this.options.apiVersion;\n }\n\n const response = await this.fetchImpl(url, {\n method,\n headers,\n body,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n const error = new StripeApiError(response.status, errorText);\n\n if (response.status < 500 && response.status !== 429) {\n throw error;\n }\n\n lastError = error;\n } else {\n const text = await response.text();\n return (text ? JSON.parse(text) : {}) as T;\n }\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n const statusMatch = lastError.message.match(\n /Stripe API error \\((\\d+)\\)/,\n );\n if (statusMatch) {\n const status = Number.parseInt(statusMatch[1], 10);\n if (status >= 400 && status < 500 && status !== 429) {\n throw lastError;\n }\n }\n } finally {\n clearTimeout(timeoutId);\n }\n\n if (attempt < maxRetries) {\n await sleep(2 ** attempt * 500);\n }\n }\n\n throw lastError || new Error('Stripe request failed after retries');\n }\n\n /**\n * @internal\n * A reusable amount-off coupon for a line discount, created on first use.\n * Its id is derived from the currency and amount, so every replay and every\n * invoice with the same discount shares one coupon instead of creating one\n * per line.\n */\n async amountOffCoupon(currency: string, amount: number): Promise<string> {\n const normalized = currency.toLowerCase();\n const id = `hv_amount_off_${normalized}_${amount}`;\n const cached = this.couponIds.get(id);\n if (cached) {\n return cached;\n }\n\n const path = `/v1/coupons/${encodeURIComponent(id)}`;\n let coupon: StripeCoupon;\n try {\n coupon = await this.request<StripeCoupon>('GET', path);\n } catch (error) {\n if (!(error instanceof StripeApiError) || error.status !== 404) {\n throw error;\n }\n try {\n coupon = await this.request<StripeCoupon>('POST', '/v1/coupons', {\n id,\n amount_off: amount,\n currency: normalized,\n duration: 'forever',\n name: 'Discount',\n metadata: { hv_purpose: 'invoice_line_discount' },\n });\n } catch (createError) {\n // A concurrent push created it first.\n if (\n !(createError instanceof StripeApiError) ||\n createError.code !== 'resource_already_exists'\n ) {\n throw createError;\n }\n coupon = await this.request<StripeCoupon>('GET', path);\n }\n }\n\n if (\n coupon.amount_off !== amount ||\n (coupon.currency || '').toLowerCase() !== normalized ||\n coupon.percent_off ||\n coupon.valid === false\n ) {\n throw new Error(\n `Stripe coupon ${id} exists but is not a valid ${amount} ${normalized} amount-off coupon`,\n );\n }\n this.couponIds.set(id, coupon.id);\n return coupon.id;\n }\n\n private buildUrl(\n endpoint: string,\n params?: Record<string, StripeFormValue>,\n ): string {\n const baseUrl = this.options.apiBaseUrl || 'https://api.stripe.com';\n const url = new URL(endpoint, baseUrl);\n\n if (params && Object.keys(params).length > 0) {\n for (const [key, value] of encodeStripeForm(params).entries()) {\n url.searchParams.append(key, value);\n }\n }\n\n return url.toString();\n }\n}\n\nclass StripeCustomerOperations implements CustomerOperations {\n constructor(private readonly provider: StripeProvider) {}\n\n async push(customer: CustomerInput): Promise<SyncResult> {\n if (customer.idempotencyKey !== undefined) {\n assertIdempotencyKey(customer.idempotencyKey);\n // After Stripe's idempotency window a replayed key creates a new\n // customer, so first look for the one an earlier attempt created.\n const existing = await this.findByLocalId(customer.id);\n if (existing) {\n return {\n action: 'created',\n externalId: existing.id,\n syncedAt: new Date(),\n };\n }\n }\n\n const response = await this.provider.request<StripeCustomer>(\n 'POST',\n '/v1/customers',\n mapCustomerToStripe(customer),\n {\n idempotencyKey: customer.idempotencyKey\n ? `${customer.idempotencyKey}:customer`\n : undefined,\n },\n );\n\n return {\n action: 'created',\n externalId: response.id,\n syncedAt: new Date(),\n };\n }\n\n /**\n * The oldest customer tagged with this local id. Stripe search is\n * eventually consistent (normally under a minute); inside that lag the\n * idempotency key, retained for at least 24 hours, covers the replay.\n */\n private async findByLocalId(\n localId: string,\n ): Promise<StripeCustomer | undefined> {\n const matches: StripeCustomer[] = [];\n let page: string | undefined;\n do {\n const response = await this.provider.request<\n StripeSearchResponse<StripeCustomer>\n >('GET', '/v1/customers/search', {\n query: `metadata['local_id']:'${escapeSearchValue(localId)}'`,\n limit: 100,\n page,\n });\n matches.push(\n ...response.data.filter(\n (customer) => customer.metadata?.local_id === localId,\n ),\n );\n page = response.has_more ? response.next_page || undefined : undefined;\n } while (page);\n\n return matches.sort(\n (left, right) =>\n (left.created ?? 0) - (right.created ?? 0) ||\n left.id.localeCompare(right.id),\n )[0];\n }\n\n async pull(externalId: string): Promise<ExternalCustomer> {\n const customer = await this.provider.request<StripeCustomer>(\n 'GET',\n `/v1/customers/${encodeURIComponent(externalId)}`,\n );\n return mapStripeCustomer(customer);\n }\n\n async list(options: ListOptions = {}): Promise<ExternalCustomer[]> {\n const response = await this.provider.request<\n StripeListResponse<StripeCustomer>\n >('GET', '/v1/customers', mapListOptions(options));\n return response.data.map(mapStripeCustomer);\n }\n\n async sync(customer: CustomerInput): Promise<SyncResult> {\n if (!customer.externalId) {\n return this.push(customer);\n }\n\n await this.provider.request<StripeCustomer>(\n 'POST',\n `/v1/customers/${encodeURIComponent(customer.externalId)}`,\n mapCustomerToStripe(customer),\n );\n\n return {\n action: 'updated',\n externalId: customer.externalId,\n syncedAt: new Date(),\n };\n }\n}\n\nclass StripeInvoiceOperations implements InvoiceOperations {\n constructor(private readonly provider: StripeProvider) {}\n\n async push(invoice: InvoiceInput): Promise<SyncResult> {\n if (!invoice.customerExternalId) {\n throw new Error('Stripe invoices require customerExternalId');\n }\n\n const currency = invoice.currency || 'usd';\n const collectionMethod = resolveCollectionMethod(invoice);\n // Validate every line before any provider request.\n const lines = invoice.lineItems.map((lineItem) => ({\n lineItem,\n unitAmount: moneyToStripeMinorUnits(lineItem.unitPrice, currency),\n discount: lineDiscountToStripe(lineItem, currency),\n period: lineServicePeriod(lineItem),\n taxCode: optionalTaxCode(lineItem.taxCode),\n }));\n\n const existingInvoice = invoice.idempotencyKey\n ? await this.findInvoiceByLocalId(invoice.customerExternalId, invoice.id)\n : undefined;\n if (existingInvoice) {\n return {\n action: 'created',\n externalId: existingInvoice.id,\n syncedAt: new Date(),\n };\n }\n\n const existingLineItemIndexes = invoice.idempotencyKey\n ? await this.findPendingLineItemIndexes(\n invoice.customerExternalId,\n invoice.id,\n )\n : new Set<number>();\n\n for (const [index, line] of lines.entries()) {\n if (existingLineItemIndexes.has(index)) {\n continue;\n }\n const { lineItem, unitAmount, discount, period, taxCode } = line;\n const coupon = discount\n ? await this.provider.amountOffCoupon(currency, discount)\n : undefined;\n await this.provider.request(\n 'POST',\n '/v1/invoiceitems',\n {\n customer: invoice.customerExternalId,\n currency,\n description: lineItem.description,\n quantity: lineItem.quantity,\n unit_amount_decimal: String(unitAmount),\n period,\n discounts: coupon ? [{ coupon }] : undefined,\n tax_behavior: invoice.automaticTax ? 'exclusive' : undefined,\n tax_code: taxCode,\n metadata: normalizeMetadata({\n local_invoice_id: invoice.id,\n local_line_index: index,\n local_sku: lineItem.sku,\n local_discount: lineItem.discount,\n local_tax_rate: lineItem.taxRate,\n }),\n },\n {\n idempotencyKey: invoice.idempotencyKey\n ? `${invoice.idempotencyKey}:item:${index}`\n : undefined,\n },\n );\n }\n\n const response = await this.provider.request<StripeInvoice>(\n 'POST',\n '/v1/invoices',\n mapInvoiceToStripe(invoice, collectionMethod),\n {\n idempotencyKey: invoice.idempotencyKey\n ? `${invoice.idempotencyKey}:invoice`\n : undefined,\n },\n );\n\n return {\n action: 'created',\n externalId: response.id,\n syncedAt: new Date(),\n };\n }\n\n async pull(externalId: string): Promise<ExternalInvoice> {\n const invoice = await this.provider.request<StripeInvoice>(\n 'GET',\n `/v1/invoices/${encodeURIComponent(externalId)}`,\n );\n return mapStripeInvoice(invoice);\n }\n\n async list(options: ListOptions = {}): Promise<ExternalInvoice[]> {\n const response = await this.provider.request<\n StripeListResponse<StripeInvoice>\n >('GET', '/v1/invoices', mapListOptions(options));\n return response.data.map(mapStripeInvoice);\n }\n\n async sync(invoice: InvoiceInput): Promise<SyncResult> {\n if (!invoice.externalId) {\n return this.push(invoice);\n }\n\n await this.provider.request<StripeInvoice>(\n 'POST',\n `/v1/invoices/${encodeURIComponent(invoice.externalId)}`,\n mapInvoiceUpdateToStripe(invoice, resolveCollectionMethod(invoice)),\n );\n\n return {\n action: 'updated',\n externalId: invoice.externalId,\n syncedAt: new Date(),\n };\n }\n\n /**\n * `send_invoice` invoices are emailed through Stripe's send endpoint.\n * `charge_automatically` invoices are finalized with automatic collection\n * on, so Stripe charges the customer's default payment method and applies\n * its retry settings; the outcome arrives as `invoice.paid` or\n * `invoice.payment_failed`.\n */\n async send(externalId: string): Promise<void> {\n const path = `/v1/invoices/${encodeURIComponent(externalId)}`;\n const invoice = await this.provider.request<StripeInvoice>('GET', path);\n if (invoice.collection_method !== 'charge_automatically') {\n await this.provider.request('POST', `${path}/send`);\n return;\n }\n if (invoice.status === 'draft') {\n await this.provider.request(\n 'POST',\n `${path}/finalize`,\n { auto_advance: true },\n { idempotencyKey: `${externalId}:finalize` },\n );\n return;\n }\n if (invoice.status === 'open' && invoice.auto_advance === false) {\n await this.provider.request(\n 'POST',\n path,\n { auto_advance: true },\n { idempotencyKey: `${externalId}:auto_advance` },\n );\n }\n }\n\n async markUncollectible(externalId: string): Promise<void> {\n await this.provider.request(\n 'POST',\n `/v1/invoices/${encodeURIComponent(externalId)}/mark_uncollectible`,\n undefined,\n { idempotencyKey: `${externalId}:mark_uncollectible` },\n );\n }\n\n /**\n * Close an invoice paid on another rail (`paid_out_of_band`). An invoice\n * already marked paid out of band, or paid with nothing collected, is left\n * as is; one Stripe collected money for itself throws (a second collection needs a refund, not a silent close).\n * A draft is finalized first without automatic collection, and refused if\n * finalization raised the amount due. A void invoice throws; an\n * uncollectible one can still be paid, as in Stripe.\n */\n async markPaidOutOfBand(externalId: string): Promise<void> {\n const path = `/v1/invoices/${encodeURIComponent(externalId)}`;\n let invoice = await this.provider.request<StripeInvoice>('GET', path);\n if (invoice.status === 'paid') {\n // Closed out of band before, or settled with nothing collected (a\n // zero or credit-balance invoice): nothing more to do.\n if (invoice.paid_out_of_band === true || !(invoice.amount_paid ?? 0)) {\n return;\n }\n // Stripe collected it itself: closing it again would hide a second\n // collection. The caller must refund or credit the other payment.\n throw new Error(\n `Stripe invoice ${externalId} was already paid through Stripe; it was not marked paid out of band.`,\n );\n }\n if (invoice.status === 'void') {\n throw new Error(\n `Stripe invoice ${externalId} is void and cannot be marked paid.`,\n );\n }\n if (invoice.status === 'draft') {\n const draftDue = invoice.amount_remaining ?? invoice.total ?? 0;\n invoice = await this.provider.request<StripeInvoice>(\n 'POST',\n `${path}/finalize`,\n { auto_advance: false },\n { idempotencyKey: `${externalId}:finalize_out_of_band` },\n );\n // Finalizing settles zero-balance invoices on its own.\n if (invoice.status === 'paid') return;\n // Finalization computes tax, credits, and discounts; never forgive an\n // amount larger than the one the caller saw.\n if ((invoice.amount_remaining ?? 0) > draftDue) {\n throw new Error(\n `Stripe invoice ${externalId} grew from ${draftDue} to ${invoice.amount_remaining} on finalization; not marking it paid out of band.`,\n );\n }\n }\n await this.provider.request(\n 'POST',\n `${path}/pay`,\n { paid_out_of_band: true },\n { idempotencyKey: `${externalId}:paid_out_of_band` },\n );\n }\n\n async void(externalId: string): Promise<void> {\n await this.provider.request(\n 'POST',\n `/v1/invoices/${encodeURIComponent(externalId)}/void`,\n );\n }\n\n private async findInvoiceByLocalId(\n customerExternalId: string,\n localInvoiceId: string,\n ): Promise<StripeInvoice | undefined> {\n let startingAfter: string | undefined;\n do {\n const response = await this.provider.request<\n StripeListResponse<StripeInvoice>\n >('GET', '/v1/invoices', {\n customer: customerExternalId,\n limit: 100,\n starting_after: startingAfter,\n });\n const existing = response.data.find(\n (invoice) => invoice.metadata?.local_id === localInvoiceId,\n );\n if (existing) {\n return existing;\n }\n startingAfter = response.has_more ? response.data.at(-1)?.id : undefined;\n } while (startingAfter);\n\n return undefined;\n }\n\n private async findPendingLineItemIndexes(\n customerExternalId: string,\n localInvoiceId: string,\n ): Promise<Set<number>> {\n const indexes = new Set<number>();\n let startingAfter: string | undefined;\n do {\n const response = await this.provider.request<\n StripeListResponse<StripeInvoiceItem>\n >('GET', '/v1/invoiceitems', {\n customer: customerExternalId,\n pending: true,\n limit: 100,\n starting_after: startingAfter,\n });\n for (const item of response.data) {\n if (item.metadata?.local_invoice_id !== localInvoiceId) {\n continue;\n }\n const index = Number(item.metadata.local_line_index);\n if (Number.isSafeInteger(index) && index >= 0) {\n indexes.add(index);\n }\n }\n startingAfter = response.has_more ? response.data.at(-1)?.id : undefined;\n } while (startingAfter);\n\n return indexes;\n }\n}\n\nclass StripePaymentOperations implements PaymentOperations {\n constructor(private readonly provider: StripeProvider) {}\n\n async pull(externalId: string): Promise<ExternalPayment> {\n const paymentIntent = await this.provider.request<StripePaymentIntent>(\n 'GET',\n `/v1/payment_intents/${encodeURIComponent(externalId)}`,\n );\n return mapStripePaymentIntent(paymentIntent);\n }\n\n async list(options: ListOptions = {}): Promise<ExternalPayment[]> {\n const response = await this.provider.request<\n StripeListResponse<StripePaymentIntent>\n >('GET', '/v1/payment_intents', mapListOptions(options));\n return response.data.map(mapStripePaymentIntent);\n }\n\n async chargeSavedPaymentMethod(\n input: SavedPaymentMethodChargeInput,\n ): Promise<SavedPaymentMethodChargeResult> {\n assertIdempotencyKey(input.idempotencyKey);\n if (!input.customerExternalId) {\n throw new Error('Saved payment method charges require a customer');\n }\n const currency = normalizeCurrencyCode(input.currency);\n const stripeAmount = minorUnitsToStripeAmount(input.amountMinor, currency);\n if (stripeAmount <= 0) {\n throw new Error(\n 'Charge amount must be a positive integer of minor units',\n );\n }\n const automaticTax = input.automaticTax === true;\n const taxCode = optionalTaxCode(input.taxCode);\n if (taxCode && !automaticTax) {\n throw new Error('taxCode requires automaticTax');\n }\n const reserved = Object.keys(input.metadata ?? {}).filter((key) =>\n RESERVED_CHARGE_METADATA.has(key),\n );\n if (reserved.length > 0) {\n throw new Error(\n `Charge metadata keys ${reserved.join(', ')} are reserved by the adapter`,\n );\n }\n const chargeKey = input.idempotencyKey;\n const base = {\n provider: 'stripe' as const,\n customerExternalId: input.customerExternalId,\n amountMinor: input.amountMinor,\n currency,\n chargeKey,\n ...(automaticTax ? { subtotalMinor: input.amountMinor } : {}),\n };\n\n // After Stripe's idempotency window a replayed key would charge again, so\n // first look for the PaymentIntent an earlier attempt created.\n const existing = await this.findByChargeKey(chargeKey);\n if (existing) {\n assertSameCharge(existing, {\n customerExternalId: input.customerExternalId,\n stripeAmount,\n currency,\n automaticTax,\n paymentMethodExternalId: input.paymentMethodExternalId,\n });\n return { ...base, ...mapChargeOutcome(existing, currency) };\n }\n\n let paymentMethod = input.paymentMethodExternalId;\n if (!paymentMethod) {\n const customer = await this.provider.request<StripeCustomer>(\n 'GET',\n `/v1/customers/${encodeURIComponent(input.customerExternalId)}`,\n );\n paymentMethod = idOf(customer.invoice_settings?.default_payment_method);\n if (!paymentMethod) {\n return {\n ...base,\n status: 'failed',\n failureCode: 'payment_method_missing',\n failureMessage: 'The customer has no default payment method.',\n };\n }\n }\n\n let amount = stripeAmount;\n let taxMetadata: Record<string, string> = {};\n let taxCalculation: string | undefined;\n if (automaticTax) {\n let calculation: StripeTaxCalculation;\n try {\n calculation = await this.calculateTax(\n input.customerExternalId,\n stripeAmount,\n currency,\n chargeKey,\n taxCode,\n );\n } catch (error) {\n // A customer without a usable tax location is a charge outcome the\n // host can act on (ask for an address), not a transport failure.\n if (\n error instanceof StripeApiError &&\n error.code === 'customer_tax_location_invalid'\n ) {\n return {\n ...base,\n paymentMethodExternalId: paymentMethod,\n status: 'failed',\n failureCode: error.code,\n failureMessage: error.stripeMessage,\n };\n }\n throw error;\n }\n amount = calculation.amount_total;\n taxCalculation = calculation.id;\n taxMetadata = {\n [TAX_CALCULATION_METADATA]: calculation.id,\n [SUBTOTAL_AMOUNT_METADATA]: String(stripeAmount),\n [TAX_AMOUNT_METADATA]: String(calculation.tax_amount_exclusive),\n };\n }\n\n try {\n const paymentIntent = await this.provider.request<StripePaymentIntent>(\n 'POST',\n '/v1/payment_intents',\n {\n amount,\n currency: currency.toLowerCase(),\n customer: input.customerExternalId,\n payment_method: paymentMethod,\n off_session: true,\n confirm: true,\n description: input.description,\n // Stripe records the tax transaction from the linked calculation\n // when the payment succeeds, and reverses it on refunds.\n hooks: taxCalculation\n ? { inputs: { tax: { calculation: taxCalculation } } }\n : undefined,\n metadata: normalizeMetadata({\n ...input.metadata,\n ...taxMetadata,\n [CHARGE_KEY_METADATA]: chargeKey,\n }),\n },\n { idempotencyKey: `${chargeKey}:payment_intent` },\n );\n return { ...base, ...mapChargeOutcome(paymentIntent, currency) };\n } catch (error) {\n // A decline or an authentication requirement is a charge outcome, not\n // a transport failure: Stripe returns 402 with the failed PaymentIntent.\n if (\n error instanceof StripeApiError &&\n error.status === 402 &&\n error.type === 'card_error'\n ) {\n const paymentIntent = isRecord(error.paymentIntent)\n ? (error.paymentIntent as unknown as StripePaymentIntent)\n : undefined;\n return {\n ...base,\n ...(taxCalculation\n ? chargeTaxFields({ amount, metadata: taxMetadata }, currency)\n : {}),\n ...(paymentIntent ? mapChargeOutcome(paymentIntent, currency) : {}),\n paymentMethodExternalId:\n idOf(paymentIntent?.payment_method) ?? paymentMethod,\n status:\n error.code === 'authentication_required'\n ? 'requires_action'\n : 'failed',\n failureCode: error.code,\n declineCode: error.declineCode,\n failureMessage: error.stripeMessage,\n raw: paymentIntent ? withoutClientSecret(paymentIntent) : undefined,\n };\n }\n throw error;\n }\n }\n\n /**\n * Stripe Tax calculation for one tax-exclusive line of `stripeAmount`,\n * from the customer's saved address and tax status. Each attempt makes\n * a fresh calculation: Stripe replays a saved error for a reused\n * idempotency key, so a key per charge would keep failing with\n * `customer_tax_location_invalid` after the customer's address is fixed.\n * A calculation creates no tax transaction until a PaymentIntent linked\n * to it succeeds, so an unused one is harmless; if an earlier attempt's\n * PaymentIntent exists but is not yet searchable, the changed\n * PaymentIntent request is refused by Stripe's idempotency check (the\n * `<key>:payment_intent` key) instead of charging again.\n */\n private async calculateTax(\n customerExternalId: string,\n stripeAmount: number,\n currency: string,\n chargeKey: string,\n taxCode: string | undefined,\n ): Promise<StripeTaxCalculation> {\n const calculation = await this.provider.request<StripeTaxCalculation>(\n 'POST',\n '/v1/tax/calculations',\n {\n currency: currency.toLowerCase(),\n customer: customerExternalId,\n line_items: [\n {\n amount: stripeAmount,\n quantity: 1,\n reference: 'off_session_charge',\n tax_behavior: 'exclusive',\n tax_code: taxCode,\n },\n ],\n },\n // Not derived from the charge key: a fixed-length key stays within\n // Stripe's 255-character limit for any caller key.\n { idempotencyKey: `hv_tax_calculation:${randomUUID()}` },\n );\n const tax = calculation.tax_amount_exclusive;\n if (\n !calculation.id ||\n !Number.isSafeInteger(tax) ||\n tax < 0 ||\n calculation.amount_total !== stripeAmount + tax\n ) {\n throw new Error(\n `Stripe tax calculation ${calculation.id ?? '(no id)'} does not add up to the charge amount plus exclusive tax`,\n );\n }\n return calculation;\n }\n\n private async findByChargeKey(\n chargeKey: string,\n ): Promise<StripePaymentIntent | undefined> {\n const response = await this.provider.request<\n StripeSearchResponse<StripePaymentIntent>\n >('GET', '/v1/payment_intents/search', {\n query: `metadata['${CHARGE_KEY_METADATA}']:'${escapeSearchValue(chargeKey)}'`,\n limit: 10,\n });\n return response.data\n .filter((intent) => intent.metadata?.[CHARGE_KEY_METADATA] === chargeKey)\n .sort(\n (left, right) =>\n (left.created ?? 0) - (right.created ?? 0) ||\n left.id.localeCompare(right.id),\n )[0];\n }\n}\n\nclass StripeBillingOperationsImpl implements StripeBillingOperations {\n constructor(private readonly provider: StripeProvider) {}\n\n async createCheckoutSession(\n input: StripeCheckoutSessionInput,\n ): Promise<StripeCheckoutSession> {\n const response = await this.provider.request<StripeCheckoutSessionResponse>(\n 'POST',\n '/v1/checkout/sessions',\n mapCheckoutSessionToStripe(input),\n { idempotencyKey: input.idempotencyKey },\n );\n\n return mapCheckoutSessionResponse(response);\n }\n\n async retrieveCheckoutSession(\n sessionExternalId: string,\n ): Promise<StripeCheckoutSessionDetails> {\n const session = await this.provider.request<StripeCheckoutSessionResponse>(\n 'GET',\n `/v1/checkout/sessions/${encodeURIComponent(sessionExternalId)}`,\n { expand: ['setup_intent', 'payment_intent'] },\n );\n const intent =\n typeof session.setup_intent === 'object' && session.setup_intent\n ? session.setup_intent\n : typeof session.payment_intent === 'object' && session.payment_intent\n ? session.payment_intent\n : undefined;\n const currency = session.currency\n ? session.currency.toUpperCase()\n : undefined;\n const minor = (amount?: number | null) =>\n currency && typeof amount === 'number'\n ? stripeAmountToMinorUnitsOrUndefined(amount, currency)\n : undefined;\n\n return {\n ...mapCheckoutSessionResponse(session),\n raw: withoutClientSecrets(session),\n status: oneOf(session.status, ['open', 'complete', 'expired'] as const),\n paymentStatus: oneOf(session.payment_status, [\n 'paid',\n 'unpaid',\n 'no_payment_required',\n ] as const),\n paymentMethodExternalId: idOf(intent?.payment_method),\n currency,\n amountSubtotalMinor: minor(session.amount_subtotal),\n amountTaxMinor: minor(session.total_details?.amount_tax),\n amountTotalMinor: minor(session.amount_total),\n metadata: { ...(session.metadata || {}) },\n };\n }\n\n async setDefaultPaymentMethod(\n customerExternalId: string,\n paymentMethodExternalId: string,\n ): Promise<void> {\n if (!customerExternalId || !paymentMethodExternalId) {\n throw new Error(\n 'setDefaultPaymentMethod requires a customer and a payment method',\n );\n }\n await this.provider.request(\n 'POST',\n `/v1/customers/${encodeURIComponent(customerExternalId)}`,\n { invoice_settings: { default_payment_method: paymentMethodExternalId } },\n );\n }\n\n async createCustomerPortalSession(\n input: StripeCustomerPortalSessionInput,\n ): Promise<StripeCustomerPortalSession> {\n const response = await this.provider.request<StripePortalSessionResponse>(\n 'POST',\n '/v1/billing_portal/sessions',\n {\n customer: input.customerExternalId,\n return_url: input.returnUrl,\n configuration: input.configurationExternalId,\n },\n );\n\n return {\n externalId: response.id,\n url: response.url,\n raw: response,\n };\n }\n\n async retrieveSubscriptionStatus(\n subscriptionExternalId: string,\n ): Promise<StripeSubscriptionStatusResult> {\n const subscription = await this.provider.request<StripeSubscription>(\n 'GET',\n `/v1/subscriptions/${encodeURIComponent(subscriptionExternalId)}`,\n );\n\n return mapStripeSubscription(subscription);\n }\n\n async listCustomerSubscriptions(\n customerExternalId: string,\n ): Promise<StripeSubscriptionStatusResult[]> {\n const response = await this.provider.request<\n StripeListResponse<StripeSubscription>\n >('GET', '/v1/subscriptions', {\n customer: customerExternalId,\n status: 'all',\n limit: 100,\n });\n\n return response.data.map(mapStripeSubscription);\n }\n}\n\nclass UnsupportedVendorOperations implements VendorOperations {\n async push(_vendor: VendorInput): Promise<SyncResult> {\n throw new Error('Stripe does not support vendor operations');\n }\n\n async pull(_externalId: string): Promise<ExternalVendor> {\n throw new Error('Stripe does not support vendor operations');\n }\n\n async list(_options?: ListOptions): Promise<ExternalVendor[]> {\n throw new Error('Stripe does not support vendor operations');\n }\n\n async sync(_vendor: VendorInput): Promise<SyncResult> {\n throw new Error('Stripe does not support vendor operations');\n }\n}\n\nclass UnsupportedBillOperations implements BillOperations {\n async push(_bill: BillInput): Promise<SyncResult> {\n throw new Error('Stripe does not support bill operations');\n }\n\n async pull(_externalId: string): Promise<ExternalBill> {\n throw new Error('Stripe does not support bill operations');\n }\n\n async list(_options?: ListOptions): Promise<ExternalBill[]> {\n throw new Error('Stripe does not support bill operations');\n }\n\n async sync(_bill: BillInput): Promise<SyncResult> {\n throw new Error('Stripe does not support bill operations');\n }\n}\n\nclass StripeAuditOperations implements AuditOperations {\n constructor(private readonly provider: StripeProvider) {}\n\n async reconcileCustomers(\n locals: CustomerInput[],\n ): Promise<AuditReport<CustomerInput>> {\n const externals = await this.provider.customers.list({ limit: 100 });\n return reconcileRecords('stripe', locals, externals, compareCustomer);\n }\n\n async reconcileInvoices(\n locals: InvoiceInput[],\n dateRange?: DateRange,\n ): Promise<AuditReport<InvoiceInput>> {\n const externals = await this.provider.invoices.list({\n limit: 100,\n startDate: dateRange?.start,\n endDate: dateRange?.end,\n });\n return reconcileRecords('stripe', locals, externals, compareInvoice);\n }\n\n async reconcileVendors(\n _locals: VendorInput[],\n ): Promise<AuditReport<VendorInput>> {\n throw new Error('Stripe does not support vendor operations');\n }\n\n async reconcileBills(_locals: BillInput[]): Promise<AuditReport<BillInput>> {\n throw new Error('Stripe does not support bill operations');\n }\n\n async reconcilePayments(\n locals: PaymentInput[],\n dateRange?: DateRange,\n ): Promise<AuditReport<PaymentInput>> {\n const externals = await this.provider.payments.list({\n limit: 100,\n startDate: dateRange?.start,\n endDate: dateRange?.end,\n });\n return reconcileRecords('stripe', locals, externals, comparePayment);\n }\n}\n\nclass StripeWebhookOperations implements WebhookOperations {\n constructor(private readonly options: StripeOptions) {}\n\n verify(payload: string, signature: string, secret: string): boolean {\n const endpointSecret = secret || this.options.webhookSecret;\n if (!endpointSecret) {\n throw new Error(\n 'Stripe webhook secret not provided. Pass it as the secret parameter or configure webhookSecret in options.',\n );\n }\n\n const parsed = parseStripeSignatureHeader(signature);\n if (!parsed.timestamp || parsed.signatures.length === 0) {\n return false;\n }\n\n const tolerance = this.options.webhookTolerance ?? 300;\n const timestamp = Number.parseInt(parsed.timestamp, 10);\n if (\n !Number.isFinite(timestamp) ||\n Math.abs(Date.now() / 1000 - timestamp) > tolerance\n ) {\n return false;\n }\n\n const signedPayload = `${parsed.timestamp}.${payload}`;\n const expected = createHmac('sha256', endpointSecret)\n .update(signedPayload)\n .digest('hex');\n\n return parsed.signatures.some((value) =>\n constantTimeEqualHex(value, expected),\n );\n }\n\n parse(payload: string): WebhookEvent {\n let event: StripeWebhookPayload;\n try {\n event = JSON.parse(payload) as StripeWebhookPayload;\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown JSON parse error';\n throw new Error(`Invalid Stripe webhook payload: ${message}`);\n }\n\n const resource = event?.data?.object;\n const payment =\n resource?.object === 'payment_intent' && typeof resource.id === 'string'\n ? mapWebhookPayment(\n resource as unknown as StripePaymentIntent,\n event?.type || undefined,\n )\n : undefined;\n return {\n ...(payment ? { payment } : {}),\n type: event?.type || 'unknown',\n id: typeof event?.id === 'string' ? event.id : undefined,\n provider: 'stripe',\n timestamp: unixToDate(event?.created) || new Date(),\n payload: event,\n resourceType: mapStripeResourceType(\n resource?.object || undefined,\n event?.type || undefined,\n ),\n resourceId: typeof resource?.id === 'string' ? resource.id : undefined,\n };\n }\n}\n\nfunction encodeStripeForm(params: Record<string, StripeFormValue>) {\n const form = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n appendStripeFormValue(form, key, value);\n }\n\n return form;\n}\n\nfunction appendStripeFormValue(\n form: URLSearchParams,\n key: string,\n value: StripeFormValue,\n): void {\n if (value === undefined || value === null) {\n return;\n }\n\n if (value instanceof Date) {\n form.append(key, String(toUnixSeconds(value)));\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n appendStripeFormValue(form, `${key}[${index}]`, item);\n });\n return;\n }\n\n if (typeof value === 'object') {\n for (const [childKey, childValue] of Object.entries(value)) {\n appendStripeFormValue(form, `${key}[${childKey}]`, childValue);\n }\n return;\n }\n\n form.append(key, String(value));\n}\n\nfunction mapCustomerToStripe(\n customer: CustomerInput,\n): Record<string, StripeFormValue> {\n const stripeCustomer: Record<string, StripeFormValue> = {\n name: customer.name,\n email: customer.email,\n phone: customer.phone,\n address: customer.billingAddress\n ? {\n line1: customer.billingAddress.street1,\n line2: customer.billingAddress.street2,\n city: customer.billingAddress.city,\n state: customer.billingAddress.state,\n postal_code: customer.billingAddress.postalCode,\n country: customer.billingAddress.country,\n }\n : undefined,\n metadata: normalizeMetadata({\n payment_terms: customer.paymentTerms,\n ...customer.metadata,\n // Written last: idempotent creation reconciles customers by it.\n local_id: customer.id,\n }),\n };\n\n if (customer.taxExempt !== undefined) {\n stripeCustomer.tax_exempt = customer.taxExempt ? 'exempt' : 'none';\n }\n\n return stripeCustomer;\n}\n\nfunction mapInvoiceToStripe(\n invoice: InvoiceInput,\n collectionMethod: 'send_invoice' | 'charge_automatically',\n): Record<string, StripeFormValue> {\n return {\n customer: invoice.customerExternalId,\n collection_method: collectionMethod,\n // Stripe rejects a due date on automatically charged invoices.\n due_date: collectionMethod === 'send_invoice' ? invoice.dueDate : undefined,\n auto_advance: false,\n pending_invoice_items_behavior: 'include',\n automatic_tax: invoice.automaticTax ? { enabled: true } : undefined,\n metadata: normalizeMetadata({\n local_id: invoice.id,\n invoice_number: invoice.invoiceNumber,\n reference: invoice.reference,\n memo: invoice.memo,\n tax_amount: invoice.taxAmount,\n subtotal: invoice.subtotal,\n total_amount: invoice.totalAmount,\n ...invoice.metadata,\n }),\n };\n}\n\nfunction mapInvoiceUpdateToStripe(\n invoice: InvoiceInput,\n collectionMethod: 'send_invoice' | 'charge_automatically',\n): Record<string, StripeFormValue> {\n return {\n // Sent only when the caller sets it, so existing updates are unchanged.\n // Stripe accepts a collection method change on draft invoices and rejects\n // it on finalized ones rather than ignoring it.\n collection_method: invoice.collectionMethod ? collectionMethod : undefined,\n due_date: collectionMethod === 'send_invoice' ? invoice.dueDate : undefined,\n metadata: normalizeMetadata({\n local_id: invoice.id,\n invoice_number: invoice.invoiceNumber,\n reference: invoice.reference,\n memo: invoice.memo,\n ...invoice.metadata,\n }),\n };\n}\n\nfunction mapCheckoutSessionToStripe(\n input: StripeCheckoutSessionInput,\n): Record<string, StripeFormValue> {\n const mode = input.mode || 'subscription';\n const lineItems = input.lineItems || [];\n if (mode === 'setup') {\n if (lineItems.length > 0) {\n throw new Error('Stripe setup-mode Checkout does not accept line items');\n }\n if (!input.currency && !input.paymentMethodTypes?.length) {\n throw new Error(\n 'Stripe setup-mode Checkout requires currency or paymentMethodTypes',\n );\n }\n if (input.automaticTax) {\n throw new Error('Stripe setup-mode Checkout does not calculate tax');\n }\n } else if (lineItems.length === 0) {\n throw new Error(`Stripe ${mode}-mode Checkout requires line items`);\n }\n if (input.setupFutureUsage && mode !== 'payment') {\n throw new Error('setupFutureUsage applies only to payment-mode Checkout');\n }\n if (input.customerUpdate && !input.customerExternalId) {\n throw new Error('customerUpdate requires customerExternalId');\n }\n\n return {\n mode,\n success_url: input.successUrl,\n cancel_url: input.cancelUrl,\n customer: input.customerExternalId,\n customer_email: input.customerExternalId ? undefined : input.customerEmail,\n client_reference_id: input.clientReferenceId,\n allow_promotion_codes: input.allowPromotionCodes,\n currency: input.currency ? input.currency.toLowerCase() : undefined,\n payment_method_types: input.paymentMethodTypes,\n automatic_tax: input.automaticTax ? { enabled: true } : undefined,\n billing_address_collection: input.billingAddressCollection,\n customer_update: input.customerUpdate\n ? {\n address: input.customerUpdate.address,\n name: input.customerUpdate.name,\n shipping: input.customerUpdate.shipping,\n }\n : undefined,\n payment_intent_data: input.setupFutureUsage\n ? { setup_future_usage: input.setupFutureUsage }\n : undefined,\n line_items:\n mode === 'setup'\n ? undefined\n : lineItems.map((lineItem) =>\n mapCheckoutLineItem(lineItem, Boolean(input.automaticTax)),\n ),\n metadata: normalizeMetadata(input.metadata || {}),\n };\n}\n\nfunction mapCheckoutSessionResponse(\n response: StripeCheckoutSessionResponse,\n): StripeCheckoutSession {\n return {\n externalId: response.id,\n url: response.url || null,\n mode: oneOf(response.mode, ['payment', 'setup', 'subscription'] as const),\n customerExternalId: idOf(response.customer),\n subscriptionExternalId: idOf(response.subscription),\n paymentIntentExternalId: idOf(response.payment_intent),\n setupIntentExternalId: idOf(response.setup_intent),\n raw: withoutClientSecrets(response),\n };\n}\n\nfunction mapCheckoutLineItem(\n lineItem: StripeCheckoutLineItem,\n automaticTax = false,\n): Record<string, StripeFormValue> {\n if (lineItem.price) {\n return {\n price: lineItem.price,\n quantity: lineItem.quantity || 1,\n };\n }\n\n if (!lineItem.priceData) {\n throw new Error('Stripe checkout line item requires price or priceData');\n }\n\n const { priceData } = lineItem;\n const taxCode = optionalTaxCode(priceData.taxCode);\n if (taxCode && priceData.product) {\n throw new Error(\n 'Stripe checkout priceData.taxCode applies to ad-hoc products only; set the tax code on the existing product instead',\n );\n }\n const productData = priceData.product\n ? undefined\n : { name: priceData.productName || 'Subscription', tax_code: taxCode };\n const hasStripeAmount = priceData.unitAmount !== undefined;\n const hasMinorAmount = priceData.unitAmountMinor !== undefined;\n if (hasStripeAmount === hasMinorAmount) {\n throw new Error(\n 'Stripe checkout priceData requires exactly one of unitAmount or unitAmountMinor',\n );\n }\n const unitAmount = hasMinorAmount\n ? minorUnitsToStripeAmount(\n priceData.unitAmountMinor as number,\n normalizeCurrencyCode(priceData.currency),\n )\n : priceData.unitAmount;\n\n return {\n quantity: lineItem.quantity || 1,\n price_data: {\n currency: priceData.currency.toLowerCase(),\n unit_amount: unitAmount,\n tax_behavior:\n priceData.taxBehavior ?? (automaticTax ? 'exclusive' : undefined),\n product: priceData.product,\n product_data: productData,\n recurring: priceData.recurring\n ? {\n interval: priceData.recurring.interval,\n interval_count: priceData.recurring.intervalCount,\n }\n : undefined,\n },\n };\n}\n\nfunction mapListOptions(options: ListOptions): Record<string, StripeFormValue> {\n return {\n limit: options.limit,\n starting_after:\n typeof options.offset === 'string' ? options.offset : undefined,\n created: {\n gte: options.startDate,\n lte: options.endDate,\n },\n status: options.status,\n };\n}\n\nfunction mapStripeCustomer(customer: StripeCustomer): ExternalCustomer {\n return {\n externalId: customer.id,\n provider: 'stripe',\n syncedAt: new Date(),\n name: customer.name || '',\n email: customer.email || undefined,\n phone: customer.phone || undefined,\n billingAddress: customer.address\n ? {\n street1: customer.address.line1 || undefined,\n street2: customer.address.line2 || undefined,\n city: customer.address.city || undefined,\n state: customer.address.state || undefined,\n postalCode: customer.address.postal_code || undefined,\n country: customer.address.country || undefined,\n }\n : undefined,\n balance:\n customer.balance === null || customer.balance === undefined\n ? undefined\n : stripeMinorUnitsToMoney(customer.balance, customer.currency),\n currency: customer.currency || undefined,\n raw: customer,\n };\n}\n\nfunction mapStripeInvoice(invoice: StripeInvoice): ExternalInvoice {\n return {\n externalId: invoice.id,\n provider: 'stripe',\n syncedAt: new Date(),\n invoiceNumber: invoice.number || invoice.id,\n customerExternalId:\n typeof invoice.customer === 'string'\n ? invoice.customer\n : invoice.customer?.id || '',\n issueDate: unixToDate(invoice.created) || new Date(),\n dueDate:\n unixToDate(invoice.due_date) || unixToDate(invoice.created) || new Date(),\n subtotal: stripeMinorUnitsToMoney(invoice.subtotal || 0, invoice.currency),\n taxAmount: stripeMinorUnitsToMoney(\n stripeInvoiceTaxAmount(invoice),\n invoice.currency,\n ),\n totalAmount: stripeMinorUnitsToMoney(invoice.total || 0, invoice.currency),\n amountPaid: stripeMinorUnitsToMoney(\n invoice.amount_paid || 0,\n invoice.currency,\n ),\n balance: stripeMinorUnitsToMoney(\n invoice.amount_remaining || 0,\n invoice.currency,\n ),\n status: mapStripeInvoiceStatus(invoice.status, invoice.due_date),\n currency: invoice.currency || 'usd',\n paidOutOfBand: invoice.paid_out_of_band === true,\n raw: invoice,\n };\n}\n\nfunction mapStripePaymentIntent(\n paymentIntent: StripePaymentIntent,\n): ExternalPayment {\n return {\n externalId: paymentIntent.id,\n provider: 'stripe',\n syncedAt: new Date(),\n amount: stripeMinorUnitsToMoney(\n paymentIntent.amount || 0,\n paymentIntent.currency,\n ),\n currency: paymentIntent.currency || 'usd',\n paidAt: unixToDate(paymentIntent.created) || new Date(),\n method: paymentIntent.payment_method_types?.[0],\n transactionId: paymentIntent.latest_charge || paymentIntent.id,\n invoiceExternalIds: paymentIntent.invoice\n ? [paymentIntent.invoice]\n : undefined,\n status: mapStripePaymentStatus(paymentIntent.status),\n raw: paymentIntent,\n };\n}\n\nfunction mapStripeSubscription(\n subscription: StripeSubscription,\n): StripeSubscriptionStatusResult {\n return {\n externalId: subscription.id,\n status: subscription.status,\n customerExternalId:\n typeof subscription.customer === 'string'\n ? subscription.customer\n : subscription.customer.id,\n currentPeriodStart: unixToDate(subscription.current_period_start),\n currentPeriodEnd: unixToDate(subscription.current_period_end),\n cancelAtPeriodEnd: Boolean(subscription.cancel_at_period_end),\n canceledAt: unixToDate(subscription.canceled_at),\n trialEnd: unixToDate(subscription.trial_end),\n raw: subscription,\n };\n}\n\nfunction mapStripeInvoiceStatus(\n status?: string | null,\n dueDate?: number | null,\n): ExternalInvoice['status'] {\n switch (status) {\n case 'draft':\n return 'draft';\n case 'paid':\n return 'paid';\n case 'void':\n return 'voided';\n case 'uncollectible':\n return 'uncollectible';\n case 'open':\n if (dueDate && dueDate * 1000 < Date.now()) {\n return 'overdue';\n }\n return 'sent';\n default:\n return 'sent';\n }\n}\n\nfunction mapStripePaymentStatus(\n status?: string | null,\n): ExternalPayment['status'] {\n switch (status) {\n case 'succeeded':\n return 'completed';\n case 'processing':\n case 'requires_action':\n case 'requires_capture':\n case 'requires_confirmation':\n return 'pending';\n case 'canceled':\n case 'requires_payment_method':\n return 'failed';\n default:\n return 'pending';\n }\n}\n\nfunction mapStripeResourceType(\n object?: string,\n eventType?: string,\n): WebhookEvent['resourceType'] | undefined {\n if (object === 'customer' || eventType?.startsWith('customer.')) {\n return 'customer';\n }\n if (object === 'invoice' || eventType?.startsWith('invoice.')) {\n return 'invoice';\n }\n if (\n object === 'payment_intent' ||\n object === 'charge' ||\n eventType?.startsWith('payment_intent.') ||\n eventType?.startsWith('charge.')\n ) {\n return 'payment';\n }\n return undefined;\n}\n\nfunction normalizeMetadata(\n metadata: Record<string, unknown>,\n): Record<string, string> {\n const normalized: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== undefined && value !== null) {\n normalized[key] = String(value);\n }\n }\n\n return normalized;\n}\n\nfunction parseStripeSignatureHeader(signature: string): {\n timestamp?: string;\n signatures: string[];\n} {\n const parts = signature.split(',').map((part) => part.trim());\n const parsed: { timestamp?: string; signatures: string[] } = {\n signatures: [],\n };\n\n for (const part of parts) {\n const separatorIndex = part.indexOf('=');\n if (separatorIndex === -1) {\n continue;\n }\n\n const key = part.slice(0, separatorIndex);\n const value = part.slice(separatorIndex + 1);\n if (key === 't') {\n parsed.timestamp = value;\n }\n if (key === 'v1' && value) {\n parsed.signatures.push(value);\n }\n }\n\n return parsed;\n}\n\nfunction constantTimeEqualHex(left: string, right: string): boolean {\n try {\n const leftBuffer = Buffer.from(left, 'hex');\n const rightBuffer = Buffer.from(right, 'hex');\n return (\n leftBuffer.length === rightBuffer.length &&\n timingSafeEqual(leftBuffer, rightBuffer)\n );\n } catch {\n return false;\n }\n}\n\nfunction reconcileRecords<TLocal extends { externalId?: string }>(\n provider: AccountingProviderType,\n locals: TLocal[],\n externals: ExternalRecord[],\n compare: (local: TLocal, external: ExternalRecord) => FieldDiff[],\n): AuditReport<TLocal> {\n const externalById = new Map(\n externals.map((external) => [external.externalId, external]),\n );\n const matched: AuditMatch<TLocal>[] = [];\n const discrepancies: AuditReport<TLocal>['discrepancies'] = [];\n const localOnly: TLocal[] = [];\n const seenExternalIds = new Set<string>();\n\n for (const local of locals) {\n const external = local.externalId\n ? externalById.get(local.externalId)\n : undefined;\n\n if (!external) {\n localOnly.push(local);\n continue;\n }\n\n seenExternalIds.add(external.externalId);\n const differences = compare(local, external);\n if (differences.length === 0) {\n matched.push({ local, external, status: 'identical' });\n } else {\n discrepancies.push({ local, external, differences });\n }\n }\n\n const externalOnly = externals.filter(\n (external) => !seenExternalIds.has(external.externalId),\n );\n\n return {\n provider,\n auditedAt: new Date(),\n matched,\n localOnly,\n externalOnly,\n discrepancies,\n summary: {\n total: locals.length + externalOnly.length,\n matched: matched.length,\n localOnly: localOnly.length,\n externalOnly: externalOnly.length,\n discrepancies: discrepancies.length,\n },\n };\n}\n\nfunction compareCustomer(\n local: CustomerInput,\n external: ExternalRecord,\n): FieldDiff[] {\n const customer = external as ExternalCustomer;\n return [\n compareField('name', local.name, customer.name),\n compareField('email', local.email, customer.email),\n ].filter((diff): diff is FieldDiff => Boolean(diff));\n}\n\nfunction compareInvoice(\n local: InvoiceInput,\n external: ExternalRecord,\n): FieldDiff[] {\n const invoice = external as ExternalInvoice;\n return [\n compareField('totalAmount', local.totalAmount, invoice.totalAmount),\n compareField('currency', local.currency || 'usd', invoice.currency),\n ].filter((diff): diff is FieldDiff => Boolean(diff));\n}\n\nfunction comparePayment(\n local: PaymentInput,\n external: ExternalRecord,\n): FieldDiff[] {\n const payment = external as ExternalPayment;\n return [\n compareField('amount', local.amount, payment.amount),\n compareField('currency', local.currency || 'usd', payment.currency),\n ].filter((diff): diff is FieldDiff => Boolean(diff));\n}\n\nfunction compareField(\n field: string,\n localValue: unknown,\n externalValue: unknown,\n): FieldDiff | null {\n if (valuesEqual(localValue, externalValue)) {\n return null;\n }\n return { field, localValue, externalValue };\n}\n\nfunction valuesEqual(left: unknown, right: unknown): boolean {\n if (left === right) {\n return true;\n }\n if (typeof left === 'number' && typeof right === 'number') {\n return Math.abs(left - right) < 0.01;\n }\n return false;\n}\n\nfunction stripeInvoiceTaxAmount(invoice: StripeInvoice): number {\n if (typeof invoice.tax === 'number') {\n return invoice.tax;\n }\n return (invoice.total_taxes || []).reduce(\n (total, tax) => total + (tax.amount || 0),\n 0,\n );\n}\n\nconst STRIPE_ZERO_DECIMAL_CURRENCIES = new Set([\n 'BIF',\n 'CLP',\n 'DJF',\n 'GNF',\n 'JPY',\n 'KMF',\n 'KRW',\n 'MGA',\n 'PYG',\n 'RWF',\n 'VND',\n 'VUV',\n 'XAF',\n 'XOF',\n 'XPF',\n]);\nconst STRIPE_THREE_DECIMAL_CURRENCIES = new Set([\n 'BHD',\n 'IQD',\n 'JOD',\n 'KWD',\n 'LYD',\n 'OMR',\n 'TND',\n]);\n\nfunction stripeCurrencyMinorUnitFactor(currency?: string | null): number {\n const normalized = (currency || 'usd').toUpperCase();\n if (STRIPE_ZERO_DECIMAL_CURRENCIES.has(normalized)) {\n return 1;\n }\n if (STRIPE_THREE_DECIMAL_CURRENCIES.has(normalized)) {\n return 1_000;\n }\n return 100;\n}\n\nfunction moneyToStripeMinorUnits(amount: number, currency: string): number {\n return Math.round(amount * stripeCurrencyMinorUnitFactor(currency));\n}\n\nfunction stripeMinorUnitsToMoney(\n amount: number,\n currency?: string | null,\n): number {\n return amount / stripeCurrencyMinorUnitFactor(currency);\n}\n\nconst CHARGE_KEY_METADATA = 'hv_charge_key';\n/** Stripe Tax calculation linked to an `automaticTax` charge. */\nconst TAX_CALCULATION_METADATA = 'hv_tax_calculation';\n/** Pre-tax amount of an `automaticTax` charge, in Stripe units. */\nconst SUBTOTAL_AMOUNT_METADATA = 'hv_subtotal_amount';\n/** Exclusive tax of an `automaticTax` charge, in Stripe units. */\nconst TAX_AMOUNT_METADATA = 'hv_tax_amount';\nconst RESERVED_CHARGE_METADATA = new Set([\n TAX_CALCULATION_METADATA,\n SUBTOTAL_AMOUNT_METADATA,\n TAX_AMOUNT_METADATA,\n]);\n\n/** A caller-supplied product tax code, trimmed; blank is refused. */\nfunction optionalTaxCode(taxCode: string | undefined): string | undefined {\n if (taxCode === undefined) {\n return undefined;\n }\n const code = typeof taxCode === 'string' ? taxCode.trim() : '';\n if (!code) {\n throw new Error('taxCode must be a non-empty string when set');\n }\n return code;\n}\n\n/**\n * Amount, subtotal, and tax of an `automaticTax` charge from its\n * PaymentIntent metadata, in ISO minor units. Empty for untaxed charges.\n */\nfunction chargeTaxFields(\n paymentIntent: Pick<StripePaymentIntent, 'amount' | 'metadata'>,\n currency: string | undefined,\n): Pick<\n SavedPaymentMethodChargeResult,\n 'subtotalMinor' | 'taxMinor' | 'taxCalculationExternalId'\n> & { amountMinor?: number } {\n const metadata = paymentIntent.metadata ?? {};\n const calculation = metadata[TAX_CALCULATION_METADATA];\n if (!calculation || !currency) {\n return {};\n }\n const minor = (value?: string | number | null) => {\n const amount = typeof value === 'string' ? Number(value) : value;\n return typeof amount === 'number' && Number.isSafeInteger(amount)\n ? stripeAmountToMinorUnitsOrUndefined(amount, currency)\n : undefined;\n };\n return {\n amountMinor: minor(paymentIntent.amount),\n subtotalMinor: minor(metadata[SUBTOTAL_AMOUNT_METADATA]),\n taxMinor: minor(metadata[TAX_AMOUNT_METADATA]),\n taxCalculationExternalId: calculation,\n };\n}\n\nfunction assertIdempotencyKey(key: string): void {\n if (typeof key !== 'string' || key.trim() === '') {\n throw new Error('idempotencyKey must be a non-empty string');\n }\n}\n\n/** Escape a value for a single-quoted Stripe Search Query Language string. */\nfunction escapeSearchValue(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\nfunction resolveCollectionMethod(\n invoice: InvoiceInput,\n): 'send_invoice' | 'charge_automatically' {\n const method = invoice.collectionMethod ?? 'send_invoice';\n if (method !== 'send_invoice' && method !== 'charge_automatically') {\n throw new Error(`Unsupported invoice collectionMethod '${method}'`);\n }\n return method;\n}\n\n/** The line's discount in Stripe units, validated against the line total. */\nfunction lineDiscountToStripe(\n lineItem: InvoiceInput['lineItems'][number],\n currency: string,\n): number | undefined {\n if (lineItem.discount === undefined || lineItem.discount === 0) {\n return undefined;\n }\n if (!Number.isFinite(lineItem.discount) || lineItem.discount < 0) {\n throw new Error(\n `Invoice line '${lineItem.description}' discount must be a non-negative amount`,\n );\n }\n const discount = moneyToStripeMinorUnits(lineItem.discount, currency);\n const lineTotal = Math.round(\n moneyToStripeMinorUnits(lineItem.unitPrice, currency) * lineItem.quantity,\n );\n if (discount > lineTotal) {\n throw new Error(\n `Invoice line '${lineItem.description}' discount exceeds the line total`,\n );\n }\n return discount > 0 ? discount : undefined;\n}\n\nfunction lineServicePeriod(\n lineItem: InvoiceInput['lineItems'][number],\n): { start: Date; end: Date } | undefined {\n const { periodStart, periodEnd } = lineItem;\n if (!periodStart && !periodEnd) {\n return undefined;\n }\n if (!(periodStart instanceof Date) || !(periodEnd instanceof Date)) {\n throw new Error(\n `Invoice line '${lineItem.description}' needs both periodStart and periodEnd`,\n );\n }\n if (\n Number.isNaN(periodStart.getTime()) ||\n Number.isNaN(periodEnd.getTime()) ||\n periodEnd.getTime() < periodStart.getTime()\n ) {\n throw new Error(\n `Invoice line '${lineItem.description}' has an invalid service period`,\n );\n }\n return { start: periodStart, end: periodEnd };\n}\n\nfunction mapChargeOutcome(\n paymentIntent: StripePaymentIntent,\n currency: string,\n): Partial<Pick<SavedPaymentMethodChargeResult, 'amountMinor'>> &\n Pick<\n SavedPaymentMethodChargeResult,\n | 'subtotalMinor'\n | 'taxMinor'\n | 'taxCalculationExternalId'\n | 'status'\n | 'paymentExternalId'\n | 'paymentMethodExternalId'\n | 'failureCode'\n | 'declineCode'\n | 'failureMessage'\n | 'raw'\n > {\n const error = paymentIntent.last_payment_error;\n const status = mapPaymentIntentChargeStatus(\n paymentIntent.status,\n error?.code,\n );\n const tax = chargeTaxFields(paymentIntent, currency);\n const amountMinor =\n tax.amountMinor ??\n (typeof paymentIntent.amount === 'number'\n ? stripeAmountToMinorUnitsOrUndefined(paymentIntent.amount, currency)\n : undefined);\n return {\n ...omitAmount(tax),\n // Keep the caller's amount when the PaymentIntent amount is unreadable.\n ...(amountMinor === undefined ? {} : { amountMinor }),\n status,\n paymentExternalId: paymentIntent.id,\n paymentMethodExternalId: idOf(paymentIntent.payment_method),\n failureCode: status === 'succeeded' ? undefined : error?.code || undefined,\n declineCode:\n status === 'succeeded' ? undefined : error?.decline_code || undefined,\n failureMessage:\n status === 'succeeded' ? undefined : error?.message || undefined,\n raw: withoutClientSecret(paymentIntent),\n };\n}\n\n/**\n * A PaymentIntent found by charge key after Stripe's idempotency window must\n * be the charge this call describes; a key reused for a different amount,\n * currency, or customer is refused instead of reporting the wrong charge.\n */\nfunction assertSameCharge(\n paymentIntent: StripePaymentIntent,\n expected: {\n customerExternalId: string;\n stripeAmount: number;\n currency: string;\n automaticTax: boolean;\n paymentMethodExternalId?: string;\n },\n): void {\n const customer = idOf(paymentIntent.customer);\n const paymentMethod = idOf(paymentIntent.payment_method);\n const metadata = paymentIntent.metadata ?? {};\n const taxed = Boolean(metadata[TAX_CALCULATION_METADATA]);\n // A taxed charge's PaymentIntent amount includes tax; the requested\n // amount is its recorded subtotal.\n const requestedAmount = taxed\n ? Number(metadata[SUBTOTAL_AMOUNT_METADATA])\n : paymentIntent.amount;\n if (\n taxed !== expected.automaticTax ||\n requestedAmount !== expected.stripeAmount ||\n (paymentIntent.currency || '').toUpperCase() !== expected.currency ||\n (customer !== undefined && customer !== expected.customerExternalId) ||\n (expected.paymentMethodExternalId !== undefined &&\n paymentMethod !== undefined &&\n paymentMethod !== expected.paymentMethodExternalId)\n ) {\n throw new Error(\n `idempotencyKey was already used for a different charge (${paymentIntent.id}); use a new key for a new charge`,\n );\n }\n}\n\n/** Remove `client_secret` from a Stripe object and its expanded intents. */\nfunction withoutClientSecrets<T extends object>(value: T): T {\n const copy = withoutClientSecret(value) as Record<string, unknown>;\n for (const key of ['payment_intent', 'setup_intent']) {\n const nested = copy[key];\n if (isRecord(nested)) {\n copy[key] = withoutClientSecret(nested);\n }\n }\n return copy as T;\n}\n\n/**\n * Drop the intent client secret before handing objects to callers, including\n * `next_action`, whose redirect URL and SDK payload embed the same secret.\n */\nfunction withoutClientSecret<T extends object>(value: T): T {\n const {\n client_secret: _secret,\n next_action: _nextAction,\n ...rest\n } = value as T & { client_secret?: unknown; next_action?: unknown };\n return rest as T;\n}\n\nfunction mapPaymentIntentChargeStatus(\n status?: string | null,\n errorCode?: string | null,\n): PaymentChargeStatus {\n switch (status) {\n case 'succeeded':\n return 'succeeded';\n case 'processing':\n case 'requires_capture':\n return 'processing';\n case 'requires_action':\n case 'requires_confirmation':\n return 'requires_action';\n case 'canceled':\n return 'canceled';\n case 'requires_payment_method':\n return errorCode === 'authentication_required'\n ? 'requires_action'\n : 'failed';\n default:\n return 'processing';\n }\n}\n\nfunction mapWebhookPayment(\n paymentIntent: StripePaymentIntent,\n eventType?: string,\n): WebhookPaymentSummary {\n const error = paymentIntent.last_payment_error;\n let status = mapPaymentIntentChargeStatus(paymentIntent.status, error?.code);\n if (eventType === 'payment_intent.succeeded') status = 'succeeded';\n if (eventType === 'payment_intent.canceled') status = 'canceled';\n if (eventType === 'payment_intent.payment_failed') {\n status =\n error?.code === 'authentication_required' ? 'requires_action' : 'failed';\n }\n const currency = paymentIntent.currency\n ? paymentIntent.currency.toUpperCase()\n : undefined;\n const metadata = { ...(paymentIntent.metadata || {}) };\n return {\n status,\n paymentExternalId: paymentIntent.id,\n customerExternalId: idOf(paymentIntent.customer),\n amountMinor:\n currency && typeof paymentIntent.amount === 'number'\n ? stripeAmountToMinorUnitsOrUndefined(paymentIntent.amount, currency)\n : undefined,\n currency,\n ...omitAmount(chargeTaxFields(paymentIntent, currency)),\n chargeKey: metadata[CHARGE_KEY_METADATA],\n failureCode: status === 'succeeded' ? undefined : error?.code || undefined,\n declineCode:\n status === 'succeeded' ? undefined : error?.decline_code || undefined,\n failureMessage:\n status === 'succeeded' ? undefined : error?.message || undefined,\n metadata,\n };\n}\n\nfunction omitAmount<T extends { amountMinor?: number }>(\n fields: T,\n): Omit<T, 'amountMinor'> {\n const { amountMinor: _amount, ...rest } = fields;\n return rest;\n}\n\nfunction idOf(\n value: string | { id?: string | null } | null | undefined,\n): string | undefined {\n if (typeof value === 'string') {\n return value || undefined;\n }\n return value?.id || undefined;\n}\n\nfunction oneOf<const T extends string>(\n value: string | null | undefined,\n allowed: readonly T[],\n): T | undefined {\n return allowed.find((candidate) => candidate === value);\n}\n\nfunction stringOrUndefined(value: unknown): string | undefined {\n return typeof value === 'string' && value ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction normalizeCurrencyCode(currency: string): string {\n const code = String(currency ?? '')\n .trim()\n .toUpperCase();\n if (!/^[A-Z]{3}$/.test(code)) {\n throw new Error(`Currency '${currency}' must be a three-letter code`);\n }\n return code;\n}\n\n/** ISO 4217 minor-unit exponents other than 2. */\nconst ISO_ZERO_DECIMAL_CURRENCIES = new Set([\n 'BIF',\n 'CLP',\n 'DJF',\n 'GNF',\n 'ISK',\n 'JPY',\n 'KMF',\n 'KRW',\n 'PYG',\n 'RWF',\n 'UGX',\n 'UYI',\n 'VND',\n 'VUV',\n 'XAF',\n 'XOF',\n 'XPF',\n]);\nconst ISO_THREE_DECIMAL_CURRENCIES = new Set([\n 'BHD',\n 'IQD',\n 'JOD',\n 'KWD',\n 'LYD',\n 'OMR',\n 'TND',\n]);\nconst ISO_FOUR_DECIMAL_CURRENCIES = new Set(['CLF', 'UYW']);\n\n/**\n * ISO 4217 minor-unit exponent (2 for USD, 0 for JPY and ISK), from the\n * explicit tables above rather than the runtime's `Intl`/CLDR display digits,\n * which differ for some currencies (for example RSD, IQD, MGA) and change\n * between ICU releases.\n */\nfunction isoMinorUnitExponent(currency: string): number {\n if (ISO_ZERO_DECIMAL_CURRENCIES.has(currency)) return 0;\n if (ISO_THREE_DECIMAL_CURRENCIES.has(currency)) return 3;\n if (ISO_FOUR_DECIMAL_CURRENCIES.has(currency)) return 4;\n return 2;\n}\n\n/**\n * Integer ISO minor units → Stripe's smallest unit. They differ where Stripe\n * keeps a two-decimal representation for a zero-decimal currency (ISK, UGX).\n */\nfunction minorUnitsToStripeAmount(\n amountMinor: number,\n currency: string,\n): number {\n if (!Number.isSafeInteger(amountMinor)) {\n throw new Error(\n `Amount ${amountMinor} must be a safe integer number of minor units`,\n );\n }\n const iso = 10 ** isoMinorUnitExponent(currency);\n const stripe = stripeCurrencyMinorUnitFactor(currency);\n if (stripe >= iso) {\n return amountMinor * (stripe / iso);\n }\n const divisor = iso / stripe;\n if (amountMinor % divisor !== 0) {\n throw new Error(\n `Amount ${amountMinor} ${currency} minor units is not representable in Stripe's currency unit`,\n );\n }\n return amountMinor / divisor;\n}\n\nfunction stripeAmountToMinorUnitsOrUndefined(\n amount: number,\n currency: string,\n): number | undefined {\n if (!Number.isSafeInteger(amount)) {\n return undefined;\n }\n // Reads (webhooks, session totals) omit an amount that is not a whole\n // number of ISO minor units instead of failing a verified event.\n const iso = 10 ** isoMinorUnitExponent(currency);\n const stripe = stripeCurrencyMinorUnitFactor(currency);\n const minor = (amount * iso) / stripe;\n return Number.isSafeInteger(minor) ? minor : undefined;\n}\n\nfunction centsToMoney(cents: number): number {\n return cents / 100;\n}\n\nfunction toUnixSeconds(date: Date): number {\n return Math.floor(date.getTime() / 1000);\n}\n\nfunction unixToDate(value?: number | null): Date | undefined {\n return value === null || value === undefined\n ? undefined\n : new Date(value * 1000);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -109,7 +109,7 @@ async function getAccountingProvider(userOptions) {
109
109
  }
110
110
  case "stripe": {
111
111
  if (!isStripeOptions(options)) throw new Error("Invalid Stripe options");
112
- const { StripeProvider } = await import("./chunks/stripe-Dc061lPD.js");
112
+ const { StripeProvider } = await import("./chunks/stripe-CZlx1zrs.js");
113
113
  return new StripeProvider(options);
114
114
  }
115
115
  case "paypal": throw new Error("PayPal provider not yet implemented");
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/stripe/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAGV,eAAe,EAGf,cAAc,EAEd,kBAAkB,EAUlB,iBAAiB,EAIjB,iBAAiB,EAGjB,wBAAwB,EACxB,uBAAuB,EAOvB,aAAa,EAKb,gBAAgB,EAEhB,iBAAiB,EAElB,MAAM,gBAAgB,CAAC;AAExB,KAAK,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;AAC3E,KAAK,eAAe,GAChB,eAAe,GACf,eAAe,EAAE,GACjB;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAA;CAAE,CAAC;AA+IvC;;GAEG;AACH,qBAAa,cAAe,YAAW,wBAAwB;IAC7D,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAElC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IAEvD,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAC;gBAExC,OAAO,EAAE,aAAa;IAoB5B,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,EACjC,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACxC,OAAO,GAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAO,GACxC,OAAO,CAAC,CAAC,CAAC;IA8Eb;;;;;;OAMG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmDxE,OAAO,CAAC,QAAQ;CAejB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/stripe/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAGV,eAAe,EAGf,cAAc,EAEd,kBAAkB,EAUlB,iBAAiB,EAIjB,iBAAiB,EAGjB,wBAAwB,EACxB,uBAAuB,EAOvB,aAAa,EAKb,gBAAgB,EAEhB,iBAAiB,EAElB,MAAM,gBAAgB,CAAC;AAExB,KAAK,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;AAC3E,KAAK,eAAe,GAChB,eAAe,GACf,eAAe,EAAE,GACjB;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAA;CAAE,CAAC;AAsJvC;;GAEG;AACH,qBAAa,cAAe,YAAW,wBAAwB;IAC7D,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAElC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IAEvD,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAC;gBAExC,OAAO,EAAE,aAAa;IAoB5B,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,EACjC,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACxC,OAAO,GAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAO,GACxC,OAAO,CAAC,CAAC,CAAC;IA8Eb;;;;;;OAMG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmDxE,OAAO,CAAC,QAAQ;CAejB"}
package/dist/types.d.ts CHANGED
@@ -175,6 +175,13 @@ export interface InvoiceLineItemInput {
175
175
  discount?: number;
176
176
  /** Tax rate (decimal, e.g., 0.0825 for 8.25%) */
177
177
  taxRate?: number;
178
+ /**
179
+ * Provider product tax code that classifies this line for automatic tax
180
+ * (Stripe Tax: a `txcd_...` code, sent as the invoice item's `tax_code`).
181
+ * Omit to use the provider account's default product tax code. Providers
182
+ * without product tax codes ignore it.
183
+ */
184
+ taxCode?: string;
178
185
  /** Calculated line total */
179
186
  amount?: number;
180
187
  /**
@@ -493,8 +500,32 @@ export interface SavedPaymentMethodChargeInput {
493
500
  idempotencyKey: string;
494
501
  /** Statement/description text shown to the customer where supported. */
495
502
  description?: string;
496
- /** Opaque values stored on the provider charge and returned by webhooks. */
503
+ /**
504
+ * Opaque values stored on the provider charge and returned by webhooks.
505
+ * The adapter's own bookkeeping keys win over caller values, and its tax
506
+ * keys (Stripe: `hv_tax_calculation`, `hv_subtotal_amount`,
507
+ * `hv_tax_amount`) are refused.
508
+ */
497
509
  metadata?: Record<string, string | number | boolean | null | undefined>;
510
+ /**
511
+ * Add provider-calculated tax on top of `amountMinor`, from the customer's
512
+ * saved tax location and tax status (Stripe Tax). `amountMinor` is then
513
+ * the pre-tax subtotal and the customer is charged subtotal plus tax; the
514
+ * result and payment webhooks report `subtotalMinor` and `taxMinor`
515
+ * separately. The provider records the tax for reporting when the payment
516
+ * succeeds (and reverses it on refunds). A customer whose tax location
517
+ * cannot be determined yields a `failed` result with
518
+ * `failureCode: 'customer_tax_location_invalid'` and no charge. A provider
519
+ * that implements `chargeSavedPaymentMethod` but cannot calculate tax
520
+ * throws instead of charging untaxed.
521
+ */
522
+ automaticTax?: boolean;
523
+ /**
524
+ * Product tax code for the charge (Stripe: `txcd_...`); requires
525
+ * `automaticTax`. Omit to use the provider account's default product tax
526
+ * code.
527
+ */
528
+ taxCode?: string;
498
529
  }
499
530
  export interface SavedPaymentMethodChargeResult {
500
531
  status: PaymentChargeStatus;
@@ -503,10 +534,29 @@ export interface SavedPaymentMethodChargeResult {
503
534
  paymentExternalId?: string;
504
535
  customerExternalId: string;
505
536
  paymentMethodExternalId?: string;
506
- /** Integer minor units of `currency`. */
537
+ /**
538
+ * Integer minor units of `currency` charged: the provider charge's amount,
539
+ * which includes tax for an `automaticTax` charge. Before a provider
540
+ * charge exists (a `failed` result without `paymentExternalId`), the
541
+ * requested `amountMinor`.
542
+ */
507
543
  amountMinor: number;
508
544
  /** Upper-case ISO 4217 code. */
509
545
  currency: string;
546
+ /**
547
+ * `automaticTax` charges only: the pre-tax amount (the requested
548
+ * `amountMinor`), in integer minor units.
549
+ */
550
+ subtotalMinor?: number;
551
+ /**
552
+ * `automaticTax` charges only: the provider-calculated tax added to
553
+ * `subtotalMinor`, in integer minor units (`0` for an exempt customer or
554
+ * a location without a tax registration). Absent when no tax was
555
+ * calculated, for example after a tax location failure.
556
+ */
557
+ taxMinor?: number;
558
+ /** Provider tax calculation id (Stripe `taxcalc_...`), when one was made. */
559
+ taxCalculationExternalId?: string;
510
560
  /** The caller's `idempotencyKey`. */
511
561
  chargeKey: string;
512
562
  /** Provider failure code (for example `card_declined`, `authentication_required`). */
@@ -525,10 +575,19 @@ export interface WebhookPaymentSummary {
525
575
  status: PaymentChargeStatus;
526
576
  paymentExternalId: string;
527
577
  customerExternalId?: string;
528
- /** Integer minor units, when the provider amount converts exactly. */
578
+ /**
579
+ * Integer minor units charged (including tax for an `automaticTax`
580
+ * charge), when the provider amount converts exactly.
581
+ */
529
582
  amountMinor?: number;
530
583
  /** Upper-case ISO 4217 code. */
531
584
  currency?: string;
585
+ /** Pre-tax amount of an `automaticTax` charge, in integer minor units. */
586
+ subtotalMinor?: number;
587
+ /** Tax of an `automaticTax` charge, in integer minor units. */
588
+ taxMinor?: number;
589
+ /** Provider tax calculation id of an `automaticTax` charge. */
590
+ taxCalculationExternalId?: string;
532
591
  /** `idempotencyKey` of the `chargeSavedPaymentMethod` call that created it. */
533
592
  chargeKey?: string;
534
593
  failureCode?: string;
@@ -561,6 +620,13 @@ export interface StripeCheckoutPriceData {
561
620
  * session sets `automaticTax`.
562
621
  */
563
622
  taxBehavior?: 'exclusive' | 'inclusive' | 'unspecified';
623
+ /**
624
+ * Stripe product tax code (`txcd_...`) for the ad-hoc product
625
+ * (`product_data[tax_code]`), so Stripe Tax classifies this line instead
626
+ * of using the account's default product tax code. Not valid with
627
+ * `product`: an existing product carries its own tax code.
628
+ */
629
+ taxCode?: string;
564
630
  product?: string;
565
631
  productName?: string;
566
632
  recurring?: StripeRecurringPriceData;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/accounting",
3
- "version": "0.94.0",
3
+ "version": "0.96.0",
4
4
  "description": "Multi-provider accounting integration for AR/AP sync and audit with QuickBooks, Stripe, and more",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -37,7 +37,7 @@
37
37
  "license": "MIT",
38
38
  "dependencies": {
39
39
  "intuit-oauth": "^4.2.3",
40
- "@happyvertical/utils": "0.94.0"
40
+ "@happyvertical/utils": "0.96.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/node": "25.0.10",
@@ -1 +0,0 @@
1
- {"version":3,"file":"stripe-Dc061lPD.js","names":[],"sources":["../../src/providers/stripe/index.ts"],"sourcesContent":["/**\n * Stripe Provider\n *\n * Implements Stripe AR, payment, webhook, and billing operations using the\n * Stripe HTTP API directly. The SDK keeps Stripe as an optional runtime\n * dependency by relying on the platform fetch implementation.\n */\n\nimport { createHmac, randomUUID, timingSafeEqual } from 'node:crypto';\nimport { StripeApiError } from '../../errors.js';\nimport type {\n AccountingProviderType,\n AuditMatch,\n AuditOperations,\n AuditReport,\n BillInput,\n BillOperations,\n CustomerInput,\n CustomerOperations,\n DateRange,\n ExternalBill,\n ExternalCustomer,\n ExternalInvoice,\n ExternalPayment,\n ExternalRecord,\n ExternalVendor,\n FieldDiff,\n InvoiceInput,\n InvoiceOperations,\n ListOptions,\n PaymentChargeStatus,\n PaymentInput,\n PaymentOperations,\n SavedPaymentMethodChargeInput,\n SavedPaymentMethodChargeResult,\n StripeAccountingProvider,\n StripeBillingOperations,\n StripeCheckoutLineItem,\n StripeCheckoutSession,\n StripeCheckoutSessionDetails,\n StripeCheckoutSessionInput,\n StripeCustomerPortalSession,\n StripeCustomerPortalSessionInput,\n StripeOptions,\n StripeSubscriptionStatus,\n StripeSubscriptionStatusResult,\n SyncResult,\n VendorInput,\n VendorOperations,\n WebhookEvent,\n WebhookOperations,\n WebhookPaymentSummary,\n} from '../../types.js';\n\ntype StripePrimitive = string | number | boolean | Date | null | undefined;\ntype StripeFormValue =\n | StripePrimitive\n | StripeFormValue[]\n | { [key: string]: StripeFormValue };\n\ninterface StripeListResponse<T> {\n object: 'list';\n data: T[];\n has_more?: boolean;\n}\n\ninterface StripeCustomer {\n id: string;\n created?: number | null;\n name?: string | null;\n email?: string | null;\n phone?: string | null;\n address?: StripeAddress | null;\n balance?: number | null;\n currency?: string | null;\n metadata?: Record<string, string> | null;\n invoice_settings?: {\n default_payment_method?: string | { id: string } | null;\n } | null;\n}\n\ninterface StripeSearchResponse<T> {\n object: 'search_result';\n data: T[];\n has_more?: boolean;\n next_page?: string | null;\n}\n\ninterface StripeCoupon {\n id: string;\n amount_off?: number | null;\n currency?: string | null;\n percent_off?: number | null;\n valid?: boolean | null;\n}\n\ninterface StripeAddress {\n line1?: string | null;\n line2?: string | null;\n city?: string | null;\n state?: string | null;\n postal_code?: string | null;\n country?: string | null;\n}\n\ninterface StripeInvoice {\n id: string;\n number?: string | null;\n customer?: string | StripeCustomer | null;\n created?: number | null;\n due_date?: number | null;\n subtotal?: number | null;\n tax?: number | null;\n total_taxes?: Array<{ amount?: number | null }> | null;\n total?: number | null;\n amount_paid?: number | null;\n amount_remaining?: number | null;\n status?: string | null;\n currency?: string | null;\n collection_method?: string | null;\n auto_advance?: boolean | null;\n paid_out_of_band?: boolean | null;\n metadata?: Record<string, string> | null;\n}\n\ninterface StripeInvoiceItem {\n id: string;\n metadata?: Record<string, string> | null;\n}\n\ninterface StripePaymentIntent {\n id: string;\n object?: string | null;\n amount?: number | null;\n currency?: string | null;\n created?: number | null;\n status?: string | null;\n invoice?: string | null;\n customer?: string | { id: string } | null;\n payment_method?: string | { id: string } | null;\n payment_method_types?: string[] | null;\n latest_charge?: string | null;\n metadata?: Record<string, string> | null;\n last_payment_error?: {\n code?: string | null;\n decline_code?: string | null;\n message?: string | null;\n } | null;\n}\n\ninterface StripeSetupIntent {\n id: string;\n payment_method?: string | { id: string } | null;\n}\n\ninterface StripeCheckoutSessionResponse {\n id: string;\n url?: string | null;\n mode?: string | null;\n status?: string | null;\n payment_status?: string | null;\n customer?: string | { id: string } | null;\n subscription?: string | { id: string } | null;\n payment_intent?: string | StripePaymentIntent | null;\n setup_intent?: string | StripeSetupIntent | null;\n currency?: string | null;\n amount_subtotal?: number | null;\n amount_total?: number | null;\n total_details?: { amount_tax?: number | null } | null;\n metadata?: Record<string, string> | null;\n}\n\ninterface StripePortalSessionResponse {\n id: string;\n url: string;\n}\n\ninterface StripeSubscription {\n id: string;\n status: StripeSubscriptionStatus;\n customer: string | StripeCustomer;\n current_period_start?: number | null;\n current_period_end?: number | null;\n cancel_at_period_end?: boolean | null;\n canceled_at?: number | null;\n trial_end?: number | null;\n}\n\ninterface StripeWebhookPayload {\n id?: string | null;\n type?: string | null;\n created?: number | null;\n data?: {\n object?: {\n id?: string | null;\n object?: string | null;\n [key: string]: unknown;\n } | null;\n } | null;\n}\n\n/**\n * Stripe accounting provider.\n */\nexport class StripeProvider implements StripeAccountingProvider {\n readonly type = 'stripe' as const;\n\n private readonly options: StripeOptions;\n private readonly fetchImpl: typeof fetch;\n private readonly couponIds = new Map<string, string>();\n\n readonly customers: CustomerOperations;\n readonly invoices: InvoiceOperations;\n readonly vendors: VendorOperations;\n readonly bills: BillOperations;\n readonly payments: PaymentOperations;\n readonly audit: AuditOperations;\n readonly webhooks: WebhookOperations;\n readonly billing: Required<StripeBillingOperations>;\n\n constructor(options: StripeOptions) {\n this.options = {\n timeout: 30000,\n maxRetries: 3,\n apiBaseUrl: 'https://api.stripe.com',\n webhookTolerance: 300,\n ...options,\n };\n this.fetchImpl = options.fetch || fetch;\n\n this.customers = new StripeCustomerOperations(this);\n this.invoices = new StripeInvoiceOperations(this);\n this.vendors = new UnsupportedVendorOperations();\n this.bills = new UnsupportedBillOperations();\n this.payments = new StripePaymentOperations(this);\n this.audit = new StripeAuditOperations(this);\n this.webhooks = new StripeWebhookOperations(this.options);\n this.billing = new StripeBillingOperationsImpl(this);\n }\n\n async request<T>(\n method: 'GET' | 'POST' | 'DELETE',\n endpoint: string,\n params?: Record<string, StripeFormValue>,\n options: { idempotencyKey?: string } = {},\n ): Promise<T> {\n const timeout = this.options.timeout || 30000;\n const maxRetries = this.options.maxRetries ?? 3;\n const idempotencyKey =\n method === 'POST'\n ? (options.idempotencyKey ?? `sdk-${randomUUID()}`)\n : null;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const url = this.buildUrl(endpoint, method === 'GET' ? params : {});\n const body =\n method === 'POST' && params\n ? encodeStripeForm(params).toString()\n : undefined;\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.options.secretKey}`,\n Accept: 'application/json',\n };\n if (method === 'POST') {\n headers['Content-Type'] = 'application/x-www-form-urlencoded';\n if (idempotencyKey) {\n headers['Idempotency-Key'] = idempotencyKey;\n }\n }\n if (this.options.apiVersion) {\n headers['Stripe-Version'] = this.options.apiVersion;\n }\n\n const response = await this.fetchImpl(url, {\n method,\n headers,\n body,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n const error = new StripeApiError(response.status, errorText);\n\n if (response.status < 500 && response.status !== 429) {\n throw error;\n }\n\n lastError = error;\n } else {\n const text = await response.text();\n return (text ? JSON.parse(text) : {}) as T;\n }\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n const statusMatch = lastError.message.match(\n /Stripe API error \\((\\d+)\\)/,\n );\n if (statusMatch) {\n const status = Number.parseInt(statusMatch[1], 10);\n if (status >= 400 && status < 500 && status !== 429) {\n throw lastError;\n }\n }\n } finally {\n clearTimeout(timeoutId);\n }\n\n if (attempt < maxRetries) {\n await sleep(2 ** attempt * 500);\n }\n }\n\n throw lastError || new Error('Stripe request failed after retries');\n }\n\n /**\n * @internal\n * A reusable amount-off coupon for a line discount, created on first use.\n * Its id is derived from the currency and amount, so every replay and every\n * invoice with the same discount shares one coupon instead of creating one\n * per line.\n */\n async amountOffCoupon(currency: string, amount: number): Promise<string> {\n const normalized = currency.toLowerCase();\n const id = `hv_amount_off_${normalized}_${amount}`;\n const cached = this.couponIds.get(id);\n if (cached) {\n return cached;\n }\n\n const path = `/v1/coupons/${encodeURIComponent(id)}`;\n let coupon: StripeCoupon;\n try {\n coupon = await this.request<StripeCoupon>('GET', path);\n } catch (error) {\n if (!(error instanceof StripeApiError) || error.status !== 404) {\n throw error;\n }\n try {\n coupon = await this.request<StripeCoupon>('POST', '/v1/coupons', {\n id,\n amount_off: amount,\n currency: normalized,\n duration: 'forever',\n name: 'Discount',\n metadata: { hv_purpose: 'invoice_line_discount' },\n });\n } catch (createError) {\n // A concurrent push created it first.\n if (\n !(createError instanceof StripeApiError) ||\n createError.code !== 'resource_already_exists'\n ) {\n throw createError;\n }\n coupon = await this.request<StripeCoupon>('GET', path);\n }\n }\n\n if (\n coupon.amount_off !== amount ||\n (coupon.currency || '').toLowerCase() !== normalized ||\n coupon.percent_off ||\n coupon.valid === false\n ) {\n throw new Error(\n `Stripe coupon ${id} exists but is not a valid ${amount} ${normalized} amount-off coupon`,\n );\n }\n this.couponIds.set(id, coupon.id);\n return coupon.id;\n }\n\n private buildUrl(\n endpoint: string,\n params?: Record<string, StripeFormValue>,\n ): string {\n const baseUrl = this.options.apiBaseUrl || 'https://api.stripe.com';\n const url = new URL(endpoint, baseUrl);\n\n if (params && Object.keys(params).length > 0) {\n for (const [key, value] of encodeStripeForm(params).entries()) {\n url.searchParams.append(key, value);\n }\n }\n\n return url.toString();\n }\n}\n\nclass StripeCustomerOperations implements CustomerOperations {\n constructor(private readonly provider: StripeProvider) {}\n\n async push(customer: CustomerInput): Promise<SyncResult> {\n if (customer.idempotencyKey !== undefined) {\n assertIdempotencyKey(customer.idempotencyKey);\n // After Stripe's idempotency window a replayed key creates a new\n // customer, so first look for the one an earlier attempt created.\n const existing = await this.findByLocalId(customer.id);\n if (existing) {\n return {\n action: 'created',\n externalId: existing.id,\n syncedAt: new Date(),\n };\n }\n }\n\n const response = await this.provider.request<StripeCustomer>(\n 'POST',\n '/v1/customers',\n mapCustomerToStripe(customer),\n {\n idempotencyKey: customer.idempotencyKey\n ? `${customer.idempotencyKey}:customer`\n : undefined,\n },\n );\n\n return {\n action: 'created',\n externalId: response.id,\n syncedAt: new Date(),\n };\n }\n\n /**\n * The oldest customer tagged with this local id. Stripe search is\n * eventually consistent (normally under a minute); inside that lag the\n * idempotency key, retained for at least 24 hours, covers the replay.\n */\n private async findByLocalId(\n localId: string,\n ): Promise<StripeCustomer | undefined> {\n const matches: StripeCustomer[] = [];\n let page: string | undefined;\n do {\n const response = await this.provider.request<\n StripeSearchResponse<StripeCustomer>\n >('GET', '/v1/customers/search', {\n query: `metadata['local_id']:'${escapeSearchValue(localId)}'`,\n limit: 100,\n page,\n });\n matches.push(\n ...response.data.filter(\n (customer) => customer.metadata?.local_id === localId,\n ),\n );\n page = response.has_more ? response.next_page || undefined : undefined;\n } while (page);\n\n return matches.sort(\n (left, right) =>\n (left.created ?? 0) - (right.created ?? 0) ||\n left.id.localeCompare(right.id),\n )[0];\n }\n\n async pull(externalId: string): Promise<ExternalCustomer> {\n const customer = await this.provider.request<StripeCustomer>(\n 'GET',\n `/v1/customers/${encodeURIComponent(externalId)}`,\n );\n return mapStripeCustomer(customer);\n }\n\n async list(options: ListOptions = {}): Promise<ExternalCustomer[]> {\n const response = await this.provider.request<\n StripeListResponse<StripeCustomer>\n >('GET', '/v1/customers', mapListOptions(options));\n return response.data.map(mapStripeCustomer);\n }\n\n async sync(customer: CustomerInput): Promise<SyncResult> {\n if (!customer.externalId) {\n return this.push(customer);\n }\n\n await this.provider.request<StripeCustomer>(\n 'POST',\n `/v1/customers/${encodeURIComponent(customer.externalId)}`,\n mapCustomerToStripe(customer),\n );\n\n return {\n action: 'updated',\n externalId: customer.externalId,\n syncedAt: new Date(),\n };\n }\n}\n\nclass StripeInvoiceOperations implements InvoiceOperations {\n constructor(private readonly provider: StripeProvider) {}\n\n async push(invoice: InvoiceInput): Promise<SyncResult> {\n if (!invoice.customerExternalId) {\n throw new Error('Stripe invoices require customerExternalId');\n }\n\n const currency = invoice.currency || 'usd';\n const collectionMethod = resolveCollectionMethod(invoice);\n // Validate every line before any provider request.\n const lines = invoice.lineItems.map((lineItem) => ({\n lineItem,\n unitAmount: moneyToStripeMinorUnits(lineItem.unitPrice, currency),\n discount: lineDiscountToStripe(lineItem, currency),\n period: lineServicePeriod(lineItem),\n }));\n\n const existingInvoice = invoice.idempotencyKey\n ? await this.findInvoiceByLocalId(invoice.customerExternalId, invoice.id)\n : undefined;\n if (existingInvoice) {\n return {\n action: 'created',\n externalId: existingInvoice.id,\n syncedAt: new Date(),\n };\n }\n\n const existingLineItemIndexes = invoice.idempotencyKey\n ? await this.findPendingLineItemIndexes(\n invoice.customerExternalId,\n invoice.id,\n )\n : new Set<number>();\n\n for (const [index, line] of lines.entries()) {\n if (existingLineItemIndexes.has(index)) {\n continue;\n }\n const { lineItem, unitAmount, discount, period } = line;\n const coupon = discount\n ? await this.provider.amountOffCoupon(currency, discount)\n : undefined;\n await this.provider.request(\n 'POST',\n '/v1/invoiceitems',\n {\n customer: invoice.customerExternalId,\n currency,\n description: lineItem.description,\n quantity: lineItem.quantity,\n unit_amount_decimal: String(unitAmount),\n period,\n discounts: coupon ? [{ coupon }] : undefined,\n tax_behavior: invoice.automaticTax ? 'exclusive' : undefined,\n metadata: normalizeMetadata({\n local_invoice_id: invoice.id,\n local_line_index: index,\n local_sku: lineItem.sku,\n local_discount: lineItem.discount,\n local_tax_rate: lineItem.taxRate,\n }),\n },\n {\n idempotencyKey: invoice.idempotencyKey\n ? `${invoice.idempotencyKey}:item:${index}`\n : undefined,\n },\n );\n }\n\n const response = await this.provider.request<StripeInvoice>(\n 'POST',\n '/v1/invoices',\n mapInvoiceToStripe(invoice, collectionMethod),\n {\n idempotencyKey: invoice.idempotencyKey\n ? `${invoice.idempotencyKey}:invoice`\n : undefined,\n },\n );\n\n return {\n action: 'created',\n externalId: response.id,\n syncedAt: new Date(),\n };\n }\n\n async pull(externalId: string): Promise<ExternalInvoice> {\n const invoice = await this.provider.request<StripeInvoice>(\n 'GET',\n `/v1/invoices/${encodeURIComponent(externalId)}`,\n );\n return mapStripeInvoice(invoice);\n }\n\n async list(options: ListOptions = {}): Promise<ExternalInvoice[]> {\n const response = await this.provider.request<\n StripeListResponse<StripeInvoice>\n >('GET', '/v1/invoices', mapListOptions(options));\n return response.data.map(mapStripeInvoice);\n }\n\n async sync(invoice: InvoiceInput): Promise<SyncResult> {\n if (!invoice.externalId) {\n return this.push(invoice);\n }\n\n await this.provider.request<StripeInvoice>(\n 'POST',\n `/v1/invoices/${encodeURIComponent(invoice.externalId)}`,\n mapInvoiceUpdateToStripe(invoice, resolveCollectionMethod(invoice)),\n );\n\n return {\n action: 'updated',\n externalId: invoice.externalId,\n syncedAt: new Date(),\n };\n }\n\n /**\n * `send_invoice` invoices are emailed through Stripe's send endpoint.\n * `charge_automatically` invoices are finalized with automatic collection\n * on, so Stripe charges the customer's default payment method and applies\n * its retry settings; the outcome arrives as `invoice.paid` or\n * `invoice.payment_failed`.\n */\n async send(externalId: string): Promise<void> {\n const path = `/v1/invoices/${encodeURIComponent(externalId)}`;\n const invoice = await this.provider.request<StripeInvoice>('GET', path);\n if (invoice.collection_method !== 'charge_automatically') {\n await this.provider.request('POST', `${path}/send`);\n return;\n }\n if (invoice.status === 'draft') {\n await this.provider.request(\n 'POST',\n `${path}/finalize`,\n { auto_advance: true },\n { idempotencyKey: `${externalId}:finalize` },\n );\n return;\n }\n if (invoice.status === 'open' && invoice.auto_advance === false) {\n await this.provider.request(\n 'POST',\n path,\n { auto_advance: true },\n { idempotencyKey: `${externalId}:auto_advance` },\n );\n }\n }\n\n async markUncollectible(externalId: string): Promise<void> {\n await this.provider.request(\n 'POST',\n `/v1/invoices/${encodeURIComponent(externalId)}/mark_uncollectible`,\n undefined,\n { idempotencyKey: `${externalId}:mark_uncollectible` },\n );\n }\n\n /**\n * Close an invoice paid on another rail (`paid_out_of_band`). An invoice\n * already marked paid out of band, or paid with nothing collected, is left\n * as is; one Stripe collected money for itself throws (a second collection needs a refund, not a silent close).\n * A draft is finalized first without automatic collection, and refused if\n * finalization raised the amount due. A void invoice throws; an\n * uncollectible one can still be paid, as in Stripe.\n */\n async markPaidOutOfBand(externalId: string): Promise<void> {\n const path = `/v1/invoices/${encodeURIComponent(externalId)}`;\n let invoice = await this.provider.request<StripeInvoice>('GET', path);\n if (invoice.status === 'paid') {\n // Closed out of band before, or settled with nothing collected (a\n // zero or credit-balance invoice): nothing more to do.\n if (invoice.paid_out_of_band === true || !(invoice.amount_paid ?? 0)) {\n return;\n }\n // Stripe collected it itself: closing it again would hide a second\n // collection. The caller must refund or credit the other payment.\n throw new Error(\n `Stripe invoice ${externalId} was already paid through Stripe; it was not marked paid out of band.`,\n );\n }\n if (invoice.status === 'void') {\n throw new Error(\n `Stripe invoice ${externalId} is void and cannot be marked paid.`,\n );\n }\n if (invoice.status === 'draft') {\n const draftDue = invoice.amount_remaining ?? invoice.total ?? 0;\n invoice = await this.provider.request<StripeInvoice>(\n 'POST',\n `${path}/finalize`,\n { auto_advance: false },\n { idempotencyKey: `${externalId}:finalize_out_of_band` },\n );\n // Finalizing settles zero-balance invoices on its own.\n if (invoice.status === 'paid') return;\n // Finalization computes tax, credits, and discounts; never forgive an\n // amount larger than the one the caller saw.\n if ((invoice.amount_remaining ?? 0) > draftDue) {\n throw new Error(\n `Stripe invoice ${externalId} grew from ${draftDue} to ${invoice.amount_remaining} on finalization; not marking it paid out of band.`,\n );\n }\n }\n await this.provider.request(\n 'POST',\n `${path}/pay`,\n { paid_out_of_band: true },\n { idempotencyKey: `${externalId}:paid_out_of_band` },\n );\n }\n\n async void(externalId: string): Promise<void> {\n await this.provider.request(\n 'POST',\n `/v1/invoices/${encodeURIComponent(externalId)}/void`,\n );\n }\n\n private async findInvoiceByLocalId(\n customerExternalId: string,\n localInvoiceId: string,\n ): Promise<StripeInvoice | undefined> {\n let startingAfter: string | undefined;\n do {\n const response = await this.provider.request<\n StripeListResponse<StripeInvoice>\n >('GET', '/v1/invoices', {\n customer: customerExternalId,\n limit: 100,\n starting_after: startingAfter,\n });\n const existing = response.data.find(\n (invoice) => invoice.metadata?.local_id === localInvoiceId,\n );\n if (existing) {\n return existing;\n }\n startingAfter = response.has_more ? response.data.at(-1)?.id : undefined;\n } while (startingAfter);\n\n return undefined;\n }\n\n private async findPendingLineItemIndexes(\n customerExternalId: string,\n localInvoiceId: string,\n ): Promise<Set<number>> {\n const indexes = new Set<number>();\n let startingAfter: string | undefined;\n do {\n const response = await this.provider.request<\n StripeListResponse<StripeInvoiceItem>\n >('GET', '/v1/invoiceitems', {\n customer: customerExternalId,\n pending: true,\n limit: 100,\n starting_after: startingAfter,\n });\n for (const item of response.data) {\n if (item.metadata?.local_invoice_id !== localInvoiceId) {\n continue;\n }\n const index = Number(item.metadata.local_line_index);\n if (Number.isSafeInteger(index) && index >= 0) {\n indexes.add(index);\n }\n }\n startingAfter = response.has_more ? response.data.at(-1)?.id : undefined;\n } while (startingAfter);\n\n return indexes;\n }\n}\n\nclass StripePaymentOperations implements PaymentOperations {\n constructor(private readonly provider: StripeProvider) {}\n\n async pull(externalId: string): Promise<ExternalPayment> {\n const paymentIntent = await this.provider.request<StripePaymentIntent>(\n 'GET',\n `/v1/payment_intents/${encodeURIComponent(externalId)}`,\n );\n return mapStripePaymentIntent(paymentIntent);\n }\n\n async list(options: ListOptions = {}): Promise<ExternalPayment[]> {\n const response = await this.provider.request<\n StripeListResponse<StripePaymentIntent>\n >('GET', '/v1/payment_intents', mapListOptions(options));\n return response.data.map(mapStripePaymentIntent);\n }\n\n async chargeSavedPaymentMethod(\n input: SavedPaymentMethodChargeInput,\n ): Promise<SavedPaymentMethodChargeResult> {\n assertIdempotencyKey(input.idempotencyKey);\n if (!input.customerExternalId) {\n throw new Error('Saved payment method charges require a customer');\n }\n const currency = normalizeCurrencyCode(input.currency);\n const stripeAmount = minorUnitsToStripeAmount(input.amountMinor, currency);\n if (stripeAmount <= 0) {\n throw new Error(\n 'Charge amount must be a positive integer of minor units',\n );\n }\n const chargeKey = input.idempotencyKey;\n const base = {\n provider: 'stripe' as const,\n customerExternalId: input.customerExternalId,\n amountMinor: input.amountMinor,\n currency,\n chargeKey,\n };\n\n // After Stripe's idempotency window a replayed key would charge again, so\n // first look for the PaymentIntent an earlier attempt created.\n const existing = await this.findByChargeKey(chargeKey);\n if (existing) {\n assertSameCharge(\n existing,\n input.customerExternalId,\n stripeAmount,\n currency,\n input.paymentMethodExternalId,\n );\n return { ...base, ...mapChargeOutcome(existing) };\n }\n\n let paymentMethod = input.paymentMethodExternalId;\n if (!paymentMethod) {\n const customer = await this.provider.request<StripeCustomer>(\n 'GET',\n `/v1/customers/${encodeURIComponent(input.customerExternalId)}`,\n );\n paymentMethod = idOf(customer.invoice_settings?.default_payment_method);\n if (!paymentMethod) {\n return {\n ...base,\n status: 'failed',\n failureCode: 'payment_method_missing',\n failureMessage: 'The customer has no default payment method.',\n };\n }\n }\n\n try {\n const paymentIntent = await this.provider.request<StripePaymentIntent>(\n 'POST',\n '/v1/payment_intents',\n {\n amount: stripeAmount,\n currency: currency.toLowerCase(),\n customer: input.customerExternalId,\n payment_method: paymentMethod,\n off_session: true,\n confirm: true,\n description: input.description,\n metadata: normalizeMetadata({\n ...input.metadata,\n [CHARGE_KEY_METADATA]: chargeKey,\n }),\n },\n { idempotencyKey: `${chargeKey}:payment_intent` },\n );\n return { ...base, ...mapChargeOutcome(paymentIntent) };\n } catch (error) {\n // A decline or an authentication requirement is a charge outcome, not\n // a transport failure: Stripe returns 402 with the failed PaymentIntent.\n if (\n error instanceof StripeApiError &&\n error.status === 402 &&\n error.type === 'card_error'\n ) {\n const paymentIntent = isRecord(error.paymentIntent)\n ? (error.paymentIntent as unknown as StripePaymentIntent)\n : undefined;\n return {\n ...base,\n ...(paymentIntent ? mapChargeOutcome(paymentIntent) : {}),\n paymentMethodExternalId:\n idOf(paymentIntent?.payment_method) ?? paymentMethod,\n status:\n error.code === 'authentication_required'\n ? 'requires_action'\n : 'failed',\n failureCode: error.code,\n declineCode: error.declineCode,\n failureMessage: error.stripeMessage,\n raw: paymentIntent ? withoutClientSecret(paymentIntent) : undefined,\n };\n }\n throw error;\n }\n }\n\n private async findByChargeKey(\n chargeKey: string,\n ): Promise<StripePaymentIntent | undefined> {\n const response = await this.provider.request<\n StripeSearchResponse<StripePaymentIntent>\n >('GET', '/v1/payment_intents/search', {\n query: `metadata['${CHARGE_KEY_METADATA}']:'${escapeSearchValue(chargeKey)}'`,\n limit: 10,\n });\n return response.data\n .filter((intent) => intent.metadata?.[CHARGE_KEY_METADATA] === chargeKey)\n .sort(\n (left, right) =>\n (left.created ?? 0) - (right.created ?? 0) ||\n left.id.localeCompare(right.id),\n )[0];\n }\n}\n\nclass StripeBillingOperationsImpl implements StripeBillingOperations {\n constructor(private readonly provider: StripeProvider) {}\n\n async createCheckoutSession(\n input: StripeCheckoutSessionInput,\n ): Promise<StripeCheckoutSession> {\n const response = await this.provider.request<StripeCheckoutSessionResponse>(\n 'POST',\n '/v1/checkout/sessions',\n mapCheckoutSessionToStripe(input),\n { idempotencyKey: input.idempotencyKey },\n );\n\n return mapCheckoutSessionResponse(response);\n }\n\n async retrieveCheckoutSession(\n sessionExternalId: string,\n ): Promise<StripeCheckoutSessionDetails> {\n const session = await this.provider.request<StripeCheckoutSessionResponse>(\n 'GET',\n `/v1/checkout/sessions/${encodeURIComponent(sessionExternalId)}`,\n { expand: ['setup_intent', 'payment_intent'] },\n );\n const intent =\n typeof session.setup_intent === 'object' && session.setup_intent\n ? session.setup_intent\n : typeof session.payment_intent === 'object' && session.payment_intent\n ? session.payment_intent\n : undefined;\n const currency = session.currency\n ? session.currency.toUpperCase()\n : undefined;\n const minor = (amount?: number | null) =>\n currency && typeof amount === 'number'\n ? stripeAmountToMinorUnitsOrUndefined(amount, currency)\n : undefined;\n\n return {\n ...mapCheckoutSessionResponse(session),\n raw: withoutClientSecrets(session),\n status: oneOf(session.status, ['open', 'complete', 'expired'] as const),\n paymentStatus: oneOf(session.payment_status, [\n 'paid',\n 'unpaid',\n 'no_payment_required',\n ] as const),\n paymentMethodExternalId: idOf(intent?.payment_method),\n currency,\n amountSubtotalMinor: minor(session.amount_subtotal),\n amountTaxMinor: minor(session.total_details?.amount_tax),\n amountTotalMinor: minor(session.amount_total),\n metadata: { ...(session.metadata || {}) },\n };\n }\n\n async setDefaultPaymentMethod(\n customerExternalId: string,\n paymentMethodExternalId: string,\n ): Promise<void> {\n if (!customerExternalId || !paymentMethodExternalId) {\n throw new Error(\n 'setDefaultPaymentMethod requires a customer and a payment method',\n );\n }\n await this.provider.request(\n 'POST',\n `/v1/customers/${encodeURIComponent(customerExternalId)}`,\n { invoice_settings: { default_payment_method: paymentMethodExternalId } },\n );\n }\n\n async createCustomerPortalSession(\n input: StripeCustomerPortalSessionInput,\n ): Promise<StripeCustomerPortalSession> {\n const response = await this.provider.request<StripePortalSessionResponse>(\n 'POST',\n '/v1/billing_portal/sessions',\n {\n customer: input.customerExternalId,\n return_url: input.returnUrl,\n configuration: input.configurationExternalId,\n },\n );\n\n return {\n externalId: response.id,\n url: response.url,\n raw: response,\n };\n }\n\n async retrieveSubscriptionStatus(\n subscriptionExternalId: string,\n ): Promise<StripeSubscriptionStatusResult> {\n const subscription = await this.provider.request<StripeSubscription>(\n 'GET',\n `/v1/subscriptions/${encodeURIComponent(subscriptionExternalId)}`,\n );\n\n return mapStripeSubscription(subscription);\n }\n\n async listCustomerSubscriptions(\n customerExternalId: string,\n ): Promise<StripeSubscriptionStatusResult[]> {\n const response = await this.provider.request<\n StripeListResponse<StripeSubscription>\n >('GET', '/v1/subscriptions', {\n customer: customerExternalId,\n status: 'all',\n limit: 100,\n });\n\n return response.data.map(mapStripeSubscription);\n }\n}\n\nclass UnsupportedVendorOperations implements VendorOperations {\n async push(_vendor: VendorInput): Promise<SyncResult> {\n throw new Error('Stripe does not support vendor operations');\n }\n\n async pull(_externalId: string): Promise<ExternalVendor> {\n throw new Error('Stripe does not support vendor operations');\n }\n\n async list(_options?: ListOptions): Promise<ExternalVendor[]> {\n throw new Error('Stripe does not support vendor operations');\n }\n\n async sync(_vendor: VendorInput): Promise<SyncResult> {\n throw new Error('Stripe does not support vendor operations');\n }\n}\n\nclass UnsupportedBillOperations implements BillOperations {\n async push(_bill: BillInput): Promise<SyncResult> {\n throw new Error('Stripe does not support bill operations');\n }\n\n async pull(_externalId: string): Promise<ExternalBill> {\n throw new Error('Stripe does not support bill operations');\n }\n\n async list(_options?: ListOptions): Promise<ExternalBill[]> {\n throw new Error('Stripe does not support bill operations');\n }\n\n async sync(_bill: BillInput): Promise<SyncResult> {\n throw new Error('Stripe does not support bill operations');\n }\n}\n\nclass StripeAuditOperations implements AuditOperations {\n constructor(private readonly provider: StripeProvider) {}\n\n async reconcileCustomers(\n locals: CustomerInput[],\n ): Promise<AuditReport<CustomerInput>> {\n const externals = await this.provider.customers.list({ limit: 100 });\n return reconcileRecords('stripe', locals, externals, compareCustomer);\n }\n\n async reconcileInvoices(\n locals: InvoiceInput[],\n dateRange?: DateRange,\n ): Promise<AuditReport<InvoiceInput>> {\n const externals = await this.provider.invoices.list({\n limit: 100,\n startDate: dateRange?.start,\n endDate: dateRange?.end,\n });\n return reconcileRecords('stripe', locals, externals, compareInvoice);\n }\n\n async reconcileVendors(\n _locals: VendorInput[],\n ): Promise<AuditReport<VendorInput>> {\n throw new Error('Stripe does not support vendor operations');\n }\n\n async reconcileBills(_locals: BillInput[]): Promise<AuditReport<BillInput>> {\n throw new Error('Stripe does not support bill operations');\n }\n\n async reconcilePayments(\n locals: PaymentInput[],\n dateRange?: DateRange,\n ): Promise<AuditReport<PaymentInput>> {\n const externals = await this.provider.payments.list({\n limit: 100,\n startDate: dateRange?.start,\n endDate: dateRange?.end,\n });\n return reconcileRecords('stripe', locals, externals, comparePayment);\n }\n}\n\nclass StripeWebhookOperations implements WebhookOperations {\n constructor(private readonly options: StripeOptions) {}\n\n verify(payload: string, signature: string, secret: string): boolean {\n const endpointSecret = secret || this.options.webhookSecret;\n if (!endpointSecret) {\n throw new Error(\n 'Stripe webhook secret not provided. Pass it as the secret parameter or configure webhookSecret in options.',\n );\n }\n\n const parsed = parseStripeSignatureHeader(signature);\n if (!parsed.timestamp || parsed.signatures.length === 0) {\n return false;\n }\n\n const tolerance = this.options.webhookTolerance ?? 300;\n const timestamp = Number.parseInt(parsed.timestamp, 10);\n if (\n !Number.isFinite(timestamp) ||\n Math.abs(Date.now() / 1000 - timestamp) > tolerance\n ) {\n return false;\n }\n\n const signedPayload = `${parsed.timestamp}.${payload}`;\n const expected = createHmac('sha256', endpointSecret)\n .update(signedPayload)\n .digest('hex');\n\n return parsed.signatures.some((value) =>\n constantTimeEqualHex(value, expected),\n );\n }\n\n parse(payload: string): WebhookEvent {\n let event: StripeWebhookPayload;\n try {\n event = JSON.parse(payload) as StripeWebhookPayload;\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown JSON parse error';\n throw new Error(`Invalid Stripe webhook payload: ${message}`);\n }\n\n const resource = event?.data?.object;\n const payment =\n resource?.object === 'payment_intent' && typeof resource.id === 'string'\n ? mapWebhookPayment(\n resource as unknown as StripePaymentIntent,\n event?.type || undefined,\n )\n : undefined;\n return {\n ...(payment ? { payment } : {}),\n type: event?.type || 'unknown',\n id: typeof event?.id === 'string' ? event.id : undefined,\n provider: 'stripe',\n timestamp: unixToDate(event?.created) || new Date(),\n payload: event,\n resourceType: mapStripeResourceType(\n resource?.object || undefined,\n event?.type || undefined,\n ),\n resourceId: typeof resource?.id === 'string' ? resource.id : undefined,\n };\n }\n}\n\nfunction encodeStripeForm(params: Record<string, StripeFormValue>) {\n const form = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n appendStripeFormValue(form, key, value);\n }\n\n return form;\n}\n\nfunction appendStripeFormValue(\n form: URLSearchParams,\n key: string,\n value: StripeFormValue,\n): void {\n if (value === undefined || value === null) {\n return;\n }\n\n if (value instanceof Date) {\n form.append(key, String(toUnixSeconds(value)));\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n appendStripeFormValue(form, `${key}[${index}]`, item);\n });\n return;\n }\n\n if (typeof value === 'object') {\n for (const [childKey, childValue] of Object.entries(value)) {\n appendStripeFormValue(form, `${key}[${childKey}]`, childValue);\n }\n return;\n }\n\n form.append(key, String(value));\n}\n\nfunction mapCustomerToStripe(\n customer: CustomerInput,\n): Record<string, StripeFormValue> {\n const stripeCustomer: Record<string, StripeFormValue> = {\n name: customer.name,\n email: customer.email,\n phone: customer.phone,\n address: customer.billingAddress\n ? {\n line1: customer.billingAddress.street1,\n line2: customer.billingAddress.street2,\n city: customer.billingAddress.city,\n state: customer.billingAddress.state,\n postal_code: customer.billingAddress.postalCode,\n country: customer.billingAddress.country,\n }\n : undefined,\n metadata: normalizeMetadata({\n payment_terms: customer.paymentTerms,\n ...customer.metadata,\n // Written last: idempotent creation reconciles customers by it.\n local_id: customer.id,\n }),\n };\n\n if (customer.taxExempt !== undefined) {\n stripeCustomer.tax_exempt = customer.taxExempt ? 'exempt' : 'none';\n }\n\n return stripeCustomer;\n}\n\nfunction mapInvoiceToStripe(\n invoice: InvoiceInput,\n collectionMethod: 'send_invoice' | 'charge_automatically',\n): Record<string, StripeFormValue> {\n return {\n customer: invoice.customerExternalId,\n collection_method: collectionMethod,\n // Stripe rejects a due date on automatically charged invoices.\n due_date: collectionMethod === 'send_invoice' ? invoice.dueDate : undefined,\n auto_advance: false,\n pending_invoice_items_behavior: 'include',\n automatic_tax: invoice.automaticTax ? { enabled: true } : undefined,\n metadata: normalizeMetadata({\n local_id: invoice.id,\n invoice_number: invoice.invoiceNumber,\n reference: invoice.reference,\n memo: invoice.memo,\n tax_amount: invoice.taxAmount,\n subtotal: invoice.subtotal,\n total_amount: invoice.totalAmount,\n ...invoice.metadata,\n }),\n };\n}\n\nfunction mapInvoiceUpdateToStripe(\n invoice: InvoiceInput,\n collectionMethod: 'send_invoice' | 'charge_automatically',\n): Record<string, StripeFormValue> {\n return {\n // Sent only when the caller sets it, so existing updates are unchanged.\n // Stripe accepts a collection method change on draft invoices and rejects\n // it on finalized ones rather than ignoring it.\n collection_method: invoice.collectionMethod ? collectionMethod : undefined,\n due_date: collectionMethod === 'send_invoice' ? invoice.dueDate : undefined,\n metadata: normalizeMetadata({\n local_id: invoice.id,\n invoice_number: invoice.invoiceNumber,\n reference: invoice.reference,\n memo: invoice.memo,\n ...invoice.metadata,\n }),\n };\n}\n\nfunction mapCheckoutSessionToStripe(\n input: StripeCheckoutSessionInput,\n): Record<string, StripeFormValue> {\n const mode = input.mode || 'subscription';\n const lineItems = input.lineItems || [];\n if (mode === 'setup') {\n if (lineItems.length > 0) {\n throw new Error('Stripe setup-mode Checkout does not accept line items');\n }\n if (!input.currency && !input.paymentMethodTypes?.length) {\n throw new Error(\n 'Stripe setup-mode Checkout requires currency or paymentMethodTypes',\n );\n }\n if (input.automaticTax) {\n throw new Error('Stripe setup-mode Checkout does not calculate tax');\n }\n } else if (lineItems.length === 0) {\n throw new Error(`Stripe ${mode}-mode Checkout requires line items`);\n }\n if (input.setupFutureUsage && mode !== 'payment') {\n throw new Error('setupFutureUsage applies only to payment-mode Checkout');\n }\n if (input.customerUpdate && !input.customerExternalId) {\n throw new Error('customerUpdate requires customerExternalId');\n }\n\n return {\n mode,\n success_url: input.successUrl,\n cancel_url: input.cancelUrl,\n customer: input.customerExternalId,\n customer_email: input.customerExternalId ? undefined : input.customerEmail,\n client_reference_id: input.clientReferenceId,\n allow_promotion_codes: input.allowPromotionCodes,\n currency: input.currency ? input.currency.toLowerCase() : undefined,\n payment_method_types: input.paymentMethodTypes,\n automatic_tax: input.automaticTax ? { enabled: true } : undefined,\n billing_address_collection: input.billingAddressCollection,\n customer_update: input.customerUpdate\n ? {\n address: input.customerUpdate.address,\n name: input.customerUpdate.name,\n shipping: input.customerUpdate.shipping,\n }\n : undefined,\n payment_intent_data: input.setupFutureUsage\n ? { setup_future_usage: input.setupFutureUsage }\n : undefined,\n line_items:\n mode === 'setup'\n ? undefined\n : lineItems.map((lineItem) =>\n mapCheckoutLineItem(lineItem, Boolean(input.automaticTax)),\n ),\n metadata: normalizeMetadata(input.metadata || {}),\n };\n}\n\nfunction mapCheckoutSessionResponse(\n response: StripeCheckoutSessionResponse,\n): StripeCheckoutSession {\n return {\n externalId: response.id,\n url: response.url || null,\n mode: oneOf(response.mode, ['payment', 'setup', 'subscription'] as const),\n customerExternalId: idOf(response.customer),\n subscriptionExternalId: idOf(response.subscription),\n paymentIntentExternalId: idOf(response.payment_intent),\n setupIntentExternalId: idOf(response.setup_intent),\n raw: withoutClientSecrets(response),\n };\n}\n\nfunction mapCheckoutLineItem(\n lineItem: StripeCheckoutLineItem,\n automaticTax = false,\n): Record<string, StripeFormValue> {\n if (lineItem.price) {\n return {\n price: lineItem.price,\n quantity: lineItem.quantity || 1,\n };\n }\n\n if (!lineItem.priceData) {\n throw new Error('Stripe checkout line item requires price or priceData');\n }\n\n const { priceData } = lineItem;\n const productData = priceData.product\n ? undefined\n : { name: priceData.productName || 'Subscription' };\n const hasStripeAmount = priceData.unitAmount !== undefined;\n const hasMinorAmount = priceData.unitAmountMinor !== undefined;\n if (hasStripeAmount === hasMinorAmount) {\n throw new Error(\n 'Stripe checkout priceData requires exactly one of unitAmount or unitAmountMinor',\n );\n }\n const unitAmount = hasMinorAmount\n ? minorUnitsToStripeAmount(\n priceData.unitAmountMinor as number,\n normalizeCurrencyCode(priceData.currency),\n )\n : priceData.unitAmount;\n\n return {\n quantity: lineItem.quantity || 1,\n price_data: {\n currency: priceData.currency.toLowerCase(),\n unit_amount: unitAmount,\n tax_behavior:\n priceData.taxBehavior ?? (automaticTax ? 'exclusive' : undefined),\n product: priceData.product,\n product_data: productData,\n recurring: priceData.recurring\n ? {\n interval: priceData.recurring.interval,\n interval_count: priceData.recurring.intervalCount,\n }\n : undefined,\n },\n };\n}\n\nfunction mapListOptions(options: ListOptions): Record<string, StripeFormValue> {\n return {\n limit: options.limit,\n starting_after:\n typeof options.offset === 'string' ? options.offset : undefined,\n created: {\n gte: options.startDate,\n lte: options.endDate,\n },\n status: options.status,\n };\n}\n\nfunction mapStripeCustomer(customer: StripeCustomer): ExternalCustomer {\n return {\n externalId: customer.id,\n provider: 'stripe',\n syncedAt: new Date(),\n name: customer.name || '',\n email: customer.email || undefined,\n phone: customer.phone || undefined,\n billingAddress: customer.address\n ? {\n street1: customer.address.line1 || undefined,\n street2: customer.address.line2 || undefined,\n city: customer.address.city || undefined,\n state: customer.address.state || undefined,\n postalCode: customer.address.postal_code || undefined,\n country: customer.address.country || undefined,\n }\n : undefined,\n balance:\n customer.balance === null || customer.balance === undefined\n ? undefined\n : stripeMinorUnitsToMoney(customer.balance, customer.currency),\n currency: customer.currency || undefined,\n raw: customer,\n };\n}\n\nfunction mapStripeInvoice(invoice: StripeInvoice): ExternalInvoice {\n return {\n externalId: invoice.id,\n provider: 'stripe',\n syncedAt: new Date(),\n invoiceNumber: invoice.number || invoice.id,\n customerExternalId:\n typeof invoice.customer === 'string'\n ? invoice.customer\n : invoice.customer?.id || '',\n issueDate: unixToDate(invoice.created) || new Date(),\n dueDate:\n unixToDate(invoice.due_date) || unixToDate(invoice.created) || new Date(),\n subtotal: stripeMinorUnitsToMoney(invoice.subtotal || 0, invoice.currency),\n taxAmount: stripeMinorUnitsToMoney(\n stripeInvoiceTaxAmount(invoice),\n invoice.currency,\n ),\n totalAmount: stripeMinorUnitsToMoney(invoice.total || 0, invoice.currency),\n amountPaid: stripeMinorUnitsToMoney(\n invoice.amount_paid || 0,\n invoice.currency,\n ),\n balance: stripeMinorUnitsToMoney(\n invoice.amount_remaining || 0,\n invoice.currency,\n ),\n status: mapStripeInvoiceStatus(invoice.status, invoice.due_date),\n currency: invoice.currency || 'usd',\n paidOutOfBand: invoice.paid_out_of_band === true,\n raw: invoice,\n };\n}\n\nfunction mapStripePaymentIntent(\n paymentIntent: StripePaymentIntent,\n): ExternalPayment {\n return {\n externalId: paymentIntent.id,\n provider: 'stripe',\n syncedAt: new Date(),\n amount: stripeMinorUnitsToMoney(\n paymentIntent.amount || 0,\n paymentIntent.currency,\n ),\n currency: paymentIntent.currency || 'usd',\n paidAt: unixToDate(paymentIntent.created) || new Date(),\n method: paymentIntent.payment_method_types?.[0],\n transactionId: paymentIntent.latest_charge || paymentIntent.id,\n invoiceExternalIds: paymentIntent.invoice\n ? [paymentIntent.invoice]\n : undefined,\n status: mapStripePaymentStatus(paymentIntent.status),\n raw: paymentIntent,\n };\n}\n\nfunction mapStripeSubscription(\n subscription: StripeSubscription,\n): StripeSubscriptionStatusResult {\n return {\n externalId: subscription.id,\n status: subscription.status,\n customerExternalId:\n typeof subscription.customer === 'string'\n ? subscription.customer\n : subscription.customer.id,\n currentPeriodStart: unixToDate(subscription.current_period_start),\n currentPeriodEnd: unixToDate(subscription.current_period_end),\n cancelAtPeriodEnd: Boolean(subscription.cancel_at_period_end),\n canceledAt: unixToDate(subscription.canceled_at),\n trialEnd: unixToDate(subscription.trial_end),\n raw: subscription,\n };\n}\n\nfunction mapStripeInvoiceStatus(\n status?: string | null,\n dueDate?: number | null,\n): ExternalInvoice['status'] {\n switch (status) {\n case 'draft':\n return 'draft';\n case 'paid':\n return 'paid';\n case 'void':\n return 'voided';\n case 'uncollectible':\n return 'uncollectible';\n case 'open':\n if (dueDate && dueDate * 1000 < Date.now()) {\n return 'overdue';\n }\n return 'sent';\n default:\n return 'sent';\n }\n}\n\nfunction mapStripePaymentStatus(\n status?: string | null,\n): ExternalPayment['status'] {\n switch (status) {\n case 'succeeded':\n return 'completed';\n case 'processing':\n case 'requires_action':\n case 'requires_capture':\n case 'requires_confirmation':\n return 'pending';\n case 'canceled':\n case 'requires_payment_method':\n return 'failed';\n default:\n return 'pending';\n }\n}\n\nfunction mapStripeResourceType(\n object?: string,\n eventType?: string,\n): WebhookEvent['resourceType'] | undefined {\n if (object === 'customer' || eventType?.startsWith('customer.')) {\n return 'customer';\n }\n if (object === 'invoice' || eventType?.startsWith('invoice.')) {\n return 'invoice';\n }\n if (\n object === 'payment_intent' ||\n object === 'charge' ||\n eventType?.startsWith('payment_intent.') ||\n eventType?.startsWith('charge.')\n ) {\n return 'payment';\n }\n return undefined;\n}\n\nfunction normalizeMetadata(\n metadata: Record<string, unknown>,\n): Record<string, string> {\n const normalized: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== undefined && value !== null) {\n normalized[key] = String(value);\n }\n }\n\n return normalized;\n}\n\nfunction parseStripeSignatureHeader(signature: string): {\n timestamp?: string;\n signatures: string[];\n} {\n const parts = signature.split(',').map((part) => part.trim());\n const parsed: { timestamp?: string; signatures: string[] } = {\n signatures: [],\n };\n\n for (const part of parts) {\n const separatorIndex = part.indexOf('=');\n if (separatorIndex === -1) {\n continue;\n }\n\n const key = part.slice(0, separatorIndex);\n const value = part.slice(separatorIndex + 1);\n if (key === 't') {\n parsed.timestamp = value;\n }\n if (key === 'v1' && value) {\n parsed.signatures.push(value);\n }\n }\n\n return parsed;\n}\n\nfunction constantTimeEqualHex(left: string, right: string): boolean {\n try {\n const leftBuffer = Buffer.from(left, 'hex');\n const rightBuffer = Buffer.from(right, 'hex');\n return (\n leftBuffer.length === rightBuffer.length &&\n timingSafeEqual(leftBuffer, rightBuffer)\n );\n } catch {\n return false;\n }\n}\n\nfunction reconcileRecords<TLocal extends { externalId?: string }>(\n provider: AccountingProviderType,\n locals: TLocal[],\n externals: ExternalRecord[],\n compare: (local: TLocal, external: ExternalRecord) => FieldDiff[],\n): AuditReport<TLocal> {\n const externalById = new Map(\n externals.map((external) => [external.externalId, external]),\n );\n const matched: AuditMatch<TLocal>[] = [];\n const discrepancies: AuditReport<TLocal>['discrepancies'] = [];\n const localOnly: TLocal[] = [];\n const seenExternalIds = new Set<string>();\n\n for (const local of locals) {\n const external = local.externalId\n ? externalById.get(local.externalId)\n : undefined;\n\n if (!external) {\n localOnly.push(local);\n continue;\n }\n\n seenExternalIds.add(external.externalId);\n const differences = compare(local, external);\n if (differences.length === 0) {\n matched.push({ local, external, status: 'identical' });\n } else {\n discrepancies.push({ local, external, differences });\n }\n }\n\n const externalOnly = externals.filter(\n (external) => !seenExternalIds.has(external.externalId),\n );\n\n return {\n provider,\n auditedAt: new Date(),\n matched,\n localOnly,\n externalOnly,\n discrepancies,\n summary: {\n total: locals.length + externalOnly.length,\n matched: matched.length,\n localOnly: localOnly.length,\n externalOnly: externalOnly.length,\n discrepancies: discrepancies.length,\n },\n };\n}\n\nfunction compareCustomer(\n local: CustomerInput,\n external: ExternalRecord,\n): FieldDiff[] {\n const customer = external as ExternalCustomer;\n return [\n compareField('name', local.name, customer.name),\n compareField('email', local.email, customer.email),\n ].filter((diff): diff is FieldDiff => Boolean(diff));\n}\n\nfunction compareInvoice(\n local: InvoiceInput,\n external: ExternalRecord,\n): FieldDiff[] {\n const invoice = external as ExternalInvoice;\n return [\n compareField('totalAmount', local.totalAmount, invoice.totalAmount),\n compareField('currency', local.currency || 'usd', invoice.currency),\n ].filter((diff): diff is FieldDiff => Boolean(diff));\n}\n\nfunction comparePayment(\n local: PaymentInput,\n external: ExternalRecord,\n): FieldDiff[] {\n const payment = external as ExternalPayment;\n return [\n compareField('amount', local.amount, payment.amount),\n compareField('currency', local.currency || 'usd', payment.currency),\n ].filter((diff): diff is FieldDiff => Boolean(diff));\n}\n\nfunction compareField(\n field: string,\n localValue: unknown,\n externalValue: unknown,\n): FieldDiff | null {\n if (valuesEqual(localValue, externalValue)) {\n return null;\n }\n return { field, localValue, externalValue };\n}\n\nfunction valuesEqual(left: unknown, right: unknown): boolean {\n if (left === right) {\n return true;\n }\n if (typeof left === 'number' && typeof right === 'number') {\n return Math.abs(left - right) < 0.01;\n }\n return false;\n}\n\nfunction stripeInvoiceTaxAmount(invoice: StripeInvoice): number {\n if (typeof invoice.tax === 'number') {\n return invoice.tax;\n }\n return (invoice.total_taxes || []).reduce(\n (total, tax) => total + (tax.amount || 0),\n 0,\n );\n}\n\nconst STRIPE_ZERO_DECIMAL_CURRENCIES = new Set([\n 'BIF',\n 'CLP',\n 'DJF',\n 'GNF',\n 'JPY',\n 'KMF',\n 'KRW',\n 'MGA',\n 'PYG',\n 'RWF',\n 'VND',\n 'VUV',\n 'XAF',\n 'XOF',\n 'XPF',\n]);\nconst STRIPE_THREE_DECIMAL_CURRENCIES = new Set([\n 'BHD',\n 'IQD',\n 'JOD',\n 'KWD',\n 'LYD',\n 'OMR',\n 'TND',\n]);\n\nfunction stripeCurrencyMinorUnitFactor(currency?: string | null): number {\n const normalized = (currency || 'usd').toUpperCase();\n if (STRIPE_ZERO_DECIMAL_CURRENCIES.has(normalized)) {\n return 1;\n }\n if (STRIPE_THREE_DECIMAL_CURRENCIES.has(normalized)) {\n return 1_000;\n }\n return 100;\n}\n\nfunction moneyToStripeMinorUnits(amount: number, currency: string): number {\n return Math.round(amount * stripeCurrencyMinorUnitFactor(currency));\n}\n\nfunction stripeMinorUnitsToMoney(\n amount: number,\n currency?: string | null,\n): number {\n return amount / stripeCurrencyMinorUnitFactor(currency);\n}\n\nconst CHARGE_KEY_METADATA = 'hv_charge_key';\n\nfunction assertIdempotencyKey(key: string): void {\n if (typeof key !== 'string' || key.trim() === '') {\n throw new Error('idempotencyKey must be a non-empty string');\n }\n}\n\n/** Escape a value for a single-quoted Stripe Search Query Language string. */\nfunction escapeSearchValue(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\nfunction resolveCollectionMethod(\n invoice: InvoiceInput,\n): 'send_invoice' | 'charge_automatically' {\n const method = invoice.collectionMethod ?? 'send_invoice';\n if (method !== 'send_invoice' && method !== 'charge_automatically') {\n throw new Error(`Unsupported invoice collectionMethod '${method}'`);\n }\n return method;\n}\n\n/** The line's discount in Stripe units, validated against the line total. */\nfunction lineDiscountToStripe(\n lineItem: InvoiceInput['lineItems'][number],\n currency: string,\n): number | undefined {\n if (lineItem.discount === undefined || lineItem.discount === 0) {\n return undefined;\n }\n if (!Number.isFinite(lineItem.discount) || lineItem.discount < 0) {\n throw new Error(\n `Invoice line '${lineItem.description}' discount must be a non-negative amount`,\n );\n }\n const discount = moneyToStripeMinorUnits(lineItem.discount, currency);\n const lineTotal = Math.round(\n moneyToStripeMinorUnits(lineItem.unitPrice, currency) * lineItem.quantity,\n );\n if (discount > lineTotal) {\n throw new Error(\n `Invoice line '${lineItem.description}' discount exceeds the line total`,\n );\n }\n return discount > 0 ? discount : undefined;\n}\n\nfunction lineServicePeriod(\n lineItem: InvoiceInput['lineItems'][number],\n): { start: Date; end: Date } | undefined {\n const { periodStart, periodEnd } = lineItem;\n if (!periodStart && !periodEnd) {\n return undefined;\n }\n if (!(periodStart instanceof Date) || !(periodEnd instanceof Date)) {\n throw new Error(\n `Invoice line '${lineItem.description}' needs both periodStart and periodEnd`,\n );\n }\n if (\n Number.isNaN(periodStart.getTime()) ||\n Number.isNaN(periodEnd.getTime()) ||\n periodEnd.getTime() < periodStart.getTime()\n ) {\n throw new Error(\n `Invoice line '${lineItem.description}' has an invalid service period`,\n );\n }\n return { start: periodStart, end: periodEnd };\n}\n\nfunction mapChargeOutcome(\n paymentIntent: StripePaymentIntent,\n): Pick<\n SavedPaymentMethodChargeResult,\n | 'status'\n | 'paymentExternalId'\n | 'paymentMethodExternalId'\n | 'failureCode'\n | 'declineCode'\n | 'failureMessage'\n | 'raw'\n> {\n const error = paymentIntent.last_payment_error;\n const status = mapPaymentIntentChargeStatus(\n paymentIntent.status,\n error?.code,\n );\n return {\n status,\n paymentExternalId: paymentIntent.id,\n paymentMethodExternalId: idOf(paymentIntent.payment_method),\n failureCode: status === 'succeeded' ? undefined : error?.code || undefined,\n declineCode:\n status === 'succeeded' ? undefined : error?.decline_code || undefined,\n failureMessage:\n status === 'succeeded' ? undefined : error?.message || undefined,\n raw: withoutClientSecret(paymentIntent),\n };\n}\n\n/**\n * A PaymentIntent found by charge key after Stripe's idempotency window must\n * be the charge this call describes; a key reused for a different amount,\n * currency, or customer is refused instead of reporting the wrong charge.\n */\nfunction assertSameCharge(\n paymentIntent: StripePaymentIntent,\n customerExternalId: string,\n stripeAmount: number,\n currency: string,\n paymentMethodExternalId?: string,\n): void {\n const customer = idOf(paymentIntent.customer);\n const paymentMethod = idOf(paymentIntent.payment_method);\n if (\n paymentIntent.amount !== stripeAmount ||\n (paymentIntent.currency || '').toUpperCase() !== currency ||\n (customer !== undefined && customer !== customerExternalId) ||\n (paymentMethodExternalId !== undefined &&\n paymentMethod !== undefined &&\n paymentMethod !== paymentMethodExternalId)\n ) {\n throw new Error(\n `idempotencyKey was already used for a different charge (${paymentIntent.id}); use a new key for a new charge`,\n );\n }\n}\n\n/** Remove `client_secret` from a Stripe object and its expanded intents. */\nfunction withoutClientSecrets<T extends object>(value: T): T {\n const copy = withoutClientSecret(value) as Record<string, unknown>;\n for (const key of ['payment_intent', 'setup_intent']) {\n const nested = copy[key];\n if (isRecord(nested)) {\n copy[key] = withoutClientSecret(nested);\n }\n }\n return copy as T;\n}\n\n/**\n * Drop the intent client secret before handing objects to callers, including\n * `next_action`, whose redirect URL and SDK payload embed the same secret.\n */\nfunction withoutClientSecret<T extends object>(value: T): T {\n const {\n client_secret: _secret,\n next_action: _nextAction,\n ...rest\n } = value as T & { client_secret?: unknown; next_action?: unknown };\n return rest as T;\n}\n\nfunction mapPaymentIntentChargeStatus(\n status?: string | null,\n errorCode?: string | null,\n): PaymentChargeStatus {\n switch (status) {\n case 'succeeded':\n return 'succeeded';\n case 'processing':\n case 'requires_capture':\n return 'processing';\n case 'requires_action':\n case 'requires_confirmation':\n return 'requires_action';\n case 'canceled':\n return 'canceled';\n case 'requires_payment_method':\n return errorCode === 'authentication_required'\n ? 'requires_action'\n : 'failed';\n default:\n return 'processing';\n }\n}\n\nfunction mapWebhookPayment(\n paymentIntent: StripePaymentIntent,\n eventType?: string,\n): WebhookPaymentSummary {\n const error = paymentIntent.last_payment_error;\n let status = mapPaymentIntentChargeStatus(paymentIntent.status, error?.code);\n if (eventType === 'payment_intent.succeeded') status = 'succeeded';\n if (eventType === 'payment_intent.canceled') status = 'canceled';\n if (eventType === 'payment_intent.payment_failed') {\n status =\n error?.code === 'authentication_required' ? 'requires_action' : 'failed';\n }\n const currency = paymentIntent.currency\n ? paymentIntent.currency.toUpperCase()\n : undefined;\n const metadata = { ...(paymentIntent.metadata || {}) };\n return {\n status,\n paymentExternalId: paymentIntent.id,\n customerExternalId: idOf(paymentIntent.customer),\n amountMinor:\n currency && typeof paymentIntent.amount === 'number'\n ? stripeAmountToMinorUnitsOrUndefined(paymentIntent.amount, currency)\n : undefined,\n currency,\n chargeKey: metadata[CHARGE_KEY_METADATA],\n failureCode: status === 'succeeded' ? undefined : error?.code || undefined,\n declineCode:\n status === 'succeeded' ? undefined : error?.decline_code || undefined,\n failureMessage:\n status === 'succeeded' ? undefined : error?.message || undefined,\n metadata,\n };\n}\n\nfunction idOf(\n value: string | { id?: string | null } | null | undefined,\n): string | undefined {\n if (typeof value === 'string') {\n return value || undefined;\n }\n return value?.id || undefined;\n}\n\nfunction oneOf<const T extends string>(\n value: string | null | undefined,\n allowed: readonly T[],\n): T | undefined {\n return allowed.find((candidate) => candidate === value);\n}\n\nfunction stringOrUndefined(value: unknown): string | undefined {\n return typeof value === 'string' && value ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction normalizeCurrencyCode(currency: string): string {\n const code = String(currency ?? '')\n .trim()\n .toUpperCase();\n if (!/^[A-Z]{3}$/.test(code)) {\n throw new Error(`Currency '${currency}' must be a three-letter code`);\n }\n return code;\n}\n\n/** ISO 4217 minor-unit exponents other than 2. */\nconst ISO_ZERO_DECIMAL_CURRENCIES = new Set([\n 'BIF',\n 'CLP',\n 'DJF',\n 'GNF',\n 'ISK',\n 'JPY',\n 'KMF',\n 'KRW',\n 'PYG',\n 'RWF',\n 'UGX',\n 'UYI',\n 'VND',\n 'VUV',\n 'XAF',\n 'XOF',\n 'XPF',\n]);\nconst ISO_THREE_DECIMAL_CURRENCIES = new Set([\n 'BHD',\n 'IQD',\n 'JOD',\n 'KWD',\n 'LYD',\n 'OMR',\n 'TND',\n]);\nconst ISO_FOUR_DECIMAL_CURRENCIES = new Set(['CLF', 'UYW']);\n\n/**\n * ISO 4217 minor-unit exponent (2 for USD, 0 for JPY and ISK), from the\n * explicit tables above rather than the runtime's `Intl`/CLDR display digits,\n * which differ for some currencies (for example RSD, IQD, MGA) and change\n * between ICU releases.\n */\nfunction isoMinorUnitExponent(currency: string): number {\n if (ISO_ZERO_DECIMAL_CURRENCIES.has(currency)) return 0;\n if (ISO_THREE_DECIMAL_CURRENCIES.has(currency)) return 3;\n if (ISO_FOUR_DECIMAL_CURRENCIES.has(currency)) return 4;\n return 2;\n}\n\n/**\n * Integer ISO minor units → Stripe's smallest unit. They differ where Stripe\n * keeps a two-decimal representation for a zero-decimal currency (ISK, UGX).\n */\nfunction minorUnitsToStripeAmount(\n amountMinor: number,\n currency: string,\n): number {\n if (!Number.isSafeInteger(amountMinor)) {\n throw new Error(\n `Amount ${amountMinor} must be a safe integer number of minor units`,\n );\n }\n const iso = 10 ** isoMinorUnitExponent(currency);\n const stripe = stripeCurrencyMinorUnitFactor(currency);\n if (stripe >= iso) {\n return amountMinor * (stripe / iso);\n }\n const divisor = iso / stripe;\n if (amountMinor % divisor !== 0) {\n throw new Error(\n `Amount ${amountMinor} ${currency} minor units is not representable in Stripe's currency unit`,\n );\n }\n return amountMinor / divisor;\n}\n\nfunction stripeAmountToMinorUnitsOrUndefined(\n amount: number,\n currency: string,\n): number | undefined {\n if (!Number.isSafeInteger(amount)) {\n return undefined;\n }\n // Reads (webhooks, session totals) omit an amount that is not a whole\n // number of ISO minor units instead of failing a verified event.\n const iso = 10 ** isoMinorUnitExponent(currency);\n const stripe = stripeCurrencyMinorUnitFactor(currency);\n const minor = (amount * iso) / stripe;\n return Number.isSafeInteger(minor) ? minor : undefined;\n}\n\nfunction centsToMoney(cents: number): number {\n return cents / 100;\n}\n\nfunction toUnixSeconds(date: Date): number {\n return Math.floor(date.getTime() / 1000);\n}\n\nfunction unixToDate(value?: number | null): Date | undefined {\n return value === null || value === undefined\n ? undefined\n : new Date(value * 1000);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"],"mappings":"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"}