@volter/twin-stripe 2.0.37 → 3.0.0

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 (442) hide show
  1. package/README.md +82 -207
  2. package/dist/generated/pack-facts.json +94 -0
  3. package/dist/spec/SOURCE.md +14 -0
  4. package/dist/spec/fixtures3.json.gz +0 -0
  5. package/dist/spec/openapi.json.gz +0 -0
  6. package/dist/spec/patches.json +34 -0
  7. package/dist/spec/sources.json +378 -0
  8. package/dist/src/cli.js +12 -30
  9. package/dist/src/engine/after-payment.d.ts +9 -0
  10. package/dist/src/engine/after-payment.js +28 -0
  11. package/dist/src/engine/apps-secrets.d.ts +1 -0
  12. package/dist/src/engine/apps-secrets.js +3 -0
  13. package/dist/src/engine/balance.d.ts +5 -0
  14. package/dist/src/engine/balance.js +15 -0
  15. package/dist/src/engine/billing.d.ts +5 -0
  16. package/dist/src/engine/billing.js +6 -0
  17. package/dist/src/engine/charges.d.ts +6 -0
  18. package/dist/src/engine/charges.js +13 -0
  19. package/dist/src/engine/checkout.d.ts +24 -0
  20. package/dist/src/engine/checkout.js +30 -0
  21. package/dist/src/engine/common.d.ts +19 -0
  22. package/dist/src/engine/common.js +32 -0
  23. package/dist/src/{screens → engine}/connect-settings.d.ts +1 -7
  24. package/dist/src/engine/connect-settings.js +26 -0
  25. package/dist/src/engine/connect.d.ts +66 -0
  26. package/dist/src/engine/connect.js +189 -0
  27. package/dist/src/engine/coupons.d.ts +0 -0
  28. package/dist/src/engine/coupons.js +5 -0
  29. package/dist/src/engine/credit-notes.d.ts +1 -0
  30. package/dist/src/engine/credit-notes.js +5 -0
  31. package/dist/src/engine/customers.d.ts +12 -0
  32. package/dist/src/engine/customers.js +30 -0
  33. package/dist/src/engine/display.d.ts +14 -0
  34. package/dist/src/engine/display.js +16 -0
  35. package/dist/src/engine/disputes.d.ts +0 -0
  36. package/dist/src/engine/disputes.js +9 -0
  37. package/dist/src/engine/entitlements.d.ts +1 -0
  38. package/dist/src/engine/entitlements.js +4 -0
  39. package/dist/src/engine/ephemeral-keys.d.ts +0 -0
  40. package/dist/src/engine/ephemeral-keys.js +4 -0
  41. package/dist/src/engine/files.d.ts +18 -0
  42. package/dist/src/engine/files.js +33 -0
  43. package/dist/src/engine/front.d.ts +5 -0
  44. package/dist/src/engine/front.js +25 -0
  45. package/dist/src/engine/invoices.d.ts +24 -0
  46. package/dist/src/engine/invoices.js +57 -0
  47. package/dist/src/engine/issuing.d.ts +35 -0
  48. package/dist/src/engine/issuing.js +45 -0
  49. package/dist/src/engine/ledger.d.ts +9 -0
  50. package/dist/src/engine/ledger.js +9 -0
  51. package/dist/src/engine/oauth.d.ts +4 -0
  52. package/dist/src/engine/oauth.js +25 -0
  53. package/dist/src/engine/onboarding.d.ts +13 -0
  54. package/dist/src/engine/onboarding.js +42 -0
  55. package/dist/src/{stripe-params.d.ts → engine/params.d.ts} +20 -3
  56. package/dist/src/{stripe-params.js → engine/params.js} +7 -60
  57. package/dist/src/engine/payment-intents.d.ts +10 -0
  58. package/dist/src/engine/payment-intents.js +27 -0
  59. package/dist/src/engine/payment-links.d.ts +1 -0
  60. package/dist/src/engine/payment-links.js +5 -0
  61. package/dist/src/engine/payment-methods.d.ts +16 -0
  62. package/dist/src/engine/payment-methods.js +22 -0
  63. package/dist/src/engine/plans.d.ts +6 -0
  64. package/dist/src/engine/plans.js +26 -0
  65. package/dist/src/engine/platform.d.ts +39 -0
  66. package/dist/src/engine/platform.js +34 -0
  67. package/dist/src/engine/products.d.ts +0 -0
  68. package/dist/src/engine/products.js +4 -0
  69. package/dist/src/engine/radar.d.ts +2 -0
  70. package/dist/src/engine/radar.js +5 -0
  71. package/dist/src/engine/refunds.d.ts +1 -0
  72. package/dist/src/engine/refunds.js +28 -0
  73. package/dist/src/engine/renewals.d.ts +36 -0
  74. package/dist/src/engine/renewals.js +65 -0
  75. package/dist/src/engine/setup-intents.d.ts +1 -0
  76. package/dist/src/engine/setup-intents.js +4 -0
  77. package/dist/src/{stripe-twin.d.ts → engine/stripe.d.ts} +11 -39
  78. package/dist/src/{stripe-twin.js → engine/stripe.js} +25 -310
  79. package/dist/src/engine/subscription-schedules.d.ts +3 -0
  80. package/dist/src/engine/subscription-schedules.js +1 -0
  81. package/dist/src/engine/subscriptions.d.ts +12 -0
  82. package/dist/src/engine/subscriptions.js +31 -0
  83. package/dist/src/engine/tax.d.ts +7 -0
  84. package/dist/src/engine/tax.js +28 -0
  85. package/dist/src/engine/terminal.d.ts +4 -0
  86. package/dist/src/engine/terminal.js +20 -0
  87. package/dist/src/engine/test-clocks.d.ts +5 -0
  88. package/dist/src/engine/test-clocks.js +9 -0
  89. package/dist/src/engine/tokens.d.ts +7 -0
  90. package/dist/src/engine/tokens.js +20 -0
  91. package/dist/src/engine/transfers.d.ts +2 -0
  92. package/dist/src/engine/transfers.js +1 -0
  93. package/dist/src/engine/treasury.d.ts +23 -0
  94. package/dist/src/engine/treasury.js +45 -0
  95. package/dist/src/{stripe-version.js → engine/version.js} +4 -3
  96. package/dist/src/engine/webhook-endpoints.d.ts +1 -0
  97. package/dist/src/engine/webhook-endpoints.js +12 -0
  98. package/dist/src/engine/webhooks.d.ts +31 -0
  99. package/dist/src/engine/webhooks.js +68 -0
  100. package/dist/src/fetch.d.ts +2 -0
  101. package/dist/src/fetch.js +26 -0
  102. package/dist/src/generated/surface.gen.json +1 -1
  103. package/dist/src/generated/ui.gen.json +1 -1
  104. package/dist/src/index.d.ts +5 -14
  105. package/dist/src/index.js +8 -75
  106. package/dist/src/manifest.js +232 -758
  107. package/dist/src/screens/billing-portal.d.ts +3 -0
  108. package/dist/src/screens/{portal.js → billing-portal.js} +28 -54
  109. package/dist/src/screens/checkout.d.ts +2 -31
  110. package/dist/src/screens/checkout.js +32 -121
  111. package/dist/src/screens/connect-oauth.d.ts +3 -27
  112. package/dist/src/screens/connect-oauth.js +51 -132
  113. package/dist/src/screens/connect-onboarding.d.ts +3 -0
  114. package/dist/src/screens/{onboarding.js → connect-onboarding.js} +36 -102
  115. package/dist/src/screens/dashboard.d.ts +3 -0
  116. package/dist/src/screens/dashboard.js +117 -0
  117. package/dist/src/screens/shared.d.ts +27 -0
  118. package/dist/src/screens/shared.js +87 -0
  119. package/dist/src/screens/stripe-js.d.ts +3 -0
  120. package/dist/src/screens/stripe-js.js +135 -0
  121. package/dist/src/semantics/account_links.d.ts +2 -0
  122. package/dist/src/semantics/account_links.js +22 -0
  123. package/dist/src/semantics/accounts.d.ts +4 -0
  124. package/dist/src/semantics/accounts.js +38 -0
  125. package/dist/src/semantics/apps.d.ts +4 -0
  126. package/dist/src/semantics/{apps-secrets.js → apps.js} +14 -26
  127. package/dist/src/semantics/around.d.ts +2 -0
  128. package/dist/src/semantics/around.js +16 -0
  129. package/dist/src/semantics/balance.d.ts +2 -11
  130. package/dist/src/semantics/balance.js +3 -194
  131. package/dist/src/semantics/balance_transactions.d.ts +2 -0
  132. package/dist/src/semantics/balance_transactions.js +15 -0
  133. package/dist/src/semantics/billing_portal.d.ts +5 -0
  134. package/dist/src/semantics/billing_portal.js +42 -0
  135. package/dist/src/semantics/charges.d.ts +3 -28
  136. package/dist/src/semantics/charges.js +5 -202
  137. package/dist/src/semantics/checkout.d.ts +3 -20
  138. package/dist/src/semantics/checkout.js +8 -261
  139. package/dist/src/semantics/clock.d.ts +2 -0
  140. package/dist/src/semantics/clock.js +21 -0
  141. package/dist/src/semantics/coupons.d.ts +2 -6
  142. package/dist/src/semantics/coupons.js +2 -60
  143. package/dist/src/semantics/customers.d.ts +6 -6
  144. package/dist/src/semantics/customers.js +27 -387
  145. package/dist/src/semantics/disputes.d.ts +2 -2
  146. package/dist/src/semantics/disputes.js +3 -49
  147. package/dist/src/semantics/doors.d.ts +23 -0
  148. package/dist/src/semantics/doors.js +73 -0
  149. package/dist/src/semantics/entitlements.d.ts +2 -2
  150. package/dist/src/semantics/entitlements.js +5 -50
  151. package/dist/src/semantics/events.d.ts +12 -0
  152. package/dist/src/semantics/events.js +36 -0
  153. package/dist/src/semantics/index.d.ts +2 -0
  154. package/dist/src/semantics/index.js +107 -0
  155. package/dist/src/semantics/invoice_payments.d.ts +2 -0
  156. package/dist/src/semantics/invoice_payments.js +12 -0
  157. package/dist/src/semantics/invoiceitems.d.ts +3 -0
  158. package/dist/src/semantics/invoiceitems.js +59 -0
  159. package/dist/src/semantics/invoices.d.ts +16 -18
  160. package/dist/src/semantics/invoices.js +118 -444
  161. package/dist/src/semantics/payment_intents.d.ts +4 -0
  162. package/dist/src/semantics/payment_intents.js +79 -0
  163. package/dist/src/semantics/payment_methods.d.ts +5 -0
  164. package/dist/src/semantics/payment_methods.js +39 -0
  165. package/dist/src/semantics/payouts.d.ts +2 -0
  166. package/dist/src/semantics/payouts.js +21 -0
  167. package/dist/src/semantics/prices.d.ts +4 -0
  168. package/dist/src/semantics/prices.js +37 -0
  169. package/dist/src/semantics/products.d.ts +6 -2
  170. package/dist/src/semantics/products.js +15 -130
  171. package/dist/src/semantics/promotion_codes.d.ts +3 -0
  172. package/dist/src/semantics/promotion_codes.js +35 -0
  173. package/dist/src/semantics/radar.d.ts +2 -2
  174. package/dist/src/semantics/radar.js +5 -74
  175. package/dist/src/semantics/refunds.d.ts +3 -9
  176. package/dist/src/semantics/refunds.js +6 -192
  177. package/dist/src/semantics/setup_intents.d.ts +3 -0
  178. package/dist/src/semantics/{setup-intents.js → setup_intents.js} +10 -53
  179. package/dist/src/semantics/shared.d.ts +822 -47
  180. package/dist/src/semantics/shared.js +3044 -78
  181. package/dist/src/semantics/states.d.ts +531 -0
  182. package/dist/src/semantics/states.js +852 -0
  183. package/dist/src/semantics/subscription_items.d.ts +5 -0
  184. package/dist/src/semantics/subscription_items.js +55 -0
  185. package/dist/src/semantics/subscription_schedules.d.ts +4 -0
  186. package/dist/src/semantics/subscription_schedules.js +60 -0
  187. package/dist/src/semantics/subscriptions.d.ts +7 -11
  188. package/dist/src/semantics/subscriptions.js +44 -415
  189. package/dist/src/semantics/test_helpers.d.ts +6 -0
  190. package/dist/src/semantics/{test-clocks.js → test_helpers.js} +14 -40
  191. package/dist/src/semantics/transfers.d.ts +2 -2
  192. package/dist/src/semantics/transfers.js +6 -101
  193. package/dist/src/server.d.ts +7 -0
  194. package/dist/src/server.js +7 -0
  195. package/generated/pack-facts.json +94 -0
  196. package/package.json +10 -20
  197. package/spec/SOURCE.md +14 -0
  198. package/spec/fixtures3.json.gz +0 -0
  199. package/spec/openapi.json.gz +0 -0
  200. package/spec/patches.json +34 -0
  201. package/spec/sources.json +378 -0
  202. package/src/cli.ts +12 -26
  203. package/src/engine/after-payment.ts +31 -0
  204. package/src/engine/apps-secrets.ts +4 -0
  205. package/src/engine/balance.ts +33 -0
  206. package/src/engine/billing.ts +16 -0
  207. package/src/engine/charges.ts +19 -0
  208. package/src/engine/checkout.ts +40 -0
  209. package/src/engine/common.ts +47 -0
  210. package/src/engine/connect-settings.ts +23 -0
  211. package/src/engine/connect.ts +184 -0
  212. package/src/engine/coupons.ts +5 -0
  213. package/src/engine/credit-notes.ts +6 -0
  214. package/src/engine/customers.ts +35 -0
  215. package/src/engine/display.ts +19 -0
  216. package/src/engine/disputes.ts +9 -0
  217. package/src/engine/entitlements.ts +5 -0
  218. package/src/engine/ephemeral-keys.ts +3 -0
  219. package/src/engine/files.ts +41 -0
  220. package/src/engine/front.ts +31 -0
  221. package/src/engine/invoices.ts +71 -0
  222. package/src/engine/issuing.ts +61 -0
  223. package/src/engine/ledger.ts +50 -0
  224. package/src/engine/oauth.ts +19 -0
  225. package/src/engine/onboarding.ts +54 -0
  226. package/src/{stripe-params.ts → engine/params.ts} +8 -56
  227. package/src/engine/payment-intents.ts +33 -0
  228. package/src/engine/payment-links.ts +6 -0
  229. package/src/engine/payment-methods.ts +25 -0
  230. package/src/engine/plans.ts +42 -0
  231. package/src/engine/platform.ts +47 -0
  232. package/src/engine/products.ts +3 -0
  233. package/src/engine/radar.ts +6 -0
  234. package/src/engine/refunds.ts +29 -0
  235. package/src/engine/renewals.ts +73 -0
  236. package/src/engine/setup-intents.ts +5 -0
  237. package/src/{stripe-twin.ts → engine/stripe.ts} +28 -323
  238. package/src/engine/subscription-schedules.ts +10 -0
  239. package/src/engine/subscriptions.ts +40 -0
  240. package/src/engine/tax.ts +39 -0
  241. package/src/engine/terminal.ts +23 -0
  242. package/src/engine/test-clocks.ts +11 -0
  243. package/src/engine/tokens.ts +22 -0
  244. package/src/engine/transfers.ts +23 -0
  245. package/src/engine/treasury.ts +47 -0
  246. package/src/{stripe-version.ts → engine/version.ts} +4 -3
  247. package/src/engine/webhook-endpoints.ts +14 -0
  248. package/src/engine/webhooks.ts +72 -0
  249. package/src/fetch.ts +27 -0
  250. package/src/generated/surface.gen.json +1 -1
  251. package/src/generated/ui.gen.json +1 -1
  252. package/src/index.ts +8 -116
  253. package/src/manifest.ts +234 -786
  254. package/src/screens/{portal.tsx → billing-portal.tsx} +32 -37
  255. package/src/screens/checkout.tsx +33 -95
  256. package/src/screens/connect-oauth.tsx +64 -88
  257. package/src/screens/{onboarding.tsx → connect-onboarding.tsx} +38 -82
  258. package/src/screens/dashboard.tsx +198 -0
  259. package/src/screens/shared.tsx +84 -0
  260. package/src/screens/stripe-js.ts +170 -0
  261. package/src/semantics/account_links.ts +21 -0
  262. package/src/semantics/accounts.ts +43 -0
  263. package/src/semantics/{apps-secrets.ts → apps.ts} +17 -32
  264. package/src/semantics/around.ts +20 -0
  265. package/src/semantics/balance.ts +6 -207
  266. package/src/semantics/balance_transactions.ts +20 -0
  267. package/src/semantics/billing_portal.ts +51 -0
  268. package/src/semantics/charges.ts +12 -211
  269. package/src/semantics/checkout.ts +13 -268
  270. package/src/semantics/clock.ts +26 -0
  271. package/src/semantics/coupons.ts +5 -67
  272. package/src/semantics/customers.ts +29 -392
  273. package/src/semantics/disputes.ts +9 -59
  274. package/src/semantics/doors.ts +80 -0
  275. package/src/semantics/entitlements.ts +9 -56
  276. package/src/semantics/events.ts +44 -0
  277. package/src/semantics/index.ts +111 -0
  278. package/src/semantics/invoice_payments.ts +18 -0
  279. package/src/semantics/invoiceitems.ts +59 -0
  280. package/src/semantics/invoices.ts +109 -443
  281. package/src/semantics/payment_intents.ts +83 -0
  282. package/src/semantics/payment_methods.ts +43 -0
  283. package/src/semantics/payouts.ts +23 -0
  284. package/src/semantics/prices.ts +42 -0
  285. package/src/semantics/products.ts +18 -142
  286. package/src/semantics/promotion_codes.ts +39 -0
  287. package/src/semantics/radar.ts +8 -77
  288. package/src/semantics/refunds.ts +9 -212
  289. package/src/semantics/setup_intents.ts +45 -0
  290. package/src/semantics/shared.ts +3092 -106
  291. package/src/semantics/states.ts +883 -0
  292. package/src/semantics/subscription_items.ts +54 -0
  293. package/src/semantics/subscription_schedules.ts +66 -0
  294. package/src/semantics/subscriptions.ts +49 -432
  295. package/src/semantics/{test-clocks.ts → test_helpers.ts} +23 -47
  296. package/src/semantics/transfers.ts +11 -131
  297. package/src/server.ts +8 -0
  298. package/client/dashboard-api.ts +0 -286
  299. package/client/stripe-mirror.css +0 -277
  300. package/client/stripe-mirror.tsx +0 -1559
  301. package/dist/client/dashboard-api.d.ts +0 -107
  302. package/dist/client/dashboard-api.js +0 -238
  303. package/dist/client/dashboard-api.ts +0 -286
  304. package/dist/client/stripe-mirror.bundle.js +0 -236
  305. package/dist/client/stripe-mirror.css +0 -277
  306. package/dist/client/stripe-mirror.d.ts +0 -134
  307. package/dist/client/stripe-mirror.js +0 -859
  308. package/dist/client/stripe-mirror.tsx +0 -1559
  309. package/dist/src/screens/connect-settings.js +0 -103
  310. package/dist/src/screens/consent-skin.d.ts +0 -4
  311. package/dist/src/screens/consent-skin.js +0 -18
  312. package/dist/src/screens/financial-connections.d.ts +0 -5
  313. package/dist/src/screens/financial-connections.js +0 -90
  314. package/dist/src/screens/identity.d.ts +0 -5
  315. package/dist/src/screens/identity.js +0 -86
  316. package/dist/src/screens/onboarding.d.ts +0 -13
  317. package/dist/src/screens/portal.d.ts +0 -5
  318. package/dist/src/screens/public-details.d.ts +0 -5
  319. package/dist/src/screens/public-details.js +0 -90
  320. package/dist/src/semantics/after-payment.d.ts +0 -22
  321. package/dist/src/semantics/after-payment.js +0 -99
  322. package/dist/src/semantics/apps-secrets.d.ts +0 -2
  323. package/dist/src/semantics/billing.d.ts +0 -2
  324. package/dist/src/semantics/billing.js +0 -220
  325. package/dist/src/semantics/connect.d.ts +0 -5
  326. package/dist/src/semantics/connect.js +0 -493
  327. package/dist/src/semantics/credit-notes.d.ts +0 -2
  328. package/dist/src/semantics/credit-notes.js +0 -172
  329. package/dist/src/semantics/ephemeral-keys.d.ts +0 -2
  330. package/dist/src/semantics/ephemeral-keys.js +0 -34
  331. package/dist/src/semantics/files.d.ts +0 -2
  332. package/dist/src/semantics/files.js +0 -125
  333. package/dist/src/semantics/issuing.d.ts +0 -13
  334. package/dist/src/semantics/issuing.js +0 -575
  335. package/dist/src/semantics/ledger.d.ts +0 -59
  336. package/dist/src/semantics/ledger.js +0 -200
  337. package/dist/src/semantics/payment-intents.d.ts +0 -18
  338. package/dist/src/semantics/payment-intents.js +0 -452
  339. package/dist/src/semantics/payment-links.d.ts +0 -2
  340. package/dist/src/semantics/payment-links.js +0 -133
  341. package/dist/src/semantics/payment-methods.d.ts +0 -20
  342. package/dist/src/semantics/payment-methods.js +0 -140
  343. package/dist/src/semantics/plans.d.ts +0 -5
  344. package/dist/src/semantics/plans.js +0 -121
  345. package/dist/src/semantics/platform.d.ts +0 -9
  346. package/dist/src/semantics/platform.js +0 -206
  347. package/dist/src/semantics/renewals.d.ts +0 -47
  348. package/dist/src/semantics/renewals.js +0 -281
  349. package/dist/src/semantics/setup-intents.d.ts +0 -2
  350. package/dist/src/semantics/subscription-schedules.d.ts +0 -2
  351. package/dist/src/semantics/subscription-schedules.js +0 -119
  352. package/dist/src/semantics/tax.d.ts +0 -2
  353. package/dist/src/semantics/tax.js +0 -197
  354. package/dist/src/semantics/terminal.d.ts +0 -5
  355. package/dist/src/semantics/terminal.js +0 -182
  356. package/dist/src/semantics/test-clocks.d.ts +0 -6
  357. package/dist/src/semantics/tokens.d.ts +0 -4
  358. package/dist/src/semantics/tokens.js +0 -44
  359. package/dist/src/semantics/treasury.d.ts +0 -2
  360. package/dist/src/semantics/treasury.js +0 -377
  361. package/dist/src/semantics/webhook-endpoints.d.ts +0 -3
  362. package/dist/src/semantics/webhook-endpoints.js +0 -85
  363. package/dist/src/stripe-budget.d.ts +0 -55
  364. package/dist/src/stripe-budget.js +0 -155
  365. package/dist/src/stripe-capabilities.d.ts +0 -3
  366. package/dist/src/stripe-capabilities.js +0 -5836
  367. package/dist/src/stripe-conformance.d.ts +0 -43
  368. package/dist/src/stripe-conformance.js +0 -105
  369. package/dist/src/stripe-connector.d.ts +0 -161
  370. package/dist/src/stripe-connector.js +0 -414
  371. package/dist/src/stripe-emit.d.ts +0 -2
  372. package/dist/src/stripe-emit.js +0 -145
  373. package/dist/src/stripe-events.d.ts +0 -93
  374. package/dist/src/stripe-events.js +0 -392
  375. package/dist/src/stripe-js.d.ts +0 -4
  376. package/dist/src/stripe-js.js +0 -70
  377. package/dist/src/stripe-mirror-ui.d.ts +0 -15
  378. package/dist/src/stripe-mirror-ui.js +0 -87
  379. package/dist/src/stripe-perform-harness.d.ts +0 -9
  380. package/dist/src/stripe-perform-harness.js +0 -26
  381. package/dist/src/stripe-server.d.ts +0 -33
  382. package/dist/src/stripe-server.js +0 -429
  383. package/dist/src/stripe-shared.d.ts +0 -109
  384. package/dist/src/stripe-shared.js +0 -276
  385. package/dist/src/stripe-ui-conformance.d.ts +0 -5
  386. package/dist/src/stripe-ui-conformance.js +0 -79
  387. package/dist/src/stripe-ui-structure.d.ts +0 -3
  388. package/dist/src/stripe-ui-structure.js +0 -168
  389. package/dist/test-fixtures/stripe-known-deviations.json +0 -110
  390. package/dist/test-fixtures/stripe-openapi-operations.SOURCE.md +0 -14
  391. package/dist/test-fixtures/stripe-openapi-operations.json +0 -4717
  392. package/dist/test-fixtures/stripe-schemas.SOURCE.md +0 -35
  393. package/dist/test-fixtures/stripe-schemas.json +0 -3813
  394. package/src/screens/connect-settings.tsx +0 -121
  395. package/src/screens/consent-skin.ts +0 -20
  396. package/src/screens/financial-connections.tsx +0 -101
  397. package/src/screens/identity.tsx +0 -96
  398. package/src/screens/public-details.tsx +0 -105
  399. package/src/semantics/after-payment.ts +0 -118
  400. package/src/semantics/billing.ts +0 -216
  401. package/src/semantics/connect.ts +0 -487
  402. package/src/semantics/credit-notes.ts +0 -168
  403. package/src/semantics/ephemeral-keys.ts +0 -34
  404. package/src/semantics/files.ts +0 -143
  405. package/src/semantics/issuing.ts +0 -590
  406. package/src/semantics/ledger.ts +0 -253
  407. package/src/semantics/payment-intents.ts +0 -463
  408. package/src/semantics/payment-links.ts +0 -148
  409. package/src/semantics/payment-methods.ts +0 -145
  410. package/src/semantics/plans.ts +0 -131
  411. package/src/semantics/platform.ts +0 -220
  412. package/src/semantics/renewals.ts +0 -279
  413. package/src/semantics/setup-intents.ts +0 -87
  414. package/src/semantics/subscription-schedules.ts +0 -129
  415. package/src/semantics/tax.ts +0 -220
  416. package/src/semantics/terminal.ts +0 -195
  417. package/src/semantics/tokens.ts +0 -52
  418. package/src/semantics/treasury.ts +0 -383
  419. package/src/semantics/webhook-endpoints.ts +0 -87
  420. package/src/stripe-budget.ts +0 -181
  421. package/src/stripe-capabilities.ts +0 -5651
  422. package/src/stripe-conformance.ts +0 -124
  423. package/src/stripe-connector.ts +0 -462
  424. package/src/stripe-emit.ts +0 -157
  425. package/src/stripe-events.ts +0 -434
  426. package/src/stripe-js.ts +0 -70
  427. package/src/stripe-mirror-ui.ts +0 -90
  428. package/src/stripe-perform-harness.ts +0 -29
  429. package/src/stripe-server.ts +0 -393
  430. package/src/stripe-shared.ts +0 -297
  431. package/src/stripe-ui-conformance.ts +0 -88
  432. package/src/stripe-ui-structure.ts +0 -182
  433. package/test-fixtures/stripe-known-deviations.json +0 -110
  434. package/test-fixtures/stripe-openapi-operations.json +0 -4717
  435. package/test-fixtures/stripe-schemas.json +0 -3813
  436. /package/dist/src/{screens → engine}/industries.d.ts +0 -0
  437. /package/dist/src/{screens → engine}/industries.js +0 -0
  438. /package/dist/src/{semantics → engine}/test-cards.d.ts +0 -0
  439. /package/dist/src/{semantics → engine}/test-cards.js +0 -0
  440. /package/dist/src/{stripe-version.d.ts → engine/version.d.ts} +0 -0
  441. /package/src/{screens → engine}/industries.ts +0 -0
  442. /package/src/{semantics → engine}/test-cards.ts +0 -0
