@volter/twin-stripe 2.0.38 → 3.0.1

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 (402) hide show
  1. package/README.md +112 -207
  2. package/dist/generated/pack-facts.json +94 -0
  3. package/dist/journeys/coverage.json +596 -0
  4. package/dist/journeys/customer-life.json +6108 -0
  5. package/dist/journeys/customer-life.outline.md +371 -0
  6. package/dist/journeys/decisions.json +677 -0
  7. package/dist/journeys/demand.json +706 -0
  8. package/dist/journeys/score.json +853 -0
  9. package/dist/journeys/unreachable.json +102 -0
  10. package/dist/journeys/vendor-examples.json +8010 -0
  11. package/dist/spec/SOURCE.md +18 -0
  12. package/dist/spec/doc-examples.json +445 -0
  13. package/dist/spec/fixtures3.json.gz +0 -0
  14. package/dist/spec/openapi.json.gz +0 -0
  15. package/dist/spec/patches.json +34 -0
  16. package/dist/spec/sources.json +306 -0
  17. package/dist/src/cli.d.ts +0 -1
  18. package/dist/src/cli.js +11 -31
  19. package/dist/src/engine/after-payment.d.ts +8 -0
  20. package/dist/src/engine/after-payment.js +27 -0
  21. package/dist/src/engine/apps-secrets.d.ts +1 -0
  22. package/dist/src/engine/apps-secrets.js +3 -0
  23. package/dist/src/engine/balance.d.ts +5 -0
  24. package/dist/src/engine/balance.js +15 -0
  25. package/dist/src/engine/checkout.d.ts +24 -0
  26. package/dist/src/engine/checkout.js +30 -0
  27. package/dist/src/engine/common.d.ts +19 -0
  28. package/dist/src/engine/common.js +34 -0
  29. package/dist/src/engine/connect.d.ts +45 -0
  30. package/dist/src/engine/connect.js +108 -0
  31. package/dist/src/engine/customers.d.ts +4 -0
  32. package/dist/src/engine/customers.js +8 -0
  33. package/dist/src/engine/display.d.ts +11 -0
  34. package/dist/src/engine/display.js +13 -0
  35. package/dist/src/engine/files.d.ts +11 -0
  36. package/dist/src/engine/files.js +23 -0
  37. package/dist/src/engine/invoices.d.ts +21 -0
  38. package/dist/src/engine/invoices.js +84 -0
  39. package/dist/src/engine/issuing.d.ts +33 -0
  40. package/dist/src/engine/issuing.js +54 -0
  41. package/dist/src/engine/ledger.d.ts +8 -0
  42. package/dist/src/engine/ledger.js +8 -0
  43. package/dist/src/engine/oauth.d.ts +4 -0
  44. package/dist/src/engine/oauth.js +24 -0
  45. package/dist/src/engine/onboarding.d.ts +13 -0
  46. package/dist/src/engine/onboarding.js +42 -0
  47. package/dist/src/{stripe-params.d.ts → engine/params.d.ts} +20 -3
  48. package/dist/src/{stripe-params.js → engine/params.js} +7 -60
  49. package/dist/src/engine/payment-intents.d.ts +10 -0
  50. package/dist/src/engine/payment-intents.js +27 -0
  51. package/dist/src/engine/payment-methods.d.ts +16 -0
  52. package/dist/src/engine/payment-methods.js +22 -0
  53. package/dist/src/engine/radar.d.ts +2 -0
  54. package/dist/src/engine/radar.js +5 -0
  55. package/dist/src/engine/refunds.d.ts +1 -0
  56. package/dist/src/engine/refunds.js +3 -0
  57. package/dist/src/engine/renewals.d.ts +36 -0
  58. package/dist/src/engine/renewals.js +65 -0
  59. package/dist/src/{stripe-twin.d.ts → engine/stripe.d.ts} +12 -45
  60. package/dist/src/{stripe-twin.js → engine/stripe.js} +53 -387
  61. package/dist/src/engine/subscriptions.d.ts +11 -0
  62. package/dist/src/engine/subscriptions.js +30 -0
  63. package/dist/src/engine/transfers.d.ts +2 -0
  64. package/dist/src/engine/transfers.js +1 -0
  65. package/dist/src/{stripe-version.d.ts → engine/version.d.ts} +0 -2
  66. package/dist/src/{stripe-version.js → engine/version.js} +21 -9
  67. package/dist/src/engine/webhook-endpoints.d.ts +1 -0
  68. package/dist/src/engine/webhook-endpoints.js +12 -0
  69. package/dist/src/engine/webhooks.d.ts +31 -0
  70. package/dist/src/engine/webhooks.js +68 -0
  71. package/dist/src/fetch.d.ts +2 -0
  72. package/dist/src/fetch.js +26 -0
  73. package/dist/src/generated/surface.gen.json +1 -1
  74. package/dist/src/generated/ui.gen.json +1 -1
  75. package/dist/src/index.d.ts +5 -14
  76. package/dist/src/index.js +10 -75
  77. package/dist/src/manifest.js +478 -876
  78. package/dist/src/screens/billing-portal.d.ts +3 -0
  79. package/dist/src/screens/{portal.js → billing-portal.js} +32 -58
  80. package/dist/src/screens/checkout-js.d.ts +2 -0
  81. package/dist/src/screens/checkout-js.js +84 -0
  82. package/dist/src/screens/checkout.d.ts +2 -31
  83. package/dist/src/screens/checkout.js +32 -121
  84. package/dist/src/screens/connect-onboarding.d.ts +3 -0
  85. package/dist/src/screens/{onboarding.js → connect-onboarding.js} +38 -104
  86. package/dist/src/screens/dashboard.d.ts +3 -0
  87. package/dist/src/screens/dashboard.js +116 -0
  88. package/dist/src/screens/shared.d.ts +27 -0
  89. package/dist/src/screens/shared.js +87 -0
  90. package/dist/src/screens/stripe-js.d.ts +3 -0
  91. package/dist/src/screens/stripe-js.js +95 -0
  92. package/dist/src/semantics/account.d.ts +2 -0
  93. package/dist/src/semantics/account.js +8 -0
  94. package/dist/src/semantics/account_links.d.ts +2 -0
  95. package/dist/src/semantics/account_links.js +22 -0
  96. package/dist/src/semantics/accounts.d.ts +4 -0
  97. package/dist/src/semantics/accounts.js +40 -0
  98. package/dist/src/semantics/apps.d.ts +4 -0
  99. package/dist/src/semantics/{apps-secrets.js → apps.js} +14 -26
  100. package/dist/src/semantics/around.d.ts +2 -0
  101. package/dist/src/semantics/around.js +13 -0
  102. package/dist/src/semantics/balance.d.ts +2 -11
  103. package/dist/src/semantics/balance.js +3 -194
  104. package/dist/src/semantics/balance_transactions.d.ts +2 -0
  105. package/dist/src/semantics/balance_transactions.js +15 -0
  106. package/dist/src/semantics/billing_portal.d.ts +4 -0
  107. package/dist/src/semantics/billing_portal.js +36 -0
  108. package/dist/src/semantics/charges.d.ts +3 -28
  109. package/dist/src/semantics/charges.js +5 -202
  110. package/dist/src/semantics/checkout.d.ts +3 -20
  111. package/dist/src/semantics/checkout.js +21 -271
  112. package/dist/src/semantics/clock.d.ts +2 -0
  113. package/dist/src/semantics/clock.js +15 -0
  114. package/dist/src/semantics/coupons.d.ts +2 -6
  115. package/dist/src/semantics/coupons.js +2 -60
  116. package/dist/src/semantics/customers.d.ts +5 -6
  117. package/dist/src/semantics/customers.js +47 -413
  118. package/dist/src/semantics/doors.d.ts +23 -0
  119. package/dist/src/semantics/doors.js +73 -0
  120. package/dist/src/semantics/entitlements.d.ts +0 -2
  121. package/dist/src/semantics/entitlements.js +4 -95
  122. package/dist/src/semantics/events.d.ts +11 -0
  123. package/dist/src/semantics/events.js +31 -0
  124. package/dist/src/semantics/index.d.ts +2 -0
  125. package/dist/src/semantics/index.js +85 -0
  126. package/dist/src/semantics/invoice_payments.d.ts +2 -0
  127. package/dist/src/semantics/invoice_payments.js +12 -0
  128. package/dist/src/semantics/invoices.d.ts +11 -18
  129. package/dist/src/semantics/invoices.js +121 -440
  130. package/dist/src/semantics/issuing.d.ts +6 -13
  131. package/dist/src/semantics/issuing.js +58 -556
  132. package/dist/src/semantics/payment_intents.d.ts +3 -0
  133. package/dist/src/semantics/payment_intents.js +71 -0
  134. package/dist/src/semantics/payment_methods.d.ts +3 -0
  135. package/dist/src/semantics/payment_methods.js +15 -0
  136. package/dist/src/semantics/payouts.d.ts +3 -0
  137. package/dist/src/semantics/payouts.js +28 -0
  138. package/dist/src/semantics/prices.d.ts +4 -0
  139. package/dist/src/semantics/prices.js +37 -0
  140. package/dist/src/semantics/products.d.ts +4 -2
  141. package/dist/src/semantics/products.js +12 -138
  142. package/dist/src/semantics/promotion_codes.d.ts +3 -0
  143. package/dist/src/semantics/promotion_codes.js +35 -0
  144. package/dist/src/semantics/radar.d.ts +2 -2
  145. package/dist/src/semantics/radar.js +5 -74
  146. package/dist/src/semantics/refunds.d.ts +2 -9
  147. package/dist/src/semantics/refunds.js +3 -193
  148. package/dist/src/semantics/shared.d.ts +558 -55
  149. package/dist/src/semantics/shared.js +2070 -114
  150. package/dist/src/semantics/states.d.ts +462 -0
  151. package/dist/src/semantics/states.js +634 -0
  152. package/dist/src/semantics/subscriptions.d.ts +6 -11
  153. package/dist/src/semantics/subscriptions.js +37 -530
  154. package/dist/src/semantics/test_helpers.d.ts +3 -0
  155. package/dist/src/semantics/test_helpers.js +125 -0
  156. package/dist/src/semantics/transfers.d.ts +2 -2
  157. package/dist/src/semantics/transfers.js +6 -101
  158. package/dist/src/semantics/webhook_endpoints.d.ts +2 -0
  159. package/dist/src/semantics/webhook_endpoints.js +26 -0
  160. package/dist/src/server.d.ts +7 -0
  161. package/dist/src/server.js +7 -0
  162. package/generated/pack-facts.json +94 -0
  163. package/journeys/coverage.json +596 -0
  164. package/journeys/customer-life.json +6108 -0
  165. package/journeys/customer-life.outline.md +371 -0
  166. package/journeys/decisions.json +677 -0
  167. package/journeys/demand.json +706 -0
  168. package/journeys/score.json +853 -0
  169. package/journeys/unreachable.json +102 -0
  170. package/journeys/vendor-examples.json +8010 -0
  171. package/package.json +11 -20
  172. package/spec/SOURCE.md +18 -0
  173. package/spec/doc-examples.json +445 -0
  174. package/spec/fixtures3.json.gz +0 -0
  175. package/spec/openapi.json.gz +0 -0
  176. package/spec/patches.json +34 -0
  177. package/spec/sources.json +306 -0
  178. package/src/cli.ts +11 -28
  179. package/src/engine/after-payment.ts +29 -0
  180. package/src/engine/apps-secrets.ts +4 -0
  181. package/src/engine/balance.ts +32 -0
  182. package/src/engine/checkout.ts +39 -0
  183. package/src/engine/common.ts +49 -0
  184. package/src/engine/connect.ts +106 -0
  185. package/src/engine/customers.ts +10 -0
  186. package/src/engine/display.ts +18 -0
  187. package/src/engine/files.ts +28 -0
  188. package/src/engine/invoices.ts +102 -0
  189. package/src/engine/issuing.ts +66 -0
  190. package/src/engine/ledger.ts +48 -0
  191. package/src/engine/oauth.ts +18 -0
  192. package/src/engine/onboarding.ts +53 -0
  193. package/src/{stripe-params.ts → engine/params.ts} +7 -56
  194. package/src/engine/payment-intents.ts +32 -0
  195. package/src/engine/payment-methods.ts +24 -0
  196. package/src/engine/radar.ts +6 -0
  197. package/src/engine/refunds.ts +3 -0
  198. package/src/engine/renewals.ts +72 -0
  199. package/src/{stripe-twin.ts → engine/stripe.ts} +57 -400
  200. package/src/engine/subscriptions.ts +37 -0
  201. package/src/engine/transfers.ts +22 -0
  202. package/src/{stripe-version.ts → engine/version.ts} +19 -10
  203. package/src/engine/webhook-endpoints.ts +14 -0
  204. package/src/engine/webhooks.ts +70 -0
  205. package/src/fetch.ts +27 -0
  206. package/src/generated/surface.gen.json +1 -1
  207. package/src/generated/ui.gen.json +1 -1
  208. package/src/index.ts +10 -116
  209. package/src/manifest.ts +480 -904
  210. package/src/screens/{portal.tsx → billing-portal.tsx} +35 -42
  211. package/src/screens/checkout-js.ts +80 -0
  212. package/src/screens/checkout.tsx +32 -96
  213. package/src/screens/{onboarding.tsx → connect-onboarding.tsx} +39 -85
  214. package/src/screens/dashboard.tsx +178 -0
  215. package/src/screens/shared.tsx +84 -0
  216. package/src/screens/stripe-js.ts +102 -0
  217. package/src/semantics/account.ts +10 -0
  218. package/src/semantics/account_links.ts +20 -0
  219. package/src/semantics/accounts.ts +44 -0
  220. package/src/semantics/{apps-secrets.ts → apps.ts} +17 -33
  221. package/src/semantics/around.ts +17 -0
  222. package/src/semantics/balance.ts +6 -208
  223. package/src/semantics/balance_transactions.ts +18 -0
  224. package/src/semantics/billing_portal.ts +45 -0
  225. package/src/semantics/charges.ts +8 -212
  226. package/src/semantics/checkout.ts +25 -276
  227. package/src/semantics/clock.ts +19 -0
  228. package/src/semantics/coupons.ts +5 -68
  229. package/src/semantics/customers.ts +48 -414
  230. package/src/semantics/doors.ts +79 -0
  231. package/src/semantics/entitlements.ts +3 -94
  232. package/src/semantics/events.ts +37 -0
  233. package/src/semantics/index.ts +89 -0
  234. package/src/semantics/invoice_payments.ts +16 -0
  235. package/src/semantics/invoices.ts +112 -441
  236. package/src/semantics/issuing.ts +57 -573
  237. package/src/semantics/payment_intents.ts +76 -0
  238. package/src/semantics/payment_methods.ts +20 -0
  239. package/src/semantics/payouts.ts +29 -0
  240. package/src/semantics/prices.ts +41 -0
  241. package/src/semantics/products.ts +12 -146
  242. package/src/semantics/promotion_codes.ts +38 -0
  243. package/src/semantics/radar.ts +8 -79
  244. package/src/semantics/refunds.ts +4 -216
  245. package/src/semantics/shared.ts +2089 -135
  246. package/src/semantics/states.ts +662 -0
  247. package/src/semantics/subscriptions.ts +39 -542
  248. package/src/semantics/test_helpers.ts +119 -0
  249. package/src/semantics/transfers.ts +10 -132
  250. package/src/semantics/webhook_endpoints.ts +27 -0
  251. package/src/server.ts +7 -0
  252. package/client/dashboard-api.ts +0 -286
  253. package/client/stripe-mirror.css +0 -277
  254. package/client/stripe-mirror.tsx +0 -1559
  255. package/dist/client/dashboard-api.d.ts +0 -107
  256. package/dist/client/dashboard-api.js +0 -238
  257. package/dist/client/dashboard-api.ts +0 -286
  258. package/dist/client/stripe-mirror.bundle.js +0 -236
  259. package/dist/client/stripe-mirror.css +0 -277
  260. package/dist/client/stripe-mirror.d.ts +0 -134
  261. package/dist/client/stripe-mirror.js +0 -859
  262. package/dist/client/stripe-mirror.tsx +0 -1559
  263. package/dist/src/screens/connect-oauth.d.ts +0 -27
  264. package/dist/src/screens/connect-oauth.js +0 -414
  265. package/dist/src/screens/connect-settings.d.ts +0 -22
  266. package/dist/src/screens/connect-settings.js +0 -103
  267. package/dist/src/screens/consent-skin.d.ts +0 -4
  268. package/dist/src/screens/consent-skin.js +0 -18
  269. package/dist/src/screens/financial-connections.d.ts +0 -5
  270. package/dist/src/screens/financial-connections.js +0 -90
  271. package/dist/src/screens/identity.d.ts +0 -5
  272. package/dist/src/screens/identity.js +0 -86
  273. package/dist/src/screens/onboarding.d.ts +0 -13
  274. package/dist/src/screens/portal.d.ts +0 -5
  275. package/dist/src/screens/public-details.d.ts +0 -5
  276. package/dist/src/screens/public-details.js +0 -90
  277. package/dist/src/semantics/after-payment.d.ts +0 -22
  278. package/dist/src/semantics/after-payment.js +0 -99
  279. package/dist/src/semantics/apps-secrets.d.ts +0 -2
  280. package/dist/src/semantics/billing.d.ts +0 -2
  281. package/dist/src/semantics/billing.js +0 -220
  282. package/dist/src/semantics/connect.d.ts +0 -5
  283. package/dist/src/semantics/connect.js +0 -493
  284. package/dist/src/semantics/credit-notes.d.ts +0 -2
  285. package/dist/src/semantics/credit-notes.js +0 -172
  286. package/dist/src/semantics/disputes.d.ts +0 -2
  287. package/dist/src/semantics/disputes.js +0 -51
  288. package/dist/src/semantics/ephemeral-keys.d.ts +0 -2
  289. package/dist/src/semantics/ephemeral-keys.js +0 -34
  290. package/dist/src/semantics/files.d.ts +0 -2
  291. package/dist/src/semantics/files.js +0 -125
  292. package/dist/src/semantics/ledger.d.ts +0 -59
  293. package/dist/src/semantics/ledger.js +0 -200
  294. package/dist/src/semantics/payment-intents.d.ts +0 -18
  295. package/dist/src/semantics/payment-intents.js +0 -452
  296. package/dist/src/semantics/payment-links.d.ts +0 -2
  297. package/dist/src/semantics/payment-links.js +0 -133
  298. package/dist/src/semantics/payment-methods.d.ts +0 -20
  299. package/dist/src/semantics/payment-methods.js +0 -140
  300. package/dist/src/semantics/plans.d.ts +0 -5
  301. package/dist/src/semantics/plans.js +0 -121
  302. package/dist/src/semantics/platform.d.ts +0 -9
  303. package/dist/src/semantics/platform.js +0 -206
  304. package/dist/src/semantics/renewals.d.ts +0 -47
  305. package/dist/src/semantics/renewals.js +0 -281
  306. package/dist/src/semantics/setup-intents.d.ts +0 -2
  307. package/dist/src/semantics/setup-intents.js +0 -84
  308. package/dist/src/semantics/subscription-schedules.d.ts +0 -2
  309. package/dist/src/semantics/subscription-schedules.js +0 -119
  310. package/dist/src/semantics/tax.d.ts +0 -2
  311. package/dist/src/semantics/tax.js +0 -197
  312. package/dist/src/semantics/terminal.d.ts +0 -5
  313. package/dist/src/semantics/terminal.js +0 -182
  314. package/dist/src/semantics/test-clocks.d.ts +0 -6
  315. package/dist/src/semantics/test-clocks.js +0 -73
  316. package/dist/src/semantics/tokens.d.ts +0 -4
  317. package/dist/src/semantics/tokens.js +0 -44
  318. package/dist/src/semantics/treasury.d.ts +0 -2
  319. package/dist/src/semantics/treasury.js +0 -377
  320. package/dist/src/semantics/webhook-endpoints.d.ts +0 -3
  321. package/dist/src/semantics/webhook-endpoints.js +0 -85
  322. package/dist/src/stripe-budget.d.ts +0 -55
  323. package/dist/src/stripe-budget.js +0 -155
  324. package/dist/src/stripe-capabilities.d.ts +0 -3
  325. package/dist/src/stripe-capabilities.js +0 -5836
  326. package/dist/src/stripe-conformance.d.ts +0 -43
  327. package/dist/src/stripe-conformance.js +0 -105
  328. package/dist/src/stripe-connector.d.ts +0 -161
  329. package/dist/src/stripe-connector.js +0 -414
  330. package/dist/src/stripe-emit.d.ts +0 -2
  331. package/dist/src/stripe-emit.js +0 -145
  332. package/dist/src/stripe-events.d.ts +0 -93
  333. package/dist/src/stripe-events.js +0 -392
  334. package/dist/src/stripe-js.d.ts +0 -4
  335. package/dist/src/stripe-js.js +0 -70
  336. package/dist/src/stripe-mirror-ui.d.ts +0 -15
  337. package/dist/src/stripe-mirror-ui.js +0 -87
  338. package/dist/src/stripe-perform-harness.d.ts +0 -9
  339. package/dist/src/stripe-perform-harness.js +0 -26
  340. package/dist/src/stripe-server.d.ts +0 -33
  341. package/dist/src/stripe-server.js +0 -429
  342. package/dist/src/stripe-shared.d.ts +0 -109
  343. package/dist/src/stripe-shared.js +0 -276
  344. package/dist/src/stripe-ui-conformance.d.ts +0 -5
  345. package/dist/src/stripe-ui-conformance.js +0 -79
  346. package/dist/src/stripe-ui-structure.d.ts +0 -3
  347. package/dist/src/stripe-ui-structure.js +0 -168
  348. package/dist/test-fixtures/stripe-known-deviations.json +0 -110
  349. package/dist/test-fixtures/stripe-openapi-operations.SOURCE.md +0 -14
  350. package/dist/test-fixtures/stripe-openapi-operations.json +0 -4717
  351. package/dist/test-fixtures/stripe-schemas.SOURCE.md +0 -35
  352. package/dist/test-fixtures/stripe-schemas.json +0 -3813
  353. package/src/screens/connect-oauth.tsx +0 -400
  354. package/src/screens/connect-settings.tsx +0 -121
  355. package/src/screens/consent-skin.ts +0 -20
  356. package/src/screens/financial-connections.tsx +0 -101
  357. package/src/screens/identity.tsx +0 -96
  358. package/src/screens/public-details.tsx +0 -105
  359. package/src/semantics/after-payment.ts +0 -118
  360. package/src/semantics/billing.ts +0 -216
  361. package/src/semantics/connect.ts +0 -487
  362. package/src/semantics/credit-notes.ts +0 -168
  363. package/src/semantics/disputes.ts +0 -62
  364. package/src/semantics/ephemeral-keys.ts +0 -34
  365. package/src/semantics/files.ts +0 -143
  366. package/src/semantics/ledger.ts +0 -253
  367. package/src/semantics/payment-intents.ts +0 -463
  368. package/src/semantics/payment-links.ts +0 -148
  369. package/src/semantics/payment-methods.ts +0 -145
  370. package/src/semantics/plans.ts +0 -131
  371. package/src/semantics/platform.ts +0 -220
  372. package/src/semantics/renewals.ts +0 -279
  373. package/src/semantics/setup-intents.ts +0 -87
  374. package/src/semantics/subscription-schedules.ts +0 -129
  375. package/src/semantics/tax.ts +0 -220
  376. package/src/semantics/terminal.ts +0 -195
  377. package/src/semantics/test-clocks.ts +0 -77
  378. package/src/semantics/tokens.ts +0 -52
  379. package/src/semantics/treasury.ts +0 -383
  380. package/src/semantics/webhook-endpoints.ts +0 -87
  381. package/src/stripe-budget.ts +0 -181
  382. package/src/stripe-capabilities.ts +0 -5651
  383. package/src/stripe-conformance.ts +0 -124
  384. package/src/stripe-connector.ts +0 -462
  385. package/src/stripe-emit.ts +0 -157
  386. package/src/stripe-events.ts +0 -434
  387. package/src/stripe-js.ts +0 -70
  388. package/src/stripe-mirror-ui.ts +0 -90
  389. package/src/stripe-perform-harness.ts +0 -29
  390. package/src/stripe-server.ts +0 -393
  391. package/src/stripe-shared.ts +0 -297
  392. package/src/stripe-ui-conformance.ts +0 -88
  393. package/src/stripe-ui-structure.ts +0 -182
  394. package/test-fixtures/stripe-known-deviations.json +0 -110
  395. package/test-fixtures/stripe-openapi-operations.json +0 -4717
  396. package/test-fixtures/stripe-schemas.json +0 -3813
  397. /package/dist/src/{screens → engine}/industries.d.ts +0 -0
  398. /package/dist/src/{screens → engine}/industries.js +0 -0
  399. /package/dist/src/{semantics → engine}/test-cards.d.ts +0 -0
  400. /package/dist/src/{semantics → engine}/test-cards.js +0 -0
  401. /package/src/{screens → engine}/industries.ts +0 -0
  402. /package/src/{semantics → engine}/test-cards.ts +0 -0
