@teleporthq/teleport-plugin-next-workflows 0.43.67 → 0.43.68

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