@teleporthq/teleport-plugin-next-workflows 0.43.67 → 0.43.69
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/__tests__/_helpers/bind-workflow-utils.ts +16 -1
- package/__tests__/_helpers/fake-fetch.ts +96 -0
- package/__tests__/_helpers/fake-stripe.ts +52 -0
- package/__tests__/_helpers/load-handler.ts +22 -3
- package/__tests__/_helpers/load-invoice-route.ts +75 -0
- package/__tests__/_helpers/load-payment-drivers.ts +69 -0
- package/__tests__/_helpers/load-server-runtime.ts +33 -0
- package/__tests__/_helpers/run-generated-middleware.ts +50 -9
- package/__tests__/admin-form-hydration-target.test.ts +39 -0
- package/__tests__/admin-form-row-hydration.test.ts +58 -0
- package/__tests__/ai-select-database-data-handler.test.ts +14 -3
- package/__tests__/api-route-file-name-segments.test.ts +33 -0
- package/__tests__/app-secret-env.test.ts +55 -0
- package/__tests__/auth-env-secret-preservation.test.ts +22 -3
- package/__tests__/auth-nextauth-url.test.ts +134 -50
- package/__tests__/cart-add-item-kinds.test.ts +259 -0
- package/__tests__/cart-add-item-line-fields.test.ts +328 -0
- package/__tests__/cart-availability-add-to-cart.test.ts +108 -0
- package/__tests__/cart-get-total-discounts.test.ts +499 -0
- package/__tests__/cart-get-total-product-options.test.ts +195 -0
- package/__tests__/cart-get-total-subscriptions.test.ts +221 -0
- package/__tests__/cart-price-order.test.ts +283 -0
- package/__tests__/cart-update-item-quantity-recurring.test.ts +75 -0
- package/__tests__/client-loop-current-item.test.ts +164 -0
- package/__tests__/cron-route-loop-custom-node.test.ts +123 -0
- package/__tests__/cron-route-loop-templateparams.test.ts +7 -0
- package/__tests__/cron-route-verification.test.ts +252 -0
- package/__tests__/custom-js-runtime-base-url.test.ts +64 -0
- package/__tests__/custom-nodes-admin-module.test.ts +310 -0
- package/__tests__/data-api-browser-reads.test.ts +341 -0
- package/__tests__/data-api-low-stock-autofire.test.ts +67 -17
- package/__tests__/data-api-optional-feature-columns.test.ts +240 -0
- package/__tests__/data-api-protected-tables.test.ts +948 -0
- package/__tests__/data-node-not-awaited.test.ts +7 -3
- package/__tests__/data-write-missing-filter.test.ts +119 -0
- package/__tests__/ecommerce-rewriter-product-options.test.ts +143 -0
- package/__tests__/email-locale-senders.test.ts +1 -1
- package/__tests__/file-storage-upload-picked-files.test.ts +20 -0
- package/__tests__/input-debounce-per-field.test.ts +141 -0
- package/__tests__/internal-request-headers.test.ts +7 -3
- package/__tests__/invoice-data-access-replace.test.ts +340 -0
- package/__tests__/invoice-delivery-fee.test.ts +3 -2
- package/__tests__/invoice-generate-hydration.test.ts +20 -12
- package/__tests__/invoice-order-items-settle.test.ts +51 -46
- package/__tests__/invoice-product-options.test.ts +177 -0
- package/__tests__/invoice-regenerate-route.test.ts +488 -0
- package/__tests__/invoice-regional-tax.test.ts +3 -2
- package/__tests__/invoice-reservation.test.ts +195 -0
- package/__tests__/invoice-route-access.test.ts +275 -0
- package/__tests__/invoice-self-call-origin.test.ts +117 -0
- package/__tests__/invoice-tender.test.ts +550 -0
- package/__tests__/legacy-webhook-self-calls.test.ts +187 -0
- package/__tests__/locale-aware-redirects.test.ts +55 -26
- package/__tests__/loop-collection-unwrap.test.ts +6 -1
- package/__tests__/middleware-subscriber-access.test.ts +269 -0
- package/__tests__/payment-charge-user-earlier-attempt.test.ts +267 -0
- package/__tests__/payment-charge-user-handler-serialization.test.ts +47 -82
- package/__tests__/payment-charge-user-line-descriptions.test.ts +124 -0
- package/__tests__/payment-charge-user-report-refusal.test.ts +105 -0
- package/__tests__/payment-close-checkout-node.test.ts +127 -0
- package/__tests__/payment-driver-close-checkout.test.ts +1163 -0
- package/__tests__/payment-driver-coingate.test.ts +470 -0
- package/__tests__/payment-driver-inspect-checkout.test.ts +648 -0
- package/__tests__/payment-driver-mollie.test.ts +864 -0
- package/__tests__/payment-driver-paddle.test.ts +870 -0
- package/__tests__/payment-driver-paypal-capture.test.ts +158 -0
- package/__tests__/payment-driver-paypal-webhook.test.ts +367 -0
- package/__tests__/payment-driver-razorpay.test.ts +895 -0
- package/__tests__/payment-driver-square.test.ts +977 -0
- package/__tests__/payment-driver-stripe.test.ts +267 -0
- package/__tests__/payment-drivers-module.test.ts +429 -0
- package/__tests__/payment-legacy-webhook-routes.test.ts +588 -0
- package/__tests__/payment-redirect-and-order-notification.test.ts +98 -39
- package/__tests__/payment-refund.test.ts +523 -22
- package/__tests__/payment-subscription-nodes.test.ts +1360 -0
- package/__tests__/payment-webhook-route.test.ts +523 -0
- package/__tests__/paypal-webhook-signature-verification.test.ts +205 -0
- package/__tests__/prune-context-oversized-leaf.test.ts +1 -0
- package/__tests__/prune-context-state-keys.test.ts +89 -0
- package/__tests__/push-node-handlers.test.ts +291 -0
- package/__tests__/route-changed-trigger.test.ts +40 -0
- package/__tests__/runtime-storage-upload-access.test.ts +255 -0
- package/__tests__/security-runtime-shadow.test.ts +103 -1
- package/__tests__/segment-reply-changed-keys.test.ts +146 -0
- package/__tests__/segment-state-keys-emission.test.ts +185 -0
- package/__tests__/segment-state-needs.test.ts +102 -0
- package/__tests__/server-segment-context-integrity.test.ts +210 -0
- package/__tests__/server-step-signing.test.ts +371 -0
- package/__tests__/session-cookie-resolver.test.ts +59 -0
- package/__tests__/stock-decrement-audit.test.ts +17 -0
- package/__tests__/subscriber-access-route.test.ts +406 -0
- package/__tests__/webhook-delivery-lease.test.ts +316 -0
- package/__tests__/workflow-auth-guard.test.ts +253 -2
- package/dist/cjs/admin-form-hydration.d.ts +10 -0
- package/dist/cjs/admin-form-hydration.d.ts.map +1 -0
- package/dist/cjs/admin-form-hydration.js +25 -0
- package/dist/cjs/admin-form-hydration.js.map +1 -0
- package/dist/cjs/api-route-generator.d.ts +19 -3
- package/dist/cjs/api-route-generator.d.ts.map +1 -1
- package/dist/cjs/api-route-generator.js +190 -70
- package/dist/cjs/api-route-generator.js.map +1 -1
- package/dist/cjs/auth-generator.d.ts +4 -1
- package/dist/cjs/auth-generator.d.ts.map +1 -1
- package/dist/cjs/auth-generator.js +241 -62
- package/dist/cjs/auth-generator.js.map +1 -1
- package/dist/cjs/auth-return/signed-in-destination-code.d.ts +17 -0
- package/dist/cjs/auth-return/signed-in-destination-code.d.ts.map +1 -0
- package/dist/cjs/auth-return/signed-in-destination-code.js +37 -0
- package/dist/cjs/auth-return/signed-in-destination-code.js.map +1 -0
- package/dist/cjs/cart-pricing-preamble.d.ts +12 -0
- package/dist/cjs/cart-pricing-preamble.d.ts.map +1 -0
- package/dist/cjs/cart-pricing-preamble.js +23 -0
- package/dist/cjs/cart-pricing-preamble.js.map +1 -0
- package/dist/cjs/cron-request-verification.d.ts +24 -0
- package/dist/cjs/cron-request-verification.d.ts.map +1 -0
- package/dist/cjs/cron-request-verification.js +84 -0
- package/dist/cjs/cron-request-verification.js.map +1 -0
- package/dist/cjs/custom-node-modules.d.ts +30 -0
- package/dist/cjs/custom-node-modules.d.ts.map +1 -0
- package/dist/cjs/custom-node-modules.js +90 -0
- package/dist/cjs/custom-node-modules.js.map +1 -0
- package/dist/cjs/data-api-route-generator.d.ts +27 -0
- package/dist/cjs/data-api-route-generator.d.ts.map +1 -1
- package/dist/cjs/data-api-route-generator.js +366 -29
- package/dist/cjs/data-api-route-generator.js.map +1 -1
- package/dist/cjs/ecommerce/cart-availability.d.ts.map +1 -1
- package/dist/cjs/ecommerce/cart-availability.js +22 -13
- package/dist/cjs/ecommerce/cart-availability.js.map +1 -1
- package/dist/cjs/ecommerce/stock-decrement.d.ts +2 -1
- package/dist/cjs/ecommerce/stock-decrement.d.ts.map +1 -1
- package/dist/cjs/ecommerce/stock-decrement.js +6 -0
- package/dist/cjs/ecommerce/stock-decrement.js.map +1 -1
- package/dist/cjs/executor-generator.d.ts +0 -1
- package/dist/cjs/executor-generator.d.ts.map +1 -1
- package/dist/cjs/executor-generator.js +213 -20
- package/dist/cjs/executor-generator.js.map +1 -1
- package/dist/cjs/index.d.ts +12 -4
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +25 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/invoice/api-routes-code.d.ts +26 -0
- package/dist/cjs/invoice/api-routes-code.d.ts.map +1 -1
- package/dist/cjs/invoice/api-routes-code.js +423 -391
- package/dist/cjs/invoice/api-routes-code.js.map +1 -1
- package/dist/cjs/invoice/data-access-code.d.ts.map +1 -1
- package/dist/cjs/invoice/data-access-code.js +420 -107
- package/dist/cjs/invoice/data-access-code.js.map +1 -1
- package/dist/cjs/invoice/index.d.ts.map +1 -1
- package/dist/cjs/invoice/index.js +24 -0
- package/dist/cjs/invoice/index.js.map +1 -1
- package/dist/cjs/invoice/invoice-assembly-code.d.ts +12 -0
- package/dist/cjs/invoice/invoice-assembly-code.d.ts.map +1 -0
- package/dist/cjs/invoice/invoice-assembly-code.js +517 -0
- package/dist/cjs/invoice/invoice-assembly-code.js.map +1 -0
- package/dist/cjs/invoice/invoice-html-code.d.ts.map +1 -1
- package/dist/cjs/invoice/invoice-html-code.js +111 -9
- package/dist/cjs/invoice/invoice-html-code.js.map +1 -1
- package/dist/cjs/invoice/pdf-service-client-code.d.ts.map +1 -1
- package/dist/cjs/invoice/pdf-service-client-code.js +3 -4
- package/dist/cjs/invoice/pdf-service-client-code.js.map +1 -1
- package/dist/cjs/nodes/account/account-login.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-login.js +4 -3
- package/dist/cjs/nodes/account/account-login.js.map +1 -1
- package/dist/cjs/nodes/account/account-signup.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-signup.js +7 -4
- package/dist/cjs/nodes/account/account-signup.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-select-database-data.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-select-database-data.js +6 -1
- package/dist/cjs/nodes/ai/ai-select-database-data.js.map +1 -1
- package/dist/cjs/nodes/browser/browser-get-push-subscription.d.ts +9 -0
- package/dist/cjs/nodes/browser/browser-get-push-subscription.d.ts.map +1 -0
- package/dist/cjs/nodes/browser/browser-get-push-subscription.js +25 -0
- package/dist/cjs/nodes/browser/browser-get-push-subscription.js.map +1 -0
- package/dist/cjs/nodes/browser/browser-show-notification.d.ts +10 -0
- package/dist/cjs/nodes/browser/browser-show-notification.d.ts.map +1 -1
- package/dist/cjs/nodes/browser/browser-show-notification.js +65 -40
- package/dist/cjs/nodes/browser/browser-show-notification.js.map +1 -1
- package/dist/cjs/nodes/browser/browser-subscribe-to-push.d.ts +11 -0
- package/dist/cjs/nodes/browser/browser-subscribe-to-push.d.ts.map +1 -1
- package/dist/cjs/nodes/browser/browser-subscribe-to-push.js +21 -31
- package/dist/cjs/nodes/browser/browser-subscribe-to-push.js.map +1 -1
- package/dist/cjs/nodes/browser/browser-unsubscribe-from-push.d.ts +8 -0
- package/dist/cjs/nodes/browser/browser-unsubscribe-from-push.d.ts.map +1 -0
- package/dist/cjs/nodes/browser/browser-unsubscribe-from-push.js +24 -0
- package/dist/cjs/nodes/browser/browser-unsubscribe-from-push.js.map +1 -0
- package/dist/cjs/nodes/browser/push-api-access.d.ts +12 -0
- package/dist/cjs/nodes/browser/push-api-access.d.ts.map +1 -0
- package/dist/cjs/nodes/browser/push-api-access.js +19 -0
- package/dist/cjs/nodes/browser/push-api-access.js.map +1 -0
- package/dist/cjs/nodes/cart/cart-add-item.d.ts.map +1 -1
- package/dist/cjs/nodes/cart/cart-add-item.js +174 -10
- package/dist/cjs/nodes/cart/cart-add-item.js.map +1 -1
- package/dist/cjs/nodes/cart/cart-clear.d.ts.map +1 -1
- package/dist/cjs/nodes/cart/cart-clear.js +11 -0
- package/dist/cjs/nodes/cart/cart-clear.js.map +1 -1
- package/dist/cjs/nodes/cart/cart-get-total.d.ts.map +1 -1
- package/dist/cjs/nodes/cart/cart-get-total.js +260 -3
- package/dist/cjs/nodes/cart/cart-get-total.js.map +1 -1
- package/dist/cjs/nodes/cart/cart-price-order.d.ts +3 -0
- package/dist/cjs/nodes/cart/cart-price-order.d.ts.map +1 -0
- package/dist/cjs/nodes/cart/cart-price-order.js +281 -0
- package/dist/cjs/nodes/cart/cart-price-order.js.map +1 -0
- package/dist/cjs/nodes/cart/cart-update-item-quantity.d.ts.map +1 -1
- package/dist/cjs/nodes/cart/cart-update-item-quantity.js +7 -0
- package/dist/cjs/nodes/cart/cart-update-item-quantity.js.map +1 -1
- package/dist/cjs/nodes/data/data-count.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-count.js +6 -1
- package/dist/cjs/nodes/data/data-count.js.map +1 -1
- package/dist/cjs/nodes/data/data-create-item.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-create-item.js +11 -1
- package/dist/cjs/nodes/data/data-create-item.js.map +1 -1
- package/dist/cjs/nodes/data/data-delete-item.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-delete-item.js +29 -0
- package/dist/cjs/nodes/data/data-delete-item.js.map +1 -1
- package/dist/cjs/nodes/data/data-raw-query.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-raw-query.js +6 -1
- package/dist/cjs/nodes/data/data-raw-query.js.map +1 -1
- package/dist/cjs/nodes/data/data-select.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-select.js +6 -1
- package/dist/cjs/nodes/data/data-select.js.map +1 -1
- package/dist/cjs/nodes/data/data-update-item.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-update-item.js +29 -0
- package/dist/cjs/nodes/data/data-update-item.js.map +1 -1
- package/dist/cjs/nodes/ecommerce/ecommerce-generate-invoice.d.ts.map +1 -1
- package/dist/cjs/nodes/ecommerce/ecommerce-generate-invoice.js +7 -1
- package/dist/cjs/nodes/ecommerce/ecommerce-generate-invoice.js.map +1 -1
- package/dist/cjs/nodes/file-storage/file-storage-upload.d.ts.map +1 -1
- package/dist/cjs/nodes/file-storage/file-storage-upload.js +7 -0
- package/dist/cjs/nodes/file-storage/file-storage-upload.js.map +1 -1
- package/dist/cjs/nodes/general/general-custom-js.d.ts.map +1 -1
- package/dist/cjs/nodes/general/general-custom-js.js +21 -5
- package/dist/cjs/nodes/general/general-custom-js.js.map +1 -1
- package/dist/cjs/nodes/index.d.ts.map +1 -1
- package/dist/cjs/nodes/index.js +9 -4
- package/dist/cjs/nodes/index.js.map +1 -1
- package/dist/cjs/nodes/payment/payment-billing-portal.d.ts +3 -0
- package/dist/cjs/nodes/payment/payment-billing-portal.d.ts.map +1 -0
- package/dist/cjs/nodes/payment/payment-billing-portal.js +52 -0
- package/dist/cjs/nodes/payment/payment-billing-portal.js.map +1 -0
- package/dist/cjs/nodes/payment/payment-charge-user.d.ts.map +1 -1
- package/dist/cjs/nodes/payment/payment-charge-user.js +227 -360
- package/dist/cjs/nodes/payment/payment-charge-user.js.map +1 -1
- package/dist/cjs/nodes/payment/payment-close-checkout.d.ts +3 -0
- package/dist/cjs/nodes/payment/payment-close-checkout.d.ts.map +1 -0
- package/dist/cjs/nodes/payment/payment-close-checkout.js +141 -0
- package/dist/cjs/nodes/payment/payment-close-checkout.js.map +1 -0
- package/dist/cjs/nodes/payment/payment-ensure-subscription-plan.d.ts +3 -0
- package/dist/cjs/nodes/payment/payment-ensure-subscription-plan.d.ts.map +1 -0
- package/dist/cjs/nodes/payment/payment-ensure-subscription-plan.js +67 -0
- package/dist/cjs/nodes/payment/payment-ensure-subscription-plan.js.map +1 -0
- package/dist/cjs/nodes/payment/payment-manage-subscription.d.ts +3 -0
- package/dist/cjs/nodes/payment/payment-manage-subscription.d.ts.map +1 -0
- package/dist/cjs/nodes/payment/payment-manage-subscription.js +89 -0
- package/dist/cjs/nodes/payment/payment-manage-subscription.js.map +1 -0
- package/dist/cjs/nodes/payment/payment-refund.d.ts.map +1 -1
- package/dist/cjs/nodes/payment/payment-refund.js +50 -404
- package/dist/cjs/nodes/payment/payment-refund.js.map +1 -1
- package/dist/cjs/nodes/push/push-send-notification.d.ts +14 -0
- package/dist/cjs/nodes/push/push-send-notification.d.ts.map +1 -0
- package/dist/cjs/nodes/push/push-send-notification.js +83 -0
- package/dist/cjs/nodes/push/push-send-notification.js.map +1 -0
- package/dist/cjs/payments/drivers/coingate-driver-code.d.ts +16 -0
- package/dist/cjs/payments/drivers/coingate-driver-code.d.ts.map +1 -0
- package/dist/cjs/payments/drivers/coingate-driver-code.js +471 -0
- package/dist/cjs/payments/drivers/coingate-driver-code.js.map +1 -0
- package/dist/cjs/payments/drivers/mollie-driver-code.d.ts +16 -0
- package/dist/cjs/payments/drivers/mollie-driver-code.d.ts.map +1 -0
- package/dist/cjs/payments/drivers/mollie-driver-code.js +623 -0
- package/dist/cjs/payments/drivers/mollie-driver-code.js.map +1 -0
- package/dist/cjs/payments/drivers/paddle-driver-code.d.ts +12 -0
- package/dist/cjs/payments/drivers/paddle-driver-code.d.ts.map +1 -0
- package/dist/cjs/payments/drivers/paddle-driver-code.js +683 -0
- package/dist/cjs/payments/drivers/paddle-driver-code.js.map +1 -0
- package/dist/cjs/payments/drivers/paypal-driver-code.d.ts +12 -0
- package/dist/cjs/payments/drivers/paypal-driver-code.d.ts.map +1 -0
- package/dist/cjs/payments/drivers/paypal-driver-code.js +1261 -0
- package/dist/cjs/payments/drivers/paypal-driver-code.js.map +1 -0
- package/dist/cjs/payments/drivers/razorpay-driver-code.d.ts +12 -0
- package/dist/cjs/payments/drivers/razorpay-driver-code.d.ts.map +1 -0
- package/dist/cjs/payments/drivers/razorpay-driver-code.js +732 -0
- package/dist/cjs/payments/drivers/razorpay-driver-code.js.map +1 -0
- package/dist/cjs/payments/drivers/square-driver-code.d.ts +14 -0
- package/dist/cjs/payments/drivers/square-driver-code.d.ts.map +1 -0
- package/dist/cjs/payments/drivers/square-driver-code.js +931 -0
- package/dist/cjs/payments/drivers/square-driver-code.js.map +1 -0
- package/dist/cjs/payments/drivers/stripe-driver-code.d.ts +12 -0
- package/dist/cjs/payments/drivers/stripe-driver-code.d.ts.map +1 -0
- package/dist/cjs/payments/drivers/stripe-driver-code.js +778 -0
- package/dist/cjs/payments/drivers/stripe-driver-code.js.map +1 -0
- package/dist/cjs/payments/index.d.ts +66 -0
- package/dist/cjs/payments/index.d.ts.map +1 -0
- package/dist/cjs/payments/index.js +175 -0
- package/dist/cjs/payments/index.js.map +1 -0
- package/dist/cjs/payments/payment-core-code.d.ts +19 -0
- package/dist/cjs/payments/payment-core-code.d.ts.map +1 -0
- package/dist/cjs/payments/payment-core-code.js +422 -0
- package/dist/cjs/payments/payment-core-code.js.map +1 -0
- package/dist/cjs/payments/payment-driver-code-map.d.ts +4 -0
- package/dist/cjs/payments/payment-driver-code-map.d.ts.map +1 -0
- package/dist/cjs/payments/payment-driver-code-map.js +21 -0
- package/dist/cjs/payments/payment-driver-code-map.js.map +1 -0
- package/dist/cjs/payments/payment-drivers-scope.d.ts +35 -0
- package/dist/cjs/payments/payment-drivers-scope.d.ts.map +1 -0
- package/dist/cjs/payments/payment-drivers-scope.js +56 -0
- package/dist/cjs/payments/payment-drivers-scope.js.map +1 -0
- package/dist/cjs/payments/payment-registry-code.d.ts +8 -0
- package/dist/cjs/payments/payment-registry-code.d.ts.map +1 -0
- package/dist/cjs/payments/payment-registry-code.js +41 -0
- package/dist/cjs/payments/payment-registry-code.js.map +1 -0
- package/dist/cjs/pg-client-code.d.ts +10 -0
- package/dist/cjs/pg-client-code.d.ts.map +1 -1
- package/dist/cjs/pg-client-code.js +27 -1
- package/dist/cjs/pg-client-code.js.map +1 -1
- package/dist/cjs/runtime-storage-generator.d.ts +28 -0
- package/dist/cjs/runtime-storage-generator.d.ts.map +1 -1
- package/dist/cjs/runtime-storage-generator.js +240 -5
- package/dist/cjs/runtime-storage-generator.js.map +1 -1
- package/dist/cjs/secret-collector.d.ts.map +1 -1
- package/dist/cjs/secret-collector.js +8 -3
- package/dist/cjs/secret-collector.js.map +1 -1
- package/dist/cjs/security-scanner.d.ts +10 -1
- package/dist/cjs/security-scanner.d.ts.map +1 -1
- package/dist/cjs/security-scanner.js +19 -1
- package/dist/cjs/security-scanner.js.map +1 -1
- package/dist/cjs/segment-context-needs.d.ts +38 -0
- package/dist/cjs/segment-context-needs.d.ts.map +1 -0
- package/dist/cjs/segment-context-needs.js +129 -0
- package/dist/cjs/segment-context-needs.js.map +1 -0
- package/dist/cjs/segment-splitter.d.ts.map +1 -1
- package/dist/cjs/segment-splitter.js +6 -1
- package/dist/cjs/segment-splitter.js.map +1 -1
- package/dist/cjs/segment-trust.d.ts +50 -0
- package/dist/cjs/segment-trust.d.ts.map +1 -0
- package/dist/cjs/segment-trust.js +115 -0
- package/dist/cjs/segment-trust.js.map +1 -0
- package/dist/cjs/sent-email-log/sent-email-log-code.d.ts +19 -0
- package/dist/cjs/sent-email-log/sent-email-log-code.d.ts.map +1 -1
- package/dist/cjs/sent-email-log/sent-email-log-code.js +1 -24
- package/dist/cjs/sent-email-log/sent-email-log-code.js.map +1 -1
- package/dist/cjs/server-runtime-code.d.ts +34 -0
- package/dist/cjs/server-runtime-code.d.ts.map +1 -0
- package/dist/cjs/server-runtime-code.js +303 -0
- package/dist/cjs/server-runtime-code.js.map +1 -0
- package/dist/cjs/session-cookie-resolver.d.ts +3 -78
- package/dist/cjs/session-cookie-resolver.d.ts.map +1 -1
- package/dist/cjs/session-cookie-resolver.js +7 -276
- package/dist/cjs/session-cookie-resolver.js.map +1 -1
- package/dist/cjs/subscriber-access-route-generator.d.ts +71 -0
- package/dist/cjs/subscriber-access-route-generator.d.ts.map +1 -0
- package/dist/cjs/subscriber-access-route-generator.js +301 -0
- package/dist/cjs/subscriber-access-route-generator.js.map +1 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/types.d.ts +6 -0
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/webhook-delivery-lease/index.d.ts +8 -0
- package/dist/cjs/webhook-delivery-lease/index.d.ts.map +1 -0
- package/dist/cjs/webhook-delivery-lease/index.js +41 -0
- package/dist/cjs/webhook-delivery-lease/index.js.map +1 -0
- package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-code.d.ts +26 -0
- package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-code.d.ts.map +1 -0
- package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-code.js +151 -0
- package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-code.js.map +1 -0
- package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-scope.d.ts +16 -0
- package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-scope.d.ts.map +1 -0
- package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-scope.js +19 -0
- package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-scope.js.map +1 -0
- package/dist/cjs/webhook-generator.d.ts +1 -1
- package/dist/cjs/webhook-generator.d.ts.map +1 -1
- package/dist/cjs/webhook-generator.js +342 -254
- package/dist/cjs/webhook-generator.js.map +1 -1
- package/dist/cjs/webhook-signature-verification.d.ts +17 -1
- package/dist/cjs/webhook-signature-verification.d.ts.map +1 -1
- package/dist/cjs/webhook-signature-verification.js +182 -27
- package/dist/cjs/webhook-signature-verification.js.map +1 -1
- package/dist/cjs/workflow-auth-generator.d.ts +9 -6
- package/dist/cjs/workflow-auth-generator.d.ts.map +1 -1
- package/dist/cjs/workflow-auth-generator.js +133 -29
- package/dist/cjs/workflow-auth-generator.js.map +1 -1
- package/dist/cjs/workflow-component-plugin.d.ts.map +1 -1
- package/dist/cjs/workflow-component-plugin.js +65 -28
- package/dist/cjs/workflow-component-plugin.js.map +1 -1
- package/dist/cjs/workflow-project-plugin.d.ts +13 -0
- package/dist/cjs/workflow-project-plugin.d.ts.map +1 -1
- package/dist/cjs/workflow-project-plugin.js +215 -65
- package/dist/cjs/workflow-project-plugin.js.map +1 -1
- package/dist/esm/admin-form-hydration.d.ts +10 -0
- package/dist/esm/admin-form-hydration.d.ts.map +1 -0
- package/dist/esm/admin-form-hydration.js +21 -0
- package/dist/esm/admin-form-hydration.js.map +1 -0
- package/dist/esm/api-route-generator.d.ts +19 -3
- package/dist/esm/api-route-generator.d.ts.map +1 -1
- package/dist/esm/api-route-generator.js +189 -70
- package/dist/esm/api-route-generator.js.map +1 -1
- package/dist/esm/auth-generator.d.ts +4 -1
- package/dist/esm/auth-generator.d.ts.map +1 -1
- package/dist/esm/auth-generator.js +241 -62
- package/dist/esm/auth-generator.js.map +1 -1
- package/dist/esm/auth-return/signed-in-destination-code.d.ts +17 -0
- package/dist/esm/auth-return/signed-in-destination-code.d.ts.map +1 -0
- package/dist/esm/auth-return/signed-in-destination-code.js +33 -0
- package/dist/esm/auth-return/signed-in-destination-code.js.map +1 -0
- package/dist/esm/cart-pricing-preamble.d.ts +12 -0
- package/dist/esm/cart-pricing-preamble.d.ts.map +1 -0
- package/dist/esm/cart-pricing-preamble.js +19 -0
- package/dist/esm/cart-pricing-preamble.js.map +1 -0
- package/dist/esm/cron-request-verification.d.ts +24 -0
- package/dist/esm/cron-request-verification.d.ts.map +1 -0
- package/dist/esm/cron-request-verification.js +80 -0
- package/dist/esm/cron-request-verification.js.map +1 -0
- package/dist/esm/custom-node-modules.d.ts +30 -0
- package/dist/esm/custom-node-modules.d.ts.map +1 -0
- package/dist/esm/custom-node-modules.js +84 -0
- package/dist/esm/custom-node-modules.js.map +1 -0
- package/dist/esm/data-api-route-generator.d.ts +27 -0
- package/dist/esm/data-api-route-generator.d.ts.map +1 -1
- package/dist/esm/data-api-route-generator.js +365 -28
- package/dist/esm/data-api-route-generator.js.map +1 -1
- package/dist/esm/ecommerce/cart-availability.d.ts.map +1 -1
- package/dist/esm/ecommerce/cart-availability.js +22 -13
- package/dist/esm/ecommerce/cart-availability.js.map +1 -1
- package/dist/esm/ecommerce/stock-decrement.d.ts +2 -1
- package/dist/esm/ecommerce/stock-decrement.d.ts.map +1 -1
- package/dist/esm/ecommerce/stock-decrement.js +6 -0
- package/dist/esm/ecommerce/stock-decrement.js.map +1 -1
- package/dist/esm/executor-generator.d.ts +0 -1
- package/dist/esm/executor-generator.d.ts.map +1 -1
- package/dist/esm/executor-generator.js +212 -18
- package/dist/esm/executor-generator.js.map +1 -1
- package/dist/esm/index.d.ts +12 -4
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +10 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/invoice/api-routes-code.d.ts +26 -0
- package/dist/esm/invoice/api-routes-code.d.ts.map +1 -1
- package/dist/esm/invoice/api-routes-code.js +421 -390
- package/dist/esm/invoice/api-routes-code.js.map +1 -1
- package/dist/esm/invoice/data-access-code.d.ts.map +1 -1
- package/dist/esm/invoice/data-access-code.js +420 -107
- package/dist/esm/invoice/data-access-code.js.map +1 -1
- package/dist/esm/invoice/index.d.ts.map +1 -1
- package/dist/esm/invoice/index.js +25 -1
- package/dist/esm/invoice/index.js.map +1 -1
- package/dist/esm/invoice/invoice-assembly-code.d.ts +12 -0
- package/dist/esm/invoice/invoice-assembly-code.d.ts.map +1 -0
- package/dist/esm/invoice/invoice-assembly-code.js +513 -0
- package/dist/esm/invoice/invoice-assembly-code.js.map +1 -0
- package/dist/esm/invoice/invoice-html-code.d.ts.map +1 -1
- package/dist/esm/invoice/invoice-html-code.js +111 -9
- package/dist/esm/invoice/invoice-html-code.js.map +1 -1
- package/dist/esm/invoice/pdf-service-client-code.d.ts.map +1 -1
- package/dist/esm/invoice/pdf-service-client-code.js +3 -4
- package/dist/esm/invoice/pdf-service-client-code.js.map +1 -1
- package/dist/esm/nodes/account/account-login.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-login.js +4 -3
- package/dist/esm/nodes/account/account-login.js.map +1 -1
- package/dist/esm/nodes/account/account-signup.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-signup.js +7 -4
- package/dist/esm/nodes/account/account-signup.js.map +1 -1
- package/dist/esm/nodes/ai/ai-select-database-data.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-select-database-data.js +6 -1
- package/dist/esm/nodes/ai/ai-select-database-data.js.map +1 -1
- package/dist/esm/nodes/browser/browser-get-push-subscription.d.ts +9 -0
- package/dist/esm/nodes/browser/browser-get-push-subscription.d.ts.map +1 -0
- package/dist/esm/nodes/browser/browser-get-push-subscription.js +22 -0
- package/dist/esm/nodes/browser/browser-get-push-subscription.js.map +1 -0
- package/dist/esm/nodes/browser/browser-show-notification.d.ts +10 -0
- package/dist/esm/nodes/browser/browser-show-notification.d.ts.map +1 -1
- package/dist/esm/nodes/browser/browser-show-notification.js +65 -40
- package/dist/esm/nodes/browser/browser-show-notification.js.map +1 -1
- package/dist/esm/nodes/browser/browser-subscribe-to-push.d.ts +11 -0
- package/dist/esm/nodes/browser/browser-subscribe-to-push.d.ts.map +1 -1
- package/dist/esm/nodes/browser/browser-subscribe-to-push.js +21 -31
- package/dist/esm/nodes/browser/browser-subscribe-to-push.js.map +1 -1
- package/dist/esm/nodes/browser/browser-unsubscribe-from-push.d.ts +8 -0
- package/dist/esm/nodes/browser/browser-unsubscribe-from-push.d.ts.map +1 -0
- package/dist/esm/nodes/browser/browser-unsubscribe-from-push.js +21 -0
- package/dist/esm/nodes/browser/browser-unsubscribe-from-push.js.map +1 -0
- package/dist/esm/nodes/browser/push-api-access.d.ts +12 -0
- package/dist/esm/nodes/browser/push-api-access.d.ts.map +1 -0
- package/dist/esm/nodes/browser/push-api-access.js +13 -0
- package/dist/esm/nodes/browser/push-api-access.js.map +1 -0
- package/dist/esm/nodes/cart/cart-add-item.d.ts.map +1 -1
- package/dist/esm/nodes/cart/cart-add-item.js +174 -10
- package/dist/esm/nodes/cart/cart-add-item.js.map +1 -1
- package/dist/esm/nodes/cart/cart-clear.d.ts.map +1 -1
- package/dist/esm/nodes/cart/cart-clear.js +11 -0
- package/dist/esm/nodes/cart/cart-clear.js.map +1 -1
- package/dist/esm/nodes/cart/cart-get-total.d.ts.map +1 -1
- package/dist/esm/nodes/cart/cart-get-total.js +261 -4
- package/dist/esm/nodes/cart/cart-get-total.js.map +1 -1
- package/dist/esm/nodes/cart/cart-price-order.d.ts +3 -0
- package/dist/esm/nodes/cart/cart-price-order.d.ts.map +1 -0
- package/dist/esm/nodes/cart/cart-price-order.js +278 -0
- package/dist/esm/nodes/cart/cart-price-order.js.map +1 -0
- package/dist/esm/nodes/cart/cart-update-item-quantity.d.ts.map +1 -1
- package/dist/esm/nodes/cart/cart-update-item-quantity.js +7 -0
- package/dist/esm/nodes/cart/cart-update-item-quantity.js.map +1 -1
- package/dist/esm/nodes/data/data-count.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-count.js +6 -1
- package/dist/esm/nodes/data/data-count.js.map +1 -1
- package/dist/esm/nodes/data/data-create-item.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-create-item.js +11 -1
- package/dist/esm/nodes/data/data-create-item.js.map +1 -1
- package/dist/esm/nodes/data/data-delete-item.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-delete-item.js +29 -0
- package/dist/esm/nodes/data/data-delete-item.js.map +1 -1
- package/dist/esm/nodes/data/data-raw-query.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-raw-query.js +6 -1
- package/dist/esm/nodes/data/data-raw-query.js.map +1 -1
- package/dist/esm/nodes/data/data-select.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-select.js +6 -1
- package/dist/esm/nodes/data/data-select.js.map +1 -1
- package/dist/esm/nodes/data/data-update-item.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-update-item.js +29 -0
- package/dist/esm/nodes/data/data-update-item.js.map +1 -1
- package/dist/esm/nodes/ecommerce/ecommerce-generate-invoice.d.ts.map +1 -1
- package/dist/esm/nodes/ecommerce/ecommerce-generate-invoice.js +7 -1
- package/dist/esm/nodes/ecommerce/ecommerce-generate-invoice.js.map +1 -1
- package/dist/esm/nodes/file-storage/file-storage-upload.d.ts.map +1 -1
- package/dist/esm/nodes/file-storage/file-storage-upload.js +7 -0
- package/dist/esm/nodes/file-storage/file-storage-upload.js.map +1 -1
- package/dist/esm/nodes/general/general-custom-js.d.ts.map +1 -1
- package/dist/esm/nodes/general/general-custom-js.js +21 -5
- package/dist/esm/nodes/general/general-custom-js.js.map +1 -1
- package/dist/esm/nodes/index.d.ts.map +1 -1
- package/dist/esm/nodes/index.js +9 -4
- package/dist/esm/nodes/index.js.map +1 -1
- package/dist/esm/nodes/payment/payment-billing-portal.d.ts +3 -0
- package/dist/esm/nodes/payment/payment-billing-portal.d.ts.map +1 -0
- package/dist/esm/nodes/payment/payment-billing-portal.js +49 -0
- package/dist/esm/nodes/payment/payment-billing-portal.js.map +1 -0
- package/dist/esm/nodes/payment/payment-charge-user.d.ts.map +1 -1
- package/dist/esm/nodes/payment/payment-charge-user.js +227 -360
- package/dist/esm/nodes/payment/payment-charge-user.js.map +1 -1
- package/dist/esm/nodes/payment/payment-close-checkout.d.ts +3 -0
- package/dist/esm/nodes/payment/payment-close-checkout.d.ts.map +1 -0
- package/dist/esm/nodes/payment/payment-close-checkout.js +138 -0
- package/dist/esm/nodes/payment/payment-close-checkout.js.map +1 -0
- package/dist/esm/nodes/payment/payment-ensure-subscription-plan.d.ts +3 -0
- package/dist/esm/nodes/payment/payment-ensure-subscription-plan.d.ts.map +1 -0
- package/dist/esm/nodes/payment/payment-ensure-subscription-plan.js +64 -0
- package/dist/esm/nodes/payment/payment-ensure-subscription-plan.js.map +1 -0
- package/dist/esm/nodes/payment/payment-manage-subscription.d.ts +3 -0
- package/dist/esm/nodes/payment/payment-manage-subscription.d.ts.map +1 -0
- package/dist/esm/nodes/payment/payment-manage-subscription.js +86 -0
- package/dist/esm/nodes/payment/payment-manage-subscription.js.map +1 -0
- package/dist/esm/nodes/payment/payment-refund.d.ts.map +1 -1
- package/dist/esm/nodes/payment/payment-refund.js +50 -404
- package/dist/esm/nodes/payment/payment-refund.js.map +1 -1
- package/dist/esm/nodes/push/push-send-notification.d.ts +14 -0
- package/dist/esm/nodes/push/push-send-notification.d.ts.map +1 -0
- package/dist/esm/nodes/push/push-send-notification.js +80 -0
- package/dist/esm/nodes/push/push-send-notification.js.map +1 -0
- package/dist/esm/payments/drivers/coingate-driver-code.d.ts +16 -0
- package/dist/esm/payments/drivers/coingate-driver-code.d.ts.map +1 -0
- package/dist/esm/payments/drivers/coingate-driver-code.js +467 -0
- package/dist/esm/payments/drivers/coingate-driver-code.js.map +1 -0
- package/dist/esm/payments/drivers/mollie-driver-code.d.ts +16 -0
- package/dist/esm/payments/drivers/mollie-driver-code.d.ts.map +1 -0
- package/dist/esm/payments/drivers/mollie-driver-code.js +619 -0
- package/dist/esm/payments/drivers/mollie-driver-code.js.map +1 -0
- package/dist/esm/payments/drivers/paddle-driver-code.d.ts +12 -0
- package/dist/esm/payments/drivers/paddle-driver-code.d.ts.map +1 -0
- package/dist/esm/payments/drivers/paddle-driver-code.js +679 -0
- package/dist/esm/payments/drivers/paddle-driver-code.js.map +1 -0
- package/dist/esm/payments/drivers/paypal-driver-code.d.ts +12 -0
- package/dist/esm/payments/drivers/paypal-driver-code.d.ts.map +1 -0
- package/dist/esm/payments/drivers/paypal-driver-code.js +1257 -0
- package/dist/esm/payments/drivers/paypal-driver-code.js.map +1 -0
- package/dist/esm/payments/drivers/razorpay-driver-code.d.ts +12 -0
- package/dist/esm/payments/drivers/razorpay-driver-code.d.ts.map +1 -0
- package/dist/esm/payments/drivers/razorpay-driver-code.js +728 -0
- package/dist/esm/payments/drivers/razorpay-driver-code.js.map +1 -0
- package/dist/esm/payments/drivers/square-driver-code.d.ts +14 -0
- package/dist/esm/payments/drivers/square-driver-code.d.ts.map +1 -0
- package/dist/esm/payments/drivers/square-driver-code.js +927 -0
- package/dist/esm/payments/drivers/square-driver-code.js.map +1 -0
- package/dist/esm/payments/drivers/stripe-driver-code.d.ts +12 -0
- package/dist/esm/payments/drivers/stripe-driver-code.d.ts.map +1 -0
- package/dist/esm/payments/drivers/stripe-driver-code.js +774 -0
- package/dist/esm/payments/drivers/stripe-driver-code.js.map +1 -0
- package/dist/esm/payments/index.d.ts +66 -0
- package/dist/esm/payments/index.d.ts.map +1 -0
- package/dist/esm/payments/index.js +164 -0
- package/dist/esm/payments/index.js.map +1 -0
- package/dist/esm/payments/payment-core-code.d.ts +19 -0
- package/dist/esm/payments/payment-core-code.d.ts.map +1 -0
- package/dist/esm/payments/payment-core-code.js +418 -0
- package/dist/esm/payments/payment-core-code.js.map +1 -0
- package/dist/esm/payments/payment-driver-code-map.d.ts +4 -0
- package/dist/esm/payments/payment-driver-code-map.d.ts.map +1 -0
- package/dist/esm/payments/payment-driver-code-map.js +18 -0
- package/dist/esm/payments/payment-driver-code-map.js.map +1 -0
- package/dist/esm/payments/payment-drivers-scope.d.ts +35 -0
- package/dist/esm/payments/payment-drivers-scope.d.ts.map +1 -0
- package/dist/esm/payments/payment-drivers-scope.js +51 -0
- package/dist/esm/payments/payment-drivers-scope.js.map +1 -0
- package/dist/esm/payments/payment-registry-code.d.ts +8 -0
- package/dist/esm/payments/payment-registry-code.d.ts.map +1 -0
- package/dist/esm/payments/payment-registry-code.js +37 -0
- package/dist/esm/payments/payment-registry-code.js.map +1 -0
- package/dist/esm/pg-client-code.d.ts +10 -0
- package/dist/esm/pg-client-code.d.ts.map +1 -1
- package/dist/esm/pg-client-code.js +25 -0
- package/dist/esm/pg-client-code.js.map +1 -1
- package/dist/esm/runtime-storage-generator.d.ts +28 -0
- package/dist/esm/runtime-storage-generator.d.ts.map +1 -1
- package/dist/esm/runtime-storage-generator.js +239 -4
- package/dist/esm/runtime-storage-generator.js.map +1 -1
- package/dist/esm/secret-collector.d.ts.map +1 -1
- package/dist/esm/secret-collector.js +8 -3
- package/dist/esm/secret-collector.js.map +1 -1
- package/dist/esm/security-scanner.d.ts +10 -1
- package/dist/esm/security-scanner.d.ts.map +1 -1
- package/dist/esm/security-scanner.js +18 -0
- package/dist/esm/security-scanner.js.map +1 -1
- package/dist/esm/segment-context-needs.d.ts +38 -0
- package/dist/esm/segment-context-needs.d.ts.map +1 -0
- package/dist/esm/segment-context-needs.js +125 -0
- package/dist/esm/segment-context-needs.js.map +1 -0
- package/dist/esm/segment-splitter.d.ts.map +1 -1
- package/dist/esm/segment-splitter.js +6 -1
- package/dist/esm/segment-splitter.js.map +1 -1
- package/dist/esm/segment-trust.d.ts +50 -0
- package/dist/esm/segment-trust.d.ts.map +1 -0
- package/dist/esm/segment-trust.js +111 -0
- package/dist/esm/segment-trust.js.map +1 -0
- package/dist/esm/sent-email-log/sent-email-log-code.d.ts +19 -0
- package/dist/esm/sent-email-log/sent-email-log-code.d.ts.map +1 -1
- package/dist/esm/sent-email-log/sent-email-log-code.js +2 -25
- package/dist/esm/sent-email-log/sent-email-log-code.js.map +1 -1
- package/dist/esm/server-runtime-code.d.ts +34 -0
- package/dist/esm/server-runtime-code.d.ts.map +1 -0
- package/dist/esm/server-runtime-code.js +299 -0
- package/dist/esm/server-runtime-code.js.map +1 -0
- package/dist/esm/session-cookie-resolver.d.ts +3 -78
- package/dist/esm/session-cookie-resolver.d.ts.map +1 -1
- package/dist/esm/session-cookie-resolver.js +7 -274
- package/dist/esm/session-cookie-resolver.js.map +1 -1
- package/dist/esm/subscriber-access-route-generator.d.ts +71 -0
- package/dist/esm/subscriber-access-route-generator.d.ts.map +1 -0
- package/dist/esm/subscriber-access-route-generator.js +292 -0
- package/dist/esm/subscriber-access-route-generator.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/types.d.ts +6 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/webhook-delivery-lease/index.d.ts +8 -0
- package/dist/esm/webhook-delivery-lease/index.d.ts.map +1 -0
- package/dist/esm/webhook-delivery-lease/index.js +37 -0
- package/dist/esm/webhook-delivery-lease/index.js.map +1 -0
- package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-code.d.ts +26 -0
- package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-code.d.ts.map +1 -0
- package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-code.js +147 -0
- package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-code.js.map +1 -0
- package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-scope.d.ts +16 -0
- package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-scope.d.ts.map +1 -0
- package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-scope.js +16 -0
- package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-scope.js.map +1 -0
- package/dist/esm/webhook-generator.d.ts +1 -1
- package/dist/esm/webhook-generator.d.ts.map +1 -1
- package/dist/esm/webhook-generator.js +342 -254
- package/dist/esm/webhook-generator.js.map +1 -1
- package/dist/esm/webhook-signature-verification.d.ts +17 -1
- package/dist/esm/webhook-signature-verification.d.ts.map +1 -1
- package/dist/esm/webhook-signature-verification.js +179 -25
- package/dist/esm/webhook-signature-verification.js.map +1 -1
- package/dist/esm/workflow-auth-generator.d.ts +9 -6
- package/dist/esm/workflow-auth-generator.d.ts.map +1 -1
- package/dist/esm/workflow-auth-generator.js +132 -28
- package/dist/esm/workflow-auth-generator.js.map +1 -1
- package/dist/esm/workflow-component-plugin.d.ts.map +1 -1
- package/dist/esm/workflow-component-plugin.js +65 -28
- package/dist/esm/workflow-component-plugin.js.map +1 -1
- package/dist/esm/workflow-project-plugin.d.ts +13 -0
- package/dist/esm/workflow-project-plugin.d.ts.map +1 -1
- package/dist/esm/workflow-project-plugin.js +212 -63
- package/dist/esm/workflow-project-plugin.js.map +1 -1
- package/package.json +4 -4
- package/src/admin-form-hydration.ts +28 -0
- package/src/api-route-generator.ts +251 -64
- package/src/auth-generator.ts +273 -53
- package/src/auth-return/signed-in-destination-code.ts +32 -0
- package/src/cart-pricing-preamble.ts +22 -0
- package/src/cron-request-verification.ts +79 -0
- package/src/custom-node-modules.ts +102 -0
- package/src/data-api-route-generator.ts +370 -28
- package/src/ecommerce/cart-availability.ts +22 -13
- package/src/ecommerce/stock-decrement.ts +13 -1
- package/src/executor-generator.ts +212 -19
- package/src/index.ts +28 -7
- package/src/invoice/api-routes-code.ts +424 -391
- package/src/invoice/data-access-code.ts +431 -110
- package/src/invoice/index.ts +31 -1
- package/src/invoice/invoice-assembly-code.ts +514 -0
- package/src/invoice/invoice-html-code.ts +111 -9
- package/src/invoice/pdf-service-client-code.ts +3 -4
- package/src/nodes/account/account-login.ts +4 -3
- package/src/nodes/account/account-signup.ts +7 -4
- package/src/nodes/ai/ai-select-database-data.ts +10 -1
- package/src/nodes/browser/browser-get-push-subscription.ts +23 -0
- package/src/nodes/browser/browser-show-notification.ts +61 -38
- package/src/nodes/browser/browser-subscribe-to-push.ts +26 -36
- package/src/nodes/browser/browser-unsubscribe-from-push.ts +22 -0
- package/src/nodes/browser/push-api-access.ts +20 -0
- package/src/nodes/cart/cart-add-item.ts +200 -9
- package/src/nodes/cart/cart-clear.ts +11 -0
- package/src/nodes/cart/cart-get-total.ts +279 -7
- package/src/nodes/cart/cart-price-order.ts +351 -0
- package/src/nodes/cart/cart-update-item-quantity.ts +7 -0
- package/src/nodes/data/data-count.ts +9 -1
- package/src/nodes/data/data-create-item.ts +15 -1
- package/src/nodes/data/data-delete-item.ts +32 -0
- package/src/nodes/data/data-raw-query.ts +9 -1
- package/src/nodes/data/data-select.ts +9 -1
- package/src/nodes/data/data-update-item.ts +32 -0
- package/src/nodes/ecommerce/ecommerce-generate-invoice.ts +11 -1
- package/src/nodes/file-storage/file-storage-upload.ts +8 -0
- package/src/nodes/general/general-custom-js.ts +21 -5
- package/src/nodes/index.ts +16 -6
- package/src/nodes/payment/payment-billing-portal.ts +51 -0
- package/src/nodes/payment/payment-charge-user.ts +236 -442
- package/src/nodes/payment/payment-close-checkout.ts +137 -0
- package/src/nodes/payment/payment-ensure-subscription-plan.ts +66 -0
- package/src/nodes/payment/payment-manage-subscription.ts +89 -0
- package/src/nodes/payment/payment-refund.ts +52 -467
- package/src/nodes/payment-drivers-global.d.ts +13 -0
- package/src/nodes/push/push-send-notification.ts +83 -0
- package/src/nodes/workflow-utils-global.d.ts +5 -0
- package/src/payments/drivers/coingate-driver-code.ts +466 -0
- package/src/payments/drivers/mollie-driver-code.ts +618 -0
- package/src/payments/drivers/paddle-driver-code.ts +678 -0
- package/src/payments/drivers/paypal-driver-code.ts +1256 -0
- package/src/payments/drivers/razorpay-driver-code.ts +727 -0
- package/src/payments/drivers/square-driver-code.ts +926 -0
- package/src/payments/drivers/stripe-driver-code.ts +773 -0
- package/src/payments/index.ts +204 -0
- package/src/payments/payment-core-code.ts +421 -0
- package/src/payments/payment-driver-code-map.ts +19 -0
- package/src/payments/payment-drivers-scope.ts +66 -0
- package/src/payments/payment-registry-code.ts +38 -0
- package/src/pg-client-code.ts +30 -0
- package/src/runtime-storage-generator.ts +241 -4
- package/src/secret-collector.ts +8 -3
- package/src/security-scanner.ts +22 -0
- package/src/segment-context-needs.ts +148 -0
- package/src/segment-splitter.ts +6 -1
- package/src/segment-trust.ts +170 -0
- package/src/sent-email-log/sent-email-log-code.ts +2 -32
- package/src/server-runtime-code.ts +298 -0
- package/src/session-cookie-resolver.ts +9 -277
- package/src/subscriber-access-route-generator.ts +351 -0
- package/src/types.ts +6 -0
- package/src/webhook-delivery-lease/index.ts +44 -0
- package/src/webhook-delivery-lease/webhook-delivery-lease-code.ts +151 -0
- package/src/webhook-delivery-lease/webhook-delivery-lease-scope.ts +18 -0
- package/src/webhook-generator.ts +359 -260
- package/src/webhook-signature-verification.ts +180 -25
- package/src/workflow-auth-generator.ts +137 -28
- package/src/workflow-component-plugin.ts +77 -20
- package/src/workflow-project-plugin.ts +247 -44
- package/dist/cjs/nodes/payment/payment-cancel-plan.d.ts +0 -3
- package/dist/cjs/nodes/payment/payment-cancel-plan.d.ts.map +0 -1
- package/dist/cjs/nodes/payment/payment-cancel-plan.js +0 -33
- package/dist/cjs/nodes/payment/payment-cancel-plan.js.map +0 -1
- package/dist/cjs/nodes/payment/payment-create-subscription.d.ts +0 -3
- package/dist/cjs/nodes/payment/payment-create-subscription.d.ts.map +0 -1
- package/dist/cjs/nodes/payment/payment-create-subscription.js +0 -41
- package/dist/cjs/nodes/payment/payment-create-subscription.js.map +0 -1
- package/dist/cjs/nodes/payment/payment-subscribe-to-plan.d.ts +0 -3
- package/dist/cjs/nodes/payment/payment-subscribe-to-plan.d.ts.map +0 -1
- package/dist/cjs/nodes/payment/payment-subscribe-to-plan.js +0 -45
- package/dist/cjs/nodes/payment/payment-subscribe-to-plan.js.map +0 -1
- package/dist/esm/nodes/payment/payment-cancel-plan.d.ts +0 -3
- package/dist/esm/nodes/payment/payment-cancel-plan.d.ts.map +0 -1
- package/dist/esm/nodes/payment/payment-cancel-plan.js +0 -30
- package/dist/esm/nodes/payment/payment-cancel-plan.js.map +0 -1
- package/dist/esm/nodes/payment/payment-create-subscription.d.ts +0 -3
- package/dist/esm/nodes/payment/payment-create-subscription.d.ts.map +0 -1
- package/dist/esm/nodes/payment/payment-create-subscription.js +0 -38
- package/dist/esm/nodes/payment/payment-create-subscription.js.map +0 -1
- package/dist/esm/nodes/payment/payment-subscribe-to-plan.d.ts +0 -3
- package/dist/esm/nodes/payment/payment-subscribe-to-plan.d.ts.map +0 -1
- package/dist/esm/nodes/payment/payment-subscribe-to-plan.js +0 -42
- package/dist/esm/nodes/payment/payment-subscribe-to-plan.js.map +0 -1
- package/src/nodes/payment/payment-cancel-plan.ts +0 -33
- package/src/nodes/payment/payment-create-subscription.ts +0 -42
- package/src/nodes/payment/payment-subscribe-to-plan.ts +0 -46
|
@@ -1,4 +1,42 @@
|
|
|
1
1
|
import { FileType, } from '@teleporthq/teleport-types';
|
|
2
|
+
import { ensurePaymentDriversModule, resolveStorePaymentDriverIds } from './payments';
|
|
3
|
+
import { DEFAULT_PAYMENT_DRIVER_IDS } from './payments/payment-drivers-scope';
|
|
4
|
+
/**
|
|
5
|
+
* The origin a legacy webhook route calls this deployment's own routes on
|
|
6
|
+
* (`/api/invoices/generate`, `/api/ecommerce/order-notification`). Those
|
|
7
|
+
* self-calls carry the app secret, so the origin must never be a host the
|
|
8
|
+
* request named — outside Vercel the Host header is whatever the caller sent.
|
|
9
|
+
* The rule of the server runtime's `trustedBaseUrl` (server-runtime-code.ts),
|
|
10
|
+
* inlined because these routes do not load the server runtime: on Vercel the
|
|
11
|
+
* request's host (the domain Vercel routed to this deployment); elsewhere
|
|
12
|
+
* NEXTAUTH_URL's origin when it is set — except that a local server on another
|
|
13
|
+
* port than a local NEXTAUTH_URL keeps its own loopback address (NEXTAUTH_URL
|
|
14
|
+
* stuck at :3000 while `next dev` runs on :3001). With no Host header at all,
|
|
15
|
+
* the configured URLs as before.
|
|
16
|
+
*/
|
|
17
|
+
const WEBHOOK_BASE_URL_CODE = `function __isLoopbackHost(host) {
|
|
18
|
+
var name = String(host || '').replace(/:[0-9]+$/, '').toLowerCase();
|
|
19
|
+
return name === 'localhost' || name === '127.0.0.1' || name === '[::1]';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function __webhookBaseUrl(req) {
|
|
23
|
+
var headers = (req && req.headers) || {};
|
|
24
|
+
var host = headers.host || '';
|
|
25
|
+
if (!host) {
|
|
26
|
+
var envBaseUrl = process.env.NEXTAUTH_URL || process.env.VERCEL_URL || '';
|
|
27
|
+
if (envBaseUrl && !envBaseUrl.startsWith('http')) envBaseUrl = 'https://' + envBaseUrl;
|
|
28
|
+
return envBaseUrl || 'http://localhost:3000';
|
|
29
|
+
}
|
|
30
|
+
var proto = headers['x-forwarded-proto'] || (__isLoopbackHost(host) ? 'http' : 'https');
|
|
31
|
+
var requestOrigin = String(proto).split(',')[0].trim() + '://' + host;
|
|
32
|
+
if (process.env.VERCEL) return requestOrigin;
|
|
33
|
+
var configured = String(process.env.NEXTAUTH_URL || '').trim();
|
|
34
|
+
if (!configured) return requestOrigin;
|
|
35
|
+
var origin;
|
|
36
|
+
try { origin = new URL(configured).origin; } catch (e) { return requestOrigin; }
|
|
37
|
+
if (__isLoopbackHost(host) && __isLoopbackHost(new URL(origin).host)) return requestOrigin;
|
|
38
|
+
return origin;
|
|
39
|
+
}`;
|
|
2
40
|
export const generateStripeWebhookCode = (invoiceSettings, ecommerceSettings) => {
|
|
3
41
|
const autoGenerateInvoice = (invoiceSettings === null || invoiceSettings === void 0 ? void 0 : invoiceSettings.enabled) && (invoiceSettings === null || invoiceSettings === void 0 ? void 0 : invoiceSettings.autoGenerateOnPayment);
|
|
4
42
|
const hasEcommerce = !!ecommerceSettings;
|
|
@@ -17,26 +55,25 @@ try { invoiceGenerate = require('../invoices/generate'); } catch (e) { invoiceGe
|
|
|
17
55
|
`
|
|
18
56
|
: ''}
|
|
19
57
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
if (prefixScan) {
|
|
30
|
-
var keys = Object.keys(process.env);
|
|
31
|
-
for (var j = 0; j < keys.length; j++) {
|
|
32
|
-
if (keys[j].indexOf(prefixScan) === 0) {
|
|
33
|
-
var v2 = process.env[keys[j]];
|
|
34
|
-
if (v2 && String(v2).length > 0) return String(v2);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return '';
|
|
58
|
+
var __paymentDrivers;
|
|
59
|
+
try { __paymentDrivers = require('../../../utils/payments'); } catch (e) { __paymentDrivers = null; }
|
|
60
|
+
|
|
61
|
+
// The key is read the way the store's payment drivers read it: the deployed
|
|
62
|
+
// name, then the secret the editor saved it under (an older store's
|
|
63
|
+
// STRIPE_TEST_KEY last).
|
|
64
|
+
function __stripeSecretKey() {
|
|
65
|
+
return __paymentDrivers.core.credential('stripe', 'secretKey', ['STRIPE_TEST_KEY']);
|
|
39
66
|
}
|
|
67
|
+
${autoGenerateInvoice || hasOrderNotifications
|
|
68
|
+
? `
|
|
69
|
+
// Stripe reports money in the currency's smallest unit (JPY has none, KWD a
|
|
70
|
+
// thousandth); the store keeps the major one, converted as its drivers do.
|
|
71
|
+
function __stripeMajor(minor, currency) {
|
|
72
|
+
return __paymentDrivers.core.fromMinor(Number(minor) || 0, currency);
|
|
73
|
+
}
|
|
74
|
+
`
|
|
75
|
+
: ''}
|
|
76
|
+
${WEBHOOK_BASE_URL_CODE}
|
|
40
77
|
|
|
41
78
|
module.exports = async function handler(req, res) {
|
|
42
79
|
if (req.method !== 'POST') {
|
|
@@ -44,18 +81,21 @@ module.exports = async function handler(req, res) {
|
|
|
44
81
|
return;
|
|
45
82
|
}
|
|
46
83
|
|
|
47
|
-
//
|
|
48
|
-
//
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
84
|
+
// This deployment's own origin for the self-calls (invoice generation, order
|
|
85
|
+
// notification), which carry the app secret — never a host the request named.
|
|
86
|
+
var __baseUrl = __webhookBaseUrl(req);
|
|
87
|
+
|
|
88
|
+
// Verified by the store's Stripe driver: the signature when a signing
|
|
89
|
+
// secret is configured, else the event read back from Stripe — never the
|
|
90
|
+
// request as it arrived. Without the driver nothing can be verified.
|
|
91
|
+
var driver = __paymentDrivers ? __paymentDrivers.get('stripe') : null;
|
|
92
|
+
if (!driver) {
|
|
93
|
+
console.error('Stripe webhook rejected: this store has no Stripe payment driver');
|
|
94
|
+
res.status(400).json({ error: 'Invalid webhook signature' });
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
56
97
|
|
|
57
|
-
var stripeSecretKey =
|
|
58
|
-
var webhookSecret = __resolveStripeSecret(['STRIPE_WEBHOOK_SECRET', 'CONFIGURATION_STRIPE_WEBHOOK_SECRET'], 'CONFIGURATION_STRIPE_WEBHOOK_SECRET');
|
|
98
|
+
var stripeSecretKey = __stripeSecretKey();
|
|
59
99
|
|
|
60
100
|
if (!stripeSecretKey) {
|
|
61
101
|
res.status(500).json({ error: 'Stripe secret key not configured' });
|
|
@@ -64,26 +104,26 @@ module.exports = async function handler(req, res) {
|
|
|
64
104
|
|
|
65
105
|
try {
|
|
66
106
|
var rawBody = await getRawBody(req);
|
|
67
|
-
var
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
event = verifyStripeSignature(rawBody, sig, webhookSecret);
|
|
76
|
-
if (!event) {
|
|
77
|
-
res.status(400).json({ error: 'Invalid webhook signature' });
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
} else {
|
|
81
|
-
event = JSON.parse(rawBody.toString('utf-8'));
|
|
107
|
+
var parsed;
|
|
108
|
+
try { parsed = JSON.parse(rawBody.toString('utf-8')); } catch (_e) { parsed = {}; }
|
|
109
|
+
var verification = await driver.verifyWebhook({ headers: req.headers, rawBody: rawBody, body: parsed, secret: '' });
|
|
110
|
+
if (!verification.ok) {
|
|
111
|
+
console.error('Stripe webhook rejected: ' + (verification.reason || 'not verified'));
|
|
112
|
+
res.status(400).json({ error: 'Invalid webhook signature' });
|
|
113
|
+
return;
|
|
82
114
|
}
|
|
115
|
+
var event = verification.body;
|
|
83
116
|
|
|
84
117
|
switch (event.type) {
|
|
118
|
+
// A bank debit or a transfer completes the session UNPAID, and Stripe
|
|
119
|
+
// reports the money later (or never): only a paid session pays the order.
|
|
120
|
+
case 'checkout.session.async_payment_succeeded':
|
|
85
121
|
case 'checkout.session.completed': {
|
|
86
122
|
var session = event.data.object;
|
|
123
|
+
if (session.payment_status !== 'paid' && session.payment_status !== 'no_payment_required') {
|
|
124
|
+
console.log('Checkout session completed, payment not received yet:', session.id);
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
87
127
|
${autoGenerateInvoice
|
|
88
128
|
? `await handleInvoiceGeneration(session, 'checkout', __baseUrl, stripeSecretKey);`
|
|
89
129
|
: `console.log('Checkout session completed:', session.id);`}
|
|
@@ -94,6 +134,23 @@ module.exports = async function handler(req, res) {
|
|
|
94
134
|
|
|
95
135
|
case 'payment_intent.succeeded': {
|
|
96
136
|
var paymentIntent = event.data.object;
|
|
137
|
+
// The PaymentIntent of the store's own Checkout Session carries the
|
|
138
|
+
// order in its metadata (the driver copies it there so a refund names
|
|
139
|
+
// the order): the session's event pays and invoices that order, and
|
|
140
|
+
// this one would do it a second time.
|
|
141
|
+
if (paymentIntent.metadata && paymentIntent.metadata.orderId) {
|
|
142
|
+
console.log('Payment intent succeeded for a checkout session order:', paymentIntent.id);
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
${autoGenerateInvoice
|
|
146
|
+
? `// An intent that pays a Stripe invoice (a subscription's first
|
|
147
|
+
// payment, a renewal) is invoiced from invoice.payment_succeeded,
|
|
148
|
+
// with the invoice's own lines: invoiced here too, it would be twice.
|
|
149
|
+
if (await __paysStripeInvoice(paymentIntent, stripeSecretKey)) {
|
|
150
|
+
console.log('Payment intent succeeded for a Stripe invoice:', paymentIntent.id);
|
|
151
|
+
break;
|
|
152
|
+
}`
|
|
153
|
+
: ''}
|
|
97
154
|
${autoGenerateInvoice
|
|
98
155
|
? `await handleInvoiceGeneration(paymentIntent, 'payment_intent', __baseUrl, stripeSecretKey);`
|
|
99
156
|
: `console.log('Payment intent succeeded:', paymentIntent.id);`}
|
|
@@ -115,7 +172,14 @@ module.exports = async function handler(req, res) {
|
|
|
115
172
|
case 'invoice.payment_succeeded': {
|
|
116
173
|
var stripeInvoice = event.data.object;
|
|
117
174
|
${autoGenerateInvoice
|
|
118
|
-
?
|
|
175
|
+
? `// A subscription's first invoice, from a checkout the store opened
|
|
176
|
+
// for an order, is invoiced from that checkout's own event with the
|
|
177
|
+
// order it pays: invoiced here too, it would be twice.
|
|
178
|
+
if (__opensStoreOrder(stripeInvoice)) {
|
|
179
|
+
console.log('Invoice payment succeeded for a store checkout order:', stripeInvoice.id);
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
await handleStripeInvoicePayment(stripeInvoice, __baseUrl);`
|
|
119
183
|
: `console.log('Invoice payment succeeded:', stripeInvoice.id);`}
|
|
120
184
|
break;
|
|
121
185
|
}
|
|
@@ -144,47 +208,6 @@ function getRawBody(req) {
|
|
|
144
208
|
});
|
|
145
209
|
}
|
|
146
210
|
|
|
147
|
-
function verifyStripeSignature(payload, sigHeader, secret) {
|
|
148
|
-
try {
|
|
149
|
-
var crypto = require('crypto');
|
|
150
|
-
var parts = sigHeader.split(',');
|
|
151
|
-
var timestamp = '';
|
|
152
|
-
var signatures = [];
|
|
153
|
-
|
|
154
|
-
for (var i = 0; i < parts.length; i++) {
|
|
155
|
-
var kv = parts[i].trim().split('=');
|
|
156
|
-
if (kv[0] === 't') timestamp = kv[1];
|
|
157
|
-
if (kv[0] === 'v1') signatures.push(kv[1]);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
if (!timestamp || signatures.length === 0) return null;
|
|
161
|
-
|
|
162
|
-
var signedPayload = timestamp + '.' + payload.toString('utf-8');
|
|
163
|
-
var expectedSignature = crypto
|
|
164
|
-
.createHmac('sha256', secret)
|
|
165
|
-
.update(signedPayload)
|
|
166
|
-
.digest('hex');
|
|
167
|
-
|
|
168
|
-
var valid = false;
|
|
169
|
-
for (var j = 0; j < signatures.length; j++) {
|
|
170
|
-
if (crypto.timingSafeEqual(Buffer.from(expectedSignature), Buffer.from(signatures[j]))) {
|
|
171
|
-
valid = true;
|
|
172
|
-
break;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
if (!valid) return null;
|
|
177
|
-
|
|
178
|
-
var tolerance = 300;
|
|
179
|
-
var now = Math.floor(Date.now() / 1000);
|
|
180
|
-
if (Math.abs(now - Number(timestamp)) > tolerance) return null;
|
|
181
|
-
|
|
182
|
-
return JSON.parse(payload.toString('utf-8'));
|
|
183
|
-
} catch (e) {
|
|
184
|
-
return null;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
211
|
module.exports.config = { api: { bodyParser: false } };
|
|
189
212
|
|
|
190
213
|
${autoGenerateInvoice ? generateInvoiceHandlerCode() : ''}
|
|
@@ -208,8 +231,9 @@ async function handleEcommerceOrderUpdate(session) {
|
|
|
208
231
|
var client = new pg.Client({ connectionString: connStr, ssl: connStr.indexOf('sslmode=require') !== -1 ? { rejectUnauthorized: false } : undefined });
|
|
209
232
|
try {
|
|
210
233
|
await client.connect();
|
|
234
|
+
// A cancelled order stays cancelled, whatever pays for it late.
|
|
211
235
|
await client.query(
|
|
212
|
-
"UPDATE teleport_orders SET status = $1, payment_status = $2, payment_intent_id = COALESCE(NULLIF($3, ''), payment_intent_id), updated_at = NOW() WHERE id = $4",
|
|
236
|
+
"UPDATE teleport_orders SET status = $1, payment_status = $2, payment_intent_id = COALESCE(NULLIF($3, ''), payment_intent_id), updated_at = NOW() WHERE id = $4 AND status IS DISTINCT FROM 'cancelled'",
|
|
213
237
|
['paid', 'paid', String(session.payment_intent || session.id || ''), orderId]
|
|
214
238
|
);
|
|
215
239
|
} finally {
|
|
@@ -231,12 +255,13 @@ async function sendOrderNotification(session, baseUrl) {
|
|
|
231
255
|
|
|
232
256
|
await fetch(resolvedBaseUrl + '/api/ecommerce/order-notification', {
|
|
233
257
|
method: 'POST',
|
|
234
|
-
|
|
258
|
+
// The route emails the merchant only for the store's own server code.
|
|
259
|
+
headers: { 'Content-Type': 'application/json', 'x-internal-data-secret': process.env.NEXTAUTH_SECRET || '' },
|
|
235
260
|
body: JSON.stringify({
|
|
236
261
|
orderId: orderId || session.id,
|
|
237
262
|
customerEmail: session.customer_email || (session.customer_details && session.customer_details.email) || '',
|
|
238
263
|
customerName: (session.customer_details && session.customer_details.name) || '',
|
|
239
|
-
totalAmount: (session.amount_total
|
|
264
|
+
totalAmount: __stripeMajor(session.amount_total, session.currency),
|
|
240
265
|
paymentMethod: 'stripe',
|
|
241
266
|
}),
|
|
242
267
|
});
|
|
@@ -256,9 +281,10 @@ async function handleInvoiceGeneration(paymentObj, source, baseUrl, stripeSecret
|
|
|
256
281
|
var currency = 'usd';
|
|
257
282
|
var paymentIntentId = paymentObj.id || '';
|
|
258
283
|
// For checkout sessions, the place-order workflow embeds the internal
|
|
259
|
-
// teleport_orders UUID in metadata.orderId.
|
|
260
|
-
//
|
|
261
|
-
//
|
|
284
|
+
// teleport_orders UUID in metadata.orderId. A payment_intent.succeeded
|
|
285
|
+
// event reaches here only for an intent that names no order (one the
|
|
286
|
+
// store's checkout opened is settled by its session's event), so '' then
|
|
287
|
+
// skips hydration cleanly.
|
|
262
288
|
var internalOrderId = (paymentObj.metadata && typeof paymentObj.metadata.orderId === 'string') ? paymentObj.metadata.orderId : '';
|
|
263
289
|
|
|
264
290
|
if (source === 'checkout') {
|
|
@@ -271,8 +297,8 @@ async function handleInvoiceGeneration(paymentObj, source, baseUrl, stripeSecret
|
|
|
271
297
|
return {
|
|
272
298
|
name: li.description || '',
|
|
273
299
|
quantity: li.quantity || 1,
|
|
274
|
-
unitPrice: (li.amount_total
|
|
275
|
-
totalPrice: (li.amount_total
|
|
300
|
+
unitPrice: __stripeMajor(li.amount_total, currency) / (li.quantity || 1),
|
|
301
|
+
totalPrice: __stripeMajor(li.amount_total, currency),
|
|
276
302
|
currency: currency.toUpperCase(),
|
|
277
303
|
};
|
|
278
304
|
});
|
|
@@ -289,8 +315,8 @@ async function handleInvoiceGeneration(paymentObj, source, baseUrl, stripeSecret
|
|
|
289
315
|
return {
|
|
290
316
|
name: li.description || '',
|
|
291
317
|
quantity: li.quantity || 1,
|
|
292
|
-
unitPrice: (li.amount_total
|
|
293
|
-
totalPrice: (li.amount_total
|
|
318
|
+
unitPrice: __stripeMajor(li.amount_total, currency) / (li.quantity || 1),
|
|
319
|
+
totalPrice: __stripeMajor(li.amount_total, currency),
|
|
294
320
|
currency: currency.toUpperCase(),
|
|
295
321
|
};
|
|
296
322
|
});
|
|
@@ -305,8 +331,8 @@ async function handleInvoiceGeneration(paymentObj, source, baseUrl, stripeSecret
|
|
|
305
331
|
items = [{
|
|
306
332
|
name: paymentObj.description || 'Payment',
|
|
307
333
|
quantity: 1,
|
|
308
|
-
unitPrice: (paymentObj.amount
|
|
309
|
-
totalPrice: (paymentObj.amount
|
|
334
|
+
unitPrice: __stripeMajor(paymentObj.amount, currency),
|
|
335
|
+
totalPrice: __stripeMajor(paymentObj.amount, currency),
|
|
310
336
|
currency: currency.toUpperCase(),
|
|
311
337
|
}];
|
|
312
338
|
|
|
@@ -348,7 +374,9 @@ async function handleInvoiceGeneration(paymentObj, source, baseUrl, stripeSecret
|
|
|
348
374
|
|
|
349
375
|
var response = await fetch(resolvedBaseUrl + '/api/invoices/generate', {
|
|
350
376
|
method: 'POST',
|
|
351
|
-
|
|
377
|
+
// The route issues invoices only for the store's own server code, which
|
|
378
|
+
// presents the app secret.
|
|
379
|
+
headers: { 'Content-Type': 'application/json', 'x-internal-data-secret': process.env.NEXTAUTH_SECRET || '' },
|
|
352
380
|
body: JSON.stringify(invoicePayload),
|
|
353
381
|
});
|
|
354
382
|
|
|
@@ -394,9 +422,10 @@ async function __linkInvoiceToOrder(internalOrderId, invoiceResp, paymentIntentI
|
|
|
394
422
|
var invoiceId = (invoiceResp && invoiceResp.invoiceId) || null;
|
|
395
423
|
var invoiceNumber = (invoiceResp && invoiceResp.invoiceNumber) || null;
|
|
396
424
|
// status / payment_status are independent: status tracks the order
|
|
397
|
-
// lifecycle (confirmed = order accepted), payment_status tracks money.
|
|
425
|
+
// lifecycle (confirmed = order accepted), payment_status tracks money. A
|
|
426
|
+
// cancelled order stays cancelled, whatever pays for it late.
|
|
398
427
|
await client.query(
|
|
399
|
-
"UPDATE teleport_orders SET status = $1, payment_status = $2, payment_intent_id = COALESCE(NULLIF($3, ''), payment_intent_id), invoice_id = COALESCE($4, invoice_id), invoice_number = COALESCE($5, invoice_number), invoice_pdf_url = COALESCE(NULLIF($6, ''), invoice_pdf_url), updated_at = NOW() WHERE id = $7",
|
|
428
|
+
"UPDATE teleport_orders SET status = $1, payment_status = $2, payment_intent_id = COALESCE(NULLIF($3, ''), payment_intent_id), invoice_id = COALESCE($4, invoice_id), invoice_number = COALESCE($5, invoice_number), invoice_pdf_url = COALESCE(NULLIF($6, ''), invoice_pdf_url), updated_at = NOW() WHERE id = $7 AND status IS DISTINCT FROM 'cancelled'",
|
|
400
429
|
['confirmed', 'paid', paymentIntentId || '', invoiceId, invoiceNumber, pdfUrl, internalOrderId]
|
|
401
430
|
);
|
|
402
431
|
console.info('[stripe webhook] order ' + internalOrderId + ' marked confirmed/paid — invoice=' + (invoiceNumber || '(none)') + ' pdf=' + (pdfUrl || '(none)'));
|
|
@@ -405,6 +434,53 @@ async function __linkInvoiceToOrder(internalOrderId, invoiceResp, paymentIntentI
|
|
|
405
434
|
}
|
|
406
435
|
}
|
|
407
436
|
|
|
437
|
+
// Whether a subscription's invoice is the first one of a subscription the
|
|
438
|
+
// store's own Checkout Session opened for an order. The session copies the
|
|
439
|
+
// order onto the subscription's metadata, which Stripe snapshots onto each
|
|
440
|
+
// invoice — on the invoice itself in the classic API, under \`parent\` from the
|
|
441
|
+
// 2025-03-31 versions on.
|
|
442
|
+
function __opensStoreOrder(stripeInvoice) {
|
|
443
|
+
if (!stripeInvoice || stripeInvoice.billing_reason !== 'subscription_create') {
|
|
444
|
+
return false;
|
|
445
|
+
}
|
|
446
|
+
var details = stripeInvoice.subscription_details ||
|
|
447
|
+
(stripeInvoice.parent && stripeInvoice.parent.subscription_details) || {};
|
|
448
|
+
var metadata = details.metadata || {};
|
|
449
|
+
return typeof metadata.orderId === 'string' && metadata.orderId !== '';
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
// Whether a PaymentIntent pays a Stripe invoice. The classic API names the
|
|
453
|
+
// invoice on the intent; from the 2025-03-31 versions on the intent names none,
|
|
454
|
+
// and the invoice payments are searched by the intent instead (that search is
|
|
455
|
+
// pinned to the version that introduced it). A search Stripe does not answer
|
|
456
|
+
// fails the delivery, so Stripe sends it again: taken as a payment of its own,
|
|
457
|
+
// an invoice's payment would be invoiced twice.
|
|
458
|
+
async function __paysStripeInvoice(paymentIntent, stripeSecretKey) {
|
|
459
|
+
if (paymentIntent.invoice) {
|
|
460
|
+
return true;
|
|
461
|
+
}
|
|
462
|
+
if (!stripeSecretKey || !paymentIntent.id) {
|
|
463
|
+
return false;
|
|
464
|
+
}
|
|
465
|
+
try {
|
|
466
|
+
var params = new URLSearchParams();
|
|
467
|
+
params.append('payment[type]', 'payment_intent');
|
|
468
|
+
params.append('payment[payment_intent]', paymentIntent.id);
|
|
469
|
+
params.append('limit', '1');
|
|
470
|
+
var found = await fetch('https://api.stripe.com/v1/invoice_payments?' + params.toString(), {
|
|
471
|
+
headers: { 'Authorization': 'Bearer ' + stripeSecretKey, 'Stripe-Version': '2025-03-31.basil' },
|
|
472
|
+
});
|
|
473
|
+
if (!found.ok) {
|
|
474
|
+
throw new Error('Stripe answered ' + found.status);
|
|
475
|
+
}
|
|
476
|
+
var page = await found.json();
|
|
477
|
+
return !!(page && Array.isArray(page.data) && page.data.length > 0);
|
|
478
|
+
} catch (e) {
|
|
479
|
+
console.error('Failed to look up the invoice of payment intent ' + paymentIntent.id + ':', e.message);
|
|
480
|
+
throw new Error('Could not tell whether payment intent ' + paymentIntent.id + ' pays a Stripe invoice');
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
408
484
|
async function handleStripeInvoicePayment(stripeInvoice, baseUrl) {
|
|
409
485
|
try {
|
|
410
486
|
var items = [];
|
|
@@ -413,8 +489,8 @@ async function handleStripeInvoicePayment(stripeInvoice, baseUrl) {
|
|
|
413
489
|
return {
|
|
414
490
|
name: li.description || '',
|
|
415
491
|
quantity: li.quantity || 1,
|
|
416
|
-
unitPrice: (li.amount
|
|
417
|
-
totalPrice: (li.amount
|
|
492
|
+
unitPrice: __stripeMajor(li.amount, stripeInvoice.currency),
|
|
493
|
+
totalPrice: __stripeMajor(li.amount, stripeInvoice.currency),
|
|
418
494
|
currency: (stripeInvoice.currency || 'usd').toUpperCase(),
|
|
419
495
|
};
|
|
420
496
|
});
|
|
@@ -438,7 +514,9 @@ async function handleStripeInvoicePayment(stripeInvoice, baseUrl) {
|
|
|
438
514
|
|
|
439
515
|
var response = await fetch(resolvedBaseUrl + '/api/invoices/generate', {
|
|
440
516
|
method: 'POST',
|
|
441
|
-
|
|
517
|
+
// The route issues invoices only for the store's own server code, which
|
|
518
|
+
// presents the app secret.
|
|
519
|
+
headers: { 'Content-Type': 'application/json', 'x-internal-data-secret': process.env.NEXTAUTH_SECRET || '' },
|
|
442
520
|
body: JSON.stringify(invoicePayload),
|
|
443
521
|
});
|
|
444
522
|
|
|
@@ -469,77 +547,81 @@ try { invoiceGenerate = require('../invoices/generate'); } catch (e) { invoiceGe
|
|
|
469
547
|
`
|
|
470
548
|
: ''}
|
|
471
549
|
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
}
|
|
480
|
-
if (prefixScan) {
|
|
481
|
-
var keys = Object.keys(process.env);
|
|
482
|
-
for (var j = 0; j < keys.length; j++) {
|
|
483
|
-
if (keys[j].indexOf(prefixScan) === 0) {
|
|
484
|
-
var v2 = process.env[keys[j]];
|
|
485
|
-
if (v2 && String(v2).length > 0) return String(v2);
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
return '';
|
|
550
|
+
var __paymentDrivers;
|
|
551
|
+
try { __paymentDrivers = require('../../../utils/payments'); } catch (e) { __paymentDrivers = null; }
|
|
552
|
+
|
|
553
|
+
// The credentials are read the way the store's payment drivers read them:
|
|
554
|
+
// the deployed name, then the secret the editor saved them under.
|
|
555
|
+
function __paypalCredential(field) {
|
|
556
|
+
return __paymentDrivers.core.credential('paypal', field);
|
|
490
557
|
}
|
|
491
558
|
|
|
559
|
+
${WEBHOOK_BASE_URL_CODE}
|
|
560
|
+
|
|
492
561
|
module.exports = async function handler(req, res) {
|
|
493
562
|
if (req.method !== 'POST') {
|
|
494
563
|
res.status(405).json({ error: 'Method not allowed' });
|
|
495
564
|
return;
|
|
496
565
|
}
|
|
497
566
|
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
567
|
+
// Verified by the store's PayPal driver: PayPal's signature check when a
|
|
568
|
+
// webhook id is configured, else the event read back from PayPal — never
|
|
569
|
+
// the request as it arrived. Without the driver nothing can be verified.
|
|
570
|
+
var driver = __paymentDrivers ? __paymentDrivers.get('paypal') : null;
|
|
571
|
+
if (!driver) {
|
|
572
|
+
console.error('PayPal webhook rejected: this store has no PayPal payment driver');
|
|
573
|
+
res.status(400).json({ error: 'Invalid webhook signature' });
|
|
574
|
+
return;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
var clientId = __paypalCredential('clientId');
|
|
578
|
+
var clientSecret = __paypalCredential('clientSecret');
|
|
501
579
|
|
|
502
580
|
if (!clientId || !clientSecret) {
|
|
503
581
|
res.status(500).json({ error: 'PayPal credentials not configured' });
|
|
504
582
|
return;
|
|
505
583
|
}
|
|
506
584
|
|
|
507
|
-
//
|
|
508
|
-
//
|
|
509
|
-
|
|
510
|
-
// Next.js, but stays defensive). Same pattern as /api/invoices/generate.
|
|
511
|
-
var __proto = req.headers['x-forwarded-proto'] ||
|
|
512
|
-
(req.headers.host && (req.headers.host.startsWith('localhost') || req.headers.host.startsWith('127.0.0.1')) ? 'http' : 'https');
|
|
513
|
-
var __reqBaseUrl = req.headers.host ? (__proto + '://' + req.headers.host) : '';
|
|
514
|
-
var __envBaseUrl = process.env.NEXTAUTH_URL || process.env.VERCEL_URL || '';
|
|
515
|
-
if (__envBaseUrl && !__envBaseUrl.startsWith('http')) __envBaseUrl = 'https://' + __envBaseUrl;
|
|
516
|
-
var __baseUrl = __reqBaseUrl || __envBaseUrl || 'http://localhost:3000';
|
|
585
|
+
// This deployment's own origin for the self-calls (invoice generation, order
|
|
586
|
+
// notification), which carry the app secret — never a host the request named.
|
|
587
|
+
var __baseUrl = __webhookBaseUrl(req);
|
|
517
588
|
|
|
518
589
|
try {
|
|
519
|
-
var
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
590
|
+
var rawBody = await getRawBody(req);
|
|
591
|
+
var parsed;
|
|
592
|
+
try { parsed = JSON.parse(rawBody.toString('utf-8')); } catch (_e) { parsed = {}; }
|
|
593
|
+
var verification = await driver.verifyWebhook({ headers: req.headers, rawBody: rawBody, body: parsed, secret: '' });
|
|
594
|
+
if (!verification.ok) {
|
|
595
|
+
console.error('PayPal webhook rejected: ' + (verification.reason || 'not verified'));
|
|
596
|
+
res.status(400).json({ error: 'Invalid webhook signature' });
|
|
597
|
+
return;
|
|
527
598
|
}
|
|
599
|
+
var body = verification.body || {};
|
|
528
600
|
|
|
529
601
|
var eventType = body.event_type || '';
|
|
530
602
|
|
|
531
603
|
switch (eventType) {
|
|
532
|
-
|
|
604
|
+
// Only a capture moves money. An approval moves none (the driver
|
|
605
|
+
// captures an approved order as it verifies the approval), and the
|
|
606
|
+
// capture's own event, which follows, is what pays the order.
|
|
533
607
|
case 'PAYMENT.CAPTURE.COMPLETED': {
|
|
534
608
|
var resource = body.resource || {};
|
|
609
|
+
${autoGenerateInvoice || hasOrderNotifications
|
|
610
|
+
? `var capture = await __checkPaypalCapture(resource);
|
|
611
|
+
if (!capture.ok) {
|
|
612
|
+
console.error('PayPal capture ' + (resource.id || '') + ' not applied: ' + capture.reason);
|
|
613
|
+
break;
|
|
614
|
+
}`
|
|
615
|
+
: ''}
|
|
535
616
|
${autoGenerateInvoice
|
|
536
|
-
? `await handlePaypalInvoiceGeneration(resource,
|
|
617
|
+
? `await handlePaypalInvoiceGeneration(resource, __baseUrl);`
|
|
537
618
|
: `console.log('PayPal payment completed:', resource.id);`}
|
|
538
619
|
${hasOrderNotifications
|
|
539
620
|
? `try {
|
|
540
621
|
await fetch(__baseUrl + '/api/ecommerce/order-notification', {
|
|
541
622
|
method: 'POST',
|
|
542
|
-
|
|
623
|
+
// The route emails the merchant only for the store's own server code.
|
|
624
|
+
headers: { 'Content-Type': 'application/json', 'x-internal-data-secret': process.env.NEXTAUTH_SECRET || '' },
|
|
543
625
|
body: JSON.stringify({
|
|
544
626
|
// The internal order id, so the route can load the order's own
|
|
545
627
|
// lines and the rates they were charged at; the capture id is
|
|
@@ -579,58 +661,22 @@ module.exports = async function handler(req, res) {
|
|
|
579
661
|
}
|
|
580
662
|
};
|
|
581
663
|
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
// verifications to the live API, which then rejected the sandbox cert
|
|
588
|
-
// with verification_status=FAILURE. The cert URL itself authoritatively
|
|
589
|
-
// says "sandbox" vs production.
|
|
590
|
-
var certUrl = String(headers['paypal-cert-url'] || '');
|
|
591
|
-
var isSandbox = certUrl.indexOf('sandbox.paypal.com') !== -1 ||
|
|
592
|
-
certUrl.indexOf('api.sandbox.paypal.com') !== -1;
|
|
593
|
-
var baseUrl = isSandbox ? 'https://api-m.sandbox.paypal.com' : 'https://api-m.paypal.com';
|
|
594
|
-
|
|
595
|
-
var authResponse = await fetch(baseUrl + '/v1/oauth2/token', {
|
|
596
|
-
method: 'POST',
|
|
597
|
-
headers: {
|
|
598
|
-
'Authorization': 'Basic ' + Buffer.from(clientId + ':' + clientSecret).toString('base64'),
|
|
599
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
600
|
-
},
|
|
601
|
-
body: 'grant_type=client_credentials',
|
|
602
|
-
});
|
|
603
|
-
var authData = await authResponse.json();
|
|
604
|
-
if (!authData.access_token) return false;
|
|
605
|
-
|
|
606
|
-
var verifyResponse = await fetch(baseUrl + '/v1/notifications/verify-webhook-signature', {
|
|
607
|
-
method: 'POST',
|
|
608
|
-
headers: {
|
|
609
|
-
'Authorization': 'Bearer ' + authData.access_token,
|
|
610
|
-
'Content-Type': 'application/json',
|
|
611
|
-
},
|
|
612
|
-
body: JSON.stringify({
|
|
613
|
-
auth_algo: headers['paypal-auth-algo'] || '',
|
|
614
|
-
cert_url: headers['paypal-cert-url'] || '',
|
|
615
|
-
transmission_id: headers['paypal-transmission-id'] || '',
|
|
616
|
-
transmission_sig: headers['paypal-transmission-sig'] || '',
|
|
617
|
-
transmission_time: headers['paypal-transmission-time'] || '',
|
|
618
|
-
webhook_id: webhookId,
|
|
619
|
-
webhook_event: body,
|
|
620
|
-
}),
|
|
621
|
-
});
|
|
622
|
-
var verifyData = await verifyResponse.json();
|
|
623
|
-
var ok = verifyData.verification_status === 'SUCCESS';
|
|
624
|
-
if (!ok) {
|
|
625
|
-
console.error('PayPal webhook verification rejected by ' + baseUrl + ' — verification_status=' + (verifyData.verification_status || '(missing)') + ', name=' + (verifyData.name || '(none)') + ', message=' + (verifyData.message || '(none)'));
|
|
664
|
+
function getRawBody(req) {
|
|
665
|
+
return new Promise(function(resolve, reject) {
|
|
666
|
+
if (req.body && Buffer.isBuffer(req.body)) {
|
|
667
|
+
resolve(req.body);
|
|
668
|
+
return;
|
|
626
669
|
}
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
}
|
|
670
|
+
var chunks = [];
|
|
671
|
+
req.on('data', function(chunk) { chunks.push(chunk); });
|
|
672
|
+
req.on('end', function() { resolve(Buffer.concat(chunks)); });
|
|
673
|
+
req.on('error', function(err) { reject(err); });
|
|
674
|
+
});
|
|
632
675
|
}
|
|
633
676
|
|
|
677
|
+
// PayPal's signature check needs the event exactly as it was sent.
|
|
678
|
+
module.exports.config = { api: { bodyParser: false } };
|
|
679
|
+
|
|
634
680
|
${autoGenerateInvoice || hasOrderNotifications
|
|
635
681
|
? `
|
|
636
682
|
// Pull the internal teleport_orders UUID out of the PayPal resource's
|
|
@@ -653,65 +699,92 @@ function __extractInternalOrderId(resource) {
|
|
|
653
699
|
}
|
|
654
700
|
return '';
|
|
655
701
|
}
|
|
702
|
+
|
|
703
|
+
// Whether a completed capture may pay the store order it names: the capture
|
|
704
|
+
// took the money, and the order exists, is neither cancelled nor settled
|
|
705
|
+
// already (a redelivered event pays and announces nothing twice), and is due
|
|
706
|
+
// exactly what was captured — its total less what a gift card covered — in
|
|
707
|
+
// its own currency. A capture that names no store order has nothing to check.
|
|
708
|
+
async function __checkPaypalCapture(resource) {
|
|
709
|
+
var captureStatus = String(resource.status || 'COMPLETED').toUpperCase();
|
|
710
|
+
if (captureStatus !== 'COMPLETED') {
|
|
711
|
+
return { ok: false, reason: 'the capture is ' + captureStatus };
|
|
712
|
+
}
|
|
713
|
+
var internalOrderId = __extractInternalOrderId(resource);
|
|
714
|
+
if (!internalOrderId) {
|
|
715
|
+
return { ok: true };
|
|
716
|
+
}
|
|
717
|
+
var connStr = process.env.TELEPORT_DB_CONNECTION_STRING || process.env.DATABASE_URL || '';
|
|
718
|
+
if (!connStr) {
|
|
719
|
+
return { ok: false, reason: 'no database connection to check order ' + internalOrderId + ' against' };
|
|
720
|
+
}
|
|
721
|
+
var pg;
|
|
722
|
+
try {
|
|
723
|
+
pg = require('pg');
|
|
724
|
+
} catch (e) {
|
|
725
|
+
return { ok: false, reason: 'the pg module is unavailable to check order ' + internalOrderId };
|
|
726
|
+
}
|
|
727
|
+
var client = new pg.Client({ connectionString: connStr, ssl: connStr.indexOf('sslmode=require') !== -1 ? { rejectUnauthorized: false } : undefined });
|
|
728
|
+
var order = null;
|
|
729
|
+
try {
|
|
730
|
+
await client.connect();
|
|
731
|
+
// gift_card_amount is read through the row's JSON: a store provisioned
|
|
732
|
+
// before gift cards has no such column.
|
|
733
|
+
var found = await client.query(
|
|
734
|
+
"SELECT o.status, o.payment_status, o.currency, o.total_amount, COALESCE(to_jsonb(o) ->> 'gift_card_amount', '0') AS gift_card_amount FROM teleport_orders o WHERE o.id = $1",
|
|
735
|
+
[internalOrderId]
|
|
736
|
+
);
|
|
737
|
+
order = found && found.rows && found.rows[0] ? found.rows[0] : null;
|
|
738
|
+
} finally {
|
|
739
|
+
try { await client.end(); } catch (_e) {}
|
|
740
|
+
}
|
|
741
|
+
if (!order) {
|
|
742
|
+
return { ok: false, reason: 'the store has no order ' + internalOrderId };
|
|
743
|
+
}
|
|
744
|
+
if (String(order.status || '').toLowerCase() === 'cancelled') {
|
|
745
|
+
return { ok: false, reason: 'order ' + internalOrderId + ' was cancelled' };
|
|
746
|
+
}
|
|
747
|
+
var paymentStatus = String(order.payment_status || '').toLowerCase();
|
|
748
|
+
if (paymentStatus === 'paid' || paymentStatus === 'refunded' || paymentStatus === 'partially_refunded') {
|
|
749
|
+
return { ok: false, reason: 'order ' + internalOrderId + ' is already ' + paymentStatus };
|
|
750
|
+
}
|
|
751
|
+
var amount = resource.amount || {};
|
|
752
|
+
var capturedCurrency = String(amount.currency_code || '').toUpperCase();
|
|
753
|
+
var orderCurrency = String(order.currency || '').toUpperCase();
|
|
754
|
+
if (orderCurrency && capturedCurrency !== orderCurrency) {
|
|
755
|
+
return { ok: false, reason: 'the capture is in ' + (capturedCurrency || 'no currency') + ' and order ' + internalOrderId + ' in ' + orderCurrency };
|
|
756
|
+
}
|
|
757
|
+
// Whole cents, so 12.30 - 4.10 compares as 820 and never 8.199999999999999.
|
|
758
|
+
var due = Math.max(0, Math.round((Number(order.total_amount) - Number(order.gift_card_amount || 0)) * 100));
|
|
759
|
+
var captured = Math.round(Number(amount.value) * 100);
|
|
760
|
+
if (!isFinite(due) || captured !== due) {
|
|
761
|
+
return {
|
|
762
|
+
ok: false,
|
|
763
|
+
reason: 'the capture took ' + String(amount.value) + ' ' + capturedCurrency + ' and order ' + internalOrderId + ' is due ' + (due / 100).toFixed(2),
|
|
764
|
+
};
|
|
765
|
+
}
|
|
766
|
+
return { ok: true };
|
|
767
|
+
}
|
|
656
768
|
`
|
|
657
769
|
: ''}
|
|
658
770
|
|
|
659
771
|
${autoGenerateInvoice
|
|
660
772
|
? `
|
|
661
|
-
|
|
773
|
+
// Invoices a completed capture; the capture resource names no buyer, so the
|
|
774
|
+
// invoice route hydrates them from the order when the capture names one.
|
|
775
|
+
async function handlePaypalInvoiceGeneration(resource, baseUrl) {
|
|
662
776
|
try {
|
|
663
777
|
var customerEmail = '';
|
|
664
778
|
var customerName = '';
|
|
665
|
-
var
|
|
666
|
-
var
|
|
667
|
-
var
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
total
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
quantity: 1,
|
|
675
|
-
unitPrice: total,
|
|
676
|
-
totalPrice: total,
|
|
677
|
-
currency: currency,
|
|
678
|
-
}];
|
|
679
|
-
} else if (eventType === 'CHECKOUT.ORDER.APPROVED') {
|
|
680
|
-
var purchaseUnit = (resource.purchase_units && resource.purchase_units[0]) || {};
|
|
681
|
-
currency = (purchaseUnit.amount && purchaseUnit.amount.currency_code) || 'USD';
|
|
682
|
-
total = Number(purchaseUnit.amount && purchaseUnit.amount.value) || 0;
|
|
683
|
-
|
|
684
|
-
if (purchaseUnit.items) {
|
|
685
|
-
items = purchaseUnit.items.map(function(item) {
|
|
686
|
-
return {
|
|
687
|
-
name: item.name || '',
|
|
688
|
-
quantity: Number(item.quantity) || 1,
|
|
689
|
-
unitPrice: Number(item.unit_amount && item.unit_amount.value) || 0,
|
|
690
|
-
totalPrice: (Number(item.quantity) || 1) * (Number(item.unit_amount && item.unit_amount.value) || 0),
|
|
691
|
-
currency: currency,
|
|
692
|
-
};
|
|
693
|
-
});
|
|
694
|
-
} else {
|
|
695
|
-
items = [{
|
|
696
|
-
name: 'PayPal Order',
|
|
697
|
-
quantity: 1,
|
|
698
|
-
unitPrice: total,
|
|
699
|
-
totalPrice: total,
|
|
700
|
-
currency: currency,
|
|
701
|
-
}];
|
|
702
|
-
}
|
|
703
|
-
|
|
704
|
-
if (purchaseUnit.shipping && purchaseUnit.shipping.name) {
|
|
705
|
-
customerName = purchaseUnit.shipping.name.full_name || '';
|
|
706
|
-
}
|
|
707
|
-
if (resource.payer) {
|
|
708
|
-
customerEmail = resource.payer.email_address || '';
|
|
709
|
-
if (!customerName && resource.payer.name) {
|
|
710
|
-
customerName = (resource.payer.name.given_name || '') + ' ' + (resource.payer.name.surname || '');
|
|
711
|
-
customerName = customerName.trim();
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
}
|
|
779
|
+
var currency = (resource.amount && resource.amount.currency_code) || 'USD';
|
|
780
|
+
var total = Number(resource.amount && resource.amount.value) || 0;
|
|
781
|
+
var items = [{
|
|
782
|
+
name: 'PayPal Payment',
|
|
783
|
+
quantity: 1,
|
|
784
|
+
unitPrice: total,
|
|
785
|
+
totalPrice: total,
|
|
786
|
+
currency: currency,
|
|
787
|
+
}];
|
|
715
788
|
|
|
716
789
|
// baseUrl is passed in from the request handler so the self-fetch tracks
|
|
717
790
|
// the actual port the dev server bound to. Falls back to env vars for
|
|
@@ -754,7 +827,9 @@ async function handlePaypalInvoiceGeneration(resource, eventType, clientId, clie
|
|
|
754
827
|
|
|
755
828
|
var response = await fetch(resolvedBaseUrl + '/api/invoices/generate', {
|
|
756
829
|
method: 'POST',
|
|
757
|
-
|
|
830
|
+
// The route issues invoices only for the store's own server code, which
|
|
831
|
+
// presents the app secret.
|
|
832
|
+
headers: { 'Content-Type': 'application/json', 'x-internal-data-secret': process.env.NEXTAUTH_SECRET || '' },
|
|
758
833
|
body: JSON.stringify(invoicePayload),
|
|
759
834
|
});
|
|
760
835
|
|
|
@@ -818,9 +893,10 @@ async function __linkInvoiceToOrder(internalOrderId, invoiceResp, paymentIntentI
|
|
|
818
893
|
// payment_status is the MONEY state (unpaid → paid → refunded). A paid
|
|
819
894
|
// online order should set status='confirmed' (not 'paid'), matching the
|
|
820
895
|
// Stripe + COD paths so the order-details page renders a consistent
|
|
821
|
-
// "Status: Confirmed / Payment: Paid".
|
|
896
|
+
// "Status: Confirmed / Payment: Paid". A cancelled order stays
|
|
897
|
+
// cancelled, whatever pays for it late.
|
|
822
898
|
await client.query(
|
|
823
|
-
"UPDATE teleport_orders SET status = $1, payment_status = $2, payment_intent_id = COALESCE(NULLIF($3, ''), payment_intent_id), invoice_id = COALESCE($4, invoice_id), invoice_number = COALESCE($5, invoice_number), invoice_pdf_url = COALESCE(NULLIF($6, ''), invoice_pdf_url), updated_at = NOW() WHERE id = $7",
|
|
899
|
+
"UPDATE teleport_orders SET status = $1, payment_status = $2, payment_intent_id = COALESCE(NULLIF($3, ''), payment_intent_id), invoice_id = COALESCE($4, invoice_id), invoice_number = COALESCE($5, invoice_number), invoice_pdf_url = COALESCE(NULLIF($6, ''), invoice_pdf_url), updated_at = NOW() WHERE id = $7 AND status IS DISTINCT FROM 'cancelled'",
|
|
824
900
|
['confirmed', 'paid', paymentIntentId || '', invoiceId, invoiceNumber, pdfUrl, internalOrderId]
|
|
825
901
|
);
|
|
826
902
|
console.info('[paypal webhook] order ' + internalOrderId + ' marked confirmed/paid — invoice=' + (invoiceNumber || '(none)') + ' pdf=' + (pdfUrl || '(none)'));
|
|
@@ -840,9 +916,21 @@ export const generateWebhookFiles = (structure, invoiceSettings, options = {}) =
|
|
|
840
916
|
const ecommerceProviders = (ecommerceSettings === null || ecommerceSettings === void 0 ? void 0 : ecommerceSettings.paymentProviders) || [];
|
|
841
917
|
const providerTypes = ecommerceProviders.map((p) => p.type);
|
|
842
918
|
const skipProviders = options.skipProviders || new Set();
|
|
843
|
-
const
|
|
844
|
-
|
|
845
|
-
|
|
919
|
+
const emitStripe = (Object.keys(env).some((k) => k.includes('STRIPE_SECRET_KEY') || k.includes('STRIPE_WEBHOOK_SECRET')) ||
|
|
920
|
+
providerTypes.includes('stripe')) &&
|
|
921
|
+
!skipProviders.has('stripe');
|
|
922
|
+
const emitPaypal = (Object.keys(env).some((k) => k.includes('PAYPAL_CLIENT_ID') || k.includes('PAYPAL_CLIENT_SECRET')) ||
|
|
923
|
+
providerTypes.includes('paypal')) &&
|
|
924
|
+
!skipProviders.has('paypal');
|
|
925
|
+
if (!emitStripe && !emitPaypal) {
|
|
926
|
+
return;
|
|
927
|
+
}
|
|
928
|
+
// Both routes verify through the store's drivers. The module is written
|
|
929
|
+
// once, by whichever emitter comes first, so it carries every provider the
|
|
930
|
+
// store uses — not only the two these routes need.
|
|
931
|
+
const storeDriverIds = resolveStorePaymentDriverIds(uidl, []);
|
|
932
|
+
ensurePaymentDriversModule(structure, storeDriverIds.length > 0 ? storeDriverIds : DEFAULT_PAYMENT_DRIVER_IDS);
|
|
933
|
+
if (emitStripe) {
|
|
846
934
|
files.set('webhook-stripe', {
|
|
847
935
|
path: ['pages', 'api', 'webhooks'],
|
|
848
936
|
files: [
|
|
@@ -854,7 +942,7 @@ export const generateWebhookFiles = (structure, invoiceSettings, options = {}) =
|
|
|
854
942
|
],
|
|
855
943
|
});
|
|
856
944
|
}
|
|
857
|
-
if (
|
|
945
|
+
if (emitPaypal) {
|
|
858
946
|
files.set('webhook-paypal', {
|
|
859
947
|
path: ['pages', 'api', 'webhooks'],
|
|
860
948
|
files: [
|