@volter/twin-stripe 2.0.38 → 3.0.1
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 +112 -207
- package/dist/generated/pack-facts.json +94 -0
- package/dist/journeys/coverage.json +596 -0
- package/dist/journeys/customer-life.json +6108 -0
- package/dist/journeys/customer-life.outline.md +371 -0
- package/dist/journeys/decisions.json +677 -0
- package/dist/journeys/demand.json +706 -0
- package/dist/journeys/score.json +853 -0
- package/dist/journeys/unreachable.json +102 -0
- package/dist/journeys/vendor-examples.json +8010 -0
- package/dist/spec/SOURCE.md +18 -0
- package/dist/spec/doc-examples.json +445 -0
- package/dist/spec/fixtures3.json.gz +0 -0
- package/dist/spec/openapi.json.gz +0 -0
- package/dist/spec/patches.json +34 -0
- package/dist/spec/sources.json +306 -0
- package/dist/src/cli.d.ts +0 -1
- package/dist/src/cli.js +11 -31
- package/dist/src/engine/after-payment.d.ts +8 -0
- package/dist/src/engine/after-payment.js +27 -0
- package/dist/src/engine/apps-secrets.d.ts +1 -0
- package/dist/src/engine/apps-secrets.js +3 -0
- package/dist/src/engine/balance.d.ts +5 -0
- package/dist/src/engine/balance.js +15 -0
- package/dist/src/engine/checkout.d.ts +24 -0
- package/dist/src/engine/checkout.js +30 -0
- package/dist/src/engine/common.d.ts +19 -0
- package/dist/src/engine/common.js +34 -0
- package/dist/src/engine/connect.d.ts +45 -0
- package/dist/src/engine/connect.js +108 -0
- package/dist/src/engine/customers.d.ts +4 -0
- package/dist/src/engine/customers.js +8 -0
- package/dist/src/engine/display.d.ts +11 -0
- package/dist/src/engine/display.js +13 -0
- package/dist/src/engine/files.d.ts +11 -0
- package/dist/src/engine/files.js +23 -0
- package/dist/src/engine/invoices.d.ts +21 -0
- package/dist/src/engine/invoices.js +84 -0
- package/dist/src/engine/issuing.d.ts +33 -0
- package/dist/src/engine/issuing.js +54 -0
- package/dist/src/engine/ledger.d.ts +8 -0
- package/dist/src/engine/ledger.js +8 -0
- package/dist/src/engine/oauth.d.ts +4 -0
- package/dist/src/engine/oauth.js +24 -0
- package/dist/src/engine/onboarding.d.ts +13 -0
- package/dist/src/engine/onboarding.js +42 -0
- package/dist/src/{stripe-params.d.ts → engine/params.d.ts} +20 -3
- package/dist/src/{stripe-params.js → engine/params.js} +7 -60
- package/dist/src/engine/payment-intents.d.ts +10 -0
- package/dist/src/engine/payment-intents.js +27 -0
- package/dist/src/engine/payment-methods.d.ts +16 -0
- package/dist/src/engine/payment-methods.js +22 -0
- package/dist/src/engine/radar.d.ts +2 -0
- package/dist/src/engine/radar.js +5 -0
- package/dist/src/engine/refunds.d.ts +1 -0
- package/dist/src/engine/refunds.js +3 -0
- package/dist/src/engine/renewals.d.ts +36 -0
- package/dist/src/engine/renewals.js +65 -0
- package/dist/src/{stripe-twin.d.ts → engine/stripe.d.ts} +12 -45
- package/dist/src/{stripe-twin.js → engine/stripe.js} +53 -387
- package/dist/src/engine/subscriptions.d.ts +11 -0
- package/dist/src/engine/subscriptions.js +30 -0
- package/dist/src/engine/transfers.d.ts +2 -0
- package/dist/src/engine/transfers.js +1 -0
- package/dist/src/{stripe-version.d.ts → engine/version.d.ts} +0 -2
- package/dist/src/{stripe-version.js → engine/version.js} +21 -9
- package/dist/src/engine/webhook-endpoints.d.ts +1 -0
- package/dist/src/engine/webhook-endpoints.js +12 -0
- package/dist/src/engine/webhooks.d.ts +31 -0
- package/dist/src/engine/webhooks.js +68 -0
- package/dist/src/fetch.d.ts +2 -0
- package/dist/src/fetch.js +26 -0
- package/dist/src/generated/surface.gen.json +1 -1
- package/dist/src/generated/ui.gen.json +1 -1
- package/dist/src/index.d.ts +5 -14
- package/dist/src/index.js +10 -75
- package/dist/src/manifest.js +478 -876
- package/dist/src/screens/billing-portal.d.ts +3 -0
- package/dist/src/screens/{portal.js → billing-portal.js} +32 -58
- package/dist/src/screens/checkout-js.d.ts +2 -0
- package/dist/src/screens/checkout-js.js +84 -0
- package/dist/src/screens/checkout.d.ts +2 -31
- package/dist/src/screens/checkout.js +32 -121
- package/dist/src/screens/connect-onboarding.d.ts +3 -0
- package/dist/src/screens/{onboarding.js → connect-onboarding.js} +38 -104
- package/dist/src/screens/dashboard.d.ts +3 -0
- package/dist/src/screens/dashboard.js +116 -0
- package/dist/src/screens/shared.d.ts +27 -0
- package/dist/src/screens/shared.js +87 -0
- package/dist/src/screens/stripe-js.d.ts +3 -0
- package/dist/src/screens/stripe-js.js +95 -0
- package/dist/src/semantics/account.d.ts +2 -0
- package/dist/src/semantics/account.js +8 -0
- package/dist/src/semantics/account_links.d.ts +2 -0
- package/dist/src/semantics/account_links.js +22 -0
- package/dist/src/semantics/accounts.d.ts +4 -0
- package/dist/src/semantics/accounts.js +40 -0
- package/dist/src/semantics/apps.d.ts +4 -0
- package/dist/src/semantics/{apps-secrets.js → apps.js} +14 -26
- package/dist/src/semantics/around.d.ts +2 -0
- package/dist/src/semantics/around.js +13 -0
- package/dist/src/semantics/balance.d.ts +2 -11
- package/dist/src/semantics/balance.js +3 -194
- package/dist/src/semantics/balance_transactions.d.ts +2 -0
- package/dist/src/semantics/balance_transactions.js +15 -0
- package/dist/src/semantics/billing_portal.d.ts +4 -0
- package/dist/src/semantics/billing_portal.js +36 -0
- package/dist/src/semantics/charges.d.ts +3 -28
- package/dist/src/semantics/charges.js +5 -202
- package/dist/src/semantics/checkout.d.ts +3 -20
- package/dist/src/semantics/checkout.js +21 -271
- package/dist/src/semantics/clock.d.ts +2 -0
- package/dist/src/semantics/clock.js +15 -0
- package/dist/src/semantics/coupons.d.ts +2 -6
- package/dist/src/semantics/coupons.js +2 -60
- package/dist/src/semantics/customers.d.ts +5 -6
- package/dist/src/semantics/customers.js +47 -413
- package/dist/src/semantics/doors.d.ts +23 -0
- package/dist/src/semantics/doors.js +73 -0
- package/dist/src/semantics/entitlements.d.ts +0 -2
- package/dist/src/semantics/entitlements.js +4 -95
- package/dist/src/semantics/events.d.ts +11 -0
- package/dist/src/semantics/events.js +31 -0
- package/dist/src/semantics/index.d.ts +2 -0
- package/dist/src/semantics/index.js +85 -0
- package/dist/src/semantics/invoice_payments.d.ts +2 -0
- package/dist/src/semantics/invoice_payments.js +12 -0
- package/dist/src/semantics/invoices.d.ts +11 -18
- package/dist/src/semantics/invoices.js +121 -440
- package/dist/src/semantics/issuing.d.ts +6 -13
- package/dist/src/semantics/issuing.js +58 -556
- package/dist/src/semantics/payment_intents.d.ts +3 -0
- package/dist/src/semantics/payment_intents.js +71 -0
- package/dist/src/semantics/payment_methods.d.ts +3 -0
- package/dist/src/semantics/payment_methods.js +15 -0
- package/dist/src/semantics/payouts.d.ts +3 -0
- package/dist/src/semantics/payouts.js +28 -0
- package/dist/src/semantics/prices.d.ts +4 -0
- package/dist/src/semantics/prices.js +37 -0
- package/dist/src/semantics/products.d.ts +4 -2
- package/dist/src/semantics/products.js +12 -138
- package/dist/src/semantics/promotion_codes.d.ts +3 -0
- package/dist/src/semantics/promotion_codes.js +35 -0
- package/dist/src/semantics/radar.d.ts +2 -2
- package/dist/src/semantics/radar.js +5 -74
- package/dist/src/semantics/refunds.d.ts +2 -9
- package/dist/src/semantics/refunds.js +3 -193
- package/dist/src/semantics/shared.d.ts +558 -55
- package/dist/src/semantics/shared.js +2070 -114
- package/dist/src/semantics/states.d.ts +462 -0
- package/dist/src/semantics/states.js +634 -0
- package/dist/src/semantics/subscriptions.d.ts +6 -11
- package/dist/src/semantics/subscriptions.js +37 -530
- package/dist/src/semantics/test_helpers.d.ts +3 -0
- package/dist/src/semantics/test_helpers.js +125 -0
- package/dist/src/semantics/transfers.d.ts +2 -2
- package/dist/src/semantics/transfers.js +6 -101
- package/dist/src/semantics/webhook_endpoints.d.ts +2 -0
- package/dist/src/semantics/webhook_endpoints.js +26 -0
- package/dist/src/server.d.ts +7 -0
- package/dist/src/server.js +7 -0
- package/generated/pack-facts.json +94 -0
- package/journeys/coverage.json +596 -0
- package/journeys/customer-life.json +6108 -0
- package/journeys/customer-life.outline.md +371 -0
- package/journeys/decisions.json +677 -0
- package/journeys/demand.json +706 -0
- package/journeys/score.json +853 -0
- package/journeys/unreachable.json +102 -0
- package/journeys/vendor-examples.json +8010 -0
- package/package.json +11 -20
- package/spec/SOURCE.md +18 -0
- package/spec/doc-examples.json +445 -0
- package/spec/fixtures3.json.gz +0 -0
- package/spec/openapi.json.gz +0 -0
- package/spec/patches.json +34 -0
- package/spec/sources.json +306 -0
- package/src/cli.ts +11 -28
- package/src/engine/after-payment.ts +29 -0
- package/src/engine/apps-secrets.ts +4 -0
- package/src/engine/balance.ts +32 -0
- package/src/engine/checkout.ts +39 -0
- package/src/engine/common.ts +49 -0
- package/src/engine/connect.ts +106 -0
- package/src/engine/customers.ts +10 -0
- package/src/engine/display.ts +18 -0
- package/src/engine/files.ts +28 -0
- package/src/engine/invoices.ts +102 -0
- package/src/engine/issuing.ts +66 -0
- package/src/engine/ledger.ts +48 -0
- package/src/engine/oauth.ts +18 -0
- package/src/engine/onboarding.ts +53 -0
- package/src/{stripe-params.ts → engine/params.ts} +7 -56
- package/src/engine/payment-intents.ts +32 -0
- package/src/engine/payment-methods.ts +24 -0
- package/src/engine/radar.ts +6 -0
- package/src/engine/refunds.ts +3 -0
- package/src/engine/renewals.ts +72 -0
- package/src/{stripe-twin.ts → engine/stripe.ts} +57 -400
- package/src/engine/subscriptions.ts +37 -0
- package/src/engine/transfers.ts +22 -0
- package/src/{stripe-version.ts → engine/version.ts} +19 -10
- package/src/engine/webhook-endpoints.ts +14 -0
- package/src/engine/webhooks.ts +70 -0
- package/src/fetch.ts +27 -0
- package/src/generated/surface.gen.json +1 -1
- package/src/generated/ui.gen.json +1 -1
- package/src/index.ts +10 -116
- package/src/manifest.ts +480 -904
- package/src/screens/{portal.tsx → billing-portal.tsx} +35 -42
- package/src/screens/checkout-js.ts +80 -0
- package/src/screens/checkout.tsx +32 -96
- package/src/screens/{onboarding.tsx → connect-onboarding.tsx} +39 -85
- package/src/screens/dashboard.tsx +178 -0
- package/src/screens/shared.tsx +84 -0
- package/src/screens/stripe-js.ts +102 -0
- package/src/semantics/account.ts +10 -0
- package/src/semantics/account_links.ts +20 -0
- package/src/semantics/accounts.ts +44 -0
- package/src/semantics/{apps-secrets.ts → apps.ts} +17 -33
- package/src/semantics/around.ts +17 -0
- package/src/semantics/balance.ts +6 -208
- package/src/semantics/balance_transactions.ts +18 -0
- package/src/semantics/billing_portal.ts +45 -0
- package/src/semantics/charges.ts +8 -212
- package/src/semantics/checkout.ts +25 -276
- package/src/semantics/clock.ts +19 -0
- package/src/semantics/coupons.ts +5 -68
- package/src/semantics/customers.ts +48 -414
- package/src/semantics/doors.ts +79 -0
- package/src/semantics/entitlements.ts +3 -94
- package/src/semantics/events.ts +37 -0
- package/src/semantics/index.ts +89 -0
- package/src/semantics/invoice_payments.ts +16 -0
- package/src/semantics/invoices.ts +112 -441
- package/src/semantics/issuing.ts +57 -573
- package/src/semantics/payment_intents.ts +76 -0
- package/src/semantics/payment_methods.ts +20 -0
- package/src/semantics/payouts.ts +29 -0
- package/src/semantics/prices.ts +41 -0
- package/src/semantics/products.ts +12 -146
- package/src/semantics/promotion_codes.ts +38 -0
- package/src/semantics/radar.ts +8 -79
- package/src/semantics/refunds.ts +4 -216
- package/src/semantics/shared.ts +2089 -135
- package/src/semantics/states.ts +662 -0
- package/src/semantics/subscriptions.ts +39 -542
- package/src/semantics/test_helpers.ts +119 -0
- package/src/semantics/transfers.ts +10 -132
- package/src/semantics/webhook_endpoints.ts +27 -0
- package/src/server.ts +7 -0
- package/client/dashboard-api.ts +0 -286
- package/client/stripe-mirror.css +0 -277
- package/client/stripe-mirror.tsx +0 -1559
- package/dist/client/dashboard-api.d.ts +0 -107
- package/dist/client/dashboard-api.js +0 -238
- package/dist/client/dashboard-api.ts +0 -286
- package/dist/client/stripe-mirror.bundle.js +0 -236
- package/dist/client/stripe-mirror.css +0 -277
- package/dist/client/stripe-mirror.d.ts +0 -134
- package/dist/client/stripe-mirror.js +0 -859
- package/dist/client/stripe-mirror.tsx +0 -1559
- package/dist/src/screens/connect-oauth.d.ts +0 -27
- package/dist/src/screens/connect-oauth.js +0 -414
- package/dist/src/screens/connect-settings.d.ts +0 -22
- package/dist/src/screens/connect-settings.js +0 -103
- package/dist/src/screens/consent-skin.d.ts +0 -4
- package/dist/src/screens/consent-skin.js +0 -18
- package/dist/src/screens/financial-connections.d.ts +0 -5
- package/dist/src/screens/financial-connections.js +0 -90
- package/dist/src/screens/identity.d.ts +0 -5
- package/dist/src/screens/identity.js +0 -86
- package/dist/src/screens/onboarding.d.ts +0 -13
- package/dist/src/screens/portal.d.ts +0 -5
- package/dist/src/screens/public-details.d.ts +0 -5
- package/dist/src/screens/public-details.js +0 -90
- package/dist/src/semantics/after-payment.d.ts +0 -22
- package/dist/src/semantics/after-payment.js +0 -99
- package/dist/src/semantics/apps-secrets.d.ts +0 -2
- package/dist/src/semantics/billing.d.ts +0 -2
- package/dist/src/semantics/billing.js +0 -220
- package/dist/src/semantics/connect.d.ts +0 -5
- package/dist/src/semantics/connect.js +0 -493
- package/dist/src/semantics/credit-notes.d.ts +0 -2
- package/dist/src/semantics/credit-notes.js +0 -172
- package/dist/src/semantics/disputes.d.ts +0 -2
- package/dist/src/semantics/disputes.js +0 -51
- package/dist/src/semantics/ephemeral-keys.d.ts +0 -2
- package/dist/src/semantics/ephemeral-keys.js +0 -34
- package/dist/src/semantics/files.d.ts +0 -2
- package/dist/src/semantics/files.js +0 -125
- package/dist/src/semantics/ledger.d.ts +0 -59
- package/dist/src/semantics/ledger.js +0 -200
- package/dist/src/semantics/payment-intents.d.ts +0 -18
- package/dist/src/semantics/payment-intents.js +0 -452
- package/dist/src/semantics/payment-links.d.ts +0 -2
- package/dist/src/semantics/payment-links.js +0 -133
- package/dist/src/semantics/payment-methods.d.ts +0 -20
- package/dist/src/semantics/payment-methods.js +0 -140
- package/dist/src/semantics/plans.d.ts +0 -5
- package/dist/src/semantics/plans.js +0 -121
- package/dist/src/semantics/platform.d.ts +0 -9
- package/dist/src/semantics/platform.js +0 -206
- package/dist/src/semantics/renewals.d.ts +0 -47
- package/dist/src/semantics/renewals.js +0 -281
- package/dist/src/semantics/setup-intents.d.ts +0 -2
- package/dist/src/semantics/setup-intents.js +0 -84
- package/dist/src/semantics/subscription-schedules.d.ts +0 -2
- package/dist/src/semantics/subscription-schedules.js +0 -119
- package/dist/src/semantics/tax.d.ts +0 -2
- package/dist/src/semantics/tax.js +0 -197
- package/dist/src/semantics/terminal.d.ts +0 -5
- package/dist/src/semantics/terminal.js +0 -182
- package/dist/src/semantics/test-clocks.d.ts +0 -6
- package/dist/src/semantics/test-clocks.js +0 -73
- package/dist/src/semantics/tokens.d.ts +0 -4
- package/dist/src/semantics/tokens.js +0 -44
- package/dist/src/semantics/treasury.d.ts +0 -2
- package/dist/src/semantics/treasury.js +0 -377
- package/dist/src/semantics/webhook-endpoints.d.ts +0 -3
- package/dist/src/semantics/webhook-endpoints.js +0 -85
- package/dist/src/stripe-budget.d.ts +0 -55
- package/dist/src/stripe-budget.js +0 -155
- package/dist/src/stripe-capabilities.d.ts +0 -3
- package/dist/src/stripe-capabilities.js +0 -5836
- package/dist/src/stripe-conformance.d.ts +0 -43
- package/dist/src/stripe-conformance.js +0 -105
- package/dist/src/stripe-connector.d.ts +0 -161
- package/dist/src/stripe-connector.js +0 -414
- package/dist/src/stripe-emit.d.ts +0 -2
- package/dist/src/stripe-emit.js +0 -145
- package/dist/src/stripe-events.d.ts +0 -93
- package/dist/src/stripe-events.js +0 -392
- package/dist/src/stripe-js.d.ts +0 -4
- package/dist/src/stripe-js.js +0 -70
- package/dist/src/stripe-mirror-ui.d.ts +0 -15
- package/dist/src/stripe-mirror-ui.js +0 -87
- package/dist/src/stripe-perform-harness.d.ts +0 -9
- package/dist/src/stripe-perform-harness.js +0 -26
- package/dist/src/stripe-server.d.ts +0 -33
- package/dist/src/stripe-server.js +0 -429
- package/dist/src/stripe-shared.d.ts +0 -109
- package/dist/src/stripe-shared.js +0 -276
- package/dist/src/stripe-ui-conformance.d.ts +0 -5
- package/dist/src/stripe-ui-conformance.js +0 -79
- package/dist/src/stripe-ui-structure.d.ts +0 -3
- package/dist/src/stripe-ui-structure.js +0 -168
- package/dist/test-fixtures/stripe-known-deviations.json +0 -110
- package/dist/test-fixtures/stripe-openapi-operations.SOURCE.md +0 -14
- package/dist/test-fixtures/stripe-openapi-operations.json +0 -4717
- package/dist/test-fixtures/stripe-schemas.SOURCE.md +0 -35
- package/dist/test-fixtures/stripe-schemas.json +0 -3813
- package/src/screens/connect-oauth.tsx +0 -400
- package/src/screens/connect-settings.tsx +0 -121
- package/src/screens/consent-skin.ts +0 -20
- package/src/screens/financial-connections.tsx +0 -101
- package/src/screens/identity.tsx +0 -96
- package/src/screens/public-details.tsx +0 -105
- package/src/semantics/after-payment.ts +0 -118
- package/src/semantics/billing.ts +0 -216
- package/src/semantics/connect.ts +0 -487
- package/src/semantics/credit-notes.ts +0 -168
- package/src/semantics/disputes.ts +0 -62
- package/src/semantics/ephemeral-keys.ts +0 -34
- package/src/semantics/files.ts +0 -143
- package/src/semantics/ledger.ts +0 -253
- package/src/semantics/payment-intents.ts +0 -463
- package/src/semantics/payment-links.ts +0 -148
- package/src/semantics/payment-methods.ts +0 -145
- package/src/semantics/plans.ts +0 -131
- package/src/semantics/platform.ts +0 -220
- package/src/semantics/renewals.ts +0 -279
- package/src/semantics/setup-intents.ts +0 -87
- package/src/semantics/subscription-schedules.ts +0 -129
- package/src/semantics/tax.ts +0 -220
- package/src/semantics/terminal.ts +0 -195
- package/src/semantics/test-clocks.ts +0 -77
- package/src/semantics/tokens.ts +0 -52
- package/src/semantics/treasury.ts +0 -383
- package/src/semantics/webhook-endpoints.ts +0 -87
- package/src/stripe-budget.ts +0 -181
- package/src/stripe-capabilities.ts +0 -5651
- package/src/stripe-conformance.ts +0 -124
- package/src/stripe-connector.ts +0 -462
- package/src/stripe-emit.ts +0 -157
- package/src/stripe-events.ts +0 -434
- package/src/stripe-js.ts +0 -70
- package/src/stripe-mirror-ui.ts +0 -90
- package/src/stripe-perform-harness.ts +0 -29
- package/src/stripe-server.ts +0 -393
- package/src/stripe-shared.ts +0 -297
- package/src/stripe-ui-conformance.ts +0 -88
- package/src/stripe-ui-structure.ts +0 -182
- package/test-fixtures/stripe-known-deviations.json +0 -110
- package/test-fixtures/stripe-openapi-operations.json +0 -4717
- package/test-fixtures/stripe-schemas.json +0 -3813
- /package/dist/src/{screens → engine}/industries.d.ts +0 -0
- /package/dist/src/{screens → engine}/industries.js +0 -0
- /package/dist/src/{semantics → engine}/test-cards.d.ts +0 -0
- /package/dist/src/{semantics → engine}/test-cards.js +0 -0
- /package/src/{screens → engine}/industries.ts +0 -0
- /package/src/{semantics → engine}/test-cards.ts +0 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Subscription and SubscriptionItem semantics. A subscription is created with its items, its
|
|
2
|
+
// billing period and, under payment_behavior=default_incomplete, its first invoice and that
|
|
3
|
+
// invoice's PaymentIntent; canceling it is the machine's move in ../manifest.ts. Retrieve of a
|
|
4
|
+
// subscription and of an item are the derived core's.
|
|
5
|
+
import type { Row } from './common.ts';
|
|
6
|
+
export const SUB = 'subscription';
|
|
7
|
+
|
|
8
|
+
// pause_collection pauses billing (the subscription stays active; the paused event fires) and
|
|
9
|
+
// clearing it resumes; cancel_at_period_end schedules or withdraws a cancel; a coupon replaces the
|
|
10
|
+
// discount and an empty one clears it
|
|
11
|
+
/** pause_collection pauses billing (the paused event fires) and clearing it resumes
|
|
12
|
+
* (docs.stripe.com/billing/subscriptions/pause-payment); answers the event, or nothing for a value it does not take. */
|
|
13
|
+
export function pauseCollection(pc: unknown, fields: Row): string | undefined {
|
|
14
|
+
const isClear = pc === '' || pc === null || (typeof pc === 'object' && pc !== null && Object.keys(pc as object).length === 0);
|
|
15
|
+
if (isClear) {
|
|
16
|
+
fields.pause_collection = null;
|
|
17
|
+
return 'customer.subscription.resumed';
|
|
18
|
+
}
|
|
19
|
+
if (!pc || typeof pc !== 'object') return undefined;
|
|
20
|
+
const p = pc as Row;
|
|
21
|
+
fields.pause_collection = { behavior: typeof p.behavior === 'string' ? p.behavior : 'void', resumes_at: p.resumes_at !== undefined ? Number(p.resumes_at) : null };
|
|
22
|
+
return 'customer.subscription.paused';
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** The longest trial Stripe takes: `trial_end` "Can be at most two years from `billing_cycle_anchor`"
|
|
26
|
+
* (docs.stripe.com/api/subscriptions/update#update_subscription-trial_end); "The trial period must be 730 days (2 years)
|
|
27
|
+
* or less" (docs.stripe.com/billing/subscriptions/trials/free-trials). */
|
|
28
|
+
export const MAX_TRIAL = 730 * 86400;
|
|
29
|
+
|
|
30
|
+
/** A trial moved to end at `end`, or a new one to `end` on a subscription out of its trial (applyTrialEnd). */
|
|
31
|
+
export function movedTrial(sub: Row, fields: Row, end: number, now: number): undefined {
|
|
32
|
+
Object.assign(fields, {
|
|
33
|
+
status: 'trialing', trial_end: end, trial_start: sub.trial_start ?? now, billing_cycle_anchor: end,
|
|
34
|
+
current_period_end: end, ...(sub.status !== 'trialing' ? { current_period_start: now } : {}),
|
|
35
|
+
});
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Transfer and application-fee semantics: money the platform moves to a connected account and
|
|
2
|
+
// claws back (reversals), and the platform's fee on a connected charge and its refunds. A
|
|
3
|
+
// reversal or fee refund never exceeds what is left, and lands on its parent's totals and list.
|
|
4
|
+
// A transfer goes only to an account whose transfers capability is active, comes out of the
|
|
5
|
+
// platform's available balance, and lands in the destination's (docs.stripe.com/connect/separate-
|
|
6
|
+
// charges-and-transfers); a reversal moves it back.
|
|
7
|
+
// A transfer tied to a charge (`source_transaction`, "Transfer availability" in the same guide) "returns success
|
|
8
|
+
// regardless of your available balance if the related charge hasn't settled yet", but "the funds don't become
|
|
9
|
+
// available in the destination account until the funds from the associated charge are available"; a charge whose funds
|
|
10
|
+
// are already available by the World's clock is no exception, and the transfer is held to the available balance as any
|
|
11
|
+
// other. "The amount of the transfer must not exceed the amount of the source charge", several transfers may share one
|
|
12
|
+
// charge while "the sum of the transfers doesn't exceed the source charge", and the charge's balance currency must
|
|
13
|
+
// match. "If the source charge has a `transfer_group` value, Stripe assigns the same value to the transfer's
|
|
14
|
+
// `transfer_group`. If it doesn't, then Stripe generates a string in the format `group_` plus the associated
|
|
15
|
+
// PaymentIntent ID ... It assigns that string as the `transfer_group` for both the charge and the transfer."
|
|
16
|
+
// Where the documentation stops and the twin decides: the sum from one charge counts each transfer less what was
|
|
17
|
+
// reversed of it; a transfer_group the request names is kept only when the charge has none and no PaymentIntent to
|
|
18
|
+
// name one after; an uncaptured charge (an authorization, docs silent) is refused as a source_transaction until it is
|
|
19
|
+
// captured; the refusals' wording is the twin's.
|
|
20
|
+
// Transfer list, retrieve and update and application-fee list and retrieve are the derived core's.
|
|
21
|
+
import type { Row } from './common.ts';
|
|
22
|
+
export const emptyList = (url: string): Row => ({ object: 'list', data: [], has_more: false, total_count: 0, url });
|
|
@@ -8,13 +8,14 @@
|
|
|
8
8
|
// Where the evidence stops: the changes below are the ones between the kept shape and the vendored spec that
|
|
9
9
|
// the pack's journeys reach, each from Stripe's changelog for basil (docs.stripe.com/changelog/basil); a version
|
|
10
10
|
// pinned between basil and the spec's is rendered in the spec's shape, not its own.
|
|
11
|
-
import surface from '
|
|
11
|
+
import surface from '../generated/surface.gen.json' with { type: 'json' };
|
|
12
12
|
|
|
13
13
|
type Row = Record<string, unknown>;
|
|
14
14
|
|
|
15
15
|
/** The version the pack serves: its vendored spec's. */
|
|
16
16
|
export const SERVED_VERSION = String(surface.version);
|
|
17
17
|
const BASIL = '2025-03-31';
|
|
18
|
+
const CLOVER = '2025-09-30';
|
|
18
19
|
|
|
19
20
|
/** Whether a request is answered in the served version's shape. */
|
|
20
21
|
export const servesCurrent = (pinned?: string | null): boolean => !pinned || pinned >= BASIL;
|
|
@@ -23,6 +24,9 @@ export const servesCurrent = (pinned?: string | null): boolean => !pinned || pin
|
|
|
23
24
|
// flag, the payment behavior a subscription was created with) and links it follows internally.
|
|
24
25
|
const KEPT: Record<string, string[]> = {
|
|
25
26
|
account: ['livemode'],
|
|
27
|
+
// source: spec:PostWebhookEndpoints "Whether this endpoint should receive events from connected accounts"
|
|
28
|
+
// connect configures event delivery; it is not a WebhookEndpoint response field.
|
|
29
|
+
webhook_endpoint: ['connect'],
|
|
26
30
|
// a meter event is identified by its identifier; the twin's row id is its own
|
|
27
31
|
'billing.meter_event': ['id'],
|
|
28
32
|
// a card source's creation time is the twin's, for ordering
|
|
@@ -37,7 +41,7 @@ const KEPT: Record<string, string[]> = {
|
|
|
37
41
|
payment_intent: ['mandate', 'off_session'],
|
|
38
42
|
subscription: ['payment_behavior'],
|
|
39
43
|
subscription_item: ['livemode'],
|
|
40
|
-
subscription_schedule: ['from_subscription', 'renewal_interval'],
|
|
44
|
+
subscription_schedule: ['from_subscription', 'renewal_interval', 'proration_behavior'],
|
|
41
45
|
'tax.transaction': ['calculation'],
|
|
42
46
|
'terminal.reader': ['registration_code'],
|
|
43
47
|
topup: ['destination_balance'],
|
|
@@ -65,9 +69,8 @@ const BASIL_CHANGES: Record<string, (o: Row, parent?: Row) => Row> = {
|
|
|
65
69
|
const parent = o.parent !== undefined ? o.parent : subscription ? { type: 'subscription_details', quote_details: null, subscription_details: { metadata: {}, subscription } } : null;
|
|
66
70
|
// "confirmation_secret … Currently, this contains the client_secret of the PaymentIntent that Stripe creates during
|
|
67
71
|
// invoice finalization" (docs.stripe.com/api/invoices/object; includable, answered only when expanded: INCLUDABLE);
|
|
68
|
-
// the intent's client_secret is the one stripe
|
|
69
|
-
const
|
|
70
|
-
const confirmation_secret = intent ? { type: 'payment_intent', client_secret: `${intent}_secret_twin` } : null;
|
|
72
|
+
// the intent's client_secret is the one ./stripe.ts mintClientSecret gives it
|
|
73
|
+
const confirmation_secret = o.confirmation_secret ?? null;
|
|
71
74
|
return { ...omit(o, ['payment_intent', 'charge', 'paid', 'paid_out_of_band', 'subscription']), parent, confirmation_secret };
|
|
72
75
|
},
|
|
73
76
|
charge: (o) => omit(o, ['invoice', 'source']),
|
|
@@ -228,9 +231,6 @@ const INCLUDABLE: Record<string, string[]> = {
|
|
|
228
231
|
invoice: ['confirmation_secret'],
|
|
229
232
|
};
|
|
230
233
|
|
|
231
|
-
/** Every includable field name, as `expand` paths on a top-level object: what a check of an object's FULL answer expands. */
|
|
232
|
-
export const INCLUDABLE_FIELDS: string[] = [...new Set(Object.values(INCLUDABLE).flat())];
|
|
233
|
-
|
|
234
234
|
/** The `expand[]` paths a request names, in its query or its body (JSON or form). */
|
|
235
235
|
export async function expandOf(request: Request): Promise<string[]> {
|
|
236
236
|
const url = new URL(request.url);
|
|
@@ -272,10 +272,19 @@ export function render(value: unknown, pinned?: string | null, expand: string[]
|
|
|
272
272
|
if (!kind || o.deleted === true) return o;
|
|
273
273
|
// metadata holds strings ("key-value pairs", each value up to 500 characters, docs.stripe.com/metadata); the form
|
|
274
274
|
// reader coerces a numeric-looking value to a number, which the answer gives back as the string it was sent as
|
|
275
|
-
|
|
275
|
+
// reads the same, and a key posted "" to remove it is not there (../semantics/shared.ts withMetadata)
|
|
276
|
+
if (o.metadata && typeof o.metadata === 'object' && !Array.isArray(o.metadata)) o.metadata = Object.fromEntries(Object.entries(o.metadata as Row).filter(([, v]) => v !== '').map(([k, v]) => [k, typeof v === 'number' || typeof v === 'boolean' ? String(v) : v]));
|
|
277
|
+
// source: spec:/components/schemas/checkout.session/properties/ui_mode "Defaults to `hosted_page`."
|
|
278
|
+
// Endive names hosted/custom Checkout hosted_page/elements; older SDK versions keep their own names.
|
|
279
|
+
if (kind === 'checkout.session' && (!pinned || pinned >= '2026-09-30')) {
|
|
280
|
+
if (o.ui_mode === 'hosted') o.ui_mode = 'hosted_page';
|
|
281
|
+
if (o.ui_mode === 'custom') o.ui_mode = 'elements';
|
|
282
|
+
}
|
|
276
283
|
const kept = KEPT[kind] ? omit(o, KEPT[kind]!) : o;
|
|
277
284
|
// an includable field a version's change adds (an invoice's confirmation_secret) is hidden as its stored ones are
|
|
278
|
-
|
|
285
|
+
// source: https://docs.stripe.com/changelog/clover/2025-09-30/polymorphic-coupon "Moves the top-level coupon field on Promotion Codes to promotion.coupon"
|
|
286
|
+
const changed = kind === 'promotion_code' && pinned && pinned < CLOVER ? omit(kept, ['promotion']) : BASIL_CHANGES[kind] ? BASIL_CHANGES[kind]!(kept) : kept;
|
|
287
|
+
return omit(withNulls(changed, kind), hidden);
|
|
279
288
|
};
|
|
280
289
|
return walk(value);
|
|
281
290
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Webhook endpoint semantics: registering a URL and the events it subscribes to. Delivery reads
|
|
2
|
+
// the endpoints from the tree, signing each POST with the endpoint's own secret; a disabled one
|
|
3
|
+
// (the machine in ../manifest.ts) receives nothing. Endpoint list, retrieve and delete are the derived core's.
|
|
4
|
+
//
|
|
5
|
+
// The Events API lists and retrieves the stored events of the account a request acts for: an event of a connected
|
|
6
|
+
// account carries it ("Each event for a connected account contains a top-level `account` property that identifies the
|
|
7
|
+
// connected account. Because the connected account owns the object that triggered the event, you must make API
|
|
8
|
+
// requests for that object as the connected account", docs.stripe.com/connect/webhooks; the event's `account`: "The
|
|
9
|
+
// connected account that originates the event", spec/openapi.json.gz), so a request with the Stripe-Account header
|
|
10
|
+
// sees that account's events and one without it the platform's, those with no `account`. Where the documentation
|
|
11
|
+
// stops and the twin decides: a platform request does not see its connected accounts' events.
|
|
12
|
+
|
|
13
|
+
export const WE = 'webhook_endpoint';
|
|
14
|
+
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// Stripe's events as its handlers and its declared `events` need them (the kernel renders, stores, signs and delivers
|
|
2
|
+
// every event a write sends: ../manifest.ts `events`, ../semantics/shared.ts STRIPE_EVENTS): which write sends which
|
|
3
|
+
// event type, Stripe's own event types (the spec's list, ../generated/events.gen.json), and the one message Stripe decides
|
|
4
|
+
// by its receiver's answer, the real-time authorization request.
|
|
5
|
+
import { hmac } from '@volter/world-core';
|
|
6
|
+
import vendorEvents from '../generated/events.gen.json' with { type: 'json' };
|
|
7
|
+
/** Every event type Stripe's spec enumerates: a write whose operation is one sends it, and `<resource>.create`,
|
|
8
|
+
* `.update` and `.delete` send `<resource>.created`, `.updated` and `.deleted` when Stripe has that type. */
|
|
9
|
+
export const STRIPE_EVENT_TYPES: ReadonlyArray<string> = (vendorEvents as { types: string[] }).types;
|
|
10
|
+
|
|
11
|
+
/** The writes whose event is named otherwise than by their resource (the rest are STRIPE_EVENT_TYPES'). A refund sends
|
|
12
|
+
* `refund.created` for the Refund; the charge's own write is recorded as `charge.refunded`, the charge with its new
|
|
13
|
+
* totals. `issuing_authorization.request` is no write's: it is asked of the endpoint (askForAuthorization). */
|
|
14
|
+
export const NAMED_EVENTS: Record<string, string> = {
|
|
15
|
+
'payment_intent.confirm': 'payment_intent.succeeded',
|
|
16
|
+
'payment_method.attach': 'payment_method.attached',
|
|
17
|
+
'payment_method.detach': 'payment_method.detached',
|
|
18
|
+
'setup_intent.confirm': 'setup_intent.succeeded',
|
|
19
|
+
'subscription.create': 'customer.subscription.created',
|
|
20
|
+
'subscription.update': 'customer.subscription.updated',
|
|
21
|
+
'subscription.cancel': 'customer.subscription.deleted',
|
|
22
|
+
'invoice.finalize': 'invoice.finalized',
|
|
23
|
+
'invoice.pay': 'invoice.paid',
|
|
24
|
+
'invoice.void': 'invoice.voided',
|
|
25
|
+
'dispute.create': 'charge.dispute.created',
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/** Whether an endpoint's `enabled_events` takes a type: `*` takes all, `<family>.*` the family, else the type itself. */
|
|
29
|
+
export function stripeEventMatches(enabledEvents: unknown, type: string): boolean {
|
|
30
|
+
if (!Array.isArray(enabledEvents)) return false;
|
|
31
|
+
return enabledEvents.some((p) => {
|
|
32
|
+
const s = String(p);
|
|
33
|
+
return s === '*' || (s.endsWith('.*') && type.startsWith(s.slice(0, -1))) || s === type;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** A `Stripe-Signature` header: HMAC-SHA256 over `${timestamp}.${payload}` keyed by the endpoint's secret, as
|
|
38
|
+
* `t=<unix>,v1=<hex>` (docs.stripe.com/webhooks#verify-manually). */
|
|
39
|
+
export const stripeSignature = (payload: string, secret: string, timestamp: number): string => `t=${timestamp},v1=${hmac(secret, `${timestamp}.${payload}`)}`;
|
|
40
|
+
|
|
41
|
+
// ── Real-time authorization (issuing_authorization.request) ──────────────────────────────────────
|
|
42
|
+
// Stripe delivers issuing_authorization.request to the one enrolled endpoint while the card network holds the
|
|
43
|
+
// authorization open, and the endpoint must answer within Stripe's 2-second window ("This request should be made within
|
|
44
|
+
// the timeout window of the real-time authorization flow", stripe@22.3.0 Issuing/Authorizations.d.ts; the current method
|
|
45
|
+
// is to "respond directly to the webhook request to approve an authorization"). The answer's body carries the decision:
|
|
46
|
+
// a JSON object with a boolean `approved` (and, for an amount-controllable request, an optional integer `amount`).
|
|
47
|
+
// Outcomes map onto request_history.reason (stripe@22.3.0 RequestHistory.Reason): webhook_approved / webhook_declined,
|
|
48
|
+
// the endpoint answered in time; webhook_timeout, no answer inside the window (an unreachable endpoint too);
|
|
49
|
+
// webhook_error, "the direct webhook response is invalid (for example, parsing errors or missing parameters)": a
|
|
50
|
+
// non-2xx status, a body that is not JSON, or no `approved`.
|
|
51
|
+
export const STRIPE_REALTIME_AUTH_TIMEOUT_MS = 2_000;
|
|
52
|
+
|
|
53
|
+
export type StripeAuthRequestOutcome =
|
|
54
|
+
| { kind: 'approved'; amount?: number }
|
|
55
|
+
| { kind: 'declined' }
|
|
56
|
+
| { kind: 'timeout'; message: string }
|
|
57
|
+
| { kind: 'error'; message: string };
|
|
58
|
+
|
|
59
|
+
/** The endpoint's answer read as the decision: `approved` (and an optional `amount`), or an error for an answer Stripe
|
|
60
|
+
* cannot read. */
|
|
61
|
+
export function readDecision(res: { status: number; body: string }): StripeAuthRequestOutcome {
|
|
62
|
+
if (res.status < 200 || res.status >= 300) return { kind: 'error', message: `Webhook endpoint responded with HTTP status ${res.status}.` };
|
|
63
|
+
let parsed: unknown;
|
|
64
|
+
try { parsed = JSON.parse(res.body); } catch { return { kind: 'error', message: 'Webhook response body was not valid JSON.' }; }
|
|
65
|
+
const approved = (parsed as { approved?: unknown } | null)?.approved;
|
|
66
|
+
if (typeof approved !== 'boolean') return { kind: 'error', message: 'Webhook response is missing the required `approved` parameter.' };
|
|
67
|
+
if (!approved) return { kind: 'declined' };
|
|
68
|
+
const amount = (parsed as { amount?: unknown }).amount;
|
|
69
|
+
return { kind: 'approved', ...(typeof amount === 'number' && Number.isInteger(amount) && amount > 0 ? { amount } : {}) };
|
|
70
|
+
}
|
package/src/fetch.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// GENERATED by scripts/create-pack.ts (--init, --index): a fixed file. The kernel serves the discovery door, the clock,
|
|
2
|
+
// the World's doors, the vendor's screens and the API from the pack's parts (architecture, "The pack contract").
|
|
3
|
+
import { createPackFetch, type DerivedFetch, type DerivedSurface, type PackFetchOptions } from '@volter/world-core';
|
|
4
|
+
import surface from './generated/surface.gen.json' with { type: 'json' };
|
|
5
|
+
import { manifest } from './manifest.ts';
|
|
6
|
+
import { around } from './semantics/around.ts';
|
|
7
|
+
import { clock } from './semantics/clock.ts';
|
|
8
|
+
import * as doors from './semantics/doors.ts';
|
|
9
|
+
import { stripeSemantics } from './semantics/index.ts';
|
|
10
|
+
import { screen as screen_billing_portal } from './screens/billing-portal.tsx';
|
|
11
|
+
import { screen as screen_checkout_js } from './screens/checkout-js.ts';
|
|
12
|
+
import { screen as screen_checkout } from './screens/checkout.tsx';
|
|
13
|
+
import { screen as screen_connect_onboarding } from './screens/connect-onboarding.tsx';
|
|
14
|
+
import { screen as screen_dashboard } from './screens/dashboard.tsx';
|
|
15
|
+
import { screen as screen_stripe_js } from './screens/stripe-js.ts';
|
|
16
|
+
|
|
17
|
+
export function createStripeFetch(options: PackFetchOptions = {}): DerivedFetch {
|
|
18
|
+
return createPackFetch({
|
|
19
|
+
manifest,
|
|
20
|
+
surface: surface as DerivedSurface,
|
|
21
|
+
handlers: stripeSemantics,
|
|
22
|
+
doors,
|
|
23
|
+
around,
|
|
24
|
+
clock,
|
|
25
|
+
screens: { "billing-portal": screen_billing_portal, "checkout-js": screen_checkout_js, "checkout": screen_checkout, "connect-onboarding": screen_connect_onboarding, "dashboard": screen_dashboard, "stripe-js": screen_stripe_js },
|
|
26
|
+
}, options);
|
|
27
|
+
}
|