@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
@@ -0,0 +1,1261 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generatePaypalDriverCode = void 0;
4
+ /**
5
+ * Emits `utils/payments/drivers/paypal.js`: Orders v2 checkout (captured when
6
+ * the buyer returns), Billing Plans + Subscriptions, refunds of captures and
7
+ * subscription sales, subscription management and webhook verification, all
8
+ * over fetch.
9
+ *
10
+ * Sandbox and live keys look alike (both client ids start with "A"), so the
11
+ * environment is found by asking: sandbox first, live on `invalid_client`,
12
+ * the answer cached per process (a generated app serves one merchant).
13
+ */
14
+ const generatePaypalDriverCode = () => `'use strict';
15
+ /**
16
+ * PayPal driver. Generated by TeleportHQ — changes are overwritten on the next export.
17
+ */
18
+ module.exports = function createPaypalDriver(core) {
19
+ var SANDBOX = 'https://api-m.sandbox.paypal.com';
20
+ var LIVE = 'https://api-m.paypal.com';
21
+ var MISSING_CREDENTIALS = 'PayPal credentials are not configured';
22
+ // Currencies PayPal takes as whole numbers.
23
+ var ZERO_DECIMAL = ['HUF', 'JPY', 'TWD'];
24
+ var INTERVALS = ['DAY', 'WEEK', 'MONTH', 'YEAR'];
25
+ // The longest billing cycle PayPal accepts in each unit: a year at most.
26
+ var INTERVAL_COUNT_MAX = { DAY: 365, WEEK: 52, MONTH: 12, YEAR: 1 };
27
+
28
+ function credentials() {
29
+ return {
30
+ clientId: core.credential('paypal', 'clientId'),
31
+ clientSecret: core.credential('paypal', 'clientSecret'),
32
+ };
33
+ }
34
+
35
+ // PayPal's "secret" is the id of the webhook the merchant registered.
36
+ function webhookId(configured) {
37
+ return configured || core.credential('paypal', 'webhookId');
38
+ }
39
+
40
+ function formatAmount(major, currency) {
41
+ var amount = Number(major);
42
+ var safe = isFinite(amount) && amount > 0 ? amount : 0;
43
+ return ZERO_DECIMAL.indexOf(String(currency || '').toUpperCase()) >= 0 ? String(Math.round(safe)) : safe.toFixed(2);
44
+ }
45
+
46
+ // The provider's own message for a failed call, which is the actionable half.
47
+ function errorMessage(data, fallback) {
48
+ var detail = data && data.details && data.details[0] ? data.details[0] : null;
49
+ return (detail && (detail.description || detail.issue)) || (data && data.message) || fallback;
50
+ }
51
+
52
+ async function tryAuth(baseUrl, basicAuth) {
53
+ try {
54
+ var response = await fetch(baseUrl + '/v1/oauth2/token', {
55
+ method: 'POST',
56
+ headers: { Authorization: basicAuth, 'Content-Type': 'application/x-www-form-urlencoded' },
57
+ body: 'grant_type=client_credentials',
58
+ });
59
+ var data = await core.readJson(response);
60
+ if (data && data.access_token) {
61
+ return { accessToken: data.access_token };
62
+ }
63
+ return {
64
+ invalidClient: !!(data && data.error === 'invalid_client'),
65
+ errorMessage: (data && (data.error_description || data.error)) || 'HTTP ' + response.status,
66
+ };
67
+ } catch (err) {
68
+ return { errorMessage: 'network error: ' + core.describeError(err) };
69
+ }
70
+ }
71
+
72
+ // \`{ baseUrl, accessToken }\` or \`{ error }\`. A cached environment that now
73
+ // answers \`invalid_client\` (keys rotated to the other one) is re-detected.
74
+ async function authenticate() {
75
+ var keys = credentials();
76
+ if (!keys.clientId || !keys.clientSecret) {
77
+ return { error: MISSING_CREDENTIALS };
78
+ }
79
+ var basicAuth = 'Basic ' + Buffer.from(keys.clientId + ':' + keys.clientSecret).toString('base64');
80
+ var cached = globalThis.__paypalBaseUrlCache;
81
+ if (cached === SANDBOX || cached === LIVE) {
82
+ var cachedResult = await tryAuth(cached, basicAuth);
83
+ if (cachedResult.accessToken) {
84
+ return { baseUrl: cached, accessToken: cachedResult.accessToken };
85
+ }
86
+ if (!cachedResult.invalidClient) {
87
+ return { error: 'PayPal authentication failed: ' + cachedResult.errorMessage };
88
+ }
89
+ globalThis.__paypalBaseUrlCache = undefined;
90
+ }
91
+ var sandbox = await tryAuth(SANDBOX, basicAuth);
92
+ if (sandbox.accessToken) {
93
+ globalThis.__paypalBaseUrlCache = SANDBOX;
94
+ return { baseUrl: SANDBOX, accessToken: sandbox.accessToken };
95
+ }
96
+ if (!sandbox.invalidClient) {
97
+ return { error: 'PayPal authentication failed: ' + sandbox.errorMessage };
98
+ }
99
+ var live = await tryAuth(LIVE, basicAuth);
100
+ if (live.accessToken) {
101
+ globalThis.__paypalBaseUrlCache = LIVE;
102
+ return { baseUrl: LIVE, accessToken: live.accessToken };
103
+ }
104
+ return {
105
+ error:
106
+ 'PayPal authentication failed: credentials are not valid for either sandbox or live (' +
107
+ (live.errorMessage || 'invalid_client') +
108
+ '). Check that the Client ID and the Secret saved for PayPal belong to the same PayPal app.',
109
+ };
110
+ }
111
+
112
+ function bearer(auth) {
113
+ return { Authorization: 'Bearer ' + auth.accessToken, 'Content-Type': 'application/json' };
114
+ }
115
+
116
+ async function createCheckout(input) {
117
+ var keys = credentials();
118
+ if (!keys.clientId || !keys.clientSecret) {
119
+ return { checkoutUrl: '', sessionId: '', error: MISSING_CREDENTIALS };
120
+ }
121
+ // A common .env mistake, caught before a round trip that would only say 401.
122
+ if (keys.clientId === keys.clientSecret) {
123
+ return {
124
+ checkoutUrl: '',
125
+ sessionId: '',
126
+ error:
127
+ 'PayPal credentials are misconfigured: the Client ID and the Secret saved for PayPal are identical. Save the app\\'s Secret instead.',
128
+ };
129
+ }
130
+ try {
131
+ var auth = await authenticate();
132
+ if (auth.error) {
133
+ return { checkoutUrl: '', sessionId: '', error: auth.error };
134
+ }
135
+ var currency = String(input.currency || '').toUpperCase();
136
+ var paypal = {
137
+ experience_context: {
138
+ return_url: input.successUrl || undefined,
139
+ cancel_url: input.cancelUrl || undefined,
140
+ // The store captures the order as soon as the buyer is back, with no
141
+ // review page of its own: PayPal's button says "Pay Now".
142
+ user_action: 'PAY_NOW',
143
+ },
144
+ };
145
+ if (input.customerEmail) {
146
+ paypal.email_address = String(input.customerEmail);
147
+ }
148
+ var payload = {
149
+ intent: 'CAPTURE',
150
+ purchase_units: [
151
+ {
152
+ amount: { currency_code: currency, value: formatAmount(input.amount, currency) },
153
+ description: input.description || undefined,
154
+ },
155
+ ],
156
+ payment_source: { paypal: paypal },
157
+ };
158
+ if (input.metadata) {
159
+ payload.purchase_units[0].custom_id = JSON.stringify(input.metadata);
160
+ }
161
+ var response = await fetch(auth.baseUrl + '/v2/checkout/orders', {
162
+ method: 'POST',
163
+ headers: bearer(auth),
164
+ body: JSON.stringify(payload),
165
+ });
166
+ var data = await response.json();
167
+ if (!response.ok) {
168
+ return { checkoutUrl: '', sessionId: '', error: errorMessage(data, 'Order creation failed') };
169
+ }
170
+ return { checkoutUrl: orderPage(data), sessionId: data.id || '' };
171
+ } catch (err) {
172
+ return { checkoutUrl: '', sessionId: '', error: err && err.message ? err.message : String(err) };
173
+ }
174
+ }
175
+
176
+ // A subscription against the Billing Plan \`ensurePlan\` returned; its id
177
+ // (\`I-…\`) is known at once, the ACTIVATED webhook confirms the mandate.
178
+ async function createSubscriptionCheckout(input) {
179
+ var keys = credentials();
180
+ if (!keys.clientId || !keys.clientSecret) {
181
+ return { checkoutUrl: '', sessionId: '', error: MISSING_CREDENTIALS };
182
+ }
183
+ var planId = String(input.planId || '').trim();
184
+ if (!planId) {
185
+ return { checkoutUrl: '', sessionId: '', error: 'No PayPal billing plan was supplied for the subscription' };
186
+ }
187
+ try {
188
+ var auth = await authenticate();
189
+ if (auth.error) {
190
+ return { checkoutUrl: '', sessionId: '', error: auth.error };
191
+ }
192
+ var payload = {
193
+ plan_id: planId,
194
+ application_context: {
195
+ user_action: 'SUBSCRIBE_NOW',
196
+ return_url: input.successUrl || undefined,
197
+ cancel_url: input.cancelUrl || undefined,
198
+ },
199
+ };
200
+ if (input.metadata) {
201
+ payload.custom_id = JSON.stringify(input.metadata);
202
+ }
203
+ if (input.customerEmail) {
204
+ payload.subscriber = { email_address: String(input.customerEmail) };
205
+ }
206
+ var response = await fetch(auth.baseUrl + '/v1/billing/subscriptions', {
207
+ method: 'POST',
208
+ headers: bearer(auth),
209
+ body: JSON.stringify(payload),
210
+ });
211
+ var data = await response.json();
212
+ if (!response.ok) {
213
+ return { checkoutUrl: '', sessionId: '', error: errorMessage(data, 'Subscription creation failed') };
214
+ }
215
+ return { checkoutUrl: orderPage(data), sessionId: data.id || '', providerSubscriptionId: data.id || '' };
216
+ } catch (err) {
217
+ return { checkoutUrl: '', sessionId: '', error: err && err.message ? err.message : String(err) };
218
+ }
219
+ }
220
+
221
+ function planFailure(message) {
222
+ return { ok: 'false', planId: '', providerProductId: '', created: 'false', error: message };
223
+ }
224
+
225
+ // Whether the environment the credentials belong to (sandbox or live) knows
226
+ // a cached plan: one created under the other environment's credentials is
227
+ // unknown here. A plan that cannot be checked right now counts as known.
228
+ async function planKnown(planId) {
229
+ try {
230
+ var auth = await authenticate();
231
+ if (auth.error) {
232
+ return true;
233
+ }
234
+ var response = await fetch(auth.baseUrl + '/v1/billing/plans/' + encodeURIComponent(planId), {
235
+ method: 'GET',
236
+ headers: bearer(auth),
237
+ });
238
+ return response.status !== 404;
239
+ } catch (_err) {
240
+ return true;
241
+ }
242
+ }
243
+
244
+ // A catalog product and a Billing Plan for one product at one price. A gift
245
+ // card that paid part of the first cycle makes that cycle a paid TRIAL at the
246
+ // reduced price, then the regular price. A cached plan the current
247
+ // credentials' environment does not know (the store moved between sandbox
248
+ // and live) is created again there.
249
+ async function ensurePlan(input) {
250
+ var cachedPlanId = String(input.planId || '').trim();
251
+ var keys = credentials();
252
+ var cached = { ok: 'true', planId: cachedPlanId, providerProductId: String(input.providerProductId || ''), created: 'false' };
253
+ if (cachedPlanId && (!keys.clientId || !keys.clientSecret || (await planKnown(cachedPlanId)))) {
254
+ return cached;
255
+ }
256
+ if (!keys.clientId || !keys.clientSecret) {
257
+ return planFailure(MISSING_CREDENTIALS);
258
+ }
259
+ var currency = String(input.currency || 'USD').toUpperCase();
260
+ var amount = Number(input.amount);
261
+ if (!isFinite(amount) || amount <= 0) {
262
+ return planFailure('A subscription needs a positive amount to bill.');
263
+ }
264
+ var interval = String(input.interval || 'month').toUpperCase();
265
+ if (INTERVALS.indexOf(interval) === -1) {
266
+ return planFailure('Unknown billing interval "' + interval + '".');
267
+ }
268
+ var intervalCount = Math.max(1, Math.floor(Number(input.intervalCount) || 1));
269
+ var trialDays = Math.max(0, Math.floor(Number(input.trialDays) || 0));
270
+ // PayPal refuses the whole plan over these, with a message that names no field.
271
+ var longest = INTERVAL_COUNT_MAX[interval];
272
+ if (intervalCount > longest) {
273
+ var unit = interval.toLowerCase();
274
+ return planFailure(
275
+ 'PayPal cannot bill every ' + intervalCount + ' ' + unit + 's: its longest billing cycle is ' +
276
+ (longest === 1 ? 'one ' + unit : longest + ' ' + unit + 's') + '.'
277
+ );
278
+ }
279
+ if (trialDays > INTERVAL_COUNT_MAX.DAY) {
280
+ return planFailure('PayPal cannot run a free trial of ' + trialDays + ' days: its longest is ' + INTERVAL_COUNT_MAX.DAY + ' days.');
281
+ }
282
+ var productName = String(input.productName || 'Subscription').slice(0, 127);
283
+ var firstCycleRaw = Number(input.firstCycleAmount);
284
+ var firstCycleAmount = isFinite(firstCycleRaw) && firstCycleRaw > 0 && firstCycleRaw < amount ? firstCycleRaw : null;
285
+ if (firstCycleAmount !== null && trialDays > 0) {
286
+ return planFailure('A subscription with a free trial cannot open with a reduced first payment.');
287
+ }
288
+ try {
289
+ var auth = await authenticate();
290
+ if (auth.error) {
291
+ return planFailure(auth.error);
292
+ }
293
+ var readError = async function (response, fallback) {
294
+ return errorMessage(await core.readJson(response), fallback);
295
+ };
296
+ var productResponse = await fetch(auth.baseUrl + '/v1/catalogs/products', {
297
+ method: 'POST',
298
+ headers: bearer(auth),
299
+ body: JSON.stringify({
300
+ name: productName,
301
+ description: input.productId ? 'Store product ' + String(input.productId) : undefined,
302
+ type: 'SERVICE',
303
+ }),
304
+ });
305
+ if (!productResponse.ok) {
306
+ return planFailure('PayPal refused to create the product: ' + (await readError(productResponse, 'HTTP ' + productResponse.status)));
307
+ }
308
+ var product = await productResponse.json();
309
+ var providerProductId = String((product && product.id) || '');
310
+ if (!providerProductId) {
311
+ return planFailure('PayPal returned no product id.');
312
+ }
313
+ var billingCycles = [];
314
+ if (trialDays > 0) {
315
+ billingCycles.push({
316
+ frequency: { interval_unit: 'DAY', interval_count: trialDays },
317
+ tenure_type: 'TRIAL',
318
+ sequence: 1,
319
+ total_cycles: 1,
320
+ pricing_scheme: { fixed_price: { value: '0', currency_code: currency } },
321
+ });
322
+ } else if (firstCycleAmount !== null) {
323
+ billingCycles.push({
324
+ frequency: { interval_unit: interval, interval_count: intervalCount },
325
+ tenure_type: 'TRIAL',
326
+ sequence: 1,
327
+ total_cycles: 1,
328
+ pricing_scheme: { fixed_price: { value: formatAmount(firstCycleAmount, currency), currency_code: currency } },
329
+ });
330
+ }
331
+ billingCycles.push({
332
+ frequency: { interval_unit: interval, interval_count: intervalCount },
333
+ tenure_type: 'REGULAR',
334
+ sequence: billingCycles.length + 1,
335
+ // 0 = until cancelled.
336
+ total_cycles: 0,
337
+ pricing_scheme: { fixed_price: { value: formatAmount(amount, currency), currency_code: currency } },
338
+ });
339
+ var planResponse = await fetch(auth.baseUrl + '/v1/billing/plans', {
340
+ method: 'POST',
341
+ headers: bearer(auth),
342
+ body: JSON.stringify({
343
+ product_id: providerProductId,
344
+ name: productName,
345
+ status: 'ACTIVE',
346
+ billing_cycles: billingCycles,
347
+ payment_preferences: { auto_bill_outstanding: true, setup_fee_failure_action: 'CONTINUE', payment_failure_threshold: 3 },
348
+ }),
349
+ });
350
+ if (!planResponse.ok) {
351
+ return planFailure('PayPal refused to create the plan: ' + (await readError(planResponse, 'HTTP ' + planResponse.status)));
352
+ }
353
+ var plan = await planResponse.json();
354
+ var planId = String((plan && plan.id) || '');
355
+ if (!planId) {
356
+ return planFailure('PayPal returned no plan id.');
357
+ }
358
+ return { ok: 'true', planId: planId, providerProductId: providerProductId, created: 'true' };
359
+ } catch (err) {
360
+ return planFailure(err && err.message ? err.message : String(err));
361
+ }
362
+ }
363
+
364
+ function refundFailure(currency, message, extra) {
365
+ var result = { success: false, refundId: '', amount: 0, currency: currency, status: '', error: message };
366
+ if (extra) {
367
+ Object.keys(extra).forEach(function (key) {
368
+ result[key] = extra[key];
369
+ });
370
+ }
371
+ return result;
372
+ }
373
+
374
+ // One lookup of the reference as one resource type. Only "no such resource"
375
+ // lets the caller try the next type; an outage is reported as itself.
376
+ async function probe(auth, path, step) {
377
+ var response = await fetch(auth.baseUrl + path, { headers: { Authorization: 'Bearer ' + auth.accessToken } });
378
+ var data = await core.readJson(response);
379
+ if (response.ok) {
380
+ return { found: true, data: data, error: '' };
381
+ }
382
+ if (response.status === 404 || (data && data.name === 'RESOURCE_NOT_FOUND')) {
383
+ return { found: false, data: null, error: '' };
384
+ }
385
+ return {
386
+ found: false,
387
+ data: null,
388
+ error: 'PayPal could not look up the payment reference as ' + step + ': ' + errorMessage(data, 'HTTP ' + response.status),
389
+ };
390
+ }
391
+
392
+ // PayPal refunds a money movement: a v2 CAPTURE (or an order, exchanged for
393
+ // its completed capture) for a checkout, a v1 SALE for a subscription cycle.
394
+ async function resolveRefundTarget(auth, reference) {
395
+ var encoded = encodeURIComponent(reference);
396
+ var capture = await probe(auth, '/v2/payments/captures/' + encoded, 'a capture');
397
+ if (capture.error) {
398
+ return { captureId: '', saleId: '', error: capture.error };
399
+ }
400
+ if (capture.found) {
401
+ return { captureId: reference, saleId: '', error: '' };
402
+ }
403
+ var sale = await probe(auth, '/v1/payments/sale/' + encoded, 'a sale');
404
+ if (sale.error) {
405
+ return { captureId: '', saleId: '', error: sale.error };
406
+ }
407
+ if (sale.found) {
408
+ return { captureId: '', saleId: reference, error: '' };
409
+ }
410
+ var order = await probe(auth, '/v2/checkout/orders/' + encoded, 'an order');
411
+ if (order.error) {
412
+ return { captureId: '', saleId: '', error: order.error };
413
+ }
414
+ if (!order.found) {
415
+ return { captureId: '', saleId: '', error: 'PayPal does not recognise this order payment reference.' };
416
+ }
417
+ var units = (order.data && order.data.purchase_units) || [];
418
+ var captures = units.length > 0 && units[0].payments ? units[0].payments.captures || [] : [];
419
+ var captureId = '';
420
+ for (var i = 0; i < captures.length; i++) {
421
+ if (captures[i] && captures[i].status === 'COMPLETED') {
422
+ captureId = captures[i].id;
423
+ break;
424
+ }
425
+ }
426
+ if (!captureId && captures.length > 0) {
427
+ captureId = captures[0].id;
428
+ }
429
+ if (!captureId) {
430
+ return { captureId: '', saleId: '', error: 'This PayPal order was never captured, so there is nothing to refund.' };
431
+ }
432
+ return { captureId: captureId, saleId: '', error: '' };
433
+ }
434
+
435
+ async function refund(input) {
436
+ var currencyCode = String(input.currency || '').toUpperCase();
437
+ var keys = credentials();
438
+ if (!keys.clientId || !keys.clientSecret) {
439
+ return refundFailure(currencyCode, MISSING_CREDENTIALS);
440
+ }
441
+ var auth = await authenticate();
442
+ if (auth.error) {
443
+ return refundFailure(currencyCode, auth.error);
444
+ }
445
+ try {
446
+ var target = await resolveRefundTarget(auth, input.paymentReference);
447
+ if (target.error) {
448
+ return refundFailure(currencyCode, target.error);
449
+ }
450
+ // A sale refunds through v1, whose fields differ from v2's for the same things.
451
+ var isSale = target.saleId !== '';
452
+ var resourceId = isSale ? target.saleId : target.captureId;
453
+ var body = {};
454
+ if (input.amount > 0) {
455
+ var value = formatAmount(input.amount, currencyCode);
456
+ if (Number(value) <= 0) {
457
+ return refundFailure(currencyCode, 'The amount is smaller than the smallest unit of ' + currencyCode + '.');
458
+ }
459
+ body.amount = isSale ? { total: value, currency: currencyCode } : { value: value, currency_code: currencyCode };
460
+ }
461
+ var note = String(input.reason || '').trim();
462
+ if (note) {
463
+ // PayPal rejects the whole call over 255 characters.
464
+ body[isSale ? 'description' : 'note_to_payer'] = note.slice(0, 255);
465
+ }
466
+ if (!isSale && input.orderId) {
467
+ // Read back by the webhook to match the refund to its order. Capped at
468
+ // 127 characters, and a cut JSON document parses as nothing.
469
+ var customId = JSON.stringify({ orderId: input.orderId });
470
+ if (customId.length <= 127) {
471
+ body.custom_id = customId;
472
+ }
473
+ }
474
+ var headers = {
475
+ Authorization: 'Bearer ' + auth.accessToken,
476
+ 'Content-Type': 'application/json',
477
+ 'PayPal-Request-Id': input.idempotencyKey,
478
+ };
479
+ if (!isSale) {
480
+ // v2 answers with the refund's id and status alone unless asked for
481
+ // all of it, and its amount is what the store records as refunded.
482
+ headers.Prefer = 'return=representation';
483
+ }
484
+ var response = await fetch(
485
+ auth.baseUrl + (isSale ? '/v1/payments/sale/' : '/v2/payments/captures/') + encodeURIComponent(resourceId) + '/refund',
486
+ { method: 'POST', headers: headers, body: JSON.stringify(body) }
487
+ );
488
+ var data = await core.readJson(response);
489
+ if (!response.ok) {
490
+ return refundFailure(currencyCode, errorMessage(data, 'PayPal refund failed (HTTP ' + response.status + ')'));
491
+ }
492
+ var status = String((data && (data.status || data.state)) || '');
493
+ var refunded = data && data.amount ? data.amount : null;
494
+ var refundedValue = refunded ? Number(refunded.value !== undefined ? refunded.value : refunded.total) : NaN;
495
+ var refundedCurrency = String((refunded && (refunded.currency_code || refunded.currency)) || currencyCode).toUpperCase();
496
+ var upper = status.toUpperCase();
497
+ if (upper === 'FAILED' || upper === 'CANCELLED' || upper === 'CANCELED') {
498
+ return refundFailure(refundedCurrency, 'PayPal reported the refund as ' + status + '.', {
499
+ refundId: (data && data.id) || '',
500
+ status: status,
501
+ });
502
+ }
503
+ return {
504
+ success: true,
505
+ refundId: (data && data.id) || '',
506
+ amount: isFinite(refundedValue) ? refundedValue : input.amount,
507
+ currency: refundedCurrency,
508
+ status: status,
509
+ error: '',
510
+ };
511
+ } catch (err) {
512
+ return refundFailure(currencyCode, err && err.message ? err.message : String(err));
513
+ }
514
+ }
515
+
516
+ function subscriptionStatus(status) {
517
+ var map = {
518
+ ACTIVE: 'active',
519
+ SUSPENDED: 'paused',
520
+ CANCELLED: 'cancelled',
521
+ EXPIRED: 'expired',
522
+ APPROVAL_PENDING: 'pending',
523
+ APPROVED: 'pending',
524
+ };
525
+ return map[String(status || '').toUpperCase()] || '';
526
+ }
527
+
528
+ function manageFailure(message) {
529
+ return { ok: 'false', status: '', cancelAtPeriodEnd: 'false', currentPeriodStart: '', currentPeriodEnd: '', error: message };
530
+ }
531
+
532
+ // PayPal has no "cancel at the end of the period": a cancellation is
533
+ // immediate, and never refunds the running cycle.
534
+ async function manageSubscription(input) {
535
+ var keys = credentials();
536
+ if (!keys.clientId || !keys.clientSecret) {
537
+ return manageFailure(MISSING_CREDENTIALS);
538
+ }
539
+ var subscriptionId = input.subscriptionId;
540
+ var action = input.action;
541
+ try {
542
+ var auth = await authenticate();
543
+ if (auth.error) {
544
+ return manageFailure(auth.error);
545
+ }
546
+ var headers = bearer(auth);
547
+ var verb = action === 'pause' ? 'suspend' : action === 'resume' ? 'activate' : 'cancel';
548
+ var reason = verb === 'cancel' ? 'Cancelled by the store' : verb === 'suspend' ? 'Paused by the store' : 'Resumed by the store';
549
+ if (action !== 'refresh') {
550
+ var actionResponse = await fetch(
551
+ auth.baseUrl + '/v1/billing/subscriptions/' + encodeURIComponent(subscriptionId) + '/' + verb,
552
+ { method: 'POST', headers: headers, body: JSON.stringify({ reason: reason }) }
553
+ );
554
+ if (!actionResponse.ok) {
555
+ // The 204 success and some errors carry no body.
556
+ var refusal = await core.readJson(actionResponse);
557
+ return manageFailure('PayPal refused the ' + verb + ': ' + errorMessage(refusal, 'HTTP ' + actionResponse.status));
558
+ }
559
+ }
560
+ var detailResponse = await fetch(auth.baseUrl + '/v1/billing/subscriptions/' + encodeURIComponent(subscriptionId), {
561
+ headers: headers,
562
+ });
563
+ if (action === 'refresh' && !detailResponse.ok) {
564
+ return manageFailure('PayPal could not read the subscription: HTTP ' + detailResponse.status);
565
+ }
566
+ var detail = detailResponse.ok ? await detailResponse.json() : {};
567
+ var billingInfo = (detail && detail.billing_info) || {};
568
+ var lastPayment = billingInfo.last_payment || {};
569
+ return {
570
+ ok: 'true',
571
+ status: subscriptionStatus(detail && detail.status),
572
+ cancelAtPeriodEnd: 'false',
573
+ currentPeriodStart: lastPayment.time ? String(lastPayment.time) : detail && detail.start_time ? String(detail.start_time) : '',
574
+ currentPeriodEnd: billingInfo.next_billing_time ? String(billingInfo.next_billing_time) : '',
575
+ };
576
+ } catch (err) {
577
+ return manageFailure(err && err.message ? err.message : String(err));
578
+ }
579
+ }
580
+
581
+ // PayPal has no merchant-created portal: the buyer changes a subscription's
582
+ // funding source from their own "automatic payments" page, on the
583
+ // environment the store's credentials belong to.
584
+ async function billingPortal() {
585
+ var keys = credentials();
586
+ if (!keys.clientId || !keys.clientSecret) {
587
+ return { ok: 'false', url: '', error: MISSING_CREDENTIALS };
588
+ }
589
+ var auth = await authenticate();
590
+ if (auth.error) {
591
+ return { ok: 'false', url: '', error: auth.error };
592
+ }
593
+ return { ok: 'true', url: siteOf(auth) + '/myaccount/autopay/' };
594
+ }
595
+
596
+ // The environment's own site, where buyers approve orders and manage their
597
+ // automatic payments.
598
+ function siteOf(auth) {
599
+ return auth.baseUrl.indexOf('sandbox') !== -1 ? 'https://www.sandbox.paypal.com' : 'https://www.paypal.com';
600
+ }
601
+
602
+ // What became of a PayPal order the store opened earlier. One the buyer has
603
+ // not approved yet is paid on its own approval page. An APPROVED one moved no
604
+ // money until it is captured, so it is captured now — what the buyer's return
605
+ // and the approval webhook would have done — and its capture event pays the
606
+ // store's order. A capture PayPal refuses in a way the buyer can fix (another
607
+ // card, a step at PayPal) leaves the same order payable on its approval page;
608
+ // any other refusal is only answered closed once the order is closed, since
609
+ // an APPROVED order can still be captured later. A COMPLETED order is paid
610
+ // only when its capture says so. PayPal forgets an order nobody approved once
611
+ // it runs out.
612
+ async function inspectCheckout(input) {
613
+ var reference = String((input && input.reference) || '').trim();
614
+ if (!reference) {
615
+ return { state: 'closed', checkoutUrl: '' };
616
+ }
617
+ try {
618
+ var auth = await authenticate();
619
+ if (auth.error) {
620
+ return { state: '', checkoutUrl: '', error: auth.error };
621
+ }
622
+ var answer = await core.request(auth.baseUrl + '/v2/checkout/orders/' + encodeURIComponent(reference), {
623
+ headers: bearer(auth),
624
+ });
625
+ if (answer.status === 404) {
626
+ return { state: 'closed', checkoutUrl: '' };
627
+ }
628
+ if (!answer.ok || !answer.data) {
629
+ return { state: '', checkoutUrl: '', error: errorMessage(answer.data, 'PayPal could not be asked about order ' + reference) };
630
+ }
631
+ var status = String(answer.data.status || '').toUpperCase();
632
+ // An order the store closed is never captured, so it takes no money.
633
+ if (isClosedOrder(answer.data) && status !== 'COMPLETED') {
634
+ return { state: 'closed', checkoutUrl: '' };
635
+ }
636
+ if (status === 'CREATED' || status === 'PAYER_ACTION_REQUIRED') {
637
+ var page = orderPage(answer.data);
638
+ return page ? { state: 'open', checkoutUrl: page } : { state: 'closed', checkoutUrl: '' };
639
+ }
640
+ if (status === 'APPROVED') {
641
+ var capture = await confirmReturn({ query: { token: reference } });
642
+ if (capture.ok) {
643
+ return { state: 'confirming', checkoutUrl: '' };
644
+ }
645
+ if (capture.retryable) {
646
+ return { state: '', checkoutUrl: '', error: capture.error };
647
+ }
648
+ if (capture.payerActionUrl) {
649
+ return { state: 'open', checkoutUrl: capture.payerActionUrl };
650
+ }
651
+ if (capture.closed || capture.declined) {
652
+ return { state: 'closed', checkoutUrl: '' };
653
+ }
654
+ return await closeRefusedOrder(auth, reference, answer.data, capture.error);
655
+ }
656
+ if (status === 'COMPLETED') {
657
+ return { state: completedOrderState(answer.data), checkoutUrl: '' };
658
+ }
659
+ if (status === 'SAVED') {
660
+ return { state: 'confirming', checkoutUrl: '' };
661
+ }
662
+ return { state: 'closed', checkoutUrl: '' };
663
+ } catch (err) {
664
+ return { state: '', checkoutUrl: '', error: 'PayPal could not be reached: ' + core.describeError(err) };
665
+ }
666
+ }
667
+
668
+ // An APPROVED order whose capture PayPal refused for good can still be
669
+ // captured later (the approval webhook's retry, the buyer's return page), so
670
+ // it is marked closed, which every capture reads first, before the store is
671
+ // told it takes no money.
672
+ async function closeRefusedOrder(auth, reference, order, reason) {
673
+ var path = '/v2/checkout/orders/' + encodeURIComponent(reference);
674
+ var marked = await markClosed(auth, path, order);
675
+ if (marked.ok) {
676
+ return { state: 'closed', checkoutUrl: '' };
677
+ }
678
+ var again = await core.request(auth.baseUrl + path, { headers: bearer(auth) });
679
+ if (again.status === 404) {
680
+ return { state: 'closed', checkoutUrl: '' };
681
+ }
682
+ var after = again.ok && again.data ? String(again.data.status || '').toUpperCase() : '';
683
+ if (after === 'PAYER_ACTION_REQUIRED') {
684
+ return { state: 'open', checkoutUrl: payerActionUrl(auth, again.data, reference) };
685
+ }
686
+ if (after && after !== 'APPROVED' && after !== 'CREATED') {
687
+ return { state: orderState(again.data).state, checkoutUrl: '' };
688
+ }
689
+ return {
690
+ state: '',
691
+ checkoutUrl: '',
692
+ error: 'PayPal refused to capture order ' + reference + ' (' + reason + ') and did not let the store close it: ' + errorMessage(marked.data, 'HTTP ' + marked.status),
693
+ };
694
+ }
695
+
696
+ // The mark a closed order carries in its \`custom_id\` (the checkout's metadata
697
+ // as JSON): the order stays readable to the webhook, which finds the store's
698
+ // order in the same field.
699
+ var CLOSED_MARK = 'closed';
700
+ // PayPal's limit on \`custom_id\`.
701
+ var CUSTOM_ID_MAX = 127;
702
+ // How long a PayPal order can still be paid: the store has 6 hours from
703
+ // creating it to send the buyer there (PayPal can extend that to 24, 48 or
704
+ // 72 hours for an account), and once sent the buyer has 6 hours to approve
705
+ // it and the store to capture it. The store assumes the longest, 72 + 6.
706
+ var ORDER_LIFETIME_MS = 78 * 60 * 60 * 1000;
707
+ // A capture that moved the money, including one refunded since.
708
+ var PAID_CAPTURES = ['COMPLETED', 'PARTIALLY_REFUNDED', 'REFUNDED'];
709
+ // Refusals after which the buyer can still pay the SAME order on its
710
+ // approval page: another card or funding source, or a step PayPal asks of them.
711
+ var PAYER_FIXABLE_ISSUES = ['INSTRUMENT_DECLINED', 'PAYER_ACTION_REQUIRED', 'REDIRECT_PAYER_FOR_ALTERNATE_FUNDING'];
712
+
713
+ function purchaseUnit(order) {
714
+ return order && Array.isArray(order.purchase_units) && order.purchase_units[0] ? order.purchase_units[0] : {};
715
+ }
716
+
717
+ function isClosedOrder(order) {
718
+ return core.readMetadata(purchaseUnit(order).custom_id)[CLOSED_MARK] === true;
719
+ }
720
+
721
+ function closedCustomId(order) {
722
+ var metadata = core.readMetadata(purchaseUnit(order).custom_id);
723
+ var marked = {};
724
+ Object.keys(metadata).forEach(function (key) {
725
+ marked[key] = metadata[key];
726
+ });
727
+ marked[CLOSED_MARK] = true;
728
+ var value = JSON.stringify(marked);
729
+ return value.length <= CUSTOM_ID_MAX ? value : JSON.stringify({ orderId: String(metadata.orderId || '').slice(0, 80), closed: true });
730
+ }
731
+
732
+ // Marks the order closed in its custom_id. PayPal lets an order be changed
733
+ // while it is CREATED or APPROVED.
734
+ function markClosed(auth, path, order) {
735
+ var unit = purchaseUnit(order);
736
+ return core.request(auth.baseUrl + path, {
737
+ method: 'PATCH',
738
+ headers: bearer(auth),
739
+ body: JSON.stringify([
740
+ {
741
+ op: unit.custom_id ? 'replace' : 'add',
742
+ path: "/purchase_units/@reference_id=='" + String(unit.reference_id || 'default').replace(/'/g, '') + "'/custom_id",
743
+ value: closedCustomId(order),
744
+ },
745
+ ]),
746
+ });
747
+ }
748
+
749
+ // What an order's capture did with the money: paid, on its way (PENDING, held
750
+ // for review) or refused (DECLINED, FAILED); '' when the order lists no
751
+ // capture. PayPal completes an order whose capture it declined too, so the
752
+ // order's own COMPLETED says nothing about the money.
753
+ function captureState(order) {
754
+ var payments = purchaseUnit(order).payments;
755
+ var captures = payments && Array.isArray(payments.captures) ? payments.captures : [];
756
+ var state = '';
757
+ for (var i = 0; i < captures.length; i++) {
758
+ var captureStatus = String((captures[i] && captures[i].status) || '').toUpperCase();
759
+ if (PAID_CAPTURES.indexOf(captureStatus) !== -1) {
760
+ return 'paid';
761
+ }
762
+ if (captureStatus === 'PENDING') {
763
+ state = 'confirming';
764
+ } else if ((captureStatus === 'DECLINED' || captureStatus === 'FAILED') && !state) {
765
+ state = 'closed';
766
+ }
767
+ }
768
+ return state;
769
+ }
770
+
771
+ // A completed order that lists no capture cannot be told paid: the store
772
+ // then neither pays the order nor opens a second checkout beside it.
773
+ function completedOrderState(order) {
774
+ return captureState(order) || 'confirming';
775
+ }
776
+
777
+ // The page where the buyer approves the order, or finishes a step PayPal asks of them.
778
+ function orderPage(order) {
779
+ var links = order && Array.isArray(order.links) ? order.links : [];
780
+ var page = links.find(function (entry) {
781
+ return entry && (entry.rel === 'approve' || entry.rel === 'payer-action') && entry.href;
782
+ });
783
+ return page ? String(page.href) : '';
784
+ }
785
+
786
+ // An order waiting on the buyer, which the store cannot change: payable on
787
+ // its page until it runs out.
788
+ function openOrder(order) {
789
+ var created = new Date(String((order && order.create_time) || '')).getTime();
790
+ return {
791
+ state: 'open',
792
+ checkoutUrl: orderPage(order),
793
+ openUntil: isFinite(created) ? core.isoTime(created + ORDER_LIFETIME_MS) : '',
794
+ };
795
+ }
796
+
797
+ function orderState(order) {
798
+ var status = String((order && order.status) || '').toUpperCase();
799
+ if (status === 'COMPLETED') {
800
+ return { state: completedOrderState(order), checkoutUrl: '', openUntil: '' };
801
+ }
802
+ if (status === 'APPROVED' || status === 'SAVED') {
803
+ return { state: 'confirming', checkoutUrl: '', openUntil: '' };
804
+ }
805
+ return { state: 'closed', checkoutUrl: '', openUntil: '' };
806
+ }
807
+
808
+ // Closes a PayPal order the store no longer wants paid. PayPal cannot void an
809
+ // order, but it moves no money until the store captures it: the order is
810
+ // marked closed (PayPal lets an order be changed while it is CREATED or
811
+ // APPROVED), and every capture reads that mark first. One the buyer approved
812
+ // but the store never captured is marked too, so a capture that runs late
813
+ // (the approval webhook's retry, the buyer's return page) cannot take the
814
+ // money of an order the merchant settled or cancelled.
815
+ async function closeCheckout(input) {
816
+ var reference = String((input && input.reference) || '').trim();
817
+ if (!reference) {
818
+ return { state: 'closed', checkoutUrl: '', openUntil: '' };
819
+ }
820
+ try {
821
+ var auth = await authenticate();
822
+ if (auth.error) {
823
+ return { state: '', error: auth.error };
824
+ }
825
+ if (reference.indexOf('I-') === 0) {
826
+ return await closeSubscriptionApproval(auth, reference);
827
+ }
828
+ var path = '/v2/checkout/orders/' + encodeURIComponent(reference);
829
+ var answer = await core.request(auth.baseUrl + path, { headers: bearer(auth) });
830
+ if (answer.status === 404) {
831
+ return { state: 'closed', checkoutUrl: '', openUntil: '' };
832
+ }
833
+ if (!answer.ok || !answer.data) {
834
+ return { state: '', error: errorMessage(answer.data, 'PayPal could not be asked about order ' + reference) };
835
+ }
836
+ var status = String(answer.data.status || '').toUpperCase();
837
+ if (status !== 'CREATED' && status !== 'APPROVED' && status !== 'PAYER_ACTION_REQUIRED') {
838
+ return isClosedOrder(answer.data) && status !== 'COMPLETED' ? { state: 'closed', checkoutUrl: '', openUntil: '' } : orderState(answer.data);
839
+ }
840
+ if (isClosedOrder(answer.data)) {
841
+ return { state: 'closed', checkoutUrl: '', openUntil: '' };
842
+ }
843
+ var patched = await markClosed(auth, path, answer.data);
844
+ if (patched.ok) {
845
+ return { state: 'closed', checkoutUrl: '', openUntil: '' };
846
+ }
847
+ // The store captured it between the read and the mark, or it waits on a
848
+ // step the buyer takes at PayPal: read what they left.
849
+ var again = await core.request(auth.baseUrl + path, { headers: bearer(auth) });
850
+ var after = again.ok && again.data ? String(again.data.status || '').toUpperCase() : '';
851
+ if (after === 'PAYER_ACTION_REQUIRED') {
852
+ // Unmarked, it is captured once the buyer finishes that step.
853
+ return openOrder(again.data);
854
+ }
855
+ // Still CREATED or APPROVED and unmarked, it can still be captured: the
856
+ // merchant's change must wait rather than read it as closed.
857
+ if (after && after !== 'CREATED' && after !== 'APPROVED') {
858
+ return orderState(again.data);
859
+ }
860
+ return { state: '', error: errorMessage(patched.data, 'PayPal did not let the store close order ' + reference) };
861
+ } catch (err) {
862
+ return { state: '', error: 'PayPal could not be reached: ' + core.describeError(err) };
863
+ }
864
+ }
865
+
866
+ // A subscription the buyer has not approved yet cannot be cancelled (PayPal
867
+ // cancels only an ACTIVE or SUSPENDED one): its approval page stays open
868
+ // until PayPal lets it run out, which the store bounds by the longest an
869
+ // order lives.
870
+ async function closeSubscriptionApproval(auth, reference) {
871
+ var path = '/v1/billing/subscriptions/' + encodeURIComponent(reference);
872
+ var answer = await core.request(auth.baseUrl + path, { headers: bearer(auth) });
873
+ if (answer.status === 404) {
874
+ return { state: 'closed', checkoutUrl: '', openUntil: '' };
875
+ }
876
+ if (!answer.ok || !answer.data) {
877
+ return { state: '', error: errorMessage(answer.data, 'PayPal could not be asked about subscription ' + reference) };
878
+ }
879
+ var status = String(answer.data.status || '').toUpperCase();
880
+ if (status === 'ACTIVE' || status === 'SUSPENDED') {
881
+ return { state: 'paid', checkoutUrl: '', openUntil: '' };
882
+ }
883
+ if (status === 'APPROVED') {
884
+ return { state: 'confirming', checkoutUrl: '', openUntil: '' };
885
+ }
886
+ if (status !== 'APPROVAL_PENDING') {
887
+ return { state: 'closed', checkoutUrl: '', openUntil: '' };
888
+ }
889
+ var created = new Date(String(answer.data.create_time || '')).getTime();
890
+ return { state: 'open', checkoutUrl: '', openUntil: isFinite(created) ? core.isoTime(created + ORDER_LIFETIME_MS) : '' };
891
+ }
892
+
893
+ // PayPal cannot be searched for an order's checkouts. The one the order's
894
+ // placing opened can be captured until it runs out.
895
+ async function findCheckouts(input) {
896
+ var placed = new Date(String((input && input.placedAt) || '')).getTime();
897
+ if (!isFinite(placed) || placed <= 0) {
898
+ return { error: 'The order to look up names no time it was placed.' };
899
+ }
900
+ return { searchable: false, openUntil: core.isoTime(placed + ORDER_LIFETIME_MS) };
901
+ }
902
+
903
+ function issuesOf(data) {
904
+ return data && Array.isArray(data.details)
905
+ ? data.details.map(function (detail) {
906
+ return String((detail && detail.issue) || '');
907
+ })
908
+ : [];
909
+ }
910
+
911
+ // Where a buyer PayPal sent back finishes paying: the link the refusal
912
+ // names, else the order's approval page, at the address its approve link has.
913
+ function payerActionUrl(auth, data, orderId) {
914
+ var page = orderPage(data);
915
+ return page || siteOf(auth) + '/checkoutnow?token=' + encodeURIComponent(orderId);
916
+ }
917
+
918
+ // Captures the order the buyer just approved (\`?token=<order id>\` on the
919
+ // return URL). A subscription approval returns a \`token\` that is no order
920
+ // (\`subscription_id\` / \`ba_token\` beside it): the ACTIVATED webhook covers it.
921
+ // Answers ok only for a capture PayPal took (\`pending\` while it holds the
922
+ // money for review); a declined capture is refused for good, and one the
923
+ // buyer can fix names the page to fix it on (\`payerActionUrl\`).
924
+ async function confirmReturn(input) {
925
+ var query = input.query || {};
926
+ var orderId = String(query.token || '').trim();
927
+ if (!orderId || query.subscription_id || query.ba_token) {
928
+ return { handled: false };
929
+ }
930
+ var auth = await authenticate();
931
+ if (auth.error) {
932
+ return { handled: true, ok: false, error: auth.error };
933
+ }
934
+ try {
935
+ var orderUrl = auth.baseUrl + '/v2/checkout/orders/' + encodeURIComponent(orderId);
936
+ // An order the store closed (paid another way, or cancelled) is never
937
+ // captured: its approval moves no money, which is how a PayPal page the
938
+ // store cannot void stops being able to take the order's money.
939
+ var current = await core.request(orderUrl, { headers: bearer(auth) });
940
+ if (!current.ok && current.status !== 404) {
941
+ return { handled: true, ok: false, retryable: true, error: errorMessage(current.data, 'PayPal could not be asked about order ' + orderId) };
942
+ }
943
+ if (current.ok && isClosedOrder(current.data) && String(current.data.status || '').toUpperCase() !== 'COMPLETED') {
944
+ return { handled: true, ok: false, retryable: false, closed: true, error: 'The store closed PayPal order ' + orderId + ', so it was not captured.' };
945
+ }
946
+ var headers = bearer(auth);
947
+ // The whole order back, whose capture says whether the money moved.
948
+ headers.Prefer = 'return=representation';
949
+ var response = await fetch(orderUrl + '/capture', {
950
+ method: 'POST',
951
+ headers: headers,
952
+ // Some hardened proxies strip a POST without a body.
953
+ body: '{}',
954
+ });
955
+ var data = await core.readJson(response);
956
+ var issues = issuesOf(data);
957
+ var alreadyCaptured = response.status === 422 && issues.indexOf('ORDER_ALREADY_CAPTURED') !== -1;
958
+ if (!response.ok && !alreadyCaptured) {
959
+ var fixable = issues.some(function (issue) {
960
+ return PAYER_FIXABLE_ISSUES.indexOf(issue) !== -1;
961
+ });
962
+ return {
963
+ handled: true,
964
+ ok: false,
965
+ // An outage, a request still in progress or a rate limit is worth
966
+ // trying again; a refusal stands.
967
+ retryable: response.status >= 500 || response.status === 409 || response.status === 429,
968
+ payerActionUrl: fixable ? payerActionUrl(auth, data, orderId) : '',
969
+ error: errorMessage(data, 'PayPal capture failed'),
970
+ };
971
+ }
972
+ var captured = data;
973
+ if (alreadyCaptured) {
974
+ // Captured before (the buyer's return, the approval webhook): the
975
+ // order's capture says what that did.
976
+ var again = await core.request(orderUrl, { headers: bearer(auth) });
977
+ captured = again.ok ? again.data : null;
978
+ }
979
+ var state = captureState(captured);
980
+ if (state === 'closed') {
981
+ return { handled: true, ok: false, retryable: false, declined: true, error: 'PayPal declined the payment for order ' + orderId + '.' };
982
+ }
983
+ return {
984
+ handled: true,
985
+ ok: true,
986
+ alreadyCaptured: alreadyCaptured,
987
+ pending: state === 'confirming',
988
+ status: state === 'confirming' ? 'PENDING' : state === 'paid' ? 'COMPLETED' : String((captured && captured.status) || 'COMPLETED'),
989
+ };
990
+ } catch (err) {
991
+ return { handled: true, ok: false, retryable: true, error: 'PayPal capture failed: ' + core.describeError(err) };
992
+ }
993
+ }
994
+
995
+ // An APPROVED order has not moved any money: the capture the buyer's return
996
+ // makes does. A buyer who closes the tab before returning never makes it,
997
+ // so the approval captures the order too (a second capture is answered
998
+ // "already captured"). The capture's own event is what pays the order.
999
+ async function captureApprovedOrder(event) {
1000
+ var resource = (event && event.resource) || {};
1001
+ if (!event || event.event_type !== 'CHECKOUT.ORDER.APPROVED' || !resource.id || String(resource.intent || 'CAPTURE').toUpperCase() !== 'CAPTURE') {
1002
+ return { ok: true, body: event };
1003
+ }
1004
+ var capture = await confirmReturn({ query: { token: String(resource.id) } });
1005
+ if (!capture.ok && capture.retryable) {
1006
+ return { ok: false, retry: true, reason: capture.error };
1007
+ }
1008
+ return { ok: true, body: event };
1009
+ }
1010
+
1011
+ // A payment the store confirmed itself — the buyer's return — is settled
1012
+ // without waiting for its webhook, which may never come (a store PayPal
1013
+ // cannot reach, a Webhook ID of another app). The store's own server asks
1014
+ // its webhook route (see the PayPal capture route): the payment is READ from
1015
+ // PayPal with the store's credentials and answered as the event PayPal sends
1016
+ // for it. Nothing but the PayPal id comes from the request.
1017
+ var ORDER_ID_PATTERN = /^[A-Z0-9]{10,36}$/;
1018
+ var SUBSCRIPTION_ID_PATTERN = /^I-[A-Z0-9]{6,40}$/;
1019
+ var CAPTURE_EVENTS = {
1020
+ COMPLETED: 'PAYMENT.CAPTURE.COMPLETED',
1021
+ PENDING: 'PAYMENT.CAPTURE.PENDING',
1022
+ DECLINED: 'PAYMENT.CAPTURE.DECLINED',
1023
+ FAILED: 'PAYMENT.CAPTURE.DECLINED',
1024
+ };
1025
+ // A subscription's first payment is dated from a day before it was created.
1026
+ var FIRST_PAYMENT_WINDOW_MS = 24 * 60 * 60 * 1000;
1027
+
1028
+ function settledEvent(eventType, resource) {
1029
+ return { ok: true, body: { id: 'teleport-settle:' + String(resource.id || ''), event_type: eventType, resource: resource } };
1030
+ }
1031
+
1032
+ function unanswered(answer, fallback) {
1033
+ return { ok: false, retry: answer.status >= 500 || answer.status === 429, reason: errorMessage(answer.data, fallback) };
1034
+ }
1035
+
1036
+ // The capture that decides the order: a completed one, else one PayPal
1037
+ // holds for review, else the latest.
1038
+ function decidingCapture(order) {
1039
+ var payments = purchaseUnit(order).payments;
1040
+ var captures = payments && Array.isArray(payments.captures) ? payments.captures : [];
1041
+ var byStatus = function (status) {
1042
+ return captures.filter(function (capture) {
1043
+ return String((capture && capture.status) || '').toUpperCase() === status;
1044
+ })[0];
1045
+ };
1046
+ return byStatus('COMPLETED') || byStatus('PENDING') || captures[captures.length - 1] || null;
1047
+ }
1048
+
1049
+ async function settleOrder(auth, orderId) {
1050
+ var answer = await core.request(auth.baseUrl + '/v2/checkout/orders/' + encodeURIComponent(orderId), { headers: bearer(auth) });
1051
+ if (!answer.ok || !answer.data) {
1052
+ return unanswered(answer, 'PayPal could not be asked about order ' + orderId);
1053
+ }
1054
+ var capture = decidingCapture(answer.data);
1055
+ var eventType = capture ? CAPTURE_EVENTS[String(capture.status || '').toUpperCase()] : '';
1056
+ if (!eventType) {
1057
+ return { ok: false, reason: 'PayPal order ' + orderId + ' has no capture to settle.' };
1058
+ }
1059
+ var related = (capture.supplementary_data && capture.supplementary_data.related_ids) || {};
1060
+ return settledEvent(eventType, {
1061
+ id: String(capture.id || ''),
1062
+ status: capture.status,
1063
+ amount: capture.amount,
1064
+ custom_id: capture.custom_id || purchaseUnit(answer.data).custom_id || '',
1065
+ supplementary_data: { related_ids: Object.assign({}, related, { order_id: String(answer.data.id || orderId) }) },
1066
+ create_time: capture.create_time,
1067
+ });
1068
+ }
1069
+
1070
+ async function readSubscription(auth, subscriptionId) {
1071
+ var answer = await core.request(auth.baseUrl + '/v1/billing/subscriptions/' + encodeURIComponent(subscriptionId), { headers: bearer(auth) });
1072
+ if (!answer.ok || !answer.data || answer.data.id !== subscriptionId) {
1073
+ return { failure: unanswered(answer, 'PayPal does not know subscription ' + subscriptionId) };
1074
+ }
1075
+ return { subscription: answer.data };
1076
+ }
1077
+
1078
+ // The mandate: PayPal's own ACTIVATED event, from the subscription as it is.
1079
+ async function settleSubscription(auth, subscriptionId) {
1080
+ var read = await readSubscription(auth, subscriptionId);
1081
+ if (read.failure) {
1082
+ return read.failure;
1083
+ }
1084
+ var status = String(read.subscription.status || '').toUpperCase();
1085
+ if (status !== 'ACTIVE') {
1086
+ return { ok: false, reason: 'PayPal subscription ' + subscriptionId + ' is ' + (status || 'not active') + ', not ACTIVE.' };
1087
+ }
1088
+ return settledEvent('BILLING.SUBSCRIPTION.ACTIVATED', read.subscription);
1089
+ }
1090
+
1091
+ // The first cycle's payment: the earliest completed transaction, as the
1092
+ // v1 sale PayPal's PAYMENT.SALE.COMPLETED carries (its id is the sale id).
1093
+ async function settleSubscriptionPayment(auth, subscriptionId) {
1094
+ var read = await readSubscription(auth, subscriptionId);
1095
+ if (read.failure) {
1096
+ return read.failure;
1097
+ }
1098
+ var subscription = read.subscription;
1099
+ var created = Date.parse(String(subscription.create_time || subscription.start_time || ''));
1100
+ var since = (isFinite(created) ? created : Date.now()) - FIRST_PAYMENT_WINDOW_MS;
1101
+ var answer = await core.request(
1102
+ auth.baseUrl + '/v1/billing/subscriptions/' + encodeURIComponent(subscriptionId) + '/transactions' +
1103
+ '?start_time=' + encodeURIComponent(core.isoTime(since)) + '&end_time=' + encodeURIComponent(core.isoTime(Date.now())),
1104
+ { headers: bearer(auth) }
1105
+ );
1106
+ if (!answer.ok || !answer.data) {
1107
+ return unanswered(answer, 'PayPal could not list the payments of subscription ' + subscriptionId);
1108
+ }
1109
+ var completed = (Array.isArray(answer.data.transactions) ? answer.data.transactions : [])
1110
+ .filter(function (transaction) {
1111
+ return transaction && transaction.id && String(transaction.status || '').toUpperCase() === 'COMPLETED';
1112
+ })
1113
+ .sort(function (a, b) {
1114
+ return String(a.time || '').localeCompare(String(b.time || ''));
1115
+ });
1116
+ if (completed.length === 0) {
1117
+ return { ok: false, reason: 'PayPal has not taken the first payment of subscription ' + subscriptionId + ' yet.' };
1118
+ }
1119
+ var gross = (completed[0].amount_with_breakdown && completed[0].amount_with_breakdown.gross_amount) || {};
1120
+ return settledEvent('PAYMENT.SALE.COMPLETED', {
1121
+ id: String(completed[0].id),
1122
+ state: 'completed',
1123
+ amount: { total: String(gross.value == null ? '' : gross.value), currency: String(gross.currency_code || '') },
1124
+ billing_agreement_id: subscriptionId,
1125
+ custom: subscription.custom_id || '',
1126
+ create_time: completed[0].time,
1127
+ });
1128
+ }
1129
+
1130
+ async function reconcile(request) {
1131
+ var kind = String((request && request.kind) || '');
1132
+ var id = String((request && request.id) || '').trim();
1133
+ var known = kind === 'order' ? ORDER_ID_PATTERN.test(id) : (kind === 'subscription' || kind === 'subscription-payment') && SUBSCRIPTION_ID_PATTERN.test(id);
1134
+ if (!known) {
1135
+ return { ok: false, reason: 'The request names no PayPal payment to settle.' };
1136
+ }
1137
+ try {
1138
+ var auth = await authenticate();
1139
+ if (auth.error) {
1140
+ return { ok: false, retry: true, reason: auth.error };
1141
+ }
1142
+ if (kind === 'order') {
1143
+ return await settleOrder(auth, id);
1144
+ }
1145
+ return kind === 'subscription' ? await settleSubscription(auth, id) : await settleSubscriptionPayment(auth, id);
1146
+ } catch (err) {
1147
+ return { ok: false, retry: true, reason: core.describeError(err) };
1148
+ }
1149
+ }
1150
+
1151
+ // What \`reconcile\` settles a checkout the store recorded by, in order: a
1152
+ // subscription's mandate before its first payment.
1153
+ function reconcileKinds(reference) {
1154
+ var id = String(reference || '').trim();
1155
+ if (SUBSCRIPTION_ID_PATTERN.test(id)) {
1156
+ return ['subscription', 'subscription-payment'];
1157
+ }
1158
+ return ORDER_ID_PATTERN.test(id) ? ['order'] : [];
1159
+ }
1160
+
1161
+ // PayPal's verify endpoint must see the event EXACTLY as delivered, so the
1162
+ // raw text is spliced into the request rather than parsed and re-serialised.
1163
+ async function verifySignature(input, id) {
1164
+ var keys = credentials();
1165
+ if (!keys.clientId || !keys.clientSecret) {
1166
+ return { ok: false, reason: MISSING_CREDENTIALS };
1167
+ }
1168
+ var certUrl = core.header(input.headers, 'paypal-cert-url');
1169
+ var baseUrl = certUrl.indexOf('sandbox.paypal.com') !== -1 ? SANDBOX : LIVE;
1170
+ var basicAuth = 'Basic ' + Buffer.from(keys.clientId + ':' + keys.clientSecret).toString('base64');
1171
+ var token = await tryAuth(baseUrl, basicAuth);
1172
+ if (!token.accessToken) {
1173
+ return { ok: false, reason: 'PayPal authentication against ' + baseUrl + ' failed: ' + token.errorMessage };
1174
+ }
1175
+ var fields = {
1176
+ auth_algo: core.header(input.headers, 'paypal-auth-algo'),
1177
+ cert_url: certUrl,
1178
+ transmission_id: core.header(input.headers, 'paypal-transmission-id'),
1179
+ transmission_sig: core.header(input.headers, 'paypal-transmission-sig'),
1180
+ transmission_time: core.header(input.headers, 'paypal-transmission-time'),
1181
+ webhook_id: id,
1182
+ };
1183
+ var fieldsJson = JSON.stringify(fields);
1184
+ // Spliced in by position: a replace() would read "$&" or "$$" in the
1185
+ // event's own text as its tokens and change what PayPal is asked to check.
1186
+ var requestBody = fieldsJson.slice(0, -1) + ',"webhook_event":' + input.rawBody.toString('utf8') + '}';
1187
+ var response = await fetch(baseUrl + '/v1/notifications/verify-webhook-signature', {
1188
+ method: 'POST',
1189
+ headers: { Authorization: 'Bearer ' + token.accessToken, 'Content-Type': 'application/json' },
1190
+ body: requestBody,
1191
+ });
1192
+ var data = await core.readJson(response);
1193
+ if (data && data.verification_status === 'SUCCESS') {
1194
+ return { ok: true, body: input.body };
1195
+ }
1196
+ return {
1197
+ ok: false,
1198
+ reason: 'PayPal rejected the signature: verification_status=' + ((data && data.verification_status) || '(missing)'),
1199
+ };
1200
+ }
1201
+
1202
+ // The event read back from PayPal with the store's own app credentials:
1203
+ // THAT copy is what the store acts on — a forged body names no event PayPal has.
1204
+ async function readBackEvent(input) {
1205
+ var eventId = input.body && typeof input.body.id === 'string' ? input.body.id : '';
1206
+ if (!eventId) {
1207
+ return { ok: false, reason: 'The request names no PayPal event.' };
1208
+ }
1209
+ var auth = await authenticate();
1210
+ if (auth.error) {
1211
+ return { ok: false, reason: auth.error };
1212
+ }
1213
+ var answer = await core.request(auth.baseUrl + '/v1/notifications/webhooks-events/' + encodeURIComponent(eventId), {
1214
+ headers: { Authorization: 'Bearer ' + auth.accessToken },
1215
+ });
1216
+ if (!answer.ok || !answer.data || answer.data.id !== eventId) {
1217
+ return { ok: false, reason: 'PayPal does not know the event ' + eventId + '.' };
1218
+ }
1219
+ return await captureApprovedOrder(answer.data);
1220
+ }
1221
+
1222
+ // With a webhook id the signature is checked by PayPal. A Webhook ID of
1223
+ // another app or environment fails EVERY signature, so a refused one is not
1224
+ // the end: the event is read back from PayPal instead, and the mismatch is
1225
+ // logged for the merchant to fix. Without an id the event is read back.
1226
+ async function verifyWebhook(input) {
1227
+ try {
1228
+ var id = webhookId(input.secret);
1229
+ if (id) {
1230
+ var signed = await verifySignature(input, id);
1231
+ if (signed.ok) {
1232
+ return await captureApprovedOrder(signed.body);
1233
+ }
1234
+ console.warn('PayPal webhook: ' + signed.reason + '. Is the saved Webhook ID the one of the webhook that posts to this store? Reading the event back from PayPal instead.');
1235
+ }
1236
+ return await readBackEvent(input);
1237
+ } catch (err) {
1238
+ return { ok: false, reason: core.describeError(err) };
1239
+ }
1240
+ }
1241
+
1242
+ return {
1243
+ id: 'paypal',
1244
+ createCheckout: createCheckout,
1245
+ createSubscriptionCheckout: createSubscriptionCheckout,
1246
+ inspectCheckout: inspectCheckout,
1247
+ closeCheckout: closeCheckout,
1248
+ findCheckouts: findCheckouts,
1249
+ ensurePlan: ensurePlan,
1250
+ refund: refund,
1251
+ manageSubscription: manageSubscription,
1252
+ billingPortal: billingPortal,
1253
+ confirmReturn: confirmReturn,
1254
+ reconcile: reconcile,
1255
+ reconcileKinds: reconcileKinds,
1256
+ verifyWebhook: verifyWebhook,
1257
+ };
1258
+ };
1259
+ `;
1260
+ exports.generatePaypalDriverCode = generatePaypalDriverCode;
1261
+ //# sourceMappingURL=paypal-driver-code.js.map