@aglyn/plugins-commerce 1.0.0-beta.229 → 1.0.0-beta.231

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 (590) hide show
  1. package/package.json +13 -13
  2. package/src/index.d.ts +0 -1
  3. package/src/index.js +0 -1
  4. package/src/index.js.map +1 -1
  5. package/src/lib/barcode/barcode-decode.d.ts +71 -0
  6. package/src/lib/barcode/barcode-decode.js +498 -0
  7. package/src/lib/barcode/barcode-decode.js.map +1 -0
  8. package/src/lib/barcode/barcode-encode.d.ts +44 -0
  9. package/src/lib/barcode/barcode-encode.js +138 -0
  10. package/src/lib/barcode/barcode-encode.js.map +1 -0
  11. package/src/lib/barcode/barcode-scanner.component.d.ts +23 -0
  12. package/src/lib/barcode/barcode-scanner.component.js +260 -0
  13. package/src/lib/barcode/barcode-scanner.component.js.map +1 -0
  14. package/src/lib/barcode/scan-button.component.d.ts +10 -0
  15. package/src/lib/barcode/scan-button.component.js +62 -0
  16. package/src/lib/barcode/scan-button.component.js.map +1 -0
  17. package/src/lib/barcode/scanner-wedge.d.ts +35 -0
  18. package/src/lib/barcode/scanner-wedge.js +108 -0
  19. package/src/lib/barcode/scanner-wedge.js.map +1 -0
  20. package/src/lib/components/account.js +10 -1
  21. package/src/lib/components/account.js.map +1 -1
  22. package/src/lib/components/cart-extras.d.ts +45 -0
  23. package/src/lib/components/cart-extras.js +127 -0
  24. package/src/lib/components/cart-extras.js.map +1 -0
  25. package/src/lib/components/cart.js +82 -15
  26. package/src/lib/components/cart.js.map +1 -1
  27. package/src/lib/components/checkout-return-notice.d.ts +26 -0
  28. package/src/lib/components/checkout-return-notice.js +48 -0
  29. package/src/lib/components/checkout-return-notice.js.map +1 -0
  30. package/src/lib/components/commerce-console-page.js +124 -0
  31. package/src/lib/components/commerce-console-page.js.map +1 -1
  32. package/src/lib/components/commerce-console-sections.d.ts +1 -1
  33. package/src/lib/components/commerce-console-sections.js +4 -0
  34. package/src/lib/components/commerce-console-sections.js.map +1 -1
  35. package/src/lib/components/console/bulk-fulfill.d.ts +44 -0
  36. package/src/lib/components/console/bulk-fulfill.js +84 -0
  37. package/src/lib/components/console/bulk-fulfill.js.map +1 -0
  38. package/src/lib/components/console/customer-notifications-card.component.d.ts +19 -0
  39. package/src/lib/components/console/customer-notifications-card.component.js +149 -0
  40. package/src/lib/components/console/customer-notifications-card.component.js.map +1 -0
  41. package/src/lib/components/console/host-orders-card.component.js +84 -5
  42. package/src/lib/components/console/host-orders-card.component.js.map +1 -1
  43. package/src/lib/components/console/locations-card.component.js +164 -57
  44. package/src/lib/components/console/locations-card.component.js.map +1 -1
  45. package/src/lib/components/console/order-detail-dialog.component.js +209 -61
  46. package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
  47. package/src/lib/components/console/order-fulfillment-panel.component.d.ts +48 -0
  48. package/src/lib/components/console/order-fulfillment-panel.component.js +542 -0
  49. package/src/lib/components/console/order-fulfillment-panel.component.js.map +1 -0
  50. package/src/lib/components/console/order-invoice.component.d.ts +33 -0
  51. package/src/lib/components/console/order-invoice.component.js +81 -0
  52. package/src/lib/components/console/order-invoice.component.js.map +1 -0
  53. package/src/lib/components/console/order-receipt-resend.component.d.ts +21 -0
  54. package/src/lib/components/console/order-receipt-resend.component.js +203 -0
  55. package/src/lib/components/console/order-receipt-resend.component.js.map +1 -0
  56. package/src/lib/components/console/order-returns.component.d.ts +36 -0
  57. package/src/lib/components/console/order-returns.component.js +142 -0
  58. package/src/lib/components/console/order-returns.component.js.map +1 -0
  59. package/src/lib/components/console/order-shipping-actions.component.d.ts +54 -0
  60. package/src/lib/components/console/order-shipping-actions.component.js +149 -0
  61. package/src/lib/components/console/order-shipping-actions.component.js.map +1 -0
  62. package/src/lib/components/console/order-webhooks-card.component.d.ts +50 -0
  63. package/src/lib/components/console/order-webhooks-card.component.js +623 -0
  64. package/src/lib/components/console/order-webhooks-card.component.js.map +1 -0
  65. package/src/lib/components/console/order-zones.d.ts +155 -0
  66. package/src/lib/components/console/order-zones.js +40 -0
  67. package/src/lib/components/console/order-zones.js.map +1 -0
  68. package/src/lib/components/console/payment-methods-card.component.d.ts +67 -0
  69. package/src/lib/components/console/payment-methods-card.component.js +395 -0
  70. package/src/lib/components/console/payment-methods-card.component.js.map +1 -0
  71. package/src/lib/components/console/pos/pos-api.d.ts +124 -0
  72. package/src/lib/components/console/pos/pos-api.js +101 -0
  73. package/src/lib/components/console/pos/pos-api.js.map +1 -0
  74. package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +36 -0
  75. package/src/lib/components/console/pos/pos-cart-panel.component.js +160 -0
  76. package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -0
  77. package/src/lib/components/console/pos/pos-item-dialog.component.d.ts +39 -0
  78. package/src/lib/components/console/pos/pos-item-dialog.component.js +352 -0
  79. package/src/lib/components/console/pos/pos-item-dialog.component.js.map +1 -0
  80. package/src/lib/components/console/pos/pos-product-grid.component.d.ts +47 -0
  81. package/src/lib/components/console/pos/pos-product-grid.component.js +272 -0
  82. package/src/lib/components/console/pos/pos-product-grid.component.js.map +1 -0
  83. package/src/lib/components/console/pos/pos-receipt-panel.component.d.ts +27 -0
  84. package/src/lib/components/console/pos/pos-receipt-panel.component.js +282 -0
  85. package/src/lib/components/console/pos/pos-receipt-panel.component.js.map +1 -0
  86. package/src/lib/components/console/pos/pos-tender-dialogs.component.d.ts +53 -0
  87. package/src/lib/components/console/pos/pos-tender-dialogs.component.js +445 -0
  88. package/src/lib/components/console/pos/pos-tender-dialogs.component.js.map +1 -0
  89. package/src/lib/components/console/pos/pos-tender-panel.component.d.ts +31 -0
  90. package/src/lib/components/console/pos/pos-tender-panel.component.js +640 -0
  91. package/src/lib/components/console/pos/pos-tender-panel.component.js.map +1 -0
  92. package/src/lib/components/console/pos/use-pos-display.d.ts +43 -0
  93. package/src/lib/components/console/pos/use-pos-display.js +161 -0
  94. package/src/lib/components/console/pos/use-pos-display.js.map +1 -0
  95. package/src/lib/components/console/pos-devices-card.component.d.ts +14 -0
  96. package/src/lib/components/console/pos-devices-card.component.js +546 -0
  97. package/src/lib/components/console/pos-devices-card.component.js.map +1 -0
  98. package/src/lib/components/console/pos-display/brand-screen.d.ts +33 -0
  99. package/src/lib/components/console/pos-display/brand-screen.js +85 -0
  100. package/src/lib/components/console/pos-display/brand-screen.js.map +1 -0
  101. package/src/lib/components/console/pos-display/cart-screen.d.ts +29 -0
  102. package/src/lib/components/console/pos-display/cart-screen.js +166 -0
  103. package/src/lib/components/console/pos-display/cart-screen.js.map +1 -0
  104. package/src/lib/components/console/pos-display/pairing-screen.d.ts +24 -0
  105. package/src/lib/components/console/pos-display/pairing-screen.js +127 -0
  106. package/src/lib/components/console/pos-display/pairing-screen.js.map +1 -0
  107. package/src/lib/components/console/pos-display/pos-display-api.d.ts +90 -0
  108. package/src/lib/components/console/pos-display/pos-display-api.js +140 -0
  109. package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -0
  110. package/src/lib/components/console/pos-display/receipt-screen.d.ts +35 -0
  111. package/src/lib/components/console/pos-display/receipt-screen.js +200 -0
  112. package/src/lib/components/console/pos-display/receipt-screen.js.map +1 -0
  113. package/src/lib/components/console/pos-display/tip-screen.d.ts +36 -0
  114. package/src/lib/components/console/pos-display/tip-screen.js +211 -0
  115. package/src/lib/components/console/pos-display/tip-screen.js.map +1 -0
  116. package/src/lib/components/console/pos-display-page.component.d.ts +16 -0
  117. package/src/lib/components/console/pos-display-page.component.js +407 -0
  118. package/src/lib/components/console/pos-display-page.component.js.map +1 -0
  119. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.d.ts +40 -0
  120. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js +289 -0
  121. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js.map +1 -0
  122. package/src/lib/components/console/pos-ops/pos-last-receipt.component.d.ts +34 -0
  123. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js +61 -0
  124. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js.map +1 -0
  125. package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +38 -0
  126. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +129 -0
  127. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -0
  128. package/src/lib/components/console/pos-ops/pos-ops-api.d.ts +37 -0
  129. package/src/lib/components/console/pos-ops/pos-ops-api.js +60 -0
  130. package/src/lib/components/console/pos-ops/pos-ops-api.js.map +1 -0
  131. package/src/lib/components/console/pos-ops/pos-pin-pad.component.d.ts +48 -0
  132. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js +220 -0
  133. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js.map +1 -0
  134. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.d.ts +63 -0
  135. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js +186 -0
  136. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js.map +1 -0
  137. package/src/lib/components/console/pos-ops/pos-receipt.d.ts +39 -0
  138. package/src/lib/components/console/pos-ops/pos-receipt.js +182 -0
  139. package/src/lib/components/console/pos-ops/pos-receipt.js.map +1 -0
  140. package/src/lib/components/console/pos-ops/pos-return-dialog.component.d.ts +40 -0
  141. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js +465 -0
  142. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js.map +1 -0
  143. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.d.ts +29 -0
  144. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js +253 -0
  145. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js.map +1 -0
  146. package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +34 -0
  147. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +494 -0
  148. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -0
  149. package/src/lib/components/console/pos-ops/pos-shift-report.component.d.ts +37 -0
  150. package/src/lib/components/console/pos-ops/pos-shift-report.component.js +102 -0
  151. package/src/lib/components/console/pos-ops/pos-shift-report.component.js.map +1 -0
  152. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.d.ts +30 -0
  153. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js +277 -0
  154. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js.map +1 -0
  155. package/src/lib/components/console/pos-ops/register-ops.d.ts +28 -0
  156. package/src/lib/components/console/pos-ops/register-ops.js +28 -0
  157. package/src/lib/components/console/pos-ops/register-ops.js.map +1 -0
  158. package/src/lib/components/console/pos-ops/use-pos-cashier.d.ts +46 -0
  159. package/src/lib/components/console/pos-ops/use-pos-cashier.js +128 -0
  160. package/src/lib/components/console/pos-ops/use-pos-cashier.js.map +1 -0
  161. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.d.ts +36 -0
  162. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js +64 -0
  163. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js.map +1 -0
  164. package/src/lib/components/console/pos-page.component.d.ts +13 -5
  165. package/src/lib/components/console/pos-page.component.js +729 -657
  166. package/src/lib/components/console/pos-page.component.js.map +1 -1
  167. package/src/lib/components/console/product-editor-dialog.component.js +51 -7
  168. package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
  169. package/src/lib/components/console/product-labels-dialog.component.d.ts +13 -0
  170. package/src/lib/components/console/product-labels-dialog.component.js +197 -0
  171. package/src/lib/components/console/product-labels-dialog.component.js.map +1 -0
  172. package/src/lib/components/console/product-register-fields.component.d.ts +19 -0
  173. package/src/lib/components/console/product-register-fields.component.js +241 -0
  174. package/src/lib/components/console/product-register-fields.component.js.map +1 -0
  175. package/src/lib/components/console/product-zones.d.ts +58 -2
  176. package/src/lib/components/console/product-zones.js +10 -2
  177. package/src/lib/components/console/product-zones.js.map +1 -1
  178. package/src/lib/components/console/products-hub-card.component.js +51 -11
  179. package/src/lib/components/console/products-hub-card.component.js.map +1 -1
  180. package/src/lib/components/console/register-hardware-card.component.d.ts +33 -0
  181. package/src/lib/components/console/register-hardware-card.component.js +826 -0
  182. package/src/lib/components/console/register-hardware-card.component.js.map +1 -0
  183. package/src/lib/components/console/registers-card.component.js +24 -5
  184. package/src/lib/components/console/registers-card.component.js.map +1 -1
  185. package/src/lib/components/console/return-actions.d.ts +38 -0
  186. package/src/lib/components/console/return-actions.js +76 -0
  187. package/src/lib/components/console/return-actions.js.map +1 -0
  188. package/src/lib/components/console/return-detail-dialog.component.d.ts +34 -0
  189. package/src/lib/components/console/return-detail-dialog.component.js +718 -0
  190. package/src/lib/components/console/return-detail-dialog.component.js.map +1 -0
  191. package/src/lib/components/console/return-settings-card.component.d.ts +34 -0
  192. package/src/lib/components/console/return-settings-card.component.js +195 -0
  193. package/src/lib/components/console/return-settings-card.component.js.map +1 -0
  194. package/src/lib/components/console/return-zones.d.ts +87 -0
  195. package/src/lib/components/console/return-zones.js +31 -0
  196. package/src/lib/components/console/return-zones.js.map +1 -0
  197. package/src/lib/components/console/returns-card.component.d.ts +45 -0
  198. package/src/lib/components/console/returns-card.component.js +159 -0
  199. package/src/lib/components/console/returns-card.component.js.map +1 -0
  200. package/src/lib/components/console/shipping-settings-card.component.js +161 -5
  201. package/src/lib/components/console/shipping-settings-card.component.js.map +1 -1
  202. package/src/lib/components/console/shippingeasy-card.component.d.ts +59 -0
  203. package/src/lib/components/console/shippingeasy-card.component.js +378 -0
  204. package/src/lib/components/console/shippingeasy-card.component.js.map +1 -0
  205. package/src/lib/components/console/shipstation-card.component.d.ts +35 -0
  206. package/src/lib/components/console/shipstation-card.component.js +345 -0
  207. package/src/lib/components/console/shipstation-card.component.js.map +1 -0
  208. package/src/lib/components/console/start-return-dialog.component.d.ts +40 -0
  209. package/src/lib/components/console/start-return-dialog.component.js +243 -0
  210. package/src/lib/components/console/start-return-dialog.component.js.map +1 -0
  211. package/src/lib/components/console/stock-movements-card.component.js +2 -1
  212. package/src/lib/components/console/stock-movements-card.component.js.map +1 -1
  213. package/src/lib/components/console/store-settings-card.component.js +2 -66
  214. package/src/lib/components/console/store-settings-card.component.js.map +1 -1
  215. package/src/lib/components/console/store-zones.d.ts +42 -0
  216. package/src/lib/components/console/store-zones.js +39 -0
  217. package/src/lib/components/console/store-zones.js.map +1 -0
  218. package/src/lib/components/order-status.d.ts +36 -0
  219. package/src/lib/components/order-status.js +502 -0
  220. package/src/lib/components/order-status.js.map +1 -0
  221. package/src/lib/components/product-detail.js +44 -2
  222. package/src/lib/components/product-detail.js.map +1 -1
  223. package/src/lib/components/return-request.d.ts +32 -0
  224. package/src/lib/components/return-request.js +576 -0
  225. package/src/lib/components/return-request.js.map +1 -0
  226. package/src/lib/components/storefront-payment-appearance.d.ts +32 -0
  227. package/src/lib/components/storefront-payment-appearance.js +114 -0
  228. package/src/lib/components/storefront-payment-appearance.js.map +1 -0
  229. package/src/lib/components/storefront-payment-element.d.ts +57 -1
  230. package/src/lib/components/storefront-payment-element.js +332 -33
  231. package/src/lib/components/storefront-payment-element.js.map +1 -1
  232. package/src/lib/constants/order-status.d.ts +22 -0
  233. package/src/lib/constants/order-status.js +22 -0
  234. package/src/lib/constants/order-status.js.map +1 -0
  235. package/src/lib/constants/return-request.d.ts +27 -0
  236. package/src/lib/constants/return-request.js +32 -0
  237. package/src/lib/constants/return-request.js.map +1 -0
  238. package/src/lib/constants/stock-movement-query.js +2 -1
  239. package/src/lib/constants/stock-movement-query.js.map +1 -1
  240. package/src/lib/declarations.console-server.js +9 -0
  241. package/src/lib/declarations.console-server.js.map +1 -1
  242. package/src/lib/declarations.server.d.ts +2 -1
  243. package/src/lib/declarations.server.js +47 -1
  244. package/src/lib/declarations.server.js.map +1 -1
  245. package/src/lib/model/buyer-notifications.d.ts +59 -0
  246. package/src/lib/model/buyer-notifications.js +97 -0
  247. package/src/lib/model/buyer-notifications.js.map +1 -0
  248. package/src/lib/model/commerce-orders.d.ts +127 -1
  249. package/src/lib/model/commerce-orders.js +24 -15
  250. package/src/lib/model/commerce-orders.js.map +1 -1
  251. package/src/lib/model/commerce-payment-methods.d.ts +146 -0
  252. package/src/lib/model/commerce-payment-methods.js +247 -0
  253. package/src/lib/model/commerce-payment-methods.js.map +1 -0
  254. package/src/lib/model/commerce-pos-ops.d.ts +437 -0
  255. package/src/lib/model/commerce-pos-ops.js +721 -0
  256. package/src/lib/model/commerce-pos-ops.js.map +1 -0
  257. package/src/lib/model/commerce-pos.d.ts +263 -0
  258. package/src/lib/model/commerce-pos.js +375 -0
  259. package/src/lib/model/commerce-pos.js.map +1 -0
  260. package/src/lib/model/commerce-printers.d.ts +211 -0
  261. package/src/lib/model/commerce-printers.js +181 -0
  262. package/src/lib/model/commerce-printers.js.map +1 -0
  263. package/src/lib/model/commerce-receipt.d.ts +97 -0
  264. package/src/lib/model/commerce-receipt.js +180 -0
  265. package/src/lib/model/commerce-receipt.js.map +1 -0
  266. package/src/lib/model/commerce-returns.d.ts +207 -0
  267. package/src/lib/model/commerce-returns.js +300 -0
  268. package/src/lib/model/commerce-returns.js.map +1 -0
  269. package/src/lib/model/commerce-shipping.d.ts +44 -1
  270. package/src/lib/model/commerce-shipping.js +53 -9
  271. package/src/lib/model/commerce-shipping.js.map +1 -1
  272. package/src/lib/model/commerce-tax-engine.d.ts +90 -0
  273. package/src/lib/model/commerce-tax-engine.js +129 -0
  274. package/src/lib/model/commerce-tax-engine.js.map +1 -0
  275. package/src/lib/model/commerce.d.ts +88 -2
  276. package/src/lib/model/commerce.js +89 -1
  277. package/src/lib/model/commerce.js.map +1 -1
  278. package/src/lib/model/index.d.ts +15 -0
  279. package/src/lib/model/index.js +15 -0
  280. package/src/lib/model/index.js.map +1 -1
  281. package/src/lib/model/order-events.d.ts +154 -0
  282. package/src/lib/model/order-events.js +153 -0
  283. package/src/lib/model/order-events.js.map +1 -0
  284. package/src/lib/model/order-fulfillment.d.ts +117 -0
  285. package/src/lib/model/order-fulfillment.js +217 -0
  286. package/src/lib/model/order-fulfillment.js.map +1 -0
  287. package/src/lib/model/order-history.d.ts +58 -0
  288. package/src/lib/model/order-history.js +22 -0
  289. package/src/lib/model/order-history.js.map +1 -0
  290. package/src/lib/model/order-list-fields.d.ts +9 -1
  291. package/src/lib/model/order-list-fields.js +7 -1
  292. package/src/lib/model/order-list-fields.js.map +1 -1
  293. package/src/lib/model/order-shipping-export.d.ts +91 -0
  294. package/src/lib/model/order-shipping-export.js +192 -0
  295. package/src/lib/model/order-shipping-export.js.map +1 -0
  296. package/src/lib/model/order-status-view.d.ts +103 -0
  297. package/src/lib/model/order-status-view.js +156 -0
  298. package/src/lib/model/order-status-view.js.map +1 -0
  299. package/src/lib/model/order-webhooks.d.ts +142 -0
  300. package/src/lib/model/order-webhooks.js +91 -0
  301. package/src/lib/model/order-webhooks.js.map +1 -0
  302. package/src/lib/model/product-channel.d.ts +56 -0
  303. package/src/lib/model/product-channel.js +86 -0
  304. package/src/lib/model/product-channel.js.map +1 -0
  305. package/src/lib/model/product-modifiers.d.ts +80 -0
  306. package/src/lib/model/product-modifiers.js +140 -0
  307. package/src/lib/model/product-modifiers.js.map +1 -0
  308. package/src/lib/model/shippingeasy.d.ts +94 -0
  309. package/src/lib/model/shippingeasy.js +267 -0
  310. package/src/lib/model/shippingeasy.js.map +1 -0
  311. package/src/lib/model/shipstation.d.ts +125 -0
  312. package/src/lib/model/shipstation.js +399 -0
  313. package/src/lib/model/shipstation.js.map +1 -0
  314. package/src/lib/model/smart-collection-reads.d.ts +32 -0
  315. package/src/lib/model/smart-collection-reads.js +63 -0
  316. package/src/lib/model/smart-collection-reads.js.map +1 -0
  317. package/src/lib/model/tracking-url.d.ts +74 -0
  318. package/src/lib/model/tracking-url.js +159 -0
  319. package/src/lib/model/tracking-url.js.map +1 -0
  320. package/src/lib/plugin-config.d.ts +13 -0
  321. package/src/lib/plugin-config.js +77 -5
  322. package/src/lib/plugin-config.js.map +1 -1
  323. package/src/lib/plugin.js +23 -0
  324. package/src/lib/plugin.js.map +1 -1
  325. package/src/lib/pos-ops-config.d.ts +39 -0
  326. package/src/lib/pos-ops-config.js +88 -0
  327. package/src/lib/pos-ops-config.js.map +1 -0
  328. package/src/lib/printing/print-document.d.ts +106 -0
  329. package/src/lib/printing/print-document.js +464 -0
  330. package/src/lib/printing/print-document.js.map +1 -0
  331. package/src/lib/printing/product-labels.d.ts +58 -0
  332. package/src/lib/printing/product-labels.js +116 -0
  333. package/src/lib/printing/product-labels.js.map +1 -0
  334. package/src/lib/printing/render-epson.d.ts +57 -0
  335. package/src/lib/printing/render-epson.js +135 -0
  336. package/src/lib/printing/render-epson.js.map +1 -0
  337. package/src/lib/printing/render-star.d.ts +45 -0
  338. package/src/lib/printing/render-star.js +100 -0
  339. package/src/lib/printing/render-star.js.map +1 -0
  340. package/src/lib/printing/render-text.d.ts +25 -0
  341. package/src/lib/printing/render-text.js +53 -0
  342. package/src/lib/printing/render-text.js.map +1 -0
  343. package/src/lib/server/api-v1/openapi.js +27 -4
  344. package/src/lib/server/api-v1/openapi.js.map +1 -1
  345. package/src/lib/server/api-v1/order-view.d.ts +67 -0
  346. package/src/lib/server/api-v1/order-view.js +120 -0
  347. package/src/lib/server/api-v1/order-view.js.map +1 -0
  348. package/src/lib/server/api-v1/orders-and-products.js +58 -65
  349. package/src/lib/server/api-v1/orders-and-products.js.map +1 -1
  350. package/src/lib/server/billing-webhook.js +135 -28
  351. package/src/lib/server/billing-webhook.js.map +1 -1
  352. package/src/lib/server/cancel-order.js +29 -0
  353. package/src/lib/server/cancel-order.js.map +1 -1
  354. package/src/lib/server/carrier-rates-availability.d.ts +26 -0
  355. package/src/lib/server/carrier-rates-availability.js +76 -0
  356. package/src/lib/server/carrier-rates-availability.js.map +1 -0
  357. package/src/lib/server/carrier-shipping.d.ts +84 -0
  358. package/src/lib/server/carrier-shipping.js +135 -0
  359. package/src/lib/server/carrier-shipping.js.map +1 -0
  360. package/src/lib/server/cart-checkout.d.ts +2 -0
  361. package/src/lib/server/cart-checkout.js +226 -22
  362. package/src/lib/server/cart-checkout.js.map +1 -1
  363. package/src/lib/server/checkout-extras.d.ts +64 -0
  364. package/src/lib/server/checkout-extras.js +157 -0
  365. package/src/lib/server/checkout-extras.js.map +1 -0
  366. package/src/lib/server/{feed.d.ts → checkout-status.d.ts} +2 -7
  367. package/src/lib/server/checkout-status.js +111 -0
  368. package/src/lib/server/checkout-status.js.map +1 -0
  369. package/src/lib/server/checkout.js +86 -9
  370. package/src/lib/server/checkout.js.map +1 -1
  371. package/src/lib/server/draft-order.js +34 -5
  372. package/src/lib/server/draft-order.js.map +1 -1
  373. package/src/lib/server/fulfill-order.d.ts +127 -10
  374. package/src/lib/server/fulfill-order.js +451 -49
  375. package/src/lib/server/fulfill-order.js.map +1 -1
  376. package/src/lib/server/legacy-feed.d.ts +28 -0
  377. package/src/lib/server/legacy-feed.js +52 -0
  378. package/src/lib/server/legacy-feed.js.map +1 -0
  379. package/src/lib/server/native-checkout.d.ts +34 -15
  380. package/src/lib/server/native-checkout.js +32 -17
  381. package/src/lib/server/native-checkout.js.map +1 -1
  382. package/src/lib/server/order-event-host-emit.d.ts +23 -0
  383. package/src/lib/server/order-event-host-emit.js +30 -0
  384. package/src/lib/server/order-event-host-emit.js.map +1 -0
  385. package/src/lib/server/order-event-triggers.d.ts +37 -0
  386. package/src/lib/server/order-event-triggers.js +119 -0
  387. package/src/lib/server/order-event-triggers.js.map +1 -0
  388. package/src/lib/server/order-events.d.ts +62 -0
  389. package/src/lib/server/order-events.js +109 -0
  390. package/src/lib/server/order-events.js.map +1 -0
  391. package/src/lib/server/order-history.d.ts +23 -0
  392. package/src/lib/server/order-history.js +65 -0
  393. package/src/lib/server/order-history.js.map +1 -0
  394. package/src/lib/server/order-notifications.d.ts +185 -0
  395. package/src/lib/server/order-notifications.js +567 -0
  396. package/src/lib/server/order-notifications.js.map +1 -0
  397. package/src/lib/server/order-receipt-send.d.ts +39 -0
  398. package/src/lib/server/order-receipt-send.js +151 -0
  399. package/src/lib/server/order-receipt-send.js.map +1 -0
  400. package/src/lib/server/order-status-token.d.ts +31 -0
  401. package/src/lib/server/order-status-token.js +75 -0
  402. package/src/lib/server/order-status-token.js.map +1 -0
  403. package/src/lib/server/order-status.d.ts +58 -0
  404. package/src/lib/server/order-status.js +141 -0
  405. package/src/lib/server/order-status.js.map +1 -0
  406. package/src/lib/server/order-webhooks.d.ts +108 -0
  407. package/src/lib/server/order-webhooks.js +622 -0
  408. package/src/lib/server/order-webhooks.js.map +1 -0
  409. package/src/lib/server/orders-shipping-prepare.d.ts +26 -0
  410. package/src/lib/server/orders-shipping-prepare.js +121 -0
  411. package/src/lib/server/orders-shipping-prepare.js.map +1 -0
  412. package/src/lib/server/payment-method-domains.d.ts +209 -0
  413. package/src/lib/server/payment-method-domains.js +444 -0
  414. package/src/lib/server/payment-method-domains.js.map +1 -0
  415. package/src/lib/server/payment-methods.d.ts +77 -0
  416. package/src/lib/server/payment-methods.js +284 -0
  417. package/src/lib/server/payment-methods.js.map +1 -0
  418. package/src/lib/server/pos-auth.d.ts +50 -0
  419. package/src/lib/server/pos-auth.js +121 -0
  420. package/src/lib/server/pos-auth.js.map +1 -0
  421. package/src/lib/server/pos-customer.d.ts +49 -0
  422. package/src/lib/server/pos-customer.js +257 -0
  423. package/src/lib/server/pos-customer.js.map +1 -0
  424. package/src/lib/server/pos-display.d.ts +57 -0
  425. package/src/lib/server/pos-display.js +419 -0
  426. package/src/lib/server/pos-display.js.map +1 -0
  427. package/src/lib/server/pos-fee-month.d.ts +34 -0
  428. package/src/lib/server/pos-fee-month.js +36 -0
  429. package/src/lib/server/pos-fee-month.js.map +1 -0
  430. package/src/lib/server/pos-ops-gate.d.ts +161 -0
  431. package/src/lib/server/pos-ops-gate.js +295 -0
  432. package/src/lib/server/pos-ops-gate.js.map +1 -0
  433. package/src/lib/server/pos-ops-routes.d.ts +22 -0
  434. package/src/lib/server/pos-ops-routes.js +36 -0
  435. package/src/lib/server/pos-ops-routes.js.map +1 -0
  436. package/src/lib/server/pos-order.d.ts +1 -18
  437. package/src/lib/server/pos-order.js +222 -42
  438. package/src/lib/server/pos-order.js.map +1 -1
  439. package/src/lib/server/pos-payment.d.ts +39 -0
  440. package/src/lib/server/pos-payment.js +922 -0
  441. package/src/lib/server/pos-payment.js.map +1 -0
  442. package/src/lib/server/pos-print.d.ts +82 -0
  443. package/src/lib/server/pos-print.js +193 -0
  444. package/src/lib/server/pos-print.js.map +1 -0
  445. package/src/lib/server/pos-readers.d.ts +27 -0
  446. package/src/lib/server/pos-readers.js +276 -0
  447. package/src/lib/server/pos-readers.js.map +1 -0
  448. package/src/lib/server/pos-refund-authority.d.ts +60 -0
  449. package/src/lib/server/pos-refund-authority.js +72 -0
  450. package/src/lib/server/pos-refund-authority.js.map +1 -0
  451. package/src/lib/server/pos-return.d.ts +58 -0
  452. package/src/lib/server/pos-return.js +891 -0
  453. package/src/lib/server/pos-return.js.map +1 -0
  454. package/src/lib/server/pos-sale-stamp.d.ts +66 -0
  455. package/src/lib/server/pos-sale-stamp.js +84 -0
  456. package/src/lib/server/pos-sale-stamp.js.map +1 -0
  457. package/src/lib/server/pos-sale.d.ts +170 -0
  458. package/src/lib/server/pos-sale.js +461 -0
  459. package/src/lib/server/pos-sale.js.map +1 -0
  460. package/src/lib/server/pos-shift.d.ts +45 -0
  461. package/src/lib/server/pos-shift.js +484 -0
  462. package/src/lib/server/pos-shift.js.map +1 -0
  463. package/src/lib/server/pos-staff-pin.d.ts +26 -0
  464. package/src/lib/server/pos-staff-pin.js +339 -0
  465. package/src/lib/server/pos-staff-pin.js.map +1 -0
  466. package/src/lib/server/pos-stripe.d.ts +91 -0
  467. package/src/lib/server/pos-stripe.js +129 -0
  468. package/src/lib/server/pos-stripe.js.map +1 -0
  469. package/src/lib/server/pos-terminal-connection-token.d.ts +48 -0
  470. package/src/lib/server/pos-terminal-connection-token.js +166 -0
  471. package/src/lib/server/pos-terminal-connection-token.js.map +1 -0
  472. package/src/lib/server/pos-terminal.d.ts +218 -0
  473. package/src/lib/server/pos-terminal.js +1014 -0
  474. package/src/lib/server/pos-terminal.js.map +1 -0
  475. package/src/lib/server/print-queue.d.ts +124 -0
  476. package/src/lib/server/print-queue.js +301 -0
  477. package/src/lib/server/print-queue.js.map +1 -0
  478. package/src/lib/server/printer-poll.d.ts +75 -0
  479. package/src/lib/server/printer-poll.js +325 -0
  480. package/src/lib/server/printer-poll.js.map +1 -0
  481. package/src/lib/server/printer-secret.d.ts +39 -0
  482. package/src/lib/server/printer-secret.js +56 -0
  483. package/src/lib/server/printer-secret.js.map +1 -0
  484. package/src/lib/server/printers.d.ts +114 -0
  485. package/src/lib/server/printers.js +546 -0
  486. package/src/lib/server/printers.js.map +1 -0
  487. package/src/lib/server/product-ai-capability.d.ts +42 -0
  488. package/src/lib/server/product-ai-capability.js +159 -0
  489. package/src/lib/server/product-ai-capability.js.map +1 -0
  490. package/src/lib/server/product-catalog.d.ts +42 -0
  491. package/src/lib/server/product-catalog.js +305 -0
  492. package/src/lib/server/product-catalog.js.map +1 -0
  493. package/src/lib/server/product-drafts.d.ts +119 -0
  494. package/src/lib/server/product-drafts.js +384 -0
  495. package/src/lib/server/product-drafts.js.map +1 -0
  496. package/src/lib/server/refund.js +110 -45
  497. package/src/lib/server/refund.js.map +1 -1
  498. package/src/lib/server/reserve.js +2 -0
  499. package/src/lib/server/reserve.js.map +1 -1
  500. package/src/lib/server/return-status-action.d.ts +37 -0
  501. package/src/lib/server/return-status-action.js +57 -0
  502. package/src/lib/server/return-status-action.js.map +1 -0
  503. package/src/lib/server/returns.d.ts +119 -0
  504. package/src/lib/server/returns.js +938 -0
  505. package/src/lib/server/returns.js.map +1 -0
  506. package/src/lib/server/shipment-records.d.ts +36 -0
  507. package/src/lib/server/shipment-records.js +289 -0
  508. package/src/lib/server/shipment-records.js.map +1 -0
  509. package/src/lib/server/shipping-connector-gates.d.ts +40 -0
  510. package/src/lib/server/shipping-connector-gates.js +97 -0
  511. package/src/lib/server/shipping-connector-gates.js.map +1 -0
  512. package/src/lib/server/shipping-connectors.d.ts +29 -0
  513. package/src/lib/server/shipping-connectors.js +236 -0
  514. package/src/lib/server/shipping-connectors.js.map +1 -0
  515. package/src/lib/server/shippingeasy.d.ts +238 -0
  516. package/src/lib/server/shippingeasy.js +787 -0
  517. package/src/lib/server/shippingeasy.js.map +1 -0
  518. package/src/lib/server/shipstation.d.ts +129 -0
  519. package/src/lib/server/shipstation.js +483 -0
  520. package/src/lib/server/shipstation.js.map +1 -0
  521. package/src/lib/server/site-page-resolver.d.ts +5 -0
  522. package/src/lib/server/site-page-resolver.js +156 -1
  523. package/src/lib/server/site-page-resolver.js.map +1 -1
  524. package/src/lib/server/stock-levels.d.ts +21 -0
  525. package/src/lib/server/stock-levels.js +263 -0
  526. package/src/lib/server/stock-levels.js.map +1 -0
  527. package/src/lib/server/stripe-refund.d.ts +47 -0
  528. package/src/lib/server/stripe-refund.js +87 -0
  529. package/src/lib/server/stripe-refund.js.map +1 -0
  530. package/src/lib/server/supplier-update.js +46 -5
  531. package/src/lib/server/supplier-update.js.map +1 -1
  532. package/src/lib/server/tax-engine-quote.d.ts +47 -0
  533. package/src/lib/server/tax-engine-quote.js +105 -0
  534. package/src/lib/server/tax-engine-quote.js.map +1 -0
  535. package/src/lib/server.js +146 -2
  536. package/src/lib/server.js.map +1 -1
  537. package/src/lib/site.js +12 -0
  538. package/src/lib/site.js.map +1 -1
  539. package/src/lib/subprocessors.d.ts +26 -0
  540. package/src/lib/subprocessors.js +50 -0
  541. package/src/lib/subprocessors.js.map +1 -0
  542. package/src/lib/tenant-emails.js +461 -3
  543. package/src/lib/tenant-emails.js.map +1 -1
  544. package/src/lib/testing/fake-firestore.d.ts +45 -0
  545. package/src/lib/testing/fake-firestore.js +189 -0
  546. package/src/lib/testing/fake-firestore.js.map +1 -0
  547. package/src/lib/testing/memory-firestore.d.ts +123 -0
  548. package/src/lib/testing/memory-firestore.js +274 -0
  549. package/src/lib/testing/memory-firestore.js.map +1 -0
  550. package/src/lib/testing/pos-ops-harness.d.ts +50 -0
  551. package/src/lib/testing/pos-ops-harness.js +184 -0
  552. package/src/lib/testing/pos-ops-harness.js.map +1 -0
  553. package/src/lib/testing/pos-ops-memory-firestore.d.ts +55 -0
  554. package/src/lib/testing/pos-ops-memory-firestore.js +376 -0
  555. package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -0
  556. package/src/lib/transfer/records-transfer.d.ts +11 -1
  557. package/src/lib/transfer/records-transfer.js +127 -5
  558. package/src/lib/transfer/records-transfer.js.map +1 -1
  559. package/src/lib/transfer/records.server.d.ts +9 -2
  560. package/src/lib/transfer/records.server.js +58 -7
  561. package/src/lib/transfer/records.server.js.map +1 -1
  562. package/src/lib/transfer/register-transfer-resources.js +40 -1
  563. package/src/lib/transfer/register-transfer-resources.js.map +1 -1
  564. package/src/lib/transfer/register-transfer-ui.js +4 -1
  565. package/src/lib/transfer/register-transfer-ui.js.map +1 -1
  566. package/src/lib/transfer/shipping-presets.d.ts +23 -0
  567. package/src/lib/transfer/shipping-presets.js +156 -0
  568. package/src/lib/transfer/shipping-presets.js.map +1 -0
  569. package/src/lib/transfer/tracking-transfer.d.ts +101 -0
  570. package/src/lib/transfer/tracking-transfer.js +546 -0
  571. package/src/lib/transfer/tracking-transfer.js.map +1 -0
  572. package/src/lib/transfer/tracking.server.d.ts +37 -0
  573. package/src/lib/transfer/tracking.server.js +393 -0
  574. package/src/lib/transfer/tracking.server.js.map +1 -0
  575. package/src/lib/transfer/transfer-keys.d.ts +2 -1
  576. package/src/lib/transfer/transfer-keys.js +6 -2
  577. package/src/lib/transfer/transfer-keys.js.map +1 -1
  578. package/src/lib/utils/code128.d.ts +37 -0
  579. package/src/lib/utils/code128.js +199 -0
  580. package/src/lib/utils/code128.js.map +1 -0
  581. package/src/lib/utils/order-invoice.d.ts +55 -0
  582. package/src/lib/utils/order-invoice.js +127 -0
  583. package/src/lib/utils/order-invoice.js.map +1 -0
  584. package/src/lib/utils/use-checkout-return-notice.d.ts +34 -0
  585. package/src/lib/utils/use-checkout-return-notice.js +78 -0
  586. package/src/lib/utils/use-checkout-return-notice.js.map +1 -0
  587. package/src/lib/utils/use-storefront-purchase-event.js +4 -0
  588. package/src/lib/utils/use-storefront-purchase-event.js.map +1 -1
  589. package/src/lib/server/feed.js +0 -69
  590. package/src/lib/server/feed.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/server/returns.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as Aglyn from '@aglyn/aglyn/server'\nimport { createResourceUid } from '@aglyn/aglyn/app-utils/create-resource-uid'\nimport type { PluginApiHandler, PluginApiRequest, PluginApiResponse } from '@aglyn/aglyn/server'\nimport {\n findUserByUidAcrossPools,\n firebaseAdmin,\n getOrgForHost,\n hostSendingIdentity,\n meterHostEmail,\n notifyHostManagers,\n renderHostEmailWithTokens,\n} from '@aglyn/tenant-data-admin'\nimport { isEmailConfigured, sendEmail } from '@aglyn/shared-util-email'\nimport * as CommerceModel from '../model'\nimport {\n RETURN_APPROVED_EVENT,\n RETURN_DECLINED_EVENT,\n RETURN_RECEIVED_EVENT,\n RETURN_REFUNDED_EVENT,\n RETURN_REQUESTED_EVENT,\n} from '../model/order-events'\nimport { raiseOrderEvent, stageOrderEvent } from './order-events'\nimport { orderStatusUrl, verifyOrderStatusToken } from './order-status-token'\nimport { readActiveMemberSession } from './membership'\nimport { resolveTrackedRestockLines } from './restock-flag'\nimport { refundHandler } from './refund'\n\n/**\n * Returns (RMA, AGL-3611): the buyer's door, the merchant's door, and the\n * writes behind both. The rules — what is returnable, the window, the state\n * machine, what a refund is worth — are the model's (`commerce-returns.ts`);\n * this is where they are re-asked under the write.\n *\n * EVERY WRITE IS A TRANSACTION that reads the return, the order and, when it\n * opens one, every return already on the order — so two requests for the last\n * unit cannot both be granted, and a stale console cannot approve a return a\n * colleague declined a moment ago.\n *\n * THE MONEY MOVES THROUGH THE ORDER'S REFUND ROUTE, never here. A return's\n * refund calls `refund.ts` with the merchant's own credentials and a key\n * derived from the return, so its gates (an admin of the whole workspace,\n * the over-refund cap, the open-dispute block, Stripe's idempotency) are the\n * ones every refund passes, and asking twice refunds once.\n *\n * STOCK COMES BACK WHEN THE PARCEL DOES. Receiving a return puts the units\n * the merchant chose back on the shelf, at the location they chose, with an\n * inventory adjustment row — the products hub's history shows it beside the\n * sale. A refund then answers the order's restock question with what the\n * return already did, so nobody is asked to restock the same units twice.\n */\n\ntype Firestore = FirebaseFirestore.Firestore\n\nconst hostRefFor = (firestore: Firestore, hostId: string) => firestore.collection('hosts').doc(hostId)\n\nconst isId = (value: string) => Boolean(value) && value.length <= 200 && !/^__.*__$/.test(value) && !value.includes('/')\n\n/** The store's settings document and what the return emails need from the host. */\nasync function readStore(firestore: Firestore, hostId: string) {\n const hostRef = hostRefFor(firestore, hostId)\n const [host, store] = await Promise.all([\n hostRef.get().catch(() => null),\n hostRef.collection('settings').doc('store').get().catch(() => null),\n ])\n const settings = (store?.data() ?? {}) as Record<string, unknown>\n return {\n host: (host?.data() ?? {}) as Record<string, unknown>,\n returnSettings: CommerceModel.readReturnSettings(settings['returns']),\n currency: String(settings['currency'] ?? 'USD').toUpperCase(),\n }\n}\n\nfunction money(cents: number, currency: string): string {\n try {\n return new Intl.NumberFormat('en-US', { style: 'currency', currency }).format(cents / 100)\n } catch {\n return `$${(cents / 100).toFixed(2)}`\n }\n}\n\n/** The return as an event carries it. */\nfunction returnEventView(id: string, entry: CommerceModel.HostReturn) {\n return {\n id,\n status: entry.status,\n lines: entry.lines.map((line) => ({ ...line })),\n refundCents: entry.refundCents ?? null,\n restock: entry.restock ? entry.restock.lines.map((line) => ({ ...line })) : null,\n }\n}\n\n/** \"1× House Blend — Arrived damaged\", one per line. */\nfunction returnItemsText(order: CommerceModel.HostOrder, entry: Pick<CommerceModel.HostReturn, 'lines'>): string {\n return entry.lines\n .map(\n (line) =>\n `${line.quantity}× ${order.lineItems?.[line.lineItemId]?.name ?? `line ${line.lineItemId}`} — ${\n CommerceModel.RETURN_REASON_LABELS[line.reason] ?? line.reason\n }`,\n )\n .join('\\n')\n}\n\nexport type OpenReturnOutcome =\n | { outcome: 'created'; returnId: string; entry: CommerceModel.HostReturn; order: CommerceModel.HostOrder }\n | { outcome: 'refused'; message: string }\n | { outcome: 'no_such_order' }\n\n/**\n * Opens a return. A buyer's starts `requested`; a merchant's starts\n * `approved`, since the merchant asking is the approval.\n */\nexport async function openReturn(request: {\n hostId: string\n orderId: string\n lines: ReadonlyArray<{ lineItemId: unknown; quantity: unknown; reason: unknown }>\n note?: string\n by: 'buyer' | 'merchant'\n now?: number\n}): Promise<OpenReturnOutcome> {\n const firestore = firebaseAdmin.app().firestore()\n const hostRef = hostRefFor(firestore, request.hostId)\n const orderRef = hostRef.collection('orders').doc(request.orderId)\n const { returnSettings } = await readStore(firestore, request.hostId)\n const now = request.now ?? Date.now()\n const note = String(request.note ?? '').trim().slice(0, CommerceModel.RETURN_NOTE_MAX)\n return firestore.runTransaction(async (transaction): Promise<OpenReturnOutcome> => {\n const orderSnapshot = await transaction.get(orderRef)\n if (!orderSnapshot.exists) return { outcome: 'no_such_order' }\n const existing = await transaction.get(\n hostRef.collection('returns').where('orderId', '==', request.orderId),\n )\n const order = CommerceModel.liftLegacyOrder((orderSnapshot.data() ?? {}) as never)\n const verdict = CommerceModel.validateReturnRequest({\n order,\n existing: existing.docs.map((entry) => entry.data() as CommerceModel.HostReturn),\n settings: returnSettings,\n lines: request.lines,\n by: request.by,\n now,\n })\n if (!('lines' in verdict)) {\n return { outcome: 'refused', message: CommerceModel.describeReturnRequestProblem(verdict) }\n }\n const status: CommerceModel.ReturnStatus = request.by === 'merchant' ? 'approved' : 'requested'\n const entry: CommerceModel.HostReturn = {\n orderId: request.orderId,\n orderNumber: CommerceModel.returnOrderNumber(order, request.orderId),\n customerEmail: order.customerEmail ?? null,\n customerName: order.customerName ?? null,\n lines: verdict.lines.map((line) => ({\n ...line,\n name: String(order.lineItems?.[line.lineItemId]?.name ?? '').slice(0, 200),\n })),\n status,\n requestedBy: request.by,\n ...(note ? (request.by === 'buyer' ? { customerNote: note } : { merchantNote: note }) : {}),\n timeline: [\n {\n atMs: now,\n event: status,\n detail: `${request.by === 'buyer' ? 'Requested by the buyer' : 'Opened by the store'}: ${CommerceModel.describeReturnLines(order, verdict.lines)}`,\n },\n ],\n createdAtMs: now,\n updatedAtMs: now,\n }\n const returnRef = hostRef.collection('returns').doc(createResourceUid())\n transaction.create(returnRef, entry)\n const orderPatch = {\n timeline: CommerceModel.appendOrderEvent(\n order,\n 'return-requested',\n CommerceModel.describeReturnLines(order, verdict.lines),\n now,\n ),\n }\n transaction.update(orderRef, orderPatch)\n stageOrderEvent(transaction, RETURN_REQUESTED_EVENT, {\n hostId: request.hostId,\n orderId: request.orderId,\n key: `return:${returnRef.id}`,\n order: { ...orderSnapshot.data(), ...orderPatch },\n extra: { return: returnEventView(returnRef.id, entry) },\n })\n // The store opening a return is its approval.\n if (status === 'approved') {\n stageOrderEvent(transaction, RETURN_APPROVED_EVENT, {\n hostId: request.hostId,\n orderId: request.orderId,\n key: `return-approved:${returnRef.id}`,\n order: { ...orderSnapshot.data(), ...orderPatch },\n extra: { return: returnEventView(returnRef.id, entry) },\n })\n }\n return { outcome: 'created', returnId: returnRef.id, entry, order }\n })\n}\n\nexport type ReturnAction = 'approve' | 'decline' | 'close' | 'note' | 'attach-label'\n\nexport type ChangeReturnOutcome =\n | { outcome: 'changed'; entry: CommerceModel.HostReturn; order: CommerceModel.HostOrder | null }\n | { outcome: 'already'; entry: CommerceModel.HostReturn }\n | { outcome: 'refused'; message: string }\n | { outcome: 'no_such_return' }\n\nconst ACTION_TARGET: Partial<Record<ReturnAction, CommerceModel.ReturnStatus>> = {\n approve: 'approved',\n decline: 'declined',\n close: 'closed',\n}\n\n/**\n * Approve, decline, close, a note, or a return label — the writes that move\n * no stock and no money. The transition is re-asked under the write.\n */\nexport async function changeReturn(request: {\n hostId: string\n returnId: string\n action: ReturnAction\n merchantNote?: string\n label?: { carrier: string; trackingNumber: string; labelUrl: string; trackingUrl?: string }\n now?: number\n}): Promise<ChangeReturnOutcome> {\n const firestore = firebaseAdmin.app().firestore()\n const hostRef = hostRefFor(firestore, request.hostId)\n const returnRef = hostRef.collection('returns').doc(request.returnId)\n const now = request.now ?? Date.now()\n const note = request.merchantNote === undefined ? undefined : String(request.merchantNote).trim().slice(0, CommerceModel.RETURN_NOTE_MAX)\n return firestore.runTransaction(async (transaction): Promise<ChangeReturnOutcome> => {\n const snapshot = await transaction.get(returnRef)\n if (!snapshot.exists) return { outcome: 'no_such_return' }\n const entry = snapshot.data() as CommerceModel.HostReturn\n const orderSnapshot = await transaction.get(hostRef.collection('orders').doc(entry.orderId))\n const order = orderSnapshot.exists ? CommerceModel.liftLegacyOrder((orderSnapshot.data() ?? {}) as never) : null\n const target = ACTION_TARGET[request.action]\n let patch: Partial<CommerceModel.HostReturn>\n if (target) {\n if (entry.status === target) return { outcome: 'already', entry }\n if (!CommerceModel.canTransitionReturn(entry.status, target)) {\n return {\n outcome: 'refused',\n message: `A return that is ${CommerceModel.RETURN_STATUS_LABELS[entry.status].toLowerCase()} cannot be ${CommerceModel.RETURN_STATUS_LABELS[target].toLowerCase()}`,\n }\n }\n patch = {\n status: target,\n ...(note !== undefined && note ? { merchantNote: note } : {}),\n timeline: CommerceModel.appendReturnEvent(entry, target, note || undefined, now),\n }\n } else if (request.action === 'attach-label') {\n const label = request.label\n if (!label?.labelUrl || !/^https:\\/\\//i.test(label.labelUrl)) {\n return { outcome: 'refused', message: 'A return label needs an https link' }\n }\n if (!CommerceModel.returnIsOpen(entry) || entry.status === 'refunded') {\n return { outcome: 'refused', message: 'This return is finished; a label can no longer be attached' }\n }\n const carrier = String(label.carrier ?? '').trim().slice(0, 40)\n const trackingNumber = String(label.trackingNumber ?? '').trim().slice(0, 60)\n const trackingUrl =\n (label.trackingUrl && /^https:\\/\\//i.test(label.trackingUrl) ? label.trackingUrl : null) ??\n CommerceModel.trackingUrlFor(carrier, trackingNumber)\n patch = {\n returnLabel: {\n carrier,\n trackingNumber,\n labelUrl: String(label.labelUrl).slice(0, 2048),\n ...(trackingUrl ? { trackingUrl } : {}),\n attachedAtMs: now,\n },\n timeline: CommerceModel.appendReturnEvent(entry, 'label', `${carrier} ${trackingNumber}`.trim() || 'Return label attached', now),\n }\n } else {\n patch = {\n merchantNote: note ?? '',\n timeline: CommerceModel.appendReturnEvent(entry, 'note', note || 'Note cleared', now),\n }\n }\n transaction.update(returnRef, { ...patch, updatedAtMs: now })\n const changed = { ...entry, ...patch, updatedAtMs: now }\n const event = target === 'approved' ? RETURN_APPROVED_EVENT : target === 'declined' ? RETURN_DECLINED_EVENT : null\n if (event && orderSnapshot.exists) {\n stageOrderEvent(transaction, event, {\n hostId: request.hostId,\n orderId: entry.orderId,\n key: `return-${target}:${request.returnId}`,\n order: orderSnapshot.data() ?? {},\n extra: { return: returnEventView(request.returnId, changed) },\n })\n }\n return { outcome: 'changed', entry: changed, order }\n })\n}\n\n/**\n * The parcel arrived: the return is `received`, and the units the merchant\n * chose go back on the shelf, at the location they chose. A unit the sale\n * never took off a tracked count (an untracked variant, a deleted product)\n * has nothing to go back to and is left out, as a cancellation leaves it.\n */\nexport async function receiveReturn(request: {\n hostId: string\n returnId: string\n restock: ReadonlyArray<{ lineItemId: unknown; quantity: unknown }>\n locationId?: string\n now?: number\n}): Promise<ChangeReturnOutcome & { units?: number }> {\n const firestore = firebaseAdmin.app().firestore()\n const hostRef = hostRefFor(firestore, request.hostId)\n const returnRef = hostRef.collection('returns').doc(request.returnId)\n const now = request.now ?? Date.now()\n const locationId = String(request.locationId ?? '').trim().slice(0, 100)\n return firestore.runTransaction(async (transaction) => {\n const snapshot = await transaction.get(returnRef)\n if (!snapshot.exists) return { outcome: 'no_such_return' as const }\n const entry = snapshot.data() as CommerceModel.HostReturn\n if (entry.status === 'received' || entry.restock) return { outcome: 'already' as const, entry }\n if (!CommerceModel.canTransitionReturn(entry.status, 'received')) {\n return {\n outcome: 'refused' as const,\n message: `A return that is ${CommerceModel.RETURN_STATUS_LABELS[entry.status].toLowerCase()} cannot be received`,\n }\n }\n // What may go back: at most what the return covers, per line.\n const covered = new Map(entry.lines.map((line) => [line.lineItemId, line.quantity]))\n const wanted = new Map<number, number>()\n for (const line of request.restock) {\n const lineItemId = Number(line?.lineItemId)\n const quantity = Number(line?.quantity)\n if (!covered.has(lineItemId)) {\n return { outcome: 'refused' as const, message: `Line ${lineItemId} is not part of this return` }\n }\n if (!Number.isInteger(quantity) || quantity < 0) {\n return { outcome: 'refused' as const, message: 'Restock quantities must be whole numbers' }\n }\n const total = (wanted.get(lineItemId) ?? 0) + quantity\n if (total > (covered.get(lineItemId) ?? 0)) {\n return { outcome: 'refused' as const, message: `Only ${covered.get(lineItemId)} of line ${lineItemId} came back` }\n }\n if (quantity > 0) wanted.set(lineItemId, total)\n }\n if (locationId && wanted.size > 0) {\n const location = await transaction.get(hostRef.collection('locations').doc(locationId))\n if (!location.exists) return { outcome: 'refused' as const, message: 'That stock location no longer exists' }\n }\n const orderRef = hostRef.collection('orders').doc(entry.orderId)\n const orderSnapshot = await transaction.get(orderRef)\n const order = orderSnapshot.exists ? CommerceModel.liftLegacyOrder((orderSnapshot.data() ?? {}) as never) : null\n // Every read before any write, as a transaction requires.\n const tracked =\n order && wanted.size > 0\n ? await resolveTrackedRestockLines(hostRef, order, (ref) => transaction.get(ref))\n : { lines: [], products: new Map<string, CommerceModel.HostProduct>() }\n const byProduct = new Map<string, Array<{ variantId: string; quantity: number }>>()\n for (const line of tracked.lines) {\n const quantity = Math.min(line.quantity, wanted.get(line.lineIndex ?? -1) ?? 0)\n if (quantity <= 0) continue\n byProduct.set(line.productId, [...(byProduct.get(line.productId) ?? []), { variantId: line.variantId, quantity }])\n }\n let units = 0\n for (const [productId, lines] of byProduct) {\n const product = tracked.products.get(productId)\n if (!product) continue\n let variants = product.variants\n for (const line of lines) {\n variants = CommerceModel.adjustVariantInventory({ variants }, line.variantId, line.quantity, locationId || undefined)\n }\n transaction.update(hostRef.collection('products').doc(productId), {\n variants,\n ...CommerceModel.productStockFields({ ...product, variants }),\n updatedAtMs: now,\n })\n for (const line of lines) {\n units += line.quantity\n transaction.create(hostRef.collection('inventoryAdjustments').doc(createResourceUid()), {\n productId,\n variantId: line.variantId,\n delta: line.quantity,\n reason: 'restock',\n orderId: entry.orderId,\n ...(locationId ? { locationId } : {}),\n atMs: now,\n } satisfies CommerceModel.InventoryAdjustment)\n }\n }\n const restock: CommerceModel.ReturnRestock = {\n lines: [...wanted.entries()].map(([lineItemId, quantity]) => ({ lineItemId, quantity })),\n ...(locationId ? { locationId } : {}),\n atMs: now,\n }\n const patch = {\n status: 'received' as const,\n restock,\n timeline: CommerceModel.appendReturnEvent(\n entry,\n 'received',\n units > 0 ? `${units} ${units === 1 ? 'unit' : 'units'} back in stock` : 'Nothing restocked',\n now,\n ),\n updatedAtMs: now,\n }\n transaction.update(returnRef, patch)\n const received = { ...entry, ...patch }\n if (order) {\n const orderPatch = {\n timeline: CommerceModel.appendOrderEvent(order, 'return-received', units > 0 ? `${units} restocked` : undefined, now),\n }\n transaction.update(orderRef, orderPatch)\n stageOrderEvent(transaction, RETURN_RECEIVED_EVENT, {\n hostId: request.hostId,\n orderId: entry.orderId,\n key: `return-received:${request.returnId}`,\n order: { ...orderSnapshot.data(), ...orderPatch },\n extra: { return: returnEventView(request.returnId, received) },\n })\n }\n return { outcome: 'changed' as const, entry: received, order, units }\n })\n}\n\n/**\n * Records a refund that went through the order's refund route against the\n * return, and answers the order's restock question with what the return\n * already did, so the merchant is not asked to restock the same units again.\n */\nexport async function markReturnRefunded(request: {\n hostId: string\n returnId: string\n refundCents: number\n uid: string\n now?: number\n}): Promise<ChangeReturnOutcome> {\n const firestore = firebaseAdmin.app().firestore()\n const hostRef = hostRefFor(firestore, request.hostId)\n const returnRef = hostRef.collection('returns').doc(request.returnId)\n const now = request.now ?? Date.now()\n return firestore.runTransaction(async (transaction): Promise<ChangeReturnOutcome> => {\n const snapshot = await transaction.get(returnRef)\n if (!snapshot.exists) return { outcome: 'no_such_return' }\n const entry = snapshot.data() as CommerceModel.HostReturn\n if (entry.status === 'refunded' || entry.refundedAtMs) return { outcome: 'already', entry }\n const orderRef = hostRef.collection('orders').doc(entry.orderId)\n const orderSnapshot = await transaction.get(orderRef)\n const order = orderSnapshot.exists ? CommerceModel.liftLegacyOrder((orderSnapshot.data() ?? {}) as never) : null\n const patch = {\n status: 'refunded' as const,\n refundedAtMs: now,\n refundCents: Math.max(0, Math.round(request.refundCents)),\n timeline: CommerceModel.appendReturnEvent(entry, 'refunded', undefined, now),\n updatedAtMs: now,\n }\n transaction.update(returnRef, patch)\n const check = order?.restockCheck\n if (order && check && !check.resolution && entry.restock) {\n const restocked = entry.restock.lines.some((line) => line.quantity > 0)\n transaction.update(orderRef, {\n restockCheck: {\n ...check,\n resolution: restocked ? 'restocked' : 'dismissed',\n resolvedAtMs: now,\n ...(request.uid ? { resolvedBy: request.uid } : {}),\n } satisfies CommerceModel.OrderRestockCheck,\n timeline: CommerceModel.appendOrderEvent(\n order,\n 'restock-check',\n restocked ? 'answered by the return — restocked' : 'answered by the return — no restock',\n now,\n ),\n })\n }\n return { outcome: 'changed', entry: { ...entry, ...patch }, order }\n })\n}\n\n/** Calls the order's own refund route in-process, with the caller's credentials. */\nasync function callRefundRoute(\n req: PluginApiRequest,\n body: Record<string, unknown>,\n idempotencyKey: string,\n): Promise<{ status: number; body: Record<string, any> }> {\n let status = 200\n let payload: Record<string, any> = {}\n const res = {\n status(code: number) {\n status = code\n return res\n },\n json(value: unknown) {\n payload = (value ?? {}) as Record<string, any>\n return res\n },\n send(value: unknown) {\n payload = { error: String(value ?? '') }\n return res\n },\n setHeader() {\n return res\n },\n end() {\n return res\n },\n } as unknown as PluginApiResponse\n await refundHandler(\n {\n ...req,\n method: 'POST',\n headers: { authorization: String(req.headers.authorization ?? ''), 'idempotency-key': idempotencyKey },\n body,\n } as PluginApiRequest,\n res,\n )\n return { status, body: payload }\n}\n\n// ---------------------------------------------------------------------------\n// Emails\n// ---------------------------------------------------------------------------\n\ntype ReturnEmailKey = 'return-requested' | 'return-approved' | 'return-declined' | 'return-refunded'\n\nasync function sendReturnEmail(\n hostId: string,\n key: ReturnEmailKey,\n to: string,\n tokens: Record<string, string>,\n fallback: { subject: string; text: string },\n): Promise<void> {\n if (!to || !isEmailConfigured()) return\n try {\n const firestore = firebaseAdmin.app().firestore()\n const designed = await renderHostEmailWithTokens(firestore, hostId, key, tokens)\n const org = await getOrgForHost(hostId).catch(() => null)\n await sendEmail({\n to,\n subject: designed?.subject ?? fallback.subject,\n text: designed?.text || fallback.text,\n ...(designed?.html ? { html: designed.html } : {}),\n fromName: Aglyn.resolveBrandingProfile(org?.org as never).fromName,\n sendingIdentity: await hostSendingIdentity(hostId),\n audience: 'tenant',\n context: key,\n // Owed to the recipient by their own order (AGL-3356).\n owedFor: 'order',\n })\n await meterHostEmail(hostId)\n } catch (error) {\n // A return that is recorded is not undone because its email failed.\n console.error(`[returns] ${key} not sent`, hostId, error)\n }\n}\n\n/** Tells the store a buyer asked, in the console and by email to the owner. */\nasync function tellStoreOfRequest(hostId: string, returnId: string, entry: CommerceModel.HostReturn, order: CommerceModel.HostOrder) {\n const items = returnItemsText(order, entry)\n await notifyHostManagers(\n hostId,\n {\n type: 'content.order',\n title: `Return requested for order ${entry.orderNumber}`,\n body: `${entry.customerEmail ?? 'A buyer'} wants to return ${CommerceModel.describeReturnLines(order, entry.lines)} from order ${entry.orderNumber} on {site}.`,\n link: `/${hostId}/products/returns?return=${encodeURIComponent(returnId)}`,\n },\n { skipOwnerEmail: true },\n ).catch(() => undefined)\n const ownerUid = (await getOrgForHost(hostId).catch(() => null))?.org?.ownerUid\n const owner = ownerUid ? (await findUserByUidAcrossPools(ownerUid).catch(() => null))?.record : null\n if (!owner?.email) return\n await sendReturnEmail(\n hostId,\n 'return-requested',\n owner.email,\n {\n 'order.number': entry.orderNumber,\n 'return.items': items,\n 'buyer.email': String(entry.customerEmail ?? ''),\n 'return.customerNote': String(entry.customerNote ?? ''),\n },\n {\n subject: `Return requested for order ${entry.orderNumber}`,\n text:\n `${entry.customerEmail ?? 'A buyer'} wants to return items from order ${entry.orderNumber}.\\n\\n${items}` +\n (entry.customerNote ? `\\n\\n\"${entry.customerNote}\"` : '') +\n `\\n\\nApprove or decline it under Products → Returns.`,\n },\n )\n}\n\n/** Tells the buyer what happened to their return. */\nasync function tellBuyer(\n hostId: string,\n key: Exclude<ReturnEmailKey, 'return-requested'>,\n entry: CommerceModel.HostReturn,\n order: CommerceModel.HostOrder | null,\n): Promise<void> {\n const to = String(entry.customerEmail ?? order?.customerEmail ?? '').trim()\n if (!to || !order) return\n const firestore = firebaseAdmin.app().firestore()\n const store = await readStore(firestore, hostId)\n const statusUrl = orderStatusUrl(store.host as never, hostId, entry.orderId) ?? ''\n const items = returnItemsText(order, entry)\n const label = entry.returnLabel\n ? `Print your return label: ${entry.returnLabel.labelUrl}` +\n (entry.returnLabel.trackingNumber ? ` (${[entry.returnLabel.carrier, entry.returnLabel.trackingNumber].filter(Boolean).join(' ')})` : '')\n : ''\n const refundTotal = money(entry.refundCents ?? 0, store.currency)\n const tokens: Record<string, string> = {\n 'order.number': entry.orderNumber,\n 'return.items': items,\n 'return.note': String(entry.merchantNote ?? ''),\n 'return.label': label,\n 'return.refundTotal': refundTotal,\n 'order.statusUrl': statusUrl,\n }\n const fallback =\n key === 'return-approved'\n ? {\n subject: `Your return for order ${entry.orderNumber} is approved`,\n text: `Your return is approved:\\n\\n${items}` + (entry.merchantNote ? `\\n\\n${entry.merchantNote}` : '') + (label ? `\\n\\n${label}` : ''),\n }\n : key === 'return-declined'\n ? {\n subject: `About your return for order ${entry.orderNumber}`,\n text: `We could not accept the return of:\\n\\n${items}` + (entry.merchantNote ? `\\n\\n${entry.merchantNote}` : ''),\n }\n : {\n subject: `Your refund for order ${entry.orderNumber}`,\n text: `We received your return and refunded ${refundTotal}.\\n\\n${items}`,\n }\n if (statusUrl) fallback.text += `\\n\\nView your order: ${statusUrl}`\n await sendReturnEmail(hostId, key, to, tokens, fallback)\n}\n\n// ---------------------------------------------------------------------------\n// The buyer's door (tenant)\n// ---------------------------------------------------------------------------\n\n/**\n * Whether this request may act for the buyer of this order: the signed-in\n * site member whose email the order carries, or the holder of the order's\n * signed status link. Neither reveals whether the order exists to anyone\n * else — both refusals read the same.\n */\nasync function buyerMayActFor(\n req: PluginApiRequest,\n hostId: string,\n orderId: string,\n token: string,\n order: CommerceModel.HostOrder,\n): Promise<boolean> {\n if (token && verifyOrderStatusToken(hostId, orderId, token)) return true\n const session = await readActiveMemberSession(req, hostId)\n if (session.status !== 'active') return false\n const memberEmail = String(session.member.get('email') ?? '').trim().toLowerCase()\n return Boolean(memberEmail) && memberEmail === String(order.customerEmail ?? '').trim().toLowerCase()\n}\n\n/**\n * `GET /api/commerce/return-request?hostId&orderId&t` — what the buyer may\n * send back and until when, and the returns already open.\n * `POST` with `{ hostId, orderId, t?, lines: [{ lineItemId, quantity, reason }], note? }`\n * opens a return.\n */\nexport const returnRequestHandler: PluginApiHandler = async (req, res) => {\n if (req.method !== 'GET' && req.method !== 'POST') {\n return res.status(405).json({ error: 'Method not allowed' })\n }\n const input = (req.method === 'GET' ? req.query : typeof req.body === 'string' ? JSON.parse(req.body) : req.body) ?? {}\n const hostId = String(input.hostId ?? '')\n const orderId = String(input.orderId ?? input.o ?? '')\n const token = String(input.t ?? input.token ?? '').slice(0, 100)\n if (!isId(hostId) || !isId(orderId)) return res.status(400).json({ error: 'Missing hostId or orderId' })\n try {\n const firestore = firebaseAdmin.app().firestore()\n const hostRef = hostRefFor(firestore, hostId)\n const orderSnapshot = await hostRef.collection('orders').doc(orderId).get()\n const order = orderSnapshot.exists ? CommerceModel.liftLegacyOrder((orderSnapshot.data() ?? {}) as never) : null\n if (!order || !(await buyerMayActFor(req, hostId, orderId, token, order))) {\n return res.status(404).json({ error: 'We could not find that order' })\n }\n if (req.method === 'GET') {\n const [{ returnSettings }, existing] = await Promise.all([\n readStore(firestore, hostId),\n hostRef.collection('returns').where('orderId', '==', orderId).get(),\n ])\n const returns = existing.docs.map((entry) => ({ id: entry.id, ...(entry.data() as CommerceModel.HostReturn) }))\n const endsAt = CommerceModel.returnWindowEndsAtMs(order, returnSettings)\n return res.status(200).json({\n enabled: returnSettings.enabled,\n windowEndsAtMs: endsAt,\n windowOpen: endsAt === null || Date.now() <= endsAt,\n lines: CommerceModel.returnableLines(order, returns, returnSettings),\n reasons: CommerceModel.RETURN_REASONS.map((reason) => ({ value: reason, label: CommerceModel.RETURN_REASON_LABELS[reason] })),\n returns: returns.map((entry) => ({\n id: entry.id,\n status: entry.status,\n lines: entry.lines,\n createdAtMs: entry.createdAtMs,\n ...(entry.returnLabel ? { returnLabel: { labelUrl: entry.returnLabel.labelUrl, carrier: entry.returnLabel.carrier, trackingNumber: entry.returnLabel.trackingNumber } } : {}),\n ...(entry.status === 'declined' && entry.merchantNote ? { merchantNote: entry.merchantNote } : {}),\n })),\n })\n }\n const outcome = await openReturn({\n hostId,\n orderId,\n lines: Array.isArray(input.lines) ? (input.lines as unknown[]).slice(0, 100) as never : [],\n note: String(input.note ?? ''),\n by: 'buyer',\n })\n if (outcome.outcome === 'no_such_order') return res.status(404).json({ error: 'We could not find that order' })\n if (outcome.outcome === 'refused') return res.status(409).json({ error: outcome.message })\n await tellStoreOfRequest(hostId, outcome.returnId, outcome.entry, outcome.order)\n return res.status(200).json({ ok: true, returnId: outcome.returnId, status: outcome.entry.status })\n } catch (error) {\n console.error('return request failed', error)\n return res.status(500).json({ error: 'Your return could not be requested. Please try again.' })\n }\n}\n\n// ---------------------------------------------------------------------------\n// The merchant's door (console)\n// ---------------------------------------------------------------------------\n\nconst MERCHANT_ACTIONS = ['create', 'approve', 'decline', 'close', 'note', 'attach-label', 'receive', 'refund'] as const\ntype MerchantAction = (typeof MERCHANT_ACTIONS)[number]\n\n/**\n * `POST /api/commerce/returns` with `{ hostId, action, … }`. Admins and\n * editors run the return; the refund goes through the order's refund route,\n * which asks for an admin of the whole workspace on its own.\n */\nexport const returnsHandler: PluginApiHandler = async (req, res) => {\n if (req.method !== 'POST') return res.status(405).json({ error: 'Method not allowed' })\n const authorization = String(req.headers.authorization ?? '')\n const idToken = authorization.startsWith('Bearer ') ? authorization.slice('Bearer '.length) : undefined\n if (!idToken) return res.status(401).json({ error: 'Unauthenticated' })\n const body = (typeof req.body === 'string' ? JSON.parse(req.body) : req.body) ?? {}\n const hostId = String(body.hostId ?? '')\n const action = String(body.action ?? '') as MerchantAction\n const returnId = String(body.returnId ?? '')\n if (!isId(hostId)) return res.status(400).json({ error: 'Missing hostId' })\n if (!MERCHANT_ACTIONS.includes(action)) return res.status(400).json({ error: 'Unknown action' })\n if (action !== 'create' && !isId(returnId)) return res.status(400).json({ error: 'Missing returnId' })\n try {\n const decoded = await firebaseAdmin.app().auth().verifyIdToken(idToken)\n const firestore = firebaseAdmin.app().firestore()\n const hostSnapshot = await hostRefFor(firestore, hostId).get()\n if (!hostSnapshot.exists) return res.status(404).json({ error: 'Unknown site' })\n const role = (hostSnapshot.get('memberRoles') ?? {})[decoded.uid]\n if (role !== 'admin' && role !== 'editor') return res.status(403).json({ error: 'Not permitted' })\n\n if (action === 'create') {\n const orderId = String(body.orderId ?? '')\n if (!isId(orderId)) return res.status(400).json({ error: 'Missing orderId' })\n const outcome = await openReturn({\n hostId,\n orderId,\n lines: Array.isArray(body.lines) ? (body.lines as unknown[]).slice(0, 100) as never : [],\n note: String(body.note ?? ''),\n by: 'merchant',\n })\n if (outcome.outcome === 'no_such_order') return res.status(404).json({ error: 'Unknown order' })\n if (outcome.outcome === 'refused') return res.status(409).json({ error: outcome.message })\n if (body.notify !== false) await tellBuyer(hostId, 'return-approved', outcome.entry, outcome.order)\n return res.status(200).json({ ok: true, returnId: outcome.returnId, status: outcome.entry.status })\n }\n\n if (action === 'receive') {\n const outcome = await receiveReturn({\n hostId,\n returnId,\n restock: Array.isArray(body.restock) ? (body.restock as unknown[]).slice(0, 100) as never : [],\n locationId: body.locationId ? String(body.locationId) : undefined,\n })\n if (outcome.outcome === 'no_such_return') return res.status(404).json({ error: 'Unknown return' })\n if (outcome.outcome === 'refused') return res.status(409).json({ error: outcome.message })\n return res.status(200).json({\n ok: true,\n ...(outcome.outcome === 'already' ? { already: true } : { units: outcome.units ?? 0 }),\n status: outcome.entry.status,\n })\n }\n\n if (action === 'refund') {\n const returnSnapshot = await hostRefFor(firestore, hostId).collection('returns').doc(returnId).get()\n if (!returnSnapshot.exists) return res.status(404).json({ error: 'Unknown return' })\n const entry = returnSnapshot.data() as CommerceModel.HostReturn\n if (entry.status === 'refunded' || entry.refundedAtMs) {\n return res.status(200).json({ ok: true, already: true, status: entry.status })\n }\n if (!CommerceModel.canTransitionReturn(entry.status, 'refunded')) {\n return res.status(409).json({ error: `A return that is ${CommerceModel.RETURN_STATUS_LABELS[entry.status].toLowerCase()} cannot be refunded` })\n }\n const orderSnapshot = await hostRefFor(firestore, hostId).collection('orders').doc(entry.orderId).get()\n if (!orderSnapshot.exists) return res.status(404).json({ error: 'The order for this return is gone' })\n const order = CommerceModel.liftLegacyOrder((orderSnapshot.data() ?? {}) as never)\n const suggested = CommerceModel.returnRefundCents(order, entry.lines)\n const amountCents = body.amountCents == null ? suggested : Math.round(Number(body.amountCents))\n if (!Number.isFinite(amountCents) || amountCents <= 0) {\n return res.status(400).json({ error: 'The refund amount must be above zero' })\n }\n const wholeLines = CommerceModel.returnWholeLineIds(order, entry.lines).filter(\n (index) => !CommerceModel.orderLineRefunded(order, index),\n )\n const namedWorth = CommerceModel.orderLineRefundCents(order, wholeLines)\n // Lines are named only when the amount covers them in full, which is\n // what the refund route requires before it withdraws a line's\n // entitlements; a smaller amount refunds by amount alone.\n const refund = await callRefundRoute(\n req,\n {\n hostId,\n orderId: entry.orderId,\n amountCents,\n ...(wholeLines.length > 0 && amountCents >= namedWorth ? { lineItemIds: wholeLines } : {}),\n },\n // One refund per return: asking again replays rather than pays twice.\n `return:${hostId}:${returnId}`,\n )\n if (refund.status !== 200) {\n return res.status(refund.status).json({ error: refund.body?.error ?? 'Refund failed' })\n }\n const marked = await markReturnRefunded({ hostId, returnId, refundCents: amountCents, uid: decoded.uid })\n if (marked.outcome === 'changed') {\n await raiseOrderEvent(RETURN_REFUNDED_EVENT, {\n hostId,\n orderId: entry.orderId,\n key: `return-refunded:${returnId}`,\n extra: { return: returnEventView(returnId, marked.entry) },\n })\n await tellBuyer(hostId, 'return-refunded', marked.entry, marked.order)\n }\n return res.status(200).json({ ok: true, refundCents: amountCents, status: 'refunded' })\n }\n\n const outcome = await changeReturn({\n hostId,\n returnId,\n action: action as ReturnAction,\n ...(body.merchantNote !== undefined ? { merchantNote: String(body.merchantNote) } : {}),\n ...(action === 'attach-label' ? { label: body.label } : {}),\n })\n if (outcome.outcome === 'no_such_return') return res.status(404).json({ error: 'Unknown return' })\n if (outcome.outcome === 'refused') return res.status(409).json({ error: outcome.message })\n if (outcome.outcome === 'changed' && body.notify !== false) {\n if (action === 'approve') await tellBuyer(hostId, 'return-approved', outcome.entry, outcome.order)\n if (action === 'decline') await tellBuyer(hostId, 'return-declined', outcome.entry, outcome.order)\n // A label attached after the approval reaches the buyer the same way,\n // in the approval email, which carries it.\n if (action === 'attach-label' && outcome.entry.status === 'approved') {\n await tellBuyer(hostId, 'return-approved', outcome.entry, outcome.order)\n }\n }\n return res.status(200).json({\n ok: true,\n ...(outcome.outcome === 'already' ? { already: true } : {}),\n status: outcome.entry.status,\n })\n } catch (error) {\n console.error('returns action failed', action, error)\n // Every write here is a transaction or keyed (the refund), so asking\n // again lands once.\n return res.status(500).json({ error: 'The return could not be updated. Retrying is safe.' })\n }\n}\n"],"names":["Aglyn","createResourceUid","findUserByUidAcrossPools","firebaseAdmin","getOrgForHost","hostSendingIdentity","meterHostEmail","notifyHostManagers","renderHostEmailWithTokens","isEmailConfigured","sendEmail","CommerceModel","RETURN_APPROVED_EVENT","RETURN_DECLINED_EVENT","RETURN_RECEIVED_EVENT","RETURN_REFUNDED_EVENT","RETURN_REQUESTED_EVENT","raiseOrderEvent","stageOrderEvent","orderStatusUrl","verifyOrderStatusToken","readActiveMemberSession","resolveTrackedRestockLines","refundHandler","hostRefFor","firestore","hostId","collection","doc","isId","value","Boolean","length","test","includes","readStore","settings","hostRef","host","store","Promise","all","get","catch","data","returnSettings","readReturnSettings","currency","String","toUpperCase","money","cents","Intl","NumberFormat","style","format","toFixed","returnEventView","id","entry","status","lines","map","line","refundCents","restock","returnItemsText","order","quantity","lineItems","lineItemId","name","RETURN_REASON_LABELS","reason","join","openReturn","request","app","orderRef","orderId","now","Date","note","trim","slice","RETURN_NOTE_MAX","runTransaction","transaction","orderSnapshot","exists","outcome","existing","where","liftLegacyOrder","verdict","validateReturnRequest","docs","by","message","describeReturnRequestProblem","orderNumber","returnOrderNumber","customerEmail","customerName","requestedBy","customerNote","merchantNote","timeline","atMs","event","detail","describeReturnLines","createdAtMs","updatedAtMs","returnRef","create","orderPatch","appendOrderEvent","update","key","extra","return","returnId","ACTION_TARGET","approve","decline","close","changeReturn","undefined","snapshot","target","action","patch","canTransitionReturn","RETURN_STATUS_LABELS","toLowerCase","appendReturnEvent","label","labelUrl","returnIsOpen","carrier","trackingNumber","trackingUrl","trackingUrlFor","returnLabel","attachedAtMs","changed","receiveReturn","locationId","covered","Map","wanted","Number","has","isInteger","total","set","size","location","tracked","ref","products","byProduct","Math","min","lineIndex","productId","variantId","units","product","variants","adjustVariantInventory","productStockFields","delta","entries","received","markReturnRefunded","refundedAtMs","max","round","check","restockCheck","resolution","restocked","some","resolvedAtMs","uid","resolvedBy","callRefundRoute","req","body","idempotencyKey","payload","res","code","json","send","error","setHeader","end","method","headers","authorization","sendReturnEmail","to","tokens","fallback","designed","org","subject","text","html","fromName","resolveBrandingProfile","sendingIdentity","audience","context","owedFor","console","tellStoreOfRequest","items","type","title","link","encodeURIComponent","skipOwnerEmail","ownerUid","owner","record","email","tellBuyer","statusUrl","filter","refundTotal","buyerMayActFor","token","session","memberEmail","member","returnRequestHandler","input","query","JSON","parse","o","t","returns","endsAt","returnWindowEndsAtMs","enabled","windowEndsAtMs","windowOpen","returnableLines","reasons","RETURN_REASONS","Array","isArray","ok","MERCHANT_ACTIONS","returnsHandler","idToken","startsWith","hostSnapshot","decoded","auth","verifyIdToken","role","notify","already","returnSnapshot","suggested","returnRefundCents","amountCents","isFinite","wholeLines","returnWholeLineIds","index","orderLineRefunded","namedWorth","orderLineRefundCents","refund","lineItemIds","marked"],"mappings":";AAAA;;;;;;;;;;;;;;;CAeC,GAED,YAAYA,WAAW,sBAAqB;AAC5C,SAASC,iBAAiB,QAAQ,6CAA4C;AAE9E,SACEC,wBAAwB,EACxBC,aAAa,EACbC,aAAa,EACbC,mBAAmB,EACnBC,cAAc,EACdC,kBAAkB,EAClBC,yBAAyB,QACpB,2BAA0B;AACjC,SAASC,iBAAiB,EAAEC,SAAS,QAAQ,2BAA0B;AACvE,YAAYC,mBAAmB,oBAAU;AACzC,SACEC,qBAAqB,EACrBC,qBAAqB,EACrBC,qBAAqB,EACrBC,qBAAqB,EACrBC,sBAAsB,QACjB,2BAAuB;AAC9B,SAASC,eAAe,EAAEC,eAAe,QAAQ,oBAAgB;AACjE,SAASC,cAAc,EAAEC,sBAAsB,QAAQ,0BAAsB;AAC7E,SAASC,uBAAuB,QAAQ,kBAAc;AACtD,SAASC,0BAA0B,QAAQ,oBAAgB;AAC3D,SAASC,aAAa,QAAQ,cAAU;AA4BxC,MAAMC,aAAa,CAACC,WAAsBC,SAAmBD,UAAUE,UAAU,CAAC,SAASC,GAAG,CAACF;AAE/F,MAAMG,OAAO,CAACC,QAAkBC,QAAQD,UAAUA,MAAME,MAAM,IAAI,OAAO,CAAC,WAAWC,IAAI,CAACH,UAAU,CAACA,MAAMI,QAAQ,CAAC;AAEpH,iFAAiF,GACjF,eAAeC,UAAUV,SAAoB,EAAEC,MAAc;qBAUxCU;IATnB,MAAMC,UAAUb,WAAWC,WAAWC;IACtC,MAAM,CAACY,MAAMC,MAAM,GAAG,MAAMC,QAAQC,GAAG,CAAC;QACtCJ,QAAQK,GAAG,GAAGC,KAAK,CAAC,IAAM;QAC1BN,QAAQV,UAAU,CAAC,YAAYC,GAAG,CAAC,SAASc,GAAG,GAAGC,KAAK,CAAC,IAAM;KAC/D;IACD,MAAMP,mBAAYG,yBAAAA,MAAOK,IAAI,qBAAM,CAAC;IACpC,OAAO;QACLN,IAAI,WAAGA,wBAAAA,KAAMM,IAAI,sBAAM,CAAC;QACxBC,gBAAgBlC,cAAcmC,kBAAkB,CAACV,QAAQ,CAAC,UAAU;QACpEW,UAAUC,QAAOZ,qBAAAA,QAAQ,CAAC,WAAW,YAApBA,qBAAwB,OAAOa,WAAW;IAC7D;AACF;AAEA,SAASC,MAAMC,KAAa,EAAEJ,QAAgB;IAC5C,IAAI;QACF,OAAO,IAAIK,KAAKC,YAAY,CAAC,SAAS;YAAEC,OAAO;YAAYP;QAAS,GAAGQ,MAAM,CAACJ,QAAQ;IACxF,EAAE,eAAM;QACN,OAAO,CAAC,CAAC,EAAE,AAACA,CAAAA,QAAQ,GAAE,EAAGK,OAAO,CAAC,IAAI;IACvC;AACF;AAEA,uCAAuC,GACvC,SAASC,gBAAgBC,EAAU,EAAEC,KAA+B;QAKnDA;IAJf,OAAO;QACLD;QACAE,QAAQD,MAAMC,MAAM;QACpBC,OAAOF,MAAME,KAAK,CAACC,GAAG,CAAC,CAACC,OAAU,aAAKA;QACvCC,WAAW,GAAEL,qBAAAA,MAAMK,WAAW,YAAjBL,qBAAqB;QAClCM,SAASN,MAAMM,OAAO,GAAGN,MAAMM,OAAO,CAACJ,KAAK,CAACC,GAAG,CAAC,CAACC,OAAU,aAAKA,SAAW;IAC9E;AACF;AAEA,sDAAsD,GACtD,SAASG,gBAAgBC,KAA8B,EAAER,KAA8C;IACrG,OAAOA,MAAME,KAAK,CACfC,GAAG,CACF,CAACC;kBAEGpD;YADmBwD,kCAAAA;eAArB,GAAGJ,KAAKK,QAAQ,CAAC,EAAE,WAAED,mBAAAA,MAAME,SAAS,sBAAfF,mCAAAA,gBAAiB,CAACJ,KAAKO,UAAU,CAAC,qBAAlCH,iCAAoCI,IAAI,mBAAI,CAAC,KAAK,EAAER,KAAKO,UAAU,EAAE,CAAC,GAAG,GAC5F3D,kDAAAA,cAAc6D,oBAAoB,CAACT,KAAKU,MAAM,CAAC,YAA/C9D,kDAAmDoD,KAAKU,MAAM,EAC9D;OAELC,IAAI,CAAC;AACV;AAOA;;;CAGC,GACD,OAAO,eAAeC,WAAWC,OAOhC;QAKaA,cACQA;IALpB,MAAMnD,YAAYtB,cAAc0E,GAAG,GAAGpD,SAAS;IAC/C,MAAMY,UAAUb,WAAWC,WAAWmD,QAAQlD,MAAM;IACpD,MAAMoD,WAAWzC,QAAQV,UAAU,CAAC,UAAUC,GAAG,CAACgD,QAAQG,OAAO;IACjE,MAAM,EAAElC,cAAc,EAAE,GAAG,MAAMV,UAAUV,WAAWmD,QAAQlD,MAAM;IACpE,MAAMsD,OAAMJ,eAAAA,QAAQI,GAAG,YAAXJ,eAAeK,KAAKD,GAAG;IACnC,MAAME,OAAOlC,QAAO4B,gBAAAA,QAAQM,IAAI,YAAZN,gBAAgB,IAAIO,IAAI,GAAGC,KAAK,CAAC,GAAGzE,cAAc0E,eAAe;IACrF,OAAO5D,UAAU6D,cAAc,CAAC,OAAOC;YAMQC,qBAgB5BrB,sBACDA;QAtBhB,MAAMqB,gBAAgB,MAAMD,YAAY7C,GAAG,CAACoC;QAC5C,IAAI,CAACU,cAAcC,MAAM,EAAE,OAAO;YAAEC,SAAS;QAAgB;QAC7D,MAAMC,WAAW,MAAMJ,YAAY7C,GAAG,CACpCL,QAAQV,UAAU,CAAC,WAAWiE,KAAK,CAAC,WAAW,MAAMhB,QAAQG,OAAO;QAEtE,MAAMZ,QAAQxD,cAAckF,eAAe,EAAEL,sBAAAA,cAAc5C,IAAI,cAAlB4C,sBAAwB,CAAC;QACtE,MAAMM,UAAUnF,cAAcoF,qBAAqB,CAAC;YAClD5B;YACAwB,UAAUA,SAASK,IAAI,CAAClC,GAAG,CAAC,CAACH,QAAUA,MAAMf,IAAI;YACjDR,UAAUS;YACVgB,OAAOe,QAAQf,KAAK;YACpBoC,IAAIrB,QAAQqB,EAAE;YACdjB;QACF;QACA,IAAI,CAAE,CAAA,WAAWc,OAAM,GAAI;YACzB,OAAO;gBAAEJ,SAAS;gBAAWQ,SAASvF,cAAcwF,4BAA4B,CAACL;YAAS;QAC5F;QACA,MAAMlC,SAAqCgB,QAAQqB,EAAE,KAAK,aAAa,aAAa;QACpF,MAAMtC,QAAkC;YACtCoB,SAASH,QAAQG,OAAO;YACxBqB,aAAazF,cAAc0F,iBAAiB,CAAClC,OAAOS,QAAQG,OAAO;YACnEuB,aAAa,GAAEnC,uBAAAA,MAAMmC,aAAa,YAAnBnC,uBAAuB;YACtCoC,YAAY,GAAEpC,sBAAAA,MAAMoC,YAAY,YAAlBpC,sBAAsB;YACpCN,OAAOiC,QAAQjC,KAAK,CAACC,GAAG,CAAC,CAACC;;oBAEXI,kCAAAA;uBAFqB,aAC/BJ;oBACHQ,MAAMvB,gBAAOmB,mBAAAA,MAAME,SAAS,sBAAfF,mCAAAA,gBAAiB,CAACJ,KAAKO,UAAU,CAAC,qBAAlCH,iCAAoCI,IAAI,mBAAI,IAAIa,KAAK,CAAC,GAAG;;;YAExExB;YACA4C,aAAa5B,QAAQqB,EAAE;WACnBf,OAAQN,QAAQqB,EAAE,KAAK,UAAU;YAAEQ,cAAcvB;QAAK,IAAI;YAAEwB,cAAcxB;QAAK,IAAK,CAAC;YACzFyB,UAAU;gBACR;oBACEC,MAAM5B;oBACN6B,OAAOjD;oBACPkD,QAAQ,GAAGlC,QAAQqB,EAAE,KAAK,UAAU,2BAA2B,sBAAsB,EAAE,EAAEtF,cAAcoG,mBAAmB,CAAC5C,OAAO2B,QAAQjC,KAAK,GAAG;gBACpJ;aACD;YACDmD,aAAahC;YACbiC,aAAajC;;QAEf,MAAMkC,YAAY7E,QAAQV,UAAU,CAAC,WAAWC,GAAG,CAAC3B;QACpDsF,YAAY4B,MAAM,CAACD,WAAWvD;QAC9B,MAAMyD,aAAa;YACjBT,UAAUhG,cAAc0G,gBAAgB,CACtClD,OACA,oBACAxD,cAAcoG,mBAAmB,CAAC5C,OAAO2B,QAAQjC,KAAK,GACtDmB;QAEJ;QACAO,YAAY+B,MAAM,CAACxC,UAAUsC;QAC7BlG,gBAAgBqE,aAAavE,wBAAwB;YACnDU,QAAQkD,QAAQlD,MAAM;YACtBqD,SAASH,QAAQG,OAAO;YACxBwC,KAAK,CAAC,OAAO,EAAEL,UAAUxD,EAAE,EAAE;YAC7BS,OAAO,aAAKqB,cAAc5C,IAAI,IAAOwE;YACrCI,OAAO;gBAAEC,QAAQhE,gBAAgByD,UAAUxD,EAAE,EAAEC;YAAO;QACxD;QACA,8CAA8C;QAC9C,IAAIC,WAAW,YAAY;YACzB1C,gBAAgBqE,aAAa3E,uBAAuB;gBAClDc,QAAQkD,QAAQlD,MAAM;gBACtBqD,SAASH,QAAQG,OAAO;gBACxBwC,KAAK,CAAC,gBAAgB,EAAEL,UAAUxD,EAAE,EAAE;gBACtCS,OAAO,aAAKqB,cAAc5C,IAAI,IAAOwE;gBACrCI,OAAO;oBAAEC,QAAQhE,gBAAgByD,UAAUxD,EAAE,EAAEC;gBAAO;YACxD;QACF;QACA,OAAO;YAAE+B,SAAS;YAAWgC,UAAUR,UAAUxD,EAAE;YAAEC;YAAOQ;QAAM;IACpE;AACF;AAUA,MAAMwD,gBAA2E;IAC/EC,SAAS;IACTC,SAAS;IACTC,OAAO;AACT;AAEA;;;CAGC,GACD,OAAO,eAAeC,aAAanD,OAOlC;QAIaA;IAHZ,MAAMnD,YAAYtB,cAAc0E,GAAG,GAAGpD,SAAS;IAC/C,MAAMY,UAAUb,WAAWC,WAAWmD,QAAQlD,MAAM;IACpD,MAAMwF,YAAY7E,QAAQV,UAAU,CAAC,WAAWC,GAAG,CAACgD,QAAQ8C,QAAQ;IACpE,MAAM1C,OAAMJ,eAAAA,QAAQI,GAAG,YAAXJ,eAAeK,KAAKD,GAAG;IACnC,MAAME,OAAON,QAAQ8B,YAAY,KAAKsB,YAAYA,YAAYhF,OAAO4B,QAAQ8B,YAAY,EAAEvB,IAAI,GAAGC,KAAK,CAAC,GAAGzE,cAAc0E,eAAe;IACxI,OAAO5D,UAAU6D,cAAc,CAAC,OAAOC;YAK+BC;QAJpE,MAAMyC,WAAW,MAAM1C,YAAY7C,GAAG,CAACwE;QACvC,IAAI,CAACe,SAASxC,MAAM,EAAE,OAAO;YAAEC,SAAS;QAAiB;QACzD,MAAM/B,QAAQsE,SAASrF,IAAI;QAC3B,MAAM4C,gBAAgB,MAAMD,YAAY7C,GAAG,CAACL,QAAQV,UAAU,CAAC,UAAUC,GAAG,CAAC+B,MAAMoB,OAAO;QAC1F,MAAMZ,QAAQqB,cAAcC,MAAM,GAAG9E,cAAckF,eAAe,EAAEL,sBAAAA,cAAc5C,IAAI,cAAlB4C,sBAAwB,CAAC,KAAe;QAC5G,MAAM0C,SAASP,aAAa,CAAC/C,QAAQuD,MAAM,CAAC;QAC5C,IAAIC;QACJ,IAAIF,QAAQ;YACV,IAAIvE,MAAMC,MAAM,KAAKsE,QAAQ,OAAO;gBAAExC,SAAS;gBAAW/B;YAAM;YAChE,IAAI,CAAChD,cAAc0H,mBAAmB,CAAC1E,MAAMC,MAAM,EAAEsE,SAAS;gBAC5D,OAAO;oBACLxC,SAAS;oBACTQ,SAAS,CAAC,iBAAiB,EAAEvF,cAAc2H,oBAAoB,CAAC3E,MAAMC,MAAM,CAAC,CAAC2E,WAAW,GAAG,WAAW,EAAE5H,cAAc2H,oBAAoB,CAACJ,OAAO,CAACK,WAAW,IAAI;gBACrK;YACF;YACAH,QAAQ;gBACNxE,QAAQsE;eACJhD,SAAS8C,aAAa9C,OAAO;gBAAEwB,cAAcxB;YAAK,IAAI,CAAC;gBAC3DyB,UAAUhG,cAAc6H,iBAAiB,CAAC7E,OAAOuE,QAAQhD,QAAQ8C,WAAWhD;;QAEhF,OAAO,IAAIJ,QAAQuD,MAAM,KAAK,gBAAgB;gBAQrBM,gBACOA,uBAE3BA;YAVH,MAAMA,QAAQ7D,QAAQ6D,KAAK;YAC3B,IAAI,EAACA,yBAAAA,MAAOC,QAAQ,KAAI,CAAC,eAAezG,IAAI,CAACwG,MAAMC,QAAQ,GAAG;gBAC5D,OAAO;oBAAEhD,SAAS;oBAAWQ,SAAS;gBAAqC;YAC7E;YACA,IAAI,CAACvF,cAAcgI,YAAY,CAAChF,UAAUA,MAAMC,MAAM,KAAK,YAAY;gBACrE,OAAO;oBAAE8B,SAAS;oBAAWQ,SAAS;gBAA6D;YACrG;YACA,MAAM0C,UAAU5F,QAAOyF,iBAAAA,MAAMG,OAAO,YAAbH,iBAAiB,IAAItD,IAAI,GAAGC,KAAK,CAAC,GAAG;YAC5D,MAAMyD,iBAAiB7F,QAAOyF,wBAAAA,MAAMI,cAAc,YAApBJ,wBAAwB,IAAItD,IAAI,GAAGC,KAAK,CAAC,GAAG;YAC1E,MAAM0D,eACHL,OAAAA,MAAMK,WAAW,IAAI,eAAe7G,IAAI,CAACwG,MAAMK,WAAW,IAAIL,MAAMK,WAAW,GAAG,gBAAlFL,OACD9H,cAAcoI,cAAc,CAACH,SAASC;YACxCT,QAAQ;gBACNY,aAAa;oBACXJ;oBACAC;oBACAH,UAAU1F,OAAOyF,MAAMC,QAAQ,EAAEtD,KAAK,CAAC,GAAG;mBACtC0D,cAAc;oBAAEA;gBAAY,IAAI,CAAC;oBACrCG,cAAcjE;;gBAEhB2B,UAAUhG,cAAc6H,iBAAiB,CAAC7E,OAAO,SAAS,GAAGiF,QAAQ,CAAC,EAAEC,gBAAgB,CAAC1D,IAAI,MAAM,yBAAyBH;YAC9H;QACF,OAAO;YACLoD,QAAQ;gBACN1B,YAAY,EAAExB,eAAAA,OAAQ;gBACtByB,UAAUhG,cAAc6H,iBAAiB,CAAC7E,OAAO,QAAQuB,QAAQ,gBAAgBF;YACnF;QACF;QACAO,YAAY+B,MAAM,CAACJ,WAAW,aAAKkB;YAAOnB,aAAajC;;QACvD,MAAMkE,UAAU,aAAKvF,OAAUyE;YAAOnB,aAAajC;;QACnD,MAAM6B,QAAQqB,WAAW,aAAatH,wBAAwBsH,WAAW,aAAarH,wBAAwB;QAC9G,IAAIgG,SAASrB,cAAcC,MAAM,EAAE;gBAKxBD;YAJTtE,gBAAgBqE,aAAasB,OAAO;gBAClCnF,QAAQkD,QAAQlD,MAAM;gBACtBqD,SAASpB,MAAMoB,OAAO;gBACtBwC,KAAK,CAAC,OAAO,EAAEW,OAAO,CAAC,EAAEtD,QAAQ8C,QAAQ,EAAE;gBAC3CvD,KAAK,GAAEqB,uBAAAA,cAAc5C,IAAI,cAAlB4C,uBAAwB,CAAC;gBAChCgC,OAAO;oBAAEC,QAAQhE,gBAAgBmB,QAAQ8C,QAAQ,EAAEwB;gBAAS;YAC9D;QACF;QACA,OAAO;YAAExD,SAAS;YAAW/B,OAAOuF;YAAS/E;QAAM;IACrD;AACF;AAEA;;;;;CAKC,GACD,OAAO,eAAegF,cAAcvE,OAMnC;QAIaA,cACcA;IAJ1B,MAAMnD,YAAYtB,cAAc0E,GAAG,GAAGpD,SAAS;IAC/C,MAAMY,UAAUb,WAAWC,WAAWmD,QAAQlD,MAAM;IACpD,MAAMwF,YAAY7E,QAAQV,UAAU,CAAC,WAAWC,GAAG,CAACgD,QAAQ8C,QAAQ;IACpE,MAAM1C,OAAMJ,eAAAA,QAAQI,GAAG,YAAXJ,eAAeK,KAAKD,GAAG;IACnC,MAAMoE,aAAapG,QAAO4B,sBAAAA,QAAQwE,UAAU,YAAlBxE,sBAAsB,IAAIO,IAAI,GAAGC,KAAK,CAAC,GAAG;IACpE,OAAO3D,UAAU6D,cAAc,CAAC,OAAOC;YAmC+BC;QAlCpE,MAAMyC,WAAW,MAAM1C,YAAY7C,GAAG,CAACwE;QACvC,IAAI,CAACe,SAASxC,MAAM,EAAE,OAAO;YAAEC,SAAS;QAA0B;QAClE,MAAM/B,QAAQsE,SAASrF,IAAI;QAC3B,IAAIe,MAAMC,MAAM,KAAK,cAAcD,MAAMM,OAAO,EAAE,OAAO;YAAEyB,SAAS;YAAoB/B;QAAM;QAC9F,IAAI,CAAChD,cAAc0H,mBAAmB,CAAC1E,MAAMC,MAAM,EAAE,aAAa;YAChE,OAAO;gBACL8B,SAAS;gBACTQ,SAAS,CAAC,iBAAiB,EAAEvF,cAAc2H,oBAAoB,CAAC3E,MAAMC,MAAM,CAAC,CAAC2E,WAAW,GAAG,mBAAmB,CAAC;YAClH;QACF;QACA,8DAA8D;QAC9D,MAAMc,UAAU,IAAIC,IAAI3F,MAAME,KAAK,CAACC,GAAG,CAAC,CAACC,OAAS;gBAACA,KAAKO,UAAU;gBAAEP,KAAKK,QAAQ;aAAC;QAClF,MAAMmF,SAAS,IAAID;QACnB,KAAK,MAAMvF,QAAQa,QAAQX,OAAO,CAAE;gBASnBsF,aACFF;YATb,MAAM/E,aAAakF,OAAOzF,wBAAAA,KAAMO,UAAU;YAC1C,MAAMF,WAAWoF,OAAOzF,wBAAAA,KAAMK,QAAQ;YACtC,IAAI,CAACiF,QAAQI,GAAG,CAACnF,aAAa;gBAC5B,OAAO;oBAAEoB,SAAS;oBAAoBQ,SAAS,CAAC,KAAK,EAAE5B,WAAW,2BAA2B,CAAC;gBAAC;YACjG;YACA,IAAI,CAACkF,OAAOE,SAAS,CAACtF,aAAaA,WAAW,GAAG;gBAC/C,OAAO;oBAAEsB,SAAS;oBAAoBQ,SAAS;gBAA2C;YAC5F;YACA,MAAMyD,QAAQ,EAACJ,cAAAA,OAAO7G,GAAG,CAAC4B,uBAAXiF,cAA0B,KAAKnF;YAC9C,IAAIuF,UAASN,eAAAA,QAAQ3G,GAAG,CAAC4B,uBAAZ+E,eAA2B,IAAI;gBAC1C,OAAO;oBAAE3D,SAAS;oBAAoBQ,SAAS,CAAC,KAAK,EAAEmD,QAAQ3G,GAAG,CAAC4B,YAAY,SAAS,EAAEA,WAAW,UAAU,CAAC;gBAAC;YACnH;YACA,IAAIF,WAAW,GAAGmF,OAAOK,GAAG,CAACtF,YAAYqF;QAC3C;QACA,IAAIP,cAAcG,OAAOM,IAAI,GAAG,GAAG;YACjC,MAAMC,WAAW,MAAMvE,YAAY7C,GAAG,CAACL,QAAQV,UAAU,CAAC,aAAaC,GAAG,CAACwH;YAC3E,IAAI,CAACU,SAASrE,MAAM,EAAE,OAAO;gBAAEC,SAAS;gBAAoBQ,SAAS;YAAuC;QAC9G;QACA,MAAMpB,WAAWzC,QAAQV,UAAU,CAAC,UAAUC,GAAG,CAAC+B,MAAMoB,OAAO;QAC/D,MAAMS,gBAAgB,MAAMD,YAAY7C,GAAG,CAACoC;QAC5C,MAAMX,QAAQqB,cAAcC,MAAM,GAAG9E,cAAckF,eAAe,EAAEL,sBAAAA,cAAc5C,IAAI,cAAlB4C,sBAAwB,CAAC,KAAe;QAC5G,0DAA0D;QAC1D,MAAMuE,UACJ5F,SAASoF,OAAOM,IAAI,GAAG,IACnB,MAAMvI,2BAA2Be,SAAS8B,OAAO,CAAC6F,MAAQzE,YAAY7C,GAAG,CAACsH,QAC1E;YAAEnG,OAAO,EAAE;YAAEoG,UAAU,IAAIX;QAAyC;QAC1E,MAAMY,YAAY,IAAIZ;QACtB,KAAK,MAAMvF,QAAQgG,QAAQlG,KAAK,CAAE;gBACS0F,cAAWxF,iBAEjBmG;YAFnC,MAAM9F,WAAW+F,KAAKC,GAAG,CAACrG,KAAKK,QAAQ,GAAEmF,eAAAA,OAAO7G,GAAG,EAACqB,kBAAAA,KAAKsG,SAAS,YAAdtG,kBAAkB,CAAC,cAA9BwF,eAAoC;YAC7E,IAAInF,YAAY,GAAG;YACnB8F,UAAUN,GAAG,CAAC7F,KAAKuG,SAAS,EAAE;oBAAKJ,iBAAAA,UAAUxH,GAAG,CAACqB,KAAKuG,SAAS,aAA5BJ,iBAAiC,EAAE;gBAAG;oBAAEK,WAAWxG,KAAKwG,SAAS;oBAAEnG;gBAAS;aAAE;QACnH;QACA,IAAIoG,QAAQ;QACZ,KAAK,MAAM,CAACF,WAAWzG,MAAM,IAAIqG,UAAW;YAC1C,MAAMO,UAAUV,QAAQE,QAAQ,CAACvH,GAAG,CAAC4H;YACrC,IAAI,CAACG,SAAS;YACd,IAAIC,WAAWD,QAAQC,QAAQ;YAC/B,KAAK,MAAM3G,QAAQF,MAAO;gBACxB6G,WAAW/J,cAAcgK,sBAAsB,CAAC;oBAAED;gBAAS,GAAG3G,KAAKwG,SAAS,EAAExG,KAAKK,QAAQ,EAAEgF,cAAcpB;YAC7G;YACAzC,YAAY+B,MAAM,CAACjF,QAAQV,UAAU,CAAC,YAAYC,GAAG,CAAC0I,YAAY;gBAChEI;eACG/J,cAAciK,kBAAkB,CAAC,aAAKH;gBAASC;;gBAClDzD,aAAajC;;YAEf,KAAK,MAAMjB,QAAQF,MAAO;gBACxB2G,SAASzG,KAAKK,QAAQ;gBACtBmB,YAAY4B,MAAM,CAAC9E,QAAQV,UAAU,CAAC,wBAAwBC,GAAG,CAAC3B,sBAAsB;oBACtFqK;oBACAC,WAAWxG,KAAKwG,SAAS;oBACzBM,OAAO9G,KAAKK,QAAQ;oBACpBK,QAAQ;oBACRM,SAASpB,MAAMoB,OAAO;mBAClBqE,aAAa;oBAAEA;gBAAW,IAAI,CAAC;oBACnCxC,MAAM5B;;YAEV;QACF;QACA,MAAMf,UAAuC;YAC3CJ,OAAO;mBAAI0F,OAAOuB,OAAO;aAAG,CAAChH,GAAG,CAAC,CAAC,CAACQ,YAAYF,SAAS,GAAM,CAAA;oBAAEE;oBAAYF;gBAAS,CAAA;WACjFgF,aAAa;YAAEA;QAAW,IAAI,CAAC;YACnCxC,MAAM5B;;QAER,MAAMoD,QAAQ;YACZxE,QAAQ;YACRK;YACA0C,UAAUhG,cAAc6H,iBAAiB,CACvC7E,OACA,YACA6G,QAAQ,IAAI,GAAGA,MAAM,CAAC,EAAEA,UAAU,IAAI,SAAS,QAAQ,cAAc,CAAC,GAAG,qBACzExF;YAEFiC,aAAajC;QACf;QACAO,YAAY+B,MAAM,CAACJ,WAAWkB;QAC9B,MAAM2C,WAAW,aAAKpH,OAAUyE;QAChC,IAAIjE,OAAO;YACT,MAAMiD,aAAa;gBACjBT,UAAUhG,cAAc0G,gBAAgB,CAAClD,OAAO,mBAAmBqG,QAAQ,IAAI,GAAGA,MAAM,UAAU,CAAC,GAAGxC,WAAWhD;YACnH;YACAO,YAAY+B,MAAM,CAACxC,UAAUsC;YAC7BlG,gBAAgBqE,aAAazE,uBAAuB;gBAClDY,QAAQkD,QAAQlD,MAAM;gBACtBqD,SAASpB,MAAMoB,OAAO;gBACtBwC,KAAK,CAAC,gBAAgB,EAAE3C,QAAQ8C,QAAQ,EAAE;gBAC1CvD,OAAO,aAAKqB,cAAc5C,IAAI,IAAOwE;gBACrCI,OAAO;oBAAEC,QAAQhE,gBAAgBmB,QAAQ8C,QAAQ,EAAEqD;gBAAU;YAC/D;QACF;QACA,OAAO;YAAErF,SAAS;YAAoB/B,OAAOoH;YAAU5G;YAAOqG;QAAM;IACtE;AACF;AAEA;;;;CAIC,GACD,OAAO,eAAeQ,mBAAmBpG,OAMxC;QAIaA;IAHZ,MAAMnD,YAAYtB,cAAc0E,GAAG,GAAGpD,SAAS;IAC/C,MAAMY,UAAUb,WAAWC,WAAWmD,QAAQlD,MAAM;IACpD,MAAMwF,YAAY7E,QAAQV,UAAU,CAAC,WAAWC,GAAG,CAACgD,QAAQ8C,QAAQ;IACpE,MAAM1C,OAAMJ,eAAAA,QAAQI,GAAG,YAAXJ,eAAeK,KAAKD,GAAG;IACnC,OAAOvD,UAAU6D,cAAc,CAAC,OAAOC;YAO+BC;QANpE,MAAMyC,WAAW,MAAM1C,YAAY7C,GAAG,CAACwE;QACvC,IAAI,CAACe,SAASxC,MAAM,EAAE,OAAO;YAAEC,SAAS;QAAiB;QACzD,MAAM/B,QAAQsE,SAASrF,IAAI;QAC3B,IAAIe,MAAMC,MAAM,KAAK,cAAcD,MAAMsH,YAAY,EAAE,OAAO;YAAEvF,SAAS;YAAW/B;QAAM;QAC1F,MAAMmB,WAAWzC,QAAQV,UAAU,CAAC,UAAUC,GAAG,CAAC+B,MAAMoB,OAAO;QAC/D,MAAMS,gBAAgB,MAAMD,YAAY7C,GAAG,CAACoC;QAC5C,MAAMX,QAAQqB,cAAcC,MAAM,GAAG9E,cAAckF,eAAe,EAAEL,sBAAAA,cAAc5C,IAAI,cAAlB4C,sBAAwB,CAAC,KAAe;QAC5G,MAAM4C,QAAQ;YACZxE,QAAQ;YACRqH,cAAcjG;YACdhB,aAAamG,KAAKe,GAAG,CAAC,GAAGf,KAAKgB,KAAK,CAACvG,QAAQZ,WAAW;YACvD2C,UAAUhG,cAAc6H,iBAAiB,CAAC7E,OAAO,YAAYqE,WAAWhD;YACxEiC,aAAajC;QACf;QACAO,YAAY+B,MAAM,CAACJ,WAAWkB;QAC9B,MAAMgD,QAAQjH,yBAAAA,MAAOkH,YAAY;QACjC,IAAIlH,SAASiH,SAAS,CAACA,MAAME,UAAU,IAAI3H,MAAMM,OAAO,EAAE;YACxD,MAAMsH,YAAY5H,MAAMM,OAAO,CAACJ,KAAK,CAAC2H,IAAI,CAAC,CAACzH,OAASA,KAAKK,QAAQ,GAAG;YACrEmB,YAAY+B,MAAM,CAACxC,UAAU;gBAC3BuG,cAAc,aACTD;oBACHE,YAAYC,YAAY,cAAc;oBACtCE,cAAczG;mBACVJ,QAAQ8G,GAAG,GAAG;oBAAEC,YAAY/G,QAAQ8G,GAAG;gBAAC,IAAI,CAAC;gBAEnD/E,UAAUhG,cAAc0G,gBAAgB,CACtClD,OACA,iBACAoH,YAAY,uCAAuC,uCACnDvG;YAEJ;QACF;QACA,OAAO;YAAEU,SAAS;YAAW/B,OAAO,aAAKA,OAAUyE;YAASjE;QAAM;IACpE;AACF;AAEA,kFAAkF,GAClF,eAAeyH,gBACbC,GAAqB,EACrBC,IAA6B,EAC7BC,cAAsB;QA4BeF;IA1BrC,IAAIjI,SAAS;IACb,IAAIoI,UAA+B,CAAC;IACpC,MAAMC,MAAM;QACVrI,QAAOsI,IAAY;YACjBtI,SAASsI;YACT,OAAOD;QACT;QACAE,MAAKrK,KAAc;YACjBkK,UAAWlK,gBAAAA,QAAS,CAAC;YACrB,OAAOmK;QACT;QACAG,MAAKtK,KAAc;YACjBkK,UAAU;gBAAEK,OAAOrJ,OAAOlB,gBAAAA,QAAS;YAAI;YACvC,OAAOmK;QACT;QACAK;YACE,OAAOL;QACT;QACAM;YACE,OAAON;QACT;IACF;IACA,MAAM1K,cACJ,aACKsK;QACHW,QAAQ;QACRC,SAAS;YAAEC,eAAe1J,QAAO6I,6BAAAA,IAAIY,OAAO,CAACC,aAAa,YAAzBb,6BAA6B;YAAK,mBAAmBE;QAAe;QACrGD;QAEFG;IAEF,OAAO;QAAErI;QAAQkI,MAAME;IAAQ;AACjC;AAQA,eAAeW,gBACbjL,MAAc,EACd6F,GAAmB,EACnBqF,EAAU,EACVC,MAA8B,EAC9BC,QAA2C;IAE3C,IAAI,CAACF,MAAM,CAACnM,qBAAqB;IACjC,IAAI;;QACF,MAAMgB,YAAYtB,cAAc0E,GAAG,GAAGpD,SAAS;QAC/C,MAAMsL,WAAW,MAAMvM,0BAA0BiB,WAAWC,QAAQ6F,KAAKsF;QACzE,MAAMG,MAAM,MAAM5M,cAAcsB,QAAQiB,KAAK,CAAC,IAAM;QACpD,MAAMjC,UAAU;YACdkM;YACAK,OAAO,UAAEF,4BAAAA,SAAUE,OAAO,mBAAIH,SAASG,OAAO;YAC9CC,MAAMH,CAAAA,4BAAAA,SAAUG,IAAI,KAAIJ,SAASI,IAAI;WACjCH,CAAAA,4BAAAA,SAAUI,IAAI,IAAG;YAAEA,MAAMJ,SAASI,IAAI;QAAC,IAAI,CAAC;YAChDC,UAAUpN,MAAMqN,sBAAsB,CAACL,uBAAAA,IAAKA,GAAG,EAAWI,QAAQ;YAClEE,iBAAiB,MAAMjN,oBAAoBqB;YAC3C6L,UAAU;YACVC,SAASjG;YACT,uDAAuD;YACvDkG,SAAS;;QAEX,MAAMnN,eAAeoB;IACvB,EAAE,OAAO2K,OAAO;QACd,oEAAoE;QACpEqB,QAAQrB,KAAK,CAAC,CAAC,UAAU,EAAE9E,IAAI,SAAS,CAAC,EAAE7F,QAAQ2K;IACrD;AACF;AAEA,6EAA6E,GAC7E,eAAesB,mBAAmBjM,MAAc,EAAEgG,QAAgB,EAAE/D,KAA+B,EAAEQ,KAA8B;QAOpHR,sBAeaA,uBACQA,qBAKzBA;QAhBQ,MAAC,OACQ;IAZ1B,MAAMiK,QAAQ1J,gBAAgBC,OAAOR;IACrC,MAAMpD,mBACJmB,QACA;QACEmM,MAAM;QACNC,OAAO,CAAC,2BAA2B,EAAEnK,MAAMyC,WAAW,EAAE;QACxD0F,MAAM,IAAGnI,uBAAAA,MAAM2C,aAAa,YAAnB3C,uBAAuB,UAAU,iBAAiB,EAAEhD,cAAcoG,mBAAmB,CAAC5C,OAAOR,MAAME,KAAK,EAAE,YAAY,EAAEF,MAAMyC,WAAW,CAAC,WAAW,CAAC;QAC/J2H,MAAM,CAAC,CAAC,EAAErM,OAAO,yBAAyB,EAAEsM,mBAAmBtG,WAAW;IAC5E,GACA;QAAEuG,gBAAgB;IAAK,GACvBtL,KAAK,CAAC,IAAMqF;IACd,MAAMkG,YAAY,QAAA,MAAM9N,cAAcsB,QAAQiB,KAAK,CAAC,IAAM,2BAAzC,OAAA,AAAC,MAAgDqK,GAAG,qBAApD,KAAsDkB,QAAQ;IAC/E,MAAMC,QAAQD,YAAY,SAAA,MAAMhO,yBAAyBgO,UAAUvL,KAAK,CAAC,IAAM,0BAAtD,AAAC,OAA6DyL,MAAM,GAAG;IAChG,IAAI,EAACD,yBAAAA,MAAOE,KAAK,GAAE;IACnB,MAAM1B,gBACJjL,QACA,oBACAyM,MAAME,KAAK,EACX;QACE,gBAAgB1K,MAAMyC,WAAW;QACjC,gBAAgBwH;QAChB,eAAe5K,QAAOW,wBAAAA,MAAM2C,aAAa,YAAnB3C,wBAAuB;QAC7C,uBAAuBX,QAAOW,sBAAAA,MAAM8C,YAAY,YAAlB9C,sBAAsB;IACtD,GACA;QACEsJ,SAAS,CAAC,2BAA2B,EAAEtJ,MAAMyC,WAAW,EAAE;QAC1D8G,MACE,IAAGvJ,wBAAAA,MAAM2C,aAAa,YAAnB3C,wBAAuB,UAAU,kCAAkC,EAAEA,MAAMyC,WAAW,CAAC,KAAK,EAAEwH,OAAO,GACvGjK,CAAAA,MAAM8C,YAAY,GAAG,CAAC,KAAK,EAAE9C,MAAM8C,YAAY,CAAC,CAAC,CAAC,GAAG,EAAC,IACvD,CAAC,mDAAmD,CAAC;IACzD;AAEJ;AAEA,mDAAmD,GACnD,eAAe6H,UACb5M,MAAc,EACd6F,GAAgD,EAChD5D,KAA+B,EAC/BQ,KAAqC;QAEnBR,MAAAA,sBAIAxC,iBAMQwC,oBAIFA;IAdxB,MAAMiJ,KAAK5J,QAAOW,QAAAA,uBAAAA,MAAM2C,aAAa,YAAnB3C,uBAAuBQ,yBAAAA,MAAOmC,aAAa,YAA3C3C,OAA+C,IAAIwB,IAAI;IACzE,IAAI,CAACyH,MAAM,CAACzI,OAAO;IACnB,MAAM1C,YAAYtB,cAAc0E,GAAG,GAAGpD,SAAS;IAC/C,MAAMc,QAAQ,MAAMJ,UAAUV,WAAWC;IACzC,MAAM6M,aAAYpN,kBAAAA,eAAeoB,MAAMD,IAAI,EAAWZ,QAAQiC,MAAMoB,OAAO,aAAzD5D,kBAA8D;IAChF,MAAMyM,QAAQ1J,gBAAgBC,OAAOR;IACrC,MAAM8E,QAAQ9E,MAAMqF,WAAW,GAC3B,CAAC,yBAAyB,EAAErF,MAAMqF,WAAW,CAACN,QAAQ,EAAE,GACvD/E,CAAAA,MAAMqF,WAAW,CAACH,cAAc,GAAG,CAAC,EAAE,EAAE;QAAClF,MAAMqF,WAAW,CAACJ,OAAO;QAAEjF,MAAMqF,WAAW,CAACH,cAAc;KAAC,CAAC2F,MAAM,CAACzM,SAAS2C,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAC,IACvI;IACJ,MAAM+J,cAAcvL,OAAMS,qBAAAA,MAAMK,WAAW,YAAjBL,qBAAqB,GAAGpB,MAAMQ,QAAQ;IAChE,MAAM8J,SAAiC;QACrC,gBAAgBlJ,MAAMyC,WAAW;QACjC,gBAAgBwH;QAChB,eAAe5K,QAAOW,sBAAAA,MAAM+C,YAAY,YAAlB/C,sBAAsB;QAC5C,gBAAgB8E;QAChB,sBAAsBgG;QACtB,mBAAmBF;IACrB;IACA,MAAMzB,WACJvF,QAAQ,oBACJ;QACE0F,SAAS,CAAC,sBAAsB,EAAEtJ,MAAMyC,WAAW,CAAC,YAAY,CAAC;QACjE8G,MAAM,CAAC,4BAA4B,EAAEU,OAAO,GAAIjK,CAAAA,MAAM+C,YAAY,GAAG,CAAC,IAAI,EAAE/C,MAAM+C,YAAY,EAAE,GAAG,EAAC,IAAM+B,CAAAA,QAAQ,CAAC,IAAI,EAAEA,OAAO,GAAG,EAAC;IACtI,IACAlB,QAAQ,oBACN;QACE0F,SAAS,CAAC,4BAA4B,EAAEtJ,MAAMyC,WAAW,EAAE;QAC3D8G,MAAM,CAAC,sCAAsC,EAAEU,OAAO,GAAIjK,CAAAA,MAAM+C,YAAY,GAAG,CAAC,IAAI,EAAE/C,MAAM+C,YAAY,EAAE,GAAG,EAAC;IAChH,IACA;QACEuG,SAAS,CAAC,sBAAsB,EAAEtJ,MAAMyC,WAAW,EAAE;QACrD8G,MAAM,CAAC,qCAAqC,EAAEuB,YAAY,KAAK,EAAEb,OAAO;IAC1E;IACR,IAAIW,WAAWzB,SAASI,IAAI,IAAI,CAAC,qBAAqB,EAAEqB,WAAW;IACnE,MAAM5B,gBAAgBjL,QAAQ6F,KAAKqF,IAAIC,QAAQC;AACjD;AAEA,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E;;;;;CAKC,GACD,eAAe4B,eACb7C,GAAqB,EACrBnK,MAAc,EACdqD,OAAe,EACf4J,KAAa,EACbxK,KAA8B;QAKHyK,qBAC2BzK;IAJtD,IAAIwK,SAASvN,uBAAuBM,QAAQqD,SAAS4J,QAAQ,OAAO;IACpE,MAAMC,UAAU,MAAMvN,wBAAwBwK,KAAKnK;IACnD,IAAIkN,QAAQhL,MAAM,KAAK,UAAU,OAAO;IACxC,MAAMiL,cAAc7L,QAAO4L,sBAAAA,QAAQE,MAAM,CAACpM,GAAG,CAAC,oBAAnBkM,sBAA+B,IAAIzJ,IAAI,GAAGoD,WAAW;IAChF,OAAOxG,QAAQ8M,gBAAgBA,gBAAgB7L,QAAOmB,uBAAAA,MAAMmC,aAAa,YAAnBnC,uBAAuB,IAAIgB,IAAI,GAAGoD,WAAW;AACrG;AAEA;;;;;CAKC,GACD,OAAO,MAAMwG,uBAAyC,OAAOlD,KAAKI;QAIjDJ,MACOmD,eACCA,OAAAA,gBACFA,OAAAA;IANrB,IAAInD,IAAIW,MAAM,KAAK,SAASX,IAAIW,MAAM,KAAK,QAAQ;QACjD,OAAOP,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;YAAEE,OAAO;QAAqB;IAC5D;IACA,MAAM2C,SAASnD,OAAAA,IAAIW,MAAM,KAAK,QAAQX,IAAIoD,KAAK,GAAG,OAAOpD,IAAIC,IAAI,KAAK,WAAWoD,KAAKC,KAAK,CAACtD,IAAIC,IAAI,IAAID,IAAIC,IAAI,YAAjGD,OAAsG,CAAC;IACtH,MAAMnK,SAASsB,QAAOgM,gBAAAA,MAAMtN,MAAM,YAAZsN,gBAAgB;IACtC,MAAMjK,UAAU/B,QAAOgM,SAAAA,iBAAAA,MAAMjK,OAAO,YAAbiK,iBAAiBA,MAAMI,CAAC,YAAxBJ,QAA4B;IACnD,MAAML,QAAQ3L,QAAOgM,SAAAA,WAAAA,MAAMK,CAAC,YAAPL,WAAWA,MAAML,KAAK,YAAtBK,QAA0B,IAAI5J,KAAK,CAAC,GAAG;IAC5D,IAAI,CAACvD,KAAKH,WAAW,CAACG,KAAKkD,UAAU,OAAOkH,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;QAAEE,OAAO;IAA4B;IACtG,IAAI;YAIkE7G,qBA+BrDwJ;QAlCf,MAAMvN,YAAYtB,cAAc0E,GAAG,GAAGpD,SAAS;QAC/C,MAAMY,UAAUb,WAAWC,WAAWC;QACtC,MAAM8D,gBAAgB,MAAMnD,QAAQV,UAAU,CAAC,UAAUC,GAAG,CAACmD,SAASrC,GAAG;QACzE,MAAMyB,QAAQqB,cAAcC,MAAM,GAAG9E,cAAckF,eAAe,EAAEL,sBAAAA,cAAc5C,IAAI,cAAlB4C,sBAAwB,CAAC,KAAe;QAC5G,IAAI,CAACrB,SAAS,CAAE,MAAMuK,eAAe7C,KAAKnK,QAAQqD,SAAS4J,OAAOxK,QAAS;YACzE,OAAO8H,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;gBAAEE,OAAO;YAA+B;QACtE;QACA,IAAIR,IAAIW,MAAM,KAAK,OAAO;YACxB,MAAM,CAAC,EAAE3J,cAAc,EAAE,EAAE8C,SAAS,GAAG,MAAMnD,QAAQC,GAAG,CAAC;gBACvDN,UAAUV,WAAWC;gBACrBW,QAAQV,UAAU,CAAC,WAAWiE,KAAK,CAAC,WAAW,MAAMb,SAASrC,GAAG;aAClE;YACD,MAAM4M,UAAU3J,SAASK,IAAI,CAAClC,GAAG,CAAC,CAACH,QAAW;oBAAED,IAAIC,MAAMD,EAAE;mBAAMC,MAAMf,IAAI;YAC5E,MAAM2M,SAAS5O,cAAc6O,oBAAoB,CAACrL,OAAOtB;YACzD,OAAOoJ,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;gBAC1BsD,SAAS5M,eAAe4M,OAAO;gBAC/BC,gBAAgBH;gBAChBI,YAAYJ,WAAW,QAAQtK,KAAKD,GAAG,MAAMuK;gBAC7C1L,OAAOlD,cAAciP,eAAe,CAACzL,OAAOmL,SAASzM;gBACrDgN,SAASlP,cAAcmP,cAAc,CAAChM,GAAG,CAAC,CAACW,SAAY,CAAA;wBAAE3C,OAAO2C;wBAAQgE,OAAO9H,cAAc6D,oBAAoB,CAACC,OAAO;oBAAC,CAAA;gBAC1H6K,SAASA,QAAQxL,GAAG,CAAC,CAACH,QAAW;wBAC/BD,IAAIC,MAAMD,EAAE;wBACZE,QAAQD,MAAMC,MAAM;wBACpBC,OAAOF,MAAME,KAAK;wBAClBmD,aAAarD,MAAMqD,WAAW;uBAC1BrD,MAAMqF,WAAW,GAAG;wBAAEA,aAAa;4BAAEN,UAAU/E,MAAMqF,WAAW,CAACN,QAAQ;4BAAEE,SAASjF,MAAMqF,WAAW,CAACJ,OAAO;4BAAEC,gBAAgBlF,MAAMqF,WAAW,CAACH,cAAc;wBAAC;oBAAE,IAAI,CAAC,GACvKlF,MAAMC,MAAM,KAAK,cAAcD,MAAM+C,YAAY,GAAG;wBAAEA,cAAc/C,MAAM+C,YAAY;oBAAC,IAAI,CAAC;YAEpG;QACF;QACA,MAAMhB,UAAU,MAAMf,WAAW;YAC/BjD;YACAqD;YACAlB,OAAOkM,MAAMC,OAAO,CAAChB,MAAMnL,KAAK,IAAI,AAACmL,MAAMnL,KAAK,CAAeuB,KAAK,CAAC,GAAG,OAAgB,EAAE;YAC1FF,MAAMlC,QAAOgM,cAAAA,MAAM9J,IAAI,YAAV8J,cAAc;YAC3B/I,IAAI;QACN;QACA,IAAIP,QAAQA,OAAO,KAAK,iBAAiB,OAAOuG,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;YAAEE,OAAO;QAA+B;QAC7G,IAAI3G,QAAQA,OAAO,KAAK,WAAW,OAAOuG,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;YAAEE,OAAO3G,QAAQQ,OAAO;QAAC;QACxF,MAAMyH,mBAAmBjM,QAAQgE,QAAQgC,QAAQ,EAAEhC,QAAQ/B,KAAK,EAAE+B,QAAQvB,KAAK;QAC/E,OAAO8H,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;YAAE8D,IAAI;YAAMvI,UAAUhC,QAAQgC,QAAQ;YAAE9D,QAAQ8B,QAAQ/B,KAAK,CAACC,MAAM;QAAC;IACnG,EAAE,OAAOyI,OAAO;QACdqB,QAAQrB,KAAK,CAAC,yBAAyBA;QACvC,OAAOJ,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;YAAEE,OAAO;QAAwD;IAC/F;AACF,EAAC;AAED,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,MAAM6D,mBAAmB;IAAC;IAAU;IAAW;IAAW;IAAS;IAAQ;IAAgB;IAAW;CAAS;AAG/G;;;;CAIC,GACD,OAAO,MAAMC,iBAAmC,OAAOtE,KAAKI;QAE7BJ,4BAGf,MACQC,cACAA,cACEA;IAPxB,IAAID,IAAIW,MAAM,KAAK,QAAQ,OAAOP,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;QAAEE,OAAO;IAAqB;IACrF,MAAMK,gBAAgB1J,QAAO6I,6BAAAA,IAAIY,OAAO,CAACC,aAAa,YAAzBb,6BAA6B;IAC1D,MAAMuE,UAAU1D,cAAc2D,UAAU,CAAC,aAAa3D,cAActH,KAAK,CAAC,UAAUpD,MAAM,IAAIgG;IAC9F,IAAI,CAACoI,SAAS,OAAOnE,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;QAAEE,OAAO;IAAkB;IACrE,MAAMP,QAAQ,OAAA,OAAOD,IAAIC,IAAI,KAAK,WAAWoD,KAAKC,KAAK,CAACtD,IAAIC,IAAI,IAAID,IAAIC,IAAI,YAA9D,OAAmE,CAAC;IAClF,MAAMpK,SAASsB,QAAO8I,eAAAA,KAAKpK,MAAM,YAAXoK,eAAe;IACrC,MAAM3D,SAASnF,QAAO8I,eAAAA,KAAK3D,MAAM,YAAX2D,eAAe;IACrC,MAAMpE,WAAW1E,QAAO8I,iBAAAA,KAAKpE,QAAQ,YAAboE,iBAAiB;IACzC,IAAI,CAACjK,KAAKH,SAAS,OAAOuK,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;QAAEE,OAAO;IAAiB;IACzE,IAAI,CAAC6D,iBAAiBhO,QAAQ,CAACiG,SAAS,OAAO8D,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;QAAEE,OAAO;IAAiB;IAC9F,IAAIlE,WAAW,YAAY,CAACtG,KAAK6F,WAAW,OAAOuE,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;QAAEE,OAAO;IAAmB;IACpG,IAAI;YAKYiE;QAJd,MAAMC,UAAU,MAAMpQ,cAAc0E,GAAG,GAAG2L,IAAI,GAAGC,aAAa,CAACL;QAC/D,MAAM3O,YAAYtB,cAAc0E,GAAG,GAAGpD,SAAS;QAC/C,MAAM6O,eAAe,MAAM9O,WAAWC,WAAWC,QAAQgB,GAAG;QAC5D,IAAI,CAAC4N,aAAa7K,MAAM,EAAE,OAAOwG,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;YAAEE,OAAO;QAAe;QAC9E,MAAMqE,OAAO,EAACJ,oBAAAA,aAAa5N,GAAG,CAAC,0BAAjB4N,oBAAmC,CAAC,EAAE,CAACC,QAAQ7E,GAAG,CAAC;QACjE,IAAIgF,SAAS,WAAWA,SAAS,UAAU,OAAOzE,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;YAAEE,OAAO;QAAgB;QAEhG,IAAIlE,WAAW,UAAU;gBACA2D,eAMRA;YANf,MAAM/G,UAAU/B,QAAO8I,gBAAAA,KAAK/G,OAAO,YAAZ+G,gBAAgB;YACvC,IAAI,CAACjK,KAAKkD,UAAU,OAAOkH,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;gBAAEE,OAAO;YAAkB;YAC3E,MAAM3G,UAAU,MAAMf,WAAW;gBAC/BjD;gBACAqD;gBACAlB,OAAOkM,MAAMC,OAAO,CAAClE,KAAKjI,KAAK,IAAI,AAACiI,KAAKjI,KAAK,CAAeuB,KAAK,CAAC,GAAG,OAAgB,EAAE;gBACxFF,MAAMlC,QAAO8I,aAAAA,KAAK5G,IAAI,YAAT4G,aAAa;gBAC1B7F,IAAI;YACN;YACA,IAAIP,QAAQA,OAAO,KAAK,iBAAiB,OAAOuG,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;gBAAEE,OAAO;YAAgB;YAC9F,IAAI3G,QAAQA,OAAO,KAAK,WAAW,OAAOuG,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;gBAAEE,OAAO3G,QAAQQ,OAAO;YAAC;YACxF,IAAI4F,KAAK6E,MAAM,KAAK,OAAO,MAAMrC,UAAU5M,QAAQ,mBAAmBgE,QAAQ/B,KAAK,EAAE+B,QAAQvB,KAAK;YAClG,OAAO8H,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;gBAAE8D,IAAI;gBAAMvI,UAAUhC,QAAQgC,QAAQ;gBAAE9D,QAAQ8B,QAAQ/B,KAAK,CAACC,MAAM;YAAC;QACnG;QAEA,IAAIuE,WAAW,WAAW;gBAW2CzC;YAVnE,MAAMA,UAAU,MAAMyD,cAAc;gBAClCzH;gBACAgG;gBACAzD,SAAS8L,MAAMC,OAAO,CAAClE,KAAK7H,OAAO,IAAI,AAAC6H,KAAK7H,OAAO,CAAemB,KAAK,CAAC,GAAG,OAAgB,EAAE;gBAC9FgE,YAAY0C,KAAK1C,UAAU,GAAGpG,OAAO8I,KAAK1C,UAAU,IAAIpB;YAC1D;YACA,IAAItC,QAAQA,OAAO,KAAK,kBAAkB,OAAOuG,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;gBAAEE,OAAO;YAAiB;YAChG,IAAI3G,QAAQA,OAAO,KAAK,WAAW,OAAOuG,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;gBAAEE,OAAO3G,QAAQQ,OAAO;YAAC;YACxF,OAAO+F,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;gBAC1B8D,IAAI;eACAvK,QAAQA,OAAO,KAAK,YAAY;gBAAEkL,SAAS;YAAK,IAAI;gBAAEpG,KAAK,GAAE9E,iBAAAA,QAAQ8E,KAAK,YAAb9E,iBAAiB;YAAE;gBACpF9B,QAAQ8B,QAAQ/B,KAAK,CAACC,MAAM;;QAEhC;QAEA,IAAIuE,WAAW,UAAU;gBAYsB3C;YAX7C,MAAMqL,iBAAiB,MAAMrP,WAAWC,WAAWC,QAAQC,UAAU,CAAC,WAAWC,GAAG,CAAC8F,UAAUhF,GAAG;YAClG,IAAI,CAACmO,eAAepL,MAAM,EAAE,OAAOwG,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;gBAAEE,OAAO;YAAiB;YAClF,MAAM1I,QAAQkN,eAAejO,IAAI;YACjC,IAAIe,MAAMC,MAAM,KAAK,cAAcD,MAAMsH,YAAY,EAAE;gBACrD,OAAOgB,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;oBAAE8D,IAAI;oBAAMW,SAAS;oBAAMhN,QAAQD,MAAMC,MAAM;gBAAC;YAC9E;YACA,IAAI,CAACjD,cAAc0H,mBAAmB,CAAC1E,MAAMC,MAAM,EAAE,aAAa;gBAChE,OAAOqI,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;oBAAEE,OAAO,CAAC,iBAAiB,EAAE1L,cAAc2H,oBAAoB,CAAC3E,MAAMC,MAAM,CAAC,CAAC2E,WAAW,GAAG,mBAAmB,CAAC;gBAAC;YAC/I;YACA,MAAM/C,gBAAgB,MAAMhE,WAAWC,WAAWC,QAAQC,UAAU,CAAC,UAAUC,GAAG,CAAC+B,MAAMoB,OAAO,EAAErC,GAAG;YACrG,IAAI,CAAC8C,cAAcC,MAAM,EAAE,OAAOwG,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;gBAAEE,OAAO;YAAoC;YACpG,MAAMlI,QAAQxD,cAAckF,eAAe,EAAEL,sBAAAA,cAAc5C,IAAI,cAAlB4C,sBAAwB,CAAC;YACtE,MAAMsL,YAAYnQ,cAAcoQ,iBAAiB,CAAC5M,OAAOR,MAAME,KAAK;YACpE,MAAMmN,cAAclF,KAAKkF,WAAW,IAAI,OAAOF,YAAY3G,KAAKgB,KAAK,CAAC3B,OAAOsC,KAAKkF,WAAW;YAC7F,IAAI,CAACxH,OAAOyH,QAAQ,CAACD,gBAAgBA,eAAe,GAAG;gBACrD,OAAO/E,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;oBAAEE,OAAO;gBAAuC;YAC9E;YACA,MAAM6E,aAAavQ,cAAcwQ,kBAAkB,CAAChN,OAAOR,MAAME,KAAK,EAAE2K,MAAM,CAC5E,CAAC4C,QAAU,CAACzQ,cAAc0Q,iBAAiB,CAAClN,OAAOiN;YAErD,MAAME,aAAa3Q,cAAc4Q,oBAAoB,CAACpN,OAAO+M;YAC7D,qEAAqE;YACrE,8DAA8D;YAC9D,0DAA0D;YAC1D,MAAMM,SAAS,MAAM5F,gBACnBC,KACA;gBACEnK;gBACAqD,SAASpB,MAAMoB,OAAO;gBACtBiM;eACIE,WAAWlP,MAAM,GAAG,KAAKgP,eAAeM,aAAa;gBAAEG,aAAaP;YAAW,IAAI,CAAC,IAE1F,sEAAsE;YACtE,CAAC,OAAO,EAAExP,OAAO,CAAC,EAAEgG,UAAU;YAEhC,IAAI8J,OAAO5N,MAAM,KAAK,KAAK;;oBACsB4N;gBAA/C,OAAOvF,IAAIrI,MAAM,CAAC4N,OAAO5N,MAAM,EAAEuI,IAAI,CAAC;oBAAEE,KAAK,YAAEmF,eAAAA,OAAO1F,IAAI,qBAAX0F,aAAanF,KAAK,oBAAI;gBAAgB;YACvF;YACA,MAAMqF,SAAS,MAAM1G,mBAAmB;gBAAEtJ;gBAAQgG;gBAAU1D,aAAagN;gBAAatF,KAAK6E,QAAQ7E,GAAG;YAAC;YACvG,IAAIgG,OAAOhM,OAAO,KAAK,WAAW;gBAChC,MAAMzE,gBAAgBF,uBAAuB;oBAC3CW;oBACAqD,SAASpB,MAAMoB,OAAO;oBACtBwC,KAAK,CAAC,gBAAgB,EAAEG,UAAU;oBAClCF,OAAO;wBAAEC,QAAQhE,gBAAgBiE,UAAUgK,OAAO/N,KAAK;oBAAE;gBAC3D;gBACA,MAAM2K,UAAU5M,QAAQ,mBAAmBgQ,OAAO/N,KAAK,EAAE+N,OAAOvN,KAAK;YACvE;YACA,OAAO8H,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;gBAAE8D,IAAI;gBAAMjM,aAAagN;gBAAapN,QAAQ;YAAW;QACvF;QAEA,MAAM8B,UAAU,MAAMqC,aAAa;YACjCrG;YACAgG;YACAS,QAAQA;WACJ2D,KAAKpF,YAAY,KAAKsB,YAAY;YAAEtB,cAAc1D,OAAO8I,KAAKpF,YAAY;QAAE,IAAI,CAAC,GACjFyB,WAAW,iBAAiB;YAAEM,OAAOqD,KAAKrD,KAAK;QAAC,IAAI,CAAC;QAE3D,IAAI/C,QAAQA,OAAO,KAAK,kBAAkB,OAAOuG,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;YAAEE,OAAO;QAAiB;QAChG,IAAI3G,QAAQA,OAAO,KAAK,WAAW,OAAOuG,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;YAAEE,OAAO3G,QAAQQ,OAAO;QAAC;QACxF,IAAIR,QAAQA,OAAO,KAAK,aAAaoG,KAAK6E,MAAM,KAAK,OAAO;YAC1D,IAAIxI,WAAW,WAAW,MAAMmG,UAAU5M,QAAQ,mBAAmBgE,QAAQ/B,KAAK,EAAE+B,QAAQvB,KAAK;YACjG,IAAIgE,WAAW,WAAW,MAAMmG,UAAU5M,QAAQ,mBAAmBgE,QAAQ/B,KAAK,EAAE+B,QAAQvB,KAAK;YACjG,sEAAsE;YACtE,2CAA2C;YAC3C,IAAIgE,WAAW,kBAAkBzC,QAAQ/B,KAAK,CAACC,MAAM,KAAK,YAAY;gBACpE,MAAM0K,UAAU5M,QAAQ,mBAAmBgE,QAAQ/B,KAAK,EAAE+B,QAAQvB,KAAK;YACzE;QACF;QACA,OAAO8H,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;YAC1B8D,IAAI;WACAvK,QAAQA,OAAO,KAAK,YAAY;YAAEkL,SAAS;QAAK,IAAI,CAAC;YACzDhN,QAAQ8B,QAAQ/B,KAAK,CAACC,MAAM;;IAEhC,EAAE,OAAOyI,OAAO;QACdqB,QAAQrB,KAAK,CAAC,yBAAyBlE,QAAQkE;QAC/C,qEAAqE;QACrE,oBAAoB;QACpB,OAAOJ,IAAIrI,MAAM,CAAC,KAAKuI,IAAI,CAAC;YAAEE,OAAO;QAAqD;IAC5F;AACF,EAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import type { PluginShipFromAddress, PluginShippableRecord, PluginShipmentRecords, PluginTrackingOutcome } from '@aglyn/aglyn/plugin-manager/plugin-shipment-records';
18
+ /** The order as a shippable record, with each line's weight and customs facts. */
19
+ export declare function readShippableOrder(hostId: string, orderId: string): Promise<PluginShippableRecord | null>;
20
+ /**
21
+ * Records what the carrier says on the shipment it is about, once, and
22
+ * moves the order to delivered when every parcel of a fully shipped order
23
+ * has arrived — through `recordOrderShipment`, so the buyer's delivered email
24
+ * is this plugin's to send.
25
+ */
26
+ export declare function recordShipmentTracking(update: {
27
+ hostId: string;
28
+ recordId: string;
29
+ trackingNumber: string;
30
+ status: string;
31
+ detail?: string;
32
+ atMs: number;
33
+ }): Promise<PluginTrackingOutcome>;
34
+ /** The site's locations that have a postal address complete enough to ship from. */
35
+ export declare function readShipFromAddresses(hostId: string): Promise<PluginShipFromAddress[]>;
36
+ export declare const commerceShipmentRecords: PluginShipmentRecords;
@@ -0,0 +1,289 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ import { _ as _extends } from "@swc/helpers/_/_extends";
17
+ import { firebaseAdmin } from "@aglyn/tenant-data-admin";
18
+ import * as CommerceModel from "../model/index.js";
19
+ import { recordOrderShipment } from "./fulfill-order.js";
20
+ /**
21
+ * THIS PLUGIN'S ORDERS, AS A SHIPPER SEES THEM (AGL-3612): commerce's
22
+ * implementation of core's `core.shipment-records`, registered from the
23
+ * server declarations so it is there wherever a label is bought or a
24
+ * tracking webhook lands.
25
+ *
26
+ * A label buyer never reads `hosts/{id}/orders` itself. It asks here, and
27
+ * every write it makes is this plugin's own: a shipment through
28
+ * `recordOrderShipment` — the transition rule, the quantity check, the
29
+ * timeline and the buyer's shipped email — and a delivery through the same
30
+ * function's `delivered` door, which sends the delivered email.
31
+ */ const ordersOf = (hostId)=>firebaseAdmin.app().firestore().collection('hosts').doc(hostId).collection('orders');
32
+ /** The statuses a new shipment may be recorded from. */ const SHIPPABLE = new Set([
33
+ 'paid',
34
+ 'partially_fulfilled'
35
+ ]);
36
+ function toPluginAddress(address) {
37
+ var _ref;
38
+ const country = String((_ref = address == null ? void 0 : address.country) != null ? _ref : '').trim().toUpperCase();
39
+ if (!/^[A-Z]{2}$/.test(country)) return undefined;
40
+ return _extends({
41
+ country
42
+ }, (address == null ? void 0 : address.name) ? {
43
+ name: address.name
44
+ } : {}, (address == null ? void 0 : address.line1) ? {
45
+ line1: address.line1
46
+ } : {}, (address == null ? void 0 : address.line2) ? {
47
+ line2: address.line2
48
+ } : {}, (address == null ? void 0 : address.city) ? {
49
+ city: address.city
50
+ } : {}, (address == null ? void 0 : address.state) ? {
51
+ state: address.state
52
+ } : {}, (address == null ? void 0 : address.postalCode) ? {
53
+ postalCode: address.postalCode
54
+ } : {}, (address == null ? void 0 : address.phone) ? {
55
+ phone: address.phone
56
+ } : {});
57
+ }
58
+ /** The order as a shippable record, with each line's weight and customs facts. */ export async function readShippableOrder(hostId, orderId) {
59
+ var _snapshot_data, _order_lineItems, _order_lineItems1, _order_fulfillments;
60
+ var _order_shippingAddress;
61
+ if (!hostId || !orderId || /^__.*__$/.test(orderId)) return null;
62
+ const snapshot = await ordersOf(hostId).doc(orderId).get();
63
+ if (!snapshot.exists) return null;
64
+ const order = CommerceModel.liftLegacyOrder((_snapshot_data = snapshot.data()) != null ? _snapshot_data : {});
65
+ const states = CommerceModel.orderLineFulfillmentStates(order);
66
+ const productIds = [
67
+ ...new Set(((_order_lineItems = order.lineItems) != null ? _order_lineItems : []).map((line)=>line.productId).filter(Boolean))
68
+ ];
69
+ const products = new Map();
70
+ await Promise.all(productIds.map(async (productId)=>{
71
+ const product = await firebaseAdmin.app().firestore().collection('hosts').doc(hostId).collection('products').doc(productId).get().catch(()=>null);
72
+ if (product == null ? void 0 : product.exists) {
73
+ products.set(productId, CommerceModel.liftLegacyProduct(product.data()));
74
+ }
75
+ }));
76
+ const lines = [];
77
+ ((_order_lineItems1 = order.lineItems) != null ? _order_lineItems1 : []).forEach((line, index)=>{
78
+ var _ref, _line_unitAmountCents;
79
+ const state = states[index];
80
+ if (!(state == null ? void 0 : state.requiresShipping)) return;
81
+ const product = products.get(line.productId);
82
+ const variant = (_ref = product == null ? void 0 : product.variants.find((one)=>one.id === line.variantId)) != null ? _ref : product == null ? void 0 : product.variants[0];
83
+ const facts = product == null ? void 0 : product.shipping;
84
+ const dims = CommerceModel.productParcelDimensions(product);
85
+ lines.push(_extends({
86
+ lineIndex: index,
87
+ name: [
88
+ line.name,
89
+ line.variantLabel
90
+ ].filter(Boolean).join(' — ') || 'Item'
91
+ }, line.sku ? {
92
+ sku: line.sku
93
+ } : {}, {
94
+ quantity: state.quantity,
95
+ quantityUnshipped: state.remainingQuantity,
96
+ unitValueCents: Math.max(0, Math.round(Number((_line_unitAmountCents = line.unitAmountCents) != null ? _line_unitAmountCents : 0)))
97
+ }, Number(variant == null ? void 0 : variant.weightGrams) > 0 ? {
98
+ weightGrams: Number(variant == null ? void 0 : variant.weightGrams)
99
+ } : {}, dims != null ? dims : {}, (facts == null ? void 0 : facts.hsCode) ? {
100
+ hsCode: facts.hsCode
101
+ } : {}, (facts == null ? void 0 : facts.originCountry) ? {
102
+ originCountry: facts.originCountry
103
+ } : {}));
104
+ });
105
+ return _extends({
106
+ hostId,
107
+ recordId: orderId,
108
+ displayRef: order.number ? `#${order.number}` : `#${orderId.slice(0, 8)}`,
109
+ status: order.status,
110
+ shippable: SHIPPABLE.has(order.status),
111
+ currency: 'usd'
112
+ }, toPluginAddress(order.shippingAddress) ? {
113
+ shipTo: _extends({}, toPluginAddress(order.shippingAddress), !((_order_shippingAddress = order.shippingAddress) == null ? void 0 : _order_shippingAddress.name) && order.customerName ? {
114
+ name: order.customerName
115
+ } : {})
116
+ } : {}, order.customerEmail ? {
117
+ customerEmail: order.customerEmail
118
+ } : {}, {
119
+ lines,
120
+ shipments: ((_order_fulfillments = order.fulfillments) != null ? _order_fulfillments : []).filter((fulfillment)=>CommerceModel.fulfillmentIsActive(fulfillment)).map((fulfillment)=>{
121
+ var _fulfillment_lineItemIds;
122
+ return _extends({
123
+ id: fulfillment.id
124
+ }, fulfillment.carrier ? {
125
+ carrier: fulfillment.carrier
126
+ } : {}, fulfillment.trackingNumber ? {
127
+ trackingNumber: fulfillment.trackingNumber
128
+ } : {}, fulfillment.trackingUrl ? {
129
+ trackingUrl: fulfillment.trackingUrl
130
+ } : {}, fulfillment.labelRef ? {
131
+ labelRef: fulfillment.labelRef
132
+ } : {}, {
133
+ lineIndexes: (_fulfillment_lineItemIds = fulfillment.lineItemIds) != null ? _fulfillment_lineItemIds : [],
134
+ atMs: fulfillment.atMs
135
+ });
136
+ })
137
+ }, order.createdAtMs ? {
138
+ createdAtMs: order.createdAtMs
139
+ } : {}, {
140
+ testMode: CommerceModel.orderIsTestMode({
141
+ checkoutSessionId: order.checkoutSessionId,
142
+ livemode: order.livemode,
143
+ $id: orderId
144
+ })
145
+ });
146
+ }
147
+ /**
148
+ * Records what the carrier says on the shipment it is about, once, and
149
+ * moves the order to delivered when every parcel of a fully shipped order
150
+ * has arrived — through `recordOrderShipment`, so the buyer's delivered email
151
+ * is this plugin's to send.
152
+ */ export async function recordShipmentTracking(update) {
153
+ const orderRef = ordersOf(update.hostId).doc(update.recordId);
154
+ const result = await firebaseAdmin.app().firestore().runTransaction(async (transaction)=>{
155
+ var _snapshot_data, _order_fulfillments;
156
+ const snapshot = await transaction.get(orderRef);
157
+ if (!snapshot.exists) return {
158
+ outcome: 'no_such_record'
159
+ };
160
+ const order = CommerceModel.liftLegacyOrder((_snapshot_data = snapshot.data()) != null ? _snapshot_data : {});
161
+ const fulfillments = [
162
+ ...(_order_fulfillments = order.fulfillments) != null ? _order_fulfillments : []
163
+ ];
164
+ const index = fulfillments.findIndex((fulfillment)=>{
165
+ var _fulfillment_trackingNumber;
166
+ return CommerceModel.fulfillmentIsActive(fulfillment) && String((_fulfillment_trackingNumber = fulfillment.trackingNumber) != null ? _fulfillment_trackingNumber : '').trim().toUpperCase() === update.trackingNumber.trim().toUpperCase();
167
+ });
168
+ if (index < 0) return {
169
+ outcome: 'no_such_shipment'
170
+ };
171
+ if (fulfillments[index].trackingStatus === update.status) {
172
+ return {
173
+ outcome: 'unchanged',
174
+ order,
175
+ fulfillments
176
+ };
177
+ }
178
+ fulfillments[index] = _extends({}, fulfillments[index], {
179
+ trackingStatus: update.status,
180
+ trackingStatusAtMs: update.atMs
181
+ });
182
+ transaction.update(orderRef, {
183
+ fulfillments,
184
+ timeline: CommerceModel.appendOrderEvent(order, 'tracking', [
185
+ CommerceModel.trackingStatusLabel(update.status),
186
+ update.detail
187
+ ].filter(Boolean).join(': ').slice(0, 300), update.atMs)
188
+ });
189
+ return {
190
+ outcome: 'recorded',
191
+ order,
192
+ fulfillments
193
+ };
194
+ });
195
+ if (result.outcome === 'no_such_record' || result.outcome === 'no_such_shipment') {
196
+ return {
197
+ outcome: result.outcome
198
+ };
199
+ }
200
+ const everyDelivered = result.fulfillments.filter((fulfillment)=>CommerceModel.fulfillmentIsActive(fulfillment) && fulfillment.trackingNumber).every((fulfillment)=>fulfillment.trackingStatus === 'delivered');
201
+ if (update.status === 'delivered' && everyDelivered && result.order.status === 'fulfilled') {
202
+ await recordOrderShipment({
203
+ hostId: update.hostId,
204
+ orderId: update.recordId,
205
+ to: 'delivered'
206
+ });
207
+ }
208
+ return {
209
+ outcome: result.outcome
210
+ };
211
+ }
212
+ /** The site's locations that have a postal address complete enough to ship from. */ export async function readShipFromAddresses(hostId) {
213
+ const snapshot = await firebaseAdmin.app().firestore().collection('hosts').doc(hostId).collection('locations').limit(50).get();
214
+ const places = [];
215
+ for (const doc of snapshot.docs){
216
+ var _location_name, _location_name1;
217
+ const location = doc.data();
218
+ const address = CommerceModel.normalizePostalAddress(location.postalAddress);
219
+ if (!(address == null ? void 0 : address.country) || !address.line1 || !address.city || !address.postalCode) continue;
220
+ places.push({
221
+ id: doc.id,
222
+ name: String((_location_name = location.name) != null ? _location_name : 'Location'),
223
+ address: _extends({}, address, {
224
+ country: address.country,
225
+ name: String((_location_name1 = location.name) != null ? _location_name1 : '')
226
+ })
227
+ });
228
+ }
229
+ return places.sort((a, b)=>a.name.localeCompare(b.name));
230
+ }
231
+ export const commerceShipmentRecords = {
232
+ read: readShippableOrder,
233
+ async recordShipment (write) {
234
+ var _write_lines;
235
+ const outcome = await recordOrderShipment(_extends({
236
+ hostId: write.hostId,
237
+ orderId: write.recordId,
238
+ to: 'fulfilled',
239
+ carrier: write.carrier,
240
+ trackingNumber: write.trackingNumber
241
+ }, ((_write_lines = write.lines) == null ? void 0 : _write_lines.length) ? {
242
+ lineItems: write.lines.map((line)=>({
243
+ lineItemId: line.lineIndex,
244
+ quantity: line.quantity
245
+ }))
246
+ } : {}, write.trackingUrl ? {
247
+ trackingUrl: write.trackingUrl
248
+ } : {}, write.labelUrl ? {
249
+ labelUrl: write.labelUrl
250
+ } : {}, write.labelRef ? {
251
+ labelRef: write.labelRef,
252
+ idempotencyKey: `label:${write.labelRef}`
253
+ } : {}));
254
+ switch(outcome.outcome){
255
+ case 'recorded':
256
+ var _ref;
257
+ var _outcome_fulfillment;
258
+ return {
259
+ outcome: 'recorded',
260
+ shipmentId: (_ref = (_outcome_fulfillment = outcome.fulfillment) == null ? void 0 : _outcome_fulfillment.id) != null ? _ref : ''
261
+ };
262
+ case 'already':
263
+ return _extends({
264
+ outcome: 'already'
265
+ }, outcome.fulfillment ? {
266
+ shipmentId: outcome.fulfillment.id
267
+ } : {});
268
+ case 'no_such_order':
269
+ return {
270
+ outcome: 'no_such_record'
271
+ };
272
+ case 'blocked':
273
+ return {
274
+ outcome: 'blocked',
275
+ from: outcome.from
276
+ };
277
+ default:
278
+ return {
279
+ outcome: 'blocked',
280
+ from: 'invalid',
281
+ reason: outcome.message
282
+ };
283
+ }
284
+ },
285
+ recordTracking: recordShipmentTracking,
286
+ shipFromAddresses: readShipFromAddresses
287
+ };
288
+
289
+ //# sourceMappingURL=shipment-records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/server/shipment-records.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n PluginShipFromAddress,\n PluginShippableRecord,\n PluginShipmentLine,\n PluginShipmentRecords,\n PluginTrackingOutcome,\n} from '@aglyn/aglyn/plugin-manager/plugin-shipment-records'\nimport { firebaseAdmin } from '@aglyn/tenant-data-admin'\nimport * as CommerceModel from '../model'\nimport { recordOrderShipment } from './fulfill-order'\n\n/**\n * THIS PLUGIN'S ORDERS, AS A SHIPPER SEES THEM (AGL-3612): commerce's\n * implementation of core's `core.shipment-records`, registered from the\n * server declarations so it is there wherever a label is bought or a\n * tracking webhook lands.\n *\n * A label buyer never reads `hosts/{id}/orders` itself. It asks here, and\n * every write it makes is this plugin's own: a shipment through\n * `recordOrderShipment` — the transition rule, the quantity check, the\n * timeline and the buyer's shipped email — and a delivery through the same\n * function's `delivered` door, which sends the delivered email.\n */\n\nconst ordersOf = (hostId: string) =>\n firebaseAdmin.app().firestore().collection('hosts').doc(hostId).collection('orders')\n\n/** The statuses a new shipment may be recorded from. */\nconst SHIPPABLE = new Set(['paid', 'partially_fulfilled'])\n\nfunction toPluginAddress(\n address: CommerceModel.OrderAddress | undefined,\n): PluginShippableRecord['shipTo'] {\n const country = String(address?.country ?? '').trim().toUpperCase()\n if (!/^[A-Z]{2}$/.test(country)) return undefined\n return {\n country,\n ...(address?.name ? { name: address.name } : {}),\n ...(address?.line1 ? { line1: address.line1 } : {}),\n ...(address?.line2 ? { line2: address.line2 } : {}),\n ...(address?.city ? { city: address.city } : {}),\n ...(address?.state ? { state: address.state } : {}),\n ...(address?.postalCode ? { postalCode: address.postalCode } : {}),\n ...(address?.phone ? { phone: address.phone } : {}),\n }\n}\n\n/** The order as a shippable record, with each line's weight and customs facts. */\nexport async function readShippableOrder(\n hostId: string,\n orderId: string,\n): Promise<PluginShippableRecord | null> {\n if (!hostId || !orderId || /^__.*__$/.test(orderId)) return null\n const snapshot = await ordersOf(hostId).doc(orderId).get()\n if (!snapshot.exists) return null\n const order = CommerceModel.liftLegacyOrder((snapshot.data() ?? {}) as never)\n const states = CommerceModel.orderLineFulfillmentStates(order)\n const productIds = [...new Set((order.lineItems ?? []).map((line) => line.productId).filter(Boolean))]\n const products = new Map<string, CommerceModel.HostProduct>()\n await Promise.all(\n productIds.map(async (productId) => {\n const product = await firebaseAdmin\n .app()\n .firestore()\n .collection('hosts')\n .doc(hostId)\n .collection('products')\n .doc(productId)\n .get()\n .catch(() => null)\n if (product?.exists) {\n products.set(productId, CommerceModel.liftLegacyProduct(product.data() as never))\n }\n }),\n )\n const lines: PluginShipmentLine[] = []\n ;(order.lineItems ?? []).forEach((line, index) => {\n const state = states[index]\n if (!state?.requiresShipping) return\n const product = products.get(line.productId)\n const variant = product?.variants.find((one) => one.id === line.variantId) ?? product?.variants[0]\n const facts = product?.shipping\n const dims = CommerceModel.productParcelDimensions(product)\n lines.push({\n lineIndex: index,\n name: [line.name, line.variantLabel].filter(Boolean).join(' — ') || 'Item',\n ...(line.sku ? { sku: line.sku } : {}),\n quantity: state.quantity,\n quantityUnshipped: state.remainingQuantity,\n unitValueCents: Math.max(0, Math.round(Number(line.unitAmountCents ?? 0))),\n ...(Number(variant?.weightGrams) > 0 ? { weightGrams: Number(variant?.weightGrams) } : {}),\n ...(dims ?? {}),\n ...(facts?.hsCode ? { hsCode: facts.hsCode } : {}),\n ...(facts?.originCountry ? { originCountry: facts.originCountry } : {}),\n })\n })\n return {\n hostId,\n recordId: orderId,\n displayRef: order.number ? `#${order.number}` : `#${orderId.slice(0, 8)}`,\n status: order.status,\n shippable: SHIPPABLE.has(order.status),\n currency: 'usd',\n ...(toPluginAddress(order.shippingAddress)\n ? {\n shipTo: {\n ...toPluginAddress(order.shippingAddress),\n ...(!order.shippingAddress?.name && order.customerName ? { name: order.customerName } : {}),\n } as NonNullable<PluginShippableRecord['shipTo']>,\n }\n : {}),\n ...(order.customerEmail ? { customerEmail: order.customerEmail } : {}),\n lines,\n shipments: (order.fulfillments ?? [])\n .filter((fulfillment) => CommerceModel.fulfillmentIsActive(fulfillment))\n .map((fulfillment) => ({\n id: fulfillment.id,\n ...(fulfillment.carrier ? { carrier: fulfillment.carrier } : {}),\n ...(fulfillment.trackingNumber ? { trackingNumber: fulfillment.trackingNumber } : {}),\n ...(fulfillment.trackingUrl ? { trackingUrl: fulfillment.trackingUrl } : {}),\n ...(fulfillment.labelRef ? { labelRef: fulfillment.labelRef } : {}),\n lineIndexes: fulfillment.lineItemIds ?? [],\n atMs: fulfillment.atMs,\n })),\n ...(order.createdAtMs ? { createdAtMs: order.createdAtMs } : {}),\n testMode: CommerceModel.orderIsTestMode({\n checkoutSessionId: order.checkoutSessionId,\n livemode: (order as unknown as { livemode?: unknown }).livemode,\n $id: orderId,\n }),\n }\n}\n\n/**\n * Records what the carrier says on the shipment it is about, once, and\n * moves the order to delivered when every parcel of a fully shipped order\n * has arrived — through `recordOrderShipment`, so the buyer's delivered email\n * is this plugin's to send.\n */\nexport async function recordShipmentTracking(update: {\n hostId: string\n recordId: string\n trackingNumber: string\n status: string\n detail?: string\n atMs: number\n}): Promise<PluginTrackingOutcome> {\n const orderRef = ordersOf(update.hostId).doc(update.recordId)\n const result = await firebaseAdmin\n .app()\n .firestore()\n .runTransaction(async (transaction) => {\n const snapshot = await transaction.get(orderRef)\n if (!snapshot.exists) return { outcome: 'no_such_record' as const }\n const order = CommerceModel.liftLegacyOrder((snapshot.data() ?? {}) as never)\n const fulfillments = [...(order.fulfillments ?? [])]\n const index = fulfillments.findIndex(\n (fulfillment) =>\n CommerceModel.fulfillmentIsActive(fulfillment) &&\n String(fulfillment.trackingNumber ?? '').trim().toUpperCase() ===\n update.trackingNumber.trim().toUpperCase(),\n )\n if (index < 0) return { outcome: 'no_such_shipment' as const }\n if (fulfillments[index].trackingStatus === update.status) {\n return { outcome: 'unchanged' as const, order, fulfillments }\n }\n fulfillments[index] = {\n ...fulfillments[index],\n trackingStatus: update.status,\n trackingStatusAtMs: update.atMs,\n }\n transaction.update(orderRef, {\n fulfillments,\n timeline: CommerceModel.appendOrderEvent(\n order,\n 'tracking',\n [CommerceModel.trackingStatusLabel(update.status), update.detail].filter(Boolean).join(': ').slice(0, 300),\n update.atMs,\n ),\n })\n return { outcome: 'recorded' as const, order, fulfillments }\n })\n if (result.outcome === 'no_such_record' || result.outcome === 'no_such_shipment') {\n return { outcome: result.outcome }\n }\n const everyDelivered = result.fulfillments\n .filter((fulfillment) => CommerceModel.fulfillmentIsActive(fulfillment) && fulfillment.trackingNumber)\n .every((fulfillment) => fulfillment.trackingStatus === 'delivered')\n if (update.status === 'delivered' && everyDelivered && result.order.status === 'fulfilled') {\n await recordOrderShipment({ hostId: update.hostId, orderId: update.recordId, to: 'delivered' })\n }\n return { outcome: result.outcome }\n}\n\n/** The site's locations that have a postal address complete enough to ship from. */\nexport async function readShipFromAddresses(hostId: string): Promise<PluginShipFromAddress[]> {\n const snapshot = await firebaseAdmin\n .app()\n .firestore()\n .collection('hosts')\n .doc(hostId)\n .collection('locations')\n .limit(50)\n .get()\n const places: PluginShipFromAddress[] = []\n for (const doc of snapshot.docs) {\n const location = doc.data() as CommerceModel.InventoryLocation\n const address = CommerceModel.normalizePostalAddress(location.postalAddress)\n if (!address?.country || !address.line1 || !address.city || !address.postalCode) continue\n places.push({\n id: doc.id,\n name: String(location.name ?? 'Location'),\n address: { ...address, country: address.country, name: String(location.name ?? '') },\n })\n }\n return places.sort((a, b) => a.name.localeCompare(b.name))\n}\n\nexport const commerceShipmentRecords: PluginShipmentRecords = {\n read: readShippableOrder,\n async recordShipment(write) {\n const outcome = await recordOrderShipment({\n hostId: write.hostId,\n orderId: write.recordId,\n to: 'fulfilled',\n carrier: write.carrier,\n trackingNumber: write.trackingNumber,\n ...(write.lines?.length\n ? { lineItems: write.lines.map((line) => ({ lineItemId: line.lineIndex, quantity: line.quantity })) }\n : {}),\n ...(write.trackingUrl ? { trackingUrl: write.trackingUrl } : {}),\n ...(write.labelUrl ? { labelUrl: write.labelUrl } : {}),\n ...(write.labelRef ? { labelRef: write.labelRef, idempotencyKey: `label:${write.labelRef}` } : {}),\n })\n switch (outcome.outcome) {\n case 'recorded':\n return { outcome: 'recorded', shipmentId: outcome.fulfillment?.id ?? '' }\n case 'already':\n return { outcome: 'already', ...(outcome.fulfillment ? { shipmentId: outcome.fulfillment.id } : {}) }\n case 'no_such_order':\n return { outcome: 'no_such_record' }\n case 'blocked':\n return { outcome: 'blocked', from: outcome.from }\n default:\n return { outcome: 'blocked', from: 'invalid', reason: outcome.message }\n }\n },\n recordTracking: recordShipmentTracking,\n shipFromAddresses: readShipFromAddresses,\n}\n"],"names":["firebaseAdmin","CommerceModel","recordOrderShipment","ordersOf","hostId","app","firestore","collection","doc","SHIPPABLE","Set","toPluginAddress","address","country","String","trim","toUpperCase","test","undefined","name","line1","line2","city","state","postalCode","phone","readShippableOrder","orderId","snapshot","order","get","exists","liftLegacyOrder","data","states","orderLineFulfillmentStates","productIds","lineItems","map","line","productId","filter","Boolean","products","Map","Promise","all","product","catch","set","liftLegacyProduct","lines","forEach","index","requiresShipping","variant","variants","find","one","id","variantId","facts","shipping","dims","productParcelDimensions","push","lineIndex","variantLabel","join","sku","quantity","quantityUnshipped","remainingQuantity","unitValueCents","Math","max","round","Number","unitAmountCents","weightGrams","hsCode","originCountry","recordId","displayRef","number","slice","status","shippable","has","currency","shippingAddress","shipTo","customerName","customerEmail","shipments","fulfillments","fulfillment","fulfillmentIsActive","carrier","trackingNumber","trackingUrl","labelRef","lineIndexes","lineItemIds","atMs","createdAtMs","testMode","orderIsTestMode","checkoutSessionId","livemode","$id","recordShipmentTracking","update","orderRef","result","runTransaction","transaction","outcome","findIndex","trackingStatus","trackingStatusAtMs","timeline","appendOrderEvent","trackingStatusLabel","detail","everyDelivered","every","to","readShipFromAddresses","limit","places","docs","location","normalizePostalAddress","postalAddress","sort","a","b","localeCompare","commerceShipmentRecords","read","recordShipment","write","length","lineItemId","labelUrl","idempotencyKey","shipmentId","from","reason","message","recordTracking","shipFromAddresses"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /** SHA-256 hex of a secret or a body. */
18
+ export declare function digestSecret(secret: string): string;
19
+ /** A plain-text answer: the shipping apps show the body of a refusal to the merchant. */
20
+ export declare function connectorText(status: number, body: string, headers?: Record<string, string>): Response;
21
+ /**
22
+ * Whether the request arrived over HTTPS. Behind Vercel the transport is
23
+ * stated by `x-forwarded-proto`; a local or test run (`NODE_ENV` not
24
+ * production) is not held to it.
25
+ */
26
+ export declare function requestIsSecure(request: Request, env?: Record<string, string | undefined>): boolean;
27
+ /** A site id as a document id may hold it. */
28
+ export declare const CONNECTOR_HOST_ID: RegExp;
29
+ /** The `:hostId` a connector route was called with, or `null` when it is not one. */
30
+ export declare function connectorHostIdOf(params: Record<string, string | string[]>): string | null;
31
+ /**
32
+ * The gates a dispatcher would have asked, for a site whose connector proved
33
+ * itself: commerce switched on for it, on the plan, released for the org, and
34
+ * the site not locked down. `null` when every one passes. `request` is the
35
+ * call being answered, or `{ method: 'POST' }` for a push the platform makes
36
+ * on its own, which a read-only lockdown refuses like any write.
37
+ */
38
+ export declare function connectorSiteRefusal(request: {
39
+ method?: string;
40
+ }, hostId: string): Promise<Response | null>;