@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
package/src/webhook-generator.ts
CHANGED
|
@@ -4,6 +4,45 @@ import {
|
|
|
4
4
|
UIDLInvoiceSettings,
|
|
5
5
|
UIDLEcommerceSettings,
|
|
6
6
|
} from '@teleporthq/teleport-types'
|
|
7
|
+
import { ensurePaymentDriversModule, resolveStorePaymentDriverIds } from './payments'
|
|
8
|
+
import { DEFAULT_PAYMENT_DRIVER_IDS } from './payments/payment-drivers-scope'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The origin a legacy webhook route calls this deployment's own routes on
|
|
12
|
+
* (`/api/invoices/generate`, `/api/ecommerce/order-notification`). Those
|
|
13
|
+
* self-calls carry the app secret, so the origin must never be a host the
|
|
14
|
+
* request named — outside Vercel the Host header is whatever the caller sent.
|
|
15
|
+
* The rule of the server runtime's `trustedBaseUrl` (server-runtime-code.ts),
|
|
16
|
+
* inlined because these routes do not load the server runtime: on Vercel the
|
|
17
|
+
* request's host (the domain Vercel routed to this deployment); elsewhere
|
|
18
|
+
* NEXTAUTH_URL's origin when it is set — except that a local server on another
|
|
19
|
+
* port than a local NEXTAUTH_URL keeps its own loopback address (NEXTAUTH_URL
|
|
20
|
+
* stuck at :3000 while `next dev` runs on :3001). With no Host header at all,
|
|
21
|
+
* the configured URLs as before.
|
|
22
|
+
*/
|
|
23
|
+
const WEBHOOK_BASE_URL_CODE = `function __isLoopbackHost(host) {
|
|
24
|
+
var name = String(host || '').replace(/:[0-9]+$/, '').toLowerCase();
|
|
25
|
+
return name === 'localhost' || name === '127.0.0.1' || name === '[::1]';
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function __webhookBaseUrl(req) {
|
|
29
|
+
var headers = (req && req.headers) || {};
|
|
30
|
+
var host = headers.host || '';
|
|
31
|
+
if (!host) {
|
|
32
|
+
var envBaseUrl = process.env.NEXTAUTH_URL || process.env.VERCEL_URL || '';
|
|
33
|
+
if (envBaseUrl && !envBaseUrl.startsWith('http')) envBaseUrl = 'https://' + envBaseUrl;
|
|
34
|
+
return envBaseUrl || 'http://localhost:3000';
|
|
35
|
+
}
|
|
36
|
+
var proto = headers['x-forwarded-proto'] || (__isLoopbackHost(host) ? 'http' : 'https');
|
|
37
|
+
var requestOrigin = String(proto).split(',')[0].trim() + '://' + host;
|
|
38
|
+
if (process.env.VERCEL) return requestOrigin;
|
|
39
|
+
var configured = String(process.env.NEXTAUTH_URL || '').trim();
|
|
40
|
+
if (!configured) return requestOrigin;
|
|
41
|
+
var origin;
|
|
42
|
+
try { origin = new URL(configured).origin; } catch (e) { return requestOrigin; }
|
|
43
|
+
if (__isLoopbackHost(host) && __isLoopbackHost(new URL(origin).host)) return requestOrigin;
|
|
44
|
+
return origin;
|
|
45
|
+
}`
|
|
7
46
|
|
|
8
47
|
export const generateStripeWebhookCode = (
|
|
9
48
|
invoiceSettings: UIDLInvoiceSettings | undefined,
|
|
@@ -29,26 +68,27 @@ try { invoiceGenerate = require('../invoices/generate'); } catch (e) { invoiceGe
|
|
|
29
68
|
: ''
|
|
30
69
|
}
|
|
31
70
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
if (prefixScan) {
|
|
42
|
-
var keys = Object.keys(process.env);
|
|
43
|
-
for (var j = 0; j < keys.length; j++) {
|
|
44
|
-
if (keys[j].indexOf(prefixScan) === 0) {
|
|
45
|
-
var v2 = process.env[keys[j]];
|
|
46
|
-
if (v2 && String(v2).length > 0) return String(v2);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return '';
|
|
71
|
+
var __paymentDrivers;
|
|
72
|
+
try { __paymentDrivers = require('../../../utils/payments'); } catch (e) { __paymentDrivers = null; }
|
|
73
|
+
|
|
74
|
+
// The key is read the way the store's payment drivers read it: the deployed
|
|
75
|
+
// name, then the secret the editor saved it under (an older store's
|
|
76
|
+
// STRIPE_TEST_KEY last).
|
|
77
|
+
function __stripeSecretKey() {
|
|
78
|
+
return __paymentDrivers.core.credential('stripe', 'secretKey', ['STRIPE_TEST_KEY']);
|
|
51
79
|
}
|
|
80
|
+
${
|
|
81
|
+
autoGenerateInvoice || hasOrderNotifications
|
|
82
|
+
? `
|
|
83
|
+
// Stripe reports money in the currency's smallest unit (JPY has none, KWD a
|
|
84
|
+
// thousandth); the store keeps the major one, converted as its drivers do.
|
|
85
|
+
function __stripeMajor(minor, currency) {
|
|
86
|
+
return __paymentDrivers.core.fromMinor(Number(minor) || 0, currency);
|
|
87
|
+
}
|
|
88
|
+
`
|
|
89
|
+
: ''
|
|
90
|
+
}
|
|
91
|
+
${WEBHOOK_BASE_URL_CODE}
|
|
52
92
|
|
|
53
93
|
module.exports = async function handler(req, res) {
|
|
54
94
|
if (req.method !== 'POST') {
|
|
@@ -56,18 +96,21 @@ module.exports = async function handler(req, res) {
|
|
|
56
96
|
return;
|
|
57
97
|
}
|
|
58
98
|
|
|
59
|
-
//
|
|
60
|
-
//
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
99
|
+
// This deployment's own origin for the self-calls (invoice generation, order
|
|
100
|
+
// notification), which carry the app secret — never a host the request named.
|
|
101
|
+
var __baseUrl = __webhookBaseUrl(req);
|
|
102
|
+
|
|
103
|
+
// Verified by the store's Stripe driver: the signature when a signing
|
|
104
|
+
// secret is configured, else the event read back from Stripe — never the
|
|
105
|
+
// request as it arrived. Without the driver nothing can be verified.
|
|
106
|
+
var driver = __paymentDrivers ? __paymentDrivers.get('stripe') : null;
|
|
107
|
+
if (!driver) {
|
|
108
|
+
console.error('Stripe webhook rejected: this store has no Stripe payment driver');
|
|
109
|
+
res.status(400).json({ error: 'Invalid webhook signature' });
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
68
112
|
|
|
69
|
-
var stripeSecretKey =
|
|
70
|
-
var webhookSecret = __resolveStripeSecret(['STRIPE_WEBHOOK_SECRET', 'CONFIGURATION_STRIPE_WEBHOOK_SECRET'], 'CONFIGURATION_STRIPE_WEBHOOK_SECRET');
|
|
113
|
+
var stripeSecretKey = __stripeSecretKey();
|
|
71
114
|
|
|
72
115
|
if (!stripeSecretKey) {
|
|
73
116
|
res.status(500).json({ error: 'Stripe secret key not configured' });
|
|
@@ -76,26 +119,26 @@ module.exports = async function handler(req, res) {
|
|
|
76
119
|
|
|
77
120
|
try {
|
|
78
121
|
var rawBody = await getRawBody(req);
|
|
79
|
-
var
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
event = verifyStripeSignature(rawBody, sig, webhookSecret);
|
|
88
|
-
if (!event) {
|
|
89
|
-
res.status(400).json({ error: 'Invalid webhook signature' });
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
} else {
|
|
93
|
-
event = JSON.parse(rawBody.toString('utf-8'));
|
|
122
|
+
var parsed;
|
|
123
|
+
try { parsed = JSON.parse(rawBody.toString('utf-8')); } catch (_e) { parsed = {}; }
|
|
124
|
+
var verification = await driver.verifyWebhook({ headers: req.headers, rawBody: rawBody, body: parsed, secret: '' });
|
|
125
|
+
if (!verification.ok) {
|
|
126
|
+
console.error('Stripe webhook rejected: ' + (verification.reason || 'not verified'));
|
|
127
|
+
res.status(400).json({ error: 'Invalid webhook signature' });
|
|
128
|
+
return;
|
|
94
129
|
}
|
|
130
|
+
var event = verification.body;
|
|
95
131
|
|
|
96
132
|
switch (event.type) {
|
|
133
|
+
// A bank debit or a transfer completes the session UNPAID, and Stripe
|
|
134
|
+
// reports the money later (or never): only a paid session pays the order.
|
|
135
|
+
case 'checkout.session.async_payment_succeeded':
|
|
97
136
|
case 'checkout.session.completed': {
|
|
98
137
|
var session = event.data.object;
|
|
138
|
+
if (session.payment_status !== 'paid' && session.payment_status !== 'no_payment_required') {
|
|
139
|
+
console.log('Checkout session completed, payment not received yet:', session.id);
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
99
142
|
${
|
|
100
143
|
autoGenerateInvoice
|
|
101
144
|
? `await handleInvoiceGeneration(session, 'checkout', __baseUrl, stripeSecretKey);`
|
|
@@ -108,6 +151,25 @@ module.exports = async function handler(req, res) {
|
|
|
108
151
|
|
|
109
152
|
case 'payment_intent.succeeded': {
|
|
110
153
|
var paymentIntent = event.data.object;
|
|
154
|
+
// The PaymentIntent of the store's own Checkout Session carries the
|
|
155
|
+
// order in its metadata (the driver copies it there so a refund names
|
|
156
|
+
// the order): the session's event pays and invoices that order, and
|
|
157
|
+
// this one would do it a second time.
|
|
158
|
+
if (paymentIntent.metadata && paymentIntent.metadata.orderId) {
|
|
159
|
+
console.log('Payment intent succeeded for a checkout session order:', paymentIntent.id);
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
${
|
|
163
|
+
autoGenerateInvoice
|
|
164
|
+
? `// An intent that pays a Stripe invoice (a subscription's first
|
|
165
|
+
// payment, a renewal) is invoiced from invoice.payment_succeeded,
|
|
166
|
+
// with the invoice's own lines: invoiced here too, it would be twice.
|
|
167
|
+
if (await __paysStripeInvoice(paymentIntent, stripeSecretKey)) {
|
|
168
|
+
console.log('Payment intent succeeded for a Stripe invoice:', paymentIntent.id);
|
|
169
|
+
break;
|
|
170
|
+
}`
|
|
171
|
+
: ''
|
|
172
|
+
}
|
|
111
173
|
${
|
|
112
174
|
autoGenerateInvoice
|
|
113
175
|
? `await handleInvoiceGeneration(paymentIntent, 'payment_intent', __baseUrl, stripeSecretKey);`
|
|
@@ -132,7 +194,14 @@ module.exports = async function handler(req, res) {
|
|
|
132
194
|
var stripeInvoice = event.data.object;
|
|
133
195
|
${
|
|
134
196
|
autoGenerateInvoice
|
|
135
|
-
?
|
|
197
|
+
? `// A subscription's first invoice, from a checkout the store opened
|
|
198
|
+
// for an order, is invoiced from that checkout's own event with the
|
|
199
|
+
// order it pays: invoiced here too, it would be twice.
|
|
200
|
+
if (__opensStoreOrder(stripeInvoice)) {
|
|
201
|
+
console.log('Invoice payment succeeded for a store checkout order:', stripeInvoice.id);
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
await handleStripeInvoicePayment(stripeInvoice, __baseUrl);`
|
|
136
205
|
: `console.log('Invoice payment succeeded:', stripeInvoice.id);`
|
|
137
206
|
}
|
|
138
207
|
break;
|
|
@@ -162,47 +231,6 @@ function getRawBody(req) {
|
|
|
162
231
|
});
|
|
163
232
|
}
|
|
164
233
|
|
|
165
|
-
function verifyStripeSignature(payload, sigHeader, secret) {
|
|
166
|
-
try {
|
|
167
|
-
var crypto = require('crypto');
|
|
168
|
-
var parts = sigHeader.split(',');
|
|
169
|
-
var timestamp = '';
|
|
170
|
-
var signatures = [];
|
|
171
|
-
|
|
172
|
-
for (var i = 0; i < parts.length; i++) {
|
|
173
|
-
var kv = parts[i].trim().split('=');
|
|
174
|
-
if (kv[0] === 't') timestamp = kv[1];
|
|
175
|
-
if (kv[0] === 'v1') signatures.push(kv[1]);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
if (!timestamp || signatures.length === 0) return null;
|
|
179
|
-
|
|
180
|
-
var signedPayload = timestamp + '.' + payload.toString('utf-8');
|
|
181
|
-
var expectedSignature = crypto
|
|
182
|
-
.createHmac('sha256', secret)
|
|
183
|
-
.update(signedPayload)
|
|
184
|
-
.digest('hex');
|
|
185
|
-
|
|
186
|
-
var valid = false;
|
|
187
|
-
for (var j = 0; j < signatures.length; j++) {
|
|
188
|
-
if (crypto.timingSafeEqual(Buffer.from(expectedSignature), Buffer.from(signatures[j]))) {
|
|
189
|
-
valid = true;
|
|
190
|
-
break;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
if (!valid) return null;
|
|
195
|
-
|
|
196
|
-
var tolerance = 300;
|
|
197
|
-
var now = Math.floor(Date.now() / 1000);
|
|
198
|
-
if (Math.abs(now - Number(timestamp)) > tolerance) return null;
|
|
199
|
-
|
|
200
|
-
return JSON.parse(payload.toString('utf-8'));
|
|
201
|
-
} catch (e) {
|
|
202
|
-
return null;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
|
|
206
234
|
module.exports.config = { api: { bodyParser: false } };
|
|
207
235
|
|
|
208
236
|
${autoGenerateInvoice ? generateInvoiceHandlerCode() : ''}
|
|
@@ -227,8 +255,9 @@ async function handleEcommerceOrderUpdate(session) {
|
|
|
227
255
|
var client = new pg.Client({ connectionString: connStr, ssl: connStr.indexOf('sslmode=require') !== -1 ? { rejectUnauthorized: false } : undefined });
|
|
228
256
|
try {
|
|
229
257
|
await client.connect();
|
|
258
|
+
// A cancelled order stays cancelled, whatever pays for it late.
|
|
230
259
|
await client.query(
|
|
231
|
-
"UPDATE teleport_orders SET status = $1, payment_status = $2, payment_intent_id = COALESCE(NULLIF($3, ''), payment_intent_id), updated_at = NOW() WHERE id = $4",
|
|
260
|
+
"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'",
|
|
232
261
|
['paid', 'paid', String(session.payment_intent || session.id || ''), orderId]
|
|
233
262
|
);
|
|
234
263
|
} finally {
|
|
@@ -251,12 +280,13 @@ async function sendOrderNotification(session, baseUrl) {
|
|
|
251
280
|
|
|
252
281
|
await fetch(resolvedBaseUrl + '/api/ecommerce/order-notification', {
|
|
253
282
|
method: 'POST',
|
|
254
|
-
|
|
283
|
+
// The route emails the merchant only for the store's own server code.
|
|
284
|
+
headers: { 'Content-Type': 'application/json', 'x-internal-data-secret': process.env.NEXTAUTH_SECRET || '' },
|
|
255
285
|
body: JSON.stringify({
|
|
256
286
|
orderId: orderId || session.id,
|
|
257
287
|
customerEmail: session.customer_email || (session.customer_details && session.customer_details.email) || '',
|
|
258
288
|
customerName: (session.customer_details && session.customer_details.name) || '',
|
|
259
|
-
totalAmount: (session.amount_total
|
|
289
|
+
totalAmount: __stripeMajor(session.amount_total, session.currency),
|
|
260
290
|
paymentMethod: 'stripe',
|
|
261
291
|
}),
|
|
262
292
|
});
|
|
@@ -277,9 +307,10 @@ async function handleInvoiceGeneration(paymentObj, source, baseUrl, stripeSecret
|
|
|
277
307
|
var currency = 'usd';
|
|
278
308
|
var paymentIntentId = paymentObj.id || '';
|
|
279
309
|
// For checkout sessions, the place-order workflow embeds the internal
|
|
280
|
-
// teleport_orders UUID in metadata.orderId.
|
|
281
|
-
//
|
|
282
|
-
//
|
|
310
|
+
// teleport_orders UUID in metadata.orderId. A payment_intent.succeeded
|
|
311
|
+
// event reaches here only for an intent that names no order (one the
|
|
312
|
+
// store's checkout opened is settled by its session's event), so '' then
|
|
313
|
+
// skips hydration cleanly.
|
|
283
314
|
var internalOrderId = (paymentObj.metadata && typeof paymentObj.metadata.orderId === 'string') ? paymentObj.metadata.orderId : '';
|
|
284
315
|
|
|
285
316
|
if (source === 'checkout') {
|
|
@@ -292,8 +323,8 @@ async function handleInvoiceGeneration(paymentObj, source, baseUrl, stripeSecret
|
|
|
292
323
|
return {
|
|
293
324
|
name: li.description || '',
|
|
294
325
|
quantity: li.quantity || 1,
|
|
295
|
-
unitPrice: (li.amount_total
|
|
296
|
-
totalPrice: (li.amount_total
|
|
326
|
+
unitPrice: __stripeMajor(li.amount_total, currency) / (li.quantity || 1),
|
|
327
|
+
totalPrice: __stripeMajor(li.amount_total, currency),
|
|
297
328
|
currency: currency.toUpperCase(),
|
|
298
329
|
};
|
|
299
330
|
});
|
|
@@ -310,8 +341,8 @@ async function handleInvoiceGeneration(paymentObj, source, baseUrl, stripeSecret
|
|
|
310
341
|
return {
|
|
311
342
|
name: li.description || '',
|
|
312
343
|
quantity: li.quantity || 1,
|
|
313
|
-
unitPrice: (li.amount_total
|
|
314
|
-
totalPrice: (li.amount_total
|
|
344
|
+
unitPrice: __stripeMajor(li.amount_total, currency) / (li.quantity || 1),
|
|
345
|
+
totalPrice: __stripeMajor(li.amount_total, currency),
|
|
315
346
|
currency: currency.toUpperCase(),
|
|
316
347
|
};
|
|
317
348
|
});
|
|
@@ -326,8 +357,8 @@ async function handleInvoiceGeneration(paymentObj, source, baseUrl, stripeSecret
|
|
|
326
357
|
items = [{
|
|
327
358
|
name: paymentObj.description || 'Payment',
|
|
328
359
|
quantity: 1,
|
|
329
|
-
unitPrice: (paymentObj.amount
|
|
330
|
-
totalPrice: (paymentObj.amount
|
|
360
|
+
unitPrice: __stripeMajor(paymentObj.amount, currency),
|
|
361
|
+
totalPrice: __stripeMajor(paymentObj.amount, currency),
|
|
331
362
|
currency: currency.toUpperCase(),
|
|
332
363
|
}];
|
|
333
364
|
|
|
@@ -369,7 +400,9 @@ async function handleInvoiceGeneration(paymentObj, source, baseUrl, stripeSecret
|
|
|
369
400
|
|
|
370
401
|
var response = await fetch(resolvedBaseUrl + '/api/invoices/generate', {
|
|
371
402
|
method: 'POST',
|
|
372
|
-
|
|
403
|
+
// The route issues invoices only for the store's own server code, which
|
|
404
|
+
// presents the app secret.
|
|
405
|
+
headers: { 'Content-Type': 'application/json', 'x-internal-data-secret': process.env.NEXTAUTH_SECRET || '' },
|
|
373
406
|
body: JSON.stringify(invoicePayload),
|
|
374
407
|
});
|
|
375
408
|
|
|
@@ -415,9 +448,10 @@ async function __linkInvoiceToOrder(internalOrderId, invoiceResp, paymentIntentI
|
|
|
415
448
|
var invoiceId = (invoiceResp && invoiceResp.invoiceId) || null;
|
|
416
449
|
var invoiceNumber = (invoiceResp && invoiceResp.invoiceNumber) || null;
|
|
417
450
|
// status / payment_status are independent: status tracks the order
|
|
418
|
-
// lifecycle (confirmed = order accepted), payment_status tracks money.
|
|
451
|
+
// lifecycle (confirmed = order accepted), payment_status tracks money. A
|
|
452
|
+
// cancelled order stays cancelled, whatever pays for it late.
|
|
419
453
|
await client.query(
|
|
420
|
-
"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",
|
|
454
|
+
"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'",
|
|
421
455
|
['confirmed', 'paid', paymentIntentId || '', invoiceId, invoiceNumber, pdfUrl, internalOrderId]
|
|
422
456
|
);
|
|
423
457
|
console.info('[stripe webhook] order ' + internalOrderId + ' marked confirmed/paid — invoice=' + (invoiceNumber || '(none)') + ' pdf=' + (pdfUrl || '(none)'));
|
|
@@ -426,6 +460,53 @@ async function __linkInvoiceToOrder(internalOrderId, invoiceResp, paymentIntentI
|
|
|
426
460
|
}
|
|
427
461
|
}
|
|
428
462
|
|
|
463
|
+
// Whether a subscription's invoice is the first one of a subscription the
|
|
464
|
+
// store's own Checkout Session opened for an order. The session copies the
|
|
465
|
+
// order onto the subscription's metadata, which Stripe snapshots onto each
|
|
466
|
+
// invoice — on the invoice itself in the classic API, under \`parent\` from the
|
|
467
|
+
// 2025-03-31 versions on.
|
|
468
|
+
function __opensStoreOrder(stripeInvoice) {
|
|
469
|
+
if (!stripeInvoice || stripeInvoice.billing_reason !== 'subscription_create') {
|
|
470
|
+
return false;
|
|
471
|
+
}
|
|
472
|
+
var details = stripeInvoice.subscription_details ||
|
|
473
|
+
(stripeInvoice.parent && stripeInvoice.parent.subscription_details) || {};
|
|
474
|
+
var metadata = details.metadata || {};
|
|
475
|
+
return typeof metadata.orderId === 'string' && metadata.orderId !== '';
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// Whether a PaymentIntent pays a Stripe invoice. The classic API names the
|
|
479
|
+
// invoice on the intent; from the 2025-03-31 versions on the intent names none,
|
|
480
|
+
// and the invoice payments are searched by the intent instead (that search is
|
|
481
|
+
// pinned to the version that introduced it). A search Stripe does not answer
|
|
482
|
+
// fails the delivery, so Stripe sends it again: taken as a payment of its own,
|
|
483
|
+
// an invoice's payment would be invoiced twice.
|
|
484
|
+
async function __paysStripeInvoice(paymentIntent, stripeSecretKey) {
|
|
485
|
+
if (paymentIntent.invoice) {
|
|
486
|
+
return true;
|
|
487
|
+
}
|
|
488
|
+
if (!stripeSecretKey || !paymentIntent.id) {
|
|
489
|
+
return false;
|
|
490
|
+
}
|
|
491
|
+
try {
|
|
492
|
+
var params = new URLSearchParams();
|
|
493
|
+
params.append('payment[type]', 'payment_intent');
|
|
494
|
+
params.append('payment[payment_intent]', paymentIntent.id);
|
|
495
|
+
params.append('limit', '1');
|
|
496
|
+
var found = await fetch('https://api.stripe.com/v1/invoice_payments?' + params.toString(), {
|
|
497
|
+
headers: { 'Authorization': 'Bearer ' + stripeSecretKey, 'Stripe-Version': '2025-03-31.basil' },
|
|
498
|
+
});
|
|
499
|
+
if (!found.ok) {
|
|
500
|
+
throw new Error('Stripe answered ' + found.status);
|
|
501
|
+
}
|
|
502
|
+
var page = await found.json();
|
|
503
|
+
return !!(page && Array.isArray(page.data) && page.data.length > 0);
|
|
504
|
+
} catch (e) {
|
|
505
|
+
console.error('Failed to look up the invoice of payment intent ' + paymentIntent.id + ':', e.message);
|
|
506
|
+
throw new Error('Could not tell whether payment intent ' + paymentIntent.id + ' pays a Stripe invoice');
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
429
510
|
async function handleStripeInvoicePayment(stripeInvoice, baseUrl) {
|
|
430
511
|
try {
|
|
431
512
|
var items = [];
|
|
@@ -434,8 +515,8 @@ async function handleStripeInvoicePayment(stripeInvoice, baseUrl) {
|
|
|
434
515
|
return {
|
|
435
516
|
name: li.description || '',
|
|
436
517
|
quantity: li.quantity || 1,
|
|
437
|
-
unitPrice: (li.amount
|
|
438
|
-
totalPrice: (li.amount
|
|
518
|
+
unitPrice: __stripeMajor(li.amount, stripeInvoice.currency),
|
|
519
|
+
totalPrice: __stripeMajor(li.amount, stripeInvoice.currency),
|
|
439
520
|
currency: (stripeInvoice.currency || 'usd').toUpperCase(),
|
|
440
521
|
};
|
|
441
522
|
});
|
|
@@ -459,7 +540,9 @@ async function handleStripeInvoicePayment(stripeInvoice, baseUrl) {
|
|
|
459
540
|
|
|
460
541
|
var response = await fetch(resolvedBaseUrl + '/api/invoices/generate', {
|
|
461
542
|
method: 'POST',
|
|
462
|
-
|
|
543
|
+
// The route issues invoices only for the store's own server code, which
|
|
544
|
+
// presents the app secret.
|
|
545
|
+
headers: { 'Content-Type': 'application/json', 'x-internal-data-secret': process.env.NEXTAUTH_SECRET || '' },
|
|
463
546
|
body: JSON.stringify(invoicePayload),
|
|
464
547
|
});
|
|
465
548
|
|
|
@@ -497,72 +580,77 @@ try { invoiceGenerate = require('../invoices/generate'); } catch (e) { invoiceGe
|
|
|
497
580
|
: ''
|
|
498
581
|
}
|
|
499
582
|
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
}
|
|
508
|
-
if (prefixScan) {
|
|
509
|
-
var keys = Object.keys(process.env);
|
|
510
|
-
for (var j = 0; j < keys.length; j++) {
|
|
511
|
-
if (keys[j].indexOf(prefixScan) === 0) {
|
|
512
|
-
var v2 = process.env[keys[j]];
|
|
513
|
-
if (v2 && String(v2).length > 0) return String(v2);
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
return '';
|
|
583
|
+
var __paymentDrivers;
|
|
584
|
+
try { __paymentDrivers = require('../../../utils/payments'); } catch (e) { __paymentDrivers = null; }
|
|
585
|
+
|
|
586
|
+
// The credentials are read the way the store's payment drivers read them:
|
|
587
|
+
// the deployed name, then the secret the editor saved them under.
|
|
588
|
+
function __paypalCredential(field) {
|
|
589
|
+
return __paymentDrivers.core.credential('paypal', field);
|
|
518
590
|
}
|
|
519
591
|
|
|
592
|
+
${WEBHOOK_BASE_URL_CODE}
|
|
593
|
+
|
|
520
594
|
module.exports = async function handler(req, res) {
|
|
521
595
|
if (req.method !== 'POST') {
|
|
522
596
|
res.status(405).json({ error: 'Method not allowed' });
|
|
523
597
|
return;
|
|
524
598
|
}
|
|
525
599
|
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
600
|
+
// Verified by the store's PayPal driver: PayPal's signature check when a
|
|
601
|
+
// webhook id is configured, else the event read back from PayPal — never
|
|
602
|
+
// the request as it arrived. Without the driver nothing can be verified.
|
|
603
|
+
var driver = __paymentDrivers ? __paymentDrivers.get('paypal') : null;
|
|
604
|
+
if (!driver) {
|
|
605
|
+
console.error('PayPal webhook rejected: this store has no PayPal payment driver');
|
|
606
|
+
res.status(400).json({ error: 'Invalid webhook signature' });
|
|
607
|
+
return;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
var clientId = __paypalCredential('clientId');
|
|
611
|
+
var clientSecret = __paypalCredential('clientSecret');
|
|
529
612
|
|
|
530
613
|
if (!clientId || !clientSecret) {
|
|
531
614
|
res.status(500).json({ error: 'PayPal credentials not configured' });
|
|
532
615
|
return;
|
|
533
616
|
}
|
|
534
617
|
|
|
535
|
-
//
|
|
536
|
-
//
|
|
537
|
-
|
|
538
|
-
// Next.js, but stays defensive). Same pattern as /api/invoices/generate.
|
|
539
|
-
var __proto = req.headers['x-forwarded-proto'] ||
|
|
540
|
-
(req.headers.host && (req.headers.host.startsWith('localhost') || req.headers.host.startsWith('127.0.0.1')) ? 'http' : 'https');
|
|
541
|
-
var __reqBaseUrl = req.headers.host ? (__proto + '://' + req.headers.host) : '';
|
|
542
|
-
var __envBaseUrl = process.env.NEXTAUTH_URL || process.env.VERCEL_URL || '';
|
|
543
|
-
if (__envBaseUrl && !__envBaseUrl.startsWith('http')) __envBaseUrl = 'https://' + __envBaseUrl;
|
|
544
|
-
var __baseUrl = __reqBaseUrl || __envBaseUrl || 'http://localhost:3000';
|
|
618
|
+
// This deployment's own origin for the self-calls (invoice generation, order
|
|
619
|
+
// notification), which carry the app secret — never a host the request named.
|
|
620
|
+
var __baseUrl = __webhookBaseUrl(req);
|
|
545
621
|
|
|
546
622
|
try {
|
|
547
|
-
var
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
623
|
+
var rawBody = await getRawBody(req);
|
|
624
|
+
var parsed;
|
|
625
|
+
try { parsed = JSON.parse(rawBody.toString('utf-8')); } catch (_e) { parsed = {}; }
|
|
626
|
+
var verification = await driver.verifyWebhook({ headers: req.headers, rawBody: rawBody, body: parsed, secret: '' });
|
|
627
|
+
if (!verification.ok) {
|
|
628
|
+
console.error('PayPal webhook rejected: ' + (verification.reason || 'not verified'));
|
|
629
|
+
res.status(400).json({ error: 'Invalid webhook signature' });
|
|
630
|
+
return;
|
|
555
631
|
}
|
|
632
|
+
var body = verification.body || {};
|
|
556
633
|
|
|
557
634
|
var eventType = body.event_type || '';
|
|
558
635
|
|
|
559
636
|
switch (eventType) {
|
|
560
|
-
|
|
637
|
+
// Only a capture moves money. An approval moves none (the driver
|
|
638
|
+
// captures an approved order as it verifies the approval), and the
|
|
639
|
+
// capture's own event, which follows, is what pays the order.
|
|
561
640
|
case 'PAYMENT.CAPTURE.COMPLETED': {
|
|
562
641
|
var resource = body.resource || {};
|
|
642
|
+
${
|
|
643
|
+
autoGenerateInvoice || hasOrderNotifications
|
|
644
|
+
? `var capture = await __checkPaypalCapture(resource);
|
|
645
|
+
if (!capture.ok) {
|
|
646
|
+
console.error('PayPal capture ' + (resource.id || '') + ' not applied: ' + capture.reason);
|
|
647
|
+
break;
|
|
648
|
+
}`
|
|
649
|
+
: ''
|
|
650
|
+
}
|
|
563
651
|
${
|
|
564
652
|
autoGenerateInvoice
|
|
565
|
-
? `await handlePaypalInvoiceGeneration(resource,
|
|
653
|
+
? `await handlePaypalInvoiceGeneration(resource, __baseUrl);`
|
|
566
654
|
: `console.log('PayPal payment completed:', resource.id);`
|
|
567
655
|
}
|
|
568
656
|
${
|
|
@@ -570,7 +658,8 @@ module.exports = async function handler(req, res) {
|
|
|
570
658
|
? `try {
|
|
571
659
|
await fetch(__baseUrl + '/api/ecommerce/order-notification', {
|
|
572
660
|
method: 'POST',
|
|
573
|
-
|
|
661
|
+
// The route emails the merchant only for the store's own server code.
|
|
662
|
+
headers: { 'Content-Type': 'application/json', 'x-internal-data-secret': process.env.NEXTAUTH_SECRET || '' },
|
|
574
663
|
body: JSON.stringify({
|
|
575
664
|
// The internal order id, so the route can load the order's own
|
|
576
665
|
// lines and the rates they were charged at; the capture id is
|
|
@@ -611,58 +700,22 @@ module.exports = async function handler(req, res) {
|
|
|
611
700
|
}
|
|
612
701
|
};
|
|
613
702
|
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
// verifications to the live API, which then rejected the sandbox cert
|
|
620
|
-
// with verification_status=FAILURE. The cert URL itself authoritatively
|
|
621
|
-
// says "sandbox" vs production.
|
|
622
|
-
var certUrl = String(headers['paypal-cert-url'] || '');
|
|
623
|
-
var isSandbox = certUrl.indexOf('sandbox.paypal.com') !== -1 ||
|
|
624
|
-
certUrl.indexOf('api.sandbox.paypal.com') !== -1;
|
|
625
|
-
var baseUrl = isSandbox ? 'https://api-m.sandbox.paypal.com' : 'https://api-m.paypal.com';
|
|
626
|
-
|
|
627
|
-
var authResponse = await fetch(baseUrl + '/v1/oauth2/token', {
|
|
628
|
-
method: 'POST',
|
|
629
|
-
headers: {
|
|
630
|
-
'Authorization': 'Basic ' + Buffer.from(clientId + ':' + clientSecret).toString('base64'),
|
|
631
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
632
|
-
},
|
|
633
|
-
body: 'grant_type=client_credentials',
|
|
634
|
-
});
|
|
635
|
-
var authData = await authResponse.json();
|
|
636
|
-
if (!authData.access_token) return false;
|
|
637
|
-
|
|
638
|
-
var verifyResponse = await fetch(baseUrl + '/v1/notifications/verify-webhook-signature', {
|
|
639
|
-
method: 'POST',
|
|
640
|
-
headers: {
|
|
641
|
-
'Authorization': 'Bearer ' + authData.access_token,
|
|
642
|
-
'Content-Type': 'application/json',
|
|
643
|
-
},
|
|
644
|
-
body: JSON.stringify({
|
|
645
|
-
auth_algo: headers['paypal-auth-algo'] || '',
|
|
646
|
-
cert_url: headers['paypal-cert-url'] || '',
|
|
647
|
-
transmission_id: headers['paypal-transmission-id'] || '',
|
|
648
|
-
transmission_sig: headers['paypal-transmission-sig'] || '',
|
|
649
|
-
transmission_time: headers['paypal-transmission-time'] || '',
|
|
650
|
-
webhook_id: webhookId,
|
|
651
|
-
webhook_event: body,
|
|
652
|
-
}),
|
|
653
|
-
});
|
|
654
|
-
var verifyData = await verifyResponse.json();
|
|
655
|
-
var ok = verifyData.verification_status === 'SUCCESS';
|
|
656
|
-
if (!ok) {
|
|
657
|
-
console.error('PayPal webhook verification rejected by ' + baseUrl + ' — verification_status=' + (verifyData.verification_status || '(missing)') + ', name=' + (verifyData.name || '(none)') + ', message=' + (verifyData.message || '(none)'));
|
|
703
|
+
function getRawBody(req) {
|
|
704
|
+
return new Promise(function(resolve, reject) {
|
|
705
|
+
if (req.body && Buffer.isBuffer(req.body)) {
|
|
706
|
+
resolve(req.body);
|
|
707
|
+
return;
|
|
658
708
|
}
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
}
|
|
709
|
+
var chunks = [];
|
|
710
|
+
req.on('data', function(chunk) { chunks.push(chunk); });
|
|
711
|
+
req.on('end', function() { resolve(Buffer.concat(chunks)); });
|
|
712
|
+
req.on('error', function(err) { reject(err); });
|
|
713
|
+
});
|
|
664
714
|
}
|
|
665
715
|
|
|
716
|
+
// PayPal's signature check needs the event exactly as it was sent.
|
|
717
|
+
module.exports.config = { api: { bodyParser: false } };
|
|
718
|
+
|
|
666
719
|
${
|
|
667
720
|
autoGenerateInvoice || hasOrderNotifications
|
|
668
721
|
? `
|
|
@@ -686,6 +739,72 @@ function __extractInternalOrderId(resource) {
|
|
|
686
739
|
}
|
|
687
740
|
return '';
|
|
688
741
|
}
|
|
742
|
+
|
|
743
|
+
// Whether a completed capture may pay the store order it names: the capture
|
|
744
|
+
// took the money, and the order exists, is neither cancelled nor settled
|
|
745
|
+
// already (a redelivered event pays and announces nothing twice), and is due
|
|
746
|
+
// exactly what was captured — its total less what a gift card covered — in
|
|
747
|
+
// its own currency. A capture that names no store order has nothing to check.
|
|
748
|
+
async function __checkPaypalCapture(resource) {
|
|
749
|
+
var captureStatus = String(resource.status || 'COMPLETED').toUpperCase();
|
|
750
|
+
if (captureStatus !== 'COMPLETED') {
|
|
751
|
+
return { ok: false, reason: 'the capture is ' + captureStatus };
|
|
752
|
+
}
|
|
753
|
+
var internalOrderId = __extractInternalOrderId(resource);
|
|
754
|
+
if (!internalOrderId) {
|
|
755
|
+
return { ok: true };
|
|
756
|
+
}
|
|
757
|
+
var connStr = process.env.TELEPORT_DB_CONNECTION_STRING || process.env.DATABASE_URL || '';
|
|
758
|
+
if (!connStr) {
|
|
759
|
+
return { ok: false, reason: 'no database connection to check order ' + internalOrderId + ' against' };
|
|
760
|
+
}
|
|
761
|
+
var pg;
|
|
762
|
+
try {
|
|
763
|
+
pg = require('pg');
|
|
764
|
+
} catch (e) {
|
|
765
|
+
return { ok: false, reason: 'the pg module is unavailable to check order ' + internalOrderId };
|
|
766
|
+
}
|
|
767
|
+
var client = new pg.Client({ connectionString: connStr, ssl: connStr.indexOf('sslmode=require') !== -1 ? { rejectUnauthorized: false } : undefined });
|
|
768
|
+
var order = null;
|
|
769
|
+
try {
|
|
770
|
+
await client.connect();
|
|
771
|
+
// gift_card_amount is read through the row's JSON: a store provisioned
|
|
772
|
+
// before gift cards has no such column.
|
|
773
|
+
var found = await client.query(
|
|
774
|
+
"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",
|
|
775
|
+
[internalOrderId]
|
|
776
|
+
);
|
|
777
|
+
order = found && found.rows && found.rows[0] ? found.rows[0] : null;
|
|
778
|
+
} finally {
|
|
779
|
+
try { await client.end(); } catch (_e) {}
|
|
780
|
+
}
|
|
781
|
+
if (!order) {
|
|
782
|
+
return { ok: false, reason: 'the store has no order ' + internalOrderId };
|
|
783
|
+
}
|
|
784
|
+
if (String(order.status || '').toLowerCase() === 'cancelled') {
|
|
785
|
+
return { ok: false, reason: 'order ' + internalOrderId + ' was cancelled' };
|
|
786
|
+
}
|
|
787
|
+
var paymentStatus = String(order.payment_status || '').toLowerCase();
|
|
788
|
+
if (paymentStatus === 'paid' || paymentStatus === 'refunded' || paymentStatus === 'partially_refunded') {
|
|
789
|
+
return { ok: false, reason: 'order ' + internalOrderId + ' is already ' + paymentStatus };
|
|
790
|
+
}
|
|
791
|
+
var amount = resource.amount || {};
|
|
792
|
+
var capturedCurrency = String(amount.currency_code || '').toUpperCase();
|
|
793
|
+
var orderCurrency = String(order.currency || '').toUpperCase();
|
|
794
|
+
if (orderCurrency && capturedCurrency !== orderCurrency) {
|
|
795
|
+
return { ok: false, reason: 'the capture is in ' + (capturedCurrency || 'no currency') + ' and order ' + internalOrderId + ' in ' + orderCurrency };
|
|
796
|
+
}
|
|
797
|
+
// Whole cents, so 12.30 - 4.10 compares as 820 and never 8.199999999999999.
|
|
798
|
+
var due = Math.max(0, Math.round((Number(order.total_amount) - Number(order.gift_card_amount || 0)) * 100));
|
|
799
|
+
var captured = Math.round(Number(amount.value) * 100);
|
|
800
|
+
if (!isFinite(due) || captured !== due) {
|
|
801
|
+
return {
|
|
802
|
+
ok: false,
|
|
803
|
+
reason: 'the capture took ' + String(amount.value) + ' ' + capturedCurrency + ' and order ' + internalOrderId + ' is due ' + (due / 100).toFixed(2),
|
|
804
|
+
};
|
|
805
|
+
}
|
|
806
|
+
return { ok: true };
|
|
807
|
+
}
|
|
689
808
|
`
|
|
690
809
|
: ''
|
|
691
810
|
}
|
|
@@ -693,60 +812,21 @@ function __extractInternalOrderId(resource) {
|
|
|
693
812
|
${
|
|
694
813
|
autoGenerateInvoice
|
|
695
814
|
? `
|
|
696
|
-
|
|
815
|
+
// Invoices a completed capture; the capture resource names no buyer, so the
|
|
816
|
+
// invoice route hydrates them from the order when the capture names one.
|
|
817
|
+
async function handlePaypalInvoiceGeneration(resource, baseUrl) {
|
|
697
818
|
try {
|
|
698
819
|
var customerEmail = '';
|
|
699
820
|
var customerName = '';
|
|
700
|
-
var
|
|
701
|
-
var
|
|
702
|
-
var
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
total
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
quantity: 1,
|
|
710
|
-
unitPrice: total,
|
|
711
|
-
totalPrice: total,
|
|
712
|
-
currency: currency,
|
|
713
|
-
}];
|
|
714
|
-
} else if (eventType === 'CHECKOUT.ORDER.APPROVED') {
|
|
715
|
-
var purchaseUnit = (resource.purchase_units && resource.purchase_units[0]) || {};
|
|
716
|
-
currency = (purchaseUnit.amount && purchaseUnit.amount.currency_code) || 'USD';
|
|
717
|
-
total = Number(purchaseUnit.amount && purchaseUnit.amount.value) || 0;
|
|
718
|
-
|
|
719
|
-
if (purchaseUnit.items) {
|
|
720
|
-
items = purchaseUnit.items.map(function(item) {
|
|
721
|
-
return {
|
|
722
|
-
name: item.name || '',
|
|
723
|
-
quantity: Number(item.quantity) || 1,
|
|
724
|
-
unitPrice: Number(item.unit_amount && item.unit_amount.value) || 0,
|
|
725
|
-
totalPrice: (Number(item.quantity) || 1) * (Number(item.unit_amount && item.unit_amount.value) || 0),
|
|
726
|
-
currency: currency,
|
|
727
|
-
};
|
|
728
|
-
});
|
|
729
|
-
} else {
|
|
730
|
-
items = [{
|
|
731
|
-
name: 'PayPal Order',
|
|
732
|
-
quantity: 1,
|
|
733
|
-
unitPrice: total,
|
|
734
|
-
totalPrice: total,
|
|
735
|
-
currency: currency,
|
|
736
|
-
}];
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
if (purchaseUnit.shipping && purchaseUnit.shipping.name) {
|
|
740
|
-
customerName = purchaseUnit.shipping.name.full_name || '';
|
|
741
|
-
}
|
|
742
|
-
if (resource.payer) {
|
|
743
|
-
customerEmail = resource.payer.email_address || '';
|
|
744
|
-
if (!customerName && resource.payer.name) {
|
|
745
|
-
customerName = (resource.payer.name.given_name || '') + ' ' + (resource.payer.name.surname || '');
|
|
746
|
-
customerName = customerName.trim();
|
|
747
|
-
}
|
|
748
|
-
}
|
|
749
|
-
}
|
|
821
|
+
var currency = (resource.amount && resource.amount.currency_code) || 'USD';
|
|
822
|
+
var total = Number(resource.amount && resource.amount.value) || 0;
|
|
823
|
+
var items = [{
|
|
824
|
+
name: 'PayPal Payment',
|
|
825
|
+
quantity: 1,
|
|
826
|
+
unitPrice: total,
|
|
827
|
+
totalPrice: total,
|
|
828
|
+
currency: currency,
|
|
829
|
+
}];
|
|
750
830
|
|
|
751
831
|
// baseUrl is passed in from the request handler so the self-fetch tracks
|
|
752
832
|
// the actual port the dev server bound to. Falls back to env vars for
|
|
@@ -789,7 +869,9 @@ async function handlePaypalInvoiceGeneration(resource, eventType, clientId, clie
|
|
|
789
869
|
|
|
790
870
|
var response = await fetch(resolvedBaseUrl + '/api/invoices/generate', {
|
|
791
871
|
method: 'POST',
|
|
792
|
-
|
|
872
|
+
// The route issues invoices only for the store's own server code, which
|
|
873
|
+
// presents the app secret.
|
|
874
|
+
headers: { 'Content-Type': 'application/json', 'x-internal-data-secret': process.env.NEXTAUTH_SECRET || '' },
|
|
793
875
|
body: JSON.stringify(invoicePayload),
|
|
794
876
|
});
|
|
795
877
|
|
|
@@ -853,9 +935,10 @@ async function __linkInvoiceToOrder(internalOrderId, invoiceResp, paymentIntentI
|
|
|
853
935
|
// payment_status is the MONEY state (unpaid → paid → refunded). A paid
|
|
854
936
|
// online order should set status='confirmed' (not 'paid'), matching the
|
|
855
937
|
// Stripe + COD paths so the order-details page renders a consistent
|
|
856
|
-
// "Status: Confirmed / Payment: Paid".
|
|
938
|
+
// "Status: Confirmed / Payment: Paid". A cancelled order stays
|
|
939
|
+
// cancelled, whatever pays for it late.
|
|
857
940
|
await client.query(
|
|
858
|
-
"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",
|
|
941
|
+
"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'",
|
|
859
942
|
['confirmed', 'paid', paymentIntentId || '', invoiceId, invoiceNumber, pdfUrl, internalOrderId]
|
|
860
943
|
);
|
|
861
944
|
console.info('[paypal webhook] order ' + internalOrderId + ' marked confirmed/paid — invoice=' + (invoiceNumber || '(none)') + ' pdf=' + (pdfUrl || '(none)'));
|
|
@@ -874,7 +957,7 @@ export interface GenerateWebhookFilesOptions {
|
|
|
874
957
|
// route (event-webhook-received + webhookConfig). The legacy hard-coded
|
|
875
958
|
// emission is skipped for those providers to avoid two concurrent
|
|
876
959
|
// implementations of the same webhook in the generated project.
|
|
877
|
-
skipProviders?:
|
|
960
|
+
skipProviders?: ReadonlySet<string>
|
|
878
961
|
}
|
|
879
962
|
|
|
880
963
|
export const generateWebhookFiles = (
|
|
@@ -887,19 +970,35 @@ export const generateWebhookFiles = (
|
|
|
887
970
|
const ecommerceSettings = uidl.ecommerceSettings
|
|
888
971
|
const ecommerceProviders = ecommerceSettings?.paymentProviders || []
|
|
889
972
|
const providerTypes = ecommerceProviders.map((p) => p.type)
|
|
890
|
-
const skipProviders = options.skipProviders || new Set<
|
|
973
|
+
const skipProviders = options.skipProviders || new Set<string>()
|
|
891
974
|
|
|
892
|
-
const
|
|
893
|
-
Object.keys(env).some(
|
|
975
|
+
const emitStripe =
|
|
976
|
+
(Object.keys(env).some(
|
|
894
977
|
(k) => k.includes('STRIPE_SECRET_KEY') || k.includes('STRIPE_WEBHOOK_SECRET')
|
|
895
|
-
) ||
|
|
978
|
+
) ||
|
|
979
|
+
providerTypes.includes('stripe')) &&
|
|
980
|
+
!skipProviders.has('stripe')
|
|
896
981
|
|
|
897
|
-
const
|
|
898
|
-
Object.keys(env).some(
|
|
982
|
+
const emitPaypal =
|
|
983
|
+
(Object.keys(env).some(
|
|
899
984
|
(k) => k.includes('PAYPAL_CLIENT_ID') || k.includes('PAYPAL_CLIENT_SECRET')
|
|
900
|
-
) ||
|
|
985
|
+
) ||
|
|
986
|
+
providerTypes.includes('paypal')) &&
|
|
987
|
+
!skipProviders.has('paypal')
|
|
901
988
|
|
|
902
|
-
if (
|
|
989
|
+
if (!emitStripe && !emitPaypal) {
|
|
990
|
+
return
|
|
991
|
+
}
|
|
992
|
+
// Both routes verify through the store's drivers. The module is written
|
|
993
|
+
// once, by whichever emitter comes first, so it carries every provider the
|
|
994
|
+
// store uses — not only the two these routes need.
|
|
995
|
+
const storeDriverIds = resolveStorePaymentDriverIds(uidl, [])
|
|
996
|
+
ensurePaymentDriversModule(
|
|
997
|
+
structure,
|
|
998
|
+
storeDriverIds.length > 0 ? storeDriverIds : DEFAULT_PAYMENT_DRIVER_IDS
|
|
999
|
+
)
|
|
1000
|
+
|
|
1001
|
+
if (emitStripe) {
|
|
903
1002
|
files.set('webhook-stripe', {
|
|
904
1003
|
path: ['pages', 'api', 'webhooks'],
|
|
905
1004
|
files: [
|
|
@@ -912,7 +1011,7 @@ export const generateWebhookFiles = (
|
|
|
912
1011
|
})
|
|
913
1012
|
}
|
|
914
1013
|
|
|
915
|
-
if (
|
|
1014
|
+
if (emitPaypal) {
|
|
916
1015
|
files.set('webhook-paypal', {
|
|
917
1016
|
path: ['pages', 'api', 'webhooks'],
|
|
918
1017
|
files: [
|