@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,103 @@
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 { HostOrder, OrderStatus } from './commerce-orders';
18
+ /**
19
+ * What the guest order-status page shows (AGL-3610): the ONE projection of an
20
+ * order that leaves the server for a visitor holding a signed link.
21
+ *
22
+ * Allow-listed, never spread: an order document carries the buyer's email,
23
+ * phone and addresses, Stripe ids, risk signals and the merchant's notes, and
24
+ * a forwarded link must disclose no more than the email it arrived in. Every
25
+ * field below is one the buyer's own receipt or shipping email already
26
+ * states. New fields are added here deliberately, or not at all.
27
+ */
28
+ export interface OrderStatusLine {
29
+ name: string;
30
+ variantLabel: string | null;
31
+ quantity: number;
32
+ amountCents: number;
33
+ /** Units of this line in an active shipment. */
34
+ shippedQuantity: number;
35
+ refunded: boolean;
36
+ }
37
+ export interface OrderStatusShipment {
38
+ id: string;
39
+ atMs: number;
40
+ carrier: string | null;
41
+ trackingNumber: string | null;
42
+ trackingUrl: string | null;
43
+ lines: Array<{
44
+ name: string;
45
+ quantity: number;
46
+ }>;
47
+ }
48
+ export interface OrderStatusStep {
49
+ key: 'placed' | 'paid' | 'shipped' | 'delivered' | 'cancelled' | 'refunded';
50
+ label: string;
51
+ atMs: number | null;
52
+ done: boolean;
53
+ }
54
+ /**
55
+ * Something the buyer can do from the page — "Request a return" is the case
56
+ * the order-processing lane (AGL-3611) adds through
57
+ * `registerOrderStatusActions` on the server. The page renders each as a
58
+ * button to `url`; it knows nothing of what the action is.
59
+ */
60
+ export interface OrderStatusAction {
61
+ id: string;
62
+ label: string;
63
+ url: string;
64
+ }
65
+ export interface OrderStatusView {
66
+ storeName: string;
67
+ number: string;
68
+ status: OrderStatus;
69
+ /** The status as a buyer reads it. */
70
+ statusLabel: string;
71
+ createdAtMs: number | null;
72
+ currency: string;
73
+ lines: OrderStatusLine[];
74
+ totals: {
75
+ itemsCents: number;
76
+ shippingCents: number;
77
+ taxCents: number;
78
+ discountCents: number;
79
+ totalCents: number;
80
+ refundedCents: number;
81
+ };
82
+ /**
83
+ * Optional lines the buyer took at checkout (AGL-3635) — "Package
84
+ * protection" — by the name and price their receipt states. Optional so
85
+ * an answer from before this field reads as none.
86
+ */
87
+ extras?: Array<{
88
+ label: string;
89
+ amountCents: number;
90
+ }>;
91
+ shipments: OrderStatusShipment[];
92
+ steps: OrderStatusStep[];
93
+ actions: OrderStatusAction[];
94
+ }
95
+ /** Builds the public projection. Pure; the caller has verified the link. */
96
+ export declare function buildOrderStatusView(input: {
97
+ order: HostOrder;
98
+ orderId: string;
99
+ storeName: string;
100
+ currency?: string;
101
+ number: string;
102
+ actions?: OrderStatusAction[];
103
+ }): OrderStatusView;
@@ -0,0 +1,156 @@
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 { fulfillmentIsActive, fulfillmentLineQuantities } from "./order-fulfillment.js";
17
+ import { carrierLabelFor, fulfillmentTrackingUrl } from "./tracking-url.js";
18
+ const STATUS_LABELS = {
19
+ pending: 'Awaiting payment',
20
+ paid: 'Confirmed',
21
+ partially_fulfilled: 'Partly shipped',
22
+ fulfilled: 'Shipped',
23
+ delivered: 'Delivered',
24
+ cancelled: 'Canceled',
25
+ refunded: 'Refunded'
26
+ };
27
+ function eventAt(order, ...events) {
28
+ var _order_timeline;
29
+ const found = ((_order_timeline = order.timeline) != null ? _order_timeline : []).find((entry)=>{
30
+ var _ref;
31
+ return events.includes(String((_ref = entry == null ? void 0 : entry.event) != null ? _ref : ''));
32
+ });
33
+ return found ? Number(found.atMs) || null : null;
34
+ }
35
+ /** Builds the public projection. Pure; the caller has verified the link. */ export function buildOrderStatusView(input) {
36
+ var _order_lineItems, _order_fulfillments, _order_refundedLineItemIds, _ref, _order_amountCents, _eventAt, _ref1, _STATUS_LABELS_status, _ref2, _ref3, _ref4, _ref5, _order_refundedCents, _order_extras, _input_actions;
37
+ var _shipments_;
38
+ const { order } = input;
39
+ const lineItems = (_order_lineItems = order.lineItems) != null ? _order_lineItems : [];
40
+ const active = ((_order_fulfillments = order.fulfillments) != null ? _order_fulfillments : []).filter(fulfillmentIsActive);
41
+ const shippedByLine = new Map();
42
+ const shipments = active.map((fulfillment)=>{
43
+ var _fulfillment_id, _fulfillment_trackingNumber;
44
+ const quantities = fulfillmentLineQuantities(order, fulfillment);
45
+ for (const entry of quantities){
46
+ var _shippedByLine_get;
47
+ shippedByLine.set(entry.lineItemId, ((_shippedByLine_get = shippedByLine.get(entry.lineItemId)) != null ? _shippedByLine_get : 0) + entry.quantity);
48
+ }
49
+ return {
50
+ id: String((_fulfillment_id = fulfillment.id) != null ? _fulfillment_id : ''),
51
+ atMs: Number(fulfillment.atMs) || 0,
52
+ carrier: fulfillment.carrier ? carrierLabelFor(fulfillment.carrier) : null,
53
+ trackingNumber: (_fulfillment_trackingNumber = fulfillment.trackingNumber) != null ? _fulfillment_trackingNumber : null,
54
+ trackingUrl: fulfillmentTrackingUrl(fulfillment),
55
+ lines: quantities.map((entry)=>{
56
+ var _ref;
57
+ var _lineItems_entry_lineItemId;
58
+ return {
59
+ name: String((_ref = (_lineItems_entry_lineItemId = lineItems[entry.lineItemId]) == null ? void 0 : _lineItems_entry_lineItemId.name) != null ? _ref : 'Item'),
60
+ quantity: entry.quantity
61
+ };
62
+ })
63
+ };
64
+ }).sort((a, b)=>a.atMs - b.atMs);
65
+ const refundedLines = new Set((_order_refundedLineItemIds = order.refundedLineItemIds) != null ? _order_refundedLineItemIds : []);
66
+ const lines = lineItems.map((line, index)=>{
67
+ var _line_name, _line_variantLabel, _shippedByLine_get;
68
+ return {
69
+ name: String((_line_name = line.name) != null ? _line_name : 'Item'),
70
+ variantLabel: (_line_variantLabel = line.variantLabel) != null ? _line_variantLabel : null,
71
+ quantity: Number(line.quantity) || 0,
72
+ amountCents: (Number(line.unitAmountCents) || 0) * (Number(line.quantity) || 0),
73
+ shippedQuantity: Math.min(Number(line.quantity) || 0, (_shippedByLine_get = shippedByLine.get(index)) != null ? _shippedByLine_get : 0),
74
+ refunded: refundedLines.has(index)
75
+ };
76
+ });
77
+ const totals = order.totals;
78
+ const totalCents = (_ref = totals == null ? void 0 : totals.totalCents) != null ? _ref : Number((_order_amountCents = order.amountCents) != null ? _order_amountCents : 0);
79
+ const status = order.status;
80
+ const createdAtMs = Number(order.createdAtMs) || null;
81
+ const paidAtMs = (_eventAt = eventAt(order, 'paid')) != null ? _eventAt : status !== 'pending' ? createdAtMs : null;
82
+ const firstShipAt = (_ref1 = (_shipments_ = shipments[0]) == null ? void 0 : _shipments_.atMs) != null ? _ref1 : eventAt(order, 'fulfilled', 'partially_fulfilled');
83
+ const deliveredAt = eventAt(order, 'delivered');
84
+ const steps = [
85
+ {
86
+ key: 'placed',
87
+ label: 'Order placed',
88
+ atMs: createdAtMs,
89
+ done: true
90
+ },
91
+ {
92
+ key: 'paid',
93
+ label: 'Payment confirmed',
94
+ atMs: paidAtMs,
95
+ done: status !== 'pending' && paidAtMs !== null
96
+ }
97
+ ];
98
+ if (status === 'cancelled') {
99
+ steps.push({
100
+ key: 'cancelled',
101
+ label: 'Canceled',
102
+ atMs: eventAt(order, 'cancelled'),
103
+ done: true
104
+ });
105
+ } else {
106
+ steps.push({
107
+ key: 'shipped',
108
+ label: status === 'partially_fulfilled' ? 'Partly shipped' : 'Shipped',
109
+ atMs: firstShipAt,
110
+ done: [
111
+ 'partially_fulfilled',
112
+ 'fulfilled',
113
+ 'delivered'
114
+ ].includes(status) || shipments.length > 0
115
+ }, {
116
+ key: 'delivered',
117
+ label: 'Delivered',
118
+ atMs: deliveredAt,
119
+ done: status === 'delivered' || deliveredAt !== null
120
+ });
121
+ }
122
+ if (status === 'refunded') {
123
+ steps.push({
124
+ key: 'refunded',
125
+ label: 'Refunded',
126
+ atMs: eventAt(order, 'refund'),
127
+ done: true
128
+ });
129
+ }
130
+ return {
131
+ storeName: input.storeName,
132
+ number: input.number,
133
+ status,
134
+ statusLabel: (_STATUS_LABELS_status = STATUS_LABELS[status]) != null ? _STATUS_LABELS_status : 'Confirmed',
135
+ createdAtMs,
136
+ currency: input.currency || 'USD',
137
+ lines,
138
+ totals: {
139
+ itemsCents: (_ref2 = totals == null ? void 0 : totals.itemsCents) != null ? _ref2 : lines.reduce((sum, line)=>sum + line.amountCents, 0),
140
+ shippingCents: (_ref3 = totals == null ? void 0 : totals.shippingCents) != null ? _ref3 : 0,
141
+ taxCents: (_ref4 = totals == null ? void 0 : totals.taxCents) != null ? _ref4 : 0,
142
+ discountCents: (_ref5 = totals == null ? void 0 : totals.discountCents) != null ? _ref5 : 0,
143
+ totalCents,
144
+ refundedCents: Number((_order_refundedCents = order.refundedCents) != null ? _order_refundedCents : 0) || 0
145
+ },
146
+ extras: ((_order_extras = order.extras) != null ? _order_extras : []).filter((extra)=>extra && Number(extra.amountCents) > 0).map((extra)=>({
147
+ label: String(extra.label || 'Extra'),
148
+ amountCents: Number(extra.amountCents)
149
+ })),
150
+ shipments,
151
+ steps,
152
+ actions: (_input_actions = input.actions) != null ? _input_actions : []
153
+ };
154
+ }
155
+
156
+ //# sourceMappingURL=order-status-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/model/order-status-view.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 { HostOrder, OrderStatus } from './commerce-orders'\nimport { fulfillmentIsActive, fulfillmentLineQuantities } from './order-fulfillment'\nimport { carrierLabelFor, fulfillmentTrackingUrl } from './tracking-url'\n\n/**\n * What the guest order-status page shows (AGL-3610): the ONE projection of an\n * order that leaves the server for a visitor holding a signed link.\n *\n * Allow-listed, never spread: an order document carries the buyer's email,\n * phone and addresses, Stripe ids, risk signals and the merchant's notes, and\n * a forwarded link must disclose no more than the email it arrived in. Every\n * field below is one the buyer's own receipt or shipping email already\n * states. New fields are added here deliberately, or not at all.\n */\nexport interface OrderStatusLine {\n name: string\n variantLabel: string | null\n quantity: number\n amountCents: number\n /** Units of this line in an active shipment. */\n shippedQuantity: number\n refunded: boolean\n}\n\nexport interface OrderStatusShipment {\n id: string\n atMs: number\n carrier: string | null\n trackingNumber: string | null\n trackingUrl: string | null\n lines: Array<{ name: string; quantity: number }>\n}\n\nexport interface OrderStatusStep {\n key: 'placed' | 'paid' | 'shipped' | 'delivered' | 'cancelled' | 'refunded'\n label: string\n atMs: number | null\n done: boolean\n}\n\n/**\n * Something the buyer can do from the page — \"Request a return\" is the case\n * the order-processing lane (AGL-3611) adds through\n * `registerOrderStatusActions` on the server. The page renders each as a\n * button to `url`; it knows nothing of what the action is.\n */\nexport interface OrderStatusAction {\n id: string\n label: string\n url: string\n}\n\nexport interface OrderStatusView {\n storeName: string\n number: string\n status: OrderStatus\n /** The status as a buyer reads it. */\n statusLabel: string\n createdAtMs: number | null\n currency: string\n lines: OrderStatusLine[]\n totals: {\n itemsCents: number\n shippingCents: number\n taxCents: number\n discountCents: number\n totalCents: number\n refundedCents: number\n }\n /**\n * Optional lines the buyer took at checkout (AGL-3635) — \"Package\n * protection\" — by the name and price their receipt states. Optional so\n * an answer from before this field reads as none.\n */\n extras?: Array<{ label: string; amountCents: number }>\n shipments: OrderStatusShipment[]\n steps: OrderStatusStep[]\n actions: OrderStatusAction[]\n}\n\nconst STATUS_LABELS: Record<OrderStatus, string> = {\n pending: 'Awaiting payment',\n paid: 'Confirmed',\n partially_fulfilled: 'Partly shipped',\n fulfilled: 'Shipped',\n delivered: 'Delivered',\n cancelled: 'Canceled',\n refunded: 'Refunded',\n}\n\nfunction eventAt(order: HostOrder, ...events: string[]): number | null {\n const found = (order.timeline ?? []).find((entry) =>\n events.includes(String(entry?.event ?? '')),\n )\n return found ? Number(found.atMs) || null : null\n}\n\n/** Builds the public projection. Pure; the caller has verified the link. */\nexport function buildOrderStatusView(input: {\n order: HostOrder\n orderId: string\n storeName: string\n currency?: string\n number: string\n actions?: OrderStatusAction[]\n}): OrderStatusView {\n const { order } = input\n const lineItems = order.lineItems ?? []\n const active = (order.fulfillments ?? []).filter(fulfillmentIsActive)\n const shippedByLine = new Map<number, number>()\n const shipments: OrderStatusShipment[] = active\n .map((fulfillment) => {\n const quantities = fulfillmentLineQuantities(order, fulfillment)\n for (const entry of quantities) {\n shippedByLine.set(\n entry.lineItemId,\n (shippedByLine.get(entry.lineItemId) ?? 0) + entry.quantity,\n )\n }\n return {\n id: String(fulfillment.id ?? ''),\n atMs: Number(fulfillment.atMs) || 0,\n carrier: fulfillment.carrier ? carrierLabelFor(fulfillment.carrier) : null,\n trackingNumber: fulfillment.trackingNumber ?? null,\n trackingUrl: fulfillmentTrackingUrl(fulfillment),\n lines: quantities.map((entry) => ({\n name: String(lineItems[entry.lineItemId]?.name ?? 'Item'),\n quantity: entry.quantity,\n })),\n }\n })\n .sort((a, b) => a.atMs - b.atMs)\n const refundedLines = new Set(order.refundedLineItemIds ?? [])\n const lines: OrderStatusLine[] = lineItems.map((line, index) => ({\n name: String(line.name ?? 'Item'),\n variantLabel: line.variantLabel ?? null,\n quantity: Number(line.quantity) || 0,\n amountCents: (Number(line.unitAmountCents) || 0) * (Number(line.quantity) || 0),\n shippedQuantity: Math.min(Number(line.quantity) || 0, shippedByLine.get(index) ?? 0),\n refunded: refundedLines.has(index),\n }))\n const totals = order.totals\n const totalCents = totals?.totalCents ?? Number(order.amountCents ?? 0)\n const status = order.status\n const createdAtMs = Number(order.createdAtMs) || null\n const paidAtMs = eventAt(order, 'paid') ?? (status !== 'pending' ? createdAtMs : null)\n const firstShipAt = shipments[0]?.atMs ?? eventAt(order, 'fulfilled', 'partially_fulfilled')\n const deliveredAt = eventAt(order, 'delivered')\n const steps: OrderStatusStep[] = [\n { key: 'placed', label: 'Order placed', atMs: createdAtMs, done: true },\n {\n key: 'paid',\n label: 'Payment confirmed',\n atMs: paidAtMs,\n done: status !== 'pending' && paidAtMs !== null,\n },\n ]\n if (status === 'cancelled') {\n steps.push({ key: 'cancelled', label: 'Canceled', atMs: eventAt(order, 'cancelled'), done: true })\n } else {\n steps.push(\n {\n key: 'shipped',\n label: status === 'partially_fulfilled' ? 'Partly shipped' : 'Shipped',\n atMs: firstShipAt,\n done: ['partially_fulfilled', 'fulfilled', 'delivered'].includes(status) ||\n shipments.length > 0,\n },\n {\n key: 'delivered',\n label: 'Delivered',\n atMs: deliveredAt,\n done: status === 'delivered' || deliveredAt !== null,\n },\n )\n }\n if (status === 'refunded') {\n steps.push({ key: 'refunded', label: 'Refunded', atMs: eventAt(order, 'refund'), done: true })\n }\n return {\n storeName: input.storeName,\n number: input.number,\n status,\n statusLabel: STATUS_LABELS[status] ?? 'Confirmed',\n createdAtMs,\n currency: input.currency || 'USD',\n lines,\n totals: {\n itemsCents: totals?.itemsCents ?? lines.reduce((sum, line) => sum + line.amountCents, 0),\n shippingCents: totals?.shippingCents ?? 0,\n taxCents: totals?.taxCents ?? 0,\n discountCents: totals?.discountCents ?? 0,\n totalCents,\n refundedCents: Number(order.refundedCents ?? 0) || 0,\n },\n extras: (order.extras ?? [])\n .filter((extra) => extra && Number(extra.amountCents) > 0)\n .map((extra) => ({ label: String(extra.label || 'Extra'), amountCents: Number(extra.amountCents) })),\n shipments,\n steps,\n actions: input.actions ?? [],\n }\n}\n"],"names":["fulfillmentIsActive","fulfillmentLineQuantities","carrierLabelFor","fulfillmentTrackingUrl","STATUS_LABELS","pending","paid","partially_fulfilled","fulfilled","delivered","cancelled","refunded","eventAt","order","events","found","timeline","find","entry","includes","String","event","Number","atMs","buildOrderStatusView","input","shipments","lineItems","active","fulfillments","filter","shippedByLine","Map","map","fulfillment","quantities","set","lineItemId","get","quantity","id","carrier","trackingNumber","trackingUrl","lines","name","sort","a","b","refundedLines","Set","refundedLineItemIds","line","index","variantLabel","amountCents","unitAmountCents","shippedQuantity","Math","min","has","totals","totalCents","status","createdAtMs","paidAtMs","firstShipAt","deliveredAt","steps","key","label","done","push","length","storeName","number","statusLabel","currency","itemsCents","reduce","sum","shippingCents","taxCents","discountCents","refundedCents","extras","extra","actions"],"mappings":"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"}
@@ -0,0 +1,142 @@
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 CommerceEventName } from './order-events';
18
+ /**
19
+ * Merchant order webhooks (AGL-3611): endpoints a store adds so its own
20
+ * systems hear about orders — an ERP, a warehouse, a spreadsheet script.
21
+ *
22
+ * Three collections under the site, every one written only by
23
+ * `/api/commerce/order-webhooks` and by the event subscriber:
24
+ *
25
+ * - `orderWebhooks/{id}`: the endpoint — its URL, the events it takes,
26
+ * whether it is on, and the last few characters of its secret so a person
27
+ * can tell two apart. Read by the order book's readers.
28
+ * - `orderWebhookSecrets/{id}`: the signing secret, sealed with the shared
29
+ * secret box. No client reads it; the merchant sees the secret once, when
30
+ * it is made or rolled.
31
+ * - `orderWebhookDeliveries/{id}`: the delivery log, one row per event per
32
+ * endpoint, with each attempt's status. Read by the order book's readers.
33
+ *
34
+ * Each event commerce raises reaches each endpoint that takes it AT LEAST
35
+ * ONCE, through the plugin event outbox, which retries with backoff. A
36
+ * receiver dedupes on the `Aglyn-Event-Id` header, which is the same on every
37
+ * attempt.
38
+ */
39
+ /** `hosts/{hostId}/orderWebhooks/{id}`. */
40
+ export interface OrderWebhookEndpoint {
41
+ url: string;
42
+ /** The event names this endpoint takes. */
43
+ events: CommerceEventName[];
44
+ enabled: boolean;
45
+ /** An optional label, e.g. "Warehouse". */
46
+ description?: string;
47
+ /** The secret's last four characters, to tell secrets apart. */
48
+ secretHint: string;
49
+ /** Deliveries that failed in a row; any success resets it. */
50
+ consecutiveFailures: number;
51
+ lastDeliveryAtMs?: number;
52
+ lastDeliveryStatus?: OrderWebhookDeliveryStatus;
53
+ createdAtMs: number;
54
+ updatedAtMs: number;
55
+ createdBy: string;
56
+ }
57
+ /** `hosts/{hostId}/orderWebhookSecrets/{id}`, Admin SDK only. */
58
+ export interface OrderWebhookSecretRecord {
59
+ /** The signing secret, sealed (`sealSecret`), bound to this endpoint. */
60
+ sealedSecret: string;
61
+ /** The id of the key that sealed it, for rotation. */
62
+ secretKeyId: string;
63
+ updatedAtMs: number;
64
+ }
65
+ export type OrderWebhookDeliveryStatus = 'delivered' | 'retrying' | 'failed';
66
+ /** One attempt at a delivery. */
67
+ export interface OrderWebhookAttempt {
68
+ atMs: number;
69
+ /** The receiver's HTTP status; `null` when no answer came back. */
70
+ httpStatus: number | null;
71
+ /** Why it failed, in words; absent on a success. */
72
+ error?: string;
73
+ durationMs: number;
74
+ }
75
+ /** `hosts/{hostId}/orderWebhookDeliveries/{eventId}__{endpointId}`. */
76
+ export interface OrderWebhookDelivery {
77
+ endpointId: string;
78
+ /** The event's id, the same on every attempt: `Aglyn-Event-Id`. */
79
+ eventId: string;
80
+ event: string;
81
+ /** The order the event is about. */
82
+ orderId: string | null;
83
+ status: OrderWebhookDeliveryStatus;
84
+ attempts: OrderWebhookAttempt[];
85
+ /** The JSON body as sent, so a resend sends the same bytes' meaning. */
86
+ body: string;
87
+ /** A test ping from the console rather than a real event. */
88
+ test?: boolean;
89
+ createdAtMs: number;
90
+ updatedAtMs: number;
91
+ }
92
+ /** A store may keep this many endpoints. */
93
+ export declare const ORDER_WEBHOOK_MAX_ENDPOINTS = 10;
94
+ /** A receiver has this long to answer before the attempt counts as failed. */
95
+ export declare const ORDER_WEBHOOK_TIMEOUT_MS = 8000;
96
+ /** Attempts a delivery row keeps; older ones fall off. */
97
+ export declare const ORDER_WEBHOOK_ATTEMPTS_KEPT = 10;
98
+ /** The most a stored body may hold; a longer one is stored cut, and sent whole. */
99
+ export declare const ORDER_WEBHOOK_BODY_MAX = 200000;
100
+ /** A signature is good this long after its timestamp, for a receiver checking it. */
101
+ export declare const ORDER_WEBHOOK_TOLERANCE_SECONDS = 300;
102
+ export declare const ORDER_WEBHOOK_SIGNATURE_HEADER = "Aglyn-Signature";
103
+ export declare const ORDER_WEBHOOK_EVENT_HEADER = "Aglyn-Event";
104
+ export declare const ORDER_WEBHOOK_EVENT_ID_HEADER = "Aglyn-Event-Id";
105
+ /** The ping the console's Send test event posts. */
106
+ export declare const ORDER_WEBHOOK_TEST_EVENT = "webhook.test";
107
+ /** The document id of one event's delivery to one endpoint. */
108
+ export declare function orderWebhookDeliveryId(eventId: string, endpointId: string): string;
109
+ /** The event names a merchant picked, cleaned: known names only, in list order. */
110
+ export declare function normalizeOrderWebhookEvents(raw: unknown): CommerceEventName[];
111
+ /** Whether an endpoint should be handed an event that happened at `occurredAtMs`. */
112
+ export declare function orderWebhookTakes(endpoint: Pick<OrderWebhookEndpoint, 'enabled' | 'events' | 'createdAtMs'>, event: string, occurredAtMs: number): boolean;
113
+ /** A 2xx is a delivery; anything else, a redirect included, is a failure. */
114
+ export declare function orderWebhookAccepted(httpStatus: number | null): boolean;
115
+ /** The string a signature covers: `{timestamp}.{body}`, as Stripe's does. */
116
+ export declare function orderWebhookSignedPayload(timestampSeconds: number, body: string): string;
117
+ /** The `Aglyn-Signature` header value: `t={timestamp},v1={hex HMAC-SHA256}`. */
118
+ export declare function formatOrderWebhookSignature(timestampSeconds: number, hexDigest: string): string;
119
+ /** Reads `t` and every `v1` from a signature header, for a receiver's check. */
120
+ export declare function parseOrderWebhookSignature(header: string): {
121
+ timestamp: number;
122
+ signatures: string[];
123
+ } | null;
124
+ /** The JSON a receiver is posted. `data` is the event's payload. */
125
+ export interface OrderWebhookBody {
126
+ id: string;
127
+ type: string;
128
+ createdAt: string;
129
+ siteId: string;
130
+ data: unknown;
131
+ }
132
+ export declare function orderWebhookBody(input: {
133
+ eventId: string;
134
+ event: string;
135
+ occurredAtMs: number;
136
+ hostId: string;
137
+ payload: unknown;
138
+ }): string;
139
+ /** Appends an attempt, keeping the latest few. */
140
+ export declare function appendOrderWebhookAttempt(attempts: readonly OrderWebhookAttempt[] | undefined, attempt: OrderWebhookAttempt): OrderWebhookAttempt[];
141
+ export declare const ORDER_WEBHOOK_DELIVERY_STATUS_LABELS: Record<OrderWebhookDeliveryStatus, string>;
142
+ export declare const ORDER_WEBHOOK_DELIVERY_STATUS_COLOR: Record<OrderWebhookDeliveryStatus, 'success' | 'warning' | 'error'>;
@@ -0,0 +1,91 @@
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 { COMMERCE_EVENT_NAMES } from "./order-events.js";
17
+ /** A store may keep this many endpoints. */ export const ORDER_WEBHOOK_MAX_ENDPOINTS = 10;
18
+ /** A receiver has this long to answer before the attempt counts as failed. */ export const ORDER_WEBHOOK_TIMEOUT_MS = 8000;
19
+ /** Attempts a delivery row keeps; older ones fall off. */ export const ORDER_WEBHOOK_ATTEMPTS_KEPT = 10;
20
+ /** The most a stored body may hold; a longer one is stored cut, and sent whole. */ export const ORDER_WEBHOOK_BODY_MAX = 200000;
21
+ /** A signature is good this long after its timestamp, for a receiver checking it. */ export const ORDER_WEBHOOK_TOLERANCE_SECONDS = 300;
22
+ export const ORDER_WEBHOOK_SIGNATURE_HEADER = 'Aglyn-Signature';
23
+ export const ORDER_WEBHOOK_EVENT_HEADER = 'Aglyn-Event';
24
+ export const ORDER_WEBHOOK_EVENT_ID_HEADER = 'Aglyn-Event-Id';
25
+ /** The ping the console's Send test event posts. */ export const ORDER_WEBHOOK_TEST_EVENT = 'webhook.test';
26
+ /** The document id of one event's delivery to one endpoint. */ export function orderWebhookDeliveryId(eventId, endpointId) {
27
+ return `${eventId}__${endpointId}`.replace(/\//g, '_').slice(0, 1400);
28
+ }
29
+ /** The event names a merchant picked, cleaned: known names only, in list order. */ export function normalizeOrderWebhookEvents(raw) {
30
+ const wanted = new Set(Array.isArray(raw) ? raw.map((value)=>String(value)) : []);
31
+ return COMMERCE_EVENT_NAMES.filter((name)=>wanted.has(name));
32
+ }
33
+ /** Whether an endpoint should be handed an event that happened at `occurredAtMs`. */ export function orderWebhookTakes(endpoint, event, occurredAtMs) {
34
+ var _endpoint_events;
35
+ if (!endpoint.enabled) return false;
36
+ if (!((_endpoint_events = endpoint.events) != null ? _endpoint_events : []).includes(event)) return false;
37
+ // An endpoint added after the fact does not receive it on a retry.
38
+ return !(Number(endpoint.createdAtMs) > occurredAtMs);
39
+ }
40
+ /** A 2xx is a delivery; anything else, a redirect included, is a failure. */ export function orderWebhookAccepted(httpStatus) {
41
+ return httpStatus !== null && httpStatus >= 200 && httpStatus < 300;
42
+ }
43
+ /** The string a signature covers: `{timestamp}.{body}`, as Stripe's does. */ export function orderWebhookSignedPayload(timestampSeconds, body) {
44
+ return `${timestampSeconds}.${body}`;
45
+ }
46
+ /** The `Aglyn-Signature` header value: `t={timestamp},v1={hex HMAC-SHA256}`. */ export function formatOrderWebhookSignature(timestampSeconds, hexDigest) {
47
+ return `t=${timestampSeconds},v1=${hexDigest}`;
48
+ }
49
+ /** Reads `t` and every `v1` from a signature header, for a receiver's check. */ export function parseOrderWebhookSignature(header) {
50
+ let timestamp = Number.NaN;
51
+ const signatures = [];
52
+ for (const part of String(header != null ? header : '').split(',')){
53
+ const [key, value] = part.split('=', 2).map((piece)=>piece.trim());
54
+ if (key === 't') timestamp = Number(value);
55
+ else if (key === 'v1' && value) signatures.push(value);
56
+ }
57
+ if (!Number.isInteger(timestamp) || signatures.length === 0) return null;
58
+ return {
59
+ timestamp,
60
+ signatures
61
+ };
62
+ }
63
+ export function orderWebhookBody(input) {
64
+ var _input_payload;
65
+ const body = {
66
+ id: input.eventId,
67
+ type: input.event,
68
+ createdAt: new Date(input.occurredAtMs).toISOString(),
69
+ siteId: input.hostId,
70
+ data: (_input_payload = input.payload) != null ? _input_payload : null
71
+ };
72
+ return JSON.stringify(body);
73
+ }
74
+ /** Appends an attempt, keeping the latest few. */ export function appendOrderWebhookAttempt(attempts, attempt) {
75
+ return [
76
+ ...attempts != null ? attempts : [],
77
+ attempt
78
+ ].slice(-ORDER_WEBHOOK_ATTEMPTS_KEPT);
79
+ }
80
+ export const ORDER_WEBHOOK_DELIVERY_STATUS_LABELS = {
81
+ delivered: 'Delivered',
82
+ retrying: 'Retrying',
83
+ failed: 'Failed'
84
+ };
85
+ export const ORDER_WEBHOOK_DELIVERY_STATUS_COLOR = {
86
+ delivered: 'success',
87
+ retrying: 'warning',
88
+ failed: 'error'
89
+ };
90
+
91
+ //# sourceMappingURL=order-webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/model/order-webhooks.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 { COMMERCE_EVENT_NAMES, type CommerceEventName } from './order-events'\n\n/**\n * Merchant order webhooks (AGL-3611): endpoints a store adds so its own\n * systems hear about orders — an ERP, a warehouse, a spreadsheet script.\n *\n * Three collections under the site, every one written only by\n * `/api/commerce/order-webhooks` and by the event subscriber:\n *\n * - `orderWebhooks/{id}`: the endpoint — its URL, the events it takes,\n * whether it is on, and the last few characters of its secret so a person\n * can tell two apart. Read by the order book's readers.\n * - `orderWebhookSecrets/{id}`: the signing secret, sealed with the shared\n * secret box. No client reads it; the merchant sees the secret once, when\n * it is made or rolled.\n * - `orderWebhookDeliveries/{id}`: the delivery log, one row per event per\n * endpoint, with each attempt's status. Read by the order book's readers.\n *\n * Each event commerce raises reaches each endpoint that takes it AT LEAST\n * ONCE, through the plugin event outbox, which retries with backoff. A\n * receiver dedupes on the `Aglyn-Event-Id` header, which is the same on every\n * attempt.\n */\n\n/** `hosts/{hostId}/orderWebhooks/{id}`. */\nexport interface OrderWebhookEndpoint {\n url: string\n /** The event names this endpoint takes. */\n events: CommerceEventName[]\n enabled: boolean\n /** An optional label, e.g. \"Warehouse\". */\n description?: string\n /** The secret's last four characters, to tell secrets apart. */\n secretHint: string\n /** Deliveries that failed in a row; any success resets it. */\n consecutiveFailures: number\n lastDeliveryAtMs?: number\n lastDeliveryStatus?: OrderWebhookDeliveryStatus\n createdAtMs: number\n updatedAtMs: number\n createdBy: string\n}\n\n/** `hosts/{hostId}/orderWebhookSecrets/{id}`, Admin SDK only. */\nexport interface OrderWebhookSecretRecord {\n /** The signing secret, sealed (`sealSecret`), bound to this endpoint. */\n sealedSecret: string\n /** The id of the key that sealed it, for rotation. */\n secretKeyId: string\n updatedAtMs: number\n}\n\nexport type OrderWebhookDeliveryStatus = 'delivered' | 'retrying' | 'failed'\n\n/** One attempt at a delivery. */\nexport interface OrderWebhookAttempt {\n atMs: number\n /** The receiver's HTTP status; `null` when no answer came back. */\n httpStatus: number | null\n /** Why it failed, in words; absent on a success. */\n error?: string\n durationMs: number\n}\n\n/** `hosts/{hostId}/orderWebhookDeliveries/{eventId}__{endpointId}`. */\nexport interface OrderWebhookDelivery {\n endpointId: string\n /** The event's id, the same on every attempt: `Aglyn-Event-Id`. */\n eventId: string\n event: string\n /** The order the event is about. */\n orderId: string | null\n status: OrderWebhookDeliveryStatus\n attempts: OrderWebhookAttempt[]\n /** The JSON body as sent, so a resend sends the same bytes' meaning. */\n body: string\n /** A test ping from the console rather than a real event. */\n test?: boolean\n createdAtMs: number\n updatedAtMs: number\n}\n\n/** A store may keep this many endpoints. */\nexport const ORDER_WEBHOOK_MAX_ENDPOINTS = 10\n\n/** A receiver has this long to answer before the attempt counts as failed. */\nexport const ORDER_WEBHOOK_TIMEOUT_MS = 8_000\n\n/** Attempts a delivery row keeps; older ones fall off. */\nexport const ORDER_WEBHOOK_ATTEMPTS_KEPT = 10\n\n/** The most a stored body may hold; a longer one is stored cut, and sent whole. */\nexport const ORDER_WEBHOOK_BODY_MAX = 200_000\n\n/** A signature is good this long after its timestamp, for a receiver checking it. */\nexport const ORDER_WEBHOOK_TOLERANCE_SECONDS = 300\n\nexport const ORDER_WEBHOOK_SIGNATURE_HEADER = 'Aglyn-Signature'\nexport const ORDER_WEBHOOK_EVENT_HEADER = 'Aglyn-Event'\nexport const ORDER_WEBHOOK_EVENT_ID_HEADER = 'Aglyn-Event-Id'\n\n/** The ping the console's Send test event posts. */\nexport const ORDER_WEBHOOK_TEST_EVENT = 'webhook.test'\n\n/** The document id of one event's delivery to one endpoint. */\nexport function orderWebhookDeliveryId(eventId: string, endpointId: string): string {\n return `${eventId}__${endpointId}`.replace(/\\//g, '_').slice(0, 1400)\n}\n\n/** The event names a merchant picked, cleaned: known names only, in list order. */\nexport function normalizeOrderWebhookEvents(raw: unknown): CommerceEventName[] {\n const wanted = new Set(Array.isArray(raw) ? (raw as unknown[]).map((value) => String(value)) : [])\n return COMMERCE_EVENT_NAMES.filter((name) => wanted.has(name))\n}\n\n/** Whether an endpoint should be handed an event that happened at `occurredAtMs`. */\nexport function orderWebhookTakes(\n endpoint: Pick<OrderWebhookEndpoint, 'enabled' | 'events' | 'createdAtMs'>,\n event: string,\n occurredAtMs: number,\n): boolean {\n if (!endpoint.enabled) return false\n if (!(endpoint.events ?? []).includes(event as CommerceEventName)) return false\n // An endpoint added after the fact does not receive it on a retry.\n return !(Number(endpoint.createdAtMs) > occurredAtMs)\n}\n\n/** A 2xx is a delivery; anything else, a redirect included, is a failure. */\nexport function orderWebhookAccepted(httpStatus: number | null): boolean {\n return httpStatus !== null && httpStatus >= 200 && httpStatus < 300\n}\n\n/** The string a signature covers: `{timestamp}.{body}`, as Stripe's does. */\nexport function orderWebhookSignedPayload(timestampSeconds: number, body: string): string {\n return `${timestampSeconds}.${body}`\n}\n\n/** The `Aglyn-Signature` header value: `t={timestamp},v1={hex HMAC-SHA256}`. */\nexport function formatOrderWebhookSignature(timestampSeconds: number, hexDigest: string): string {\n return `t=${timestampSeconds},v1=${hexDigest}`\n}\n\n/** Reads `t` and every `v1` from a signature header, for a receiver's check. */\nexport function parseOrderWebhookSignature(header: string): { timestamp: number; signatures: string[] } | null {\n let timestamp = Number.NaN\n const signatures: string[] = []\n for (const part of String(header ?? '').split(',')) {\n const [key, value] = part.split('=', 2).map((piece) => piece.trim())\n if (key === 't') timestamp = Number(value)\n else if (key === 'v1' && value) signatures.push(value)\n }\n if (!Number.isInteger(timestamp) || signatures.length === 0) return null\n return { timestamp, signatures }\n}\n\n/** The JSON a receiver is posted. `data` is the event's payload. */\nexport interface OrderWebhookBody {\n id: string\n type: string\n createdAt: string\n siteId: string\n data: unknown\n}\n\nexport function orderWebhookBody(input: {\n eventId: string\n event: string\n occurredAtMs: number\n hostId: string\n payload: unknown\n}): string {\n const body: OrderWebhookBody = {\n id: input.eventId,\n type: input.event,\n createdAt: new Date(input.occurredAtMs).toISOString(),\n siteId: input.hostId,\n data: input.payload ?? null,\n }\n return JSON.stringify(body)\n}\n\n/** Appends an attempt, keeping the latest few. */\nexport function appendOrderWebhookAttempt(\n attempts: readonly OrderWebhookAttempt[] | undefined,\n attempt: OrderWebhookAttempt,\n): OrderWebhookAttempt[] {\n return [...(attempts ?? []), attempt].slice(-ORDER_WEBHOOK_ATTEMPTS_KEPT)\n}\n\nexport const ORDER_WEBHOOK_DELIVERY_STATUS_LABELS: Record<OrderWebhookDeliveryStatus, string> = {\n delivered: 'Delivered',\n retrying: 'Retrying',\n failed: 'Failed',\n}\n\nexport const ORDER_WEBHOOK_DELIVERY_STATUS_COLOR: Record<OrderWebhookDeliveryStatus, 'success' | 'warning' | 'error'> = {\n delivered: 'success',\n retrying: 'warning',\n failed: 'error',\n}\n"],"names":["COMMERCE_EVENT_NAMES","ORDER_WEBHOOK_MAX_ENDPOINTS","ORDER_WEBHOOK_TIMEOUT_MS","ORDER_WEBHOOK_ATTEMPTS_KEPT","ORDER_WEBHOOK_BODY_MAX","ORDER_WEBHOOK_TOLERANCE_SECONDS","ORDER_WEBHOOK_SIGNATURE_HEADER","ORDER_WEBHOOK_EVENT_HEADER","ORDER_WEBHOOK_EVENT_ID_HEADER","ORDER_WEBHOOK_TEST_EVENT","orderWebhookDeliveryId","eventId","endpointId","replace","slice","normalizeOrderWebhookEvents","raw","wanted","Set","Array","isArray","map","value","String","filter","name","has","orderWebhookTakes","endpoint","event","occurredAtMs","enabled","events","includes","Number","createdAtMs","orderWebhookAccepted","httpStatus","orderWebhookSignedPayload","timestampSeconds","body","formatOrderWebhookSignature","hexDigest","parseOrderWebhookSignature","header","timestamp","NaN","signatures","part","split","key","piece","trim","push","isInteger","length","orderWebhookBody","input","id","type","createdAt","Date","toISOString","siteId","hostId","data","payload","JSON","stringify","appendOrderWebhookAttempt","attempts","attempt","ORDER_WEBHOOK_DELIVERY_STATUS_LABELS","delivered","retrying","failed","ORDER_WEBHOOK_DELIVERY_STATUS_COLOR"],"mappings":"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"}
@@ -0,0 +1,56 @@
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
+ /**
18
+ * What shopping channels ask of a product beyond what the store shows
19
+ * (AGL-3637): the brand, the manufacturer's identifiers, the condition and
20
+ * Google's category. Entered in the product editor's channel fields and read
21
+ * by the product catalog the store publishes to other plugins
22
+ * (`server/product-catalog.ts`). Every field is optional: a channel feed
23
+ * falls back to the store's defaults and says what is missing.
24
+ */
25
+ export interface ProductChannelFacts {
26
+ /** The brand a shopper knows it by; at most 70 characters. */
27
+ brand?: string;
28
+ /**
29
+ * The product's GTIN (UPC, EAN, ISBN, JAN or ITF-14), digits only. For a
30
+ * product with several configurations each variant's barcode is its own.
31
+ */
32
+ gtin?: string;
33
+ /** The manufacturer's part number; at most 70 characters. */
34
+ mpn?: string;
35
+ condition?: 'new' | 'refurbished' | 'used';
36
+ /** A Google product taxonomy id (`2271`) or full path. */
37
+ googleProductCategory?: string;
38
+ }
39
+ export declare const PRODUCT_CHANNEL_CONDITIONS: readonly ["new", "refurbished", "used"];
40
+ /** Digits only, at most 14: what a barcode field holds once spaces and dashes are gone. */
41
+ export declare function normalizeGtin(value: unknown): string;
42
+ /**
43
+ * A stored product's channel facts made safe; `undefined` when nothing is
44
+ * set. Never throws: the field is written by the editor, the importer and the
45
+ * REST API, and read on every feed fetch.
46
+ */
47
+ export declare function normalizeProductChannelFacts(value: unknown): ProductChannelFacts | undefined;
48
+ /**
49
+ * Channel facts as the product editor stages them, keystroke by keystroke:
50
+ * what {@link normalizeProductChannelFacts} keeps, except that a field being
51
+ * typed is kept as typed — a barcode shorter than eight digits, a brand with
52
+ * the space before its next word. The editor runs this on every keystroke, so
53
+ * the strict form would erase the field under the cursor; readers normalize
54
+ * what is stored, so a half-typed value never reaches a channel.
55
+ */
56
+ export declare function draftProductChannelFacts(value: unknown): ProductChannelFacts | undefined;