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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (787) hide show
  1. package/__tests__/_helpers/bind-workflow-utils.ts +16 -1
  2. package/__tests__/_helpers/fake-fetch.ts +96 -0
  3. package/__tests__/_helpers/fake-stripe.ts +52 -0
  4. package/__tests__/_helpers/load-handler.ts +22 -3
  5. package/__tests__/_helpers/load-invoice-route.ts +75 -0
  6. package/__tests__/_helpers/load-payment-drivers.ts +69 -0
  7. package/__tests__/_helpers/load-server-runtime.ts +33 -0
  8. package/__tests__/_helpers/run-generated-middleware.ts +50 -9
  9. package/__tests__/admin-form-hydration-target.test.ts +39 -0
  10. package/__tests__/admin-form-row-hydration.test.ts +58 -0
  11. package/__tests__/ai-select-database-data-handler.test.ts +14 -3
  12. package/__tests__/api-route-file-name-segments.test.ts +33 -0
  13. package/__tests__/app-secret-env.test.ts +55 -0
  14. package/__tests__/auth-env-secret-preservation.test.ts +22 -3
  15. package/__tests__/auth-nextauth-url.test.ts +134 -50
  16. package/__tests__/cart-add-item-kinds.test.ts +259 -0
  17. package/__tests__/cart-add-item-line-fields.test.ts +328 -0
  18. package/__tests__/cart-availability-add-to-cart.test.ts +108 -0
  19. package/__tests__/cart-get-total-discounts.test.ts +499 -0
  20. package/__tests__/cart-get-total-product-options.test.ts +195 -0
  21. package/__tests__/cart-get-total-subscriptions.test.ts +221 -0
  22. package/__tests__/cart-price-order.test.ts +283 -0
  23. package/__tests__/cart-update-item-quantity-recurring.test.ts +75 -0
  24. package/__tests__/client-loop-current-item.test.ts +164 -0
  25. package/__tests__/cron-route-loop-custom-node.test.ts +123 -0
  26. package/__tests__/cron-route-loop-templateparams.test.ts +7 -0
  27. package/__tests__/cron-route-verification.test.ts +252 -0
  28. package/__tests__/custom-js-runtime-base-url.test.ts +64 -0
  29. package/__tests__/custom-nodes-admin-module.test.ts +310 -0
  30. package/__tests__/data-api-browser-reads.test.ts +341 -0
  31. package/__tests__/data-api-low-stock-autofire.test.ts +67 -17
  32. package/__tests__/data-api-optional-feature-columns.test.ts +240 -0
  33. package/__tests__/data-api-protected-tables.test.ts +948 -0
  34. package/__tests__/data-node-not-awaited.test.ts +7 -3
  35. package/__tests__/data-write-missing-filter.test.ts +119 -0
  36. package/__tests__/ecommerce-rewriter-product-options.test.ts +143 -0
  37. package/__tests__/email-locale-senders.test.ts +1 -1
  38. package/__tests__/file-storage-upload-picked-files.test.ts +20 -0
  39. package/__tests__/input-debounce-per-field.test.ts +141 -0
  40. package/__tests__/internal-request-headers.test.ts +7 -3
  41. package/__tests__/invoice-data-access-replace.test.ts +340 -0
  42. package/__tests__/invoice-delivery-fee.test.ts +3 -2
  43. package/__tests__/invoice-generate-hydration.test.ts +20 -12
  44. package/__tests__/invoice-order-items-settle.test.ts +51 -46
  45. package/__tests__/invoice-product-options.test.ts +177 -0
  46. package/__tests__/invoice-regenerate-route.test.ts +488 -0
  47. package/__tests__/invoice-regional-tax.test.ts +3 -2
  48. package/__tests__/invoice-reservation.test.ts +195 -0
  49. package/__tests__/invoice-route-access.test.ts +275 -0
  50. package/__tests__/invoice-self-call-origin.test.ts +117 -0
  51. package/__tests__/invoice-tender.test.ts +550 -0
  52. package/__tests__/legacy-webhook-self-calls.test.ts +187 -0
  53. package/__tests__/locale-aware-redirects.test.ts +55 -26
  54. package/__tests__/loop-collection-unwrap.test.ts +6 -1
  55. package/__tests__/middleware-subscriber-access.test.ts +269 -0
  56. package/__tests__/payment-charge-user-earlier-attempt.test.ts +267 -0
  57. package/__tests__/payment-charge-user-handler-serialization.test.ts +47 -82
  58. package/__tests__/payment-charge-user-line-descriptions.test.ts +124 -0
  59. package/__tests__/payment-charge-user-report-refusal.test.ts +105 -0
  60. package/__tests__/payment-close-checkout-node.test.ts +127 -0
  61. package/__tests__/payment-driver-close-checkout.test.ts +1163 -0
  62. package/__tests__/payment-driver-coingate.test.ts +470 -0
  63. package/__tests__/payment-driver-inspect-checkout.test.ts +648 -0
  64. package/__tests__/payment-driver-mollie.test.ts +864 -0
  65. package/__tests__/payment-driver-paddle.test.ts +870 -0
  66. package/__tests__/payment-driver-paypal-capture.test.ts +158 -0
  67. package/__tests__/payment-driver-paypal-webhook.test.ts +367 -0
  68. package/__tests__/payment-driver-razorpay.test.ts +895 -0
  69. package/__tests__/payment-driver-square.test.ts +977 -0
  70. package/__tests__/payment-driver-stripe.test.ts +267 -0
  71. package/__tests__/payment-drivers-module.test.ts +429 -0
  72. package/__tests__/payment-legacy-webhook-routes.test.ts +588 -0
  73. package/__tests__/payment-redirect-and-order-notification.test.ts +98 -39
  74. package/__tests__/payment-refund.test.ts +523 -22
  75. package/__tests__/payment-subscription-nodes.test.ts +1360 -0
  76. package/__tests__/payment-webhook-route.test.ts +523 -0
  77. package/__tests__/paypal-webhook-signature-verification.test.ts +205 -0
  78. package/__tests__/prune-context-oversized-leaf.test.ts +1 -0
  79. package/__tests__/prune-context-state-keys.test.ts +89 -0
  80. package/__tests__/push-node-handlers.test.ts +291 -0
  81. package/__tests__/route-changed-trigger.test.ts +40 -0
  82. package/__tests__/runtime-storage-upload-access.test.ts +255 -0
  83. package/__tests__/security-runtime-shadow.test.ts +103 -1
  84. package/__tests__/segment-reply-changed-keys.test.ts +146 -0
  85. package/__tests__/segment-state-keys-emission.test.ts +185 -0
  86. package/__tests__/segment-state-needs.test.ts +102 -0
  87. package/__tests__/server-segment-context-integrity.test.ts +210 -0
  88. package/__tests__/server-step-signing.test.ts +371 -0
  89. package/__tests__/session-cookie-resolver.test.ts +59 -0
  90. package/__tests__/stock-decrement-audit.test.ts +17 -0
  91. package/__tests__/subscriber-access-route.test.ts +406 -0
  92. package/__tests__/webhook-delivery-lease.test.ts +316 -0
  93. package/__tests__/workflow-auth-guard.test.ts +253 -2
  94. package/dist/cjs/admin-form-hydration.d.ts +10 -0
  95. package/dist/cjs/admin-form-hydration.d.ts.map +1 -0
  96. package/dist/cjs/admin-form-hydration.js +25 -0
  97. package/dist/cjs/admin-form-hydration.js.map +1 -0
  98. package/dist/cjs/api-route-generator.d.ts +19 -3
  99. package/dist/cjs/api-route-generator.d.ts.map +1 -1
  100. package/dist/cjs/api-route-generator.js +190 -70
  101. package/dist/cjs/api-route-generator.js.map +1 -1
  102. package/dist/cjs/auth-generator.d.ts +4 -1
  103. package/dist/cjs/auth-generator.d.ts.map +1 -1
  104. package/dist/cjs/auth-generator.js +241 -62
  105. package/dist/cjs/auth-generator.js.map +1 -1
  106. package/dist/cjs/auth-return/signed-in-destination-code.d.ts +17 -0
  107. package/dist/cjs/auth-return/signed-in-destination-code.d.ts.map +1 -0
  108. package/dist/cjs/auth-return/signed-in-destination-code.js +37 -0
  109. package/dist/cjs/auth-return/signed-in-destination-code.js.map +1 -0
  110. package/dist/cjs/cart-pricing-preamble.d.ts +12 -0
  111. package/dist/cjs/cart-pricing-preamble.d.ts.map +1 -0
  112. package/dist/cjs/cart-pricing-preamble.js +23 -0
  113. package/dist/cjs/cart-pricing-preamble.js.map +1 -0
  114. package/dist/cjs/cron-request-verification.d.ts +24 -0
  115. package/dist/cjs/cron-request-verification.d.ts.map +1 -0
  116. package/dist/cjs/cron-request-verification.js +84 -0
  117. package/dist/cjs/cron-request-verification.js.map +1 -0
  118. package/dist/cjs/custom-node-modules.d.ts +30 -0
  119. package/dist/cjs/custom-node-modules.d.ts.map +1 -0
  120. package/dist/cjs/custom-node-modules.js +90 -0
  121. package/dist/cjs/custom-node-modules.js.map +1 -0
  122. package/dist/cjs/data-api-route-generator.d.ts +27 -0
  123. package/dist/cjs/data-api-route-generator.d.ts.map +1 -1
  124. package/dist/cjs/data-api-route-generator.js +366 -29
  125. package/dist/cjs/data-api-route-generator.js.map +1 -1
  126. package/dist/cjs/ecommerce/cart-availability.d.ts.map +1 -1
  127. package/dist/cjs/ecommerce/cart-availability.js +22 -13
  128. package/dist/cjs/ecommerce/cart-availability.js.map +1 -1
  129. package/dist/cjs/ecommerce/stock-decrement.d.ts +2 -1
  130. package/dist/cjs/ecommerce/stock-decrement.d.ts.map +1 -1
  131. package/dist/cjs/ecommerce/stock-decrement.js +6 -0
  132. package/dist/cjs/ecommerce/stock-decrement.js.map +1 -1
  133. package/dist/cjs/executor-generator.d.ts +0 -1
  134. package/dist/cjs/executor-generator.d.ts.map +1 -1
  135. package/dist/cjs/executor-generator.js +213 -20
  136. package/dist/cjs/executor-generator.js.map +1 -1
  137. package/dist/cjs/index.d.ts +12 -4
  138. package/dist/cjs/index.d.ts.map +1 -1
  139. package/dist/cjs/index.js +25 -2
  140. package/dist/cjs/index.js.map +1 -1
  141. package/dist/cjs/invoice/api-routes-code.d.ts +26 -0
  142. package/dist/cjs/invoice/api-routes-code.d.ts.map +1 -1
  143. package/dist/cjs/invoice/api-routes-code.js +423 -391
  144. package/dist/cjs/invoice/api-routes-code.js.map +1 -1
  145. package/dist/cjs/invoice/data-access-code.d.ts.map +1 -1
  146. package/dist/cjs/invoice/data-access-code.js +420 -107
  147. package/dist/cjs/invoice/data-access-code.js.map +1 -1
  148. package/dist/cjs/invoice/index.d.ts.map +1 -1
  149. package/dist/cjs/invoice/index.js +24 -0
  150. package/dist/cjs/invoice/index.js.map +1 -1
  151. package/dist/cjs/invoice/invoice-assembly-code.d.ts +12 -0
  152. package/dist/cjs/invoice/invoice-assembly-code.d.ts.map +1 -0
  153. package/dist/cjs/invoice/invoice-assembly-code.js +517 -0
  154. package/dist/cjs/invoice/invoice-assembly-code.js.map +1 -0
  155. package/dist/cjs/invoice/invoice-html-code.d.ts.map +1 -1
  156. package/dist/cjs/invoice/invoice-html-code.js +111 -9
  157. package/dist/cjs/invoice/invoice-html-code.js.map +1 -1
  158. package/dist/cjs/invoice/pdf-service-client-code.d.ts.map +1 -1
  159. package/dist/cjs/invoice/pdf-service-client-code.js +3 -4
  160. package/dist/cjs/invoice/pdf-service-client-code.js.map +1 -1
  161. package/dist/cjs/nodes/account/account-login.d.ts.map +1 -1
  162. package/dist/cjs/nodes/account/account-login.js +4 -3
  163. package/dist/cjs/nodes/account/account-login.js.map +1 -1
  164. package/dist/cjs/nodes/account/account-signup.d.ts.map +1 -1
  165. package/dist/cjs/nodes/account/account-signup.js +7 -4
  166. package/dist/cjs/nodes/account/account-signup.js.map +1 -1
  167. package/dist/cjs/nodes/ai/ai-select-database-data.d.ts.map +1 -1
  168. package/dist/cjs/nodes/ai/ai-select-database-data.js +6 -1
  169. package/dist/cjs/nodes/ai/ai-select-database-data.js.map +1 -1
  170. package/dist/cjs/nodes/browser/browser-get-push-subscription.d.ts +9 -0
  171. package/dist/cjs/nodes/browser/browser-get-push-subscription.d.ts.map +1 -0
  172. package/dist/cjs/nodes/browser/browser-get-push-subscription.js +25 -0
  173. package/dist/cjs/nodes/browser/browser-get-push-subscription.js.map +1 -0
  174. package/dist/cjs/nodes/browser/browser-show-notification.d.ts +10 -0
  175. package/dist/cjs/nodes/browser/browser-show-notification.d.ts.map +1 -1
  176. package/dist/cjs/nodes/browser/browser-show-notification.js +65 -40
  177. package/dist/cjs/nodes/browser/browser-show-notification.js.map +1 -1
  178. package/dist/cjs/nodes/browser/browser-subscribe-to-push.d.ts +11 -0
  179. package/dist/cjs/nodes/browser/browser-subscribe-to-push.d.ts.map +1 -1
  180. package/dist/cjs/nodes/browser/browser-subscribe-to-push.js +21 -31
  181. package/dist/cjs/nodes/browser/browser-subscribe-to-push.js.map +1 -1
  182. package/dist/cjs/nodes/browser/browser-unsubscribe-from-push.d.ts +8 -0
  183. package/dist/cjs/nodes/browser/browser-unsubscribe-from-push.d.ts.map +1 -0
  184. package/dist/cjs/nodes/browser/browser-unsubscribe-from-push.js +24 -0
  185. package/dist/cjs/nodes/browser/browser-unsubscribe-from-push.js.map +1 -0
  186. package/dist/cjs/nodes/browser/push-api-access.d.ts +12 -0
  187. package/dist/cjs/nodes/browser/push-api-access.d.ts.map +1 -0
  188. package/dist/cjs/nodes/browser/push-api-access.js +19 -0
  189. package/dist/cjs/nodes/browser/push-api-access.js.map +1 -0
  190. package/dist/cjs/nodes/cart/cart-add-item.d.ts.map +1 -1
  191. package/dist/cjs/nodes/cart/cart-add-item.js +174 -10
  192. package/dist/cjs/nodes/cart/cart-add-item.js.map +1 -1
  193. package/dist/cjs/nodes/cart/cart-clear.d.ts.map +1 -1
  194. package/dist/cjs/nodes/cart/cart-clear.js +11 -0
  195. package/dist/cjs/nodes/cart/cart-clear.js.map +1 -1
  196. package/dist/cjs/nodes/cart/cart-get-total.d.ts.map +1 -1
  197. package/dist/cjs/nodes/cart/cart-get-total.js +260 -3
  198. package/dist/cjs/nodes/cart/cart-get-total.js.map +1 -1
  199. package/dist/cjs/nodes/cart/cart-price-order.d.ts +3 -0
  200. package/dist/cjs/nodes/cart/cart-price-order.d.ts.map +1 -0
  201. package/dist/cjs/nodes/cart/cart-price-order.js +281 -0
  202. package/dist/cjs/nodes/cart/cart-price-order.js.map +1 -0
  203. package/dist/cjs/nodes/cart/cart-update-item-quantity.d.ts.map +1 -1
  204. package/dist/cjs/nodes/cart/cart-update-item-quantity.js +7 -0
  205. package/dist/cjs/nodes/cart/cart-update-item-quantity.js.map +1 -1
  206. package/dist/cjs/nodes/data/data-count.d.ts.map +1 -1
  207. package/dist/cjs/nodes/data/data-count.js +6 -1
  208. package/dist/cjs/nodes/data/data-count.js.map +1 -1
  209. package/dist/cjs/nodes/data/data-create-item.d.ts.map +1 -1
  210. package/dist/cjs/nodes/data/data-create-item.js +11 -1
  211. package/dist/cjs/nodes/data/data-create-item.js.map +1 -1
  212. package/dist/cjs/nodes/data/data-delete-item.d.ts.map +1 -1
  213. package/dist/cjs/nodes/data/data-delete-item.js +29 -0
  214. package/dist/cjs/nodes/data/data-delete-item.js.map +1 -1
  215. package/dist/cjs/nodes/data/data-raw-query.d.ts.map +1 -1
  216. package/dist/cjs/nodes/data/data-raw-query.js +6 -1
  217. package/dist/cjs/nodes/data/data-raw-query.js.map +1 -1
  218. package/dist/cjs/nodes/data/data-select.d.ts.map +1 -1
  219. package/dist/cjs/nodes/data/data-select.js +6 -1
  220. package/dist/cjs/nodes/data/data-select.js.map +1 -1
  221. package/dist/cjs/nodes/data/data-update-item.d.ts.map +1 -1
  222. package/dist/cjs/nodes/data/data-update-item.js +29 -0
  223. package/dist/cjs/nodes/data/data-update-item.js.map +1 -1
  224. package/dist/cjs/nodes/ecommerce/ecommerce-generate-invoice.d.ts.map +1 -1
  225. package/dist/cjs/nodes/ecommerce/ecommerce-generate-invoice.js +7 -1
  226. package/dist/cjs/nodes/ecommerce/ecommerce-generate-invoice.js.map +1 -1
  227. package/dist/cjs/nodes/file-storage/file-storage-upload.d.ts.map +1 -1
  228. package/dist/cjs/nodes/file-storage/file-storage-upload.js +7 -0
  229. package/dist/cjs/nodes/file-storage/file-storage-upload.js.map +1 -1
  230. package/dist/cjs/nodes/general/general-custom-js.d.ts.map +1 -1
  231. package/dist/cjs/nodes/general/general-custom-js.js +21 -5
  232. package/dist/cjs/nodes/general/general-custom-js.js.map +1 -1
  233. package/dist/cjs/nodes/index.d.ts.map +1 -1
  234. package/dist/cjs/nodes/index.js +9 -4
  235. package/dist/cjs/nodes/index.js.map +1 -1
  236. package/dist/cjs/nodes/payment/payment-billing-portal.d.ts +3 -0
  237. package/dist/cjs/nodes/payment/payment-billing-portal.d.ts.map +1 -0
  238. package/dist/cjs/nodes/payment/payment-billing-portal.js +52 -0
  239. package/dist/cjs/nodes/payment/payment-billing-portal.js.map +1 -0
  240. package/dist/cjs/nodes/payment/payment-charge-user.d.ts.map +1 -1
  241. package/dist/cjs/nodes/payment/payment-charge-user.js +227 -360
  242. package/dist/cjs/nodes/payment/payment-charge-user.js.map +1 -1
  243. package/dist/cjs/nodes/payment/payment-close-checkout.d.ts +3 -0
  244. package/dist/cjs/nodes/payment/payment-close-checkout.d.ts.map +1 -0
  245. package/dist/cjs/nodes/payment/payment-close-checkout.js +141 -0
  246. package/dist/cjs/nodes/payment/payment-close-checkout.js.map +1 -0
  247. package/dist/cjs/nodes/payment/payment-ensure-subscription-plan.d.ts +3 -0
  248. package/dist/cjs/nodes/payment/payment-ensure-subscription-plan.d.ts.map +1 -0
  249. package/dist/cjs/nodes/payment/payment-ensure-subscription-plan.js +67 -0
  250. package/dist/cjs/nodes/payment/payment-ensure-subscription-plan.js.map +1 -0
  251. package/dist/cjs/nodes/payment/payment-manage-subscription.d.ts +3 -0
  252. package/dist/cjs/nodes/payment/payment-manage-subscription.d.ts.map +1 -0
  253. package/dist/cjs/nodes/payment/payment-manage-subscription.js +89 -0
  254. package/dist/cjs/nodes/payment/payment-manage-subscription.js.map +1 -0
  255. package/dist/cjs/nodes/payment/payment-refund.d.ts.map +1 -1
  256. package/dist/cjs/nodes/payment/payment-refund.js +50 -404
  257. package/dist/cjs/nodes/payment/payment-refund.js.map +1 -1
  258. package/dist/cjs/nodes/push/push-send-notification.d.ts +14 -0
  259. package/dist/cjs/nodes/push/push-send-notification.d.ts.map +1 -0
  260. package/dist/cjs/nodes/push/push-send-notification.js +83 -0
  261. package/dist/cjs/nodes/push/push-send-notification.js.map +1 -0
  262. package/dist/cjs/payments/drivers/coingate-driver-code.d.ts +16 -0
  263. package/dist/cjs/payments/drivers/coingate-driver-code.d.ts.map +1 -0
  264. package/dist/cjs/payments/drivers/coingate-driver-code.js +471 -0
  265. package/dist/cjs/payments/drivers/coingate-driver-code.js.map +1 -0
  266. package/dist/cjs/payments/drivers/mollie-driver-code.d.ts +16 -0
  267. package/dist/cjs/payments/drivers/mollie-driver-code.d.ts.map +1 -0
  268. package/dist/cjs/payments/drivers/mollie-driver-code.js +623 -0
  269. package/dist/cjs/payments/drivers/mollie-driver-code.js.map +1 -0
  270. package/dist/cjs/payments/drivers/paddle-driver-code.d.ts +12 -0
  271. package/dist/cjs/payments/drivers/paddle-driver-code.d.ts.map +1 -0
  272. package/dist/cjs/payments/drivers/paddle-driver-code.js +683 -0
  273. package/dist/cjs/payments/drivers/paddle-driver-code.js.map +1 -0
  274. package/dist/cjs/payments/drivers/paypal-driver-code.d.ts +12 -0
  275. package/dist/cjs/payments/drivers/paypal-driver-code.d.ts.map +1 -0
  276. package/dist/cjs/payments/drivers/paypal-driver-code.js +1261 -0
  277. package/dist/cjs/payments/drivers/paypal-driver-code.js.map +1 -0
  278. package/dist/cjs/payments/drivers/razorpay-driver-code.d.ts +12 -0
  279. package/dist/cjs/payments/drivers/razorpay-driver-code.d.ts.map +1 -0
  280. package/dist/cjs/payments/drivers/razorpay-driver-code.js +732 -0
  281. package/dist/cjs/payments/drivers/razorpay-driver-code.js.map +1 -0
  282. package/dist/cjs/payments/drivers/square-driver-code.d.ts +14 -0
  283. package/dist/cjs/payments/drivers/square-driver-code.d.ts.map +1 -0
  284. package/dist/cjs/payments/drivers/square-driver-code.js +931 -0
  285. package/dist/cjs/payments/drivers/square-driver-code.js.map +1 -0
  286. package/dist/cjs/payments/drivers/stripe-driver-code.d.ts +12 -0
  287. package/dist/cjs/payments/drivers/stripe-driver-code.d.ts.map +1 -0
  288. package/dist/cjs/payments/drivers/stripe-driver-code.js +778 -0
  289. package/dist/cjs/payments/drivers/stripe-driver-code.js.map +1 -0
  290. package/dist/cjs/payments/index.d.ts +66 -0
  291. package/dist/cjs/payments/index.d.ts.map +1 -0
  292. package/dist/cjs/payments/index.js +175 -0
  293. package/dist/cjs/payments/index.js.map +1 -0
  294. package/dist/cjs/payments/payment-core-code.d.ts +19 -0
  295. package/dist/cjs/payments/payment-core-code.d.ts.map +1 -0
  296. package/dist/cjs/payments/payment-core-code.js +422 -0
  297. package/dist/cjs/payments/payment-core-code.js.map +1 -0
  298. package/dist/cjs/payments/payment-driver-code-map.d.ts +4 -0
  299. package/dist/cjs/payments/payment-driver-code-map.d.ts.map +1 -0
  300. package/dist/cjs/payments/payment-driver-code-map.js +21 -0
  301. package/dist/cjs/payments/payment-driver-code-map.js.map +1 -0
  302. package/dist/cjs/payments/payment-drivers-scope.d.ts +35 -0
  303. package/dist/cjs/payments/payment-drivers-scope.d.ts.map +1 -0
  304. package/dist/cjs/payments/payment-drivers-scope.js +56 -0
  305. package/dist/cjs/payments/payment-drivers-scope.js.map +1 -0
  306. package/dist/cjs/payments/payment-registry-code.d.ts +8 -0
  307. package/dist/cjs/payments/payment-registry-code.d.ts.map +1 -0
  308. package/dist/cjs/payments/payment-registry-code.js +41 -0
  309. package/dist/cjs/payments/payment-registry-code.js.map +1 -0
  310. package/dist/cjs/pg-client-code.d.ts +10 -0
  311. package/dist/cjs/pg-client-code.d.ts.map +1 -1
  312. package/dist/cjs/pg-client-code.js +27 -1
  313. package/dist/cjs/pg-client-code.js.map +1 -1
  314. package/dist/cjs/runtime-storage-generator.d.ts +28 -0
  315. package/dist/cjs/runtime-storage-generator.d.ts.map +1 -1
  316. package/dist/cjs/runtime-storage-generator.js +240 -5
  317. package/dist/cjs/runtime-storage-generator.js.map +1 -1
  318. package/dist/cjs/secret-collector.d.ts.map +1 -1
  319. package/dist/cjs/secret-collector.js +8 -3
  320. package/dist/cjs/secret-collector.js.map +1 -1
  321. package/dist/cjs/security-scanner.d.ts +10 -1
  322. package/dist/cjs/security-scanner.d.ts.map +1 -1
  323. package/dist/cjs/security-scanner.js +19 -1
  324. package/dist/cjs/security-scanner.js.map +1 -1
  325. package/dist/cjs/segment-context-needs.d.ts +38 -0
  326. package/dist/cjs/segment-context-needs.d.ts.map +1 -0
  327. package/dist/cjs/segment-context-needs.js +129 -0
  328. package/dist/cjs/segment-context-needs.js.map +1 -0
  329. package/dist/cjs/segment-splitter.d.ts.map +1 -1
  330. package/dist/cjs/segment-splitter.js +6 -1
  331. package/dist/cjs/segment-splitter.js.map +1 -1
  332. package/dist/cjs/segment-trust.d.ts +50 -0
  333. package/dist/cjs/segment-trust.d.ts.map +1 -0
  334. package/dist/cjs/segment-trust.js +115 -0
  335. package/dist/cjs/segment-trust.js.map +1 -0
  336. package/dist/cjs/sent-email-log/sent-email-log-code.d.ts +19 -0
  337. package/dist/cjs/sent-email-log/sent-email-log-code.d.ts.map +1 -1
  338. package/dist/cjs/sent-email-log/sent-email-log-code.js +1 -24
  339. package/dist/cjs/sent-email-log/sent-email-log-code.js.map +1 -1
  340. package/dist/cjs/server-runtime-code.d.ts +34 -0
  341. package/dist/cjs/server-runtime-code.d.ts.map +1 -0
  342. package/dist/cjs/server-runtime-code.js +303 -0
  343. package/dist/cjs/server-runtime-code.js.map +1 -0
  344. package/dist/cjs/session-cookie-resolver.d.ts +3 -78
  345. package/dist/cjs/session-cookie-resolver.d.ts.map +1 -1
  346. package/dist/cjs/session-cookie-resolver.js +7 -276
  347. package/dist/cjs/session-cookie-resolver.js.map +1 -1
  348. package/dist/cjs/subscriber-access-route-generator.d.ts +71 -0
  349. package/dist/cjs/subscriber-access-route-generator.d.ts.map +1 -0
  350. package/dist/cjs/subscriber-access-route-generator.js +301 -0
  351. package/dist/cjs/subscriber-access-route-generator.js.map +1 -0
  352. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  353. package/dist/cjs/types.d.ts +6 -0
  354. package/dist/cjs/types.d.ts.map +1 -1
  355. package/dist/cjs/webhook-delivery-lease/index.d.ts +8 -0
  356. package/dist/cjs/webhook-delivery-lease/index.d.ts.map +1 -0
  357. package/dist/cjs/webhook-delivery-lease/index.js +41 -0
  358. package/dist/cjs/webhook-delivery-lease/index.js.map +1 -0
  359. package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-code.d.ts +26 -0
  360. package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-code.d.ts.map +1 -0
  361. package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-code.js +151 -0
  362. package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-code.js.map +1 -0
  363. package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-scope.d.ts +16 -0
  364. package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-scope.d.ts.map +1 -0
  365. package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-scope.js +19 -0
  366. package/dist/cjs/webhook-delivery-lease/webhook-delivery-lease-scope.js.map +1 -0
  367. package/dist/cjs/webhook-generator.d.ts +1 -1
  368. package/dist/cjs/webhook-generator.d.ts.map +1 -1
  369. package/dist/cjs/webhook-generator.js +342 -254
  370. package/dist/cjs/webhook-generator.js.map +1 -1
  371. package/dist/cjs/webhook-signature-verification.d.ts +17 -1
  372. package/dist/cjs/webhook-signature-verification.d.ts.map +1 -1
  373. package/dist/cjs/webhook-signature-verification.js +182 -27
  374. package/dist/cjs/webhook-signature-verification.js.map +1 -1
  375. package/dist/cjs/workflow-auth-generator.d.ts +9 -6
  376. package/dist/cjs/workflow-auth-generator.d.ts.map +1 -1
  377. package/dist/cjs/workflow-auth-generator.js +133 -29
  378. package/dist/cjs/workflow-auth-generator.js.map +1 -1
  379. package/dist/cjs/workflow-component-plugin.d.ts.map +1 -1
  380. package/dist/cjs/workflow-component-plugin.js +65 -28
  381. package/dist/cjs/workflow-component-plugin.js.map +1 -1
  382. package/dist/cjs/workflow-project-plugin.d.ts +13 -0
  383. package/dist/cjs/workflow-project-plugin.d.ts.map +1 -1
  384. package/dist/cjs/workflow-project-plugin.js +215 -65
  385. package/dist/cjs/workflow-project-plugin.js.map +1 -1
  386. package/dist/esm/admin-form-hydration.d.ts +10 -0
  387. package/dist/esm/admin-form-hydration.d.ts.map +1 -0
  388. package/dist/esm/admin-form-hydration.js +21 -0
  389. package/dist/esm/admin-form-hydration.js.map +1 -0
  390. package/dist/esm/api-route-generator.d.ts +19 -3
  391. package/dist/esm/api-route-generator.d.ts.map +1 -1
  392. package/dist/esm/api-route-generator.js +189 -70
  393. package/dist/esm/api-route-generator.js.map +1 -1
  394. package/dist/esm/auth-generator.d.ts +4 -1
  395. package/dist/esm/auth-generator.d.ts.map +1 -1
  396. package/dist/esm/auth-generator.js +241 -62
  397. package/dist/esm/auth-generator.js.map +1 -1
  398. package/dist/esm/auth-return/signed-in-destination-code.d.ts +17 -0
  399. package/dist/esm/auth-return/signed-in-destination-code.d.ts.map +1 -0
  400. package/dist/esm/auth-return/signed-in-destination-code.js +33 -0
  401. package/dist/esm/auth-return/signed-in-destination-code.js.map +1 -0
  402. package/dist/esm/cart-pricing-preamble.d.ts +12 -0
  403. package/dist/esm/cart-pricing-preamble.d.ts.map +1 -0
  404. package/dist/esm/cart-pricing-preamble.js +19 -0
  405. package/dist/esm/cart-pricing-preamble.js.map +1 -0
  406. package/dist/esm/cron-request-verification.d.ts +24 -0
  407. package/dist/esm/cron-request-verification.d.ts.map +1 -0
  408. package/dist/esm/cron-request-verification.js +80 -0
  409. package/dist/esm/cron-request-verification.js.map +1 -0
  410. package/dist/esm/custom-node-modules.d.ts +30 -0
  411. package/dist/esm/custom-node-modules.d.ts.map +1 -0
  412. package/dist/esm/custom-node-modules.js +84 -0
  413. package/dist/esm/custom-node-modules.js.map +1 -0
  414. package/dist/esm/data-api-route-generator.d.ts +27 -0
  415. package/dist/esm/data-api-route-generator.d.ts.map +1 -1
  416. package/dist/esm/data-api-route-generator.js +365 -28
  417. package/dist/esm/data-api-route-generator.js.map +1 -1
  418. package/dist/esm/ecommerce/cart-availability.d.ts.map +1 -1
  419. package/dist/esm/ecommerce/cart-availability.js +22 -13
  420. package/dist/esm/ecommerce/cart-availability.js.map +1 -1
  421. package/dist/esm/ecommerce/stock-decrement.d.ts +2 -1
  422. package/dist/esm/ecommerce/stock-decrement.d.ts.map +1 -1
  423. package/dist/esm/ecommerce/stock-decrement.js +6 -0
  424. package/dist/esm/ecommerce/stock-decrement.js.map +1 -1
  425. package/dist/esm/executor-generator.d.ts +0 -1
  426. package/dist/esm/executor-generator.d.ts.map +1 -1
  427. package/dist/esm/executor-generator.js +212 -18
  428. package/dist/esm/executor-generator.js.map +1 -1
  429. package/dist/esm/index.d.ts +12 -4
  430. package/dist/esm/index.d.ts.map +1 -1
  431. package/dist/esm/index.js +10 -4
  432. package/dist/esm/index.js.map +1 -1
  433. package/dist/esm/invoice/api-routes-code.d.ts +26 -0
  434. package/dist/esm/invoice/api-routes-code.d.ts.map +1 -1
  435. package/dist/esm/invoice/api-routes-code.js +421 -390
  436. package/dist/esm/invoice/api-routes-code.js.map +1 -1
  437. package/dist/esm/invoice/data-access-code.d.ts.map +1 -1
  438. package/dist/esm/invoice/data-access-code.js +420 -107
  439. package/dist/esm/invoice/data-access-code.js.map +1 -1
  440. package/dist/esm/invoice/index.d.ts.map +1 -1
  441. package/dist/esm/invoice/index.js +25 -1
  442. package/dist/esm/invoice/index.js.map +1 -1
  443. package/dist/esm/invoice/invoice-assembly-code.d.ts +12 -0
  444. package/dist/esm/invoice/invoice-assembly-code.d.ts.map +1 -0
  445. package/dist/esm/invoice/invoice-assembly-code.js +513 -0
  446. package/dist/esm/invoice/invoice-assembly-code.js.map +1 -0
  447. package/dist/esm/invoice/invoice-html-code.d.ts.map +1 -1
  448. package/dist/esm/invoice/invoice-html-code.js +111 -9
  449. package/dist/esm/invoice/invoice-html-code.js.map +1 -1
  450. package/dist/esm/invoice/pdf-service-client-code.d.ts.map +1 -1
  451. package/dist/esm/invoice/pdf-service-client-code.js +3 -4
  452. package/dist/esm/invoice/pdf-service-client-code.js.map +1 -1
  453. package/dist/esm/nodes/account/account-login.d.ts.map +1 -1
  454. package/dist/esm/nodes/account/account-login.js +4 -3
  455. package/dist/esm/nodes/account/account-login.js.map +1 -1
  456. package/dist/esm/nodes/account/account-signup.d.ts.map +1 -1
  457. package/dist/esm/nodes/account/account-signup.js +7 -4
  458. package/dist/esm/nodes/account/account-signup.js.map +1 -1
  459. package/dist/esm/nodes/ai/ai-select-database-data.d.ts.map +1 -1
  460. package/dist/esm/nodes/ai/ai-select-database-data.js +6 -1
  461. package/dist/esm/nodes/ai/ai-select-database-data.js.map +1 -1
  462. package/dist/esm/nodes/browser/browser-get-push-subscription.d.ts +9 -0
  463. package/dist/esm/nodes/browser/browser-get-push-subscription.d.ts.map +1 -0
  464. package/dist/esm/nodes/browser/browser-get-push-subscription.js +22 -0
  465. package/dist/esm/nodes/browser/browser-get-push-subscription.js.map +1 -0
  466. package/dist/esm/nodes/browser/browser-show-notification.d.ts +10 -0
  467. package/dist/esm/nodes/browser/browser-show-notification.d.ts.map +1 -1
  468. package/dist/esm/nodes/browser/browser-show-notification.js +65 -40
  469. package/dist/esm/nodes/browser/browser-show-notification.js.map +1 -1
  470. package/dist/esm/nodes/browser/browser-subscribe-to-push.d.ts +11 -0
  471. package/dist/esm/nodes/browser/browser-subscribe-to-push.d.ts.map +1 -1
  472. package/dist/esm/nodes/browser/browser-subscribe-to-push.js +21 -31
  473. package/dist/esm/nodes/browser/browser-subscribe-to-push.js.map +1 -1
  474. package/dist/esm/nodes/browser/browser-unsubscribe-from-push.d.ts +8 -0
  475. package/dist/esm/nodes/browser/browser-unsubscribe-from-push.d.ts.map +1 -0
  476. package/dist/esm/nodes/browser/browser-unsubscribe-from-push.js +21 -0
  477. package/dist/esm/nodes/browser/browser-unsubscribe-from-push.js.map +1 -0
  478. package/dist/esm/nodes/browser/push-api-access.d.ts +12 -0
  479. package/dist/esm/nodes/browser/push-api-access.d.ts.map +1 -0
  480. package/dist/esm/nodes/browser/push-api-access.js +13 -0
  481. package/dist/esm/nodes/browser/push-api-access.js.map +1 -0
  482. package/dist/esm/nodes/cart/cart-add-item.d.ts.map +1 -1
  483. package/dist/esm/nodes/cart/cart-add-item.js +174 -10
  484. package/dist/esm/nodes/cart/cart-add-item.js.map +1 -1
  485. package/dist/esm/nodes/cart/cart-clear.d.ts.map +1 -1
  486. package/dist/esm/nodes/cart/cart-clear.js +11 -0
  487. package/dist/esm/nodes/cart/cart-clear.js.map +1 -1
  488. package/dist/esm/nodes/cart/cart-get-total.d.ts.map +1 -1
  489. package/dist/esm/nodes/cart/cart-get-total.js +261 -4
  490. package/dist/esm/nodes/cart/cart-get-total.js.map +1 -1
  491. package/dist/esm/nodes/cart/cart-price-order.d.ts +3 -0
  492. package/dist/esm/nodes/cart/cart-price-order.d.ts.map +1 -0
  493. package/dist/esm/nodes/cart/cart-price-order.js +278 -0
  494. package/dist/esm/nodes/cart/cart-price-order.js.map +1 -0
  495. package/dist/esm/nodes/cart/cart-update-item-quantity.d.ts.map +1 -1
  496. package/dist/esm/nodes/cart/cart-update-item-quantity.js +7 -0
  497. package/dist/esm/nodes/cart/cart-update-item-quantity.js.map +1 -1
  498. package/dist/esm/nodes/data/data-count.d.ts.map +1 -1
  499. package/dist/esm/nodes/data/data-count.js +6 -1
  500. package/dist/esm/nodes/data/data-count.js.map +1 -1
  501. package/dist/esm/nodes/data/data-create-item.d.ts.map +1 -1
  502. package/dist/esm/nodes/data/data-create-item.js +11 -1
  503. package/dist/esm/nodes/data/data-create-item.js.map +1 -1
  504. package/dist/esm/nodes/data/data-delete-item.d.ts.map +1 -1
  505. package/dist/esm/nodes/data/data-delete-item.js +29 -0
  506. package/dist/esm/nodes/data/data-delete-item.js.map +1 -1
  507. package/dist/esm/nodes/data/data-raw-query.d.ts.map +1 -1
  508. package/dist/esm/nodes/data/data-raw-query.js +6 -1
  509. package/dist/esm/nodes/data/data-raw-query.js.map +1 -1
  510. package/dist/esm/nodes/data/data-select.d.ts.map +1 -1
  511. package/dist/esm/nodes/data/data-select.js +6 -1
  512. package/dist/esm/nodes/data/data-select.js.map +1 -1
  513. package/dist/esm/nodes/data/data-update-item.d.ts.map +1 -1
  514. package/dist/esm/nodes/data/data-update-item.js +29 -0
  515. package/dist/esm/nodes/data/data-update-item.js.map +1 -1
  516. package/dist/esm/nodes/ecommerce/ecommerce-generate-invoice.d.ts.map +1 -1
  517. package/dist/esm/nodes/ecommerce/ecommerce-generate-invoice.js +7 -1
  518. package/dist/esm/nodes/ecommerce/ecommerce-generate-invoice.js.map +1 -1
  519. package/dist/esm/nodes/file-storage/file-storage-upload.d.ts.map +1 -1
  520. package/dist/esm/nodes/file-storage/file-storage-upload.js +7 -0
  521. package/dist/esm/nodes/file-storage/file-storage-upload.js.map +1 -1
  522. package/dist/esm/nodes/general/general-custom-js.d.ts.map +1 -1
  523. package/dist/esm/nodes/general/general-custom-js.js +21 -5
  524. package/dist/esm/nodes/general/general-custom-js.js.map +1 -1
  525. package/dist/esm/nodes/index.d.ts.map +1 -1
  526. package/dist/esm/nodes/index.js +9 -4
  527. package/dist/esm/nodes/index.js.map +1 -1
  528. package/dist/esm/nodes/payment/payment-billing-portal.d.ts +3 -0
  529. package/dist/esm/nodes/payment/payment-billing-portal.d.ts.map +1 -0
  530. package/dist/esm/nodes/payment/payment-billing-portal.js +49 -0
  531. package/dist/esm/nodes/payment/payment-billing-portal.js.map +1 -0
  532. package/dist/esm/nodes/payment/payment-charge-user.d.ts.map +1 -1
  533. package/dist/esm/nodes/payment/payment-charge-user.js +227 -360
  534. package/dist/esm/nodes/payment/payment-charge-user.js.map +1 -1
  535. package/dist/esm/nodes/payment/payment-close-checkout.d.ts +3 -0
  536. package/dist/esm/nodes/payment/payment-close-checkout.d.ts.map +1 -0
  537. package/dist/esm/nodes/payment/payment-close-checkout.js +138 -0
  538. package/dist/esm/nodes/payment/payment-close-checkout.js.map +1 -0
  539. package/dist/esm/nodes/payment/payment-ensure-subscription-plan.d.ts +3 -0
  540. package/dist/esm/nodes/payment/payment-ensure-subscription-plan.d.ts.map +1 -0
  541. package/dist/esm/nodes/payment/payment-ensure-subscription-plan.js +64 -0
  542. package/dist/esm/nodes/payment/payment-ensure-subscription-plan.js.map +1 -0
  543. package/dist/esm/nodes/payment/payment-manage-subscription.d.ts +3 -0
  544. package/dist/esm/nodes/payment/payment-manage-subscription.d.ts.map +1 -0
  545. package/dist/esm/nodes/payment/payment-manage-subscription.js +86 -0
  546. package/dist/esm/nodes/payment/payment-manage-subscription.js.map +1 -0
  547. package/dist/esm/nodes/payment/payment-refund.d.ts.map +1 -1
  548. package/dist/esm/nodes/payment/payment-refund.js +50 -404
  549. package/dist/esm/nodes/payment/payment-refund.js.map +1 -1
  550. package/dist/esm/nodes/push/push-send-notification.d.ts +14 -0
  551. package/dist/esm/nodes/push/push-send-notification.d.ts.map +1 -0
  552. package/dist/esm/nodes/push/push-send-notification.js +80 -0
  553. package/dist/esm/nodes/push/push-send-notification.js.map +1 -0
  554. package/dist/esm/payments/drivers/coingate-driver-code.d.ts +16 -0
  555. package/dist/esm/payments/drivers/coingate-driver-code.d.ts.map +1 -0
  556. package/dist/esm/payments/drivers/coingate-driver-code.js +467 -0
  557. package/dist/esm/payments/drivers/coingate-driver-code.js.map +1 -0
  558. package/dist/esm/payments/drivers/mollie-driver-code.d.ts +16 -0
  559. package/dist/esm/payments/drivers/mollie-driver-code.d.ts.map +1 -0
  560. package/dist/esm/payments/drivers/mollie-driver-code.js +619 -0
  561. package/dist/esm/payments/drivers/mollie-driver-code.js.map +1 -0
  562. package/dist/esm/payments/drivers/paddle-driver-code.d.ts +12 -0
  563. package/dist/esm/payments/drivers/paddle-driver-code.d.ts.map +1 -0
  564. package/dist/esm/payments/drivers/paddle-driver-code.js +679 -0
  565. package/dist/esm/payments/drivers/paddle-driver-code.js.map +1 -0
  566. package/dist/esm/payments/drivers/paypal-driver-code.d.ts +12 -0
  567. package/dist/esm/payments/drivers/paypal-driver-code.d.ts.map +1 -0
  568. package/dist/esm/payments/drivers/paypal-driver-code.js +1257 -0
  569. package/dist/esm/payments/drivers/paypal-driver-code.js.map +1 -0
  570. package/dist/esm/payments/drivers/razorpay-driver-code.d.ts +12 -0
  571. package/dist/esm/payments/drivers/razorpay-driver-code.d.ts.map +1 -0
  572. package/dist/esm/payments/drivers/razorpay-driver-code.js +728 -0
  573. package/dist/esm/payments/drivers/razorpay-driver-code.js.map +1 -0
  574. package/dist/esm/payments/drivers/square-driver-code.d.ts +14 -0
  575. package/dist/esm/payments/drivers/square-driver-code.d.ts.map +1 -0
  576. package/dist/esm/payments/drivers/square-driver-code.js +927 -0
  577. package/dist/esm/payments/drivers/square-driver-code.js.map +1 -0
  578. package/dist/esm/payments/drivers/stripe-driver-code.d.ts +12 -0
  579. package/dist/esm/payments/drivers/stripe-driver-code.d.ts.map +1 -0
  580. package/dist/esm/payments/drivers/stripe-driver-code.js +774 -0
  581. package/dist/esm/payments/drivers/stripe-driver-code.js.map +1 -0
  582. package/dist/esm/payments/index.d.ts +66 -0
  583. package/dist/esm/payments/index.d.ts.map +1 -0
  584. package/dist/esm/payments/index.js +164 -0
  585. package/dist/esm/payments/index.js.map +1 -0
  586. package/dist/esm/payments/payment-core-code.d.ts +19 -0
  587. package/dist/esm/payments/payment-core-code.d.ts.map +1 -0
  588. package/dist/esm/payments/payment-core-code.js +418 -0
  589. package/dist/esm/payments/payment-core-code.js.map +1 -0
  590. package/dist/esm/payments/payment-driver-code-map.d.ts +4 -0
  591. package/dist/esm/payments/payment-driver-code-map.d.ts.map +1 -0
  592. package/dist/esm/payments/payment-driver-code-map.js +18 -0
  593. package/dist/esm/payments/payment-driver-code-map.js.map +1 -0
  594. package/dist/esm/payments/payment-drivers-scope.d.ts +35 -0
  595. package/dist/esm/payments/payment-drivers-scope.d.ts.map +1 -0
  596. package/dist/esm/payments/payment-drivers-scope.js +51 -0
  597. package/dist/esm/payments/payment-drivers-scope.js.map +1 -0
  598. package/dist/esm/payments/payment-registry-code.d.ts +8 -0
  599. package/dist/esm/payments/payment-registry-code.d.ts.map +1 -0
  600. package/dist/esm/payments/payment-registry-code.js +37 -0
  601. package/dist/esm/payments/payment-registry-code.js.map +1 -0
  602. package/dist/esm/pg-client-code.d.ts +10 -0
  603. package/dist/esm/pg-client-code.d.ts.map +1 -1
  604. package/dist/esm/pg-client-code.js +25 -0
  605. package/dist/esm/pg-client-code.js.map +1 -1
  606. package/dist/esm/runtime-storage-generator.d.ts +28 -0
  607. package/dist/esm/runtime-storage-generator.d.ts.map +1 -1
  608. package/dist/esm/runtime-storage-generator.js +239 -4
  609. package/dist/esm/runtime-storage-generator.js.map +1 -1
  610. package/dist/esm/secret-collector.d.ts.map +1 -1
  611. package/dist/esm/secret-collector.js +8 -3
  612. package/dist/esm/secret-collector.js.map +1 -1
  613. package/dist/esm/security-scanner.d.ts +10 -1
  614. package/dist/esm/security-scanner.d.ts.map +1 -1
  615. package/dist/esm/security-scanner.js +18 -0
  616. package/dist/esm/security-scanner.js.map +1 -1
  617. package/dist/esm/segment-context-needs.d.ts +38 -0
  618. package/dist/esm/segment-context-needs.d.ts.map +1 -0
  619. package/dist/esm/segment-context-needs.js +125 -0
  620. package/dist/esm/segment-context-needs.js.map +1 -0
  621. package/dist/esm/segment-splitter.d.ts.map +1 -1
  622. package/dist/esm/segment-splitter.js +6 -1
  623. package/dist/esm/segment-splitter.js.map +1 -1
  624. package/dist/esm/segment-trust.d.ts +50 -0
  625. package/dist/esm/segment-trust.d.ts.map +1 -0
  626. package/dist/esm/segment-trust.js +111 -0
  627. package/dist/esm/segment-trust.js.map +1 -0
  628. package/dist/esm/sent-email-log/sent-email-log-code.d.ts +19 -0
  629. package/dist/esm/sent-email-log/sent-email-log-code.d.ts.map +1 -1
  630. package/dist/esm/sent-email-log/sent-email-log-code.js +2 -25
  631. package/dist/esm/sent-email-log/sent-email-log-code.js.map +1 -1
  632. package/dist/esm/server-runtime-code.d.ts +34 -0
  633. package/dist/esm/server-runtime-code.d.ts.map +1 -0
  634. package/dist/esm/server-runtime-code.js +299 -0
  635. package/dist/esm/server-runtime-code.js.map +1 -0
  636. package/dist/esm/session-cookie-resolver.d.ts +3 -78
  637. package/dist/esm/session-cookie-resolver.d.ts.map +1 -1
  638. package/dist/esm/session-cookie-resolver.js +7 -274
  639. package/dist/esm/session-cookie-resolver.js.map +1 -1
  640. package/dist/esm/subscriber-access-route-generator.d.ts +71 -0
  641. package/dist/esm/subscriber-access-route-generator.d.ts.map +1 -0
  642. package/dist/esm/subscriber-access-route-generator.js +292 -0
  643. package/dist/esm/subscriber-access-route-generator.js.map +1 -0
  644. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  645. package/dist/esm/types.d.ts +6 -0
  646. package/dist/esm/types.d.ts.map +1 -1
  647. package/dist/esm/webhook-delivery-lease/index.d.ts +8 -0
  648. package/dist/esm/webhook-delivery-lease/index.d.ts.map +1 -0
  649. package/dist/esm/webhook-delivery-lease/index.js +37 -0
  650. package/dist/esm/webhook-delivery-lease/index.js.map +1 -0
  651. package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-code.d.ts +26 -0
  652. package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-code.d.ts.map +1 -0
  653. package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-code.js +147 -0
  654. package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-code.js.map +1 -0
  655. package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-scope.d.ts +16 -0
  656. package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-scope.d.ts.map +1 -0
  657. package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-scope.js +16 -0
  658. package/dist/esm/webhook-delivery-lease/webhook-delivery-lease-scope.js.map +1 -0
  659. package/dist/esm/webhook-generator.d.ts +1 -1
  660. package/dist/esm/webhook-generator.d.ts.map +1 -1
  661. package/dist/esm/webhook-generator.js +342 -254
  662. package/dist/esm/webhook-generator.js.map +1 -1
  663. package/dist/esm/webhook-signature-verification.d.ts +17 -1
  664. package/dist/esm/webhook-signature-verification.d.ts.map +1 -1
  665. package/dist/esm/webhook-signature-verification.js +179 -25
  666. package/dist/esm/webhook-signature-verification.js.map +1 -1
  667. package/dist/esm/workflow-auth-generator.d.ts +9 -6
  668. package/dist/esm/workflow-auth-generator.d.ts.map +1 -1
  669. package/dist/esm/workflow-auth-generator.js +132 -28
  670. package/dist/esm/workflow-auth-generator.js.map +1 -1
  671. package/dist/esm/workflow-component-plugin.d.ts.map +1 -1
  672. package/dist/esm/workflow-component-plugin.js +65 -28
  673. package/dist/esm/workflow-component-plugin.js.map +1 -1
  674. package/dist/esm/workflow-project-plugin.d.ts +13 -0
  675. package/dist/esm/workflow-project-plugin.d.ts.map +1 -1
  676. package/dist/esm/workflow-project-plugin.js +212 -63
  677. package/dist/esm/workflow-project-plugin.js.map +1 -1
  678. package/package.json +4 -4
  679. package/src/admin-form-hydration.ts +28 -0
  680. package/src/api-route-generator.ts +251 -64
  681. package/src/auth-generator.ts +273 -53
  682. package/src/auth-return/signed-in-destination-code.ts +32 -0
  683. package/src/cart-pricing-preamble.ts +22 -0
  684. package/src/cron-request-verification.ts +79 -0
  685. package/src/custom-node-modules.ts +102 -0
  686. package/src/data-api-route-generator.ts +370 -28
  687. package/src/ecommerce/cart-availability.ts +22 -13
  688. package/src/ecommerce/stock-decrement.ts +13 -1
  689. package/src/executor-generator.ts +212 -19
  690. package/src/index.ts +28 -7
  691. package/src/invoice/api-routes-code.ts +424 -391
  692. package/src/invoice/data-access-code.ts +431 -110
  693. package/src/invoice/index.ts +31 -1
  694. package/src/invoice/invoice-assembly-code.ts +514 -0
  695. package/src/invoice/invoice-html-code.ts +111 -9
  696. package/src/invoice/pdf-service-client-code.ts +3 -4
  697. package/src/nodes/account/account-login.ts +4 -3
  698. package/src/nodes/account/account-signup.ts +7 -4
  699. package/src/nodes/ai/ai-select-database-data.ts +10 -1
  700. package/src/nodes/browser/browser-get-push-subscription.ts +23 -0
  701. package/src/nodes/browser/browser-show-notification.ts +61 -38
  702. package/src/nodes/browser/browser-subscribe-to-push.ts +26 -36
  703. package/src/nodes/browser/browser-unsubscribe-from-push.ts +22 -0
  704. package/src/nodes/browser/push-api-access.ts +20 -0
  705. package/src/nodes/cart/cart-add-item.ts +200 -9
  706. package/src/nodes/cart/cart-clear.ts +11 -0
  707. package/src/nodes/cart/cart-get-total.ts +279 -7
  708. package/src/nodes/cart/cart-price-order.ts +351 -0
  709. package/src/nodes/cart/cart-update-item-quantity.ts +7 -0
  710. package/src/nodes/data/data-count.ts +9 -1
  711. package/src/nodes/data/data-create-item.ts +15 -1
  712. package/src/nodes/data/data-delete-item.ts +32 -0
  713. package/src/nodes/data/data-raw-query.ts +9 -1
  714. package/src/nodes/data/data-select.ts +9 -1
  715. package/src/nodes/data/data-update-item.ts +32 -0
  716. package/src/nodes/ecommerce/ecommerce-generate-invoice.ts +11 -1
  717. package/src/nodes/file-storage/file-storage-upload.ts +8 -0
  718. package/src/nodes/general/general-custom-js.ts +21 -5
  719. package/src/nodes/index.ts +16 -6
  720. package/src/nodes/payment/payment-billing-portal.ts +51 -0
  721. package/src/nodes/payment/payment-charge-user.ts +236 -442
  722. package/src/nodes/payment/payment-close-checkout.ts +137 -0
  723. package/src/nodes/payment/payment-ensure-subscription-plan.ts +66 -0
  724. package/src/nodes/payment/payment-manage-subscription.ts +89 -0
  725. package/src/nodes/payment/payment-refund.ts +52 -467
  726. package/src/nodes/payment-drivers-global.d.ts +13 -0
  727. package/src/nodes/push/push-send-notification.ts +83 -0
  728. package/src/nodes/workflow-utils-global.d.ts +5 -0
  729. package/src/payments/drivers/coingate-driver-code.ts +466 -0
  730. package/src/payments/drivers/mollie-driver-code.ts +618 -0
  731. package/src/payments/drivers/paddle-driver-code.ts +678 -0
  732. package/src/payments/drivers/paypal-driver-code.ts +1256 -0
  733. package/src/payments/drivers/razorpay-driver-code.ts +727 -0
  734. package/src/payments/drivers/square-driver-code.ts +926 -0
  735. package/src/payments/drivers/stripe-driver-code.ts +773 -0
  736. package/src/payments/index.ts +204 -0
  737. package/src/payments/payment-core-code.ts +421 -0
  738. package/src/payments/payment-driver-code-map.ts +19 -0
  739. package/src/payments/payment-drivers-scope.ts +66 -0
  740. package/src/payments/payment-registry-code.ts +38 -0
  741. package/src/pg-client-code.ts +30 -0
  742. package/src/runtime-storage-generator.ts +241 -4
  743. package/src/secret-collector.ts +8 -3
  744. package/src/security-scanner.ts +22 -0
  745. package/src/segment-context-needs.ts +148 -0
  746. package/src/segment-splitter.ts +6 -1
  747. package/src/segment-trust.ts +170 -0
  748. package/src/sent-email-log/sent-email-log-code.ts +2 -32
  749. package/src/server-runtime-code.ts +298 -0
  750. package/src/session-cookie-resolver.ts +9 -277
  751. package/src/subscriber-access-route-generator.ts +351 -0
  752. package/src/types.ts +6 -0
  753. package/src/webhook-delivery-lease/index.ts +44 -0
  754. package/src/webhook-delivery-lease/webhook-delivery-lease-code.ts +151 -0
  755. package/src/webhook-delivery-lease/webhook-delivery-lease-scope.ts +18 -0
  756. package/src/webhook-generator.ts +359 -260
  757. package/src/webhook-signature-verification.ts +180 -25
  758. package/src/workflow-auth-generator.ts +137 -28
  759. package/src/workflow-component-plugin.ts +77 -20
  760. package/src/workflow-project-plugin.ts +247 -44
  761. package/dist/cjs/nodes/payment/payment-cancel-plan.d.ts +0 -3
  762. package/dist/cjs/nodes/payment/payment-cancel-plan.d.ts.map +0 -1
  763. package/dist/cjs/nodes/payment/payment-cancel-plan.js +0 -33
  764. package/dist/cjs/nodes/payment/payment-cancel-plan.js.map +0 -1
  765. package/dist/cjs/nodes/payment/payment-create-subscription.d.ts +0 -3
  766. package/dist/cjs/nodes/payment/payment-create-subscription.d.ts.map +0 -1
  767. package/dist/cjs/nodes/payment/payment-create-subscription.js +0 -41
  768. package/dist/cjs/nodes/payment/payment-create-subscription.js.map +0 -1
  769. package/dist/cjs/nodes/payment/payment-subscribe-to-plan.d.ts +0 -3
  770. package/dist/cjs/nodes/payment/payment-subscribe-to-plan.d.ts.map +0 -1
  771. package/dist/cjs/nodes/payment/payment-subscribe-to-plan.js +0 -45
  772. package/dist/cjs/nodes/payment/payment-subscribe-to-plan.js.map +0 -1
  773. package/dist/esm/nodes/payment/payment-cancel-plan.d.ts +0 -3
  774. package/dist/esm/nodes/payment/payment-cancel-plan.d.ts.map +0 -1
  775. package/dist/esm/nodes/payment/payment-cancel-plan.js +0 -30
  776. package/dist/esm/nodes/payment/payment-cancel-plan.js.map +0 -1
  777. package/dist/esm/nodes/payment/payment-create-subscription.d.ts +0 -3
  778. package/dist/esm/nodes/payment/payment-create-subscription.d.ts.map +0 -1
  779. package/dist/esm/nodes/payment/payment-create-subscription.js +0 -38
  780. package/dist/esm/nodes/payment/payment-create-subscription.js.map +0 -1
  781. package/dist/esm/nodes/payment/payment-subscribe-to-plan.d.ts +0 -3
  782. package/dist/esm/nodes/payment/payment-subscribe-to-plan.d.ts.map +0 -1
  783. package/dist/esm/nodes/payment/payment-subscribe-to-plan.js +0 -42
  784. package/dist/esm/nodes/payment/payment-subscribe-to-plan.js.map +0 -1
  785. package/src/nodes/payment/payment-cancel-plan.ts +0 -33
  786. package/src/nodes/payment/payment-create-subscription.ts +0 -42
  787. package/src/nodes/payment/payment-subscribe-to-plan.ts +0 -46
