@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.
Files changed (787) hide show
  1. package/__tests__/_helpers/bind-workflow-utils.ts +16 -1
  2. package/__tests__/_helpers/fake-fetch.ts +96 -0
  3. package/__tests__/_helpers/fake-stripe.ts +52 -0
  4. package/__tests__/_helpers/load-handler.ts +22 -3
  5. package/__tests__/_helpers/load-invoice-route.ts +75 -0
  6. package/__tests__/_helpers/load-payment-drivers.ts +69 -0
  7. package/__tests__/_helpers/load-server-runtime.ts +33 -0
  8. package/__tests__/_helpers/run-generated-middleware.ts +50 -9
  9. package/__tests__/admin-form-hydration-target.test.ts +39 -0
  10. package/__tests__/admin-form-row-hydration.test.ts +58 -0
  11. package/__tests__/ai-select-database-data-handler.test.ts +14 -3
  12. package/__tests__/api-route-file-name-segments.test.ts +33 -0
  13. package/__tests__/app-secret-env.test.ts +55 -0
  14. package/__tests__/auth-env-secret-preservation.test.ts +22 -3
  15. package/__tests__/auth-nextauth-url.test.ts +134 -50
  16. package/__tests__/cart-add-item-kinds.test.ts +259 -0
  17. package/__tests__/cart-add-item-line-fields.test.ts +328 -0
  18. package/__tests__/cart-availability-add-to-cart.test.ts +108 -0
  19. package/__tests__/cart-get-total-discounts.test.ts +499 -0
  20. package/__tests__/cart-get-total-product-options.test.ts +195 -0
  21. package/__tests__/cart-get-total-subscriptions.test.ts +221 -0
  22. package/__tests__/cart-price-order.test.ts +283 -0
  23. package/__tests__/cart-update-item-quantity-recurring.test.ts +75 -0
  24. package/__tests__/client-loop-current-item.test.ts +164 -0
  25. package/__tests__/cron-route-loop-custom-node.test.ts +123 -0
  26. package/__tests__/cron-route-loop-templateparams.test.ts +7 -0
  27. package/__tests__/cron-route-verification.test.ts +252 -0
  28. package/__tests__/custom-js-runtime-base-url.test.ts +64 -0
  29. package/__tests__/custom-nodes-admin-module.test.ts +310 -0
  30. package/__tests__/data-api-browser-reads.test.ts +341 -0
  31. package/__tests__/data-api-low-stock-autofire.test.ts +67 -17
  32. package/__tests__/data-api-optional-feature-columns.test.ts +240 -0
  33. package/__tests__/data-api-protected-tables.test.ts +948 -0
  34. package/__tests__/data-node-not-awaited.test.ts +7 -3
  35. package/__tests__/data-write-missing-filter.test.ts +119 -0
  36. package/__tests__/ecommerce-rewriter-product-options.test.ts +143 -0
  37. package/__tests__/email-locale-senders.test.ts +1 -1
  38. package/__tests__/file-storage-upload-picked-files.test.ts +20 -0
  39. package/__tests__/input-debounce-per-field.test.ts +141 -0
  40. package/__tests__/internal-request-headers.test.ts +7 -3
  41. package/__tests__/invoice-data-access-replace.test.ts +340 -0
  42. package/__tests__/invoice-delivery-fee.test.ts +3 -2
  43. package/__tests__/invoice-generate-hydration.test.ts +20 -12
  44. package/__tests__/invoice-order-items-settle.test.ts +51 -46
  45. package/__tests__/invoice-product-options.test.ts +177 -0
  46. package/__tests__/invoice-regenerate-route.test.ts +488 -0
  47. package/__tests__/invoice-regional-tax.test.ts +3 -2
  48. package/__tests__/invoice-reservation.test.ts +195 -0
  49. package/__tests__/invoice-route-access.test.ts +275 -0
  50. package/__tests__/invoice-self-call-origin.test.ts +117 -0
  51. package/__tests__/invoice-tender.test.ts +550 -0
  52. package/__tests__/legacy-webhook-self-calls.test.ts +187 -0
  53. package/__tests__/locale-aware-redirects.test.ts +55 -26
  54. package/__tests__/loop-collection-unwrap.test.ts +6 -1
  55. package/__tests__/middleware-subscriber-access.test.ts +269 -0
  56. package/__tests__/payment-charge-user-earlier-attempt.test.ts +267 -0
  57. package/__tests__/payment-charge-user-handler-serialization.test.ts +47 -82
  58. package/__tests__/payment-charge-user-line-descriptions.test.ts +124 -0
  59. package/__tests__/payment-charge-user-report-refusal.test.ts +105 -0
  60. package/__tests__/payment-close-checkout-node.test.ts +127 -0
  61. package/__tests__/payment-driver-close-checkout.test.ts +1163 -0
  62. package/__tests__/payment-driver-coingate.test.ts +470 -0
  63. package/__tests__/payment-driver-inspect-checkout.test.ts +648 -0
  64. package/__tests__/payment-driver-mollie.test.ts +864 -0
  65. package/__tests__/payment-driver-paddle.test.ts +870 -0
  66. package/__tests__/payment-driver-paypal-capture.test.ts +158 -0
  67. package/__tests__/payment-driver-paypal-webhook.test.ts +367 -0
  68. package/__tests__/payment-driver-razorpay.test.ts +895 -0
  69. package/__tests__/payment-driver-square.test.ts +977 -0
  70. package/__tests__/payment-driver-stripe.test.ts +267 -0
  71. package/__tests__/payment-drivers-module.test.ts +429 -0
  72. package/__tests__/payment-legacy-webhook-routes.test.ts +588 -0
  73. package/__tests__/payment-redirect-and-order-notification.test.ts +98 -39
  74. package/__tests__/payment-refund.test.ts +523 -22
  75. package/__tests__/payment-subscription-nodes.test.ts +1360 -0
  76. package/__tests__/payment-webhook-route.test.ts +523 -0
  77. package/__tests__/paypal-webhook-signature-verification.test.ts +205 -0
  78. package/__tests__/prune-context-oversized-leaf.test.ts +1 -0
  79. package/__tests__/prune-context-state-keys.test.ts +89 -0
  80. package/__tests__/push-node-handlers.test.ts +291 -0
  81. package/__tests__/route-changed-trigger.test.ts +40 -0
  82. package/__tests__/runtime-storage-upload-access.test.ts +255 -0
  83. package/__tests__/security-runtime-shadow.test.ts +103 -1
  84. package/__tests__/segment-reply-changed-keys.test.ts +146 -0
  85. package/__tests__/segment-state-keys-emission.test.ts +185 -0
  86. package/__tests__/segment-state-needs.test.ts +102 -0
  87. package/__tests__/server-segment-context-integrity.test.ts +210 -0
  88. package/__tests__/server-step-signing.test.ts +371 -0
  89. package/__tests__/session-cookie-resolver.test.ts +59 -0
  90. package/__tests__/stock-decrement-audit.test.ts +17 -0
  91. package/__tests__/subscriber-access-route.test.ts +406 -0
  92. package/__tests__/webhook-delivery-lease.test.ts +316 -0
  93. package/__tests__/workflow-auth-guard.test.ts +253 -2
  94. package/dist/cjs/admin-form-hydration.d.ts +10 -0
  95. package/dist/cjs/admin-form-hydration.d.ts.map +1 -0
  96. package/dist/cjs/admin-form-hydration.js +25 -0
  97. package/dist/cjs/admin-form-hydration.js.map +1 -0
  98. package/dist/cjs/api-route-generator.d.ts +19 -3
  99. package/dist/cjs/api-route-generator.d.ts.map +1 -1
  100. package/dist/cjs/api-route-generator.js +190 -70
  101. package/dist/cjs/api-route-generator.js.map +1 -1
  102. package/dist/cjs/auth-generator.d.ts +4 -1
  103. package/dist/cjs/auth-generator.d.ts.map +1 -1
  104. package/dist/cjs/auth-generator.js +241 -62
  105. package/dist/cjs/auth-generator.js.map +1 -1
  106. package/dist/cjs/auth-return/signed-in-destination-code.d.ts +17 -0
  107. package/dist/cjs/auth-return/signed-in-destination-code.d.ts.map +1 -0
  108. package/dist/cjs/auth-return/signed-in-destination-code.js +37 -0
  109. package/dist/cjs/auth-return/signed-in-destination-code.js.map +1 -0
  110. package/dist/cjs/cart-pricing-preamble.d.ts +12 -0
  111. package/dist/cjs/cart-pricing-preamble.d.ts.map +1 -0
  112. package/dist/cjs/cart-pricing-preamble.js +23 -0
  113. package/dist/cjs/cart-pricing-preamble.js.map +1 -0
  114. package/dist/cjs/cron-request-verification.d.ts +24 -0
  115. package/dist/cjs/cron-request-verification.d.ts.map +1 -0
  116. package/dist/cjs/cron-request-verification.js +84 -0
  117. package/dist/cjs/cron-request-verification.js.map +1 -0
  118. package/dist/cjs/custom-node-modules.d.ts +30 -0
  119. package/dist/cjs/custom-node-modules.d.ts.map +1 -0
  120. package/dist/cjs/custom-node-modules.js +90 -0
  121. package/dist/cjs/custom-node-modules.js.map +1 -0
  122. package/dist/cjs/data-api-route-generator.d.ts +27 -0
  123. package/dist/cjs/data-api-route-generator.d.ts.map +1 -1
  124. package/dist/cjs/data-api-route-generator.js +366 -29
  125. package/dist/cjs/data-api-route-generator.js.map +1 -1
  126. package/dist/cjs/ecommerce/cart-availability.d.ts.map +1 -1
  127. package/dist/cjs/ecommerce/cart-availability.js +22 -13
  128. package/dist/cjs/ecommerce/cart-availability.js.map +1 -1
  129. package/dist/cjs/ecommerce/stock-decrement.d.ts +2 -1
  130. package/dist/cjs/ecommerce/stock-decrement.d.ts.map +1 -1
  131. package/dist/cjs/ecommerce/stock-decrement.js +6 -0
  132. package/dist/cjs/ecommerce/stock-decrement.js.map +1 -1
  133. package/dist/cjs/executor-generator.d.ts +0 -1
  134. package/dist/cjs/executor-generator.d.ts.map +1 -1
  135. package/dist/cjs/executor-generator.js +213 -20
  136. package/dist/cjs/executor-generator.js.map +1 -1
  137. package/dist/cjs/index.d.ts +12 -4
  138. package/dist/cjs/index.d.ts.map +1 -1
  139. package/dist/cjs/index.js +25 -2
  140. package/dist/cjs/index.js.map +1 -1
  141. package/dist/cjs/invoice/api-routes-code.d.ts +26 -0
  142. package/dist/cjs/invoice/api-routes-code.d.ts.map +1 -1
  143. package/dist/cjs/invoice/api-routes-code.js +423 -391
  144. package/dist/cjs/invoice/api-routes-code.js.map +1 -1
  145. package/dist/cjs/invoice/data-access-code.d.ts.map +1 -1
  146. package/dist/cjs/invoice/data-access-code.js +420 -107
  147. package/dist/cjs/invoice/data-access-code.js.map +1 -1
  148. package/dist/cjs/invoice/index.d.ts.map +1 -1
  149. package/dist/cjs/invoice/index.js +24 -0
  150. package/dist/cjs/invoice/index.js.map +1 -1
  151. package/dist/cjs/invoice/invoice-assembly-code.d.ts +12 -0
  152. package/dist/cjs/invoice/invoice-assembly-code.d.ts.map +1 -0
  153. package/dist/cjs/invoice/invoice-assembly-code.js +517 -0
  154. package/dist/cjs/invoice/invoice-assembly-code.js.map +1 -0
  155. package/dist/cjs/invoice/invoice-html-code.d.ts.map +1 -1
  156. package/dist/cjs/invoice/invoice-html-code.js +111 -9
  157. package/dist/cjs/invoice/invoice-html-code.js.map +1 -1
  158. package/dist/cjs/invoice/pdf-service-client-code.d.ts.map +1 -1
  159. package/dist/cjs/invoice/pdf-service-client-code.js +3 -4
  160. package/dist/cjs/invoice/pdf-service-client-code.js.map +1 -1
  161. package/dist/cjs/nodes/account/account-login.d.ts.map +1 -1
  162. package/dist/cjs/nodes/account/account-login.js +4 -3
  163. package/dist/cjs/nodes/account/account-login.js.map +1 -1
  164. package/dist/cjs/nodes/account/account-signup.d.ts.map +1 -1
  165. package/dist/cjs/nodes/account/account-signup.js +7 -4
  166. package/dist/cjs/nodes/account/account-signup.js.map +1 -1
  167. package/dist/cjs/nodes/ai/ai-select-database-data.d.ts.map +1 -1
  168. package/dist/cjs/nodes/ai/ai-select-database-data.js +6 -1
  169. package/dist/cjs/nodes/ai/ai-select-database-data.js.map +1 -1
  170. package/dist/cjs/nodes/browser/browser-get-push-subscription.d.ts +9 -0
  171. package/dist/cjs/nodes/browser/browser-get-push-subscription.d.ts.map +1 -0
  172. package/dist/cjs/nodes/browser/browser-get-push-subscription.js +25 -0
  173. package/dist/cjs/nodes/browser/browser-get-push-subscription.js.map +1 -0
  174. package/dist/cjs/nodes/browser/browser-show-notification.d.ts +10 -0
  175. package/dist/cjs/nodes/browser/browser-show-notification.d.ts.map +1 -1
  176. package/dist/cjs/nodes/browser/browser-show-notification.js +65 -40
  177. package/dist/cjs/nodes/browser/browser-show-notification.js.map +1 -1
  178. package/dist/cjs/nodes/browser/browser-subscribe-to-push.d.ts +11 -0
  179. package/dist/cjs/nodes/browser/browser-subscribe-to-push.d.ts.map +1 -1
  180. package/dist/cjs/nodes/browser/browser-subscribe-to-push.js +21 -31
  181. package/dist/cjs/nodes/browser/browser-subscribe-to-push.js.map +1 -1
  182. package/dist/cjs/nodes/browser/browser-unsubscribe-from-push.d.ts +8 -0
  183. package/dist/cjs/nodes/browser/browser-unsubscribe-from-push.d.ts.map +1 -0
  184. package/dist/cjs/nodes/browser/browser-unsubscribe-from-push.js +24 -0
  185. package/dist/cjs/nodes/browser/browser-unsubscribe-from-push.js.map +1 -0
  186. package/dist/cjs/nodes/browser/push-api-access.d.ts +12 -0
  187. package/dist/cjs/nodes/browser/push-api-access.d.ts.map +1 -0
  188. package/dist/cjs/nodes/browser/push-api-access.js +19 -0
  189. package/dist/cjs/nodes/browser/push-api-access.js.map +1 -0
  190. package/dist/cjs/nodes/cart/cart-add-item.d.ts.map +1 -1
  191. package/dist/cjs/nodes/cart/cart-add-item.js +174 -10
  192. package/dist/cjs/nodes/cart/cart-add-item.js.map +1 -1
  193. package/dist/cjs/nodes/cart/cart-clear.d.ts.map +1 -1
  194. package/dist/cjs/nodes/cart/cart-clear.js +11 -0
  195. package/dist/cjs/nodes/cart/cart-clear.js.map +1 -1
  196. package/dist/cjs/nodes/cart/cart-get-total.d.ts.map +1 -1
  197. package/dist/cjs/nodes/cart/cart-get-total.js +260 -3
  198. package/dist/cjs/nodes/cart/cart-get-total.js.map +1 -1
  199. package/dist/cjs/nodes/cart/cart-price-order.d.ts +3 -0
  200. package/dist/cjs/nodes/cart/cart-price-order.d.ts.map +1 -0
  201. package/dist/cjs/nodes/cart/cart-price-order.js +281 -0
  202. package/dist/cjs/nodes/cart/cart-price-order.js.map +1 -0
  203. package/dist/cjs/nodes/cart/cart-update-item-quantity.d.ts.map +1 -1
  204. package/dist/cjs/nodes/cart/cart-update-item-quantity.js +7 -0
  205. package/dist/cjs/nodes/cart/cart-update-item-quantity.js.map +1 -1
  206. package/dist/cjs/nodes/data/data-count.d.ts.map +1 -1
  207. package/dist/cjs/nodes/data/data-count.js +6 -1
  208. package/dist/cjs/nodes/data/data-count.js.map +1 -1
  209. package/dist/cjs/nodes/data/data-create-item.d.ts.map +1 -1
  210. package/dist/cjs/nodes/data/data-create-item.js +11 -1
  211. package/dist/cjs/nodes/data/data-create-item.js.map +1 -1
  212. package/dist/cjs/nodes/data/data-delete-item.d.ts.map +1 -1
  213. package/dist/cjs/nodes/data/data-delete-item.js +29 -0
  214. package/dist/cjs/nodes/data/data-delete-item.js.map +1 -1
  215. package/dist/cjs/nodes/data/data-raw-query.d.ts.map +1 -1
  216. package/dist/cjs/nodes/data/data-raw-query.js +6 -1
  217. package/dist/cjs/nodes/data/data-raw-query.js.map +1 -1
  218. package/dist/cjs/nodes/data/data-select.d.ts.map +1 -1
  219. package/dist/cjs/nodes/data/data-select.js +6 -1
  220. package/dist/cjs/nodes/data/data-select.js.map +1 -1
  221. package/dist/cjs/nodes/data/data-update-item.d.ts.map +1 -1
  222. package/dist/cjs/nodes/data/data-update-item.js +29 -0
  223. package/dist/cjs/nodes/data/data-update-item.js.map +1 -1
  224. package/dist/cjs/nodes/ecommerce/ecommerce-generate-invoice.d.ts.map +1 -1
  225. package/dist/cjs/nodes/ecommerce/ecommerce-generate-invoice.js +7 -1
  226. package/dist/cjs/nodes/ecommerce/ecommerce-generate-invoice.js.map +1 -1
  227. package/dist/cjs/nodes/file-storage/file-storage-upload.d.ts.map +1 -1
  228. package/dist/cjs/nodes/file-storage/file-storage-upload.js +7 -0
  229. package/dist/cjs/nodes/file-storage/file-storage-upload.js.map +1 -1
  230. package/dist/cjs/nodes/general/general-custom-js.d.ts.map +1 -1
  231. package/dist/cjs/nodes/general/general-custom-js.js +21 -5
  232. package/dist/cjs/nodes/general/general-custom-js.js.map +1 -1
  233. package/dist/cjs/nodes/index.d.ts.map +1 -1
  234. package/dist/cjs/nodes/index.js +9 -4
  235. package/dist/cjs/nodes/index.js.map +1 -1
  236. package/dist/cjs/nodes/payment/payment-billing-portal.d.ts +3 -0
  237. package/dist/cjs/nodes/payment/payment-billing-portal.d.ts.map +1 -0
  238. package/dist/cjs/nodes/payment/payment-billing-portal.js +52 -0
  239. package/dist/cjs/nodes/payment/payment-billing-portal.js.map +1 -0
  240. package/dist/cjs/nodes/payment/payment-charge-user.d.ts.map +1 -1
  241. package/dist/cjs/nodes/payment/payment-charge-user.js +227 -360
  242. package/dist/cjs/nodes/payment/payment-charge-user.js.map +1 -1
  243. package/dist/cjs/nodes/payment/payment-close-checkout.d.ts +3 -0
  244. package/dist/cjs/nodes/payment/payment-close-checkout.d.ts.map +1 -0
  245. package/dist/cjs/nodes/payment/payment-close-checkout.js +141 -0
  246. package/dist/cjs/nodes/payment/payment-close-checkout.js.map +1 -0
  247. package/dist/cjs/nodes/payment/payment-ensure-subscription-plan.d.ts +3 -0
  248. package/dist/cjs/nodes/payment/payment-ensure-subscription-plan.d.ts.map +1 -0
  249. package/dist/cjs/nodes/payment/payment-ensure-subscription-plan.js +67 -0
  250. package/dist/cjs/nodes/payment/payment-ensure-subscription-plan.js.map +1 -0
  251. package/dist/cjs/nodes/payment/payment-manage-subscription.d.ts +3 -0
  252. package/dist/cjs/nodes/payment/payment-manage-subscription.d.ts.map +1 -0
  253. package/dist/cjs/nodes/payment/payment-manage-subscription.js +89 -0
  254. package/dist/cjs/nodes/payment/payment-manage-subscription.js.map +1 -0
  255. package/dist/cjs/nodes/payment/payment-refund.d.ts.map +1 -1
  256. package/dist/cjs/nodes/payment/payment-refund.js +50 -404
  257. package/dist/cjs/nodes/payment/payment-refund.js.map +1 -1
  258. package/dist/cjs/nodes/push/push-send-notification.d.ts +14 -0
  259. package/dist/cjs/nodes/push/push-send-notification.d.ts.map +1 -0
  260. package/dist/cjs/nodes/push/push-send-notification.js +83 -0
  261. package/dist/cjs/nodes/push/push-send-notification.js.map +1 -0
  262. package/dist/cjs/payments/drivers/coingate-driver-code.d.ts +16 -0
  263. package/dist/cjs/payments/drivers/coingate-driver-code.d.ts.map +1 -0
  264. package/dist/cjs/payments/drivers/coingate-driver-code.js +471 -0
  265. package/dist/cjs/payments/drivers/coingate-driver-code.js.map +1 -0
  266. package/dist/cjs/payments/drivers/mollie-driver-code.d.ts +16 -0
  267. package/dist/cjs/payments/drivers/mollie-driver-code.d.ts.map +1 -0
  268. package/dist/cjs/payments/drivers/mollie-driver-code.js +623 -0
  269. package/dist/cjs/payments/drivers/mollie-driver-code.js.map +1 -0
  270. package/dist/cjs/payments/drivers/paddle-driver-code.d.ts +12 -0
  271. package/dist/cjs/payments/drivers/paddle-driver-code.d.ts.map +1 -0
  272. package/dist/cjs/payments/drivers/paddle-driver-code.js +683 -0
  273. package/dist/cjs/payments/drivers/paddle-driver-code.js.map +1 -0
  274. package/dist/cjs/payments/drivers/paypal-driver-code.d.ts +12 -0
  275. package/dist/cjs/payments/drivers/paypal-driver-code.d.ts.map +1 -0
  276. package/dist/cjs/payments/drivers/paypal-driver-code.js +1261 -0
  277. package/dist/cjs/payments/drivers/paypal-driver-code.js.map +1 -0
  278. package/dist/cjs/payments/drivers/razorpay-driver-code.d.ts +12 -0
  279. package/dist/cjs/payments/drivers/razorpay-driver-code.d.ts.map +1 -0
  280. package/dist/cjs/payments/drivers/razorpay-driver-code.js +732 -0
  281. package/dist/cjs/payments/drivers/razorpay-driver-code.js.map +1 -0
  282. package/dist/cjs/payments/drivers/square-driver-code.d.ts +14 -0
  283. package/dist/cjs/payments/drivers/square-driver-code.d.ts.map +1 -0
  284. package/dist/cjs/payments/drivers/square-driver-code.js +931 -0
  285. package/dist/cjs/payments/drivers/square-driver-code.js.map +1 -0
  286. package/dist/cjs/payments/drivers/stripe-driver-code.d.ts +12 -0
  287. package/dist/cjs/payments/drivers/stripe-driver-code.d.ts.map +1 -0
  288. package/dist/cjs/payments/drivers/stripe-driver-code.js +778 -0
  289. package/dist/cjs/payments/drivers/stripe-driver-code.js.map +1 -0
  290. package/dist/cjs/payments/index.d.ts +66 -0
  291. package/dist/cjs/payments/index.d.ts.map +1 -0
  292. package/dist/cjs/payments/index.js +175 -0
  293. package/dist/cjs/payments/index.js.map +1 -0
  294. package/dist/cjs/payments/payment-core-code.d.ts +19 -0
  295. package/dist/cjs/payments/payment-core-code.d.ts.map +1 -0
  296. package/dist/cjs/payments/payment-core-code.js +422 -0
  297. package/dist/cjs/payments/payment-core-code.js.map +1 -0
  298. package/dist/cjs/payments/payment-driver-code-map.d.ts +4 -0
  299. package/dist/cjs/payments/payment-driver-code-map.d.ts.map +1 -0
  300. package/dist/cjs/payments/payment-driver-code-map.js +21 -0
  301. package/dist/cjs/payments/payment-driver-code-map.js.map +1 -0
  302. package/dist/cjs/payments/payment-drivers-scope.d.ts +35 -0
  303. package/dist/cjs/payments/payment-drivers-scope.d.ts.map +1 -0
  304. package/dist/cjs/payments/payment-drivers-scope.js +56 -0
  305. package/dist/cjs/payments/payment-drivers-scope.js.map +1 -0
  306. package/dist/cjs/payments/payment-registry-code.d.ts +8 -0
  307. package/dist/cjs/payments/payment-registry-code.d.ts.map +1 -0
  308. package/dist/cjs/payments/payment-registry-code.js +41 -0
  309. package/dist/cjs/payments/payment-registry-code.js.map +1 -0
  310. package/dist/cjs/pg-client-code.d.ts +10 -0
  311. package/dist/cjs/pg-client-code.d.ts.map +1 -1
  312. package/dist/cjs/pg-client-code.js +27 -1
  313. package/dist/cjs/pg-client-code.js.map +1 -1
  314. package/dist/cjs/runtime-storage-generator.d.ts +28 -0
  315. package/dist/cjs/runtime-storage-generator.d.ts.map +1 -1
  316. package/dist/cjs/runtime-storage-generator.js +240 -5
  317. package/dist/cjs/runtime-storage-generator.js.map +1 -1
  318. package/dist/cjs/secret-collector.d.ts.map +1 -1
  319. package/dist/cjs/secret-collector.js +8 -3
  320. package/dist/cjs/secret-collector.js.map +1 -1
  321. package/dist/cjs/security-scanner.d.ts +10 -1
  322. package/dist/cjs/security-scanner.d.ts.map +1 -1
  323. package/dist/cjs/security-scanner.js +19 -1
  324. package/dist/cjs/security-scanner.js.map +1 -1
  325. package/dist/cjs/segment-context-needs.d.ts +38 -0
  326. package/dist/cjs/segment-context-needs.d.ts.map +1 -0
  327. package/dist/cjs/segment-context-needs.js +129 -0
  328. package/dist/cjs/segment-context-needs.js.map +1 -0
  329. package/dist/cjs/segment-splitter.d.ts.map +1 -1
  330. package/dist/cjs/segment-splitter.js +6 -1
  331. package/dist/cjs/segment-splitter.js.map +1 -1
  332. package/dist/cjs/segment-trust.d.ts +50 -0
  333. package/dist/cjs/segment-trust.d.ts.map +1 -0
  334. package/dist/cjs/segment-trust.js +115 -0
  335. package/dist/cjs/segment-trust.js.map +1 -0
  336. package/dist/cjs/sent-email-log/sent-email-log-code.d.ts +19 -0
  337. package/dist/cjs/sent-email-log/sent-email-log-code.d.ts.map +1 -1
  338. package/dist/cjs/sent-email-log/sent-email-log-code.js +1 -24
  339. package/dist/cjs/sent-email-log/sent-email-log-code.js.map +1 -1
  340. package/dist/cjs/server-runtime-code.d.ts +34 -0
  341. package/dist/cjs/server-runtime-code.d.ts.map +1 -0
  342. package/dist/cjs/server-runtime-code.js +303 -0
  343. package/dist/cjs/server-runtime-code.js.map +1 -0
  344. package/dist/cjs/session-cookie-resolver.d.ts +3 -78
  345. package/dist/cjs/session-cookie-resolver.d.ts.map +1 -1
  346. package/dist/cjs/session-cookie-resolver.js +7 -276
  347. package/dist/cjs/session-cookie-resolver.js.map +1 -1
  348. package/dist/cjs/subscriber-access-route-generator.d.ts +71 -0
  349. package/dist/cjs/subscriber-access-route-generator.d.ts.map +1 -0
  350. package/dist/cjs/subscriber-access-route-generator.js +301 -0
  351. package/dist/cjs/subscriber-access-route-generator.js.map +1 -0
  352. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  353. package/dist/cjs/types.d.ts +6 -0
  354. package/dist/cjs/types.d.ts.map +1 -1
  355. package/dist/cjs/webhook-delivery-lease/index.d.ts +8 -0
  356. package/dist/cjs/webhook-delivery-lease/index.d.ts.map +1 -0
  357. package/dist/cjs/webhook-delivery-lease/index.js +41 -0
  358. package/dist/cjs/webhook-delivery-lease/index.js.map +1 -0
  359. package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-code.d.ts +26 -0
  360. package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-code.d.ts.map +1 -0
  361. package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-code.js +151 -0
  362. package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-code.js.map +1 -0
  363. package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-scope.d.ts +16 -0
  364. package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-scope.d.ts.map +1 -0
  365. package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-scope.js +19 -0
  366. package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-scope.js.map +1 -0
  367. package/dist/cjs/webhook-generator.d.ts +1 -1
  368. package/dist/cjs/webhook-generator.d.ts.map +1 -1
  369. package/dist/cjs/webhook-generator.js +342 -254
  370. package/dist/cjs/webhook-generator.js.map +1 -1
  371. package/dist/cjs/webhook-signature-verification.d.ts +17 -1
  372. package/dist/cjs/webhook-signature-verification.d.ts.map +1 -1
  373. package/dist/cjs/webhook-signature-verification.js +182 -27
  374. package/dist/cjs/webhook-signature-verification.js.map +1 -1
  375. package/dist/cjs/workflow-auth-generator.d.ts +9 -6
  376. package/dist/cjs/workflow-auth-generator.d.ts.map +1 -1
  377. package/dist/cjs/workflow-auth-generator.js +133 -29
  378. package/dist/cjs/workflow-auth-generator.js.map +1 -1
  379. package/dist/cjs/workflow-component-plugin.d.ts.map +1 -1
  380. package/dist/cjs/workflow-component-plugin.js +65 -28
  381. package/dist/cjs/workflow-component-plugin.js.map +1 -1
  382. package/dist/cjs/workflow-project-plugin.d.ts +13 -0
  383. package/dist/cjs/workflow-project-plugin.d.ts.map +1 -1
  384. package/dist/cjs/workflow-project-plugin.js +215 -65
  385. package/dist/cjs/workflow-project-plugin.js.map +1 -1
  386. package/dist/esm/admin-form-hydration.d.ts +10 -0
  387. package/dist/esm/admin-form-hydration.d.ts.map +1 -0
  388. package/dist/esm/admin-form-hydration.js +21 -0
  389. package/dist/esm/admin-form-hydration.js.map +1 -0
  390. package/dist/esm/api-route-generator.d.ts +19 -3
  391. package/dist/esm/api-route-generator.d.ts.map +1 -1
  392. package/dist/esm/api-route-generator.js +189 -70
  393. package/dist/esm/api-route-generator.js.map +1 -1
  394. package/dist/esm/auth-generator.d.ts +4 -1
  395. package/dist/esm/auth-generator.d.ts.map +1 -1
  396. package/dist/esm/auth-generator.js +241 -62
  397. package/dist/esm/auth-generator.js.map +1 -1
  398. package/dist/esm/auth-return/signed-in-destination-code.d.ts +17 -0
  399. package/dist/esm/auth-return/signed-in-destination-code.d.ts.map +1 -0
  400. package/dist/esm/auth-return/signed-in-destination-code.js +33 -0
  401. package/dist/esm/auth-return/signed-in-destination-code.js.map +1 -0
  402. package/dist/esm/cart-pricing-preamble.d.ts +12 -0
  403. package/dist/esm/cart-pricing-preamble.d.ts.map +1 -0
  404. package/dist/esm/cart-pricing-preamble.js +19 -0
  405. package/dist/esm/cart-pricing-preamble.js.map +1 -0
  406. package/dist/esm/cron-request-verification.d.ts +24 -0
  407. package/dist/esm/cron-request-verification.d.ts.map +1 -0
  408. package/dist/esm/cron-request-verification.js +80 -0
  409. package/dist/esm/cron-request-verification.js.map +1 -0
  410. package/dist/esm/custom-node-modules.d.ts +30 -0
  411. package/dist/esm/custom-node-modules.d.ts.map +1 -0
  412. package/dist/esm/custom-node-modules.js +84 -0
  413. package/dist/esm/custom-node-modules.js.map +1 -0
  414. package/dist/esm/data-api-route-generator.d.ts +27 -0
  415. package/dist/esm/data-api-route-generator.d.ts.map +1 -1
  416. package/dist/esm/data-api-route-generator.js +365 -28
  417. package/dist/esm/data-api-route-generator.js.map +1 -1
  418. package/dist/esm/ecommerce/cart-availability.d.ts.map +1 -1
  419. package/dist/esm/ecommerce/cart-availability.js +22 -13
  420. package/dist/esm/ecommerce/cart-availability.js.map +1 -1
  421. package/dist/esm/ecommerce/stock-decrement.d.ts +2 -1
  422. package/dist/esm/ecommerce/stock-decrement.d.ts.map +1 -1
  423. package/dist/esm/ecommerce/stock-decrement.js +6 -0
  424. package/dist/esm/ecommerce/stock-decrement.js.map +1 -1
  425. package/dist/esm/executor-generator.d.ts +0 -1
  426. package/dist/esm/executor-generator.d.ts.map +1 -1
  427. package/dist/esm/executor-generator.js +212 -18
  428. package/dist/esm/executor-generator.js.map +1 -1
  429. package/dist/esm/index.d.ts +12 -4
  430. package/dist/esm/index.d.ts.map +1 -1
  431. package/dist/esm/index.js +10 -4
  432. package/dist/esm/index.js.map +1 -1
  433. package/dist/esm/invoice/api-routes-code.d.ts +26 -0
  434. package/dist/esm/invoice/api-routes-code.d.ts.map +1 -1
  435. package/dist/esm/invoice/api-routes-code.js +421 -390
  436. package/dist/esm/invoice/api-routes-code.js.map +1 -1
  437. package/dist/esm/invoice/data-access-code.d.ts.map +1 -1
  438. package/dist/esm/invoice/data-access-code.js +420 -107
  439. package/dist/esm/invoice/data-access-code.js.map +1 -1
  440. package/dist/esm/invoice/index.d.ts.map +1 -1
  441. package/dist/esm/invoice/index.js +25 -1
  442. package/dist/esm/invoice/index.js.map +1 -1
  443. package/dist/esm/invoice/invoice-assembly-code.d.ts +12 -0
  444. package/dist/esm/invoice/invoice-assembly-code.d.ts.map +1 -0
  445. package/dist/esm/invoice/invoice-assembly-code.js +513 -0
  446. package/dist/esm/invoice/invoice-assembly-code.js.map +1 -0
  447. package/dist/esm/invoice/invoice-html-code.d.ts.map +1 -1
  448. package/dist/esm/invoice/invoice-html-code.js +111 -9
  449. package/dist/esm/invoice/invoice-html-code.js.map +1 -1
  450. package/dist/esm/invoice/pdf-service-client-code.d.ts.map +1 -1
  451. package/dist/esm/invoice/pdf-service-client-code.js +3 -4
  452. package/dist/esm/invoice/pdf-service-client-code.js.map +1 -1
  453. package/dist/esm/nodes/account/account-login.d.ts.map +1 -1
  454. package/dist/esm/nodes/account/account-login.js +4 -3
  455. package/dist/esm/nodes/account/account-login.js.map +1 -1
  456. package/dist/esm/nodes/account/account-signup.d.ts.map +1 -1
  457. package/dist/esm/nodes/account/account-signup.js +7 -4
  458. package/dist/esm/nodes/account/account-signup.js.map +1 -1
  459. package/dist/esm/nodes/ai/ai-select-database-data.d.ts.map +1 -1
  460. package/dist/esm/nodes/ai/ai-select-database-data.js +6 -1
  461. package/dist/esm/nodes/ai/ai-select-database-data.js.map +1 -1
  462. package/dist/esm/nodes/browser/browser-get-push-subscription.d.ts +9 -0
  463. package/dist/esm/nodes/browser/browser-get-push-subscription.d.ts.map +1 -0
  464. package/dist/esm/nodes/browser/browser-get-push-subscription.js +22 -0
  465. package/dist/esm/nodes/browser/browser-get-push-subscription.js.map +1 -0
  466. package/dist/esm/nodes/browser/browser-show-notification.d.ts +10 -0
  467. package/dist/esm/nodes/browser/browser-show-notification.d.ts.map +1 -1
  468. package/dist/esm/nodes/browser/browser-show-notification.js +65 -40
  469. package/dist/esm/nodes/browser/browser-show-notification.js.map +1 -1
  470. package/dist/esm/nodes/browser/browser-subscribe-to-push.d.ts +11 -0
  471. package/dist/esm/nodes/browser/browser-subscribe-to-push.d.ts.map +1 -1
  472. package/dist/esm/nodes/browser/browser-subscribe-to-push.js +21 -31
  473. package/dist/esm/nodes/browser/browser-subscribe-to-push.js.map +1 -1
  474. package/dist/esm/nodes/browser/browser-unsubscribe-from-push.d.ts +8 -0
  475. package/dist/esm/nodes/browser/browser-unsubscribe-from-push.d.ts.map +1 -0
  476. package/dist/esm/nodes/browser/browser-unsubscribe-from-push.js +21 -0
  477. package/dist/esm/nodes/browser/browser-unsubscribe-from-push.js.map +1 -0
  478. package/dist/esm/nodes/browser/push-api-access.d.ts +12 -0
  479. package/dist/esm/nodes/browser/push-api-access.d.ts.map +1 -0
  480. package/dist/esm/nodes/browser/push-api-access.js +13 -0
  481. package/dist/esm/nodes/browser/push-api-access.js.map +1 -0
  482. package/dist/esm/nodes/cart/cart-add-item.d.ts.map +1 -1
  483. package/dist/esm/nodes/cart/cart-add-item.js +174 -10
  484. package/dist/esm/nodes/cart/cart-add-item.js.map +1 -1
  485. package/dist/esm/nodes/cart/cart-clear.d.ts.map +1 -1
  486. package/dist/esm/nodes/cart/cart-clear.js +11 -0
  487. package/dist/esm/nodes/cart/cart-clear.js.map +1 -1
  488. package/dist/esm/nodes/cart/cart-get-total.d.ts.map +1 -1
  489. package/dist/esm/nodes/cart/cart-get-total.js +261 -4
  490. package/dist/esm/nodes/cart/cart-get-total.js.map +1 -1
  491. package/dist/esm/nodes/cart/cart-price-order.d.ts +3 -0
  492. package/dist/esm/nodes/cart/cart-price-order.d.ts.map +1 -0
  493. package/dist/esm/nodes/cart/cart-price-order.js +278 -0
  494. package/dist/esm/nodes/cart/cart-price-order.js.map +1 -0
  495. package/dist/esm/nodes/cart/cart-update-item-quantity.d.ts.map +1 -1
  496. package/dist/esm/nodes/cart/cart-update-item-quantity.js +7 -0
  497. package/dist/esm/nodes/cart/cart-update-item-quantity.js.map +1 -1
  498. package/dist/esm/nodes/data/data-count.d.ts.map +1 -1
  499. package/dist/esm/nodes/data/data-count.js +6 -1
  500. package/dist/esm/nodes/data/data-count.js.map +1 -1
  501. package/dist/esm/nodes/data/data-create-item.d.ts.map +1 -1
  502. package/dist/esm/nodes/data/data-create-item.js +11 -1
  503. package/dist/esm/nodes/data/data-create-item.js.map +1 -1
  504. package/dist/esm/nodes/data/data-delete-item.d.ts.map +1 -1
  505. package/dist/esm/nodes/data/data-delete-item.js +29 -0
  506. package/dist/esm/nodes/data/data-delete-item.js.map +1 -1
  507. package/dist/esm/nodes/data/data-raw-query.d.ts.map +1 -1
  508. package/dist/esm/nodes/data/data-raw-query.js +6 -1
  509. package/dist/esm/nodes/data/data-raw-query.js.map +1 -1
  510. package/dist/esm/nodes/data/data-select.d.ts.map +1 -1
  511. package/dist/esm/nodes/data/data-select.js +6 -1
  512. package/dist/esm/nodes/data/data-select.js.map +1 -1
  513. package/dist/esm/nodes/data/data-update-item.d.ts.map +1 -1
  514. package/dist/esm/nodes/data/data-update-item.js +29 -0
  515. package/dist/esm/nodes/data/data-update-item.js.map +1 -1
  516. package/dist/esm/nodes/ecommerce/ecommerce-generate-invoice.d.ts.map +1 -1
  517. package/dist/esm/nodes/ecommerce/ecommerce-generate-invoice.js +7 -1
  518. package/dist/esm/nodes/ecommerce/ecommerce-generate-invoice.js.map +1 -1
  519. package/dist/esm/nodes/file-storage/file-storage-upload.d.ts.map +1 -1
  520. package/dist/esm/nodes/file-storage/file-storage-upload.js +7 -0
  521. package/dist/esm/nodes/file-storage/file-storage-upload.js.map +1 -1
  522. package/dist/esm/nodes/general/general-custom-js.d.ts.map +1 -1
  523. package/dist/esm/nodes/general/general-custom-js.js +21 -5
  524. package/dist/esm/nodes/general/general-custom-js.js.map +1 -1
  525. package/dist/esm/nodes/index.d.ts.map +1 -1
  526. package/dist/esm/nodes/index.js +9 -4
  527. package/dist/esm/nodes/index.js.map +1 -1
  528. package/dist/esm/nodes/payment/payment-billing-portal.d.ts +3 -0
  529. package/dist/esm/nodes/payment/payment-billing-portal.d.ts.map +1 -0
  530. package/dist/esm/nodes/payment/payment-billing-portal.js +49 -0
  531. package/dist/esm/nodes/payment/payment-billing-portal.js.map +1 -0
  532. package/dist/esm/nodes/payment/payment-charge-user.d.ts.map +1 -1
  533. package/dist/esm/nodes/payment/payment-charge-user.js +227 -360
  534. package/dist/esm/nodes/payment/payment-charge-user.js.map +1 -1
  535. package/dist/esm/nodes/payment/payment-close-checkout.d.ts +3 -0
  536. package/dist/esm/nodes/payment/payment-close-checkout.d.ts.map +1 -0
  537. package/dist/esm/nodes/payment/payment-close-checkout.js +138 -0
  538. package/dist/esm/nodes/payment/payment-close-checkout.js.map +1 -0
  539. package/dist/esm/nodes/payment/payment-ensure-subscription-plan.d.ts +3 -0
  540. package/dist/esm/nodes/payment/payment-ensure-subscription-plan.d.ts.map +1 -0
  541. package/dist/esm/nodes/payment/payment-ensure-subscription-plan.js +64 -0
  542. package/dist/esm/nodes/payment/payment-ensure-subscription-plan.js.map +1 -0
  543. package/dist/esm/nodes/payment/payment-manage-subscription.d.ts +3 -0
  544. package/dist/esm/nodes/payment/payment-manage-subscription.d.ts.map +1 -0
  545. package/dist/esm/nodes/payment/payment-manage-subscription.js +86 -0
  546. package/dist/esm/nodes/payment/payment-manage-subscription.js.map +1 -0
  547. package/dist/esm/nodes/payment/payment-refund.d.ts.map +1 -1
  548. package/dist/esm/nodes/payment/payment-refund.js +50 -404
  549. package/dist/esm/nodes/payment/payment-refund.js.map +1 -1
  550. package/dist/esm/nodes/push/push-send-notification.d.ts +14 -0
  551. package/dist/esm/nodes/push/push-send-notification.d.ts.map +1 -0
  552. package/dist/esm/nodes/push/push-send-notification.js +80 -0
  553. package/dist/esm/nodes/push/push-send-notification.js.map +1 -0
  554. package/dist/esm/payments/drivers/coingate-driver-code.d.ts +16 -0
  555. package/dist/esm/payments/drivers/coingate-driver-code.d.ts.map +1 -0
  556. package/dist/esm/payments/drivers/coingate-driver-code.js +467 -0
  557. package/dist/esm/payments/drivers/coingate-driver-code.js.map +1 -0
  558. package/dist/esm/payments/drivers/mollie-driver-code.d.ts +16 -0
  559. package/dist/esm/payments/drivers/mollie-driver-code.d.ts.map +1 -0
  560. package/dist/esm/payments/drivers/mollie-driver-code.js +619 -0
  561. package/dist/esm/payments/drivers/mollie-driver-code.js.map +1 -0
  562. package/dist/esm/payments/drivers/paddle-driver-code.d.ts +12 -0
  563. package/dist/esm/payments/drivers/paddle-driver-code.d.ts.map +1 -0
  564. package/dist/esm/payments/drivers/paddle-driver-code.js +679 -0
  565. package/dist/esm/payments/drivers/paddle-driver-code.js.map +1 -0
  566. package/dist/esm/payments/drivers/paypal-driver-code.d.ts +12 -0
  567. package/dist/esm/payments/drivers/paypal-driver-code.d.ts.map +1 -0
  568. package/dist/esm/payments/drivers/paypal-driver-code.js +1257 -0
  569. package/dist/esm/payments/drivers/paypal-driver-code.js.map +1 -0
  570. package/dist/esm/payments/drivers/razorpay-driver-code.d.ts +12 -0
  571. package/dist/esm/payments/drivers/razorpay-driver-code.d.ts.map +1 -0
  572. package/dist/esm/payments/drivers/razorpay-driver-code.js +728 -0
  573. package/dist/esm/payments/drivers/razorpay-driver-code.js.map +1 -0
  574. package/dist/esm/payments/drivers/square-driver-code.d.ts +14 -0
  575. package/dist/esm/payments/drivers/square-driver-code.d.ts.map +1 -0
  576. package/dist/esm/payments/drivers/square-driver-code.js +927 -0
  577. package/dist/esm/payments/drivers/square-driver-code.js.map +1 -0
  578. package/dist/esm/payments/drivers/stripe-driver-code.d.ts +12 -0
  579. package/dist/esm/payments/drivers/stripe-driver-code.d.ts.map +1 -0
  580. package/dist/esm/payments/drivers/stripe-driver-code.js +774 -0
  581. package/dist/esm/payments/drivers/stripe-driver-code.js.map +1 -0
  582. package/dist/esm/payments/index.d.ts +66 -0
  583. package/dist/esm/payments/index.d.ts.map +1 -0
  584. package/dist/esm/payments/index.js +164 -0
  585. package/dist/esm/payments/index.js.map +1 -0
  586. package/dist/esm/payments/payment-core-code.d.ts +19 -0
  587. package/dist/esm/payments/payment-core-code.d.ts.map +1 -0
  588. package/dist/esm/payments/payment-core-code.js +418 -0
  589. package/dist/esm/payments/payment-core-code.js.map +1 -0
  590. package/dist/esm/payments/payment-driver-code-map.d.ts +4 -0
  591. package/dist/esm/payments/payment-driver-code-map.d.ts.map +1 -0
  592. package/dist/esm/payments/payment-driver-code-map.js +18 -0
  593. package/dist/esm/payments/payment-driver-code-map.js.map +1 -0
  594. package/dist/esm/payments/payment-drivers-scope.d.ts +35 -0
  595. package/dist/esm/payments/payment-drivers-scope.d.ts.map +1 -0
  596. package/dist/esm/payments/payment-drivers-scope.js +51 -0
  597. package/dist/esm/payments/payment-drivers-scope.js.map +1 -0
  598. package/dist/esm/payments/payment-registry-code.d.ts +8 -0
  599. package/dist/esm/payments/payment-registry-code.d.ts.map +1 -0
  600. package/dist/esm/payments/payment-registry-code.js +37 -0
  601. package/dist/esm/payments/payment-registry-code.js.map +1 -0
  602. package/dist/esm/pg-client-code.d.ts +10 -0
  603. package/dist/esm/pg-client-code.d.ts.map +1 -1
  604. package/dist/esm/pg-client-code.js +25 -0
  605. package/dist/esm/pg-client-code.js.map +1 -1
  606. package/dist/esm/runtime-storage-generator.d.ts +28 -0
  607. package/dist/esm/runtime-storage-generator.d.ts.map +1 -1
  608. package/dist/esm/runtime-storage-generator.js +239 -4
  609. package/dist/esm/runtime-storage-generator.js.map +1 -1
  610. package/dist/esm/secret-collector.d.ts.map +1 -1
  611. package/dist/esm/secret-collector.js +8 -3
  612. package/dist/esm/secret-collector.js.map +1 -1
  613. package/dist/esm/security-scanner.d.ts +10 -1
  614. package/dist/esm/security-scanner.d.ts.map +1 -1
  615. package/dist/esm/security-scanner.js +18 -0
  616. package/dist/esm/security-scanner.js.map +1 -1
  617. package/dist/esm/segment-context-needs.d.ts +38 -0
  618. package/dist/esm/segment-context-needs.d.ts.map +1 -0
  619. package/dist/esm/segment-context-needs.js +125 -0
  620. package/dist/esm/segment-context-needs.js.map +1 -0
  621. package/dist/esm/segment-splitter.d.ts.map +1 -1
  622. package/dist/esm/segment-splitter.js +6 -1
  623. package/dist/esm/segment-splitter.js.map +1 -1
  624. package/dist/esm/segment-trust.d.ts +50 -0
  625. package/dist/esm/segment-trust.d.ts.map +1 -0
  626. package/dist/esm/segment-trust.js +111 -0
  627. package/dist/esm/segment-trust.js.map +1 -0
  628. package/dist/esm/sent-email-log/sent-email-log-code.d.ts +19 -0
  629. package/dist/esm/sent-email-log/sent-email-log-code.d.ts.map +1 -1
  630. package/dist/esm/sent-email-log/sent-email-log-code.js +2 -25
  631. package/dist/esm/sent-email-log/sent-email-log-code.js.map +1 -1
  632. package/dist/esm/server-runtime-code.d.ts +34 -0
  633. package/dist/esm/server-runtime-code.d.ts.map +1 -0
  634. package/dist/esm/server-runtime-code.js +299 -0
  635. package/dist/esm/server-runtime-code.js.map +1 -0
  636. package/dist/esm/session-cookie-resolver.d.ts +3 -78
  637. package/dist/esm/session-cookie-resolver.d.ts.map +1 -1
  638. package/dist/esm/session-cookie-resolver.js +7 -274
  639. package/dist/esm/session-cookie-resolver.js.map +1 -1
  640. package/dist/esm/subscriber-access-route-generator.d.ts +71 -0
  641. package/dist/esm/subscriber-access-route-generator.d.ts.map +1 -0
  642. package/dist/esm/subscriber-access-route-generator.js +292 -0
  643. package/dist/esm/subscriber-access-route-generator.js.map +1 -0
  644. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  645. package/dist/esm/types.d.ts +6 -0
  646. package/dist/esm/types.d.ts.map +1 -1
  647. package/dist/esm/webhook-delivery-lease/index.d.ts +8 -0
  648. package/dist/esm/webhook-delivery-lease/index.d.ts.map +1 -0
  649. package/dist/esm/webhook-delivery-lease/index.js +37 -0
  650. package/dist/esm/webhook-delivery-lease/index.js.map +1 -0
  651. package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-code.d.ts +26 -0
  652. package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-code.d.ts.map +1 -0
  653. package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-code.js +147 -0
  654. package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-code.js.map +1 -0
  655. package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-scope.d.ts +16 -0
  656. package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-scope.d.ts.map +1 -0
  657. package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-scope.js +16 -0
  658. package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-scope.js.map +1 -0
  659. package/dist/esm/webhook-generator.d.ts +1 -1
  660. package/dist/esm/webhook-generator.d.ts.map +1 -1
  661. package/dist/esm/webhook-generator.js +342 -254
  662. package/dist/esm/webhook-generator.js.map +1 -1
  663. package/dist/esm/webhook-signature-verification.d.ts +17 -1
  664. package/dist/esm/webhook-signature-verification.d.ts.map +1 -1
  665. package/dist/esm/webhook-signature-verification.js +179 -25
  666. package/dist/esm/webhook-signature-verification.js.map +1 -1
  667. package/dist/esm/workflow-auth-generator.d.ts +9 -6
  668. package/dist/esm/workflow-auth-generator.d.ts.map +1 -1
  669. package/dist/esm/workflow-auth-generator.js +132 -28
  670. package/dist/esm/workflow-auth-generator.js.map +1 -1
  671. package/dist/esm/workflow-component-plugin.d.ts.map +1 -1
  672. package/dist/esm/workflow-component-plugin.js +65 -28
  673. package/dist/esm/workflow-component-plugin.js.map +1 -1
  674. package/dist/esm/workflow-project-plugin.d.ts +13 -0
  675. package/dist/esm/workflow-project-plugin.d.ts.map +1 -1
  676. package/dist/esm/workflow-project-plugin.js +212 -63
  677. package/dist/esm/workflow-project-plugin.js.map +1 -1
  678. package/package.json +4 -4
  679. package/src/admin-form-hydration.ts +28 -0
  680. package/src/api-route-generator.ts +251 -64
  681. package/src/auth-generator.ts +273 -53
  682. package/src/auth-return/signed-in-destination-code.ts +32 -0
  683. package/src/cart-pricing-preamble.ts +22 -0
  684. package/src/cron-request-verification.ts +79 -0
  685. package/src/custom-node-modules.ts +102 -0
  686. package/src/data-api-route-generator.ts +370 -28
  687. package/src/ecommerce/cart-availability.ts +22 -13
  688. package/src/ecommerce/stock-decrement.ts +13 -1
  689. package/src/executor-generator.ts +212 -19
  690. package/src/index.ts +28 -7
  691. package/src/invoice/api-routes-code.ts +424 -391
  692. package/src/invoice/data-access-code.ts +431 -110
  693. package/src/invoice/index.ts +31 -1
  694. package/src/invoice/invoice-assembly-code.ts +514 -0
  695. package/src/invoice/invoice-html-code.ts +111 -9
  696. package/src/invoice/pdf-service-client-code.ts +3 -4
  697. package/src/nodes/account/account-login.ts +4 -3
  698. package/src/nodes/account/account-signup.ts +7 -4
  699. package/src/nodes/ai/ai-select-database-data.ts +10 -1
  700. package/src/nodes/browser/browser-get-push-subscription.ts +23 -0
  701. package/src/nodes/browser/browser-show-notification.ts +61 -38
  702. package/src/nodes/browser/browser-subscribe-to-push.ts +26 -36
  703. package/src/nodes/browser/browser-unsubscribe-from-push.ts +22 -0
  704. package/src/nodes/browser/push-api-access.ts +20 -0
  705. package/src/nodes/cart/cart-add-item.ts +200 -9
  706. package/src/nodes/cart/cart-clear.ts +11 -0
  707. package/src/nodes/cart/cart-get-total.ts +279 -7
  708. package/src/nodes/cart/cart-price-order.ts +351 -0
  709. package/src/nodes/cart/cart-update-item-quantity.ts +7 -0
  710. package/src/nodes/data/data-count.ts +9 -1
  711. package/src/nodes/data/data-create-item.ts +15 -1
  712. package/src/nodes/data/data-delete-item.ts +32 -0
  713. package/src/nodes/data/data-raw-query.ts +9 -1
  714. package/src/nodes/data/data-select.ts +9 -1
  715. package/src/nodes/data/data-update-item.ts +32 -0
  716. package/src/nodes/ecommerce/ecommerce-generate-invoice.ts +11 -1
  717. package/src/nodes/file-storage/file-storage-upload.ts +8 -0
  718. package/src/nodes/general/general-custom-js.ts +21 -5
  719. package/src/nodes/index.ts +16 -6
  720. package/src/nodes/payment/payment-billing-portal.ts +51 -0
  721. package/src/nodes/payment/payment-charge-user.ts +236 -442
  722. package/src/nodes/payment/payment-close-checkout.ts +137 -0
  723. package/src/nodes/payment/payment-ensure-subscription-plan.ts +66 -0
  724. package/src/nodes/payment/payment-manage-subscription.ts +89 -0
  725. package/src/nodes/payment/payment-refund.ts +52 -467
  726. package/src/nodes/payment-drivers-global.d.ts +13 -0
  727. package/src/nodes/push/push-send-notification.ts +83 -0
  728. package/src/nodes/workflow-utils-global.d.ts +5 -0
  729. package/src/payments/drivers/coingate-driver-code.ts +466 -0
  730. package/src/payments/drivers/mollie-driver-code.ts +618 -0
  731. package/src/payments/drivers/paddle-driver-code.ts +678 -0
  732. package/src/payments/drivers/paypal-driver-code.ts +1256 -0
  733. package/src/payments/drivers/razorpay-driver-code.ts +727 -0
  734. package/src/payments/drivers/square-driver-code.ts +926 -0
  735. package/src/payments/drivers/stripe-driver-code.ts +773 -0
  736. package/src/payments/index.ts +204 -0
  737. package/src/payments/payment-core-code.ts +421 -0
  738. package/src/payments/payment-driver-code-map.ts +19 -0
  739. package/src/payments/payment-drivers-scope.ts +66 -0
  740. package/src/payments/payment-registry-code.ts +38 -0
  741. package/src/pg-client-code.ts +30 -0
  742. package/src/runtime-storage-generator.ts +241 -4
  743. package/src/secret-collector.ts +8 -3
  744. package/src/security-scanner.ts +22 -0
  745. package/src/segment-context-needs.ts +148 -0
  746. package/src/segment-splitter.ts +6 -1
  747. package/src/segment-trust.ts +170 -0
  748. package/src/sent-email-log/sent-email-log-code.ts +2 -32
  749. package/src/server-runtime-code.ts +298 -0
  750. package/src/session-cookie-resolver.ts +9 -277
  751. package/src/subscriber-access-route-generator.ts +351 -0
  752. package/src/types.ts +6 -0
  753. package/src/webhook-delivery-lease/index.ts +44 -0
  754. package/src/webhook-delivery-lease/webhook-delivery-lease-code.ts +151 -0
  755. package/src/webhook-delivery-lease/webhook-delivery-lease-scope.ts +18 -0
  756. package/src/webhook-generator.ts +359 -260
  757. package/src/webhook-signature-verification.ts +180 -25
  758. package/src/workflow-auth-generator.ts +137 -28
  759. package/src/workflow-component-plugin.ts +77 -20
  760. package/src/workflow-project-plugin.ts +247 -44
  761. package/dist/cjs/nodes/payment/payment-cancel-plan.d.ts +0 -3
  762. package/dist/cjs/nodes/payment/payment-cancel-plan.d.ts.map +0 -1
  763. package/dist/cjs/nodes/payment/payment-cancel-plan.js +0 -33
  764. package/dist/cjs/nodes/payment/payment-cancel-plan.js.map +0 -1
  765. package/dist/cjs/nodes/payment/payment-create-subscription.d.ts +0 -3
  766. package/dist/cjs/nodes/payment/payment-create-subscription.d.ts.map +0 -1
  767. package/dist/cjs/nodes/payment/payment-create-subscription.js +0 -41
  768. package/dist/cjs/nodes/payment/payment-create-subscription.js.map +0 -1
  769. package/dist/cjs/nodes/payment/payment-subscribe-to-plan.d.ts +0 -3
  770. package/dist/cjs/nodes/payment/payment-subscribe-to-plan.d.ts.map +0 -1
  771. package/dist/cjs/nodes/payment/payment-subscribe-to-plan.js +0 -45
  772. package/dist/cjs/nodes/payment/payment-subscribe-to-plan.js.map +0 -1
  773. package/dist/esm/nodes/payment/payment-cancel-plan.d.ts +0 -3
  774. package/dist/esm/nodes/payment/payment-cancel-plan.d.ts.map +0 -1
  775. package/dist/esm/nodes/payment/payment-cancel-plan.js +0 -30
  776. package/dist/esm/nodes/payment/payment-cancel-plan.js.map +0 -1
  777. package/dist/esm/nodes/payment/payment-create-subscription.d.ts +0 -3
  778. package/dist/esm/nodes/payment/payment-create-subscription.d.ts.map +0 -1
  779. package/dist/esm/nodes/payment/payment-create-subscription.js +0 -38
  780. package/dist/esm/nodes/payment/payment-create-subscription.js.map +0 -1
  781. package/dist/esm/nodes/payment/payment-subscribe-to-plan.d.ts +0 -3
  782. package/dist/esm/nodes/payment/payment-subscribe-to-plan.d.ts.map +0 -1
  783. package/dist/esm/nodes/payment/payment-subscribe-to-plan.js +0 -42
  784. package/dist/esm/nodes/payment/payment-subscribe-to-plan.js.map +0 -1
  785. package/src/nodes/payment/payment-cancel-plan.ts +0 -33
  786. package/src/nodes/payment/payment-create-subscription.ts +0 -42
  787. package/src/nodes/payment/payment-subscribe-to-plan.ts +0 -46
