@fantastic.dev/better-stripe 0.12.0 → 0.14.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/CHANGELOG.md +24 -0
- package/README.md +93 -8
- package/dist/client/connect/disputes.d.ts +20 -0
- package/dist/client/connect/disputes.d.ts.map +1 -1
- package/dist/client/connect/disputes.js +55 -0
- package/dist/client/connect/disputes.js.map +1 -1
- package/dist/client/costRecovery-invoices.d.ts +44 -0
- package/dist/client/costRecovery-invoices.d.ts.map +1 -0
- package/dist/client/costRecovery-invoices.js +109 -0
- package/dist/client/costRecovery-invoices.js.map +1 -0
- package/dist/client/costRecovery.d.ts +59 -2
- package/dist/client/costRecovery.d.ts.map +1 -1
- package/dist/client/costRecovery.js +73 -2
- package/dist/client/costRecovery.js.map +1 -1
- package/dist/client/errors.d.ts +1 -1
- package/dist/client/errors.d.ts.map +1 -1
- package/dist/client/errors.js.map +1 -1
- package/dist/client/index.d.ts +5 -14
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +4 -8
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/component.d.ts +137 -0
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/costRecovery/claims.d.ts +12 -0
- package/dist/component/costRecovery/claims.d.ts.map +1 -1
- package/dist/component/costRecovery/claims.js +15 -8
- package/dist/component/costRecovery/claims.js.map +1 -1
- package/dist/component/costRecovery/completion.d.ts +6 -0
- package/dist/component/costRecovery/completion.d.ts.map +1 -1
- package/dist/component/costRecovery/helpers.d.ts +6 -0
- package/dist/component/costRecovery/helpers.d.ts.map +1 -1
- package/dist/component/costRecovery/imports.d.ts +53 -0
- package/dist/component/costRecovery/imports.d.ts.map +1 -0
- package/dist/component/costRecovery/imports.js +67 -0
- package/dist/component/costRecovery/imports.js.map +1 -0
- package/dist/component/costRecovery/mutations.d.ts +119 -0
- package/dist/component/costRecovery/mutations.d.ts.map +1 -1
- package/dist/component/costRecovery/mutations.js +64 -1
- package/dist/component/costRecovery/mutations.js.map +1 -1
- package/dist/component/costRecovery/queries.d.ts +18 -0
- package/dist/component/costRecovery/queries.d.ts.map +1 -1
- package/dist/component/costRecovery/reservations.d.ts +12 -0
- package/dist/component/costRecovery/reservations.d.ts.map +1 -1
- package/dist/component/costRecovery/schema.d.ts +116 -4
- package/dist/component/costRecovery/schema.d.ts.map +1 -1
- package/dist/component/costRecovery/schema.js +19 -0
- package/dist/component/costRecovery/schema.js.map +1 -1
- package/dist/component/schema.d.ts +36 -2
- package/dist/react/workflows/Collections.d.ts.map +1 -1
- package/dist/react/workflows/Collections.js +2 -1
- package/dist/react/workflows/Collections.js.map +1 -1
- package/dist/react/workflows/EvidenceUpload.d.ts +18 -0
- package/dist/react/workflows/EvidenceUpload.d.ts.map +1 -0
- package/dist/react/workflows/EvidenceUpload.js +35 -0
- package/dist/react/workflows/EvidenceUpload.js.map +1 -0
- package/dist/react/workflows/Onboarding.d.ts +3 -3
- package/dist/react/workflows/Onboarding.d.ts.map +1 -1
- package/dist/react/workflows/Onboarding.js +8 -6
- package/dist/react/workflows/Onboarding.js.map +1 -1
- package/dist/react/workflows/Refunds.d.ts +14 -3
- package/dist/react/workflows/Refunds.d.ts.map +1 -1
- package/dist/react/workflows/Refunds.js +58 -16
- package/dist/react/workflows/Refunds.js.map +1 -1
- package/dist/react/workflows/index.d.ts +5 -1
- package/dist/react/workflows/index.d.ts.map +1 -1
- package/dist/react/workflows/index.js +3 -1
- package/dist/react/workflows/index.js.map +1 -1
- package/dist/react/workflows/refund-preview.d.ts +16 -0
- package/dist/react/workflows/refund-preview.d.ts.map +1 -0
- package/dist/react/workflows/refund-preview.js +38 -0
- package/dist/react/workflows/refund-preview.js.map +1 -0
- package/dist/react/workflows/useWorkflowAction.d.ts +1 -1
- package/dist/react/workflows/useWorkflowAction.d.ts.map +1 -1
- package/dist/react/workflows/useWorkflowAction.js +6 -2
- package/dist/react/workflows/useWorkflowAction.js.map +1 -1
- package/docs/react-workflows.md +121 -4
- package/package.json +1 -1
- package/src/client/connect/dispute-upload.test.ts +208 -0
- package/src/client/connect/disputes.ts +103 -0
- package/src/client/costRecovery-import.test.ts +174 -0
- package/src/client/costRecovery-invoices.test.ts +470 -0
- package/src/client/costRecovery-invoices.transport.test.ts +107 -0
- package/src/client/costRecovery-invoices.ts +176 -0
- package/src/client/costRecovery.ts +123 -2
- package/src/client/errors.ts +1 -0
- package/src/client/index.ts +15 -14
- package/src/component/_generated/api.ts +2 -0
- package/src/component/_generated/component.ts +164 -0
- package/src/component/costRecovery/claims.ts +18 -8
- package/src/component/costRecovery/imports.ts +74 -0
- package/src/component/costRecovery/mutations.ts +80 -0
- package/src/component/costRecovery/schema.ts +21 -0
- package/src/react/workflows/Collections.test.tsx +36 -0
- package/src/react/workflows/Collections.tsx +3 -1
- package/src/react/workflows/EvidenceUpload.test.tsx +56 -0
- package/src/react/workflows/EvidenceUpload.tsx +71 -0
- package/src/react/workflows/Onboarding.test.tsx +73 -0
- package/src/react/workflows/Onboarding.tsx +8 -5
- package/src/react/workflows/Refunds.currency.test.tsx +290 -0
- package/src/react/workflows/Refunds.tsx +115 -25
- package/src/react/workflows/index.ts +11 -1
- package/src/react/workflows/refund-preview.test.ts +65 -0
- package/src/react/workflows/refund-preview.ts +56 -0
- package/src/react/workflows/useWorkflowAction.ts +6 -1
package/CHANGELOG.md
CHANGED
|
@@ -14,6 +14,30 @@
|
|
|
14
14
|
- Remove internal tracker references from public documentation and add a
|
|
15
15
|
regression check that prevents their reintroduction.
|
|
16
16
|
|
|
17
|
+
## [0.14.0](https://github.com/FantasticDevHQ/better-stripe/compare/v0.13.0...v0.14.0) (2026-10-15)
|
|
18
|
+
|
|
19
|
+
### Features
|
|
20
|
+
|
|
21
|
+
- bind dispute evidence uploads and guard onboarding navigation ([#167](https://github.com/FantasticDevHQ/better-stripe/issues/167)) ([e52cd5d](https://github.com/FantasticDevHQ/better-stripe/commit/e52cd5dfc34d3c83a00d2f1686d07af5370b1e60))
|
|
22
|
+
- **recovery:** preserve verified opening collections ([#163](https://github.com/FantasticDevHQ/better-stripe/issues/163)) ([e613ac0](https://github.com/FantasticDevHQ/better-stripe/commit/e613ac0d52d1d053b4e3a54dd0394ad1e427c729))
|
|
23
|
+
|
|
24
|
+
### Bug Fixes
|
|
25
|
+
|
|
26
|
+
- **recovery:** release unbound void invoice reservations ([#165](https://github.com/FantasticDevHQ/better-stripe/issues/165)) ([a73fd89](https://github.com/FantasticDevHQ/better-stripe/commit/a73fd893370688385fcf9dc2a8dd309d2cbd3ead))
|
|
27
|
+
|
|
28
|
+
## [0.13.0](https://github.com/FantasticDevHQ/better-stripe/compare/v0.12.0...v0.13.0) (2026-10-15)
|
|
29
|
+
|
|
30
|
+
### Features
|
|
31
|
+
|
|
32
|
+
- **recovery:** reconcile seller cost invoice adjustments ([#159](https://github.com/FantasticDevHQ/better-stripe/issues/159)) ([d1ffdbc](https://github.com/FantasticDevHQ/better-stripe/commit/d1ffdbcb224b6c31ae958c576a4bcd6ff4a0a4dd))
|
|
33
|
+
|
|
34
|
+
### Bug Fixes
|
|
35
|
+
|
|
36
|
+
- **example:** bind reversal inputs to original charge currency ([#160](https://github.com/FantasticDevHQ/better-stripe/issues/160)) ([6b86926](https://github.com/FantasticDevHQ/better-stripe/commit/6b86926c7d4a173babd2964d4eee086f61c48f63))
|
|
37
|
+
- **example:** reconcile unsettled disputed sources ([#161](https://github.com/FantasticDevHQ/better-stripe/issues/161)) ([9c732bd](https://github.com/FantasticDevHQ/better-stripe/commit/9c732bdc88555210d2172067e6bbf5d2fc513190))
|
|
38
|
+
- **react:** isolate refund preview amounts by currency and status ([#162](https://github.com/FantasticDevHQ/better-stripe/issues/162)) ([601d509](https://github.com/FantasticDevHQ/better-stripe/commit/601d50923dc98f212b29fd4e4e3d856dfffbda44))
|
|
39
|
+
- **react:** preserve original refund currency units ([#157](https://github.com/FantasticDevHQ/better-stripe/issues/157)) ([494827f](https://github.com/FantasticDevHQ/better-stripe/commit/494827f1cb35b0b0ca10b1c6da38a1095bb32500))
|
|
40
|
+
|
|
17
41
|
## [0.12.0](https://github.com/FantasticDevHQ/better-stripe/compare/v0.11.0...v0.12.0) (2026-10-15)
|
|
18
42
|
|
|
19
43
|
### Features
|
package/README.md
CHANGED
|
@@ -38,7 +38,7 @@ See the [customer preview setup and webhook migration guide](docs/accounts-v2-pr
|
|
|
38
38
|
|
|
39
39
|
## Status
|
|
40
40
|
|
|
41
|
-
**Version**: `0.
|
|
41
|
+
**Version**: `0.14.0` <!-- x-release-please-version --> (pre-1.0). API may change between minor versions until 1.0.
|
|
42
42
|
|
|
43
43
|
Used in production by its authors. Webhook pipeline is covered by unit tests and a live E2E harness (`npm run e2e:webhooks`) that fires real Stripe-signed events and asserts the ledger.
|
|
44
44
|
|
|
@@ -337,9 +337,10 @@ Methods named `get<Entity>` take the component document ID (exception: `getInvoi
|
|
|
337
337
|
|
|
338
338
|
### Durable recovery claims
|
|
339
339
|
|
|
340
|
-
`stripe.costRecovery` is a server-only
|
|
341
|
-
component.
|
|
342
|
-
|
|
340
|
+
`stripe.costRecovery` is a server-only recovery client backed by the Convex
|
|
341
|
+
component. Bookkeeping methods do not use Stripe credentials or move money.
|
|
342
|
+
Invoice methods use the configured Stripe client and must run in an action.
|
|
343
|
+
Your host authenticates the
|
|
343
344
|
caller, approves which costs are owed, authorizes the account and recovery scope,
|
|
344
345
|
and verifies provider outcomes before confirming collection. A recovery scope is
|
|
345
346
|
an application-defined liability boundary, such as one store. Amounts are signed
|
|
@@ -410,15 +411,99 @@ cumulative principal. This records a separate, source-linked rollback claim,
|
|
|
410
411
|
preserves the original costs and collection history, and rounds positive and
|
|
411
412
|
negative amounts symmetrically. Reinstated principal can reduce the rollback
|
|
412
413
|
again with a newer revision. This bookkeeping operation does not refund or
|
|
413
|
-
reverse a transfer.
|
|
414
|
-
|
|
414
|
+
reverse a transfer. For invoice groups, use the verified funding adapter below;
|
|
415
|
+
do not invent invoice payment allocations.
|
|
415
416
|
|
|
416
417
|
Use `balance(ctx, scope)` for exact maintained totals and
|
|
417
418
|
`listClaims(ctx, { ...scope, limit, cursor })` for paginated history. `getClaim`, `getGroup` and
|
|
418
419
|
`getReservation` resume durable workflows. Integrate these server callbacks with
|
|
419
420
|
the existing unstyled React `CostRecovery` display. These bookkeeping APIs leave
|
|
420
|
-
consent, provider fee policy and entitlement changes in the host
|
|
421
|
-
|
|
421
|
+
consent, provider fee policy and entitlement changes in the host.
|
|
422
|
+
|
|
423
|
+
### Importing opening recovery balances
|
|
424
|
+
|
|
425
|
+
When moving an existing ledger into the component, your server can call
|
|
426
|
+
`stripe.costRecovery.importClaim(ctx, { ...observation, operationKey, collectedAmount })`.
|
|
427
|
+
The observation includes the authorized account/scope/currency, original charge,
|
|
428
|
+
gross and processing fee, approved cumulative amount due and a durable revision.
|
|
429
|
+
`collectedAmount` is the signed amount already verified as collected before the
|
|
430
|
+
cutover. The component retains that opening snapshot and computes outstanding as
|
|
431
|
+
amount due minus the imported collection. It does not create a Stripe payment.
|
|
432
|
+
|
|
433
|
+
Quiesce the old ledger's writers and verify its invoice and payout outcomes first.
|
|
434
|
+
An unpaid invoice is a reservation, not a collection; an unknown provider outcome
|
|
435
|
+
must stay held until reconciled. Do not import those amounts as collected or
|
|
436
|
+
silently release them. Authorize source identity and original provider economics
|
|
437
|
+
in the host before invoking this server-only bookkeeping operation.
|
|
438
|
+
|
|
439
|
+
Use one stable import operation key per claim. A replay returns the current claim
|
|
440
|
+
even after later observations or collections, without resetting its opening
|
|
441
|
+
amount. Changing the opening snapshot or source binding, reusing an operation key
|
|
442
|
+
for another claim, importing over a normal live claim, or introducing a new
|
|
443
|
+
opening balance while the scope has a pending external recovery group is rejected.
|
|
444
|
+
Signed credit collections and currencies stay separate. New observations continue
|
|
445
|
+
through `recordClaim` with newer durable revisions.
|
|
446
|
+
|
|
447
|
+
### Invoice recovery adjustments
|
|
448
|
+
|
|
449
|
+
After authorizing the seller, invoice and liability scope, reserve with
|
|
450
|
+
`sourceKind: "invoice"` and `sourceId: invoiceId`. Allocate bounded batches and
|
|
451
|
+
seal the group before calling Stripe. Then attach exactly one signed adjustment
|
|
452
|
+
for the entire group:
|
|
453
|
+
|
|
454
|
+
```ts
|
|
455
|
+
const receipt = await recovery.attachInvoice(ctx, { ...scope, groupKey });
|
|
456
|
+
// Invoke from your invoice lifecycle reconciliation, and repeat bounded completion
|
|
457
|
+
// until isDone after payment or release.
|
|
458
|
+
const result = await recovery.reconcileInvoice(ctx, {
|
|
459
|
+
...scope,
|
|
460
|
+
groupKey,
|
|
461
|
+
releaseUncollectible: false,
|
|
462
|
+
});
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
The invoice must belong to the authorized customer account, use the same currency,
|
|
466
|
+
and be draft before a new item is created. The package stores its stable group
|
|
467
|
+
identity before the provider call, uses that identity as the idempotency key and
|
|
468
|
+
item metadata, and persists the resulting item ID. Every retry scans all items
|
|
469
|
+
on that exact invoice, recovering a successful creation even if the subsequent
|
|
470
|
+
database write failed or the provider idempotency key expired. A bound item that
|
|
471
|
+
has been deleted, changed or duplicated requires reconciliation; the package
|
|
472
|
+
never silently recreates it. Negative adjustments are credits. Items are not
|
|
473
|
+
discountable.
|
|
474
|
+
|
|
475
|
+
Your host must durably serialize provider operations for each group, including
|
|
476
|
+
attachment and any calls that finish or release it. Never release a reservation
|
|
477
|
+
after a timeout or unknown provider outcome. Draft and open invoices retain their
|
|
478
|
+
reservations, blocking recovery from a second payout. A verified paid invoice
|
|
479
|
+
commits collection; a verified void releases the obligation for a future boundary.
|
|
480
|
+
If an invoice is voided before its adjustment was attached, reconciliation releases
|
|
481
|
+
an unbound sealed group only after scanning every item on that exact invoice.
|
|
482
|
+
The receipt then has `invoiceItemId: null`. A missing previously bound item, or
|
|
483
|
+
an absent adjustment on a paid or unpaid invoice, remains an error and keeps
|
|
484
|
+
reservations held.
|
|
485
|
+
Uncollectible invoices stay reserved unless your explicit host policy passes
|
|
486
|
+
`releaseUncollectible: true`. Do not use that policy while another process might
|
|
487
|
+
retry payment on the original invoice. Subscription cancellation alone does not
|
|
488
|
+
prove its invoices were voided. These methods never attempt card fallback or
|
|
489
|
+
change a payout schedule.
|
|
490
|
+
|
|
491
|
+
For a collected invoice fully funded by one PaymentIntent, call
|
|
492
|
+
`rollbackInvoice(ctx, { ...scope, groupKey, revision })`. It checks the paid
|
|
493
|
+
invoice, completely paginates its payments, verifies the funding charge and its
|
|
494
|
+
refund/dispute transactions, retains the original funding economics, and records
|
|
495
|
+
a separate proportional rollback claim. Use a durable revision captured before
|
|
496
|
+
provider reconciliation, and retry the full read on revision conflicts. Original
|
|
497
|
+
cost claims remain intact. Multiple payments, partial allocations, mixed customer
|
|
498
|
+
credits and non-PaymentIntent funding return
|
|
499
|
+
`{ status: "not_ready", reason: "invoice_funding_allocation_required" }` without
|
|
500
|
+
changing claims. Provider processing costs can also return their documented
|
|
501
|
+
not-ready reasons. Those cases need a host-approved allocation policy rather than
|
|
502
|
+
guessed amounts. Invoice integration in the example is a separate migration.
|
|
503
|
+
|
|
504
|
+
Provider methods preserve the configured API version and propagate Stripe errors.
|
|
505
|
+
See Stripe's [invoice item creation](https://docs.stripe.com/api/invoiceitems/create)
|
|
506
|
+
and [invoice item pagination](https://docs.stripe.com/api/invoiceitems/list).
|
|
422
507
|
|
|
423
508
|
### Refund and dispute processing costs
|
|
424
509
|
|
|
@@ -66,6 +66,26 @@ export declare function updateDispute(stripe: Stripe, component: Component, ctx:
|
|
|
66
66
|
}): Promise<{
|
|
67
67
|
success: true;
|
|
68
68
|
}>;
|
|
69
|
+
/** File fields supported by Stripe dispute evidence. */
|
|
70
|
+
export type DisputeEvidenceFileField = "cancellation_policy" | "customer_communication" | "customer_signature" | "duplicate_charge_documentation" | "receipt" | "refund_policy" | "service_documentation" | "shipping_documentation" | "uncategorized_file";
|
|
71
|
+
export type DisputeEvidenceUploadOptions = {
|
|
72
|
+
stripeDisputeId: string;
|
|
73
|
+
/** Derive this on the server from the authenticated session. */
|
|
74
|
+
actor: RefundActor;
|
|
75
|
+
field: DisputeEvidenceFileField;
|
|
76
|
+
file: {
|
|
77
|
+
data: Uint8Array;
|
|
78
|
+
name: string;
|
|
79
|
+
type: "application/pdf" | "image/jpeg" | "image/png";
|
|
80
|
+
};
|
|
81
|
+
/** Request account owning the charge, distinct from the seller actor. */
|
|
82
|
+
stripeAccountId?: string;
|
|
83
|
+
};
|
|
84
|
+
/** Upload and attach to one authorized dispute as a draft. Never submits. */
|
|
85
|
+
export declare function uploadDisputeEvidence(stripe: Stripe, component: Component, ctx: RunCtx, opts: DisputeEvidenceUploadOptions): Promise<{
|
|
86
|
+
stripeFileId: string;
|
|
87
|
+
stripeDisputeId: string;
|
|
88
|
+
}>;
|
|
69
89
|
/**
|
|
70
90
|
* Accept a dispute (concede the chargeback). Irreversible.
|
|
71
91
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disputes.d.ts","sourceRoot":"","sources":["../../../src/client/connect/disputes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAE3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EACV,sBAAsB,EAEvB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,KAAK,WAAW,EAAsB,MAAM,kBAAkB,CAAC;AAExE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAUpD,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE,GAChC,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAKxC;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,GAC5C,OAAO,CACN,CAAC,sBAAsB,GAAG;IACxB,SAAS,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC;CACxD,CAAC,GACF,IAAI,CACP,CASA;AAED,wBAAsB,YAAY,CAChC,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE;IACL,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,sBAAsB,EAAE,CAAC,CASnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IACJ,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,GACA,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,CAAC,CA0B5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IACJ,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,GACA,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,CAAC,CAgB5B;AAiED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wFAAwF;IACxF,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,GAAG,OAAO,QAAQ,EAAE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAqBvD;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,GAAG,GAAE,IAAiB,GACrB;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAWhE"}
|
|
1
|
+
{"version":3,"file":"disputes.d.ts","sourceRoot":"","sources":["../../../src/client/connect/disputes.ts"],"names":[],"mappings":"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"}
|
|
@@ -82,6 +82,61 @@ export async function updateDispute(stripe, component, ctx, opts) {
|
|
|
82
82
|
throwStripeError("DISPUTE_UPDATE_FAILED", "Failed to update dispute", err);
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
|
+
/** Upload and attach to one authorized dispute as a draft. Never submits. */
|
|
86
|
+
export async function uploadDisputeEvidence(stripe, component, ctx, opts) {
|
|
87
|
+
if (!opts.actor ||
|
|
88
|
+
!["admin", "seller"].includes(opts.actor.type) ||
|
|
89
|
+
(opts.actor.type === "seller" &&
|
|
90
|
+
(typeof opts.actor.accountId !== "string" ||
|
|
91
|
+
!opts.actor.accountId.trim())))
|
|
92
|
+
throwStripeError("DISPUTE_UNAUTHORIZED", "Dispute upload requires an authenticated actor");
|
|
93
|
+
await assertDisputeAuthorized(component, ctx, opts);
|
|
94
|
+
const fields = [
|
|
95
|
+
"cancellation_policy",
|
|
96
|
+
"customer_communication",
|
|
97
|
+
"customer_signature",
|
|
98
|
+
"duplicate_charge_documentation",
|
|
99
|
+
"receipt",
|
|
100
|
+
"refund_policy",
|
|
101
|
+
"service_documentation",
|
|
102
|
+
"shipping_documentation",
|
|
103
|
+
"uncategorized_file",
|
|
104
|
+
];
|
|
105
|
+
const { data, name, type } = opts.file;
|
|
106
|
+
const signature = type === "application/pdf"
|
|
107
|
+
? [37, 80, 68, 70, 45]
|
|
108
|
+
: type === "image/jpeg"
|
|
109
|
+
? [255, 216, 255]
|
|
110
|
+
: type === "image/png"
|
|
111
|
+
? [137, 80, 78, 71, 13, 10, 26, 10]
|
|
112
|
+
: [];
|
|
113
|
+
if (!fields.includes(opts.field) ||
|
|
114
|
+
!(data instanceof Uint8Array) ||
|
|
115
|
+
!data.byteLength ||
|
|
116
|
+
data.byteLength > 5_000_000 ||
|
|
117
|
+
!name.trim() ||
|
|
118
|
+
!signature.length ||
|
|
119
|
+
!signature.every((byte, i) => data[i] === byte))
|
|
120
|
+
throwStripeError("INVALID_CONFIGURATION", "Invalid dispute evidence: use a nonempty PDF, JPEG or PNG up to 5 MB with a matching MIME type and filename");
|
|
121
|
+
let stripeFileId;
|
|
122
|
+
try {
|
|
123
|
+
const file = await stripe.files.create({ purpose: "dispute_evidence", file: { data, name, type } }, opts.stripeAccountId
|
|
124
|
+
? { stripeAccount: opts.stripeAccountId }
|
|
125
|
+
: undefined);
|
|
126
|
+
stripeFileId = file.id;
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
throwStripeError("DISPUTE_UPLOAD_FAILED", "Failed to upload dispute evidence", err);
|
|
130
|
+
}
|
|
131
|
+
await updateDispute(stripe, component, ctx, {
|
|
132
|
+
stripeDisputeId: opts.stripeDisputeId,
|
|
133
|
+
actor: opts.actor,
|
|
134
|
+
stripeAccountId: opts.stripeAccountId,
|
|
135
|
+
evidence: { [opts.field]: stripeFileId },
|
|
136
|
+
submit: false,
|
|
137
|
+
});
|
|
138
|
+
return { stripeFileId, stripeDisputeId: opts.stripeDisputeId };
|
|
139
|
+
}
|
|
85
140
|
/**
|
|
86
141
|
* Accept a dispute (concede the chargeback). Irreversible.
|
|
87
142
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disputes.js","sourceRoot":"","sources":["../../../src/client/connect/disputes.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"disputes.js","sourceRoot":"","sources":["../../../src/client/connect/disputes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type Stripe from "stripe";
|
|
2
|
+
import type { RecoveryGroup, RecoveryScope } from "./costRecovery.js";
|
|
3
|
+
export type RecoveryInvoiceOptions = RecoveryScope & {
|
|
4
|
+
groupKey: string;
|
|
5
|
+
};
|
|
6
|
+
type InvoiceReceipt = {
|
|
7
|
+
group: RecoveryGroup;
|
|
8
|
+
invoiceItemId: string;
|
|
9
|
+
invoiceStatus: Stripe.Invoice["status"];
|
|
10
|
+
};
|
|
11
|
+
type BindInvoiceItem = (invoiceItemId: string) => Promise<RecoveryGroup>;
|
|
12
|
+
/** Attachment always produces an item; reconciliation can release an unbound void invoice. */
|
|
13
|
+
export declare function attachRecoveryInvoice(stripe: Stripe, group: RecoveryGroup | null, opts: RecoveryInvoiceOptions, bind: BindInvoiceItem, create?: true): Promise<InvoiceReceipt>;
|
|
14
|
+
export declare function attachRecoveryInvoice(stripe: Stripe, group: RecoveryGroup | null, opts: RecoveryInvoiceOptions, bind: BindInvoiceItem, create: false): Promise<InvoiceReceipt | (Omit<InvoiceReceipt, "invoiceItemId"> & {
|
|
15
|
+
invoiceItemId: null;
|
|
16
|
+
})>;
|
|
17
|
+
/** Refuse ambiguous cash/credit or multi-payment allocations instead of inventing economics. */
|
|
18
|
+
export declare function readInvoiceFunding(stripe: Stripe, group: RecoveryGroup): Promise<{
|
|
19
|
+
status: "not_ready";
|
|
20
|
+
paymentIntentId: string;
|
|
21
|
+
reason: import("./index.js").ProcessingCostNotReadyReason;
|
|
22
|
+
} | {
|
|
23
|
+
status: "ready";
|
|
24
|
+
paymentIntentId: string;
|
|
25
|
+
chargeId: string;
|
|
26
|
+
currency: string;
|
|
27
|
+
gross: number;
|
|
28
|
+
metadata: Record<string, string>;
|
|
29
|
+
processingFee: number;
|
|
30
|
+
refundFeeAdjustment: number;
|
|
31
|
+
disputeFeeAdjustment: number;
|
|
32
|
+
netFees: number;
|
|
33
|
+
refundedPrincipal: number;
|
|
34
|
+
disputedPrincipal: number;
|
|
35
|
+
principalReturned: number;
|
|
36
|
+
refunds: import("./index.js").ProcessingCostRecord[];
|
|
37
|
+
disputes: import("./index.js").ProcessingCostRecord[];
|
|
38
|
+
transactions: import("./index.js").ProcessingCostTransaction[];
|
|
39
|
+
} | {
|
|
40
|
+
status: "not_ready";
|
|
41
|
+
reason: "invoice_funding_allocation_required";
|
|
42
|
+
}>;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=costRecovery-invoices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"costRecovery-invoices.d.ts","sourceRoot":"","sources":["../../src/client/costRecovery-invoices.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACtE,MAAM,MAAM,sBAAsB,GAAG,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAK1E,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;CACzC,CAAC;AACF,KAAK,eAAe,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAEzE,8FAA8F;AAC9F,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,GAAG,IAAI,EAC3B,IAAI,EAAE,sBAAsB,EAC5B,IAAI,EAAE,eAAe,EACrB,MAAM,CAAC,EAAE,IAAI,GACZ,OAAO,CAAC,cAAc,CAAC,CAAC;AAC3B,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,GAAG,IAAI,EAC3B,IAAI,EAAE,sBAAsB,EAC5B,IAAI,EAAE,eAAe,EACrB,MAAM,EAAE,KAAK,GACZ,OAAO,CACN,cAAc,GACd,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,GAAG;IAAE,aAAa,EAAE,IAAI,CAAA;CAAE,CAAC,CACpE,CAAC;AAmGF,gGAAgG;AAChG,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa;;;;;;;;;;;;;;;;;;;;;;YA8B/D,WAAW;YACX,qCAAqC;GAYlD"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { getProcessingCostContext } from "./settlement/processingCosts.js";
|
|
2
|
+
const marker = "bsRecoveryGroup";
|
|
3
|
+
const id = (value) => typeof value === "string" ? value : value?.id;
|
|
4
|
+
/** One immutable item per sealed group. Host serializes provider operations per group. */
|
|
5
|
+
export async function attachRecoveryInvoice(stripe, group, opts, bind, create = true) {
|
|
6
|
+
if (!group ||
|
|
7
|
+
group.groupKey !== opts.groupKey ||
|
|
8
|
+
group.sourceKind !== "invoice" ||
|
|
9
|
+
group.accountId !== opts.accountId ||
|
|
10
|
+
group.scopeKey !== opts.scopeKey ||
|
|
11
|
+
group.currency !== opts.currency)
|
|
12
|
+
throw new Error("Recovery invoice scope does not match the authorized group.");
|
|
13
|
+
if (group.status === "open" ||
|
|
14
|
+
(create && ["released", "releasing"].includes(group.status)))
|
|
15
|
+
throw new Error("Invoice recovery group must be sealed and active.");
|
|
16
|
+
const invoice = await stripe.invoices.retrieve(group.sourceId);
|
|
17
|
+
if (invoice.id !== group.sourceId ||
|
|
18
|
+
invoice.customer_account !== group.accountId)
|
|
19
|
+
throw new Error("Recovery invoice ownership does not match.");
|
|
20
|
+
if (invoice.currency !== group.currency)
|
|
21
|
+
throw new Error("Recovery invoice currency does not match.");
|
|
22
|
+
let found;
|
|
23
|
+
for await (const item of stripe.invoiceItems.list({
|
|
24
|
+
invoice: invoice.id,
|
|
25
|
+
limit: 100,
|
|
26
|
+
})) {
|
|
27
|
+
if (item.metadata?.[marker] !== group._id)
|
|
28
|
+
continue;
|
|
29
|
+
if (found)
|
|
30
|
+
throw new Error("Duplicate recovery invoice items require reconciliation.");
|
|
31
|
+
if (id(item.invoice) !== invoice.id ||
|
|
32
|
+
item.customer_account !== group.accountId ||
|
|
33
|
+
item.currency !== group.currency ||
|
|
34
|
+
item.amount !== group.amount ||
|
|
35
|
+
item.discountable ||
|
|
36
|
+
(group.invoiceItemId && group.invoiceItemId !== item.id))
|
|
37
|
+
throw new Error("Recovery invoice item economics or identity do not match.");
|
|
38
|
+
found = item;
|
|
39
|
+
}
|
|
40
|
+
if (!found) {
|
|
41
|
+
if (group.invoiceItemId)
|
|
42
|
+
throw new Error("Bound recovery invoice item is missing; reconcile before retrying.");
|
|
43
|
+
if (!create &&
|
|
44
|
+
invoice.status === "void" &&
|
|
45
|
+
["sealed", "releasing", "released"].includes(group.status))
|
|
46
|
+
return { group, invoiceItemId: null, invoiceStatus: invoice.status };
|
|
47
|
+
if (!create)
|
|
48
|
+
throw new Error("Recovery invoice item is missing; no collection can be confirmed.");
|
|
49
|
+
if (group.status !== "sealed")
|
|
50
|
+
throw new Error("New recovery items require a sealed, uncompleted group.");
|
|
51
|
+
if (invoice.status !== "draft")
|
|
52
|
+
throw new Error("New recovery items require a draft invoice.");
|
|
53
|
+
found = await stripe.invoiceItems.create({
|
|
54
|
+
invoice: invoice.id,
|
|
55
|
+
customer_account: group.accountId,
|
|
56
|
+
currency: group.currency,
|
|
57
|
+
amount: group.amount,
|
|
58
|
+
discountable: false,
|
|
59
|
+
description: "Refund and dispute cost adjustment",
|
|
60
|
+
metadata: { [marker]: group._id },
|
|
61
|
+
}, { idempotencyKey: `better-stripe:recovery:${group._id}` });
|
|
62
|
+
}
|
|
63
|
+
const bound = group.invoiceItemId === found.id ? group : await bind(found.id);
|
|
64
|
+
return {
|
|
65
|
+
group: bound,
|
|
66
|
+
invoiceItemId: found.id,
|
|
67
|
+
invoiceStatus: invoice.status,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/** Refuse ambiguous cash/credit or multi-payment allocations instead of inventing economics. */
|
|
71
|
+
export async function readInvoiceFunding(stripe, group) {
|
|
72
|
+
const invoice = await stripe.invoices.retrieve(group.sourceId);
|
|
73
|
+
if (invoice.customer_account !== group.accountId ||
|
|
74
|
+
invoice.currency !== group.currency ||
|
|
75
|
+
invoice.status !== "paid")
|
|
76
|
+
throw new Error("Invoice funding ownership, currency or paid state does not match.");
|
|
77
|
+
const payments = [];
|
|
78
|
+
for await (const payment of stripe.invoicePayments.list({
|
|
79
|
+
invoice: group.sourceId,
|
|
80
|
+
limit: 100,
|
|
81
|
+
})) {
|
|
82
|
+
if (id(payment.invoice) !== group.sourceId ||
|
|
83
|
+
payment.currency !== group.currency)
|
|
84
|
+
throw new Error("Invoice payment identity or currency does not match.");
|
|
85
|
+
if (payment.status === "paid")
|
|
86
|
+
payments.push(payment);
|
|
87
|
+
}
|
|
88
|
+
const payment = payments[0];
|
|
89
|
+
if (payments.length !== 1 ||
|
|
90
|
+
payment?.payment.type !== "payment_intent" ||
|
|
91
|
+
!payment.payment.payment_intent ||
|
|
92
|
+
payment.amount_paid !== invoice.amount_paid)
|
|
93
|
+
return {
|
|
94
|
+
status: "not_ready",
|
|
95
|
+
reason: "invoice_funding_allocation_required",
|
|
96
|
+
};
|
|
97
|
+
const cost = await getProcessingCostContext(stripe, {
|
|
98
|
+
paymentIntentId: id(payment.payment.payment_intent),
|
|
99
|
+
});
|
|
100
|
+
if (cost.status === "not_ready")
|
|
101
|
+
return cost;
|
|
102
|
+
if (cost.currency !== group.currency || cost.gross !== invoice.amount_paid)
|
|
103
|
+
return {
|
|
104
|
+
status: "not_ready",
|
|
105
|
+
reason: "invoice_funding_allocation_required",
|
|
106
|
+
};
|
|
107
|
+
return cost;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=costRecovery-invoices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"costRecovery-invoices.js","sourceRoot":"","sources":["../../src/client/costRecovery-invoices.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type Stripe from "stripe";
|
|
1
2
|
import type { Component, RunCtx } from "./helpers.js";
|
|
2
3
|
export type RecoveryScope = {
|
|
3
4
|
accountId: string;
|
|
@@ -19,6 +20,12 @@ export type RecoveryClaim = RecoveryObservation & {
|
|
|
19
20
|
reservedAmount: number;
|
|
20
21
|
outstanding: number;
|
|
21
22
|
sign: "positive" | "negative" | "zero";
|
|
23
|
+
openingCollection?: {
|
|
24
|
+
operationKey: string;
|
|
25
|
+
amountDue: number;
|
|
26
|
+
revision: number;
|
|
27
|
+
collectedAmount: number;
|
|
28
|
+
};
|
|
22
29
|
};
|
|
23
30
|
export type RecoveryBalance = RecoveryScope & {
|
|
24
31
|
amountDue: number;
|
|
@@ -47,6 +54,12 @@ export type RecoveryGroup = RecoveryGroupOptions & {
|
|
|
47
54
|
_creationTime: number;
|
|
48
55
|
amount: number;
|
|
49
56
|
pendingOperations: number;
|
|
57
|
+
invoiceItemId?: string;
|
|
58
|
+
invoiceFunding?: {
|
|
59
|
+
sourceChargeId: string;
|
|
60
|
+
sourceGross: number;
|
|
61
|
+
sourceProcessingFee: number;
|
|
62
|
+
};
|
|
50
63
|
status: "open" | "sealed" | "collecting" | "releasing" | "collected" | "released";
|
|
51
64
|
};
|
|
52
65
|
export type RecoveryReservation = {
|
|
@@ -63,12 +76,56 @@ export type RecoveryReservation = {
|
|
|
63
76
|
}[];
|
|
64
77
|
status: "reserved" | "collected" | "released" | "empty";
|
|
65
78
|
};
|
|
66
|
-
/**
|
|
79
|
+
/** Host authorizes policy and scope. Provider methods verify invoice outcomes. */
|
|
67
80
|
export declare class CostRecoveryClient {
|
|
68
81
|
private readonly component;
|
|
69
|
-
|
|
82
|
+
private readonly provider?;
|
|
83
|
+
constructor(component: Component, provider?: (() => Stripe) | undefined);
|
|
70
84
|
private mutate;
|
|
71
85
|
private query;
|
|
86
|
+
/** Host authorizes the account, scope and invoice group; call from an action. */
|
|
87
|
+
attachInvoice(ctx: RunCtx, opts: RecoveryScope & {
|
|
88
|
+
groupKey: string;
|
|
89
|
+
}): Promise<{
|
|
90
|
+
group: RecoveryGroup;
|
|
91
|
+
invoiceItemId: string;
|
|
92
|
+
invoiceStatus: Stripe.Invoice["status"];
|
|
93
|
+
}>;
|
|
94
|
+
/** Re-read Stripe; keep unpaid items reserved. Repeat until isDone after terminal outcomes. */
|
|
95
|
+
reconcileInvoice(ctx: RunCtx, opts: RecoveryScope & {
|
|
96
|
+
groupKey: string;
|
|
97
|
+
releaseUncollectible?: boolean;
|
|
98
|
+
}): Promise<{
|
|
99
|
+
isDone: boolean;
|
|
100
|
+
group: RecoveryGroup;
|
|
101
|
+
invoiceItemId: string;
|
|
102
|
+
invoiceStatus: Stripe.Invoice["status"];
|
|
103
|
+
} | {
|
|
104
|
+
isDone: boolean;
|
|
105
|
+
group: RecoveryGroup;
|
|
106
|
+
invoiceStatus: Stripe.Invoice["status"];
|
|
107
|
+
invoiceItemId: null;
|
|
108
|
+
}>;
|
|
109
|
+
/** Reconcile a returned funding charge without changing the original cost claims. */
|
|
110
|
+
rollbackInvoice(ctx: RunCtx, opts: RecoveryScope & {
|
|
111
|
+
groupKey: string;
|
|
112
|
+
revision: number;
|
|
113
|
+
}): Promise<{
|
|
114
|
+
status: "not_ready";
|
|
115
|
+
paymentIntentId: string;
|
|
116
|
+
reason: import("./index.js").ProcessingCostNotReadyReason;
|
|
117
|
+
} | {
|
|
118
|
+
status: "ready";
|
|
119
|
+
claim: RecoveryClaim;
|
|
120
|
+
} | {
|
|
121
|
+
status: "not_ready";
|
|
122
|
+
reason: "invoice_funding_allocation_required";
|
|
123
|
+
}>;
|
|
124
|
+
/** Import a host-verified opening collection. Never overwrites a live claim. */
|
|
125
|
+
importClaim(ctx: RunCtx, opts: RecoveryObservation & {
|
|
126
|
+
operationKey: string;
|
|
127
|
+
collectedAmount: number;
|
|
128
|
+
}): Promise<RecoveryClaim>;
|
|
72
129
|
recordClaim(ctx: RunCtx, opts: RecoveryObservation): Promise<RecoveryClaim>;
|
|
73
130
|
reserve(ctx: RunCtx, opts: RecoveryGroupOptions & {
|
|
74
131
|
operationKey: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"costRecovery.d.ts","sourceRoot":"","sources":["../../src/client/costRecovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtD,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AACF,MAAM,MAAM,mBAAmB,GAAG,aAAa,GAAG;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AACF,MAAM,MAAM,aAAa,GAAG,mBAAmB,GAAG;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"costRecovery.d.ts","sourceRoot":"","sources":["../../src/client/costRecovery.ts"],"names":[],"mappings":"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"}
|