@@ -1,107 +0,0 @@
1
- export type StripeObject = Record<string, any>;
2
- export declare function wireBaseFrom(hasBaseElement: boolean, baseURI: string): string;
3
- export declare const API_BASE: string;
4
- export declare class StripeApiError extends Error {
5
- readonly code?: string | undefined;
6
- constructor(message: string, code?: string | undefined);
7
- }
8
- export declare const retrieve: (path: string) => Promise<StripeObject>;
9
- /** A list endpoint's `data`, newest first as Stripe returns it (one page of up to 100). */
10
- export declare function list(path: string): Promise<StripeObject[]>;
11
- /** One row of the Payments list: a PaymentIntent (or a Charge made without one) with what the Dashboard
12
- * shows beside it — its charge, refunds, card and customer. */
13
- export type Payment = {
14
- id: string;
15
- amount: number;
16
- currency: string;
17
- status: PaymentStatus;
18
- description?: string;
19
- created: number;
20
- customer?: StripeObject;
21
- charge?: StripeObject;
22
- intent?: StripeObject;
23
- paymentMethod?: StripeObject;
24
- amountRefunded: number;
25
- refundedAt?: number;
26
- declineReason?: string;
27
- declineMessage?: string;
28
- };
29
- export type PaymentStatus = 'succeeded' | 'refunded' | 'partially_refunded' | 'failed' | 'incomplete' | 'uncaptured' | 'canceled' | 'disputed' | 'processing';
30
- export declare function paymentStatusOf(intent: StripeObject | undefined, charge: StripeObject | undefined): PaymentStatus;
31
- export declare const declineReasonText: (code: string | undefined) => string | undefined;
32
- /** The Payments list: every PaymentIntent, and every Charge made without one. */
33
- export declare function loadPayments(): Promise<Payment[]>;
34
- export type PaymentDetail = Payment & {
35
- refunds: StripeObject[];
36
- events: StripeObject[];
37
- invoice?: StripeObject;
38
- };
39
- /** One payment's page: the intent (or charge), its charge, refunds, card, customer and the events about it. */
40
- export declare function loadPayment(id: string): Promise<PaymentDetail>;
41
- export type CustomerRow = StripeObject & {
42
- defaultCard?: StripeObject;
43
- totalSpend: number;
44
- payments: number;
45
- refunds: number;
46
- currency: string;
47
- };
48
- export declare function loadCustomers(): Promise<CustomerRow[]>;
49
- export type CustomerDetail = {
50
- customer: StripeObject;
51
- paymentMethods: StripeObject[];
52
- subscriptions: StripeObject[];
53
- invoices: StripeObject[];
54
- payments: Payment[];
55
- products: Map<string, StripeObject>;
56
- events: StripeObject[];
57
- };
58
- export declare function loadCustomer(id: string): Promise<CustomerDetail>;
59
- export type Billing = {
60
- subscriptions: StripeObject[];
61
- customers: Map<string, StripeObject>;
62
- products: Map<string, StripeObject>;
63
- };
64
- export declare function loadSubscriptions(): Promise<Billing>;
65
- export type SubscriptionDetail = {
66
- subscription: StripeObject;
67
- customer?: StripeObject;
68
- invoices: StripeObject[];
69
- products: Map<string, StripeObject>;
70
- events: StripeObject[];
71
- paymentMethod?: StripeObject;
72
- };
73
- export declare function loadSubscription(id: string): Promise<SubscriptionDetail>;
74
- export declare function loadInvoices(): Promise<{
75
- invoices: StripeObject[];
76
- customers: Map<string, StripeObject>;
77
- }>;
78
- export declare function loadProducts(): Promise<{
79
- products: StripeObject[];
80
- prices: StripeObject[];
81
- }>;
82
- export type HomeData = {
83
- balance: StripeObject;
84
- payments: Payment[];
85
- customers: StripeObject[];
86
- subscriptions: StripeObject[];
87
- invoices: StripeObject[];
88
- };
89
- export declare function loadHome(): Promise<HomeData>;
90
- export declare function loadBalances(): Promise<{
91
- balance: StripeObject;
92
- transactions: StripeObject[];
93
- payouts: StripeObject[];
94
- }>;
95
- export declare function loadDevelopers(): Promise<{
96
- events: StripeObject[];
97
- webhooks: StripeObject[];
98
- account?: StripeObject;
99
- }>;
100
- /** Refund a payment in full (no amount) or in part. */
101
- export declare function createRefund(payment: {
102
- intent?: StripeObject;
103
- charge?: StripeObject;
104
- }, amount: number | undefined, reason: string | undefined): Promise<StripeObject>;
105
- /** Cancel now (DELETE) or at the end of the current period (cancel_at_period_end). */
106
- export declare function cancelSubscription(id: string, when: 'now' | 'period_end'): Promise<StripeObject>;
107
- export declare const createObject: (collection: string, fields: Record<string, string>) => Promise<StripeObject>;
@@ -1,238 +0,0 @@
1
- // The Stripe Dashboard's reads and writes, through Stripe's own API on this origin (docs/contributing/
2
- // architecture.md, "Screens": a workspace reads and writes only through the pack's operations). The calls
3
- // the Dashboard makes for the pages it shows: the balance, payments (PaymentIntents and the Charges they
4
- // made), refunds, customers and their saved payment methods, subscriptions, invoices, products and prices,
5
- // and events for a detail page's timeline. The writes a person makes here: refund a payment
6
- // (POST /v1/refunds), cancel a subscription (DELETE /v1/subscriptions/{id}, or schedule it with
7
- // cancel_at_period_end), create a customer or a product. Bodies are form-encoded as Stripe's API takes them;
8
- // an `error` envelope, never the HTTP status alone, is what refuses.
9
- export function wireBaseFrom(hasBaseElement, baseURI) {
10
- return hasBaseElement ? new URL('.', baseURI).pathname.replace(/\/$/, '') : '';
11
- }
12
- // Served at the origin root the base is ''; served under a path prefix (an embedder's earlier <base>) every
13
- // call resolves inside that prefix.
14
- export const API_BASE = typeof document === 'undefined' ? '' : wireBaseFrom(document.querySelector('base[href]') !== null, document.baseURI);
15
- export class StripeApiError extends Error {
16
- code;
17
- constructor(message, code) {
18
- super(message);
19
- this.code = code;
20
- }
21
- }
22
- async function call(method, path, body) {
23
- const init = { method, headers: { accept: 'application/json' } };
24
- if (body) {
25
- const form = Object.entries(body).filter(([, v]) => v !== undefined && v !== '').map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`).join('&');
26
- init.body = form;
27
- init.headers['content-type'] = 'application/x-www-form-urlencoded';
28
- }
29
- const res = await fetch(`${API_BASE}${path}`, init);
30
- const json = await res.json().catch(() => ({ error: { message: `${res.status} ${res.statusText}` } }));
31
- if (json && json.error)
32
- throw new StripeApiError(String(json.error.message ?? 'Request failed'), json.error.code);
33
- return json;
34
- }
35
- export const retrieve = (path) => call('GET', path);
36
- /** A list endpoint's `data`, newest first as Stripe returns it (one page of up to 100). */
37
- export async function list(path) {
38
- const sep = path.includes('?') ? '&' : '?';
39
- const body = await call('GET', `${path}${sep}limit=100`);
40
- return Array.isArray(body?.data) ? body.data : [];
41
- }
42
- const optional = (p, fallback) => p.catch(() => fallback);
43
- export function paymentStatusOf(intent, charge) {
44
- if (charge?.disputed)
45
- return 'disputed';
46
- if (charge?.refunded)
47
- return 'refunded';
48
- if (charge && Number(charge.amount_refunded) > 0)
49
- return 'partially_refunded';
50
- if (charge?.status === 'failed')
51
- return 'failed';
52
- if (intent) {
53
- if (intent.status === 'succeeded')
54
- return 'succeeded';
55
- if (intent.status === 'canceled')
56
- return 'canceled';
57
- if (intent.status === 'requires_capture')
58
- return 'uncaptured';
59
- if (intent.status === 'processing')
60
- return 'processing';
61
- if (intent.last_payment_error)
62
- return 'failed';
63
- return 'incomplete';
64
- }
65
- return charge?.status === 'succeeded' ? 'succeeded' : charge?.status === 'pending' ? 'processing' : 'failed';
66
- }
67
- const DECLINE_REASONS = {
68
- generic_decline: 'Generic decline', insufficient_funds: 'Insufficient funds', lost_card: 'Lost card', stolen_card: 'Stolen card',
69
- expired_card: 'Expired card', incorrect_cvc: 'Incorrect CVC', processing_error: 'Processing error', card_declined: 'Card declined',
70
- };
71
- export const declineReasonText = (code) => (code ? DECLINE_REASONS[code] ?? code.replace(/_/g, ' ') : undefined);
72
- async function paymentMethodsById(ids) {
73
- const unique = [...new Set([...ids].filter((id) => typeof id === 'string' && id.startsWith('pm_')))];
74
- const found = await Promise.all(unique.map((id) => optional(retrieve(`/v1/payment_methods/${id}`), undefined)));
75
- return new Map(found.filter((pm) => Boolean(pm?.id)).map((pm) => [pm.id, pm]));
76
- }
77
- function paymentOf(intent, charge, refunds, dir) {
78
- const base = intent ?? charge;
79
- const customerId = typeof base.customer === 'string' ? base.customer : base.customer?.id;
80
- const pmId = typeof base.payment_method === 'string' ? base.payment_method : charge?.payment_method;
81
- const error = intent?.last_payment_error;
82
- const refundsOf = refunds.filter((r) => (intent && r.payment_intent === intent.id) || (charge && r.charge === charge.id));
83
- return {
84
- id: String(base.id),
85
- amount: Number(base.amount) || 0,
86
- currency: String(base.currency ?? 'usd'),
87
- status: paymentStatusOf(intent, charge),
88
- description: base.description ?? charge?.description ?? undefined,
89
- created: Number(base.created) || 0,
90
- customer: customerId ? dir.customers.get(customerId) ?? { id: customerId } : undefined,
91
- charge, intent,
92
- paymentMethod: pmId ? dir.paymentMethods.get(pmId) : undefined,
93
- amountRefunded: Number(charge?.amount_refunded) || refundsOf.reduce((n, r) => n + (r.status === 'failed' ? 0 : Number(r.amount) || 0), 0),
94
- refundedAt: refundsOf.length ? Math.max(...refundsOf.map((r) => Number(r.created) || 0)) : undefined,
95
- declineReason: declineReasonText(error?.decline_code ?? error?.code ?? charge?.failure_code),
96
- declineMessage: error?.message ?? charge?.failure_message ?? undefined,
97
- };
98
- }
99
- /** The Payments list: every PaymentIntent, and every Charge made without one. */
100
- export async function loadPayments() {
101
- const [intents, charges, refunds, customers] = await Promise.all([
102
- list('/v1/payment_intents'), list('/v1/charges'), optional(list('/v1/refunds'), []), list('/v1/customers'),
103
- ]);
104
- const chargeById = new Map(charges.map((c) => [c.id, c]));
105
- const pmIds = [...intents.map((i) => i.payment_method), ...charges.map((c) => c.payment_method)];
106
- const dir = { customers: new Map(customers.map((c) => [c.id, c])), paymentMethods: await paymentMethodsById(pmIds) };
107
- const rows = intents.map((pi) => {
108
- const charge = (typeof pi.latest_charge === 'string' ? chargeById.get(pi.latest_charge) : pi.latest_charge) ?? charges.find((c) => c.payment_intent === pi.id);
109
- return paymentOf(pi, charge, refunds, dir);
110
- });
111
- for (const ch of charges)
112
- if (!ch.payment_intent)
113
- rows.push(paymentOf(undefined, ch, refunds, dir));
114
- return rows.sort((a, b) => b.created - a.created);
115
- }
116
- /** One payment's page: the intent (or charge), its charge, refunds, card, customer and the events about it. */
117
- export async function loadPayment(id) {
118
- let intent;
119
- let charge;
120
- if (id.startsWith('ch_') || id.startsWith('py_')) {
121
- charge = await retrieve(`/v1/charges/${id}`);
122
- if (typeof charge.payment_intent === 'string')
123
- intent = await optional(retrieve(`/v1/payment_intents/${charge.payment_intent}`), undefined);
124
- }
125
- else {
126
- intent = await retrieve(`/v1/payment_intents/${id}`);
127
- const chargeId = typeof intent.latest_charge === 'string' ? intent.latest_charge : intent.latest_charge?.id;
128
- if (chargeId)
129
- charge = await optional(retrieve(`/v1/charges/${chargeId}`), undefined);
130
- }
131
- const base = intent ?? charge;
132
- const customerId = typeof base.customer === 'string' ? base.customer : undefined;
133
- const pmId = typeof base.payment_method === 'string' ? base.payment_method : charge?.payment_method;
134
- const refundPath = intent ? `/v1/refunds?payment_intent=${intent.id}` : `/v1/refunds?charge=${charge.id}`;
135
- const [customer, pms, refunds, events, invoice] = await Promise.all([
136
- customerId ? optional(retrieve(`/v1/customers/${customerId}`), { id: customerId }) : Promise.resolve(undefined),
137
- paymentMethodsById(pmId ? [pmId] : []),
138
- optional(list(refundPath), []),
139
- optional(list('/v1/events'), []),
140
- typeof base.invoice === 'string' ? optional(retrieve(`/v1/invoices/${base.invoice}`), undefined) : Promise.resolve(undefined),
141
- ]);
142
- const dir = { customers: new Map(customer ? [[customer.id, customer]] : []), paymentMethods: pms };
143
- const related = new Set([base.id, charge?.id, intent?.id, ...refunds.map((r) => r.id)].filter(Boolean));
144
- return {
145
- ...paymentOf(intent, charge, refunds, dir),
146
- refunds,
147
- events: events.filter((e) => related.has(e?.data?.object?.id)).sort((a, b) => b.created - a.created),
148
- invoice,
149
- };
150
- }
151
- export async function loadCustomers() {
152
- const [customers, charges, intents] = await Promise.all([list('/v1/customers'), list('/v1/charges'), list('/v1/payment_intents')]);
153
- const pmIds = customers.map((c) => c.invoice_settings?.default_payment_method).filter((x) => typeof x === 'string');
154
- const pms = await paymentMethodsById(pmIds);
155
- return customers.map((c) => {
156
- const mine = charges.filter((ch) => ch.customer === c.id && ch.status === 'succeeded');
157
- const pmId = c.invoice_settings?.default_payment_method;
158
- return {
159
- ...c,
160
- defaultCard: typeof pmId === 'string' ? pms.get(pmId) : undefined,
161
- totalSpend: mine.reduce((n, ch) => n + (Number(ch.amount_captured ?? ch.amount) || 0) - (Number(ch.amount_refunded) || 0), 0),
162
- payments: intents.filter((i) => i.customer === c.id && i.status === 'succeeded').length || mine.length,
163
- refunds: mine.reduce((n, ch) => n + (Number(ch.amount_refunded) || 0), 0),
164
- currency: String(mine[0]?.currency ?? c.currency ?? 'usd'),
165
- };
166
- });
167
- }
168
- export async function loadCustomer(id) {
169
- const customer = await retrieve(`/v1/customers/${id}`);
170
- const [paymentMethods, subscriptions, invoices, payments, products, events] = await Promise.all([
171
- optional(list(`/v1/customers/${id}/payment_methods`), []),
172
- optional(list(`/v1/subscriptions?customer=${id}&status=all`), []),
173
- optional(list(`/v1/invoices?customer=${id}`), []),
174
- loadPayments().then((all) => all.filter((p) => p.customer?.id === id)),
175
- optional(list('/v1/products'), []),
176
- optional(list('/v1/events'), []),
177
- ]);
178
- const mine = new Set([id, ...subscriptions.map((s) => s.id), ...invoices.map((i) => i.id), ...payments.map((p) => p.id)]);
179
- return {
180
- customer, paymentMethods, subscriptions, invoices, payments,
181
- products: new Map(products.map((p) => [p.id, p])),
182
- events: events.filter((e) => mine.has(e?.data?.object?.id)).sort((a, b) => b.created - a.created),
183
- };
184
- }
185
- export async function loadSubscriptions() {
186
- const [subscriptions, customers, products] = await Promise.all([list('/v1/subscriptions?status=all'), list('/v1/customers'), list('/v1/products')]);
187
- return { subscriptions, customers: new Map(customers.map((c) => [c.id, c])), products: new Map(products.map((p) => [p.id, p])) };
188
- }
189
- export async function loadSubscription(id) {
190
- const subscription = await retrieve(`/v1/subscriptions/${id}`);
191
- const customerId = typeof subscription.customer === 'string' ? subscription.customer : subscription.customer?.id;
192
- const [customer, invoices, products, events] = await Promise.all([
193
- customerId ? optional(retrieve(`/v1/customers/${customerId}`), undefined) : Promise.resolve(undefined),
194
- optional(list(`/v1/invoices?subscription=${id}`), []),
195
- optional(list('/v1/products'), []),
196
- optional(list('/v1/events'), []),
197
- ]);
198
- const pmId = subscription.default_payment_method ?? customer?.invoice_settings?.default_payment_method;
199
- const pms = await paymentMethodsById(typeof pmId === 'string' ? [pmId] : []);
200
- return {
201
- subscription, customer, invoices, products: new Map(products.map((p) => [p.id, p])),
202
- events: events.filter((e) => e?.data?.object?.id === id).sort((a, b) => b.created - a.created),
203
- paymentMethod: typeof pmId === 'string' ? pms.get(pmId) : undefined,
204
- };
205
- }
206
- export async function loadInvoices() {
207
- const [invoices, customers] = await Promise.all([list('/v1/invoices'), list('/v1/customers')]);
208
- return { invoices, customers: new Map(customers.map((c) => [c.id, c])) };
209
- }
210
- export async function loadProducts() {
211
- const [products, prices] = await Promise.all([list('/v1/products'), list('/v1/prices')]);
212
- return { products, prices };
213
- }
214
- export async function loadHome() {
215
- const [balance, payments, customers, subscriptions, invoices] = await Promise.all([
216
- retrieve('/v1/balance'), loadPayments(), list('/v1/customers'), optional(list('/v1/subscriptions?status=all'), []), optional(list('/v1/invoices'), []),
217
- ]);
218
- return { balance, payments, customers, subscriptions, invoices };
219
- }
220
- export async function loadBalances() {
221
- const [balance, transactions, payouts] = await Promise.all([retrieve('/v1/balance'), optional(list('/v1/balance_transactions'), []), optional(list('/v1/payouts'), [])]);
222
- return { balance, transactions, payouts };
223
- }
224
- export async function loadDevelopers() {
225
- const [events, webhooks, account] = await Promise.all([optional(list('/v1/events'), []), optional(list('/v1/webhook_endpoints'), []), optional(retrieve('/v1/account'), undefined)]);
226
- return { events, webhooks, account };
227
- }
228
- // ── writes ───────────────────────────────────────────────────────────────────
229
- /** Refund a payment in full (no amount) or in part. */
230
- export function createRefund(payment, amount, reason) {
231
- const target = payment.intent ? { payment_intent: String(payment.intent.id) } : { charge: String(payment.charge?.id) };
232
- return call('POST', '/v1/refunds', { ...target, amount, reason });
233
- }
234
- /** Cancel now (DELETE) or at the end of the current period (cancel_at_period_end). */
235
- export function cancelSubscription(id, when) {
236
- return when === 'now' ? call('DELETE', `/v1/subscriptions/${id}`) : call('POST', `/v1/subscriptions/${id}`, { cancel_at_period_end: true });
237
- }
238
- export const createObject = (collection, fields) => call('POST', `/v1/${collection}`, fields);
@@ -1,286 +0,0 @@
1
- // The Stripe Dashboard's reads and writes, through Stripe's own API on this origin (docs/contributing/
2
- // architecture.md, "Screens": a workspace reads and writes only through the pack's operations). The calls
3
- // the Dashboard makes for the pages it shows: the balance, payments (PaymentIntents and the Charges they
4
- // made), refunds, customers and their saved payment methods, subscriptions, invoices, products and prices,
5
- // and events for a detail page's timeline. The writes a person makes here: refund a payment
6
- // (POST /v1/refunds), cancel a subscription (DELETE /v1/subscriptions/{id}, or schedule it with
7
- // cancel_at_period_end), create a customer or a product. Bodies are form-encoded as Stripe's API takes them;
8
- // an `error` envelope, never the HTTP status alone, is what refuses.
9
-
10
- type Json = any;
11
- export type StripeObject = Record<string, any>;
12
-
13
- export function wireBaseFrom(hasBaseElement: boolean, baseURI: string): string {
14
- return hasBaseElement ? new URL('.', baseURI).pathname.replace(/\/$/, '') : '';
15
- }
16
- // Served at the origin root the base is ''; served under a path prefix (an embedder's earlier <base>) every
17
- // call resolves inside that prefix.
18
- export const API_BASE = typeof document === 'undefined' ? '' : wireBaseFrom(document.querySelector('base[href]') !== null, document.baseURI);
19
-
20
- export class StripeApiError extends Error {
21
- constructor(message: string, readonly code?: string) { super(message); }
22
- }
23
-
24
- async function call(method: string, path: string, body?: Record<string, string | number | boolean | undefined>): Promise<Json> {
25
- const init: RequestInit = { method, headers: { accept: 'application/json' } };
26
- if (body) {
27
- const form = Object.entries(body).filter(([, v]) => v !== undefined && v !== '').map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`).join('&');
28
- init.body = form;
29
- (init.headers as Record<string, string>)['content-type'] = 'application/x-www-form-urlencoded';
30
- }
31
- const res = await fetch(`${API_BASE}${path}`, init);
32
- const json = await res.json().catch(() => ({ error: { message: `${res.status} ${res.statusText}` } }));
33
- if (json && json.error) throw new StripeApiError(String(json.error.message ?? 'Request failed'), json.error.code);
34
- return json;
35
- }
36
-
37
- export const retrieve = (path: string): Promise<StripeObject> => call('GET', path);
38
- /** A list endpoint's `data`, newest first as Stripe returns it (one page of up to 100). */
39
- export async function list(path: string): Promise<StripeObject[]> {
40
- const sep = path.includes('?') ? '&' : '?';
41
- const body = await call('GET', `${path}${sep}limit=100`);
42
- return Array.isArray(body?.data) ? body.data : [];
43
- }
44
- const optional = <T>(p: Promise<T>, fallback: T): Promise<T> => p.catch(() => fallback);
45
-
46
- // ── what a payment row is ────────────────────────────────────────────────────
47
- /** One row of the Payments list: a PaymentIntent (or a Charge made without one) with what the Dashboard
48
- * shows beside it — its charge, refunds, card and customer. */
49
- export type Payment = {
50
- id: string;
51
- amount: number;
52
- currency: string;
53
- status: PaymentStatus;
54
- description?: string;
55
- created: number;
56
- customer?: StripeObject;
57
- charge?: StripeObject;
58
- intent?: StripeObject;
59
- paymentMethod?: StripeObject;
60
- amountRefunded: number;
61
- refundedAt?: number;
62
- declineReason?: string;
63
- declineMessage?: string;
64
- };
65
- export type PaymentStatus = 'succeeded' | 'refunded' | 'partially_refunded' | 'failed' | 'incomplete' | 'uncaptured' | 'canceled' | 'disputed' | 'processing';
66
-
67
- export function paymentStatusOf(intent: StripeObject | undefined, charge: StripeObject | undefined): PaymentStatus {
68
- if (charge?.disputed) return 'disputed';
69
- if (charge?.refunded) return 'refunded';
70
- if (charge && Number(charge.amount_refunded) > 0) return 'partially_refunded';
71
- if (charge?.status === 'failed') return 'failed';
72
- if (intent) {
73
- if (intent.status === 'succeeded') return 'succeeded';
74
- if (intent.status === 'canceled') return 'canceled';
75
- if (intent.status === 'requires_capture') return 'uncaptured';
76
- if (intent.status === 'processing') return 'processing';
77
- if (intent.last_payment_error) return 'failed';
78
- return 'incomplete';
79
- }
80
- return charge?.status === 'succeeded' ? 'succeeded' : charge?.status === 'pending' ? 'processing' : 'failed';
81
- }
82
-
83
- const DECLINE_REASONS: Record<string, string> = {
84
- generic_decline: 'Generic decline', insufficient_funds: 'Insufficient funds', lost_card: 'Lost card', stolen_card: 'Stolen card',
85
- expired_card: 'Expired card', incorrect_cvc: 'Incorrect CVC', processing_error: 'Processing error', card_declined: 'Card declined',
86
- };
87
- export const declineReasonText = (code: string | undefined): string | undefined => (code ? DECLINE_REASONS[code] ?? code.replace(/_/g, ' ') : undefined);
88
-
89
- type Directory = { customers: Map<string, StripeObject>; paymentMethods: Map<string, StripeObject> };
90
-
91
- async function paymentMethodsById(ids: Iterable<string>): Promise<Map<string, StripeObject>> {
92
- const unique = [...new Set([...ids].filter((id) => typeof id === 'string' && id.startsWith('pm_')))];
93
- const found = await Promise.all(unique.map((id) => optional(retrieve(`/v1/payment_methods/${id}`), undefined as StripeObject | undefined)));
94
- return new Map(found.filter((pm): pm is StripeObject => Boolean(pm?.id)).map((pm) => [pm.id, pm]));
95
- }
96
-
97
- function paymentOf(intent: StripeObject | undefined, charge: StripeObject | undefined, refunds: StripeObject[], dir: Directory): Payment {
98
- const base = intent ?? charge!;
99
- const customerId = typeof base.customer === 'string' ? base.customer : base.customer?.id;
100
- const pmId = typeof base.payment_method === 'string' ? base.payment_method : charge?.payment_method;
101
- const error = intent?.last_payment_error;
102
- const refundsOf = refunds.filter((r) => (intent && r.payment_intent === intent.id) || (charge && r.charge === charge.id));
103
- return {
104
- id: String(base.id),
105
- amount: Number(base.amount) || 0,
106
- currency: String(base.currency ?? 'usd'),
107
- status: paymentStatusOf(intent, charge),
108
- description: base.description ?? charge?.description ?? undefined,
109
- created: Number(base.created) || 0,
110
- customer: customerId ? dir.customers.get(customerId) ?? { id: customerId } : undefined,
111
- charge, intent,
112
- paymentMethod: pmId ? dir.paymentMethods.get(pmId) : undefined,
113
- amountRefunded: Number(charge?.amount_refunded) || refundsOf.reduce((n, r) => n + (r.status === 'failed' ? 0 : Number(r.amount) || 0), 0),
114
- refundedAt: refundsOf.length ? Math.max(...refundsOf.map((r) => Number(r.created) || 0)) : undefined,
115
- declineReason: declineReasonText(error?.decline_code ?? error?.code ?? charge?.failure_code),
116
- declineMessage: error?.message ?? charge?.failure_message ?? undefined,
117
- };
118
- }
119
-
120
- /** The Payments list: every PaymentIntent, and every Charge made without one. */
121
- export async function loadPayments(): Promise<Payment[]> {
122
- const [intents, charges, refunds, customers] = await Promise.all([
123
- list('/v1/payment_intents'), list('/v1/charges'), optional(list('/v1/refunds'), []), list('/v1/customers'),
124
- ]);
125
- const chargeById = new Map(charges.map((c) => [c.id, c]));
126
- const pmIds = [...intents.map((i) => i.payment_method), ...charges.map((c) => c.payment_method)];
127
- const dir: Directory = { customers: new Map(customers.map((c) => [c.id, c])), paymentMethods: await paymentMethodsById(pmIds) };
128
- const rows = intents.map((pi) => {
129
- const charge = (typeof pi.latest_charge === 'string' ? chargeById.get(pi.latest_charge) : pi.latest_charge) ?? charges.find((c) => c.payment_intent === pi.id);
130
- return paymentOf(pi, charge, refunds, dir);
131
- });
132
- for (const ch of charges) if (!ch.payment_intent) rows.push(paymentOf(undefined, ch, refunds, dir));
133
- return rows.sort((a, b) => b.created - a.created);
134
- }
135
-
136
- export type PaymentDetail = Payment & { refunds: StripeObject[]; events: StripeObject[]; invoice?: StripeObject };
137
-
138
- /** One payment's page: the intent (or charge), its charge, refunds, card, customer and the events about it. */
139
- export async function loadPayment(id: string): Promise<PaymentDetail> {
140
- let intent: StripeObject | undefined;
141
- let charge: StripeObject | undefined;
142
- if (id.startsWith('ch_') || id.startsWith('py_')) {
143
- charge = await retrieve(`/v1/charges/${id}`);
144
- if (typeof charge.payment_intent === 'string') intent = await optional(retrieve(`/v1/payment_intents/${charge.payment_intent}`), undefined);
145
- } else {
146
- intent = await retrieve(`/v1/payment_intents/${id}`);
147
- const chargeId = typeof intent.latest_charge === 'string' ? intent.latest_charge : intent.latest_charge?.id;
148
- if (chargeId) charge = await optional(retrieve(`/v1/charges/${chargeId}`), undefined);
149
- }
150
- const base = intent ?? charge!;
151
- const customerId = typeof base.customer === 'string' ? base.customer : undefined;
152
- const pmId = typeof base.payment_method === 'string' ? base.payment_method : charge?.payment_method;
153
- const refundPath = intent ? `/v1/refunds?payment_intent=${intent.id}` : `/v1/refunds?charge=${charge!.id}`;
154
- const [customer, pms, refunds, events, invoice] = await Promise.all([
155
- customerId ? optional(retrieve(`/v1/customers/${customerId}`), { id: customerId }) : Promise.resolve(undefined),
156
- paymentMethodsById(pmId ? [pmId] : []),
157
- optional(list(refundPath), []),
158
- optional(list('/v1/events'), []),
159
- typeof base.invoice === 'string' ? optional(retrieve(`/v1/invoices/${base.invoice}`), undefined) : Promise.resolve(undefined),
160
- ]);
161
- const dir: Directory = { customers: new Map(customer ? [[customer.id, customer]] : []), paymentMethods: pms };
162
- const related = new Set<string>([base.id, charge?.id, intent?.id, ...refunds.map((r) => r.id)].filter(Boolean) as string[]);
163
- return {
164
- ...paymentOf(intent, charge, refunds, dir),
165
- refunds,
166
- events: events.filter((e) => related.has(e?.data?.object?.id)).sort((a, b) => b.created - a.created),
167
- invoice,
168
- };
169
- }
170
-
171
- // ── customers ────────────────────────────────────────────────────────────────
172
- export type CustomerRow = StripeObject & { defaultCard?: StripeObject; totalSpend: number; payments: number; refunds: number; currency: string };
173
-
174
- export async function loadCustomers(): Promise<CustomerRow[]> {
175
- const [customers, charges, intents] = await Promise.all([list('/v1/customers'), list('/v1/charges'), list('/v1/payment_intents')]);
176
- const pmIds = customers.map((c) => c.invoice_settings?.default_payment_method).filter((x) => typeof x === 'string');
177
- const pms = await paymentMethodsById(pmIds);
178
- return customers.map((c) => {
179
- const mine = charges.filter((ch) => ch.customer === c.id && ch.status === 'succeeded');
180
- const pmId = c.invoice_settings?.default_payment_method;
181
- return {
182
- ...c,
183
- defaultCard: typeof pmId === 'string' ? pms.get(pmId) : undefined,
184
- totalSpend: mine.reduce((n, ch) => n + (Number(ch.amount_captured ?? ch.amount) || 0) - (Number(ch.amount_refunded) || 0), 0),
185
- payments: intents.filter((i) => i.customer === c.id && i.status === 'succeeded').length || mine.length,
186
- refunds: mine.reduce((n, ch) => n + (Number(ch.amount_refunded) || 0), 0),
187
- currency: String(mine[0]?.currency ?? c.currency ?? 'usd'),
188
- };
189
- });
190
- }
191
-
192
- export type CustomerDetail = {
193
- customer: StripeObject;
194
- paymentMethods: StripeObject[];
195
- subscriptions: StripeObject[];
196
- invoices: StripeObject[];
197
- payments: Payment[];
198
- products: Map<string, StripeObject>;
199
- events: StripeObject[];
200
- };
201
-
202
- export async function loadCustomer(id: string): Promise<CustomerDetail> {
203
- const customer = await retrieve(`/v1/customers/${id}`);
204
- const [paymentMethods, subscriptions, invoices, payments, products, events] = await Promise.all([
205
- optional(list(`/v1/customers/${id}/payment_methods`), []),
206
- optional(list(`/v1/subscriptions?customer=${id}&status=all`), []),
207
- optional(list(`/v1/invoices?customer=${id}`), []),
208
- loadPayments().then((all) => all.filter((p) => p.customer?.id === id)),
209
- optional(list('/v1/products'), []),
210
- optional(list('/v1/events'), []),
211
- ]);
212
- const mine = new Set([id, ...subscriptions.map((s) => s.id), ...invoices.map((i) => i.id), ...payments.map((p) => p.id)]);
213
- return {
214
- customer, paymentMethods, subscriptions, invoices, payments,
215
- products: new Map(products.map((p) => [p.id, p])),
216
- events: events.filter((e) => mine.has(e?.data?.object?.id)).sort((a, b) => b.created - a.created),
217
- };
218
- }
219
-
220
- // ── billing ──────────────────────────────────────────────────────────────────
221
- export type Billing = { subscriptions: StripeObject[]; customers: Map<string, StripeObject>; products: Map<string, StripeObject> };
222
-
223
- export async function loadSubscriptions(): Promise<Billing> {
224
- const [subscriptions, customers, products] = await Promise.all([list('/v1/subscriptions?status=all'), list('/v1/customers'), list('/v1/products')]);
225
- return { subscriptions, customers: new Map(customers.map((c) => [c.id, c])), products: new Map(products.map((p) => [p.id, p])) };
226
- }
227
-
228
- export type SubscriptionDetail = { subscription: StripeObject; customer?: StripeObject; invoices: StripeObject[]; products: Map<string, StripeObject>; events: StripeObject[]; paymentMethod?: StripeObject };
229
-
230
- export async function loadSubscription(id: string): Promise<SubscriptionDetail> {
231
- const subscription = await retrieve(`/v1/subscriptions/${id}`);
232
- const customerId = typeof subscription.customer === 'string' ? subscription.customer : subscription.customer?.id;
233
- const [customer, invoices, products, events] = await Promise.all([
234
- customerId ? optional(retrieve(`/v1/customers/${customerId}`), undefined) : Promise.resolve(undefined),
235
- optional(list(`/v1/invoices?subscription=${id}`), []),
236
- optional(list('/v1/products'), []),
237
- optional(list('/v1/events'), []),
238
- ]);
239
- const pmId = subscription.default_payment_method ?? customer?.invoice_settings?.default_payment_method;
240
- const pms = await paymentMethodsById(typeof pmId === 'string' ? [pmId] : []);
241
- return {
242
- subscription, customer, invoices, products: new Map(products.map((p) => [p.id, p])),
243
- events: events.filter((e) => e?.data?.object?.id === id).sort((a, b) => b.created - a.created),
244
- paymentMethod: typeof pmId === 'string' ? pms.get(pmId) : undefined,
245
- };
246
- }
247
-
248
- export async function loadInvoices(): Promise<{ invoices: StripeObject[]; customers: Map<string, StripeObject> }> {
249
- const [invoices, customers] = await Promise.all([list('/v1/invoices'), list('/v1/customers')]);
250
- return { invoices, customers: new Map(customers.map((c) => [c.id, c])) };
251
- }
252
-
253
- export async function loadProducts(): Promise<{ products: StripeObject[]; prices: StripeObject[] }> {
254
- const [products, prices] = await Promise.all([list('/v1/products'), list('/v1/prices')]);
255
- return { products, prices };
256
- }
257
-
258
- export type HomeData = { balance: StripeObject; payments: Payment[]; customers: StripeObject[]; subscriptions: StripeObject[]; invoices: StripeObject[] };
259
- export async function loadHome(): Promise<HomeData> {
260
- const [balance, payments, customers, subscriptions, invoices] = await Promise.all([
261
- retrieve('/v1/balance'), loadPayments(), list('/v1/customers'), optional(list('/v1/subscriptions?status=all'), []), optional(list('/v1/invoices'), []),
262
- ]);
263
- return { balance, payments, customers, subscriptions, invoices };
264
- }
265
-
266
- export async function loadBalances(): Promise<{ balance: StripeObject; transactions: StripeObject[]; payouts: StripeObject[] }> {
267
- const [balance, transactions, payouts] = await Promise.all([retrieve('/v1/balance'), optional(list('/v1/balance_transactions'), []), optional(list('/v1/payouts'), [])]);
268
- return { balance, transactions, payouts };
269
- }
270
-
271
- export async function loadDevelopers(): Promise<{ events: StripeObject[]; webhooks: StripeObject[]; account?: StripeObject }> {
272
- const [events, webhooks, account] = await Promise.all([optional(list('/v1/events'), []), optional(list('/v1/webhook_endpoints'), []), optional(retrieve('/v1/account'), undefined)]);
273
- return { events, webhooks, account };
274
- }
275
-
276
- // ── writes ───────────────────────────────────────────────────────────────────
277
- /** Refund a payment in full (no amount) or in part. */
278
- export function createRefund(payment: { intent?: StripeObject; charge?: StripeObject }, amount: number | undefined, reason: string | undefined): Promise<StripeObject> {
279
- const target = payment.intent ? { payment_intent: String(payment.intent.id) } : { charge: String(payment.charge?.id) };
280
- return call('POST', '/v1/refunds', { ...target, amount, reason });
281
- }
282
- /** Cancel now (DELETE) or at the end of the current period (cancel_at_period_end). */
283
- export function cancelSubscription(id: string, when: 'now' | 'period_end'): Promise<StripeObject> {
284
- return when === 'now' ? call('DELETE', `/v1/subscriptions/${id}`) : call('POST', `/v1/subscriptions/${id}`, { cancel_at_period_end: true });
285
- }
286
- export const createObject = (collection: string, fields: Record<string, string>): Promise<StripeObject> => call('POST', `/v1/${collection}`, fields);