@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,125 @@
|
|
|
1
|
+
import { AUTH, CARD, cardId, CH, historyEntry, holderId, merchantData, TXN } from "../engine/issuing.js";
|
|
2
|
+
import { isValidApiVersion, nowUnix, spendingControlsViolation, TWIN_API_VERSION } from "../engine/stripe.js";
|
|
3
|
+
import { stripeEventMatches } from "../engine/webhooks.js";
|
|
4
|
+
import { answeredByEndpoint, approvedAtOnce, askForAuthorization, at, authMissing, balanceOf, capture, created, fail, issuingRefusal, withCard } from "./shared.js";
|
|
5
|
+
export async function PostTestHelpersIssuingAuthorizations(ctx) {
|
|
6
|
+
const params = ctx.params;
|
|
7
|
+
const card = typeof params.card === 'string' ? params.card : '';
|
|
8
|
+
if (!card)
|
|
9
|
+
return fail(ctx, 'Missing required param: card.', 400, 'parameter_missing');
|
|
10
|
+
const c = ctx.get(CARD, card);
|
|
11
|
+
if (!c)
|
|
12
|
+
return fail(ctx, `No such card: '${card}'`, 400, 'resource_missing');
|
|
13
|
+
if (params.amount === undefined)
|
|
14
|
+
return fail(ctx, 'Missing required param: amount.', 400, 'parameter_missing');
|
|
15
|
+
const amount = Math.trunc(Number(params.amount) || 0);
|
|
16
|
+
const currency = String(params.currency ?? c.currency ?? 'usd');
|
|
17
|
+
const createdSec = Number(nowUnix(ctx.occurredAt));
|
|
18
|
+
const cardholderId = holderId(c);
|
|
19
|
+
const merchant = merchantData(params.merchant_data);
|
|
20
|
+
const isAmountControllable = params.is_amount_controllable === true;
|
|
21
|
+
const authMethod = typeof params.authorization_method === 'string' ? params.authorization_method : 'online';
|
|
22
|
+
if (!['chip', 'contactless', 'keyed_in', 'online', 'swipe'].includes(authMethod))
|
|
23
|
+
return issuingRefusal(ctx, 'authorization_method');
|
|
24
|
+
const merchantAmount = params.merchant_amount !== undefined ? Math.trunc(Number(params.merchant_amount) || 0) : amount;
|
|
25
|
+
const merchantCurrency = typeof params.merchant_currency === 'string' ? params.merchant_currency : currency;
|
|
26
|
+
const authId = ctx.mint(AUTH);
|
|
27
|
+
const baseFields = {
|
|
28
|
+
amount, amount_details: null, authorization_method: authMethod,
|
|
29
|
+
balance_transactions: [], transactions: [],
|
|
30
|
+
currency, fleet: null, fuel: null, livemode: false,
|
|
31
|
+
merchant_amount: merchantAmount, merchant_currency: merchantCurrency, merchant_data: merchant,
|
|
32
|
+
metadata: params.metadata && typeof params.metadata === 'object' ? params.metadata : {},
|
|
33
|
+
network_data: null,
|
|
34
|
+
verification_data: {
|
|
35
|
+
address_line1_check: 'not_provided', address_postal_code_check: 'not_provided',
|
|
36
|
+
authentication_exemption: null, cvc_check: 'match', expiry_check: 'match',
|
|
37
|
+
postal_code: null, three_d_secure: null,
|
|
38
|
+
},
|
|
39
|
+
wallet: null,
|
|
40
|
+
};
|
|
41
|
+
const subject = { id: authId, card, cardholder: cardholderId };
|
|
42
|
+
const entry = (o) => historyEntry({ ...o, currency, createdSec, merchantAmount, merchantCurrency });
|
|
43
|
+
const decline = async (reason, reasonMessage) => ctx.reply(withCard(ctx, await created(ctx, AUTH, subject, { ...baseFields, status: 'closed', approved: false, pending_request: null, request_history: [entry({ amount, approved: false, reason, reasonMessage })] })));
|
|
44
|
+
if (c.status === 'canceled')
|
|
45
|
+
return decline('card_canceled', 'The card has been canceled.');
|
|
46
|
+
// source: https://docs.stripe.com/api/issuing/cards/create "Defaults to inactive"
|
|
47
|
+
// source: spec:/components/schemas/issuing_authorization_request/properties/reason/enum "card_inactive"
|
|
48
|
+
if (c.status !== 'active')
|
|
49
|
+
return decline('card_inactive', 'The card is inactive.');
|
|
50
|
+
// what earlier approved authorizations on the card (or cardholder) already spent, for the limits
|
|
51
|
+
const prior = (key, value) => ctx.rows(AUTH).filter((a) => a[key] === value && a.approved === true)
|
|
52
|
+
.map((a) => ({ amount: Number(a.amount) || 0, created: Number(a.created) || 0, category: String(a.merchant_data?.category ?? '') }));
|
|
53
|
+
const controlsOpts = { amount, category: String(merchant.category ?? ''), country: merchant.country == null ? null : String(merchant.country), nowSec: createdSec };
|
|
54
|
+
const cardholderRow = cardholderId ? ctx.get(CH, cardholderId) : undefined;
|
|
55
|
+
const violation = spendingControlsViolation(c.spending_controls, { ...controlsOpts, priorApproved: prior('card', card) }) ??
|
|
56
|
+
spendingControlsViolation(cardholderRow?.spending_controls, { ...controlsOpts, priorApproved: prior('cardholder', cardholderId) });
|
|
57
|
+
if (violation)
|
|
58
|
+
return decline('spending_controls', violation);
|
|
59
|
+
// an authorization is paid from the Issuing balance, and declined when it cannot cover it
|
|
60
|
+
// (docs.stripe.com/issuing/funding/balance)
|
|
61
|
+
if ((balanceOf(ctx).issuing.get(currency) ?? 0) < amount)
|
|
62
|
+
return decline('insufficient_funds', 'Your Issuing balance does not have enough funds for this authorization.');
|
|
63
|
+
const pendingRequest = {
|
|
64
|
+
amount, amount_details: null, currency, is_amount_controllable: isAmountControllable,
|
|
65
|
+
merchant_amount: merchantAmount, merchant_currency: merchantCurrency, network_risk_score: null,
|
|
66
|
+
};
|
|
67
|
+
const endpoint = ctx.rows('webhook_endpoint').find((w) => w.status === 'enabled' && stripeEventMatches(w.enabled_events, 'issuing_authorization.request'));
|
|
68
|
+
// no real-time enrollment: "If you don't have a real-time authorization webhook, we approve the authorization without
|
|
69
|
+
// sending the issuing_authorization.request" (docs.stripe.com/issuing/purchases/authorizations), its outcome
|
|
70
|
+
// card_active, "approved according to your default Issuing settings"
|
|
71
|
+
if (!endpoint)
|
|
72
|
+
return approvedAtOnce(ctx, subject, baseFields, amount, entry({ amount, approved: true, reason: 'card_active', reasonMessage: null }));
|
|
73
|
+
// the request event's authorization carries pending_request, non-null only during the request
|
|
74
|
+
const requestObject = withCard(ctx, { object: 'issuing.authorization', id: authId, created: createdSec, ...baseFields, card, cardholder: cardholderId, status: 'pending', approved: false, pending_request: pendingRequest, request_history: [] });
|
|
75
|
+
// the request asked of the endpoint and the stored event are one event under one id
|
|
76
|
+
const pinned = ctx.call.request.headers.get('stripe-version');
|
|
77
|
+
const requestEvent = {
|
|
78
|
+
id: ctx.mint('event'), object: 'event', api_version: pinned && isValidApiVersion(pinned) ? pinned : TWIN_API_VERSION, created: createdSec,
|
|
79
|
+
data: { object: requestObject }, livemode: false, pending_webhooks: 1, request: { id: null, idempotency_key: null }, type: 'issuing_authorization.request',
|
|
80
|
+
};
|
|
81
|
+
await ctx.write('event', requestEvent.id, requestEvent, 'event.record');
|
|
82
|
+
const outcome = await askForAuthorization(ctx, String(endpoint.url), requestEvent, String(endpoint.secret ?? ''));
|
|
83
|
+
// a request no one answered (the World refused the delivery, it failed, or it timed out) is not a decision: the
|
|
84
|
+
// authorization stays pending with its request, for the deprecated approve or decline "within the timeout window of
|
|
85
|
+
// the real-time authorization flow" (the served spec), until lapseRealtimeRequests decides it when the window ends
|
|
86
|
+
if (outcome.kind === 'timeout')
|
|
87
|
+
return ctx.reply(withCard(ctx, await created(ctx, AUTH, subject, { ...baseFields, status: 'pending', approved: false, request_history: [], pending_request: pendingRequest })));
|
|
88
|
+
return answeredByEndpoint(ctx, outcome, { subject, fields: baseFields, amount, controllable: isAmountControllable, entry, decline });
|
|
89
|
+
}
|
|
90
|
+
export async function PostTestHelpersIssuingAuthorizationsAuthorizationCapture(ctx) {
|
|
91
|
+
const id = at(ctx, 'authorization');
|
|
92
|
+
const auth = ctx.get(AUTH, id);
|
|
93
|
+
if (!auth)
|
|
94
|
+
return authMissing(ctx, id);
|
|
95
|
+
if (auth.approved !== true || auth.status !== 'pending')
|
|
96
|
+
return issuingRefusal(ctx, 'not_capturable', auth);
|
|
97
|
+
const closeAuthorization = ctx.params.close_authorization !== false;
|
|
98
|
+
const refused = ctx.legal(AUTH, 'status', 'PostTestHelpersIssuingAuthorizationsAuthorizationCapture', auth.status, closeAuthorization ? 'closed' : 'pending');
|
|
99
|
+
if (refused)
|
|
100
|
+
return ctx.refuse(refused);
|
|
101
|
+
const txns = Array.isArray(auth.transactions) ? auth.transactions : [];
|
|
102
|
+
const capturedSoFar = txns.map((t) => ctx.get(TXN, String(t))).reduce((s, t) => s + Math.abs(Number(t?.amount) || 0), 0);
|
|
103
|
+
const remaining = (Number(auth.amount) || 0) - capturedSoFar;
|
|
104
|
+
const captureAmount = ctx.params.capture_amount !== undefined ? Math.trunc(Number(ctx.params.capture_amount) || 0) : remaining;
|
|
105
|
+
if (captureAmount <= 0 || captureAmount > remaining)
|
|
106
|
+
return fail(ctx, 'Invalid capture_amount: must be a positive integer no greater than the uncaptured authorized amount.', 400, 'parameter_invalid_integer');
|
|
107
|
+
// the capture releases what the approval held and debits the transaction; a capture that closes the authorization
|
|
108
|
+
// releases ALL it still holds, the uncaptured rest included: the amount is held "until the authorization is either
|
|
109
|
+
// captured, voided, or expired without capture" (docs.stripe.com/issuing/purchases/authorizations), and a closed
|
|
110
|
+
// authorization can be captured no further (close_authorization "Defaults to true. Set to false to enable
|
|
111
|
+
// multi-capture flows", the served spec). A capture that keeps it open releases only what it captured.
|
|
112
|
+
const currency = typeof auth.currency === 'string' ? auth.currency : 'usd';
|
|
113
|
+
const released = closeAuthorization ? remaining : captureAmount;
|
|
114
|
+
const release = await created(ctx, 'balance_transaction', {}, {
|
|
115
|
+
amount: released, currency, fee: 0, net: released, type: 'issuing_authorization_release',
|
|
116
|
+
status: 'available', balance_type: 'issuing', reporting_category: 'issuing_authorization_release',
|
|
117
|
+
available_on: nowUnix(ctx.occurredAt), fee_details: [], source: id,
|
|
118
|
+
});
|
|
119
|
+
const captured = await capture(ctx, id, { ...auth, card: cardId(auth) }, captureAmount);
|
|
120
|
+
return ctx.reply(withCard(ctx, await ctx.write(AUTH, id, {
|
|
121
|
+
status: closeAuthorization ? 'closed' : 'pending',
|
|
122
|
+
transactions: [...txns, captured.txnId],
|
|
123
|
+
balance_transactions: [...(Array.isArray(auth.balance_transactions) ? auth.balance_transactions : []), release.id, captured.btId],
|
|
124
|
+
}, 'issuing_authorization.updated')));
|
|
125
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare
|
|
1
|
+
import type { HandlerContext } from '@volter/world-core';
|
|
2
|
+
export declare function PostTransfers(ctx: HandlerContext): Promise<Response>;
|
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
import { validateMoney } from "../stripe
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
const emptyList = (url) => ({ object: 'list', data: [], has_more: false, total_count: 0, url });
|
|
6
|
-
/** A transfer to an account whose transfers capability is not active. */
|
|
7
|
-
function transfersInactive(ctx) {
|
|
8
|
-
return ctx.refuse({ status: 400, code: 'insufficient_capabilities_for_transfer', param: 'destination', message: 'Your destination account needs to have at least one of the following capabilities enabled: transfers, crypto_transfers, legacy_payments' });
|
|
9
|
-
}
|
|
10
|
-
const create = async (ctx) => {
|
|
1
|
+
import { nowUnix, validateMoney } from "../engine/stripe.js";
|
|
2
|
+
import { emptyList } from "../engine/transfers.js";
|
|
3
|
+
import { created, fail, refusePayout, send, settledSourceRefused, settleTransfer, transfersInactive } from "./shared.js";
|
|
4
|
+
export async function PostTransfers(ctx) {
|
|
11
5
|
const bad = validateMoney(ctx.params);
|
|
12
6
|
if (bad)
|
|
13
7
|
return send(ctx, bad);
|
|
@@ -40,10 +34,10 @@ const create = async (ctx) => {
|
|
|
40
34
|
return fail(ctx, `The transfers from source_transaction ${sourceId} would exceed its amount (${String(charge.amount)}).`, 400, 'invalid_request_error');
|
|
41
35
|
const bt = typeof charge.balance_transaction === 'string' ? ctx.get('balance_transaction', charge.balance_transaction) : undefined;
|
|
42
36
|
// a charge that has settled waives nothing: the transfer comes out of what is available
|
|
43
|
-
const settledRefusal = bt && Number(bt.available_on) <= Number(ctx.
|
|
37
|
+
const settledRefusal = bt && Number(bt.available_on) <= Number(nowUnix(ctx.occurredAt)) ? settledSourceRefused(ctx, amount, currency) : undefined;
|
|
44
38
|
if (settledRefusal)
|
|
45
39
|
return settledRefusal;
|
|
46
|
-
availableOn = Math.max(Number(ctx.
|
|
40
|
+
availableOn = Math.max(Number(nowUnix(ctx.occurredAt)), Number(bt?.available_on) || 0);
|
|
47
41
|
group = typeof charge.transfer_group === 'string' ? charge.transfer_group : typeof charge.payment_intent === 'string' ? `group_${charge.payment_intent}` : undefined;
|
|
48
42
|
// the generated group is the charge's too
|
|
49
43
|
if (group && charge.transfer_group !== group)
|
|
@@ -62,93 +56,4 @@ const create = async (ctx) => {
|
|
|
62
56
|
reversals: emptyList(`/v1/transfers/${id}/reversals`),
|
|
63
57
|
destination_payment: `py_${id.replace(/^tr_/, '')}`,
|
|
64
58
|
}));
|
|
65
|
-
};
|
|
66
|
-
/** A transfer from a charge whose funds have settled: "With a source_transaction, the transfer request returns success
|
|
67
|
-
* regardless of your available balance if the related charge hasn't settled yet" (docs.stripe.com/connect/separate-
|
|
68
|
-
* charges-and-transfers), so a settled one comes out of the available balance. */
|
|
69
|
-
function settledSourceRefused(ctx, amount, currency) {
|
|
70
|
-
return refusePayout(ctx, amount, currency, undefined);
|
|
71
|
-
}
|
|
72
|
-
/** An application fee refunded to its whole through its own refunds endpoint: the fee machine's move, or its refusal. */
|
|
73
|
-
function feeFullyRefunded(ctx, resource, flag, id) {
|
|
74
|
-
const refused = ctx.legal(resource, flag, ctx.call.operation.id, 'false', 'true', id);
|
|
75
|
-
return refused ? ctx.refuse(refused) : undefined;
|
|
76
|
-
}
|
|
77
|
-
/** Take `amount` (the remainder by default) back out of a parent's total, as a child row appended to its list. */
|
|
78
|
-
async function giveBack(ctx, o) {
|
|
79
|
-
const id = String(o.parent.id);
|
|
80
|
-
const total = Number(o.parent.amount ?? 0);
|
|
81
|
-
const already = Number(o.parent[o.doneField] ?? 0);
|
|
82
|
-
const remaining = total - already;
|
|
83
|
-
const amount = ctx.params.amount !== undefined ? Math.trunc(Number(ctx.params.amount) || 0) : remaining;
|
|
84
|
-
if (amount <= 0 || amount > remaining)
|
|
85
|
-
return fail(ctx, o.tooLarge(remaining), 400, 'amount_too_large');
|
|
86
|
-
const done = already + amount;
|
|
87
|
-
// a fee refunded in full is `refunded`: the application fee machine's move (a transfer's `reversed` is no state)
|
|
88
|
-
const feeRefusal = o.parentResource === 'application_fee' && done >= total && o.parent[o.flag] !== true ? feeFullyRefunded(ctx, o.parentResource, o.flag, id) : undefined;
|
|
89
|
-
if (feeRefusal)
|
|
90
|
-
return feeRefusal;
|
|
91
|
-
// the `metadata` a reversal or a fee refund is created with is its own ("Set of key-value pairs that you can attach to
|
|
92
|
-
// an object", docs.stripe.com/api/transfer_reversals/create, docs.stripe.com/api/fee_refunds/create)
|
|
93
|
-
const metadata = ctx.params.metadata && typeof ctx.params.metadata === 'object' ? { metadata: ctx.params.metadata } : {};
|
|
94
|
-
const child = await created(ctx, o.child, { ...o.childFields(amount), ...metadata }, o.childDefaults);
|
|
95
|
-
if (o.settle)
|
|
96
|
-
await o.settle(child, amount);
|
|
97
|
-
const existing = o.parent[o.flag === 'reversed' ? 'reversals' : 'refunds'] ?? { object: 'list', data: [], has_more: false, total_count: 0 };
|
|
98
|
-
const data = [...(existing.data ?? []), child];
|
|
99
|
-
await ctx.write(o.parentResource, id, {
|
|
100
|
-
[o.doneField]: done, [o.flag]: done >= total,
|
|
101
|
-
[o.flag === 'reversed' ? 'reversals' : 'refunds']: { ...existing, data, total_count: data.length, url: o.listUrl },
|
|
102
|
-
}, o.op);
|
|
103
|
-
return ctx.reply(child);
|
|
104
59
|
}
|
|
105
|
-
const reverse = async (ctx) => {
|
|
106
|
-
const id = at(ctx, 'id');
|
|
107
|
-
const tr = ctx.get('transfer', id);
|
|
108
|
-
if (!tr)
|
|
109
|
-
return transferMissing(ctx, id);
|
|
110
|
-
return giveBack(ctx, {
|
|
111
|
-
parent: tr, parentResource: 'transfer', child: 'transfer_reversal',
|
|
112
|
-
childFields: (amount) => ({ amount, currency: tr.currency ?? 'usd', transfer: id }),
|
|
113
|
-
childDefaults: { balance_transaction: null, destination_payment_refund: null, source_refund: null, metadata: {} },
|
|
114
|
-
doneField: 'amount_reversed', flag: 'reversed', listUrl: `/v1/transfers/${id}/reversals`, op: 'transfer.reversed',
|
|
115
|
-
tooLarge: (remaining) => `Transfer ${id} can only be reversed up to ${remaining}.`,
|
|
116
|
-
settle: async (child, amount) => {
|
|
117
|
-
const bt = await settleTransferReversal(ctx, String(child.id), amount, String(tr.currency ?? 'usd'), String(tr.destination));
|
|
118
|
-
await ctx.write('transfer_reversal', String(child.id), { balance_transaction: bt }, 'transfer_reversal.updated');
|
|
119
|
-
},
|
|
120
|
-
});
|
|
121
|
-
};
|
|
122
|
-
const reversals = async (ctx) => {
|
|
123
|
-
const id = at(ctx, 'id');
|
|
124
|
-
if (!ctx.get('transfer', id))
|
|
125
|
-
return transferMissing(ctx, id);
|
|
126
|
-
return list(ctx, 'transfer_reversal', newest(ctx, 'transfer_reversal').filter((r) => r.transfer === id));
|
|
127
|
-
};
|
|
128
|
-
const feeMissing = (ctx, id) => fail(ctx, `No such application fee: '${id}'`, 404, 'resource_missing');
|
|
129
|
-
const refundFee = async (ctx) => {
|
|
130
|
-
const id = at(ctx, 'id');
|
|
131
|
-
const fee = ctx.get('application_fee', id);
|
|
132
|
-
if (!fee)
|
|
133
|
-
return feeMissing(ctx, id);
|
|
134
|
-
return giveBack(ctx, {
|
|
135
|
-
parent: fee, parentResource: 'application_fee', child: 'fee_refund',
|
|
136
|
-
childFields: (amount) => ({ amount, currency: fee.currency ?? 'usd', fee: id }),
|
|
137
|
-
childDefaults: { balance_transaction: null, metadata: {} },
|
|
138
|
-
doneField: 'amount_refunded', flag: 'refunded', listUrl: `/v1/application_fees/${id}/refunds`, op: 'application_fee.refunded',
|
|
139
|
-
tooLarge: (remaining) => `Application fee ${id} can only be refunded up to ${remaining}.`,
|
|
140
|
-
});
|
|
141
|
-
};
|
|
142
|
-
const feeRefunds = async (ctx) => {
|
|
143
|
-
const id = at(ctx, 'id');
|
|
144
|
-
if (!ctx.get('application_fee', id))
|
|
145
|
-
return feeMissing(ctx, id);
|
|
146
|
-
return list(ctx, 'fee_refund', newest(ctx, 'fee_refund').filter((r) => r.fee === id));
|
|
147
|
-
};
|
|
148
|
-
export const transfers = {
|
|
149
|
-
PostTransfers: create,
|
|
150
|
-
PostTransfersIdReversals: reverse,
|
|
151
|
-
GetTransfersIdReversals: reversals,
|
|
152
|
-
PostApplicationFeesIdRefunds: refundFee,
|
|
153
|
-
GetApplicationFeesIdRefunds: feeRefunds,
|
|
154
|
-
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { asBool } from "../engine/stripe.js";
|
|
2
|
+
import { WE } from "../engine/webhook-endpoints.js";
|
|
3
|
+
import { created, fail } from "./shared.js";
|
|
4
|
+
// an endpoint is enabled at once and signs each event with a secret of its own, answered by this create alone (the
|
|
5
|
+
// around answers no other read of it)
|
|
6
|
+
export async function PostWebhookEndpoints(ctx) {
|
|
7
|
+
const params = ctx.params;
|
|
8
|
+
// source: spec:PostWebhookEndpoints "The URL of the webhook endpoint."
|
|
9
|
+
if (typeof params.url !== 'string' || params.url === '')
|
|
10
|
+
return fail(ctx, 'Missing required param: url.', 400, 'parameter_missing');
|
|
11
|
+
// source: spec:PostWebhookEndpoints "The list of events to enable for this endpoint."
|
|
12
|
+
if (params.enabled_events === undefined || params.enabled_events === '' || (Array.isArray(params.enabled_events) && !params.enabled_events.length))
|
|
13
|
+
return fail(ctx, 'Missing required param: enabled_events.', 400, 'parameter_missing');
|
|
14
|
+
const id = ctx.mint(WE);
|
|
15
|
+
// source: spec:/components/schemas/webhook_endpoint/properties/secret/description "The endpoint's secret, used to generate"
|
|
16
|
+
const secret = `whsec_${(await ctx.secret(`webhook-endpoint-secret:${id}`)).replace(/[^A-Za-z0-9]/g, '').slice(0, 32)}`;
|
|
17
|
+
return ctx.reply(await created(ctx, WE, { ...params, id }, {
|
|
18
|
+
url: params.url, enabled_events: Array.isArray(params.enabled_events) ? params.enabled_events.map(String) : [String(params.enabled_events)],
|
|
19
|
+
// source: spec:/components/schemas/webhook_endpoint/properties/status/description "The status of the webhook."
|
|
20
|
+
status: 'enabled', livemode: false, metadata: {}, application: null,
|
|
21
|
+
api_version: typeof params.api_version === 'string' ? params.api_version : null,
|
|
22
|
+
description: typeof params.description === 'string' ? params.description : null,
|
|
23
|
+
// source: spec:PostWebhookEndpoints "Whether this endpoint should receive events from connected accounts"
|
|
24
|
+
connect: asBool(params.connect), secret,
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// FETCH-FIRST (runtime contract R12b): a fixed file, the kernel's serve seam around the pack's fetch (./fetch.ts).
|
|
2
|
+
import { serveHttp } from '@volter/world-core';
|
|
3
|
+
import { createStripeFetch } from "./fetch.js";
|
|
4
|
+
export async function createStripeTwinServer(options = {}) {
|
|
5
|
+
const server = await serveHttp({ port: options.port ?? 0, idleTimeout: 60, fetch: createStripeFetch(options) });
|
|
6
|
+
return { port: server.port ?? options.port ?? 0, stop: () => server.stop(true) };
|
|
7
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"//": "GENERATED by scripts/pack-facts.ts — current pack descriptors and explicit world-runtime server backings; no prior-artifact entries are retained.",
|
|
3
|
+
"packs": {
|
|
4
|
+
"stripe": {
|
|
5
|
+
"adoption": {
|
|
6
|
+
"pypi": [
|
|
7
|
+
"stripe"
|
|
8
|
+
],
|
|
9
|
+
"sdks": [
|
|
10
|
+
"stripe"
|
|
11
|
+
],
|
|
12
|
+
"envStems": [
|
|
13
|
+
"STRIPE",
|
|
14
|
+
"NEXTPRIVATESTRIPE"
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
"hosts": [
|
|
18
|
+
{
|
|
19
|
+
"host": "api.stripe.com"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"host": "checkout.stripe.com",
|
|
23
|
+
"pathPattern": "^/c/pay/"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"host": "billing.stripe.com",
|
|
27
|
+
"pathPattern": "^/p/session/"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"host": "connect.stripe.com",
|
|
31
|
+
"pathPattern": "^/setup/"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"host": "dashboard.stripe.com",
|
|
35
|
+
"pathPattern": "^/radar/lists(?:/[^/]+)?/?$|^/test/issuing/balance/?$|^/settings/public/?$"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"host": "verify.stripe.com",
|
|
39
|
+
"pathPattern": "^/start/"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"host": "js.stripe.com",
|
|
43
|
+
"pathPattern": "^/v3/?$|^/(v3|[a-z]+)/stripe\\.js$"
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
"archetype": "crud",
|
|
47
|
+
"protocol": {
|
|
48
|
+
"declared": "3",
|
|
49
|
+
"major": 3,
|
|
50
|
+
"standing": "current"
|
|
51
|
+
},
|
|
52
|
+
"transport": "rest",
|
|
53
|
+
"resources": [
|
|
54
|
+
"charge",
|
|
55
|
+
"customer",
|
|
56
|
+
"payment_intent",
|
|
57
|
+
"setup_intent",
|
|
58
|
+
"payment_method",
|
|
59
|
+
"subscription",
|
|
60
|
+
"price",
|
|
61
|
+
"product",
|
|
62
|
+
"invoice",
|
|
63
|
+
"invoiceitem",
|
|
64
|
+
"refund",
|
|
65
|
+
"event"
|
|
66
|
+
],
|
|
67
|
+
"credentialDoor": {
|
|
68
|
+
"path": "/_twin/app-credentials",
|
|
69
|
+
"body": {},
|
|
70
|
+
"fill": {
|
|
71
|
+
"STRIPE_SECRET_KEY": "secret_key",
|
|
72
|
+
"STRIPE_API_KEY": "secret_key",
|
|
73
|
+
"STRIPE_PRIVATE_KEY": "secret_key",
|
|
74
|
+
"BILLING_STRIPE_API_KEY": "secret_key",
|
|
75
|
+
"STRIPE_PUBLISHABLE_KEY": "publishable_key",
|
|
76
|
+
"NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY": "publishable_key",
|
|
77
|
+
"NEXT_PUBLIC_STRIPE_PUBLIC_KEY": "publishable_key",
|
|
78
|
+
"NEXT_PUBLIC_STRIPE_KEY": "publishable_key",
|
|
79
|
+
"STRIPE_WEBHOOK_SECRET": "webhook_secret",
|
|
80
|
+
"STRIPE_WEBHOOK_SIGNING_SECRET": "webhook_secret",
|
|
81
|
+
"STRIPE_ENDPOINT_SECRET": "webhook_secret",
|
|
82
|
+
"STRIPE_WEBHOOK_SECRET_KEY": "webhook_secret",
|
|
83
|
+
"NEXT_PRIVATE_STRIPE_WEBHOOK_SECRET": "webhook_secret",
|
|
84
|
+
"BILLING_STRIPE_WEBHOOK_SECRET": "webhook_secret",
|
|
85
|
+
"STRIPE_CONNECT_WEBHOOK_SECRET": "connect_webhook_secret",
|
|
86
|
+
"STRIPE_WEBHOOK_SECRET_CONNECT": "connect_webhook_secret",
|
|
87
|
+
"STRIPE_CONNECT_WEBHOOK_SIGNING_SECRET": "connect_webhook_secret"
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
"serveExport": "createStripeTwinServer"
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"undeclared": []
|
|
94
|
+
}
|