@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
@@ -2,6 +2,44 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateWebhookFiles = exports.generatePaypalWebhookCode = exports.generateStripeWebhookCode = void 0;
4
4
  const teleport_types_1 = require("@teleporthq/teleport-types");
5
+ const payments_1 = require("./payments");
6
+ const payment_drivers_scope_1 = require("./payments/payment-drivers-scope");
7
+ /**
8
+ * The origin a legacy webhook route calls this deployment's own routes on
9
+ * (`/api/invoices/generate`, `/api/ecommerce/order-notification`). Those
10
+ * self-calls carry the app secret, so the origin must never be a host the
11
+ * request named — outside Vercel the Host header is whatever the caller sent.
12
+ * The rule of the server runtime's `trustedBaseUrl` (server-runtime-code.ts),
13
+ * inlined because these routes do not load the server runtime: on Vercel the
14
+ * request's host (the domain Vercel routed to this deployment); elsewhere
15
+ * NEXTAUTH_URL's origin when it is set — except that a local server on another
16
+ * port than a local NEXTAUTH_URL keeps its own loopback address (NEXTAUTH_URL
17
+ * stuck at :3000 while `next dev` runs on :3001). With no Host header at all,
18
+ * the configured URLs as before.
19
+ */
20
+ const WEBHOOK_BASE_URL_CODE = `function __isLoopbackHost(host) {
21
+ var name = String(host || '').replace(/:[0-9]+$/, '').toLowerCase();
22
+ return name === 'localhost' || name === '127.0.0.1' || name === '[::1]';
23
+ }
24
+
25
+ function __webhookBaseUrl(req) {
26
+ var headers = (req && req.headers) || {};
27
+ var host = headers.host || '';
28
+ if (!host) {
29
+ var envBaseUrl = process.env.NEXTAUTH_URL || process.env.VERCEL_URL || '';
30
+ if (envBaseUrl && !envBaseUrl.startsWith('http')) envBaseUrl = 'https://' + envBaseUrl;
31
+ return envBaseUrl || 'http://localhost:3000';
32
+ }
33
+ var proto = headers['x-forwarded-proto'] || (__isLoopbackHost(host) ? 'http' : 'https');
34
+ var requestOrigin = String(proto).split(',')[0].trim() + '://' + host;
35
+ if (process.env.VERCEL) return requestOrigin;
36
+ var configured = String(process.env.NEXTAUTH_URL || '').trim();
37
+ if (!configured) return requestOrigin;
38
+ var origin;
39
+ try { origin = new URL(configured).origin; } catch (e) { return requestOrigin; }
40
+ if (__isLoopbackHost(host) && __isLoopbackHost(new URL(origin).host)) return requestOrigin;
41
+ return origin;
42
+ }`;
5
43
  const generateStripeWebhookCode = (invoiceSettings, ecommerceSettings) => {
6
44
  const autoGenerateInvoice = (invoiceSettings === null || invoiceSettings === void 0 ? void 0 : invoiceSettings.enabled) && (invoiceSettings === null || invoiceSettings === void 0 ? void 0 : invoiceSettings.autoGenerateOnPayment);
7
45
  const hasEcommerce = !!ecommerceSettings;
@@ -20,26 +58,25 @@ try { invoiceGenerate = require('../invoices/generate'); } catch (e) { invoiceGe
20
58
  `
21
59
  : ''}
22
60
 
23
- // Mirrors the lookup used by /api/ecommerce/paypal/capture and the PayPal
24
- // webhook so the Stripe handler resolves credentials from either STRIPE_*
25
- // (legacy) or CONFIGURATION_STRIPE_* (current generator output) without
26
- // forcing the user to duplicate env vars.
27
- function __resolveStripeSecret(candidates, prefixScan) {
28
- for (var i = 0; i < candidates.length; i++) {
29
- var v = process.env[candidates[i]];
30
- if (v && String(v).length > 0) return String(v);
31
- }
32
- if (prefixScan) {
33
- var keys = Object.keys(process.env);
34
- for (var j = 0; j < keys.length; j++) {
35
- if (keys[j].indexOf(prefixScan) === 0) {
36
- var v2 = process.env[keys[j]];
37
- if (v2 && String(v2).length > 0) return String(v2);
38
- }
39
- }
40
- }
41
- return '';
61
+ var __paymentDrivers;
62
+ try { __paymentDrivers = require('../../../utils/payments'); } catch (e) { __paymentDrivers = null; }
63
+
64
+ // The key is read the way the store's payment drivers read it: the deployed
65
+ // name, then the secret the editor saved it under (an older store's
66
+ // STRIPE_TEST_KEY last).
67
+ function __stripeSecretKey() {
68
+ return __paymentDrivers.core.credential('stripe', 'secretKey', ['STRIPE_TEST_KEY']);
42
69
  }
70
+ ${autoGenerateInvoice || hasOrderNotifications
71
+ ? `
72
+ // Stripe reports money in the currency's smallest unit (JPY has none, KWD a
73
+ // thousandth); the store keeps the major one, converted as its drivers do.
74
+ function __stripeMajor(minor, currency) {
75
+ return __paymentDrivers.core.fromMinor(Number(minor) || 0, currency);
76
+ }
77
+ `
78
+ : ''}
79
+ ${WEBHOOK_BASE_URL_CODE}
43
80
 
44
81
  module.exports = async function handler(req, res) {
45
82
  if (req.method !== 'POST') {
@@ -47,18 +84,21 @@ module.exports = async function handler(req, res) {
47
84
  return;
48
85
  }
49
86
 
50
- // Live request origin tracks the actual port the dev server bound to —
51
- // NEXTAUTH_URL is often set to :3000 while dev runs on :3001, which
52
- // breaks every self-fetch (invoice generation, order notification).
53
- var __proto = req.headers['x-forwarded-proto'] ||
54
- (req.headers.host && (req.headers.host.startsWith('localhost') || req.headers.host.startsWith('127.0.0.1')) ? 'http' : 'https');
55
- var __reqBaseUrl = req.headers.host ? (__proto + '://' + req.headers.host) : '';
56
- var __envBaseUrl = process.env.NEXTAUTH_URL || process.env.VERCEL_URL || '';
57
- if (__envBaseUrl && !__envBaseUrl.startsWith('http')) __envBaseUrl = 'https://' + __envBaseUrl;
58
- var __baseUrl = __reqBaseUrl || __envBaseUrl || 'http://localhost:3000';
87
+ // This deployment's own origin for the self-calls (invoice generation, order
88
+ // notification), which carry the app secret — never a host the request named.
89
+ var __baseUrl = __webhookBaseUrl(req);
90
+
91
+ // Verified by the store's Stripe driver: the signature when a signing
92
+ // secret is configured, else the event read back from Stripe — never the
93
+ // request as it arrived. Without the driver nothing can be verified.
94
+ var driver = __paymentDrivers ? __paymentDrivers.get('stripe') : null;
95
+ if (!driver) {
96
+ console.error('Stripe webhook rejected: this store has no Stripe payment driver');
97
+ res.status(400).json({ error: 'Invalid webhook signature' });
98
+ return;
99
+ }
59
100
 
60
- var stripeSecretKey = __resolveStripeSecret(['STRIPE_SECRET_KEY', 'CONFIGURATION_STRIPE_SECRET_KEY', 'STRIPE_TEST_KEY'], 'CONFIGURATION_STRIPE_SECRET_KEY');
61
- var webhookSecret = __resolveStripeSecret(['STRIPE_WEBHOOK_SECRET', 'CONFIGURATION_STRIPE_WEBHOOK_SECRET'], 'CONFIGURATION_STRIPE_WEBHOOK_SECRET');
101
+ var stripeSecretKey = __stripeSecretKey();
62
102
 
63
103
  if (!stripeSecretKey) {
64
104
  res.status(500).json({ error: 'Stripe secret key not configured' });
@@ -67,26 +107,26 @@ module.exports = async function handler(req, res) {
67
107
 
68
108
  try {
69
109
  var rawBody = await getRawBody(req);
70
- var event;
71
-
72
- if (webhookSecret) {
73
- var sig = req.headers['stripe-signature'];
74
- if (!sig) {
75
- res.status(400).json({ error: 'Missing stripe-signature header' });
76
- return;
77
- }
78
- event = verifyStripeSignature(rawBody, sig, webhookSecret);
79
- if (!event) {
80
- res.status(400).json({ error: 'Invalid webhook signature' });
81
- return;
82
- }
83
- } else {
84
- event = JSON.parse(rawBody.toString('utf-8'));
110
+ var parsed;
111
+ try { parsed = JSON.parse(rawBody.toString('utf-8')); } catch (_e) { parsed = {}; }
112
+ var verification = await driver.verifyWebhook({ headers: req.headers, rawBody: rawBody, body: parsed, secret: '' });
113
+ if (!verification.ok) {
114
+ console.error('Stripe webhook rejected: ' + (verification.reason || 'not verified'));
115
+ res.status(400).json({ error: 'Invalid webhook signature' });
116
+ return;
85
117
  }
118
+ var event = verification.body;
86
119
 
87
120
  switch (event.type) {
121
+ // A bank debit or a transfer completes the session UNPAID, and Stripe
122
+ // reports the money later (or never): only a paid session pays the order.
123
+ case 'checkout.session.async_payment_succeeded':
88
124
  case 'checkout.session.completed': {
89
125
  var session = event.data.object;
126
+ if (session.payment_status !== 'paid' && session.payment_status !== 'no_payment_required') {
127
+ console.log('Checkout session completed, payment not received yet:', session.id);
128
+ break;
129
+ }
90
130
  ${autoGenerateInvoice
91
131
  ? `await handleInvoiceGeneration(session, 'checkout', __baseUrl, stripeSecretKey);`
92
132
  : `console.log('Checkout session completed:', session.id);`}
@@ -97,6 +137,23 @@ module.exports = async function handler(req, res) {
97
137
 
98
138
  case 'payment_intent.succeeded': {
99
139
  var paymentIntent = event.data.object;
140
+ // The PaymentIntent of the store's own Checkout Session carries the
141
+ // order in its metadata (the driver copies it there so a refund names
142
+ // the order): the session's event pays and invoices that order, and
143
+ // this one would do it a second time.
144
+ if (paymentIntent.metadata && paymentIntent.metadata.orderId) {
145
+ console.log('Payment intent succeeded for a checkout session order:', paymentIntent.id);
146
+ break;
147
+ }
148
+ ${autoGenerateInvoice
149
+ ? `// An intent that pays a Stripe invoice (a subscription's first
150
+ // payment, a renewal) is invoiced from invoice.payment_succeeded,
151
+ // with the invoice's own lines: invoiced here too, it would be twice.
152
+ if (await __paysStripeInvoice(paymentIntent, stripeSecretKey)) {
153
+ console.log('Payment intent succeeded for a Stripe invoice:', paymentIntent.id);
154
+ break;
155
+ }`
156
+ : ''}
100
157
  ${autoGenerateInvoice
101
158
  ? `await handleInvoiceGeneration(paymentIntent, 'payment_intent', __baseUrl, stripeSecretKey);`
102
159
  : `console.log('Payment intent succeeded:', paymentIntent.id);`}
@@ -118,7 +175,14 @@ module.exports = async function handler(req, res) {
118
175
  case 'invoice.payment_succeeded': {
119
176
  var stripeInvoice = event.data.object;
120
177
  ${autoGenerateInvoice
121
- ? `await handleStripeInvoicePayment(stripeInvoice, __baseUrl);`
178
+ ? `// A subscription's first invoice, from a checkout the store opened
179
+ // for an order, is invoiced from that checkout's own event with the
180
+ // order it pays: invoiced here too, it would be twice.
181
+ if (__opensStoreOrder(stripeInvoice)) {
182
+ console.log('Invoice payment succeeded for a store checkout order:', stripeInvoice.id);
183
+ break;
184
+ }
185
+ await handleStripeInvoicePayment(stripeInvoice, __baseUrl);`
122
186
  : `console.log('Invoice payment succeeded:', stripeInvoice.id);`}
123
187
  break;
124
188
  }
@@ -147,47 +211,6 @@ function getRawBody(req) {
147
211
  });
148
212
  }
149
213
 
150
- function verifyStripeSignature(payload, sigHeader, secret) {
151
- try {
152
- var crypto = require('crypto');
153
- var parts = sigHeader.split(',');
154
- var timestamp = '';
155
- var signatures = [];
156
-
157
- for (var i = 0; i < parts.length; i++) {
158
- var kv = parts[i].trim().split('=');
159
- if (kv[0] === 't') timestamp = kv[1];
160
- if (kv[0] === 'v1') signatures.push(kv[1]);
161
- }
162
-
163
- if (!timestamp || signatures.length === 0) return null;
164
-
165
- var signedPayload = timestamp + '.' + payload.toString('utf-8');
166
- var expectedSignature = crypto
167
- .createHmac('sha256', secret)
168
- .update(signedPayload)
169
- .digest('hex');
170
-
171
- var valid = false;
172
- for (var j = 0; j < signatures.length; j++) {
173
- if (crypto.timingSafeEqual(Buffer.from(expectedSignature), Buffer.from(signatures[j]))) {
174
- valid = true;
175
- break;
176
- }
177
- }
178
-
179
- if (!valid) return null;
180
-
181
- var tolerance = 300;
182
- var now = Math.floor(Date.now() / 1000);
183
- if (Math.abs(now - Number(timestamp)) > tolerance) return null;
184
-
185
- return JSON.parse(payload.toString('utf-8'));
186
- } catch (e) {
187
- return null;
188
- }
189
- }
190
-
191
214
  module.exports.config = { api: { bodyParser: false } };
192
215
 
193
216
  ${autoGenerateInvoice ? generateInvoiceHandlerCode() : ''}
@@ -212,8 +235,9 @@ async function handleEcommerceOrderUpdate(session) {
212
235
  var client = new pg.Client({ connectionString: connStr, ssl: connStr.indexOf('sslmode=require') !== -1 ? { rejectUnauthorized: false } : undefined });
213
236
  try {
214
237
  await client.connect();
238
+ // A cancelled order stays cancelled, whatever pays for it late.
215
239
  await client.query(
216
- "UPDATE teleport_orders SET status = $1, payment_status = $2, payment_intent_id = COALESCE(NULLIF($3, ''), payment_intent_id), updated_at = NOW() WHERE id = $4",
240
+ "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'",
217
241
  ['paid', 'paid', String(session.payment_intent || session.id || ''), orderId]
218
242
  );
219
243
  } finally {
@@ -235,12 +259,13 @@ async function sendOrderNotification(session, baseUrl) {
235
259
 
236
260
  await fetch(resolvedBaseUrl + '/api/ecommerce/order-notification', {
237
261
  method: 'POST',
238
- headers: { 'Content-Type': 'application/json' },
262
+ // The route emails the merchant only for the store's own server code.
263
+ headers: { 'Content-Type': 'application/json', 'x-internal-data-secret': process.env.NEXTAUTH_SECRET || '' },
239
264
  body: JSON.stringify({
240
265
  orderId: orderId || session.id,
241
266
  customerEmail: session.customer_email || (session.customer_details && session.customer_details.email) || '',
242
267
  customerName: (session.customer_details && session.customer_details.name) || '',
243
- totalAmount: (session.amount_total || 0) / 100,
268
+ totalAmount: __stripeMajor(session.amount_total, session.currency),
244
269
  paymentMethod: 'stripe',
245
270
  }),
246
271
  });
@@ -260,9 +285,10 @@ async function handleInvoiceGeneration(paymentObj, source, baseUrl, stripeSecret
260
285
  var currency = 'usd';
261
286
  var paymentIntentId = paymentObj.id || '';
262
287
  // For checkout sessions, the place-order workflow embeds the internal
263
- // teleport_orders UUID in metadata.orderId. Falling back to '' means we
264
- // skip hydration cleanly when called via payment_intent.succeeded events
265
- // (which carry no metadata).
288
+ // teleport_orders UUID in metadata.orderId. A payment_intent.succeeded
289
+ // event reaches here only for an intent that names no order (one the
290
+ // store's checkout opened is settled by its session's event), so '' then
291
+ // skips hydration cleanly.
266
292
  var internalOrderId = (paymentObj.metadata && typeof paymentObj.metadata.orderId === 'string') ? paymentObj.metadata.orderId : '';
267
293
 
268
294
  if (source === 'checkout') {
@@ -275,8 +301,8 @@ async function handleInvoiceGeneration(paymentObj, source, baseUrl, stripeSecret
275
301
  return {
276
302
  name: li.description || '',
277
303
  quantity: li.quantity || 1,
278
- unitPrice: (li.amount_total || 0) / (li.quantity || 1) / 100,
279
- totalPrice: (li.amount_total || 0) / 100,
304
+ unitPrice: __stripeMajor(li.amount_total, currency) / (li.quantity || 1),
305
+ totalPrice: __stripeMajor(li.amount_total, currency),
280
306
  currency: currency.toUpperCase(),
281
307
  };
282
308
  });
@@ -293,8 +319,8 @@ async function handleInvoiceGeneration(paymentObj, source, baseUrl, stripeSecret
293
319
  return {
294
320
  name: li.description || '',
295
321
  quantity: li.quantity || 1,
296
- unitPrice: (li.amount_total || 0) / (li.quantity || 1) / 100,
297
- totalPrice: (li.amount_total || 0) / 100,
322
+ unitPrice: __stripeMajor(li.amount_total, currency) / (li.quantity || 1),
323
+ totalPrice: __stripeMajor(li.amount_total, currency),
298
324
  currency: currency.toUpperCase(),
299
325
  };
300
326
  });
@@ -309,8 +335,8 @@ async function handleInvoiceGeneration(paymentObj, source, baseUrl, stripeSecret
309
335
  items = [{
310
336
  name: paymentObj.description || 'Payment',
311
337
  quantity: 1,
312
- unitPrice: (paymentObj.amount || 0) / 100,
313
- totalPrice: (paymentObj.amount || 0) / 100,
338
+ unitPrice: __stripeMajor(paymentObj.amount, currency),
339
+ totalPrice: __stripeMajor(paymentObj.amount, currency),
314
340
  currency: currency.toUpperCase(),
315
341
  }];
316
342
 
@@ -352,7 +378,9 @@ async function handleInvoiceGeneration(paymentObj, source, baseUrl, stripeSecret
352
378
 
353
379
  var response = await fetch(resolvedBaseUrl + '/api/invoices/generate', {
354
380
  method: 'POST',
355
- headers: { 'Content-Type': 'application/json' },
381
+ // The route issues invoices only for the store's own server code, which
382
+ // presents the app secret.
383
+ headers: { 'Content-Type': 'application/json', 'x-internal-data-secret': process.env.NEXTAUTH_SECRET || '' },
356
384
  body: JSON.stringify(invoicePayload),
357
385
  });
358
386
 
@@ -398,9 +426,10 @@ async function __linkInvoiceToOrder(internalOrderId, invoiceResp, paymentIntentI
398
426
  var invoiceId = (invoiceResp && invoiceResp.invoiceId) || null;
399
427
  var invoiceNumber = (invoiceResp && invoiceResp.invoiceNumber) || null;
400
428
  // status / payment_status are independent: status tracks the order
401
- // lifecycle (confirmed = order accepted), payment_status tracks money.
429
+ // lifecycle (confirmed = order accepted), payment_status tracks money. A
430
+ // cancelled order stays cancelled, whatever pays for it late.
402
431
  await client.query(
403
- "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",
432
+ "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'",
404
433
  ['confirmed', 'paid', paymentIntentId || '', invoiceId, invoiceNumber, pdfUrl, internalOrderId]
405
434
  );
406
435
  console.info('[stripe webhook] order ' + internalOrderId + ' marked confirmed/paid — invoice=' + (invoiceNumber || '(none)') + ' pdf=' + (pdfUrl || '(none)'));
@@ -409,6 +438,53 @@ async function __linkInvoiceToOrder(internalOrderId, invoiceResp, paymentIntentI
409
438
  }
410
439
  }
411
440
 
441
+ // Whether a subscription's invoice is the first one of a subscription the
442
+ // store's own Checkout Session opened for an order. The session copies the
443
+ // order onto the subscription's metadata, which Stripe snapshots onto each
444
+ // invoice — on the invoice itself in the classic API, under \`parent\` from the
445
+ // 2025-03-31 versions on.
446
+ function __opensStoreOrder(stripeInvoice) {
447
+ if (!stripeInvoice || stripeInvoice.billing_reason !== 'subscription_create') {
448
+ return false;
449
+ }
450
+ var details = stripeInvoice.subscription_details ||
451
+ (stripeInvoice.parent && stripeInvoice.parent.subscription_details) || {};
452
+ var metadata = details.metadata || {};
453
+ return typeof metadata.orderId === 'string' && metadata.orderId !== '';
454
+ }
455
+
456
+ // Whether a PaymentIntent pays a Stripe invoice. The classic API names the
457
+ // invoice on the intent; from the 2025-03-31 versions on the intent names none,
458
+ // and the invoice payments are searched by the intent instead (that search is
459
+ // pinned to the version that introduced it). A search Stripe does not answer
460
+ // fails the delivery, so Stripe sends it again: taken as a payment of its own,
461
+ // an invoice's payment would be invoiced twice.
462
+ async function __paysStripeInvoice(paymentIntent, stripeSecretKey) {
463
+ if (paymentIntent.invoice) {
464
+ return true;
465
+ }
466
+ if (!stripeSecretKey || !paymentIntent.id) {
467
+ return false;
468
+ }
469
+ try {
470
+ var params = new URLSearchParams();
471
+ params.append('payment[type]', 'payment_intent');
472
+ params.append('payment[payment_intent]', paymentIntent.id);
473
+ params.append('limit', '1');
474
+ var found = await fetch('https://api.stripe.com/v1/invoice_payments?' + params.toString(), {
475
+ headers: { 'Authorization': 'Bearer ' + stripeSecretKey, 'Stripe-Version': '2025-03-31.basil' },
476
+ });
477
+ if (!found.ok) {
478
+ throw new Error('Stripe answered ' + found.status);
479
+ }
480
+ var page = await found.json();
481
+ return !!(page && Array.isArray(page.data) && page.data.length > 0);
482
+ } catch (e) {
483
+ console.error('Failed to look up the invoice of payment intent ' + paymentIntent.id + ':', e.message);
484
+ throw new Error('Could not tell whether payment intent ' + paymentIntent.id + ' pays a Stripe invoice');
485
+ }
486
+ }
487
+
412
488
  async function handleStripeInvoicePayment(stripeInvoice, baseUrl) {
413
489
  try {
414
490
  var items = [];
@@ -417,8 +493,8 @@ async function handleStripeInvoicePayment(stripeInvoice, baseUrl) {
417
493
  return {
418
494
  name: li.description || '',
419
495
  quantity: li.quantity || 1,
420
- unitPrice: (li.amount || 0) / 100,
421
- totalPrice: (li.amount || 0) / 100,
496
+ unitPrice: __stripeMajor(li.amount, stripeInvoice.currency),
497
+ totalPrice: __stripeMajor(li.amount, stripeInvoice.currency),
422
498
  currency: (stripeInvoice.currency || 'usd').toUpperCase(),
423
499
  };
424
500
  });
@@ -442,7 +518,9 @@ async function handleStripeInvoicePayment(stripeInvoice, baseUrl) {
442
518
 
443
519
  var response = await fetch(resolvedBaseUrl + '/api/invoices/generate', {
444
520
  method: 'POST',
445
- headers: { 'Content-Type': 'application/json' },
521
+ // The route issues invoices only for the store's own server code, which
522
+ // presents the app secret.
523
+ headers: { 'Content-Type': 'application/json', 'x-internal-data-secret': process.env.NEXTAUTH_SECRET || '' },
446
524
  body: JSON.stringify(invoicePayload),
447
525
  });
448
526
 
@@ -473,77 +551,81 @@ try { invoiceGenerate = require('../invoices/generate'); } catch (e) { invoiceGe
473
551
  `
474
552
  : ''}
475
553
 
476
- // Mirrors the lookup used by /api/ecommerce/paypal/capture so the webhook
477
- // resolves credentials from either PAYPAL_* (legacy) or CONFIGURATION_PAYPAL_*
478
- // (current generator output) without forcing the user to duplicate env vars.
479
- function __resolvePaypalSecret(candidates, prefixScan) {
480
- for (var i = 0; i < candidates.length; i++) {
481
- var v = process.env[candidates[i]];
482
- if (v && String(v).length > 0) return String(v);
483
- }
484
- if (prefixScan) {
485
- var keys = Object.keys(process.env);
486
- for (var j = 0; j < keys.length; j++) {
487
- if (keys[j].indexOf(prefixScan) === 0) {
488
- var v2 = process.env[keys[j]];
489
- if (v2 && String(v2).length > 0) return String(v2);
490
- }
491
- }
492
- }
493
- return '';
554
+ var __paymentDrivers;
555
+ try { __paymentDrivers = require('../../../utils/payments'); } catch (e) { __paymentDrivers = null; }
556
+
557
+ // The credentials are read the way the store's payment drivers read them:
558
+ // the deployed name, then the secret the editor saved them under.
559
+ function __paypalCredential(field) {
560
+ return __paymentDrivers.core.credential('paypal', field);
494
561
  }
495
562
 
563
+ ${WEBHOOK_BASE_URL_CODE}
564
+
496
565
  module.exports = async function handler(req, res) {
497
566
  if (req.method !== 'POST') {
498
567
  res.status(405).json({ error: 'Method not allowed' });
499
568
  return;
500
569
  }
501
570
 
502
- var clientId = __resolvePaypalSecret(['PAYPAL_CLIENT_ID', 'CONFIGURATION_PAYPAL_CLIENT_ID'], 'CONFIGURATION_PAYPAL_CLIENT_ID');
503
- var clientSecret = __resolvePaypalSecret(['PAYPAL_CLIENT_SECRET', 'CONFIGURATION_PAYPAL_CLIENT_SECRET'], 'CONFIGURATION_PAYPAL_CLIENT_SECRET');
504
- var webhookId = __resolvePaypalSecret(['PAYPAL_WEBHOOK_ID', 'CONFIGURATION_PAYPAL_WEBHOOK_ID'], 'CONFIGURATION_PAYPAL_WEBHOOK_ID');
571
+ // Verified by the store's PayPal driver: PayPal's signature check when a
572
+ // webhook id is configured, else the event read back from PayPal — never
573
+ // the request as it arrived. Without the driver nothing can be verified.
574
+ var driver = __paymentDrivers ? __paymentDrivers.get('paypal') : null;
575
+ if (!driver) {
576
+ console.error('PayPal webhook rejected: this store has no PayPal payment driver');
577
+ res.status(400).json({ error: 'Invalid webhook signature' });
578
+ return;
579
+ }
580
+
581
+ var clientId = __paypalCredential('clientId');
582
+ var clientSecret = __paypalCredential('clientSecret');
505
583
 
506
584
  if (!clientId || !clientSecret) {
507
585
  res.status(500).json({ error: 'PayPal credentials not configured' });
508
586
  return;
509
587
  }
510
588
 
511
- // Live request origin — preferred over NEXTAUTH_URL because it tracks the
512
- // actual port the dev server is bound to. Falls back to NEXTAUTH_URL /
513
- // VERCEL_URL when the request lacks a host header (shouldn't happen under
514
- // Next.js, but stays defensive). Same pattern as /api/invoices/generate.
515
- var __proto = req.headers['x-forwarded-proto'] ||
516
- (req.headers.host && (req.headers.host.startsWith('localhost') || req.headers.host.startsWith('127.0.0.1')) ? 'http' : 'https');
517
- var __reqBaseUrl = req.headers.host ? (__proto + '://' + req.headers.host) : '';
518
- var __envBaseUrl = process.env.NEXTAUTH_URL || process.env.VERCEL_URL || '';
519
- if (__envBaseUrl && !__envBaseUrl.startsWith('http')) __envBaseUrl = 'https://' + __envBaseUrl;
520
- var __baseUrl = __reqBaseUrl || __envBaseUrl || 'http://localhost:3000';
589
+ // This deployment's own origin for the self-calls (invoice generation, order
590
+ // notification), which carry the app secret — never a host the request named.
591
+ var __baseUrl = __webhookBaseUrl(req);
521
592
 
522
593
  try {
523
- var body = typeof req.body === 'string' ? JSON.parse(req.body) : (req.body || {});
524
-
525
- if (webhookId) {
526
- var verified = await verifyPaypalWebhook(req.headers, body, webhookId, clientId, clientSecret);
527
- if (!verified) {
528
- res.status(400).json({ error: 'Invalid webhook signature' });
529
- return;
530
- }
594
+ var rawBody = await getRawBody(req);
595
+ var parsed;
596
+ try { parsed = JSON.parse(rawBody.toString('utf-8')); } catch (_e) { parsed = {}; }
597
+ var verification = await driver.verifyWebhook({ headers: req.headers, rawBody: rawBody, body: parsed, secret: '' });
598
+ if (!verification.ok) {
599
+ console.error('PayPal webhook rejected: ' + (verification.reason || 'not verified'));
600
+ res.status(400).json({ error: 'Invalid webhook signature' });
601
+ return;
531
602
  }
603
+ var body = verification.body || {};
532
604
 
533
605
  var eventType = body.event_type || '';
534
606
 
535
607
  switch (eventType) {
536
- case 'CHECKOUT.ORDER.APPROVED':
608
+ // Only a capture moves money. An approval moves none (the driver
609
+ // captures an approved order as it verifies the approval), and the
610
+ // capture's own event, which follows, is what pays the order.
537
611
  case 'PAYMENT.CAPTURE.COMPLETED': {
538
612
  var resource = body.resource || {};
613
+ ${autoGenerateInvoice || hasOrderNotifications
614
+ ? `var capture = await __checkPaypalCapture(resource);
615
+ if (!capture.ok) {
616
+ console.error('PayPal capture ' + (resource.id || '') + ' not applied: ' + capture.reason);
617
+ break;
618
+ }`
619
+ : ''}
539
620
  ${autoGenerateInvoice
540
- ? `await handlePaypalInvoiceGeneration(resource, eventType, clientId, clientSecret, __baseUrl);`
621
+ ? `await handlePaypalInvoiceGeneration(resource, __baseUrl);`
541
622
  : `console.log('PayPal payment completed:', resource.id);`}
542
623
  ${hasOrderNotifications
543
624
  ? `try {
544
625
  await fetch(__baseUrl + '/api/ecommerce/order-notification', {
545
626
  method: 'POST',
546
- headers: { 'Content-Type': 'application/json' },
627
+ // The route emails the merchant only for the store's own server code.
628
+ headers: { 'Content-Type': 'application/json', 'x-internal-data-secret': process.env.NEXTAUTH_SECRET || '' },
547
629
  body: JSON.stringify({
548
630
  // The internal order id, so the route can load the order's own
549
631
  // lines and the rates they were charged at; the capture id is
@@ -583,58 +665,22 @@ module.exports = async function handler(req, res) {
583
665
  }
584
666
  };
585
667
 
586
- async function verifyPaypalWebhook(headers, body, webhookId, clientId, clientSecret) {
587
- try {
588
- // Detect environment from the cert URL PayPal embedded in the request,
589
- // not from the client id prefix. Sandbox client ids do NOT consistently
590
- // start with "sb-" — that heuristic was wrong and routed sandbox webhook
591
- // verifications to the live API, which then rejected the sandbox cert
592
- // with verification_status=FAILURE. The cert URL itself authoritatively
593
- // says "sandbox" vs production.
594
- var certUrl = String(headers['paypal-cert-url'] || '');
595
- var isSandbox = certUrl.indexOf('sandbox.paypal.com') !== -1 ||
596
- certUrl.indexOf('api.sandbox.paypal.com') !== -1;
597
- var baseUrl = isSandbox ? 'https://api-m.sandbox.paypal.com' : 'https://api-m.paypal.com';
598
-
599
- var authResponse = await fetch(baseUrl + '/v1/oauth2/token', {
600
- method: 'POST',
601
- headers: {
602
- 'Authorization': 'Basic ' + Buffer.from(clientId + ':' + clientSecret).toString('base64'),
603
- 'Content-Type': 'application/x-www-form-urlencoded',
604
- },
605
- body: 'grant_type=client_credentials',
606
- });
607
- var authData = await authResponse.json();
608
- if (!authData.access_token) return false;
609
-
610
- var verifyResponse = await fetch(baseUrl + '/v1/notifications/verify-webhook-signature', {
611
- method: 'POST',
612
- headers: {
613
- 'Authorization': 'Bearer ' + authData.access_token,
614
- 'Content-Type': 'application/json',
615
- },
616
- body: JSON.stringify({
617
- auth_algo: headers['paypal-auth-algo'] || '',
618
- cert_url: headers['paypal-cert-url'] || '',
619
- transmission_id: headers['paypal-transmission-id'] || '',
620
- transmission_sig: headers['paypal-transmission-sig'] || '',
621
- transmission_time: headers['paypal-transmission-time'] || '',
622
- webhook_id: webhookId,
623
- webhook_event: body,
624
- }),
625
- });
626
- var verifyData = await verifyResponse.json();
627
- var ok = verifyData.verification_status === 'SUCCESS';
628
- if (!ok) {
629
- console.error('PayPal webhook verification rejected by ' + baseUrl + ' — verification_status=' + (verifyData.verification_status || '(missing)') + ', name=' + (verifyData.name || '(none)') + ', message=' + (verifyData.message || '(none)'));
668
+ function getRawBody(req) {
669
+ return new Promise(function(resolve, reject) {
670
+ if (req.body && Buffer.isBuffer(req.body)) {
671
+ resolve(req.body);
672
+ return;
630
673
  }
631
- return ok;
632
- } catch (e) {
633
- console.error('PayPal webhook verification failed:', e.message);
634
- return false;
635
- }
674
+ var chunks = [];
675
+ req.on('data', function(chunk) { chunks.push(chunk); });
676
+ req.on('end', function() { resolve(Buffer.concat(chunks)); });
677
+ req.on('error', function(err) { reject(err); });
678
+ });
636
679
  }
637
680
 
681
+ // PayPal's signature check needs the event exactly as it was sent.
682
+ module.exports.config = { api: { bodyParser: false } };
683
+
638
684
  ${autoGenerateInvoice || hasOrderNotifications
639
685
  ? `
640
686
  // Pull the internal teleport_orders UUID out of the PayPal resource's
@@ -657,65 +703,92 @@ function __extractInternalOrderId(resource) {
657
703
  }
658
704
  return '';
659
705
  }
706
+
707
+ // Whether a completed capture may pay the store order it names: the capture
708
+ // took the money, and the order exists, is neither cancelled nor settled
709
+ // already (a redelivered event pays and announces nothing twice), and is due
710
+ // exactly what was captured — its total less what a gift card covered — in
711
+ // its own currency. A capture that names no store order has nothing to check.
712
+ async function __checkPaypalCapture(resource) {
713
+ var captureStatus = String(resource.status || 'COMPLETED').toUpperCase();
714
+ if (captureStatus !== 'COMPLETED') {
715
+ return { ok: false, reason: 'the capture is ' + captureStatus };
716
+ }
717
+ var internalOrderId = __extractInternalOrderId(resource);
718
+ if (!internalOrderId) {
719
+ return { ok: true };
720
+ }
721
+ var connStr = process.env.TELEPORT_DB_CONNECTION_STRING || process.env.DATABASE_URL || '';
722
+ if (!connStr) {
723
+ return { ok: false, reason: 'no database connection to check order ' + internalOrderId + ' against' };
724
+ }
725
+ var pg;
726
+ try {
727
+ pg = require('pg');
728
+ } catch (e) {
729
+ return { ok: false, reason: 'the pg module is unavailable to check order ' + internalOrderId };
730
+ }
731
+ var client = new pg.Client({ connectionString: connStr, ssl: connStr.indexOf('sslmode=require') !== -1 ? { rejectUnauthorized: false } : undefined });
732
+ var order = null;
733
+ try {
734
+ await client.connect();
735
+ // gift_card_amount is read through the row's JSON: a store provisioned
736
+ // before gift cards has no such column.
737
+ var found = await client.query(
738
+ "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",
739
+ [internalOrderId]
740
+ );
741
+ order = found && found.rows && found.rows[0] ? found.rows[0] : null;
742
+ } finally {
743
+ try { await client.end(); } catch (_e) {}
744
+ }
745
+ if (!order) {
746
+ return { ok: false, reason: 'the store has no order ' + internalOrderId };
747
+ }
748
+ if (String(order.status || '').toLowerCase() === 'cancelled') {
749
+ return { ok: false, reason: 'order ' + internalOrderId + ' was cancelled' };
750
+ }
751
+ var paymentStatus = String(order.payment_status || '').toLowerCase();
752
+ if (paymentStatus === 'paid' || paymentStatus === 'refunded' || paymentStatus === 'partially_refunded') {
753
+ return { ok: false, reason: 'order ' + internalOrderId + ' is already ' + paymentStatus };
754
+ }
755
+ var amount = resource.amount || {};
756
+ var capturedCurrency = String(amount.currency_code || '').toUpperCase();
757
+ var orderCurrency = String(order.currency || '').toUpperCase();
758
+ if (orderCurrency && capturedCurrency !== orderCurrency) {
759
+ return { ok: false, reason: 'the capture is in ' + (capturedCurrency || 'no currency') + ' and order ' + internalOrderId + ' in ' + orderCurrency };
760
+ }
761
+ // Whole cents, so 12.30 - 4.10 compares as 820 and never 8.199999999999999.
762
+ var due = Math.max(0, Math.round((Number(order.total_amount) - Number(order.gift_card_amount || 0)) * 100));
763
+ var captured = Math.round(Number(amount.value) * 100);
764
+ if (!isFinite(due) || captured !== due) {
765
+ return {
766
+ ok: false,
767
+ reason: 'the capture took ' + String(amount.value) + ' ' + capturedCurrency + ' and order ' + internalOrderId + ' is due ' + (due / 100).toFixed(2),
768
+ };
769
+ }
770
+ return { ok: true };
771
+ }
660
772
  `
661
773
  : ''}
662
774
 
663
775
  ${autoGenerateInvoice
664
776
  ? `
665
- async function handlePaypalInvoiceGeneration(resource, eventType, clientId, clientSecret, baseUrl) {
777
+ // Invoices a completed capture; the capture resource names no buyer, so the
778
+ // invoice route hydrates them from the order when the capture names one.
779
+ async function handlePaypalInvoiceGeneration(resource, baseUrl) {
666
780
  try {
667
781
  var customerEmail = '';
668
782
  var customerName = '';
669
- var items = [];
670
- var currency = 'USD';
671
- var total = 0;
672
-
673
- if (eventType === 'PAYMENT.CAPTURE.COMPLETED') {
674
- currency = (resource.amount && resource.amount.currency_code) || 'USD';
675
- total = Number(resource.amount && resource.amount.value) || 0;
676
- items = [{
677
- name: 'PayPal Payment',
678
- quantity: 1,
679
- unitPrice: total,
680
- totalPrice: total,
681
- currency: currency,
682
- }];
683
- } else if (eventType === 'CHECKOUT.ORDER.APPROVED') {
684
- var purchaseUnit = (resource.purchase_units && resource.purchase_units[0]) || {};
685
- currency = (purchaseUnit.amount && purchaseUnit.amount.currency_code) || 'USD';
686
- total = Number(purchaseUnit.amount && purchaseUnit.amount.value) || 0;
687
-
688
- if (purchaseUnit.items) {
689
- items = purchaseUnit.items.map(function(item) {
690
- return {
691
- name: item.name || '',
692
- quantity: Number(item.quantity) || 1,
693
- unitPrice: Number(item.unit_amount && item.unit_amount.value) || 0,
694
- totalPrice: (Number(item.quantity) || 1) * (Number(item.unit_amount && item.unit_amount.value) || 0),
695
- currency: currency,
696
- };
697
- });
698
- } else {
699
- items = [{
700
- name: 'PayPal Order',
701
- quantity: 1,
702
- unitPrice: total,
703
- totalPrice: total,
704
- currency: currency,
705
- }];
706
- }
707
-
708
- if (purchaseUnit.shipping && purchaseUnit.shipping.name) {
709
- customerName = purchaseUnit.shipping.name.full_name || '';
710
- }
711
- if (resource.payer) {
712
- customerEmail = resource.payer.email_address || '';
713
- if (!customerName && resource.payer.name) {
714
- customerName = (resource.payer.name.given_name || '') + ' ' + (resource.payer.name.surname || '');
715
- customerName = customerName.trim();
716
- }
717
- }
718
- }
783
+ var currency = (resource.amount && resource.amount.currency_code) || 'USD';
784
+ var total = Number(resource.amount && resource.amount.value) || 0;
785
+ var items = [{
786
+ name: 'PayPal Payment',
787
+ quantity: 1,
788
+ unitPrice: total,
789
+ totalPrice: total,
790
+ currency: currency,
791
+ }];
719
792
 
720
793
  // baseUrl is passed in from the request handler so the self-fetch tracks
721
794
  // the actual port the dev server bound to. Falls back to env vars for
@@ -758,7 +831,9 @@ async function handlePaypalInvoiceGeneration(resource, eventType, clientId, clie
758
831
 
759
832
  var response = await fetch(resolvedBaseUrl + '/api/invoices/generate', {
760
833
  method: 'POST',
761
- headers: { 'Content-Type': 'application/json' },
834
+ // The route issues invoices only for the store's own server code, which
835
+ // presents the app secret.
836
+ headers: { 'Content-Type': 'application/json', 'x-internal-data-secret': process.env.NEXTAUTH_SECRET || '' },
762
837
  body: JSON.stringify(invoicePayload),
763
838
  });
764
839
 
@@ -822,9 +897,10 @@ async function __linkInvoiceToOrder(internalOrderId, invoiceResp, paymentIntentI
822
897
  // payment_status is the MONEY state (unpaid → paid → refunded). A paid
823
898
  // online order should set status='confirmed' (not 'paid'), matching the
824
899
  // Stripe + COD paths so the order-details page renders a consistent
825
- // "Status: Confirmed / Payment: Paid".
900
+ // "Status: Confirmed / Payment: Paid". A cancelled order stays
901
+ // cancelled, whatever pays for it late.
826
902
  await client.query(
827
- "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",
903
+ "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'",
828
904
  ['confirmed', 'paid', paymentIntentId || '', invoiceId, invoiceNumber, pdfUrl, internalOrderId]
829
905
  );
830
906
  console.info('[paypal webhook] order ' + internalOrderId + ' marked confirmed/paid — invoice=' + (invoiceNumber || '(none)') + ' pdf=' + (pdfUrl || '(none)'));
@@ -845,9 +921,21 @@ const generateWebhookFiles = (structure, invoiceSettings, options = {}) => {
845
921
  const ecommerceProviders = (ecommerceSettings === null || ecommerceSettings === void 0 ? void 0 : ecommerceSettings.paymentProviders) || [];
846
922
  const providerTypes = ecommerceProviders.map((p) => p.type);
847
923
  const skipProviders = options.skipProviders || new Set();
848
- const hasStripe = Object.keys(env).some((k) => k.includes('STRIPE_SECRET_KEY') || k.includes('STRIPE_WEBHOOK_SECRET')) || providerTypes.includes('stripe');
849
- const hasPaypal = Object.keys(env).some((k) => k.includes('PAYPAL_CLIENT_ID') || k.includes('PAYPAL_CLIENT_SECRET')) || providerTypes.includes('paypal');
850
- if (hasStripe && !skipProviders.has('stripe')) {
924
+ const emitStripe = (Object.keys(env).some((k) => k.includes('STRIPE_SECRET_KEY') || k.includes('STRIPE_WEBHOOK_SECRET')) ||
925
+ providerTypes.includes('stripe')) &&
926
+ !skipProviders.has('stripe');
927
+ const emitPaypal = (Object.keys(env).some((k) => k.includes('PAYPAL_CLIENT_ID') || k.includes('PAYPAL_CLIENT_SECRET')) ||
928
+ providerTypes.includes('paypal')) &&
929
+ !skipProviders.has('paypal');
930
+ if (!emitStripe && !emitPaypal) {
931
+ return;
932
+ }
933
+ // Both routes verify through the store's drivers. The module is written
934
+ // once, by whichever emitter comes first, so it carries every provider the
935
+ // store uses — not only the two these routes need.
936
+ const storeDriverIds = (0, payments_1.resolveStorePaymentDriverIds)(uidl, []);
937
+ (0, payments_1.ensurePaymentDriversModule)(structure, storeDriverIds.length > 0 ? storeDriverIds : payment_drivers_scope_1.DEFAULT_PAYMENT_DRIVER_IDS);
938
+ if (emitStripe) {
851
939
  files.set('webhook-stripe', {
852
940
  path: ['pages', 'api', 'webhooks'],
853
941
  files: [
@@ -859,7 +947,7 @@ const generateWebhookFiles = (structure, invoiceSettings, options = {}) => {
859
947
  ],
860
948
  });
861
949
  }
862
- if (hasPaypal && !skipProviders.has('paypal')) {
950
+ if (emitPaypal) {
863
951
  files.set('webhook-paypal', {
864
952
  path: ['pages', 'api', 'webhooks'],
865
953
  files: [