@@ -0,0 +1,1163 @@
1
+ import { loadPaymentDrivers } from './_helpers/load-payment-drivers'
2
+ import { createFakeStripe } from './_helpers/fake-stripe'
3
+ import { FetchCall, FakeAnswer, withEnv, withFetch } from './_helpers/fake-fetch'
4
+
5
+ /**
6
+ * `closeCheckout` and `findCheckouts` on every driver, and the composition
7
+ * that closes every checkout an order has open (`core.closeOrderCheckouts`),
8
+ * EXECUTED against each provider's documented answers.
9
+ *
10
+ * Closing is what stops a page the store opened from taking an order's money
11
+ * once the order is settled or cancelled another way: `closed` means the page
12
+ * takes no more money, `paid` / `confirming` that it took (or is taking) it,
13
+ * `open` that the provider cannot close it early (with when it runs out), and
14
+ * an `error` that the provider could not be asked.
15
+ */
16
+
17
+ const PLACED_AT = '2026-09-28T10:00:00.000Z'
18
+ const PLACED_MS = Date.parse(PLACED_AT)
19
+
20
+ const route =
21
+ (routes: Array<[string, string, FakeAnswer]>, fallback: FakeAnswer = { status: 404, body: {} }) =>
22
+ (call: FetchCall): FakeAnswer => {
23
+ const match = routes.find(
24
+ ([method, path]) =>
25
+ call.method === method && call.url.replace(/^https:\/\/[^/]+/, '').startsWith(path)
26
+ )
27
+ return match ? match[2] : fallback
28
+ }
29
+
30
+ const trail = (calls: FetchCall[]) =>
31
+ calls.map((call) => call.method + ' ' + call.url.replace(/^https:\/\/[^/]+/, ''))
32
+
33
+ describe('core.closeOrderCheckouts', () => {
34
+ const { core } = loadPaymentDrivers({ ids: [] })
35
+ const fakeDriver = (
36
+ states: Record<string, unknown>,
37
+ found: unknown = { references: Object.keys(states) }
38
+ ) => {
39
+ const closed: string[] = []
40
+ return {
41
+ closed,
42
+ driver: {
43
+ closeCheckout: async ({ reference }: { reference: string }) => {
44
+ closed.push(reference)
45
+ return states[reference]
46
+ },
47
+ findCheckouts: async () => found,
48
+ },
49
+ }
50
+ }
51
+
52
+ it('closes the checkout the order recorded, without searching', async () => {
53
+ const { driver, closed } = fakeDriver(
54
+ { cs_1: { state: 'closed' } },
55
+ { error: 'never searched' }
56
+ )
57
+ expect(await core.closeOrderCheckouts(driver, { reference: 'cs_1' })).toEqual({
58
+ outcome: 'closed',
59
+ openUntil: '',
60
+ checkoutUrl: '',
61
+ reference: '',
62
+ })
63
+ expect(closed).toEqual(['cs_1'])
64
+ })
65
+
66
+ it('closes every checkout the provider finds for an order that recorded none', async () => {
67
+ const { driver, closed } = fakeDriver({
68
+ a: { state: 'closed' },
69
+ b: { state: 'closed' },
70
+ })
71
+ const result = await core.closeOrderCheckouts(driver, { orderId: 'o-1', placedAt: PLACED_AT })
72
+ expect(result.outcome).toBe('closed')
73
+ expect(closed).toEqual(['a', 'b'])
74
+ })
75
+
76
+ it('answers none when the provider finds nothing', async () => {
77
+ const { driver } = fakeDriver({}, { references: [] })
78
+ expect(
79
+ (await core.closeOrderCheckouts(driver, { orderId: 'o-1', placedAt: PLACED_AT })).outcome
80
+ ).toBe('none')
81
+ })
82
+
83
+ it('answers the most binding state: paid over confirming over open over closed', async () => {
84
+ const { driver } = fakeDriver({
85
+ a: { state: 'open', openUntil: '2026-09-28T11:00:00.000Z', checkoutUrl: 'https://pay/a' },
86
+ b: { state: 'paid' },
87
+ c: { state: 'closed' },
88
+ })
89
+ expect(
90
+ (await core.closeOrderCheckouts(driver, { orderId: 'o-1', placedAt: PLACED_AT })).outcome
91
+ ).toBe('paid')
92
+ })
93
+
94
+ it('keeps the latest time an uncloseable page runs out, and the page to reopen', async () => {
95
+ const { driver } = fakeDriver({
96
+ a: { state: 'open', openUntil: '2026-09-28T11:00:00.000Z', checkoutUrl: 'https://pay/a' },
97
+ b: { state: 'open', openUntil: '2026-09-28T12:00:00.000Z', checkoutUrl: '' },
98
+ })
99
+ expect(await core.closeOrderCheckouts(driver, { orderId: 'o-1', placedAt: PLACED_AT })).toEqual(
100
+ {
101
+ outcome: 'open',
102
+ openUntil: '2026-09-28T12:00:00.000Z',
103
+ checkoutUrl: 'https://pay/a',
104
+ reference: 'a',
105
+ }
106
+ )
107
+ })
108
+
109
+ it('never names a time when one open page runs out at a time nobody knows', async () => {
110
+ const { driver } = fakeDriver({
111
+ a: { state: 'open', openUntil: '2026-09-28T11:00:00.000Z' },
112
+ b: { state: 'open', openUntil: '' },
113
+ })
114
+ expect(
115
+ (await core.closeOrderCheckouts(driver, { orderId: 'o-1', placedAt: PLACED_AT })).openUntil
116
+ ).toBe('')
117
+ })
118
+
119
+ it('reports a provider that could not be asked as an error, never as closed', async () => {
120
+ const { driver } = fakeDriver({
121
+ a: { state: 'closed' },
122
+ b: { state: '', error: 'Stripe is down' },
123
+ })
124
+ expect(await core.closeOrderCheckouts(driver, { orderId: 'o-1', placedAt: PLACED_AT })).toEqual(
125
+ {
126
+ outcome: '',
127
+ openUntil: '',
128
+ checkoutUrl: '',
129
+ error: 'Stripe is down',
130
+ }
131
+ )
132
+ const { driver: unsearchable } = fakeDriver({}, { error: 'search failed' })
133
+ expect(
134
+ (await core.closeOrderCheckouts(unsearchable, { orderId: 'o-1', placedAt: PLACED_AT })).error
135
+ ).toBe('search failed')
136
+ })
137
+
138
+ it('waits out a provider that cannot be searched until its pages have run out', async () => {
139
+ const future = new Date(Date.now() + 60 * 60 * 1000).toISOString()
140
+ const { driver } = fakeDriver({}, { searchable: false, openUntil: future })
141
+ expect(await core.closeOrderCheckouts(driver, { orderId: 'o-1', placedAt: PLACED_AT })).toEqual(
142
+ {
143
+ outcome: 'open',
144
+ openUntil: future,
145
+ checkoutUrl: '',
146
+ }
147
+ )
148
+ const { driver: expired } = fakeDriver({}, { searchable: false, openUntil: PLACED_AT })
149
+ expect(
150
+ (await core.closeOrderCheckouts(expired, { orderId: 'o-1', placedAt: PLACED_AT })).outcome
151
+ ).toBe('none')
152
+ })
153
+
154
+ it('searches around the time the order was placed', () => {
155
+ expect(core.searchWindow(PLACED_AT)).toEqual({
156
+ from: PLACED_MS - 10 * 60 * 1000,
157
+ to: PLACED_MS + 60 * 60 * 1000,
158
+ })
159
+ expect(core.searchWindow('')).toBeNull()
160
+ })
161
+ })
162
+
163
+ describe('Stripe', () => {
164
+ const KEY = { STRIPE_SECRET_KEY: 'sk_test_1' }
165
+ const load = (script: Record<string, (params: any) => unknown>) => {
166
+ const fake = createFakeStripe(script)
167
+ return {
168
+ stripe: loadPaymentDrivers({ ids: ['stripe'], stripe: fake.FakeStripe }).get('stripe'),
169
+ calls: fake.calls,
170
+ }
171
+ }
172
+
173
+ it('expires an open session', async () => {
174
+ const { stripe, calls } = load({
175
+ 'checkout.sessions.retrieve': () => ({
176
+ status: 'open',
177
+ url: 'https://checkout.stripe.com/c/1',
178
+ }),
179
+ 'checkout.sessions.expire': () => ({ status: 'expired' }),
180
+ })
181
+ expect(await withEnv(KEY, () => stripe.closeCheckout({ reference: 'cs_1' }))).toEqual({
182
+ state: 'closed',
183
+ checkoutUrl: '',
184
+ openUntil: '',
185
+ })
186
+ expect(calls.map((call) => call.method)).toEqual([
187
+ 'checkout.sessions.retrieve',
188
+ 'checkout.sessions.expire',
189
+ ])
190
+ })
191
+
192
+ it('leaves a completed session alone and answers what it took', async () => {
193
+ for (const [session, state] of [
194
+ [{ status: 'complete', payment_status: 'paid' }, 'paid'],
195
+ [{ status: 'complete', payment_status: 'unpaid' }, 'confirming'],
196
+ ] as const) {
197
+ const { stripe, calls } = load({ 'checkout.sessions.retrieve': () => session })
198
+ expect((await withEnv(KEY, () => stripe.closeCheckout({ reference: 'cs_1' }))).state).toBe(
199
+ state
200
+ )
201
+ expect(calls.map((call) => call.method)).toEqual(['checkout.sessions.retrieve'])
202
+ }
203
+ })
204
+
205
+ it('reads a completed unpaid session by its PaymentIntent, failed as closed', async () => {
206
+ for (const [intentStatus, state] of [
207
+ ['processing', 'confirming'],
208
+ ['requires_payment_method', 'closed'],
209
+ ['canceled', 'closed'],
210
+ ['succeeded', 'paid'],
211
+ ]) {
212
+ const { stripe, calls } = load({
213
+ 'checkout.sessions.retrieve': () => ({
214
+ status: 'complete',
215
+ payment_status: 'unpaid',
216
+ payment_intent: 'pi_1',
217
+ }),
218
+ 'paymentIntents.retrieve': () => ({ id: 'pi_1', status: intentStatus }),
219
+ })
220
+ expect((await withEnv(KEY, () => stripe.closeCheckout({ reference: 'cs_1' }))).state).toBe(
221
+ state
222
+ )
223
+ expect(calls.map((call) => call.method)).toEqual([
224
+ 'checkout.sessions.retrieve',
225
+ 'paymentIntents.retrieve',
226
+ ])
227
+ }
228
+ })
229
+
230
+ it('answers a session the buyer finished paying between the read and the expiry as paid', async () => {
231
+ let reads = 0
232
+ const { stripe } = load({
233
+ 'checkout.sessions.retrieve': () =>
234
+ reads++ === 0
235
+ ? { status: 'open', url: 'https://x' }
236
+ : { status: 'complete', payment_status: 'paid' },
237
+ 'checkout.sessions.expire': () => {
238
+ throw new Error('Only Checkout Sessions with a status of open can be expired.')
239
+ },
240
+ })
241
+ expect((await withEnv(KEY, () => stripe.closeCheckout({ reference: 'cs_1' }))).state).toBe(
242
+ 'paid'
243
+ )
244
+ })
245
+
246
+ it('finds the sessions opened for an order around the time it was placed', async () => {
247
+ const pages = [
248
+ {
249
+ data: [
250
+ { id: 'cs_a', metadata: { orderId: 'o-1' } },
251
+ { id: 'cs_b', metadata: { orderId: 'o-2' } },
252
+ ],
253
+ has_more: true,
254
+ },
255
+ { data: [{ id: 'cs_c', metadata: { orderId: 'o-1' } }], has_more: false },
256
+ ]
257
+ let page = 0
258
+ const { stripe, calls } = load({ 'checkout.sessions.list': () => pages[page++] })
259
+ expect(
260
+ await withEnv(KEY, () => stripe.findCheckouts({ orderId: 'o-1', placedAt: PLACED_AT }))
261
+ ).toEqual({ references: ['cs_a', 'cs_c'] })
262
+ expect(calls[0].params).toEqual({
263
+ created: { gte: PLACED_MS / 1000 - 600, lte: PLACED_MS / 1000 + 3600 },
264
+ limit: 100,
265
+ })
266
+ expect((calls[1].params as { starting_after: string }).starting_after).toBe('cs_b')
267
+ })
268
+
269
+ it('refuses a search that would need more pages than it reads', async () => {
270
+ const { stripe } = load({
271
+ 'checkout.sessions.list': () => ({ data: [{ id: 'cs_x', metadata: {} }], has_more: true }),
272
+ })
273
+ const result = await withEnv(KEY, () =>
274
+ stripe.findCheckouts({ orderId: 'o-1', placedAt: PLACED_AT })
275
+ )
276
+ expect(result.error).toMatch(/more checkouts/)
277
+ })
278
+ })
279
+
280
+ describe('PayPal', () => {
281
+ const paypal = loadPaymentDrivers({ ids: ['paypal'] }).get('paypal')
282
+ const ENV = { PAYPAL_CLIENT_ID: 'client-id-1', PAYPAL_CLIENT_SECRET: 'client-secret-1' }
283
+ const token: [string, string, FakeAnswer] = [
284
+ 'POST',
285
+ '/v1/oauth2/token',
286
+ { status: 200, body: { access_token: 'token' } },
287
+ ]
288
+ const order = (body: Record<string, unknown>): [string, string, FakeAnswer] => [
289
+ 'GET',
290
+ '/v2/checkout/orders/ORDER-1',
291
+ { status: 200, body: { id: 'ORDER-1', ...body } },
292
+ ]
293
+ const CUSTOM_ID = JSON.stringify({ orderId: 'o-1', orderNumber: 'ORD-1' })
294
+
295
+ it('marks an order nobody approved closed, keeping the store order it names', async () => {
296
+ await withEnv(ENV, () =>
297
+ withFetch(
298
+ route([
299
+ token,
300
+ order({
301
+ status: 'CREATED',
302
+ purchase_units: [{ reference_id: 'default', custom_id: CUSTOM_ID }],
303
+ }),
304
+ ['PATCH', '/v2/checkout/orders/ORDER-1', { status: 204, body: null }],
305
+ ]),
306
+ async (calls) => {
307
+ expect(await paypal.closeCheckout({ reference: 'ORDER-1' })).toEqual({
308
+ state: 'closed',
309
+ checkoutUrl: '',
310
+ openUntil: '',
311
+ })
312
+ const patch = calls.find((call) => call.method === 'PATCH')!
313
+ expect(patch.json).toEqual([
314
+ {
315
+ op: 'replace',
316
+ path: "/purchase_units/@reference_id=='default'/custom_id",
317
+ value: JSON.stringify({ orderId: 'o-1', orderNumber: 'ORD-1', closed: true }),
318
+ },
319
+ ])
320
+ }
321
+ )
322
+ )
323
+ })
324
+
325
+ it('adds the mark to an order that carried no custom id', async () => {
326
+ await withEnv(ENV, () =>
327
+ withFetch(
328
+ route([
329
+ token,
330
+ order({ status: 'CREATED', purchase_units: [{}] }),
331
+ ['PATCH', '/v2/checkout/orders/ORDER-1', { status: 204, body: null }],
332
+ ]),
333
+ async (calls) => {
334
+ await paypal.closeCheckout({ reference: 'ORDER-1' })
335
+ expect(calls.find((call) => call.method === 'PATCH')!.json[0].op).toBe('add')
336
+ }
337
+ )
338
+ )
339
+ })
340
+
341
+ it('answers a completed order by its capture, marking nothing', async () => {
342
+ const captured = (captureStatus: string) => ({
343
+ status: 'COMPLETED',
344
+ purchase_units: [{ payments: { captures: [{ id: 'CAP-1', status: captureStatus }] } }],
345
+ })
346
+ for (const [body, state] of [
347
+ [captured('COMPLETED'), 'paid'],
348
+ [captured('PENDING'), 'confirming'],
349
+ // PayPal completes an order whose capture it declined: no money moved.
350
+ [captured('DECLINED'), 'closed'],
351
+ [{ status: 'COMPLETED' }, 'confirming'],
352
+ [{ status: 'VOIDED' }, 'closed'],
353
+ ] as const) {
354
+ await withEnv(ENV, () =>
355
+ withFetch(route([token, order(body)]), async (calls) => {
356
+ expect((await paypal.closeCheckout({ reference: 'ORDER-1' })).state).toBe(state)
357
+ expect(calls.some((call) => call.method === 'PATCH')).toBe(false)
358
+ })
359
+ )
360
+ }
361
+ })
362
+
363
+ // A buyer who approved on PayPal's page but whose capture never ran must not
364
+ // be able to pay once the merchant settled or cancelled the order.
365
+ it('marks an order the buyer approved but the store never captured closed, so no capture takes it', async () => {
366
+ let marked: unknown = null
367
+ const approved = () => ({
368
+ id: 'ORDER-1',
369
+ status: 'APPROVED',
370
+ purchase_units: [
371
+ { reference_id: 'default', custom_id: marked ? (marked as string) : CUSTOM_ID },
372
+ ],
373
+ })
374
+ await withEnv(ENV, () =>
375
+ withFetch(
376
+ (call) => {
377
+ const path = call.url.replace(/^https:\/\/[^/]+/, '')
378
+ if (path === '/v1/oauth2/token') {
379
+ return { status: 200, body: { access_token: 'token' } }
380
+ }
381
+ if (call.method === 'PATCH' && path === '/v2/checkout/orders/ORDER-1') {
382
+ marked = call.json[0].value
383
+ return { status: 204, body: null }
384
+ }
385
+ if (call.method === 'GET' && path === '/v2/checkout/orders/ORDER-1') {
386
+ return { status: 200, body: approved() }
387
+ }
388
+ return { status: 500, body: {} }
389
+ },
390
+ async (calls) => {
391
+ expect(await paypal.closeCheckout({ reference: 'ORDER-1' })).toEqual({
392
+ state: 'closed',
393
+ checkoutUrl: '',
394
+ openUntil: '',
395
+ })
396
+ expect(marked).toBe(
397
+ JSON.stringify({ orderId: 'o-1', orderNumber: 'ORD-1', closed: true })
398
+ )
399
+ // The buyer's return, or the approval webhook, arrives late: refused.
400
+ expect(await paypal.confirmReturn({ query: { token: 'ORDER-1' } })).toMatchObject({
401
+ ok: false,
402
+ retryable: false,
403
+ closed: true,
404
+ })
405
+ expect(calls.some((call) => call.url.endsWith('/capture'))).toBe(false)
406
+ }
407
+ )
408
+ )
409
+ })
410
+
411
+ it('never answers closed for an approved order PayPal would not let it mark', async () => {
412
+ const approved = {
413
+ status: 'APPROVED',
414
+ purchase_units: [{ reference_id: 'default', custom_id: CUSTOM_ID }],
415
+ }
416
+ const refusal: [string, string, FakeAnswer] = [
417
+ 'PATCH',
418
+ '/v2/checkout/orders/ORDER-1',
419
+ { status: 422, body: { details: [{ issue: 'UNPROCESSABLE_ENTITY' }] } },
420
+ ]
421
+ await withEnv(ENV, () =>
422
+ withFetch(route([token, order(approved), refusal]), async () => {
423
+ expect(await paypal.closeCheckout({ reference: 'ORDER-1' })).toEqual({
424
+ state: '',
425
+ error: 'UNPROCESSABLE_ENTITY',
426
+ })
427
+ })
428
+ )
429
+ })
430
+
431
+ it('leaves an order waiting on a step at PayPal open until it runs out when PayPal refuses the mark', async () => {
432
+ const waiting = {
433
+ status: 'PAYER_ACTION_REQUIRED',
434
+ create_time: PLACED_AT,
435
+ purchase_units: [{ reference_id: 'default', custom_id: CUSTOM_ID }],
436
+ links: [
437
+ { rel: 'payer-action', href: 'https://www.sandbox.paypal.com/checkoutnow?token=ORDER-1' },
438
+ ],
439
+ }
440
+ await withEnv(ENV, () =>
441
+ withFetch(
442
+ route([
443
+ token,
444
+ order(waiting),
445
+ [
446
+ 'PATCH',
447
+ '/v2/checkout/orders/ORDER-1',
448
+ { status: 422, body: { name: 'UNPROCESSABLE_ENTITY' } },
449
+ ],
450
+ ]),
451
+ async () => {
452
+ expect(await paypal.closeCheckout({ reference: 'ORDER-1' })).toEqual({
453
+ state: 'open',
454
+ checkoutUrl: 'https://www.sandbox.paypal.com/checkoutnow?token=ORDER-1',
455
+ openUntil: new Date(PLACED_MS + 78 * 60 * 60 * 1000).toISOString(),
456
+ })
457
+ }
458
+ )
459
+ )
460
+ })
461
+
462
+ it('never captures an order the store closed, nor reopens it', async () => {
463
+ const closedOrder = order({
464
+ status: 'APPROVED',
465
+ purchase_units: [{ custom_id: JSON.stringify({ orderId: 'o-1', closed: true }) }],
466
+ })
467
+ await withEnv(ENV, () =>
468
+ withFetch(route([token, closedOrder]), async (calls) => {
469
+ const capture = await paypal.confirmReturn({ query: { token: 'ORDER-1' } })
470
+ expect(capture).toMatchObject({ handled: true, ok: false, retryable: false, closed: true })
471
+ expect(calls.some((call) => call.url.endsWith('/capture'))).toBe(false)
472
+ expect(await paypal.inspectCheckout({ reference: 'ORDER-1' })).toEqual({
473
+ state: 'closed',
474
+ checkoutUrl: '',
475
+ })
476
+ })
477
+ )
478
+ })
479
+
480
+ // PayPal cancels only an ACTIVE or SUSPENDED subscription.
481
+ it('says how long the page of a subscription nobody approved may stay open, cancelling nothing', async () => {
482
+ await withEnv(ENV, () =>
483
+ withFetch(
484
+ route([
485
+ token,
486
+ [
487
+ 'GET',
488
+ '/v1/billing/subscriptions/I-1',
489
+ {
490
+ status: 200,
491
+ body: { id: 'I-1', status: 'APPROVAL_PENDING', create_time: PLACED_AT },
492
+ },
493
+ ],
494
+ ]),
495
+ async (calls) => {
496
+ expect(await paypal.closeCheckout({ reference: 'I-1' })).toEqual({
497
+ state: 'open',
498
+ checkoutUrl: '',
499
+ openUntil: new Date(PLACED_MS + 78 * 60 * 60 * 1000).toISOString(),
500
+ })
501
+ expect(trail(calls)).toEqual([
502
+ 'POST /v1/oauth2/token',
503
+ 'GET /v1/billing/subscriptions/I-1',
504
+ ])
505
+ }
506
+ )
507
+ )
508
+ })
509
+
510
+ // 6 hours to send the buyer (up to 72 on some accounts), then 6 to approve and capture.
511
+ it('cannot be searched: the order placed is waited out for the longest a PayPal order lives', async () => {
512
+ expect(await paypal.findCheckouts({ orderId: 'o-1', placedAt: PLACED_AT })).toEqual({
513
+ searchable: false,
514
+ openUntil: new Date(PLACED_MS + 78 * 60 * 60 * 1000).toISOString(),
515
+ })
516
+ })
517
+ })
518
+
519
+ describe('Mollie', () => {
520
+ const mollie = loadPaymentDrivers({ ids: ['mollie'] }).get('mollie')
521
+ const ENV = { MOLLIE_API_KEY: 'test_key' }
522
+ const payment = (body: Record<string, unknown>): [string, string, FakeAnswer] => [
523
+ 'GET',
524
+ '/v2/payments/tr_1',
525
+ { status: 200, body: { id: 'tr_1', ...body } },
526
+ ]
527
+
528
+ it('cancels an open payment Mollie says is cancelable', async () => {
529
+ await withEnv(ENV, () =>
530
+ withFetch(
531
+ route([
532
+ payment({ status: 'open', isCancelable: true }),
533
+ ['DELETE', '/v2/payments/tr_1', { status: 200, body: { status: 'canceled' } }],
534
+ ]),
535
+ async (calls) => {
536
+ expect((await mollie.closeCheckout({ reference: 'tr_1' })).state).toBe('closed')
537
+ expect(trail(calls)).toEqual(['GET /v2/payments/tr_1', 'DELETE /v2/payments/tr_1'])
538
+ }
539
+ )
540
+ )
541
+ })
542
+
543
+ it('says until when an open payment it cannot cancel stays payable', async () => {
544
+ await withEnv(ENV, () =>
545
+ withFetch(
546
+ route([
547
+ payment({
548
+ status: 'open',
549
+ isCancelable: false,
550
+ expiresAt: '2026-09-28T10:15:00+00:00',
551
+ _links: { checkout: { href: 'https://www.mollie.com/checkout/1' } },
552
+ }),
553
+ ]),
554
+ async (calls) => {
555
+ expect(await mollie.closeCheckout({ reference: 'tr_1' })).toEqual({
556
+ state: 'open',
557
+ checkoutUrl: 'https://www.mollie.com/checkout/1',
558
+ openUntil: '2026-09-28T10:15:00+00:00',
559
+ })
560
+ expect(calls.some((call) => call.method === 'DELETE')).toBe(false)
561
+ }
562
+ )
563
+ )
564
+ })
565
+
566
+ it('reads a paid payment as paid and a pending one as confirming', async () => {
567
+ for (const [status, state] of [
568
+ ['paid', 'paid'],
569
+ ['pending', 'confirming'],
570
+ ['expired', 'closed'],
571
+ ]) {
572
+ await withEnv(ENV, () =>
573
+ withFetch(route([payment({ status })]), async () => {
574
+ expect((await mollie.closeCheckout({ reference: 'tr_1' })).state).toBe(state)
575
+ })
576
+ )
577
+ }
578
+ })
579
+
580
+ it('finds the payments opened for an order, reading back until it passes the time it was placed', async () => {
581
+ const page1 = {
582
+ _embedded: {
583
+ payments: [
584
+ { id: 'tr_new', createdAt: '2026-09-28T12:00:00+00:00', metadata: { orderId: 'o-2' } },
585
+ { id: 'tr_a', createdAt: '2026-09-28T10:00:05+00:00', metadata: { orderId: 'o-1' } },
586
+ ],
587
+ },
588
+ _links: { next: { href: 'https://api.mollie.com/v2/payments?from=tr_b&limit=250' } },
589
+ }
590
+ const page2 = {
591
+ _embedded: {
592
+ payments: [
593
+ { id: 'tr_b', createdAt: '2026-09-28T09:55:00+00:00', metadata: { orderId: 'o-1' } },
594
+ { id: 'tr_old', createdAt: '2026-09-27T09:00:00+00:00', metadata: { orderId: 'o-1' } },
595
+ ],
596
+ },
597
+ _links: { next: { href: 'https://api.mollie.com/v2/payments?from=tr_z&limit=250' } },
598
+ }
599
+ await withEnv(ENV, () =>
600
+ withFetch(
601
+ (call) => ({ status: 200, body: call.url.includes('from=tr_b') ? page2 : page1 }),
602
+ async (calls) => {
603
+ expect(await mollie.findCheckouts({ orderId: 'o-1', placedAt: PLACED_AT })).toEqual({
604
+ references: ['tr_a', 'tr_b'],
605
+ })
606
+ expect(trail(calls)).toEqual([
607
+ 'GET /v2/payments?limit=250',
608
+ 'GET /v2/payments?from=tr_b&limit=250',
609
+ ])
610
+ }
611
+ )
612
+ )
613
+ })
614
+ })
615
+
616
+ describe('Razorpay', () => {
617
+ const razorpay = loadPaymentDrivers({ ids: ['razorpay'] }).get('razorpay')
618
+ const ENV = { RAZORPAY_KEY_ID: 'rzp_test_1', RAZORPAY_KEY_SECRET: 'secret' }
619
+
620
+ it('cancels a payment link still taking money, and a subscription nobody authorised', async () => {
621
+ for (const [reference, path] of [
622
+ ['plink_1', '/v1/payment_links/plink_1'],
623
+ ['sub_1', '/v1/subscriptions/sub_1'],
624
+ ]) {
625
+ await withEnv(ENV, () =>
626
+ withFetch(
627
+ route([
628
+ ['GET', path, { status: 200, body: { id: reference, status: 'created' } }],
629
+ ['POST', path + '/cancel', { status: 200, body: { status: 'cancelled' } }],
630
+ ]),
631
+ async (calls) => {
632
+ expect((await razorpay.closeCheckout({ reference })).state).toBe('closed')
633
+ expect(trail(calls)).toEqual(['GET ' + path, 'POST ' + path + '/cancel'])
634
+ }
635
+ )
636
+ )
637
+ }
638
+ })
639
+
640
+ it('reads a paid link, and an authorised subscription, as paid', async () => {
641
+ for (const [reference, path, status] of [
642
+ ['plink_1', '/v1/payment_links/plink_1', 'paid'],
643
+ ['sub_1', '/v1/subscriptions/sub_1', 'active'],
644
+ ]) {
645
+ await withEnv(ENV, () =>
646
+ withFetch(route([['GET', path, { status: 200, body: { status } }]]), async () => {
647
+ expect((await razorpay.closeCheckout({ reference })).state).toBe('paid')
648
+ })
649
+ )
650
+ }
651
+ })
652
+
653
+ it('finds the link the order placed by its reference, then each one opened again after it', async () => {
654
+ const links: Record<string, string> = {
655
+ 'o-1': 'plink_1',
656
+ 'o-1-1': 'plink_2',
657
+ 'o-1-2': 'plink_3',
658
+ }
659
+ await withEnv(ENV, () =>
660
+ withFetch(
661
+ (call) => {
662
+ const reference = new URL(call.url).searchParams.get('reference_id') || ''
663
+ return {
664
+ status: 200,
665
+ body: { payment_links: links[reference] ? [{ id: links[reference] }] : [] },
666
+ }
667
+ },
668
+ async (calls) => {
669
+ expect(await razorpay.findCheckouts({ orderId: 'o-1', placedAt: PLACED_AT })).toEqual({
670
+ references: ['plink_1', 'plink_2', 'plink_3'],
671
+ })
672
+ // The numbers are taken in turn: the first one no link carries ends the search.
673
+ expect(trail(calls)).toEqual([
674
+ 'GET /v1/payment_links?reference_id=o-1',
675
+ 'GET /v1/payment_links?reference_id=o-1-1',
676
+ 'GET /v1/payment_links?reference_id=o-1-2',
677
+ 'GET /v1/payment_links?reference_id=o-1-3',
678
+ ])
679
+ }
680
+ )
681
+ )
682
+ })
683
+
684
+ it('stops at twenty links opened again, and reports a lookup Razorpay refused', async () => {
685
+ await withEnv(ENV, () =>
686
+ withFetch(
687
+ () => ({ status: 200, body: { payment_links: [{ id: 'plink_x' }] } }),
688
+ async (calls) => {
689
+ const found = await razorpay.findCheckouts({ orderId: 'o-1', placedAt: PLACED_AT })
690
+ expect(found.references).toHaveLength(21)
691
+ expect(calls).toHaveLength(21)
692
+ }
693
+ )
694
+ )
695
+ await withEnv(ENV, () =>
696
+ withFetch(
697
+ () => ({ status: 500, body: { error: { description: 'Server error' } } }),
698
+ async () => {
699
+ expect(await razorpay.findCheckouts({ orderId: 'o-1', placedAt: PLACED_AT })).toEqual({
700
+ error: 'Server error',
701
+ })
702
+ }
703
+ )
704
+ )
705
+ })
706
+ })
707
+
708
+ describe('Square', () => {
709
+ const square = loadPaymentDrivers({ ids: ['square'] }).get('square')
710
+ const ENV = { SQUARE_ACCESS_TOKEN: 'sq-token', SQUARE_LOCATION_ID: 'LOC1' }
711
+ const locations: [string, string, FakeAnswer] = [
712
+ 'GET',
713
+ '/v2/locations',
714
+ { status: 200, body: {} },
715
+ ]
716
+ const openOrder: [string, string, FakeAnswer] = [
717
+ 'GET',
718
+ '/v2/orders/SQ1',
719
+ { status: 200, body: { order: { id: 'SQ1', state: 'OPEN', version: 3, location_id: 'LOC1' } } },
720
+ ]
721
+
722
+ it('deletes the payment link, which cancels the order with it', async () => {
723
+ await withEnv(ENV, () =>
724
+ withFetch(
725
+ route([
726
+ locations,
727
+ openOrder,
728
+ ['DELETE', '/v2/online-checkout/payment-links/PL1', { status: 200, body: {} }],
729
+ ['PUT', '/v2/orders/SQ1', { status: 200, body: { order: { state: 'CANCELED' } } }],
730
+ ]),
731
+ async (calls) => {
732
+ expect((await square.closeCheckout({ reference: 'SQ1:PL1' })).state).toBe('closed')
733
+ expect(calls.some((call) => call.method === 'PUT')).toBe(false)
734
+ }
735
+ )
736
+ )
737
+ })
738
+
739
+ it('cancels the order itself when there is no link, or the link could not be deleted', async () => {
740
+ for (const reference of ['SQ1', 'SQ1:PL1']) {
741
+ await withEnv(ENV, () =>
742
+ withFetch(
743
+ route([
744
+ locations,
745
+ openOrder,
746
+ ['DELETE', '/v2/online-checkout/payment-links/PL1', { status: 500, body: {} }],
747
+ ['PUT', '/v2/orders/SQ1', { status: 200, body: { order: { state: 'CANCELED' } } }],
748
+ ]),
749
+ async (calls) => {
750
+ expect((await square.closeCheckout({ reference })).state).toBe('closed')
751
+ const cancel = calls.find((call) => call.method === 'PUT')!
752
+ expect(cancel.json.order).toEqual({
753
+ location_id: 'LOC1',
754
+ version: 3,
755
+ state: 'CANCELED',
756
+ })
757
+ }
758
+ )
759
+ )
760
+ }
761
+ })
762
+
763
+ it('counts a deleted link as closed even when the order cannot be cancelled', async () => {
764
+ await withEnv(ENV, () =>
765
+ withFetch(
766
+ route([
767
+ locations,
768
+ openOrder,
769
+ ['DELETE', '/v2/online-checkout/payment-links/PL1', { status: 200, body: {} }],
770
+ ['PUT', '/v2/orders/SQ1', { status: 400, body: { errors: [{ detail: 'nope' }] } }],
771
+ ]),
772
+ async () => {
773
+ expect((await square.closeCheckout({ reference: 'SQ1:PL1' })).state).toBe('closed')
774
+ }
775
+ )
776
+ )
777
+ })
778
+
779
+ it('reads a payment-link order as what its tender payment took, a completed one as paid', async () => {
780
+ // A payment link's order stays OPEN after it is paid: its payment decides.
781
+ for (const [order, paymentStatus, state] of [
782
+ [{ state: 'OPEN', tenders: [{ id: 't', payment_id: 'PAY1' }] }, 'COMPLETED', 'paid'],
783
+ [{ state: 'OPEN', tenders: [{ id: 't', payment_id: 'PAY1' }] }, 'APPROVED', 'confirming'],
784
+ [{ state: 'OPEN', tenders: [{ id: 'PAY1' }] }, 'PENDING', 'confirming'],
785
+ [
786
+ {
787
+ state: 'OPEN',
788
+ tenders: [{ id: 't' }],
789
+ net_amount_due_money: { amount: 0, currency: 'USD' },
790
+ },
791
+ '',
792
+ 'paid',
793
+ ],
794
+ [{ state: 'COMPLETED' }, '', 'paid'],
795
+ [{ state: 'CANCELED' }, '', 'closed'],
796
+ ] as const) {
797
+ await withEnv(ENV, () =>
798
+ withFetch(
799
+ route([
800
+ locations,
801
+ ['GET', '/v2/orders/SQ1', { status: 200, body: { order } }],
802
+ [
803
+ 'GET',
804
+ '/v2/payments/PAY1',
805
+ { status: 200, body: { payment: { status: paymentStatus } } },
806
+ ],
807
+ ]),
808
+ async (calls) => {
809
+ expect((await square.closeCheckout({ reference: 'SQ1:PL1' })).state).toBe(state)
810
+ expect(calls.some((call) => call.method === 'DELETE')).toBe(false)
811
+ }
812
+ )
813
+ )
814
+ }
815
+ })
816
+
817
+ it('closes a payment-link order whose tender payment failed, and reports a payment it cannot read', async () => {
818
+ const failedOrder: [string, string, FakeAnswer] = [
819
+ 'GET',
820
+ '/v2/orders/SQ1',
821
+ {
822
+ status: 200,
823
+ body: {
824
+ order: {
825
+ id: 'SQ1',
826
+ state: 'OPEN',
827
+ version: 3,
828
+ location_id: 'LOC1',
829
+ tenders: [{ id: 't', payment_id: 'PAY1' }],
830
+ },
831
+ },
832
+ },
833
+ ]
834
+ await withEnv(ENV, () =>
835
+ withFetch(
836
+ route([
837
+ locations,
838
+ failedOrder,
839
+ ['GET', '/v2/payments/PAY1', { status: 200, body: { payment: { status: 'FAILED' } } }],
840
+ ['DELETE', '/v2/online-checkout/payment-links/PL1', { status: 200, body: {} }],
841
+ ]),
842
+ async (calls) => {
843
+ expect((await square.closeCheckout({ reference: 'SQ1:PL1' })).state).toBe('closed')
844
+ expect(trail(calls)).toContain('DELETE /v2/online-checkout/payment-links/PL1')
845
+ }
846
+ )
847
+ )
848
+ await withEnv(ENV, () =>
849
+ withFetch(
850
+ route([
851
+ locations,
852
+ failedOrder,
853
+ [
854
+ 'GET',
855
+ '/v2/payments/PAY1',
856
+ { status: 500, body: { errors: [{ detail: 'Try again' }] } },
857
+ ],
858
+ ]),
859
+ async (calls) => {
860
+ expect(await square.closeCheckout({ reference: 'SQ1:PL1' })).toEqual({
861
+ state: '',
862
+ error: 'Try again',
863
+ })
864
+ expect(calls.some((call) => call.method === 'DELETE')).toBe(false)
865
+ }
866
+ )
867
+ )
868
+ })
869
+
870
+ it('finds the Square orders placed for the store order by their reference', async () => {
871
+ await withEnv(ENV, () =>
872
+ withFetch(
873
+ route([
874
+ [
875
+ 'GET',
876
+ '/v2/locations/LOC1',
877
+ { status: 200, body: { location: { id: 'LOC1', currency: 'USD' } } },
878
+ ],
879
+ locations,
880
+ [
881
+ 'POST',
882
+ '/v2/orders/search',
883
+ {
884
+ status: 200,
885
+ body: {
886
+ orders: [
887
+ { id: 'SQ1', reference_id: 'o-1' },
888
+ { id: 'SQ2', reference_id: 'o-2' },
889
+ ],
890
+ },
891
+ },
892
+ ],
893
+ ]),
894
+ async (calls) => {
895
+ expect(await square.findCheckouts({ orderId: 'o-1', placedAt: PLACED_AT })).toEqual({
896
+ references: ['SQ1'],
897
+ })
898
+ const search = calls.find((call) => call.url.endsWith('/v2/orders/search'))!
899
+ expect(search.json.location_ids).toEqual(['LOC1'])
900
+ expect(search.json.query.filter.date_time_filter.created_at).toEqual({
901
+ start_at: new Date(PLACED_MS - 10 * 60 * 1000).toISOString(),
902
+ end_at: new Date(PLACED_MS + 60 * 60 * 1000).toISOString(),
903
+ })
904
+ // Square refuses a time filter sorted on another field.
905
+ expect(search.json.query.sort).toEqual({ sort_field: 'CREATED_AT' })
906
+ // The orders were found: the payment links are not listed.
907
+ expect(trail(calls).some((line) => line.includes('payment-links'))).toBe(false)
908
+ }
909
+ )
910
+ )
911
+ })
912
+
913
+ it('finds the link of a draft order the order search does not return, by the note naming the order', async () => {
914
+ const link = (id: string, orderId: string, note: string, createdAt: string) => ({
915
+ id,
916
+ order_id: orderId,
917
+ payment_note: note,
918
+ created_at: createdAt,
919
+ })
920
+ await withEnv(ENV, () =>
921
+ withFetch(
922
+ (call) => {
923
+ const path = call.url.replace(/^https:\/\/[^/]+/, '')
924
+ if (path.startsWith('/v2/locations/LOC1')) {
925
+ return { status: 200, body: { location: { id: 'LOC1', currency: 'USD' } } }
926
+ }
927
+ if (path.startsWith('/v2/locations')) {
928
+ return { status: 200, body: {} }
929
+ }
930
+ if (path.startsWith('/v2/orders/search')) {
931
+ return { status: 200, body: { orders: [] } }
932
+ }
933
+ if (path.includes('cursor=next')) {
934
+ return {
935
+ status: 200,
936
+ body: {
937
+ payment_links: [
938
+ link('PL2', 'SQ2', 'teleport:o-1::', '2026-09-28T10:00:09Z'),
939
+ // Opened for the order days earlier: not this placing's.
940
+ link('PL0', 'SQ0', 'teleport:o-1::', '2026-09-20T10:00:00Z'),
941
+ ],
942
+ },
943
+ }
944
+ }
945
+ return {
946
+ status: 200,
947
+ body: {
948
+ payment_links: [
949
+ link('PL1', 'SQ1', 'teleport:o-10::', '2026-09-28T10:00:05Z'),
950
+ link('PL3', 'SQ3', 'teleport:o-2::', '2026-09-28T10:00:07Z'),
951
+ ],
952
+ cursor: 'next',
953
+ },
954
+ }
955
+ },
956
+ async (calls) => {
957
+ expect(await square.findCheckouts({ orderId: 'o-1', placedAt: PLACED_AT })).toEqual({
958
+ references: ['SQ2:PL2'],
959
+ })
960
+ expect(trail(calls).filter((line) => line.includes('payment-links'))).toEqual([
961
+ 'GET /v2/online-checkout/payment-links?limit=1000',
962
+ 'GET /v2/online-checkout/payment-links?limit=1000&cursor=next',
963
+ ])
964
+ }
965
+ )
966
+ )
967
+ })
968
+ })
969
+
970
+ describe('Paddle', () => {
971
+ const paddle = loadPaymentDrivers({ ids: ['paddle'] }).get('paddle')
972
+ const ENV = { PADDLE_API_KEY: 'pdl_sdbx_apikey_1' }
973
+
974
+ it('cancels a ready transaction', async () => {
975
+ await withEnv(ENV, () =>
976
+ withFetch(
977
+ route([
978
+ [
979
+ 'GET',
980
+ '/transactions/txn_1',
981
+ { status: 200, body: { data: { id: 'txn_1', status: 'ready' } } },
982
+ ],
983
+ ['PATCH', '/transactions/txn_1', { status: 200, body: { data: { status: 'canceled' } } }],
984
+ ]),
985
+ async (calls) => {
986
+ expect((await paddle.closeCheckout({ reference: 'txn_1' })).state).toBe('closed')
987
+ expect(calls.find((call) => call.method === 'PATCH')!.json).toEqual({
988
+ status: 'canceled',
989
+ })
990
+ }
991
+ )
992
+ )
993
+ })
994
+
995
+ it('reads a completed transaction as paid and a billed one as confirming', async () => {
996
+ for (const [status, state] of [
997
+ ['completed', 'paid'],
998
+ ['billed', 'confirming'],
999
+ ['canceled', 'closed'],
1000
+ ]) {
1001
+ await withEnv(ENV, () =>
1002
+ withFetch(
1003
+ route([['GET', '/transactions/txn_1', { status: 200, body: { data: { status } } }]]),
1004
+ async () => {
1005
+ expect((await paddle.closeCheckout({ reference: 'txn_1' })).state).toBe(state)
1006
+ }
1007
+ )
1008
+ )
1009
+ }
1010
+ })
1011
+
1012
+ it('finds the transactions opened for an order around the time it was placed', async () => {
1013
+ await withEnv(ENV, () =>
1014
+ withFetch(
1015
+ route([
1016
+ [
1017
+ 'GET',
1018
+ '/transactions?',
1019
+ {
1020
+ status: 200,
1021
+ body: {
1022
+ data: [
1023
+ { id: 'txn_1', custom_data: { orderId: 'o-1' } },
1024
+ { id: 'txn_2', custom_data: { orderId: 'o-2' } },
1025
+ ],
1026
+ meta: { pagination: { has_more: false } },
1027
+ },
1028
+ },
1029
+ ],
1030
+ ]),
1031
+ async (calls) => {
1032
+ expect(await paddle.findCheckouts({ orderId: 'o-1', placedAt: PLACED_AT })).toEqual({
1033
+ references: ['txn_1'],
1034
+ })
1035
+ expect(decodeURIComponent(calls[0].url)).toContain(
1036
+ 'created_at[GTE]=' + new Date(PLACED_MS - 10 * 60 * 1000).toISOString()
1037
+ )
1038
+ // Paddle serves at most 30 a page; the store's checkouts are its API transactions.
1039
+ expect(calls[0].url).toContain('/transactions?per_page=30&origin=api&')
1040
+ }
1041
+ )
1042
+ )
1043
+ })
1044
+ })
1045
+
1046
+ describe('CoinGate', () => {
1047
+ const coingate = loadPaymentDrivers({ ids: ['coingate'] }).get('coingate')
1048
+ const ENV = { COINGATE_API_TOKEN: 'cg-token' }
1049
+ const auth: [string, string, FakeAnswer] = ['GET', '/v2/auth/test', { status: 200, body: 'OK' }]
1050
+
1051
+ it('cannot cancel an invoice: says until when one still waiting for coins is payable', async () => {
1052
+ await withEnv(ENV, () =>
1053
+ withFetch(
1054
+ route([
1055
+ auth,
1056
+ [
1057
+ 'GET',
1058
+ '/v2/orders/42',
1059
+ {
1060
+ status: 200,
1061
+ body: {
1062
+ id: 42,
1063
+ status: 'new',
1064
+ payment_url: 'https://coingate.com/invoice/42',
1065
+ expire_at: '2026-09-28T10:20:00+00:00',
1066
+ },
1067
+ },
1068
+ ],
1069
+ ]),
1070
+ async (calls) => {
1071
+ expect(await coingate.closeCheckout({ reference: '42' })).toEqual({
1072
+ state: 'open',
1073
+ checkoutUrl: 'https://coingate.com/invoice/42',
1074
+ openUntil: '2026-09-28T10:20:00+00:00',
1075
+ })
1076
+ expect(calls.every((call) => call.method === 'GET')).toBe(true)
1077
+ }
1078
+ )
1079
+ )
1080
+ })
1081
+
1082
+ it('says a new invoice, which carries no expiry, runs out two hours after it was created', async () => {
1083
+ for (const [status, until] of [
1084
+ ['new', '2026-09-28T12:00:00.000Z'],
1085
+ // A pending invoice's own expiry was not stated: nobody knows when.
1086
+ ['pending', ''],
1087
+ ]) {
1088
+ await withEnv(ENV, () =>
1089
+ withFetch(
1090
+ route([
1091
+ auth,
1092
+ [
1093
+ 'GET',
1094
+ '/v2/orders/42',
1095
+ {
1096
+ status: 200,
1097
+ body: { id: 42, status, created_at: '2026-09-28T10:00:00+00:00' },
1098
+ },
1099
+ ],
1100
+ ]),
1101
+ async () => {
1102
+ expect(await coingate.closeCheckout({ reference: '42' })).toEqual({
1103
+ state: 'open',
1104
+ checkoutUrl: '',
1105
+ openUntil: until,
1106
+ })
1107
+ }
1108
+ )
1109
+ )
1110
+ }
1111
+ })
1112
+
1113
+ it('reads a paid invoice as paid and a confirming one as confirming', async () => {
1114
+ for (const [status, state] of [
1115
+ ['paid', 'paid'],
1116
+ ['confirming', 'confirming'],
1117
+ ['expired', 'closed'],
1118
+ ]) {
1119
+ await withEnv(ENV, () =>
1120
+ withFetch(
1121
+ route([auth, ['GET', '/v2/orders/42', { status: 200, body: { status } }]]),
1122
+ async () => {
1123
+ expect((await coingate.closeCheckout({ reference: '42' })).state).toBe(state)
1124
+ }
1125
+ )
1126
+ )
1127
+ }
1128
+ })
1129
+
1130
+ it('finds the invoices opened for an order around the time it was placed', async () => {
1131
+ await withEnv(ENV, () =>
1132
+ withFetch(
1133
+ route([
1134
+ auth,
1135
+ [
1136
+ 'GET',
1137
+ '/v2/orders?',
1138
+ {
1139
+ status: 200,
1140
+ body: {
1141
+ orders: [
1142
+ { id: 42, order_id: 'o-1', created_at: '2026-09-28T10:00:04+00:00' },
1143
+ { id: 43, order_id: 'o-2', created_at: '2026-09-28T10:00:05+00:00' },
1144
+ // The same order's invoice from another day the whole-day filter lets in.
1145
+ { id: 41, order_id: 'o-1', created_at: '2026-09-27T09:00:00+00:00' },
1146
+ ],
1147
+ total_pages: 1,
1148
+ },
1149
+ },
1150
+ ],
1151
+ ]),
1152
+ async (calls) => {
1153
+ expect(await coingate.findCheckouts({ orderId: 'o-1', placedAt: PLACED_AT })).toEqual({
1154
+ references: ['42'],
1155
+ })
1156
+ // CoinGate filters by whole days: a day either side of the window.
1157
+ const list = calls.find((call) => call.url.includes('/v2/orders?'))!
1158
+ expect(list.url).toContain('created_at[from]=2026-09-27&created_at[to]=2026-09-29')
1159
+ }
1160
+ )
1161
+ )
1162
+ })
1163
+ })