@happyvertical/accounting 0.93.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 +66 -1
- package/dist/chunks/{stripe-DvSZ3fGk.js → stripe-CZlx1zrs.js} +165 -13
- package/dist/chunks/stripe-CZlx1zrs.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/providers/stripe/index.d.ts.map +1 -1
- package/dist/types.d.ts +82 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/chunks/stripe-DvSZ3fGk.js.map +0 -1
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,
|
|
@@ -58,6 +61,17 @@ result as `invoice.paid` or `invoice.payment_failed`. Automatically charged invo
|
|
|
58
61
|
`invoices.markUncollectible()` writes an open invoice off, and invoice reads
|
|
59
62
|
report that state as `status: 'uncollectible'`.
|
|
60
63
|
|
|
64
|
+
`invoices.markPaidOutOfBand()` closes an invoice that was paid on another
|
|
65
|
+
rail (for example a crypto payment for a Stripe-issued invoice): Stripe marks
|
|
66
|
+
it `paid_out_of_band`, which stops its emails, dunning, and automatic charges.
|
|
67
|
+
It is idempotent (an invoice already closed out of band, or paid with
|
|
68
|
+
nothing collected — a zero total or a credit balance — is left alone), throws
|
|
69
|
+
for an invoice Stripe collected money for itself (a second collection needs a
|
|
70
|
+
refund, not a silent close), finalizes a draft first without automatic
|
|
71
|
+
collection and refuses it if finalization raised the amount due, pays an
|
|
72
|
+
uncollectible invoice, and refuses a void one. Invoice reads report `paidOutOfBand`, so a consumer can tell such
|
|
73
|
+
an invoice from one Stripe collected.
|
|
74
|
+
|
|
61
75
|
## Stripe customers
|
|
62
76
|
|
|
63
77
|
Pass a stable `idempotencyKey` when a retry might create the customer again
|
|
@@ -89,7 +103,10 @@ through unconverted in Stripe's unit. Set `automaticTax: true` to charge tax
|
|
|
89
103
|
with Stripe Tax; Stripe needs the buyer's location, so collect it with
|
|
90
104
|
`billingAddressCollection` or, for an existing customer, save it with
|
|
91
105
|
`customerUpdate: { address: 'auto' }`. Ad-hoc prices default to
|
|
92
|
-
`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.
|
|
93
110
|
|
|
94
111
|
```ts
|
|
95
112
|
const session = await stripe.billing.createCheckoutSession({
|
|
@@ -182,6 +199,54 @@ charged. Pass `paymentMethodExternalId` to keep retries identical when the
|
|
|
182
199
|
customer's default card may change in between. Payment webhooks (`payment_intent.*`) carry a normalized `WebhookEvent.payment`
|
|
183
200
|
summary with the status, minor-unit amount, and `chargeKey`.
|
|
184
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
|
+
|
|
185
250
|
Minor-unit amounts (`amountMinor`, `unitAmountMinor`, and the `*Minor` read
|
|
186
251
|
fields) use ISO 4217 exponents from an explicit table, not the runtime's
|
|
187
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,
|
|
@@ -278,6 +280,30 @@ var StripeInvoiceOperations = class {
|
|
|
278
280
|
async markUncollectible(externalId) {
|
|
279
281
|
await this.provider.request("POST", `/v1/invoices/${encodeURIComponent(externalId)}/mark_uncollectible`, void 0, { idempotencyKey: `${externalId}:mark_uncollectible` });
|
|
280
282
|
}
|
|
283
|
+
/**
|
|
284
|
+
* Close an invoice paid on another rail (`paid_out_of_band`). An invoice
|
|
285
|
+
* already marked paid out of band, or paid with nothing collected, is left
|
|
286
|
+
* as is; one Stripe collected money for itself throws (a second collection needs a refund, not a silent close).
|
|
287
|
+
* A draft is finalized first without automatic collection, and refused if
|
|
288
|
+
* finalization raised the amount due. A void invoice throws; an
|
|
289
|
+
* uncollectible one can still be paid, as in Stripe.
|
|
290
|
+
*/
|
|
291
|
+
async markPaidOutOfBand(externalId) {
|
|
292
|
+
const path = `/v1/invoices/${encodeURIComponent(externalId)}`;
|
|
293
|
+
let invoice = await this.provider.request("GET", path);
|
|
294
|
+
if (invoice.status === "paid") {
|
|
295
|
+
if (invoice.paid_out_of_band === true || !(invoice.amount_paid ?? 0)) return;
|
|
296
|
+
throw new Error(`Stripe invoice ${externalId} was already paid through Stripe; it was not marked paid out of band.`);
|
|
297
|
+
}
|
|
298
|
+
if (invoice.status === "void") throw new Error(`Stripe invoice ${externalId} is void and cannot be marked paid.`);
|
|
299
|
+
if (invoice.status === "draft") {
|
|
300
|
+
const draftDue = invoice.amount_remaining ?? invoice.total ?? 0;
|
|
301
|
+
invoice = await this.provider.request("POST", `${path}/finalize`, { auto_advance: false }, { idempotencyKey: `${externalId}:finalize_out_of_band` });
|
|
302
|
+
if (invoice.status === "paid") return;
|
|
303
|
+
if ((invoice.amount_remaining ?? 0) > draftDue) throw new Error(`Stripe invoice ${externalId} grew from ${draftDue} to ${invoice.amount_remaining} on finalization; not marking it paid out of band.`);
|
|
304
|
+
}
|
|
305
|
+
await this.provider.request("POST", `${path}/pay`, { paid_out_of_band: true }, { idempotencyKey: `${externalId}:paid_out_of_band` });
|
|
306
|
+
}
|
|
281
307
|
async void(externalId) {
|
|
282
308
|
await this.provider.request("POST", `/v1/invoices/${encodeURIComponent(externalId)}/void`);
|
|
283
309
|
}
|
|
@@ -331,20 +357,32 @@ var StripePaymentOperations = class {
|
|
|
331
357
|
const currency = normalizeCurrencyCode(input.currency);
|
|
332
358
|
const stripeAmount = minorUnitsToStripeAmount(input.amountMinor, currency);
|
|
333
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`);
|
|
334
365
|
const chargeKey = input.idempotencyKey;
|
|
335
366
|
const base = {
|
|
336
367
|
provider: "stripe",
|
|
337
368
|
customerExternalId: input.customerExternalId,
|
|
338
369
|
amountMinor: input.amountMinor,
|
|
339
370
|
currency,
|
|
340
|
-
chargeKey
|
|
371
|
+
chargeKey,
|
|
372
|
+
...automaticTax ? { subtotalMinor: input.amountMinor } : {}
|
|
341
373
|
};
|
|
342
374
|
const existing = await this.findByChargeKey(chargeKey);
|
|
343
375
|
if (existing) {
|
|
344
|
-
assertSameCharge(existing,
|
|
376
|
+
assertSameCharge(existing, {
|
|
377
|
+
customerExternalId: input.customerExternalId,
|
|
378
|
+
stripeAmount,
|
|
379
|
+
currency,
|
|
380
|
+
automaticTax,
|
|
381
|
+
paymentMethodExternalId: input.paymentMethodExternalId
|
|
382
|
+
});
|
|
345
383
|
return {
|
|
346
384
|
...base,
|
|
347
|
-
...mapChargeOutcome(existing)
|
|
385
|
+
...mapChargeOutcome(existing, currency)
|
|
348
386
|
};
|
|
349
387
|
}
|
|
350
388
|
let paymentMethod = input.paymentMethodExternalId;
|
|
@@ -357,30 +395,61 @@ var StripePaymentOperations = class {
|
|
|
357
395
|
failureMessage: "The customer has no default payment method."
|
|
358
396
|
};
|
|
359
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
|
+
}
|
|
360
423
|
try {
|
|
361
424
|
const paymentIntent = await this.provider.request("POST", "/v1/payment_intents", {
|
|
362
|
-
amount
|
|
425
|
+
amount,
|
|
363
426
|
currency: currency.toLowerCase(),
|
|
364
427
|
customer: input.customerExternalId,
|
|
365
428
|
payment_method: paymentMethod,
|
|
366
429
|
off_session: true,
|
|
367
430
|
confirm: true,
|
|
368
431
|
description: input.description,
|
|
432
|
+
hooks: taxCalculation ? { inputs: { tax: { calculation: taxCalculation } } } : void 0,
|
|
369
433
|
metadata: normalizeMetadata({
|
|
370
434
|
...input.metadata,
|
|
435
|
+
...taxMetadata,
|
|
371
436
|
[CHARGE_KEY_METADATA]: chargeKey
|
|
372
437
|
})
|
|
373
438
|
}, { idempotencyKey: `${chargeKey}:payment_intent` });
|
|
374
439
|
return {
|
|
375
440
|
...base,
|
|
376
|
-
...mapChargeOutcome(paymentIntent)
|
|
441
|
+
...mapChargeOutcome(paymentIntent, currency)
|
|
377
442
|
};
|
|
378
443
|
} catch (error) {
|
|
379
444
|
if (error instanceof StripeApiError && error.status === 402 && error.type === "card_error") {
|
|
380
445
|
const paymentIntent = isRecord(error.paymentIntent) ? error.paymentIntent : void 0;
|
|
381
446
|
return {
|
|
382
447
|
...base,
|
|
383
|
-
...
|
|
448
|
+
...taxCalculation ? chargeTaxFields({
|
|
449
|
+
amount,
|
|
450
|
+
metadata: taxMetadata
|
|
451
|
+
}, currency) : {},
|
|
452
|
+
...paymentIntent ? mapChargeOutcome(paymentIntent, currency) : {},
|
|
384
453
|
paymentMethodExternalId: idOf(paymentIntent?.payment_method) ?? paymentMethod,
|
|
385
454
|
status: error.code === "authentication_required" ? "requires_action" : "failed",
|
|
386
455
|
failureCode: error.code,
|
|
@@ -392,6 +461,34 @@ var StripePaymentOperations = class {
|
|
|
392
461
|
throw error;
|
|
393
462
|
}
|
|
394
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
|
+
}
|
|
395
492
|
async findByChargeKey(chargeKey) {
|
|
396
493
|
return (await this.provider.request("GET", "/v1/payment_intents/search", {
|
|
397
494
|
query: `metadata['${CHARGE_KEY_METADATA}']:'${escapeSearchValue(chargeKey)}'`,
|
|
@@ -689,7 +786,12 @@ function mapCheckoutLineItem(lineItem, automaticTax = false) {
|
|
|
689
786
|
};
|
|
690
787
|
if (!lineItem.priceData) throw new Error("Stripe checkout line item requires price or priceData");
|
|
691
788
|
const { priceData } = lineItem;
|
|
692
|
-
const
|
|
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
|
+
};
|
|
693
795
|
const hasStripeAmount = priceData.unitAmount !== void 0;
|
|
694
796
|
const hasMinorAmount = priceData.unitAmountMinor !== void 0;
|
|
695
797
|
if (hasStripeAmount === hasMinorAmount) throw new Error("Stripe checkout priceData requires exactly one of unitAmount or unitAmountMinor");
|
|
@@ -757,6 +859,7 @@ function mapStripeInvoice(invoice) {
|
|
|
757
859
|
balance: stripeMinorUnitsToMoney(invoice.amount_remaining || 0, invoice.currency),
|
|
758
860
|
status: mapStripeInvoiceStatus(invoice.status, invoice.due_date),
|
|
759
861
|
currency: invoice.currency || "usd",
|
|
862
|
+
paidOutOfBand: invoice.paid_out_of_band === true,
|
|
760
863
|
raw: invoice
|
|
761
864
|
};
|
|
762
865
|
}
|
|
@@ -954,6 +1057,43 @@ function stripeMinorUnitsToMoney(amount, currency) {
|
|
|
954
1057
|
return amount / stripeCurrencyMinorUnitFactor(currency);
|
|
955
1058
|
}
|
|
956
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
|
+
}
|
|
957
1097
|
function assertIdempotencyKey(key) {
|
|
958
1098
|
if (typeof key !== "string" || key.trim() === "") throw new Error("idempotencyKey must be a non-empty string");
|
|
959
1099
|
}
|
|
@@ -984,10 +1124,14 @@ function lineServicePeriod(lineItem) {
|
|
|
984
1124
|
end: periodEnd
|
|
985
1125
|
};
|
|
986
1126
|
}
|
|
987
|
-
function mapChargeOutcome(paymentIntent) {
|
|
1127
|
+
function mapChargeOutcome(paymentIntent, currency) {
|
|
988
1128
|
const error = paymentIntent.last_payment_error;
|
|
989
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);
|
|
990
1132
|
return {
|
|
1133
|
+
...omitAmount(tax),
|
|
1134
|
+
...amountMinor === void 0 ? {} : { amountMinor },
|
|
991
1135
|
status,
|
|
992
1136
|
paymentExternalId: paymentIntent.id,
|
|
993
1137
|
paymentMethodExternalId: idOf(paymentIntent.payment_method),
|
|
@@ -1002,10 +1146,13 @@ function mapChargeOutcome(paymentIntent) {
|
|
|
1002
1146
|
* be the charge this call describes; a key reused for a different amount,
|
|
1003
1147
|
* currency, or customer is refused instead of reporting the wrong charge.
|
|
1004
1148
|
*/
|
|
1005
|
-
function assertSameCharge(paymentIntent,
|
|
1149
|
+
function assertSameCharge(paymentIntent, expected) {
|
|
1006
1150
|
const customer = idOf(paymentIntent.customer);
|
|
1007
1151
|
const paymentMethod = idOf(paymentIntent.payment_method);
|
|
1008
|
-
|
|
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`);
|
|
1009
1156
|
}
|
|
1010
1157
|
/** Remove `client_secret` from a Stripe object and its expanded intents. */
|
|
1011
1158
|
function withoutClientSecrets(value) {
|
|
@@ -1050,6 +1197,7 @@ function mapWebhookPayment(paymentIntent, eventType) {
|
|
|
1050
1197
|
customerExternalId: idOf(paymentIntent.customer),
|
|
1051
1198
|
amountMinor: currency && typeof paymentIntent.amount === "number" ? stripeAmountToMinorUnitsOrUndefined(paymentIntent.amount, currency) : void 0,
|
|
1052
1199
|
currency,
|
|
1200
|
+
...omitAmount(chargeTaxFields(paymentIntent, currency)),
|
|
1053
1201
|
chargeKey: metadata[CHARGE_KEY_METADATA],
|
|
1054
1202
|
failureCode: status === "succeeded" ? void 0 : error?.code || void 0,
|
|
1055
1203
|
declineCode: status === "succeeded" ? void 0 : error?.decline_code || void 0,
|
|
@@ -1057,6 +1205,10 @@ function mapWebhookPayment(paymentIntent, eventType) {
|
|
|
1057
1205
|
metadata
|
|
1058
1206
|
};
|
|
1059
1207
|
}
|
|
1208
|
+
function omitAmount(fields) {
|
|
1209
|
+
const { amountMinor: _amount, ...rest } = fields;
|
|
1210
|
+
return rest;
|
|
1211
|
+
}
|
|
1060
1212
|
function idOf(value) {
|
|
1061
1213
|
if (typeof value === "string") return value || void 0;
|
|
1062
1214
|
return value?.id || void 0;
|
|
@@ -1146,4 +1298,4 @@ function sleep(ms) {
|
|
|
1146
1298
|
//#endregion
|
|
1147
1299
|
export { StripeProvider };
|
|
1148
1300
|
|
|
1149
|
-
//# sourceMappingURL=stripe-
|
|
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":";;;;;;;;;;;;;AAmNA,IAAa,iBAAb,MAAgE;CAC9D,OAAgB;CAEhB;CACA;CACA,4BAA6B,IAAI,IAAoB;CAErD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,YAAY,SAAwB;EAClC,KAAK,UAAU;GACb,SAAS;GACT,YAAY;GACZ,YAAY;GACZ,kBAAkB;GAClB,GAAG;EACL;EACA,KAAK,YAAY,QAAQ,SAAS;EAElC,KAAK,YAAY,IAAI,yBAAyB,IAAI;EAClD,KAAK,WAAW,IAAI,wBAAwB,IAAI;EAChD,KAAK,UAAU,IAAI,4BAA4B;EAC/C,KAAK,QAAQ,IAAI,0BAA0B;EAC3C,KAAK,WAAW,IAAI,wBAAwB,IAAI;EAChD,KAAK,QAAQ,IAAI,sBAAsB,IAAI;EAC3C,KAAK,WAAW,IAAI,wBAAwB,KAAK,OAAO;EACxD,KAAK,UAAU,IAAI,4BAA4B,IAAI;CACrD;CAEA,MAAM,QACJ,QACA,UACA,QACA,UAAuC,CAAC,GAC5B;EACZ,MAAM,UAAU,KAAK,QAAQ,WAAW;EACxC,MAAM,aAAa,KAAK,QAAQ,cAAc;EAC9C,MAAM,iBACJ,WAAW,SACN,QAAQ,kBAAkB,OAAO,WAAW,MAC7C;EACN,IAAI,YAA0B;EAE9B,KAAK,IAAI,UAAU,GAAG,WAAW,YAAY,WAAW;GACtD,MAAM,aAAa,IAAI,gBAAgB;GACvC,MAAM,YAAY,iBAAiB,WAAW,MAAM,GAAG,OAAO;GAE9D,IAAI;IACF,MAAM,MAAM,KAAK,SAAS,UAAU,WAAW,QAAQ,SAAS,CAAC,CAAC;IAClE,MAAM,OACJ,WAAW,UAAU,SACjB,iBAAiB,MAAM,CAAC,CAAC,SAAS,IAClC,KAAA;IAEN,MAAM,UAAkC;KACtC,eAAe,UAAU,KAAK,QAAQ;KACtC,QAAQ;IACV;IACA,IAAI,WAAW,QAAQ;KACrB,QAAQ,kBAAkB;KAC1B,IAAI,gBACF,QAAQ,qBAAqB;IAEjC;IACA,IAAI,KAAK,QAAQ,YACf,QAAQ,oBAAoB,KAAK,QAAQ;IAG3C,MAAM,WAAW,MAAM,KAAK,UAAU,KAAK;KACzC;KACA;KACA;KACA,QAAQ,WAAW;IACrB,CAAC;IAED,IAAI,CAAC,SAAS,IAAI;KAChB,MAAM,YAAY,MAAM,SAAS,KAAK;KACtC,MAAM,QAAQ,IAAI,eAAe,SAAS,QAAQ,SAAS;KAE3D,IAAI,SAAS,SAAS,OAAO,SAAS,WAAW,KAC/C,MAAM;KAGR,YAAY;IACd,OAAO;KACL,MAAM,OAAO,MAAM,SAAS,KAAK;KACjC,OAAQ,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC;IACrC;GACF,SAAS,OAAO;IACd,YAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;IAEpE,MAAM,cAAc,UAAU,QAAQ,MACpC,4BACF;IACA,IAAI,aAAa;KACf,MAAM,SAAS,OAAO,SAAS,YAAY,IAAI,EAAE;KACjD,IAAI,UAAU,OAAO,SAAS,OAAO,WAAW,KAC9C,MAAM;IAEV;GACF,UAAU;IACR,aAAa,SAAS;GACxB;GAEA,IAAI,UAAU,YACZ,MAAM,MAAM,KAAK,UAAU,GAAG;EAElC;EAEA,MAAM,6BAAa,IAAI,MAAM,qCAAqC;CACpE;;;;;;;;CASA,MAAM,gBAAgB,UAAkB,QAAiC;EACvE,MAAM,aAAa,SAAS,YAAY;EACxC,MAAM,KAAK,iBAAiB,WAAW,GAAG;EAC1C,MAAM,SAAS,KAAK,UAAU,IAAI,EAAE;EACpC,IAAI,QACF,OAAO;EAGT,MAAM,OAAO,eAAe,mBAAmB,EAAE;EACjD,IAAI;EACJ,IAAI;GACF,SAAS,MAAM,KAAK,QAAsB,OAAO,IAAI;EACvD,SAAS,OAAO;GACd,IAAI,EAAE,iBAAiB,mBAAmB,MAAM,WAAW,KACzD,MAAM;GAER,IAAI;IACF,SAAS,MAAM,KAAK,QAAsB,QAAQ,eAAe;KAC/D;KACA,YAAY;KACZ,UAAU;KACV,UAAU;KACV,MAAM;KACN,UAAU,EAAE,YAAY,wBAAwB;IAClD,CAAC;GACH,SAAS,aAAa;IAEpB,IACE,EAAE,uBAAuB,mBACzB,YAAY,SAAS,2BAErB,MAAM;IAER,SAAS,MAAM,KAAK,QAAsB,OAAO,IAAI;GACvD;EACF;EAEA,IACE,OAAO,eAAe,WACrB,OAAO,YAAY,GAAA,CAAI,YAAY,MAAM,cAC1C,OAAO,eACP,OAAO,UAAU,OAEjB,MAAM,IAAI,MACR,iBAAiB,GAAG,6BAA6B,OAAO,GAAG,WAAW,mBACxE;EAEF,KAAK,UAAU,IAAI,IAAI,OAAO,EAAE;EAChC,OAAO,OAAO;CAChB;CAEA,SACE,UACA,QACQ;EACR,MAAM,UAAU,KAAK,QAAQ,cAAc;EAC3C,MAAM,MAAM,IAAI,IAAI,UAAU,OAAO;EAErC,IAAI,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GACzC,KAAK,MAAM,CAAC,KAAK,UAAU,iBAAiB,MAAM,CAAC,CAAC,QAAQ,GAC1D,IAAI,aAAa,OAAO,KAAK,KAAK;EAItC,OAAO,IAAI,SAAS;CACtB;AACF;AAEA,IAAM,2BAAN,MAA6D;CAC9B;CAA7B,YAAY,UAA2C;EAA1B,KAAA,WAAA;CAA2B;CAExD,MAAM,KAAK,UAA8C;EACvD,IAAI,SAAS,mBAAmB,KAAA,GAAW;GACzC,qBAAqB,SAAS,cAAc;GAG5C,MAAM,WAAW,MAAM,KAAK,cAAc,SAAS,EAAE;GACrD,IAAI,UACF,OAAO;IACL,QAAQ;IACR,YAAY,SAAS;IACrB,0BAAU,IAAI,KAAK;GACrB;EAEJ;EAaA,OAAO;GACL,QAAQ;GACR,aAAY,MAbS,KAAK,SAAS,QACnC,QACA,iBACA,oBAAoB,QAAQ,GAC5B,EACE,gBAAgB,SAAS,iBACrB,GAAG,SAAS,eAAe,aAC3B,KAAA,EACN,CACF,EAAA,CAIuB;GACrB,0BAAU,IAAI,KAAK;EACrB;CACF;;;;;;CAOA,MAAc,cACZ,SACqC;EACrC,MAAM,UAA4B,CAAC;EACnC,IAAI;EACJ,GAAG;GACD,MAAM,WAAW,MAAM,KAAK,SAAS,QAEnC,OAAO,wBAAwB;IAC/B,OAAO,yBAAyB,kBAAkB,OAAO,EAAE;IAC3D,OAAO;IACP;GACF,CAAC;GACD,QAAQ,KACN,GAAG,SAAS,KAAK,QACd,aAAa,SAAS,UAAU,aAAa,OAChD,CACF;GACA,OAAO,SAAS,WAAW,SAAS,aAAa,KAAA,IAAY,KAAA;EAC/D,SAAS;EAET,OAAO,QAAQ,MACZ,MAAM,WACJ,KAAK,WAAW,MAAM,MAAM,WAAW,MACxC,KAAK,GAAG,cAAc,MAAM,EAAE,CAClC,CAAC,CAAC;CACJ;CAEA,MAAM,KAAK,YAA+C;EAKxD,OAAO,kBAAkB,MAJF,KAAK,SAAS,QACnC,OACA,iBAAiB,mBAAmB,UAAU,GAChD,CACiC;CACnC;CAEA,MAAM,KAAK,UAAuB,CAAC,GAAgC;EAIjE,QAAO,MAHgB,KAAK,SAAS,QAEnC,OAAO,iBAAiB,eAAe,OAAO,CAAC,EAAA,CACjC,KAAK,IAAI,iBAAiB;CAC5C;CAEA,MAAM,KAAK,UAA8C;EACvD,IAAI,CAAC,SAAS,YACZ,OAAO,KAAK,KAAK,QAAQ;EAG3B,MAAM,KAAK,SAAS,QAClB,QACA,iBAAiB,mBAAmB,SAAS,UAAU,KACvD,oBAAoB,QAAQ,CAC9B;EAEA,OAAO;GACL,QAAQ;GACR,YAAY,SAAS;GACrB,0BAAU,IAAI,KAAK;EACrB;CACF;AACF;AAEA,IAAM,0BAAN,MAA2D;CAC5B;CAA7B,YAAY,UAA2C;EAA1B,KAAA,WAAA;CAA2B;CAExD,MAAM,KAAK,SAA4C;EACrD,IAAI,CAAC,QAAQ,oBACX,MAAM,IAAI,MAAM,4CAA4C;EAG9D,MAAM,WAAW,QAAQ,YAAY;EACrC,MAAM,mBAAmB,wBAAwB,OAAO;EAExD,MAAM,QAAQ,QAAQ,UAAU,KAAK,cAAc;GACjD;GACA,YAAY,wBAAwB,SAAS,WAAW,QAAQ;GAChE,UAAU,qBAAqB,UAAU,QAAQ;GACjD,QAAQ,kBAAkB,QAAQ;GAClC,SAAS,gBAAgB,SAAS,OAAO;EAC3C,EAAE;EAEF,MAAM,kBAAkB,QAAQ,iBAC5B,MAAM,KAAK,qBAAqB,QAAQ,oBAAoB,QAAQ,EAAE,IACtE,KAAA;EACJ,IAAI,iBACF,OAAO;GACL,QAAQ;GACR,YAAY,gBAAgB;GAC5B,0BAAU,IAAI,KAAK;EACrB;EAGF,MAAM,0BAA0B,QAAQ,iBACpC,MAAM,KAAK,2BACT,QAAQ,oBACR,QAAQ,EACV,oBACA,IAAI,IAAY;EAEpB,KAAK,MAAM,CAAC,OAAO,SAAS,MAAM,QAAQ,GAAG;GAC3C,IAAI,wBAAwB,IAAI,KAAK,GACnC;GAEF,MAAM,EAAE,UAAU,YAAY,UAAU,QAAQ,YAAY;GAC5D,MAAM,SAAS,WACX,MAAM,KAAK,SAAS,gBAAgB,UAAU,QAAQ,IACtD,KAAA;GACJ,MAAM,KAAK,SAAS,QAClB,QACA,oBACA;IACE,UAAU,QAAQ;IAClB;IACA,aAAa,SAAS;IACtB,UAAU,SAAS;IACnB,qBAAqB,OAAO,UAAU;IACtC;IACA,WAAW,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,KAAA;IACnC,cAAc,QAAQ,eAAe,cAAc,KAAA;IACnD,UAAU;IACV,UAAU,kBAAkB;KAC1B,kBAAkB,QAAQ;KAC1B,kBAAkB;KAClB,WAAW,SAAS;KACpB,gBAAgB,SAAS;KACzB,gBAAgB,SAAS;IAC3B,CAAC;GACH,GACA,EACE,gBAAgB,QAAQ,iBACpB,GAAG,QAAQ,eAAe,QAAQ,UAClC,KAAA,EACN,CACF;EACF;EAaA,OAAO;GACL,QAAQ;GACR,aAAY,MAbS,KAAK,SAAS,QACnC,QACA,gBACA,mBAAmB,SAAS,gBAAgB,GAC5C,EACE,gBAAgB,QAAQ,iBACpB,GAAG,QAAQ,eAAe,YAC1B,KAAA,EACN,CACF,EAAA,CAIuB;GACrB,0BAAU,IAAI,KAAK;EACrB;CACF;CAEA,MAAM,KAAK,YAA8C;EAKvD,OAAO,iBAAiB,MAJF,KAAK,SAAS,QAClC,OACA,gBAAgB,mBAAmB,UAAU,GAC/C,CAC+B;CACjC;CAEA,MAAM,KAAK,UAAuB,CAAC,GAA+B;EAIhE,QAAO,MAHgB,KAAK,SAAS,QAEnC,OAAO,gBAAgB,eAAe,OAAO,CAAC,EAAA,CAChC,KAAK,IAAI,gBAAgB;CAC3C;CAEA,MAAM,KAAK,SAA4C;EACrD,IAAI,CAAC,QAAQ,YACX,OAAO,KAAK,KAAK,OAAO;EAG1B,MAAM,KAAK,SAAS,QAClB,QACA,gBAAgB,mBAAmB,QAAQ,UAAU,KACrD,yBAAyB,SAAS,wBAAwB,OAAO,CAAC,CACpE;EAEA,OAAO;GACL,QAAQ;GACR,YAAY,QAAQ;GACpB,0BAAU,IAAI,KAAK;EACrB;CACF;;;;;;;;CASA,MAAM,KAAK,YAAmC;EAC5C,MAAM,OAAO,gBAAgB,mBAAmB,UAAU;EAC1D,MAAM,UAAU,MAAM,KAAK,SAAS,QAAuB,OAAO,IAAI;EACtE,IAAI,QAAQ,sBAAsB,wBAAwB;GACxD,MAAM,KAAK,SAAS,QAAQ,QAAQ,GAAG,KAAK,MAAM;GAClD;EACF;EACA,IAAI,QAAQ,WAAW,SAAS;GAC9B,MAAM,KAAK,SAAS,QAClB,QACA,GAAG,KAAK,YACR,EAAE,cAAc,KAAK,GACrB,EAAE,gBAAgB,GAAG,WAAW,WAAW,CAC7C;GACA;EACF;EACA,IAAI,QAAQ,WAAW,UAAU,QAAQ,iBAAiB,OACxD,MAAM,KAAK,SAAS,QAClB,QACA,MACA,EAAE,cAAc,KAAK,GACrB,EAAE,gBAAgB,GAAG,WAAW,eAAe,CACjD;CAEJ;CAEA,MAAM,kBAAkB,YAAmC;EACzD,MAAM,KAAK,SAAS,QAClB,QACA,gBAAgB,mBAAmB,UAAU,EAAE,sBAC/C,KAAA,GACA,EAAE,gBAAgB,GAAG,WAAW,qBAAqB,CACvD;CACF;;;;;;;;;CAUA,MAAM,kBAAkB,YAAmC;EACzD,MAAM,OAAO,gBAAgB,mBAAmB,UAAU;EAC1D,IAAI,UAAU,MAAM,KAAK,SAAS,QAAuB,OAAO,IAAI;EACpE,IAAI,QAAQ,WAAW,QAAQ;GAG7B,IAAI,QAAQ,qBAAqB,QAAQ,EAAE,QAAQ,eAAe,IAChE;GAIF,MAAM,IAAI,MACR,kBAAkB,WAAW,sEAC/B;EACF;EACA,IAAI,QAAQ,WAAW,QACrB,MAAM,IAAI,MACR,kBAAkB,WAAW,oCAC/B;EAEF,IAAI,QAAQ,WAAW,SAAS;GAC9B,MAAM,WAAW,QAAQ,oBAAoB,QAAQ,SAAS;GAC9D,UAAU,MAAM,KAAK,SAAS,QAC5B,QACA,GAAG,KAAK,YACR,EAAE,cAAc,MAAM,GACtB,EAAE,gBAAgB,GAAG,WAAW,uBAAuB,CACzD;GAEA,IAAI,QAAQ,WAAW,QAAQ;GAG/B,KAAK,QAAQ,oBAAoB,KAAK,UACpC,MAAM,IAAI,MACR,kBAAkB,WAAW,aAAa,SAAS,MAAM,QAAQ,iBAAiB,mDACpF;EAEJ;EACA,MAAM,KAAK,SAAS,QAClB,QACA,GAAG,KAAK,OACR,EAAE,kBAAkB,KAAK,GACzB,EAAE,gBAAgB,GAAG,WAAW,mBAAmB,CACrD;CACF;CAEA,MAAM,KAAK,YAAmC;EAC5C,MAAM,KAAK,SAAS,QAClB,QACA,gBAAgB,mBAAmB,UAAU,EAAE,MACjD;CACF;CAEA,MAAc,qBACZ,oBACA,gBACoC;EACpC,IAAI;EACJ,GAAG;GACD,MAAM,WAAW,MAAM,KAAK,SAAS,QAEnC,OAAO,gBAAgB;IACvB,UAAU;IACV,OAAO;IACP,gBAAgB;GAClB,CAAC;GACD,MAAM,WAAW,SAAS,KAAK,MAC5B,YAAY,QAAQ,UAAU,aAAa,cAC9C;GACA,IAAI,UACF,OAAO;GAET,gBAAgB,SAAS,WAAW,SAAS,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,KAAA;EACjE,SAAS;CAGX;CAEA,MAAc,2BACZ,oBACA,gBACsB;EACtB,MAAM,0BAAU,IAAI,IAAY;EAChC,IAAI;EACJ,GAAG;GACD,MAAM,WAAW,MAAM,KAAK,SAAS,QAEnC,OAAO,oBAAoB;IAC3B,UAAU;IACV,SAAS;IACT,OAAO;IACP,gBAAgB;GAClB,CAAC;GACD,KAAK,MAAM,QAAQ,SAAS,MAAM;IAChC,IAAI,KAAK,UAAU,qBAAqB,gBACtC;IAEF,MAAM,QAAQ,OAAO,KAAK,SAAS,gBAAgB;IACnD,IAAI,OAAO,cAAc,KAAK,KAAK,SAAS,GAC1C,QAAQ,IAAI,KAAK;GAErB;GACA,gBAAgB,SAAS,WAAW,SAAS,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,KAAA;EACjE,SAAS;EAET,OAAO;CACT;AACF;AAEA,IAAM,0BAAN,MAA2D;CAC5B;CAA7B,YAAY,UAA2C;EAA1B,KAAA,WAAA;CAA2B;CAExD,MAAM,KAAK,YAA8C;EAKvD,OAAO,uBAAuB,MAJF,KAAK,SAAS,QACxC,OACA,uBAAuB,mBAAmB,UAAU,GACtD,CAC2C;CAC7C;CAEA,MAAM,KAAK,UAAuB,CAAC,GAA+B;EAIhE,QAAO,MAHgB,KAAK,SAAS,QAEnC,OAAO,uBAAuB,eAAe,OAAO,CAAC,EAAA,CACvC,KAAK,IAAI,sBAAsB;CACjD;CAEA,MAAM,yBACJ,OACyC;EACzC,qBAAqB,MAAM,cAAc;EACzC,IAAI,CAAC,MAAM,oBACT,MAAM,IAAI,MAAM,iDAAiD;EAEnE,MAAM,WAAW,sBAAsB,MAAM,QAAQ;EACrD,MAAM,eAAe,yBAAyB,MAAM,aAAa,QAAQ;EACzE,IAAI,gBAAgB,GAClB,MAAM,IAAI,MACR,yDACF;EAEF,MAAM,eAAe,MAAM,iBAAiB;EAC5C,MAAM,UAAU,gBAAgB,MAAM,OAAO;EAC7C,IAAI,WAAW,CAAC,cACd,MAAM,IAAI,MAAM,+BAA+B;EAEjD,MAAM,WAAW,OAAO,KAAK,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,QACzD,yBAAyB,IAAI,GAAG,CAClC;EACA,IAAI,SAAS,SAAS,GACpB,MAAM,IAAI,MACR,wBAAwB,SAAS,KAAK,IAAI,EAAE,6BAC9C;EAEF,MAAM,YAAY,MAAM;EACxB,MAAM,OAAO;GACX,UAAU;GACV,oBAAoB,MAAM;GAC1B,aAAa,MAAM;GACnB;GACA;GACA,GAAI,eAAe,EAAE,eAAe,MAAM,YAAY,IAAI,CAAC;EAC7D;EAIA,MAAM,WAAW,MAAM,KAAK,gBAAgB,SAAS;EACrD,IAAI,UAAU;GACZ,iBAAiB,UAAU;IACzB,oBAAoB,MAAM;IAC1B;IACA;IACA;IACA,yBAAyB,MAAM;GACjC,CAAC;GACD,OAAO;IAAE,GAAG;IAAM,GAAG,iBAAiB,UAAU,QAAQ;GAAE;EAC5D;EAEA,IAAI,gBAAgB,MAAM;EAC1B,IAAI,CAAC,eAAe;GAKlB,gBAAgB,MAAK,MAJE,KAAK,SAAS,QACnC,OACA,iBAAiB,mBAAmB,MAAM,kBAAkB,GAC9D,EAAA,CAC8B,kBAAkB,sBAAsB;GACtE,IAAI,CAAC,eACH,OAAO;IACL,GAAG;IACH,QAAQ;IACR,aAAa;IACb,gBAAgB;GAClB;EAEJ;EAEA,IAAI,SAAS;EACb,IAAI,cAAsC,CAAC;EAC3C,IAAI;EACJ,IAAI,cAAc;GAChB,IAAI;GACJ,IAAI;IACF,cAAc,MAAM,KAAK,aACvB,MAAM,oBACN,cACA,UACA,WACA,OACF;GACF,SAAS,OAAO;IAGd,IACE,iBAAiB,kBACjB,MAAM,SAAS,iCAEf,OAAO;KACL,GAAG;KACH,yBAAyB;KACzB,QAAQ;KACR,aAAa,MAAM;KACnB,gBAAgB,MAAM;IACxB;IAEF,MAAM;GACR;GACA,SAAS,YAAY;GACrB,iBAAiB,YAAY;GAC7B,cAAc;KACX,2BAA2B,YAAY;KACvC,2BAA2B,OAAO,YAAY;KAC9C,sBAAsB,OAAO,YAAY,oBAAoB;GAChE;EACF;EAEA,IAAI;GACF,MAAM,gBAAgB,MAAM,KAAK,SAAS,QACxC,QACA,uBACA;IACE;IACA,UAAU,SAAS,YAAY;IAC/B,UAAU,MAAM;IAChB,gBAAgB;IAChB,aAAa;IACb,SAAS;IACT,aAAa,MAAM;IAGnB,OAAO,iBACH,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,eAAe,EAAE,EAAE,IACnD,KAAA;IACJ,UAAU,kBAAkB;KAC1B,GAAG,MAAM;KACT,GAAG;MACF,sBAAsB;IACzB,CAAC;GACH,GACA,EAAE,gBAAgB,GAAG,UAAU,iBAAiB,CAClD;GACA,OAAO;IAAE,GAAG;IAAM,GAAG,iBAAiB,eAAe,QAAQ;GAAE;EACjE,SAAS,OAAO;GAGd,IACE,iBAAiB,kBACjB,MAAM,WAAW,OACjB,MAAM,SAAS,cACf;IACA,MAAM,gBAAgB,SAAS,MAAM,aAAa,IAC7C,MAAM,gBACP,KAAA;IACJ,OAAO;KACL,GAAG;KACH,GAAI,iBACA,gBAAgB;MAAE;MAAQ,UAAU;KAAY,GAAG,QAAQ,IAC3D,CAAC;KACL,GAAI,gBAAgB,iBAAiB,eAAe,QAAQ,IAAI,CAAC;KACjE,yBACE,KAAK,eAAe,cAAc,KAAK;KACzC,QACE,MAAM,SAAS,4BACX,oBACA;KACN,aAAa,MAAM;KACnB,aAAa,MAAM;KACnB,gBAAgB,MAAM;KACtB,KAAK,gBAAgB,oBAAoB,aAAa,IAAI,KAAA;IAC5D;GACF;GACA,MAAM;EACR;CACF;;;;;;;;;;;;;CAcA,MAAc,aACZ,oBACA,cACA,UACA,WACA,SAC+B;EAC/B,MAAM,cAAc,MAAM,KAAK,SAAS,QACtC,QACA,wBACA;GACE,UAAU,SAAS,YAAY;GAC/B,UAAU;GACV,YAAY,CACV;IACE,QAAQ;IACR,UAAU;IACV,WAAW;IACX,cAAc;IACd,UAAU;GACZ,CACF;EACF,GAGA,EAAE,gBAAgB,sBAAsB,WAAW,IAAI,CACzD;EACA,MAAM,MAAM,YAAY;EACxB,IACE,CAAC,YAAY,MACb,CAAC,OAAO,cAAc,GAAG,KACzB,MAAM,KACN,YAAY,iBAAiB,eAAe,KAE5C,MAAM,IAAI,MACR,0BAA0B,YAAY,MAAM,UAAU,yDACxD;EAEF,OAAO;CACT;CAEA,MAAc,gBACZ,WAC0C;EAO1C,QAAO,MANgB,KAAK,SAAS,QAEnC,OAAO,8BAA8B;GACrC,OAAO,aAAa,oBAAoB,MAAM,kBAAkB,SAAS,EAAE;GAC3E,OAAO;EACT,CAAC,EAAA,CACe,KACb,QAAQ,WAAW,OAAO,WAAW,yBAAyB,SAAS,CAAC,CACxE,MACE,MAAM,WACJ,KAAK,WAAW,MAAM,MAAM,WAAW,MACxC,KAAK,GAAG,cAAc,MAAM,EAAE,CAClC,CAAC,CAAC;CACN;AACF;AAEA,IAAM,8BAAN,MAAqE;CACtC;CAA7B,YAAY,UAA2C;EAA1B,KAAA,WAAA;CAA2B;CAExD,MAAM,sBACJ,OACgC;EAQhC,OAAO,2BAA2B,MAPX,KAAK,SAAS,QACnC,QACA,yBACA,2BAA2B,KAAK,GAChC,EAAE,gBAAgB,MAAM,eAAe,CACzC,CAE0C;CAC5C;CAEA,MAAM,wBACJ,mBACuC;EACvC,MAAM,UAAU,MAAM,KAAK,SAAS,QAClC,OACA,yBAAyB,mBAAmB,iBAAiB,KAC7D,EAAE,QAAQ,CAAC,gBAAgB,gBAAgB,EAAE,CAC/C;EACA,MAAM,SACJ,OAAO,QAAQ,iBAAiB,YAAY,QAAQ,eAChD,QAAQ,eACR,OAAO,QAAQ,mBAAmB,YAAY,QAAQ,iBACpD,QAAQ,iBACR,KAAA;EACR,MAAM,WAAW,QAAQ,WACrB,QAAQ,SAAS,YAAY,IAC7B,KAAA;EACJ,MAAM,SAAS,WACb,YAAY,OAAO,WAAW,WAC1B,oCAAoC,QAAQ,QAAQ,IACpD,KAAA;EAEN,OAAO;GACL,GAAG,2BAA2B,OAAO;GACrC,KAAK,qBAAqB,OAAO;GACjC,QAAQ,MAAM,QAAQ,QAAQ;IAAC;IAAQ;IAAY;GAAS,CAAU;GACtE,eAAe,MAAM,QAAQ,gBAAgB;IAC3C;IACA;IACA;GACF,CAAU;GACV,yBAAyB,KAAK,QAAQ,cAAc;GACpD;GACA,qBAAqB,MAAM,QAAQ,eAAe;GAClD,gBAAgB,MAAM,QAAQ,eAAe,UAAU;GACvD,kBAAkB,MAAM,QAAQ,YAAY;GAC5C,UAAU,EAAE,GAAI,QAAQ,YAAY,CAAC,EAAG;EAC1C;CACF;CAEA,MAAM,wBACJ,oBACA,yBACe;EACf,IAAI,CAAC,sBAAsB,CAAC,yBAC1B,MAAM,IAAI,MACR,kEACF;EAEF,MAAM,KAAK,SAAS,QAClB,QACA,iBAAiB,mBAAmB,kBAAkB,KACtD,EAAE,kBAAkB,EAAE,wBAAwB,wBAAwB,EAAE,CAC1E;CACF;CAEA,MAAM,4BACJ,OACsC;EACtC,MAAM,WAAW,MAAM,KAAK,SAAS,QACnC,QACA,+BACA;GACE,UAAU,MAAM;GAChB,YAAY,MAAM;GAClB,eAAe,MAAM;EACvB,CACF;EAEA,OAAO;GACL,YAAY,SAAS;GACrB,KAAK,SAAS;GACd,KAAK;EACP;CACF;CAEA,MAAM,2BACJ,wBACyC;EAMzC,OAAO,sBAAsB,MALF,KAAK,SAAS,QACvC,OACA,qBAAqB,mBAAmB,sBAAsB,GAChE,CAEyC;CAC3C;CAEA,MAAM,0BACJ,oBAC2C;EAS3C,QAAO,MARgB,KAAK,SAAS,QAEnC,OAAO,qBAAqB;GAC5B,UAAU;GACV,QAAQ;GACR,OAAO;EACT,CAAC,EAAA,CAEe,KAAK,IAAI,qBAAqB;CAChD;AACF;AAEA,IAAM,8BAAN,MAA8D;CAC5D,MAAM,KAAK,SAA2C;EACpD,MAAM,IAAI,MAAM,2CAA2C;CAC7D;CAEA,MAAM,KAAK,aAA8C;EACvD,MAAM,IAAI,MAAM,2CAA2C;CAC7D;CAEA,MAAM,KAAK,UAAmD;EAC5D,MAAM,IAAI,MAAM,2CAA2C;CAC7D;CAEA,MAAM,KAAK,SAA2C;EACpD,MAAM,IAAI,MAAM,2CAA2C;CAC7D;AACF;AAEA,IAAM,4BAAN,MAA0D;CACxD,MAAM,KAAK,OAAuC;EAChD,MAAM,IAAI,MAAM,yCAAyC;CAC3D;CAEA,MAAM,KAAK,aAA4C;EACrD,MAAM,IAAI,MAAM,yCAAyC;CAC3D;CAEA,MAAM,KAAK,UAAiD;EAC1D,MAAM,IAAI,MAAM,yCAAyC;CAC3D;CAEA,MAAM,KAAK,OAAuC;EAChD,MAAM,IAAI,MAAM,yCAAyC;CAC3D;AACF;AAEA,IAAM,wBAAN,MAAuD;CACxB;CAA7B,YAAY,UAA2C;EAA1B,KAAA,WAAA;CAA2B;CAExD,MAAM,mBACJ,QACqC;EAErC,OAAO,iBAAiB,UAAU,QAAQ,MADlB,KAAK,SAAS,UAAU,KAAK,EAAE,OAAO,IAAI,CAAC,GACd,eAAe;CACtE;CAEA,MAAM,kBACJ,QACA,WACoC;EAMpC,OAAO,iBAAiB,UAAU,QAAQ,MALlB,KAAK,SAAS,SAAS,KAAK;GAClD,OAAO;GACP,WAAW,WAAW;GACtB,SAAS,WAAW;EACtB,CAAC,GACoD,cAAc;CACrE;CAEA,MAAM,iBACJ,SACmC;EACnC,MAAM,IAAI,MAAM,2CAA2C;CAC7D;CAEA,MAAM,eAAe,SAAuD;EAC1E,MAAM,IAAI,MAAM,yCAAyC;CAC3D;CAEA,MAAM,kBACJ,QACA,WACoC;EAMpC,OAAO,iBAAiB,UAAU,QAAQ,MALlB,KAAK,SAAS,SAAS,KAAK;GAClD,OAAO;GACP,WAAW,WAAW;GACtB,SAAS,WAAW;EACtB,CAAC,GACoD,cAAc;CACrE;AACF;AAEA,IAAM,0BAAN,MAA2D;CAC5B;CAA7B,YAAY,SAAyC;EAAxB,KAAA,UAAA;CAAyB;CAEtD,OAAO,SAAiB,WAAmB,QAAyB;EAClE,MAAM,iBAAiB,UAAU,KAAK,QAAQ;EAC9C,IAAI,CAAC,gBACH,MAAM,IAAI,MACR,4GACF;EAGF,MAAM,SAAS,2BAA2B,SAAS;EACnD,IAAI,CAAC,OAAO,aAAa,OAAO,WAAW,WAAW,GACpD,OAAO;EAGT,MAAM,YAAY,KAAK,QAAQ,oBAAoB;EACnD,MAAM,YAAY,OAAO,SAAS,OAAO,WAAW,EAAE;EACtD,IACE,CAAC,OAAO,SAAS,SAAS,KAC1B,KAAK,IAAI,KAAK,IAAI,IAAI,MAAO,SAAS,IAAI,WAE1C,OAAO;EAGT,MAAM,gBAAgB,GAAG,OAAO,UAAU,GAAG;EAC7C,MAAM,WAAW,WAAW,UAAU,cAAc,CAAC,CAClD,OAAO,aAAa,CAAC,CACrB,OAAO,KAAK;EAEf,OAAO,OAAO,WAAW,MAAM,UAC7B,qBAAqB,OAAO,QAAQ,CACtC;CACF;CAEA,MAAM,SAA+B;EACnC,IAAI;EACJ,IAAI;GACF,QAAQ,KAAK,MAAM,OAAO;EAC5B,SAAS,OAAO;GACd,MAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;GAC3C,MAAM,IAAI,MAAM,mCAAmC,SAAS;EAC9D;EAEA,MAAM,WAAW,OAAO,MAAM;EAC9B,MAAM,UACJ,UAAU,WAAW,oBAAoB,OAAO,SAAS,OAAO,WAC5D,kBACE,UACA,OAAO,QAAQ,KAAA,CACjB,IACA,KAAA;EACN,OAAO;GACL,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;GAC7B,MAAM,OAAO,QAAQ;GACrB,IAAI,OAAO,OAAO,OAAO,WAAW,MAAM,KAAK,KAAA;GAC/C,UAAU;GACV,WAAW,WAAW,OAAO,OAAO,qBAAK,IAAI,KAAK;GAClD,SAAS;GACT,cAAc,sBACZ,UAAU,UAAU,KAAA,GACpB,OAAO,QAAQ,KAAA,CACjB;GACA,YAAY,OAAO,UAAU,OAAO,WAAW,SAAS,KAAK,KAAA;EAC/D;CACF;AACF;AAEA,SAAS,iBAAiB,QAAyC;CACjE,MAAM,OAAO,IAAI,gBAAgB;CAEjC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAC9C,sBAAsB,MAAM,KAAK,KAAK;CAGxC,OAAO;AACT;AAEA,SAAS,sBACP,MACA,KACA,OACM;CACN,IAAI,UAAU,KAAA,KAAa,UAAU,MACnC;CAGF,IAAI,iBAAiB,MAAM;EACzB,KAAK,OAAO,KAAK,OAAO,cAAc,KAAK,CAAC,CAAC;EAC7C;CACF;CAEA,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxB,MAAM,SAAS,MAAM,UAAU;GAC7B,sBAAsB,MAAM,GAAG,IAAI,GAAG,MAAM,IAAI,IAAI;EACtD,CAAC;EACD;CACF;CAEA,IAAI,OAAO,UAAU,UAAU;EAC7B,KAAK,MAAM,CAAC,UAAU,eAAe,OAAO,QAAQ,KAAK,GACvD,sBAAsB,MAAM,GAAG,IAAI,GAAG,SAAS,IAAI,UAAU;EAE/D;CACF;CAEA,KAAK,OAAO,KAAK,OAAO,KAAK,CAAC;AAChC;AAEA,SAAS,oBACP,UACiC;CACjC,MAAM,iBAAkD;EACtD,MAAM,SAAS;EACf,OAAO,SAAS;EAChB,OAAO,SAAS;EAChB,SAAS,SAAS,iBACd;GACE,OAAO,SAAS,eAAe;GAC/B,OAAO,SAAS,eAAe;GAC/B,MAAM,SAAS,eAAe;GAC9B,OAAO,SAAS,eAAe;GAC/B,aAAa,SAAS,eAAe;GACrC,SAAS,SAAS,eAAe;EACnC,IACA,KAAA;EACJ,UAAU,kBAAkB;GAC1B,eAAe,SAAS;GACxB,GAAG,SAAS;GAEZ,UAAU,SAAS;EACrB,CAAC;CACH;CAEA,IAAI,SAAS,cAAc,KAAA,GACzB,eAAe,aAAa,SAAS,YAAY,WAAW;CAG9D,OAAO;AACT;AAEA,SAAS,mBACP,SACA,kBACiC;CACjC,OAAO;EACL,UAAU,QAAQ;EAClB,mBAAmB;EAEnB,UAAU,qBAAqB,iBAAiB,QAAQ,UAAU,KAAA;EAClE,cAAc;EACd,gCAAgC;EAChC,eAAe,QAAQ,eAAe,EAAE,SAAS,KAAK,IAAI,KAAA;EAC1D,UAAU,kBAAkB;GAC1B,UAAU,QAAQ;GAClB,gBAAgB,QAAQ;GACxB,WAAW,QAAQ;GACnB,MAAM,QAAQ;GACd,YAAY,QAAQ;GACpB,UAAU,QAAQ;GAClB,cAAc,QAAQ;GACtB,GAAG,QAAQ;EACb,CAAC;CACH;AACF;AAEA,SAAS,yBACP,SACA,kBACiC;CACjC,OAAO;EAIL,mBAAmB,QAAQ,mBAAmB,mBAAmB,KAAA;EACjE,UAAU,qBAAqB,iBAAiB,QAAQ,UAAU,KAAA;EAClE,UAAU,kBAAkB;GAC1B,UAAU,QAAQ;GAClB,gBAAgB,QAAQ;GACxB,WAAW,QAAQ;GACnB,MAAM,QAAQ;GACd,GAAG,QAAQ;EACb,CAAC;CACH;AACF;AAEA,SAAS,2BACP,OACiC;CACjC,MAAM,OAAO,MAAM,QAAQ;CAC3B,MAAM,YAAY,MAAM,aAAa,CAAC;CACtC,IAAI,SAAS,SAAS;EACpB,IAAI,UAAU,SAAS,GACrB,MAAM,IAAI,MAAM,uDAAuD;EAEzE,IAAI,CAAC,MAAM,YAAY,CAAC,MAAM,oBAAoB,QAChD,MAAM,IAAI,MACR,oEACF;EAEF,IAAI,MAAM,cACR,MAAM,IAAI,MAAM,mDAAmD;CAEvE,OAAO,IAAI,UAAU,WAAW,GAC9B,MAAM,IAAI,MAAM,UAAU,KAAK,mCAAmC;CAEpE,IAAI,MAAM,oBAAoB,SAAS,WACrC,MAAM,IAAI,MAAM,wDAAwD;CAE1E,IAAI,MAAM,kBAAkB,CAAC,MAAM,oBACjC,MAAM,IAAI,MAAM,4CAA4C;CAG9D,OAAO;EACL;EACA,aAAa,MAAM;EACnB,YAAY,MAAM;EAClB,UAAU,MAAM;EAChB,gBAAgB,MAAM,qBAAqB,KAAA,IAAY,MAAM;EAC7D,qBAAqB,MAAM;EAC3B,uBAAuB,MAAM;EAC7B,UAAU,MAAM,WAAW,MAAM,SAAS,YAAY,IAAI,KAAA;EAC1D,sBAAsB,MAAM;EAC5B,eAAe,MAAM,eAAe,EAAE,SAAS,KAAK,IAAI,KAAA;EACxD,4BAA4B,MAAM;EAClC,iBAAiB,MAAM,iBACnB;GACE,SAAS,MAAM,eAAe;GAC9B,MAAM,MAAM,eAAe;GAC3B,UAAU,MAAM,eAAe;EACjC,IACA,KAAA;EACJ,qBAAqB,MAAM,mBACvB,EAAE,oBAAoB,MAAM,iBAAiB,IAC7C,KAAA;EACJ,YACE,SAAS,UACL,KAAA,IACA,UAAU,KAAK,aACb,oBAAoB,UAAU,QAAQ,MAAM,YAAY,CAAC,CAC3D;EACN,UAAU,kBAAkB,MAAM,YAAY,CAAC,CAAC;CAClD;AACF;AAEA,SAAS,2BACP,UACuB;CACvB,OAAO;EACL,YAAY,SAAS;EACrB,KAAK,SAAS,OAAO;EACrB,MAAM,MAAM,SAAS,MAAM;GAAC;GAAW;GAAS;EAAc,CAAU;EACxE,oBAAoB,KAAK,SAAS,QAAQ;EAC1C,wBAAwB,KAAK,SAAS,YAAY;EAClD,yBAAyB,KAAK,SAAS,cAAc;EACrD,uBAAuB,KAAK,SAAS,YAAY;EACjD,KAAK,qBAAqB,QAAQ;CACpC;AACF;AAEA,SAAS,oBACP,UACA,eAAe,OACkB;CACjC,IAAI,SAAS,OACX,OAAO;EACL,OAAO,SAAS;EAChB,UAAU,SAAS,YAAY;CACjC;CAGF,IAAI,CAAC,SAAS,WACZ,MAAM,IAAI,MAAM,uDAAuD;CAGzE,MAAM,EAAE,cAAc;CACtB,MAAM,UAAU,gBAAgB,UAAU,OAAO;CACjD,IAAI,WAAW,UAAU,SACvB,MAAM,IAAI,MACR,qHACF;CAEF,MAAM,cAAc,UAAU,UAC1B,KAAA,IACA;EAAE,MAAM,UAAU,eAAe;EAAgB,UAAU;CAAQ;CACvE,MAAM,kBAAkB,UAAU,eAAe,KAAA;CACjD,MAAM,iBAAiB,UAAU,oBAAoB,KAAA;CACrD,IAAI,oBAAoB,gBACtB,MAAM,IAAI,MACR,iFACF;CAEF,MAAM,aAAa,iBACf,yBACE,UAAU,iBACV,sBAAsB,UAAU,QAAQ,CAC1C,IACA,UAAU;CAEd,OAAO;EACL,UAAU,SAAS,YAAY;EAC/B,YAAY;GACV,UAAU,UAAU,SAAS,YAAY;GACzC,aAAa;GACb,cACE,UAAU,gBAAgB,eAAe,cAAc,KAAA;GACzD,SAAS,UAAU;GACnB,cAAc;GACd,WAAW,UAAU,YACjB;IACE,UAAU,UAAU,UAAU;IAC9B,gBAAgB,UAAU,UAAU;GACtC,IACA,KAAA;EACN;CACF;AACF;AAEA,SAAS,eAAe,SAAuD;CAC7E,OAAO;EACL,OAAO,QAAQ;EACf,gBACE,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS,KAAA;EACxD,SAAS;GACP,KAAK,QAAQ;GACb,KAAK,QAAQ;EACf;EACA,QAAQ,QAAQ;CAClB;AACF;AAEA,SAAS,kBAAkB,UAA4C;CACrE,OAAO;EACL,YAAY,SAAS;EACrB,UAAU;EACV,0BAAU,IAAI,KAAK;EACnB,MAAM,SAAS,QAAQ;EACvB,OAAO,SAAS,SAAS,KAAA;EACzB,OAAO,SAAS,SAAS,KAAA;EACzB,gBAAgB,SAAS,UACrB;GACE,SAAS,SAAS,QAAQ,SAAS,KAAA;GACnC,SAAS,SAAS,QAAQ,SAAS,KAAA;GACnC,MAAM,SAAS,QAAQ,QAAQ,KAAA;GAC/B,OAAO,SAAS,QAAQ,SAAS,KAAA;GACjC,YAAY,SAAS,QAAQ,eAAe,KAAA;GAC5C,SAAS,SAAS,QAAQ,WAAW,KAAA;EACvC,IACA,KAAA;EACJ,SACE,SAAS,YAAY,QAAQ,SAAS,YAAY,KAAA,IAC9C,KAAA,IACA,wBAAwB,SAAS,SAAS,SAAS,QAAQ;EACjE,UAAU,SAAS,YAAY,KAAA;EAC/B,KAAK;CACP;AACF;AAEA,SAAS,iBAAiB,SAAyC;CACjE,OAAO;EACL,YAAY,QAAQ;EACpB,UAAU;EACV,0BAAU,IAAI,KAAK;EACnB,eAAe,QAAQ,UAAU,QAAQ;EACzC,oBACE,OAAO,QAAQ,aAAa,WACxB,QAAQ,WACR,QAAQ,UAAU,MAAM;EAC9B,WAAW,WAAW,QAAQ,OAAO,qBAAK,IAAI,KAAK;EACnD,SACE,WAAW,QAAQ,QAAQ,KAAK,WAAW,QAAQ,OAAO,qBAAK,IAAI,KAAK;EAC1E,UAAU,wBAAwB,QAAQ,YAAY,GAAG,QAAQ,QAAQ;EACzE,WAAW,wBACT,uBAAuB,OAAO,GAC9B,QAAQ,QACV;EACA,aAAa,wBAAwB,QAAQ,SAAS,GAAG,QAAQ,QAAQ;EACzE,YAAY,wBACV,QAAQ,eAAe,GACvB,QAAQ,QACV;EACA,SAAS,wBACP,QAAQ,oBAAoB,GAC5B,QAAQ,QACV;EACA,QAAQ,uBAAuB,QAAQ,QAAQ,QAAQ,QAAQ;EAC/D,UAAU,QAAQ,YAAY;EAC9B,eAAe,QAAQ,qBAAqB;EAC5C,KAAK;CACP;AACF;AAEA,SAAS,uBACP,eACiB;CACjB,OAAO;EACL,YAAY,cAAc;EAC1B,UAAU;EACV,0BAAU,IAAI,KAAK;EACnB,QAAQ,wBACN,cAAc,UAAU,GACxB,cAAc,QAChB;EACA,UAAU,cAAc,YAAY;EACpC,QAAQ,WAAW,cAAc,OAAO,qBAAK,IAAI,KAAK;EACtD,QAAQ,cAAc,uBAAuB;EAC7C,eAAe,cAAc,iBAAiB,cAAc;EAC5D,oBAAoB,cAAc,UAC9B,CAAC,cAAc,OAAO,IACtB,KAAA;EACJ,QAAQ,uBAAuB,cAAc,MAAM;EACnD,KAAK;CACP;AACF;AAEA,SAAS,sBACP,cACgC;CAChC,OAAO;EACL,YAAY,aAAa;EACzB,QAAQ,aAAa;EACrB,oBACE,OAAO,aAAa,aAAa,WAC7B,aAAa,WACb,aAAa,SAAS;EAC5B,oBAAoB,WAAW,aAAa,oBAAoB;EAChE,kBAAkB,WAAW,aAAa,kBAAkB;EAC5D,mBAAmB,QAAQ,aAAa,oBAAoB;EAC5D,YAAY,WAAW,aAAa,WAAW;EAC/C,UAAU,WAAW,aAAa,SAAS;EAC3C,KAAK;CACP;AACF;AAEA,SAAS,uBACP,QACA,SAC2B;CAC3B,QAAQ,QAAR;EACE,KAAK,SACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,iBACH,OAAO;EACT,KAAK;GACH,IAAI,WAAW,UAAU,MAAO,KAAK,IAAI,GACvC,OAAO;GAET,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,SAAS,uBACP,QAC2B;CAC3B,QAAQ,QAAR;EACE,KAAK,aACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,yBACH,OAAO;EACT,KAAK;EACL,KAAK,2BACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,SAAS,sBACP,QACA,WAC0C;CAC1C,IAAI,WAAW,cAAc,WAAW,WAAW,WAAW,GAC5D,OAAO;CAET,IAAI,WAAW,aAAa,WAAW,WAAW,UAAU,GAC1D,OAAO;CAET,IACE,WAAW,oBACX,WAAW,YACX,WAAW,WAAW,iBAAiB,KACvC,WAAW,WAAW,SAAS,GAE/B,OAAO;AAGX;AAEA,SAAS,kBACP,UACwB;CACxB,MAAM,aAAqC,CAAC;CAE5C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,GAChD,IAAI,UAAU,KAAA,KAAa,UAAU,MACnC,WAAW,OAAO,OAAO,KAAK;CAIlC,OAAO;AACT;AAEA,SAAS,2BAA2B,WAGlC;CACA,MAAM,QAAQ,UAAU,MAAM,GAAG,CAAC,CAAC,KAAK,SAAS,KAAK,KAAK,CAAC;CAC5D,MAAM,SAAuD,EAC3D,YAAY,CAAC,EACf;CAEA,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,iBAAiB,KAAK,QAAQ,GAAG;EACvC,IAAI,mBAAmB,IACrB;EAGF,MAAM,MAAM,KAAK,MAAM,GAAG,cAAc;EACxC,MAAM,QAAQ,KAAK,MAAM,iBAAiB,CAAC;EAC3C,IAAI,QAAQ,KACV,OAAO,YAAY;EAErB,IAAI,QAAQ,QAAQ,OAClB,OAAO,WAAW,KAAK,KAAK;CAEhC;CAEA,OAAO;AACT;AAEA,SAAS,qBAAqB,MAAc,OAAwB;CAClE,IAAI;EACF,MAAM,aAAa,OAAO,KAAK,MAAM,KAAK;EAC1C,MAAM,cAAc,OAAO,KAAK,OAAO,KAAK;EAC5C,OACE,WAAW,WAAW,YAAY,UAClC,gBAAgB,YAAY,WAAW;CAE3C,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,iBACP,UACA,QACA,WACA,SACqB;CACrB,MAAM,eAAe,IAAI,IACvB,UAAU,KAAK,aAAa,CAAC,SAAS,YAAY,QAAQ,CAAC,CAC7D;CACA,MAAM,UAAgC,CAAC;CACvC,MAAM,gBAAsD,CAAC;CAC7D,MAAM,YAAsB,CAAC;CAC7B,MAAM,kCAAkB,IAAI,IAAY;CAExC,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,WAAW,MAAM,aACnB,aAAa,IAAI,MAAM,UAAU,IACjC,KAAA;EAEJ,IAAI,CAAC,UAAU;GACb,UAAU,KAAK,KAAK;GACpB;EACF;EAEA,gBAAgB,IAAI,SAAS,UAAU;EACvC,MAAM,cAAc,QAAQ,OAAO,QAAQ;EAC3C,IAAI,YAAY,WAAW,GACzB,QAAQ,KAAK;GAAE;GAAO;GAAU,QAAQ;EAAY,CAAC;OAErD,cAAc,KAAK;GAAE;GAAO;GAAU;EAAY,CAAC;CAEvD;CAEA,MAAM,eAAe,UAAU,QAC5B,aAAa,CAAC,gBAAgB,IAAI,SAAS,UAAU,CACxD;CAEA,OAAO;EACL;EACA,2BAAW,IAAI,KAAK;EACpB;EACA;EACA;EACA;EACA,SAAS;GACP,OAAO,OAAO,SAAS,aAAa;GACpC,SAAS,QAAQ;GACjB,WAAW,UAAU;GACrB,cAAc,aAAa;GAC3B,eAAe,cAAc;EAC/B;CACF;AACF;AAEA,SAAS,gBACP,OACA,UACa;CACb,MAAM,WAAW;CACjB,OAAO,CACL,aAAa,QAAQ,MAAM,MAAM,SAAS,IAAI,GAC9C,aAAa,SAAS,MAAM,OAAO,SAAS,KAAK,CACnD,CAAC,CAAC,QAAQ,SAA4B,QAAQ,IAAI,CAAC;AACrD;AAEA,SAAS,eACP,OACA,UACa;CACb,MAAM,UAAU;CAChB,OAAO,CACL,aAAa,eAAe,MAAM,aAAa,QAAQ,WAAW,GAClE,aAAa,YAAY,MAAM,YAAY,OAAO,QAAQ,QAAQ,CACpE,CAAC,CAAC,QAAQ,SAA4B,QAAQ,IAAI,CAAC;AACrD;AAEA,SAAS,eACP,OACA,UACa;CACb,MAAM,UAAU;CAChB,OAAO,CACL,aAAa,UAAU,MAAM,QAAQ,QAAQ,MAAM,GACnD,aAAa,YAAY,MAAM,YAAY,OAAO,QAAQ,QAAQ,CACpE,CAAC,CAAC,QAAQ,SAA4B,QAAQ,IAAI,CAAC;AACrD;AAEA,SAAS,aACP,OACA,YACA,eACkB;CAClB,IAAI,YAAY,YAAY,aAAa,GACvC,OAAO;CAET,OAAO;EAAE;EAAO;EAAY;CAAc;AAC5C;AAEA,SAAS,YAAY,MAAe,OAAyB;CAC3D,IAAI,SAAS,OACX,OAAO;CAET,IAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAC/C,OAAO,KAAK,IAAI,OAAO,KAAK,IAAI;CAElC,OAAO;AACT;AAEA,SAAS,uBAAuB,SAAgC;CAC9D,IAAI,OAAO,QAAQ,QAAQ,UACzB,OAAO,QAAQ;CAEjB,QAAQ,QAAQ,eAAe,CAAC,EAAA,CAAG,QAChC,OAAO,QAAQ,SAAS,IAAI,UAAU,IACvC,CACF;AACF;AAEA,IAAM,iDAAiC,IAAI,IAAI;CAC7C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AACD,IAAM,kDAAkC,IAAI,IAAI;CAC9C;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,8BAA8B,UAAkC;CACvE,MAAM,cAAc,YAAY,MAAA,CAAO,YAAY;CACnD,IAAI,+BAA+B,IAAI,UAAU,GAC/C,OAAO;CAET,IAAI,gCAAgC,IAAI,UAAU,GAChD,OAAO;CAET,OAAO;AACT;AAEA,SAAS,wBAAwB,QAAgB,UAA0B;CACzE,OAAO,KAAK,MAAM,SAAS,8BAA8B,QAAQ,CAAC;AACpE;AAEA,SAAS,wBACP,QACA,UACQ;CACR,OAAO,SAAS,8BAA8B,QAAQ;AACxD;AAEA,IAAM,sBAAsB;;AAE5B,IAAM,2BAA2B;;AAEjC,IAAM,2BAA2B;;AAEjC,IAAM,sBAAsB;AAC5B,IAAM,2CAA2B,IAAI,IAAI;CACvC;CACA;CACA;AACF,CAAC;;AAGD,SAAS,gBAAgB,SAAiD;CACxE,IAAI,YAAY,KAAA,GACd;CAEF,MAAM,OAAO,OAAO,YAAY,WAAW,QAAQ,KAAK,IAAI;CAC5D,IAAI,CAAC,MACH,MAAM,IAAI,MAAM,6CAA6C;CAE/D,OAAO;AACT;;;;;AAMA,SAAS,gBACP,eACA,UAI2B;CAC3B,MAAM,WAAW,cAAc,YAAY,CAAC;CAC5C,MAAM,cAAc,SAAS;CAC7B,IAAI,CAAC,eAAe,CAAC,UACnB,OAAO,CAAC;CAEV,MAAM,SAAS,UAAmC;EAChD,MAAM,SAAS,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI;EAC3D,OAAO,OAAO,WAAW,YAAY,OAAO,cAAc,MAAM,IAC5D,oCAAoC,QAAQ,QAAQ,IACpD,KAAA;CACN;CACA,OAAO;EACL,aAAa,MAAM,cAAc,MAAM;EACvC,eAAe,MAAM,SAAS,yBAAyB;EACvD,UAAU,MAAM,SAAS,oBAAoB;EAC7C,0BAA0B;CAC5B;AACF;AAEA,SAAS,qBAAqB,KAAmB;CAC/C,IAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,MAAM,IAC5C,MAAM,IAAI,MAAM,2CAA2C;AAE/D;;AAGA,SAAS,kBAAkB,OAAuB;CAChD,OAAO,MAAM,QAAQ,OAAO,MAAM,CAAC,CAAC,QAAQ,MAAM,KAAK;AACzD;AAEA,SAAS,wBACP,SACyC;CACzC,MAAM,SAAS,QAAQ,oBAAoB;CAC3C,IAAI,WAAW,kBAAkB,WAAW,wBAC1C,MAAM,IAAI,MAAM,yCAAyC,OAAO,EAAE;CAEpE,OAAO;AACT;;AAGA,SAAS,qBACP,UACA,UACoB;CACpB,IAAI,SAAS,aAAa,KAAA,KAAa,SAAS,aAAa,GAC3D;CAEF,IAAI,CAAC,OAAO,SAAS,SAAS,QAAQ,KAAK,SAAS,WAAW,GAC7D,MAAM,IAAI,MACR,iBAAiB,SAAS,YAAY,yCACxC;CAEF,MAAM,WAAW,wBAAwB,SAAS,UAAU,QAAQ;CAIpE,IAAI,WAHc,KAAK,MACrB,wBAAwB,SAAS,WAAW,QAAQ,IAAI,SAAS,QAEpD,GACb,MAAM,IAAI,MACR,iBAAiB,SAAS,YAAY,kCACxC;CAEF,OAAO,WAAW,IAAI,WAAW,KAAA;AACnC;AAEA,SAAS,kBACP,UACwC;CACxC,MAAM,EAAE,aAAa,cAAc;CACnC,IAAI,CAAC,eAAe,CAAC,WACnB;CAEF,IAAI,EAAE,uBAAuB,SAAS,EAAE,qBAAqB,OAC3D,MAAM,IAAI,MACR,iBAAiB,SAAS,YAAY,uCACxC;CAEF,IACE,OAAO,MAAM,YAAY,QAAQ,CAAC,KAClC,OAAO,MAAM,UAAU,QAAQ,CAAC,KAChC,UAAU,QAAQ,IAAI,YAAY,QAAQ,GAE1C,MAAM,IAAI,MACR,iBAAiB,SAAS,YAAY,gCACxC;CAEF,OAAO;EAAE,OAAO;EAAa,KAAK;CAAU;AAC9C;AAEA,SAAS,iBACP,eACA,UAcE;CACF,MAAM,QAAQ,cAAc;CAC5B,MAAM,SAAS,6BACb,cAAc,QACd,OAAO,IACT;CACA,MAAM,MAAM,gBAAgB,eAAe,QAAQ;CACnD,MAAM,cACJ,IAAI,gBACH,OAAO,cAAc,WAAW,WAC7B,oCAAoC,cAAc,QAAQ,QAAQ,IAClE,KAAA;CACN,OAAO;EACL,GAAG,WAAW,GAAG;EAEjB,GAAI,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,YAAY;EACnD;EACA,mBAAmB,cAAc;EACjC,yBAAyB,KAAK,cAAc,cAAc;EAC1D,aAAa,WAAW,cAAc,KAAA,IAAY,OAAO,QAAQ,KAAA;EACjE,aACE,WAAW,cAAc,KAAA,IAAY,OAAO,gBAAgB,KAAA;EAC9D,gBACE,WAAW,cAAc,KAAA,IAAY,OAAO,WAAW,KAAA;EACzD,KAAK,oBAAoB,aAAa;CACxC;AACF;;;;;;AAOA,SAAS,iBACP,eACA,UAOM;CACN,MAAM,WAAW,KAAK,cAAc,QAAQ;CAC5C,MAAM,gBAAgB,KAAK,cAAc,cAAc;CACvD,MAAM,WAAW,cAAc,YAAY,CAAC;CAC5C,MAAM,QAAQ,QAAQ,SAAS,yBAAyB;CAGxD,MAAM,kBAAkB,QACpB,OAAO,SAAS,yBAAyB,IACzC,cAAc;CAClB,IACE,UAAU,SAAS,gBACnB,oBAAoB,SAAS,iBAC5B,cAAc,YAAY,GAAA,CAAI,YAAY,MAAM,SAAS,YACzD,aAAa,KAAA,KAAa,aAAa,SAAS,sBAChD,SAAS,4BAA4B,KAAA,KACpC,kBAAkB,KAAA,KAClB,kBAAkB,SAAS,yBAE7B,MAAM,IAAI,MACR,2DAA2D,cAAc,GAAG,kCAC9E;AAEJ;;AAGA,SAAS,qBAAuC,OAAa;CAC3D,MAAM,OAAO,oBAAoB,KAAK;CACtC,KAAK,MAAM,OAAO,CAAC,kBAAkB,cAAc,GAAG;EACpD,MAAM,SAAS,KAAK;EACpB,IAAI,SAAS,MAAM,GACjB,KAAK,OAAO,oBAAoB,MAAM;CAE1C;CACA,OAAO;AACT;;;;;AAMA,SAAS,oBAAsC,OAAa;CAC1D,MAAM,EACJ,eAAe,SACf,aAAa,aACb,GAAG,SACD;CACJ,OAAO;AACT;AAEA,SAAS,6BACP,QACA,WACqB;CACrB,QAAQ,QAAR;EACE,KAAK,aACH,OAAO;EACT,KAAK;EACL,KAAK,oBACH,OAAO;EACT,KAAK;EACL,KAAK,yBACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,2BACH,OAAO,cAAc,4BACjB,oBACA;EACN,SACE,OAAO;CACX;AACF;AAEA,SAAS,kBACP,eACA,WACuB;CACvB,MAAM,QAAQ,cAAc;CAC5B,IAAI,SAAS,6BAA6B,cAAc,QAAQ,OAAO,IAAI;CAC3E,IAAI,cAAc,4BAA4B,SAAS;CACvD,IAAI,cAAc,2BAA2B,SAAS;CACtD,IAAI,cAAc,iCAChB,SACE,OAAO,SAAS,4BAA4B,oBAAoB;CAEpE,MAAM,WAAW,cAAc,WAC3B,cAAc,SAAS,YAAY,IACnC,KAAA;CACJ,MAAM,WAAW,EAAE,GAAI,cAAc,YAAY,CAAC,EAAG;CACrD,OAAO;EACL;EACA,mBAAmB,cAAc;EACjC,oBAAoB,KAAK,cAAc,QAAQ;EAC/C,aACE,YAAY,OAAO,cAAc,WAAW,WACxC,oCAAoC,cAAc,QAAQ,QAAQ,IAClE,KAAA;EACN;EACA,GAAG,WAAW,gBAAgB,eAAe,QAAQ,CAAC;EACtD,WAAW,SAAS;EACpB,aAAa,WAAW,cAAc,KAAA,IAAY,OAAO,QAAQ,KAAA;EACjE,aACE,WAAW,cAAc,KAAA,IAAY,OAAO,gBAAgB,KAAA;EAC9D,gBACE,WAAW,cAAc,KAAA,IAAY,OAAO,WAAW,KAAA;EACzD;CACF;AACF;AAEA,SAAS,WACP,QACwB;CACxB,MAAM,EAAE,aAAa,SAAS,GAAG,SAAS;CAC1C,OAAO;AACT;AAEA,SAAS,KACP,OACoB;CACpB,IAAI,OAAO,UAAU,UACnB,OAAO,SAAS,KAAA;CAElB,OAAO,OAAO,MAAM,KAAA;AACtB;AAEA,SAAS,MACP,OACA,SACe;CACf,OAAO,QAAQ,MAAM,cAAc,cAAc,KAAK;AACxD;AAMA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,sBAAsB,UAA0B;CACvD,MAAM,OAAO,OAAO,YAAY,EAAE,CAAC,CAChC,KAAK,CAAC,CACN,YAAY;CACf,IAAI,CAAC,aAAa,KAAK,IAAI,GACzB,MAAM,IAAI,MAAM,aAAa,SAAS,8BAA8B;CAEtE,OAAO;AACT;;AAGA,IAAM,8CAA8B,IAAI,IAAI;CAC1C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AACD,IAAM,+CAA+B,IAAI,IAAI;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AACD,IAAM,8CAA8B,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC;;;;;;;AAQ1D,SAAS,qBAAqB,UAA0B;CACtD,IAAI,4BAA4B,IAAI,QAAQ,GAAG,OAAO;CACtD,IAAI,6BAA6B,IAAI,QAAQ,GAAG,OAAO;CACvD,IAAI,4BAA4B,IAAI,QAAQ,GAAG,OAAO;CACtD,OAAO;AACT;;;;;AAMA,SAAS,yBACP,aACA,UACQ;CACR,IAAI,CAAC,OAAO,cAAc,WAAW,GACnC,MAAM,IAAI,MACR,UAAU,YAAY,8CACxB;CAEF,MAAM,MAAM,MAAM,qBAAqB,QAAQ;CAC/C,MAAM,SAAS,8BAA8B,QAAQ;CACrD,IAAI,UAAU,KACZ,OAAO,eAAe,SAAS;CAEjC,MAAM,UAAU,MAAM;CACtB,IAAI,cAAc,YAAY,GAC5B,MAAM,IAAI,MACR,UAAU,YAAY,GAAG,SAAS,4DACpC;CAEF,OAAO,cAAc;AACvB;AAEA,SAAS,oCACP,QACA,UACoB;CACpB,IAAI,CAAC,OAAO,cAAc,MAAM,GAC9B;CAIF,MAAM,MAAM,MAAM,qBAAqB,QAAQ;CAC/C,MAAM,SAAS,8BAA8B,QAAQ;CACrD,MAAM,QAAS,SAAS,MAAO;CAC/B,OAAO,OAAO,cAAc,KAAK,IAAI,QAAQ,KAAA;AAC/C;AAMA,SAAS,cAAc,MAAoB;CACzC,OAAO,KAAK,MAAM,KAAK,QAAQ,IAAI,GAAI;AACzC;AAEA,SAAS,WAAW,OAAyC;CAC3D,OAAO,UAAU,QAAQ,UAAU,KAAA,IAC/B,KAAA,oBACA,IAAI,KAAK,QAAQ,GAAI;AAC3B;AAEA,SAAS,MAAM,IAA2B;CACxC,OAAO,IAAI,SAAS,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD"}
|
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-
|
|
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;
|
|
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
|
/**
|
|
@@ -389,6 +396,11 @@ export interface ExternalInvoice extends ExternalRecord {
|
|
|
389
396
|
*/
|
|
390
397
|
status: 'draft' | 'sent' | 'viewed' | 'paid' | 'overdue' | 'voided' | 'uncollectible';
|
|
391
398
|
currency: string;
|
|
399
|
+
/**
|
|
400
|
+
* The invoice was closed as paid outside the provider (Stripe
|
|
401
|
+
* `paid_out_of_band`), for example after a payment on another rail.
|
|
402
|
+
*/
|
|
403
|
+
paidOutOfBand?: boolean;
|
|
392
404
|
}
|
|
393
405
|
/**
|
|
394
406
|
* External vendor from provider
|
|
@@ -488,8 +500,32 @@ export interface SavedPaymentMethodChargeInput {
|
|
|
488
500
|
idempotencyKey: string;
|
|
489
501
|
/** Statement/description text shown to the customer where supported. */
|
|
490
502
|
description?: string;
|
|
491
|
-
/**
|
|
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
|
+
*/
|
|
492
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;
|
|
493
529
|
}
|
|
494
530
|
export interface SavedPaymentMethodChargeResult {
|
|
495
531
|
status: PaymentChargeStatus;
|
|
@@ -498,10 +534,29 @@ export interface SavedPaymentMethodChargeResult {
|
|
|
498
534
|
paymentExternalId?: string;
|
|
499
535
|
customerExternalId: string;
|
|
500
536
|
paymentMethodExternalId?: string;
|
|
501
|
-
/**
|
|
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
|
+
*/
|
|
502
543
|
amountMinor: number;
|
|
503
544
|
/** Upper-case ISO 4217 code. */
|
|
504
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;
|
|
505
560
|
/** The caller's `idempotencyKey`. */
|
|
506
561
|
chargeKey: string;
|
|
507
562
|
/** Provider failure code (for example `card_declined`, `authentication_required`). */
|
|
@@ -520,10 +575,19 @@ export interface WebhookPaymentSummary {
|
|
|
520
575
|
status: PaymentChargeStatus;
|
|
521
576
|
paymentExternalId: string;
|
|
522
577
|
customerExternalId?: string;
|
|
523
|
-
/**
|
|
578
|
+
/**
|
|
579
|
+
* Integer minor units charged (including tax for an `automaticTax`
|
|
580
|
+
* charge), when the provider amount converts exactly.
|
|
581
|
+
*/
|
|
524
582
|
amountMinor?: number;
|
|
525
583
|
/** Upper-case ISO 4217 code. */
|
|
526
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;
|
|
527
591
|
/** `idempotencyKey` of the `chargeSavedPaymentMethod` call that created it. */
|
|
528
592
|
chargeKey?: string;
|
|
529
593
|
failureCode?: string;
|
|
@@ -556,6 +620,13 @@ export interface StripeCheckoutPriceData {
|
|
|
556
620
|
* session sets `automaticTax`.
|
|
557
621
|
*/
|
|
558
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;
|
|
559
630
|
product?: string;
|
|
560
631
|
productName?: string;
|
|
561
632
|
recurring?: StripeRecurringPriceData;
|
|
@@ -815,6 +886,14 @@ export interface InvoiceOperations {
|
|
|
815
886
|
* the concept omit it.
|
|
816
887
|
*/
|
|
817
888
|
markUncollectible?(externalId: string): Promise<void>;
|
|
889
|
+
/**
|
|
890
|
+
* Close an invoice as paid outside the provider, stopping its collection
|
|
891
|
+
* (emails, dunning, automatic charges). Idempotent: an invoice already
|
|
892
|
+
* closed this way, or paid with nothing collected (zero total or credit
|
|
893
|
+
* balance), is a no-op; one the provider collected money for itself
|
|
894
|
+
* throws. Optional: providers without the concept omit it.
|
|
895
|
+
*/
|
|
896
|
+
markPaidOutOfBand?(externalId: string): Promise<void>;
|
|
818
897
|
}
|
|
819
898
|
/**
|
|
820
899
|
* Vendor operations interface
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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.
|
|
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.
|
|
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-DvSZ3fGk.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 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 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 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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"}
|