@@ -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
- // Mirrors the lookup used by /api/ecommerce/paypal/capture and the PayPal
33
- // webhook so the Stripe handler resolves credentials from either STRIPE_*
34
- // (legacy) or CONFIGURATION_STRIPE_* (current generator output) without
35
- // forcing the user to duplicate env vars.
36
- function __resolveStripeSecret(candidates, prefixScan) {
37
- for (var i = 0; i < candidates.length; i++) {
38
- var v = process.env[candidates[i]];
39
- if (v && String(v).length > 0) return String(v);
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
- // Live request origin tracks the actual port the dev server bound to —
60
- // NEXTAUTH_URL is often set to :3000 while dev runs on :3001, which
61
- // breaks every self-fetch (invoice generation, order notification).
62
- var __proto = req.headers['x-forwarded-proto'] ||
63
- (req.headers.host && (req.headers.host.startsWith('localhost') || req.headers.host.startsWith('127.0.0.1')) ? 'http' : 'https');
64
- var __reqBaseUrl = req.headers.host ? (__proto + '://' + req.headers.host) : '';
65
- var __envBaseUrl = process.env.NEXTAUTH_URL || process.env.VERCEL_URL || '';
66
- if (__envBaseUrl && !__envBaseUrl.startsWith('http')) __envBaseUrl = 'https://' + __envBaseUrl;
67
- var __baseUrl = __reqBaseUrl || __envBaseUrl || 'http://localhost:3000';
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 = __resolveStripeSecret(['STRIPE_SECRET_KEY', 'CONFIGURATION_STRIPE_SECRET_KEY', 'STRIPE_TEST_KEY'], 'CONFIGURATION_STRIPE_SECRET_KEY');
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 event;
80
-
81
- if (webhookSecret) {
82
- var sig = req.headers['stripe-signature'];
83
- if (!sig) {
84
- res.status(400).json({ error: 'Missing stripe-signature header' });
85
- return;
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
- ? `await handleStripeInvoicePayment(stripeInvoice, __baseUrl);`
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
- headers: { 'Content-Type': 'application/json' },
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 || 0) / 100,
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. Falling back to '' means we
281
- // skip hydration cleanly when called via payment_intent.succeeded events
282
- // (which carry no metadata).
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 || 0) / (li.quantity || 1) / 100,
296
- totalPrice: (li.amount_total || 0) / 100,
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 || 0) / (li.quantity || 1) / 100,
314
- totalPrice: (li.amount_total || 0) / 100,
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 || 0) / 100,
330
- totalPrice: (paymentObj.amount || 0) / 100,
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
- headers: { 'Content-Type': 'application/json' },
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 || 0) / 100,
438
- totalPrice: (li.amount || 0) / 100,
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
- headers: { 'Content-Type': 'application/json' },
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
- // Mirrors the lookup used by /api/ecommerce/paypal/capture so the webhook
501
- // resolves credentials from either PAYPAL_* (legacy) or CONFIGURATION_PAYPAL_*
502
- // (current generator output) without forcing the user to duplicate env vars.
503
- function __resolvePaypalSecret(candidates, prefixScan) {
504
- for (var i = 0; i < candidates.length; i++) {
505
- var v = process.env[candidates[i]];
506
- if (v && String(v).length > 0) return String(v);
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
- var clientId = __resolvePaypalSecret(['PAYPAL_CLIENT_ID', 'CONFIGURATION_PAYPAL_CLIENT_ID'], 'CONFIGURATION_PAYPAL_CLIENT_ID');
527
- var clientSecret = __resolvePaypalSecret(['PAYPAL_CLIENT_SECRET', 'CONFIGURATION_PAYPAL_CLIENT_SECRET'], 'CONFIGURATION_PAYPAL_CLIENT_SECRET');
528
- var webhookId = __resolvePaypalSecret(['PAYPAL_WEBHOOK_ID', 'CONFIGURATION_PAYPAL_WEBHOOK_ID'], 'CONFIGURATION_PAYPAL_WEBHOOK_ID');
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
- // Live request origin — preferred over NEXTAUTH_URL because it tracks the
536
- // actual port the dev server is bound to. Falls back to NEXTAUTH_URL /
537
- // VERCEL_URL when the request lacks a host header (shouldn't happen under
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 body = typeof req.body === 'string' ? JSON.parse(req.body) : (req.body || {});
548
-
549
- if (webhookId) {
550
- var verified = await verifyPaypalWebhook(req.headers, body, webhookId, clientId, clientSecret);
551
- if (!verified) {
552
- res.status(400).json({ error: 'Invalid webhook signature' });
553
- return;
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
- case 'CHECKOUT.ORDER.APPROVED':
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, eventType, clientId, clientSecret, __baseUrl);`
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
- headers: { 'Content-Type': 'application/json' },
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
- async function verifyPaypalWebhook(headers, body, webhookId, clientId, clientSecret) {
615
- try {
616
- // Detect environment from the cert URL PayPal embedded in the request,
617
- // not from the client id prefix. Sandbox client ids do NOT consistently
618
- // start with "sb-" — that heuristic was wrong and routed sandbox webhook
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
- return ok;
660
- } catch (e) {
661
- console.error('PayPal webhook verification failed:', e.message);
662
- return false;
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
- async function handlePaypalInvoiceGeneration(resource, eventType, clientId, clientSecret, baseUrl) {
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 items = [];
701
- var currency = 'USD';
702
- var total = 0;
703
-
704
- if (eventType === 'PAYMENT.CAPTURE.COMPLETED') {
705
- currency = (resource.amount && resource.amount.currency_code) || 'USD';
706
- total = Number(resource.amount && resource.amount.value) || 0;
707
- items = [{
708
- name: 'PayPal Payment',
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
- headers: { 'Content-Type': 'application/json' },
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?: Set<'stripe' | 'paypal'>
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<'stripe' | 'paypal'>()
973
+ const skipProviders = options.skipProviders || new Set<string>()
891
974
 
892
- const hasStripe =
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
- ) || providerTypes.includes('stripe')
978
+ ) ||
979
+ providerTypes.includes('stripe')) &&
980
+ !skipProviders.has('stripe')
896
981
 
897
- const hasPaypal =
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
- ) || providerTypes.includes('paypal')
985
+ ) ||
986
+ providerTypes.includes('paypal')) &&
987
+ !skipProviders.has('paypal')
901
988
 
902
- if (hasStripe && !skipProviders.has('stripe')) {
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 (hasPaypal && !skipProviders.has('paypal')) {
1014
+ if (emitPaypal) {
916
1015
  files.set('webhook-paypal', {
917
1016
  path: ['pages', 'api', 'webhooks'],
918
1017
  files: [