@@ -16,20 +16,16 @@
16
16
  // (the account's default) enables cancellation at period end, updating the payment method and invoice history;
17
17
  // changing the plan from the portal is not offered yet. A new card is saved without a charge, so a card that
18
18
  // declines only when charged (4000000000000341) is saved and declines when the invoice is paid.
19
- import { semanticsContext, type SemanticsContext } from '@volter/world-core';
20
- import { flowPage, Portal, PORTAL_CSS, type PaymentField, type PortalItem } from '@volter/world-ui';
21
- import surface from '../generated/surface.gen.json' with { type: 'json' };
22
- import { manifest } from '../manifest.ts';
23
- import { payerOf, payOpenInvoice } from '../semantics/renewals.ts';
24
- import { afterSuccessOf } from '../semantics/after-payment.ts';
25
- import { created, type Row } from '../semantics/shared.ts';
26
- import { publicBusinessName } from '../stripe-shared.ts';
27
- import { declineFor, paymentMethodSubObject, PLATFORM_ACCOUNT_ID } from '../stripe-twin.ts';
28
- import { cardAnswer, COUNTRIES, money } from './checkout.tsx';
29
- import { formOf } from './consent-skin.ts';
19
+ import type { HandlerContext } from '@volter/world-core';
20
+ import { flowPage, type PaymentField, Portal, PORTAL_CSS, type PortalItem } from '@volter/world-ui';
21
+ import type { Row } from '../engine/common.ts';
22
+ import { publicBusinessName } from '../engine/display.ts';
23
+ import { declineFor, nowUnix, paymentMethodSubObject, PLATFORM_ACCOUNT_ID } from '../engine/stripe.ts';
24
+ import { cardAnswer, COUNTRIES, formOf, money, notFound } from './shared.tsx';
25
+ import { afterSuccessOf, created, payerOf, payOpenInvoice } from '../semantics/shared.ts';
30
26
 
31
27
  const SUB = 'subscription';
32
- const PORTAL_OPERATION = (surface.operations as Array<{ id: string; method: string; path: string; class: string }>).find((o) => o.id === 'PostBillingPortalSessions')!;
28
+ const PORTAL_OPERATION = { id: 'PostBillingPortalSessions' };
33
29
 
34
30
  // Stripe's skin: its type, its purple accent, the merchant's side tinted.
35
31
  const SKIN = `
@@ -50,7 +46,7 @@ const day = (epoch: unknown): string => new Date(Number(epoch) * 1000).toLocaleD
50
46
  const gone = (): Response => flowPage({ title: 'Billing', status: 404, css: [PORTAL_CSS, SKIN], body: <main className="portal-main"><h1>This link has expired.</h1></main> });
51
47
 
52
48
  type Features = { cancel: { enabled: boolean; mode: 'at_period_end' | 'immediately' }; invoices: boolean; paymentMethod: boolean };
53
- function featuresOf(ctx: SemanticsContext, session: Row): Features {
49
+ function featuresOf(ctx: HandlerContext, session: Row): Features {
54
50
  const f = (ctx.get('billing_portal.configuration', String(session.configuration))?.features ?? undefined) as Row | undefined;
55
51
  const cancel = (f?.subscription_cancel ?? {}) as Row;
56
52
  const invoices = (f?.invoice_history ?? {}) as Row;
@@ -62,7 +58,7 @@ function featuresOf(ctx: SemanticsContext, session: Row): Features {
62
58
  };
63
59
  }
64
60
 
65
- function planOf(ctx: SemanticsContext, sub: Row): { name: string; price: string } {
61
+ function planOf(ctx: HandlerContext, sub: Row): { name: string; price: string } {
66
62
  const item = (((sub.items as { data?: Row[] } | undefined)?.data) ?? [])[0];
67
63
  const price = (typeof item?.price === 'object' ? item.price : ctx.get('price', String(item?.price ?? ''))) as Row | undefined;
68
64
  const product = typeof price?.product === 'string' ? ctx.get('product', price.product) : (price?.product as Row | undefined);
@@ -73,7 +69,7 @@ function planOf(ctx: SemanticsContext, sub: Row): { name: string; price: string
73
69
  };
74
70
  }
75
71
 
76
- function page(ctx: SemanticsContext, id: string, session: Row, problem?: { error: string; values: Record<string, string> }): Response {
72
+ function page(ctx: HandlerContext, id: string, session: Row, problem?: { error: string; values: Record<string, string> }): Response {
77
73
  const features = featuresOf(ctx, session);
78
74
  const customer = ctx.get('customer', String(session.customer)) ?? {};
79
75
  const subs = ctx.rows(SUB).filter((s) => s.customer === session.customer && s.status !== 'canceled' && s.status !== 'incomplete_expired');
@@ -106,7 +102,7 @@ function page(ctx: SemanticsContext, id: string, session: Row, problem?: { error
106
102
  }))
107
103
  : [];
108
104
  const back = typeof session.return_url === 'string' ? session.return_url : undefined;
109
- // the portal shows the public business name (stripe-shared.ts, publicBusinessName) of the session's on_behalf_of
105
+ // the portal shows the public business name (../engine/display.ts, publicBusinessName) of the session's on_behalf_of
110
106
  // account ("Use the Accounts API to modify the on_behalf_of account's branding settings, which the portal displays",
111
107
  // docs.stripe.com/api/customer_portal/sessions/object), else of the account it was made on (Stripe-Account), else the
112
108
  // platform's
@@ -143,7 +139,7 @@ function page(ctx: SemanticsContext, id: string, session: Row, problem?: { error
143
139
  }
144
140
 
145
141
  /** The customer's move on one of their subscriptions, then back to the portal. */
146
- async function move(ctx: SemanticsContext, id: string, session: Row, subscription: string, kind: 'cancel' | 'renew'): Promise<Response> {
142
+ async function move(ctx: HandlerContext, id: string, session: Row, subscription: string, kind: 'cancel' | 'renew'): Promise<Response> {
147
143
  const sub = ctx.get(SUB, subscription);
148
144
  if (!sub || sub.customer !== session.customer || sub.status === 'canceled') return gone();
149
145
  const back = new Response(null, { status: 303, headers: { location: `/p/session/${id}` } });
@@ -153,7 +149,7 @@ async function move(ctx: SemanticsContext, id: string, session: Row, subscriptio
153
149
  }
154
150
  const features = featuresOf(ctx, session);
155
151
  if (!features.cancel.enabled) return gone();
156
- const now = Number(ctx.now());
152
+ const now = nowUnix(ctx.occurredAt);
157
153
  const details = { comment: null, feedback: null, reason: 'cancellation_requested' };
158
154
  if (features.cancel.mode === 'at_period_end') {
159
155
  await ctx.write(SUB, subscription, { cancel_at_period_end: true, cancel_at: sub.current_period_end ?? null, canceled_at: now, cancellation_details: details }, 'subscription.update');
@@ -166,9 +162,9 @@ async function move(ctx: SemanticsContext, id: string, session: Row, subscriptio
166
162
  }
167
163
 
168
164
  /** The customer's new card: saved on them (no charge) as the default their invoices and subscriptions charge. */
169
- async function updatePaymentMethod(ctx: SemanticsContext, id: string, session: Row, v: Record<string, string>): Promise<Response> {
165
+ async function updatePaymentMethod(ctx: HandlerContext, id: string, session: Row, v: Record<string, string>): Promise<Response> {
170
166
  if (!featuresOf(ctx, session).paymentMethod) return gone();
171
- const refused = cardAnswer(v, Number(ctx.now()), false);
167
+ const refused = cardAnswer(v, nowUnix(ctx.occurredAt), false);
172
168
  if (refused) return page(ctx, id, session, { error: refused, values: v });
173
169
  const customer = String(session.customer);
174
170
  const [month, year] = (v.cardExpiry ?? '').split('/').map((x) => Number(x.trim()));
@@ -188,7 +184,7 @@ async function updatePaymentMethod(ctx: SemanticsContext, id: string, session: R
188
184
  }
189
185
 
190
186
  /** The customer pays one of their open invoices with the card on file. */
191
- async function payInvoice(ctx: SemanticsContext, id: string, session: Row, invoiceId: string): Promise<Response> {
187
+ async function payInvoice(ctx: HandlerContext, id: string, session: Row, invoiceId: string): Promise<Response> {
192
188
  const inv = ctx.get('invoice', invoiceId);
193
189
  if (!inv || inv.customer !== session.customer || inv.status !== 'open') return gone();
194
190
  const sub = typeof inv.subscription === 'string' ? ctx.get(SUB, inv.subscription) : undefined;
@@ -201,20 +197,19 @@ async function payInvoice(ctx: SemanticsContext, id: string, session: Row, invoi
201
197
  }
202
198
 
203
199
  /** billing.stripe.com's portal pages, or undefined for any other request. */
204
- export function stripePortalFlow(scope: { root?: string; clock?: () => string }): (request: Request) => Promise<Response | undefined> {
205
- return async (request) => {
206
- const m = /^\/p\/session\/(bps_[A-Za-z0-9_]+)(?:\/(cancel|renew|payment_method|pay))?\/?$/.exec(new URL(request.url).pathname);
207
- if (!m) return undefined;
208
- const [, id, kind] = m as unknown as [string, string, 'cancel' | 'renew' | 'payment_method' | 'pay' | undefined];
209
- if ((kind && request.method !== 'POST') || (!kind && request.method !== 'GET')) return undefined;
210
- // the form is read before the context, which reads the request's body itself
211
- const form = kind ? await formOf(request.clone()) : {};
212
- const ctx = await semanticsContext(manifest, request, PORTAL_OPERATION, scope);
213
- const session = ctx.get('billing_portal.session', id);
214
- if (!session) return gone();
215
- if (!kind) return page(ctx, id, session);
216
- if (kind === 'payment_method') return updatePaymentMethod(ctx, id, session, form);
217
- if (kind === 'pay') return payInvoice(ctx, id, session, form.invoice ?? '');
218
- return move(ctx, id, session, form.subscription ?? '', kind);
219
- };
200
+ export async function screen(ctx: HandlerContext): Promise<Response> {
201
+ const request = ctx.call.request;
202
+ const m = /^\/p\/session\/(bps_[A-Za-z0-9_]+)(?:\/(cancel|renew|payment_method|pay))?\/?$/.exec(new URL(request.url).pathname);
203
+ if (!m) return notFound();
204
+ const [, id, kind] = m as unknown as [string, string, 'cancel' | 'renew' | 'payment_method' | 'pay' | undefined];
205
+ if ((kind && request.method !== 'POST') || (!kind && request.method !== 'GET')) return notFound();
206
+ // the form is read before the context, which reads the request's body itself
207
+ const form = kind ? await formOf(request.clone()) : {};
208
+ const session = ctx.get('billing_portal.session', id);
209
+ if (!session) return gone();
210
+ if (!kind) return page(ctx, id, session);
211
+ if (kind === 'payment_method') return updatePaymentMethod(ctx, id, session, form);
212
+ if (kind === 'pay') return payInvoice(ctx, id, session, form.invoice ?? '');
213
+ return move(ctx, id, session, form.subscription ?? '', kind);
220
214
  }
215
+
@@ -15,41 +15,18 @@
15
15
  // only sets the card up: setup mode, or a subscription's trial);
16
16
  // any other number that passes the Luhn check pays, and a card that asks for authentication pays without
17
17
  // the challenge. A subscription session with no customer makes one from the email, as Stripe does.
18
- import { semanticsContext, type SemanticsContext } from '@volter/world-core';
18
+ import type { HandlerContext } from '@volter/world-core';
19
19
  import { flowPage, Payment, PAYMENT_CSS, type PaymentField } from '@volter/world-ui';
20
- import surface from '../generated/surface.gen.json' with { type: 'json' };
21
- import { manifest } from '../manifest.ts';
22
- import { completeSession, isOneTime } from '../semantics/checkout.ts';
23
- import { newCustomer } from '../semantics/customers.ts';
24
- import { created, type Row } from '../semantics/shared.ts';
25
- import { publicBusinessName } from '../stripe-shared.ts';
26
- import { applyCouponDiscount, PLATFORM_ACCOUNT_ID, resolveTrial } from '../stripe-twin.ts';
27
- import { formOf } from './consent-skin.ts';
20
+ import { isOneTime } from '../engine/checkout.ts';
21
+ import { newCustomer } from '../engine/customers.ts';
22
+ import type { Row } from '../engine/common.ts';
23
+ import { publicBusinessName } from '../engine/display.ts';
24
+ import { applyCouponDiscount, nowUnix, PLATFORM_ACCOUNT_ID, resolveTrial } from '../engine/stripe.ts';
25
+ import { cardAnswer, COUNTRIES, formOf, money, notFound, parseExpiry } from './shared.tsx';
26
+ import { completeSession, created } from '../semantics/shared.ts';
28
27
 
29
28
  const CS = 'checkout.session';
30
- const COMPLETE_OPERATION = (surface.operations as Array<{ id: string; method: string; path: string; class: string }>).find((o) => o.id === 'PostCheckoutSessionsSession')!;
31
-
32
- const DECLINES: Record<string, string> = {
33
- '4000000000000002': 'Your card was declined.',
34
- '4000000000009995': 'Your card has insufficient funds.',
35
- '4000000000000069': 'Your card has expired.',
36
- '4000000000000127': "Your card's security code is incorrect.",
37
- };
38
- const luhn = (digits: string): boolean => {
39
- let sum = 0;
40
- for (let i = 0; i < digits.length; i++) {
41
- let d = Number(digits[digits.length - 1 - i]);
42
- if (i % 2 === 1) { d *= 2; if (d > 9) d -= 9; }
43
- sum += d;
44
- }
45
- return digits.length >= 12 && sum % 10 === 0;
46
- };
47
-
48
- export const money = (minor: unknown, currency: unknown): string => {
49
- const c = typeof currency === 'string' ? currency.toUpperCase() : 'USD';
50
- const zeroDecimal = ['JPY', 'KRW', 'VND', 'CLP', 'ISK', 'UGX', 'XAF', 'XOF'].includes(c);
51
- return new Intl.NumberFormat('en-US', { style: 'currency', currency: c }).format((Number(minor) || 0) / (zeroDecimal ? 1 : 100));
52
- };
29
+ const COMPLETE_OPERATION = { id: 'PostCheckoutSessionsSession' };
53
30
 
54
31
  // Stripe's skin: its type, its blue submit, the summary on a tinted half.
55
32
  const SKIN = `
@@ -61,8 +38,6 @@ body { color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI
61
38
  .pay-submit { background: #0074d4; color: #ffffff; }
62
39
  `;
63
40
 
64
- export const COUNTRIES = [['US', 'United States'], ['GB', 'United Kingdom'], ['CA', 'Canada'], ['DE', 'Germany'], ['FR', 'France'], ['AU', 'Australia'], ['JP', 'Japan']].map(([value, label]) => ({ value: value!, label: label! }));
65
-
66
41
  /** A subscription session's trial, when its subscription_data gives one: `trial_period_days`, or `trial_end`
67
42
  * (docs.stripe.com/payments/checkout/free-trials), as resolveTrial makes the subscription's at completion. */
68
43
  function trialOf(session: Row, now: number): { start: number; end: number } | undefined {
@@ -103,7 +78,7 @@ function trialSummary(session: Row, trial: { start: number; end: number }): { le
103
78
 
104
79
  /** What each period after the trial charges, as the subscription's invoices will: its recurring line items (a one-time
105
80
  * item is on the first invoice only, semantics/checkout.ts isOneTime), under the session's coupon unless the coupon is `once`, which the trial's own $0
106
- * invoice takes (semantics/renewals.ts draftSubscriptionInvoice). */
81
+ * invoice takes (../engine/renewals.ts draftSubscriptionInvoice). */
107
82
  function afterTrial(session: Row): number {
108
83
  const items = (((session.line_items as { data?: Row[] } | undefined)?.data) ?? []).filter((it, i) => !isOneTime(it, inlineOf(session, i)));
109
84
  const subtotal = items.reduce((sum, it) => sum + (Number(it.amount_subtotal) || 0), 0);
@@ -167,52 +142,17 @@ function page(session: Row, id: string, now: number, values: Record<string, stri
167
142
  const gone = (): Response =>
168
143
  flowPage({ title: 'Checkout', status: 404, css: [PAYMENT_CSS, SKIN], body: <main className="pay-form"><h1>This Checkout Session is no longer active.</h1></main> });
169
144
 
170
- /** Cards that are saved but decline when charged. */
171
- const DECLINES_WHEN_CHARGED: Record<string, string> = { '4000000000000341': 'Your card was declined.' };
172
-
173
- /** The expiry as the customer typed it. Stripe's field formats itself as it is typed: the digits `1230` read `12 / 30`,
174
- * and a first digit above 1 is a month on its own (`5` reads `05 / `), so a person types the digits straight through
175
- * (Checkout's own field, seen on checkout.stripe.com; docs.stripe.com/payments/checkout names no format to type). The
176
- * page's script (@volter/world-ui Payment, `format: 'card-expiry'`) shows it formatted; this reads what is posted either
177
- * way: `MM / YY`, `MM/YYYY`, or the bare digits `MMYY`, `MYY` (`530`) and `MMYYYY`; a month past 12 is read, and refused
178
- * as invalid by cardAnswer. */
179
- export function parseExpiry(raw: string): { month: number; year: number } | undefined {
180
- const split = /^\s*(\d{1,2})\s*\/\s*(\d{2}|\d{4})\s*$/.exec(raw);
181
- const digits = raw.replace(/\s/g, '');
182
- const bare = split ? undefined : /^(\d{2})(\d{2}|\d{4})$/.exec(digits) ?? /^([2-9])(\d{2})$/.exec(digits);
183
- const m = split ?? bare;
184
- if (!m) return undefined;
185
- return { month: Number(m[1]), year: m[2]!.length === 2 ? 2000 + Number(m[2]) : Number(m[2]) };
186
- }
187
-
188
- /** The card's answer: undefined when it pays, else what Checkout says under the button. */
189
- export function cardAnswer(v: Record<string, string>, nowSeconds: number, chargesNow: boolean): string | undefined {
190
- const digits = (v.cardNumber ?? '').replace(/\D/g, '');
191
- if (!digits) return 'Your card number is incomplete.';
192
- if (DECLINES[digits]) return DECLINES[digits];
193
- if (chargesNow && DECLINES_WHEN_CHARGED[digits]) return DECLINES_WHEN_CHARGED[digits];
194
- if (!luhn(digits)) return 'Your card number is invalid.';
195
- const exp = parseExpiry(v.cardExpiry ?? '');
196
- if (!exp) return "Your card's expiration date is incomplete.";
197
- const { month, year } = exp;
198
- if (month < 1 || month > 12) return "Your card's expiration date is invalid.";
199
- const now = new Date(nowSeconds * 1000);
200
- if (year < now.getUTCFullYear() || (year === now.getUTCFullYear() && month < now.getUTCMonth() + 1)) return "Your card's expiration year is in the past.";
201
- if (!/^\d{3,4}$/.test(v.cardCvc ?? '')) return "Your card's security code is incomplete.";
202
- return undefined;
203
- }
204
-
205
- async function pay(ctx: SemanticsContext, id: string, session: Row, v: Record<string, string>): Promise<Response> {
145
+ async function pay(ctx: HandlerContext, id: string, session: Row, v: Record<string, string>): Promise<Response> {
206
146
  const onFile = customerEmailOf(session);
207
147
  const email = onFile ?? (typeof session.customer_email === 'string' ? session.customer_email : (v.email ?? '').trim());
208
148
  if (session.mode !== 'setup' || !session.customer) {
209
- if (!EMAIL.test(email)) return page(session, id, Number(ctx.now()), v, 'Your email address is incomplete.');
149
+ if (!EMAIL.test(email)) return page(session, id, nowUnix(ctx.occurredAt), v, 'Your email address is incomplete.');
210
150
  }
211
151
  // a trial charges nothing now unless a one-time price is on the first invoice
212
152
  const oneTimeDue = (((session.line_items as { data?: Row[] } | undefined)?.data) ?? []).some((it, i) => isOneTime(it, inlineOf(session, i)));
213
- const chargesNow = session.mode === 'payment' || (session.mode === 'subscription' && (!trialOf(session, Number(ctx.now())) || oneTimeDue));
214
- const refused = cardAnswer(v, Number(ctx.now()), chargesNow);
215
- if (refused) return page(session, id, Number(ctx.now()), v, refused);
153
+ const chargesNow = session.mode === 'payment' || (session.mode === 'subscription' && (!trialOf(session, nowUnix(ctx.occurredAt)) || oneTimeDue));
154
+ const refused = cardAnswer(v, nowUnix(ctx.occurredAt), chargesNow);
155
+ if (refused) return page(session, id, nowUnix(ctx.occurredAt), v, refused);
216
156
  let existing = session;
217
157
  // Checkout always makes a customer for a subscription; a payment makes one only when the session asks
218
158
  if (!session.customer && (session.mode === 'subscription' || session.customer_creation === 'always')) {
@@ -233,35 +173,33 @@ async function pay(ctx: SemanticsContext, id: string, session: Row, v: Record<st
233
173
  return new Response(null, { status: 303, headers: { location: to } });
234
174
  }
235
175
 
236
- /** checkout.stripe.com's pages, or undefined for any other request. */
237
176
  /** The name the page shows: the session's own `branding_settings.display_name` where the create set one, else the
238
- * public business name (stripe-shared.ts, publicBusinessName) of the account whose brand Checkout uses: "Checkout uses
177
+ * public business name (../engine/display.ts, publicBusinessName) of the account whose brand Checkout uses: "Checkout uses
239
178
  * the brand settings of the connected account for destination charges with on_behalf_of and for platforms performing
240
179
  * direct charges" (a session made with Stripe-Account), and otherwise the platform's; "If you omit a field in
241
180
  * branding_settings, Checkout applies the default value from the Dashboard"
242
181
  * (docs.stripe.com/payments/checkout/customization/appearance). */
243
- export function merchantOf(ctx: SemanticsContext, stored: Row): string {
182
+ function merchantOf(ctx: HandlerContext, stored: Row): string {
244
183
  const brand = (stored._branding_settings as Row | undefined)?.display_name;
245
184
  const behalf = (stored._payment_intent_data as Row | undefined)?.on_behalf_of ?? (stored._subscription_data as Row | undefined)?.on_behalf_of;
246
185
  const account = typeof behalf === 'string' ? behalf : typeof stored._brand_account === 'string' ? stored._brand_account : PLATFORM_ACCOUNT_ID;
247
186
  return typeof brand === 'string' && brand.trim() ? brand : publicBusinessName(ctx.get('account', account));
248
187
  }
249
188
 
250
- export function stripeCheckoutFlow(scope: { root?: string; clock?: () => string }): (request: Request) => Promise<Response | undefined> {
251
- return async (request) => {
252
- const m = /^\/c\/pay\/(cs_[A-Za-z0-9_]+)\/?$/.exec(new URL(request.url).pathname);
253
- if (!m || (request.method !== 'GET' && request.method !== 'POST')) return undefined;
254
- const id = m[1]!;
255
- // the form is read before the context, which reads the request's body itself
256
- const values = request.method === 'POST' ? await formOf(request.clone()) : {};
257
- const ctx = await semanticsContext(manifest, request, COMPLETE_OPERATION, scope);
258
- const session = ctx.get(CS, id);
259
- if (!session) return gone();
260
- // an ended session's page is gone; paying on one is the customer's move the machine refuses
261
- if (session.status !== 'open' && (request.method === 'GET' || ctx.legal(CS, 'status', COMPLETE_OPERATION.id, String(session.status), 'complete', id, 'external'))) return gone();
262
- const stored = ctx.row(CS, id) ?? {};
263
- const coupon = (stored._discount as Row | undefined)?.coupon;
264
- const full = { ...session, _subscription_data: stored._subscription_data, _price_data: stored._price_data, _merchant: merchantOf(ctx, stored), _coupon: typeof coupon === 'string' ? ctx.get('coupon', coupon) : undefined, _customer: typeof session.customer === 'string' ? ctx.get('customer', session.customer) : undefined };
265
- return request.method === 'GET' ? page(full, id, Number(ctx.now())) : pay(ctx, id, full, values);
266
- };
189
+ export async function screen(ctx: HandlerContext): Promise<Response> {
190
+ const request = ctx.call.request;
191
+ const m = /^\/c\/pay\/(cs_[A-Za-z0-9_]+)\/?$/.exec(new URL(request.url).pathname);
192
+ if (!m || (request.method !== 'GET' && request.method !== 'POST')) return notFound();
193
+ const id = m[1]!;
194
+ // the form is read before the context, which reads the request's body itself
195
+ const values = request.method === 'POST' ? await formOf(request.clone()) : {};
196
+ const session = ctx.get(CS, id);
197
+ if (!session) return gone();
198
+ // an ended session's page is gone; paying on one is the customer's move the machine refuses
199
+ if (session.status !== 'open' && (request.method === 'GET' || ctx.legal(CS, 'status', COMPLETE_OPERATION.id, String(session.status), 'complete', id, 'external'))) return gone();
200
+ const stored = ctx.row(CS, id) ?? {};
201
+ const coupon = (stored._discount as Row | undefined)?.coupon;
202
+ const full = { ...session, _subscription_data: stored._subscription_data, _price_data: stored._price_data, _merchant: merchantOf(ctx, stored), _coupon: typeof coupon === 'string' ? ctx.get('coupon', coupon) : undefined, _customer: typeof session.customer === 'string' ? ctx.get('customer', session.customer) : undefined };
203
+ return request.method === 'GET' ? page(full, id, nowUnix(ctx.occurredAt)) : pay(ctx, id, full, values);
267
204
  }
205
+