@aglyn/plugins-commerce 1.0.0-beta.230 → 1.0.0-beta.232

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 (609) 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/catalog-organization-card.component.js +1 -0
  39. package/src/lib/components/console/catalog-organization-card.component.js.map +1 -1
  40. package/src/lib/components/console/customer-notifications-card.component.d.ts +19 -0
  41. package/src/lib/components/console/customer-notifications-card.component.js +149 -0
  42. package/src/lib/components/console/customer-notifications-card.component.js.map +1 -0
  43. package/src/lib/components/console/host-orders-card.component.js +88 -6
  44. package/src/lib/components/console/host-orders-card.component.js.map +1 -1
  45. package/src/lib/components/console/locations-card.component.js +164 -57
  46. package/src/lib/components/console/locations-card.component.js.map +1 -1
  47. package/src/lib/components/console/order-detail-dialog.component.js +209 -61
  48. package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
  49. package/src/lib/components/console/order-fulfillment-panel.component.d.ts +48 -0
  50. package/src/lib/components/console/order-fulfillment-panel.component.js +542 -0
  51. package/src/lib/components/console/order-fulfillment-panel.component.js.map +1 -0
  52. package/src/lib/components/console/order-invoice.component.d.ts +33 -0
  53. package/src/lib/components/console/order-invoice.component.js +81 -0
  54. package/src/lib/components/console/order-invoice.component.js.map +1 -0
  55. package/src/lib/components/console/order-receipt-resend.component.d.ts +21 -0
  56. package/src/lib/components/console/order-receipt-resend.component.js +203 -0
  57. package/src/lib/components/console/order-receipt-resend.component.js.map +1 -0
  58. package/src/lib/components/console/order-returns.component.d.ts +36 -0
  59. package/src/lib/components/console/order-returns.component.js +142 -0
  60. package/src/lib/components/console/order-returns.component.js.map +1 -0
  61. package/src/lib/components/console/order-shipping-actions.component.d.ts +54 -0
  62. package/src/lib/components/console/order-shipping-actions.component.js +149 -0
  63. package/src/lib/components/console/order-shipping-actions.component.js.map +1 -0
  64. package/src/lib/components/console/order-webhooks-card.component.d.ts +50 -0
  65. package/src/lib/components/console/order-webhooks-card.component.js +623 -0
  66. package/src/lib/components/console/order-webhooks-card.component.js.map +1 -0
  67. package/src/lib/components/console/order-zones.d.ts +155 -0
  68. package/src/lib/components/console/order-zones.js +40 -0
  69. package/src/lib/components/console/order-zones.js.map +1 -0
  70. package/src/lib/components/console/payment-methods-card.component.d.ts +67 -0
  71. package/src/lib/components/console/payment-methods-card.component.js +395 -0
  72. package/src/lib/components/console/payment-methods-card.component.js.map +1 -0
  73. package/src/lib/components/console/pos/pos-api.d.ts +124 -0
  74. package/src/lib/components/console/pos/pos-api.js +101 -0
  75. package/src/lib/components/console/pos/pos-api.js.map +1 -0
  76. package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +36 -0
  77. package/src/lib/components/console/pos/pos-cart-panel.component.js +160 -0
  78. package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -0
  79. package/src/lib/components/console/pos/pos-item-dialog.component.d.ts +39 -0
  80. package/src/lib/components/console/pos/pos-item-dialog.component.js +352 -0
  81. package/src/lib/components/console/pos/pos-item-dialog.component.js.map +1 -0
  82. package/src/lib/components/console/pos/pos-product-grid.component.d.ts +47 -0
  83. package/src/lib/components/console/pos/pos-product-grid.component.js +272 -0
  84. package/src/lib/components/console/pos/pos-product-grid.component.js.map +1 -0
  85. package/src/lib/components/console/pos/pos-receipt-panel.component.d.ts +27 -0
  86. package/src/lib/components/console/pos/pos-receipt-panel.component.js +282 -0
  87. package/src/lib/components/console/pos/pos-receipt-panel.component.js.map +1 -0
  88. package/src/lib/components/console/pos/pos-tender-dialogs.component.d.ts +53 -0
  89. package/src/lib/components/console/pos/pos-tender-dialogs.component.js +445 -0
  90. package/src/lib/components/console/pos/pos-tender-dialogs.component.js.map +1 -0
  91. package/src/lib/components/console/pos/pos-tender-panel.component.d.ts +31 -0
  92. package/src/lib/components/console/pos/pos-tender-panel.component.js +640 -0
  93. package/src/lib/components/console/pos/pos-tender-panel.component.js.map +1 -0
  94. package/src/lib/components/console/pos/use-pos-display.d.ts +43 -0
  95. package/src/lib/components/console/pos/use-pos-display.js +161 -0
  96. package/src/lib/components/console/pos/use-pos-display.js.map +1 -0
  97. package/src/lib/components/console/pos-devices-card.component.d.ts +14 -0
  98. package/src/lib/components/console/pos-devices-card.component.js +546 -0
  99. package/src/lib/components/console/pos-devices-card.component.js.map +1 -0
  100. package/src/lib/components/console/pos-display/brand-screen.d.ts +33 -0
  101. package/src/lib/components/console/pos-display/brand-screen.js +85 -0
  102. package/src/lib/components/console/pos-display/brand-screen.js.map +1 -0
  103. package/src/lib/components/console/pos-display/cart-screen.d.ts +29 -0
  104. package/src/lib/components/console/pos-display/cart-screen.js +166 -0
  105. package/src/lib/components/console/pos-display/cart-screen.js.map +1 -0
  106. package/src/lib/components/console/pos-display/pairing-screen.d.ts +24 -0
  107. package/src/lib/components/console/pos-display/pairing-screen.js +127 -0
  108. package/src/lib/components/console/pos-display/pairing-screen.js.map +1 -0
  109. package/src/lib/components/console/pos-display/pos-display-api.d.ts +90 -0
  110. package/src/lib/components/console/pos-display/pos-display-api.js +140 -0
  111. package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -0
  112. package/src/lib/components/console/pos-display/receipt-screen.d.ts +35 -0
  113. package/src/lib/components/console/pos-display/receipt-screen.js +200 -0
  114. package/src/lib/components/console/pos-display/receipt-screen.js.map +1 -0
  115. package/src/lib/components/console/pos-display/tip-screen.d.ts +36 -0
  116. package/src/lib/components/console/pos-display/tip-screen.js +211 -0
  117. package/src/lib/components/console/pos-display/tip-screen.js.map +1 -0
  118. package/src/lib/components/console/pos-display-page.component.d.ts +16 -0
  119. package/src/lib/components/console/pos-display-page.component.js +407 -0
  120. package/src/lib/components/console/pos-display-page.component.js.map +1 -0
  121. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.d.ts +40 -0
  122. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js +289 -0
  123. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js.map +1 -0
  124. package/src/lib/components/console/pos-ops/pos-last-receipt.component.d.ts +34 -0
  125. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js +61 -0
  126. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js.map +1 -0
  127. package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +38 -0
  128. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +129 -0
  129. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -0
  130. package/src/lib/components/console/pos-ops/pos-ops-api.d.ts +37 -0
  131. package/src/lib/components/console/pos-ops/pos-ops-api.js +60 -0
  132. package/src/lib/components/console/pos-ops/pos-ops-api.js.map +1 -0
  133. package/src/lib/components/console/pos-ops/pos-pin-pad.component.d.ts +48 -0
  134. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js +220 -0
  135. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js.map +1 -0
  136. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.d.ts +63 -0
  137. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js +186 -0
  138. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js.map +1 -0
  139. package/src/lib/components/console/pos-ops/pos-receipt.d.ts +39 -0
  140. package/src/lib/components/console/pos-ops/pos-receipt.js +182 -0
  141. package/src/lib/components/console/pos-ops/pos-receipt.js.map +1 -0
  142. package/src/lib/components/console/pos-ops/pos-return-dialog.component.d.ts +40 -0
  143. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js +465 -0
  144. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js.map +1 -0
  145. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.d.ts +29 -0
  146. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js +253 -0
  147. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js.map +1 -0
  148. package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +34 -0
  149. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +494 -0
  150. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -0
  151. package/src/lib/components/console/pos-ops/pos-shift-report.component.d.ts +37 -0
  152. package/src/lib/components/console/pos-ops/pos-shift-report.component.js +102 -0
  153. package/src/lib/components/console/pos-ops/pos-shift-report.component.js.map +1 -0
  154. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.d.ts +30 -0
  155. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js +277 -0
  156. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js.map +1 -0
  157. package/src/lib/components/console/pos-ops/register-ops.d.ts +28 -0
  158. package/src/lib/components/console/pos-ops/register-ops.js +28 -0
  159. package/src/lib/components/console/pos-ops/register-ops.js.map +1 -0
  160. package/src/lib/components/console/pos-ops/use-pos-cashier.d.ts +46 -0
  161. package/src/lib/components/console/pos-ops/use-pos-cashier.js +128 -0
  162. package/src/lib/components/console/pos-ops/use-pos-cashier.js.map +1 -0
  163. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.d.ts +36 -0
  164. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js +64 -0
  165. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js.map +1 -0
  166. package/src/lib/components/console/pos-page.component.d.ts +13 -5
  167. package/src/lib/components/console/pos-page.component.js +756 -654
  168. package/src/lib/components/console/pos-page.component.js.map +1 -1
  169. package/src/lib/components/console/pos-zones.d.ts +23 -0
  170. package/src/lib/components/console/pos-zones.js +31 -0
  171. package/src/lib/components/console/pos-zones.js.map +1 -0
  172. package/src/lib/components/console/product-editor-dialog.component.js +61 -71
  173. package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
  174. package/src/lib/components/console/product-labels-dialog.component.d.ts +13 -0
  175. package/src/lib/components/console/product-labels-dialog.component.js +197 -0
  176. package/src/lib/components/console/product-labels-dialog.component.js.map +1 -0
  177. package/src/lib/components/console/product-register-fields.component.d.ts +19 -0
  178. package/src/lib/components/console/product-register-fields.component.js +241 -0
  179. package/src/lib/components/console/product-register-fields.component.js.map +1 -0
  180. package/src/lib/components/console/product-zones.d.ts +44 -0
  181. package/src/lib/components/console/product-zones.js.map +1 -1
  182. package/src/lib/components/console/products-hub-card.component.js +23 -20
  183. package/src/lib/components/console/products-hub-card.component.js.map +1 -1
  184. package/src/lib/components/console/register-hardware-card.component.d.ts +33 -0
  185. package/src/lib/components/console/register-hardware-card.component.js +826 -0
  186. package/src/lib/components/console/register-hardware-card.component.js.map +1 -0
  187. package/src/lib/components/console/registers-card.component.js +24 -5
  188. package/src/lib/components/console/registers-card.component.js.map +1 -1
  189. package/src/lib/components/console/return-actions.d.ts +38 -0
  190. package/src/lib/components/console/return-actions.js +76 -0
  191. package/src/lib/components/console/return-actions.js.map +1 -0
  192. package/src/lib/components/console/return-detail-dialog.component.d.ts +34 -0
  193. package/src/lib/components/console/return-detail-dialog.component.js +718 -0
  194. package/src/lib/components/console/return-detail-dialog.component.js.map +1 -0
  195. package/src/lib/components/console/return-settings-card.component.d.ts +34 -0
  196. package/src/lib/components/console/return-settings-card.component.js +195 -0
  197. package/src/lib/components/console/return-settings-card.component.js.map +1 -0
  198. package/src/lib/components/console/return-zones.d.ts +87 -0
  199. package/src/lib/components/console/return-zones.js +31 -0
  200. package/src/lib/components/console/return-zones.js.map +1 -0
  201. package/src/lib/components/console/returns-card.component.d.ts +45 -0
  202. package/src/lib/components/console/returns-card.component.js +159 -0
  203. package/src/lib/components/console/returns-card.component.js.map +1 -0
  204. package/src/lib/components/console/shipping-settings-card.component.js +161 -5
  205. package/src/lib/components/console/shipping-settings-card.component.js.map +1 -1
  206. package/src/lib/components/console/shippingeasy-card.component.d.ts +59 -0
  207. package/src/lib/components/console/shippingeasy-card.component.js +378 -0
  208. package/src/lib/components/console/shippingeasy-card.component.js.map +1 -0
  209. package/src/lib/components/console/shipstation-card.component.d.ts +35 -0
  210. package/src/lib/components/console/shipstation-card.component.js +345 -0
  211. package/src/lib/components/console/shipstation-card.component.js.map +1 -0
  212. package/src/lib/components/console/start-return-dialog.component.d.ts +40 -0
  213. package/src/lib/components/console/start-return-dialog.component.js +243 -0
  214. package/src/lib/components/console/start-return-dialog.component.js.map +1 -0
  215. package/src/lib/components/console/stock-movements-card.component.js +2 -1
  216. package/src/lib/components/console/stock-movements-card.component.js.map +1 -1
  217. package/src/lib/components/console/store-settings-card.component.js +2 -66
  218. package/src/lib/components/console/store-settings-card.component.js.map +1 -1
  219. package/src/lib/components/console/store-zones.d.ts +42 -0
  220. package/src/lib/components/console/store-zones.js +39 -0
  221. package/src/lib/components/console/store-zones.js.map +1 -0
  222. package/src/lib/components/console/storefront-tax-summary-card.component.js +1 -0
  223. package/src/lib/components/console/storefront-tax-summary-card.component.js.map +1 -1
  224. package/src/lib/components/order-status.d.ts +36 -0
  225. package/src/lib/components/order-status.js +502 -0
  226. package/src/lib/components/order-status.js.map +1 -0
  227. package/src/lib/components/product-detail.js +41 -2
  228. package/src/lib/components/product-detail.js.map +1 -1
  229. package/src/lib/components/return-request.d.ts +32 -0
  230. package/src/lib/components/return-request.js +576 -0
  231. package/src/lib/components/return-request.js.map +1 -0
  232. package/src/lib/components/storefront-payment-appearance.d.ts +32 -0
  233. package/src/lib/components/storefront-payment-appearance.js +114 -0
  234. package/src/lib/components/storefront-payment-appearance.js.map +1 -0
  235. package/src/lib/components/storefront-payment-element.d.ts +57 -1
  236. package/src/lib/components/storefront-payment-element.js +332 -33
  237. package/src/lib/components/storefront-payment-element.js.map +1 -1
  238. package/src/lib/constants/order-status.d.ts +22 -0
  239. package/src/lib/constants/order-status.js +22 -0
  240. package/src/lib/constants/order-status.js.map +1 -0
  241. package/src/lib/constants/return-request.d.ts +27 -0
  242. package/src/lib/constants/return-request.js +32 -0
  243. package/src/lib/constants/return-request.js.map +1 -0
  244. package/src/lib/constants/stock-movement-query.js +2 -1
  245. package/src/lib/constants/stock-movement-query.js.map +1 -1
  246. package/src/lib/declarations.console-server.js +9 -0
  247. package/src/lib/declarations.console-server.js.map +1 -1
  248. package/src/lib/declarations.server.d.ts +2 -1
  249. package/src/lib/declarations.server.js +68 -1
  250. package/src/lib/declarations.server.js.map +1 -1
  251. package/src/lib/model/buyer-notifications.d.ts +59 -0
  252. package/src/lib/model/buyer-notifications.js +97 -0
  253. package/src/lib/model/buyer-notifications.js.map +1 -0
  254. package/src/lib/model/commerce-orders.d.ts +171 -2
  255. package/src/lib/model/commerce-orders.js +26 -16
  256. package/src/lib/model/commerce-orders.js.map +1 -1
  257. package/src/lib/model/commerce-payment-methods.d.ts +146 -0
  258. package/src/lib/model/commerce-payment-methods.js +247 -0
  259. package/src/lib/model/commerce-payment-methods.js.map +1 -0
  260. package/src/lib/model/commerce-pos-ops.d.ts +437 -0
  261. package/src/lib/model/commerce-pos-ops.js +721 -0
  262. package/src/lib/model/commerce-pos-ops.js.map +1 -0
  263. package/src/lib/model/commerce-pos.d.ts +263 -0
  264. package/src/lib/model/commerce-pos.js +375 -0
  265. package/src/lib/model/commerce-pos.js.map +1 -0
  266. package/src/lib/model/commerce-printers.d.ts +211 -0
  267. package/src/lib/model/commerce-printers.js +181 -0
  268. package/src/lib/model/commerce-printers.js.map +1 -0
  269. package/src/lib/model/commerce-receipt.d.ts +97 -0
  270. package/src/lib/model/commerce-receipt.js +180 -0
  271. package/src/lib/model/commerce-receipt.js.map +1 -0
  272. package/src/lib/model/commerce-returns.d.ts +207 -0
  273. package/src/lib/model/commerce-returns.js +300 -0
  274. package/src/lib/model/commerce-returns.js.map +1 -0
  275. package/src/lib/model/commerce-shipping.d.ts +44 -1
  276. package/src/lib/model/commerce-shipping.js +53 -9
  277. package/src/lib/model/commerce-shipping.js.map +1 -1
  278. package/src/lib/model/commerce-tax-engine.d.ts +90 -0
  279. package/src/lib/model/commerce-tax-engine.js +129 -0
  280. package/src/lib/model/commerce-tax-engine.js.map +1 -0
  281. package/src/lib/model/commerce.d.ts +91 -2
  282. package/src/lib/model/commerce.js +89 -1
  283. package/src/lib/model/commerce.js.map +1 -1
  284. package/src/lib/model/index.d.ts +16 -0
  285. package/src/lib/model/index.js +16 -0
  286. package/src/lib/model/index.js.map +1 -1
  287. package/src/lib/model/order-events.d.ts +154 -0
  288. package/src/lib/model/order-events.js +153 -0
  289. package/src/lib/model/order-events.js.map +1 -0
  290. package/src/lib/model/order-fulfillment.d.ts +117 -0
  291. package/src/lib/model/order-fulfillment.js +217 -0
  292. package/src/lib/model/order-fulfillment.js.map +1 -0
  293. package/src/lib/model/order-history.d.ts +58 -0
  294. package/src/lib/model/order-history.js +22 -0
  295. package/src/lib/model/order-history.js.map +1 -0
  296. package/src/lib/model/order-list-fields.d.ts +9 -1
  297. package/src/lib/model/order-list-fields.js +7 -1
  298. package/src/lib/model/order-list-fields.js.map +1 -1
  299. package/src/lib/model/order-shipping-export.d.ts +91 -0
  300. package/src/lib/model/order-shipping-export.js +192 -0
  301. package/src/lib/model/order-shipping-export.js.map +1 -0
  302. package/src/lib/model/order-status-view.d.ts +103 -0
  303. package/src/lib/model/order-status-view.js +156 -0
  304. package/src/lib/model/order-status-view.js.map +1 -0
  305. package/src/lib/model/order-webhooks.d.ts +142 -0
  306. package/src/lib/model/order-webhooks.js +91 -0
  307. package/src/lib/model/order-webhooks.js.map +1 -0
  308. package/src/lib/model/product-channel.d.ts +56 -0
  309. package/src/lib/model/product-channel.js +86 -0
  310. package/src/lib/model/product-channel.js.map +1 -0
  311. package/src/lib/model/product-modifiers.d.ts +80 -0
  312. package/src/lib/model/product-modifiers.js +140 -0
  313. package/src/lib/model/product-modifiers.js.map +1 -0
  314. package/src/lib/model/product-write.d.ts +186 -0
  315. package/src/lib/model/product-write.js +116 -0
  316. package/src/lib/model/product-write.js.map +1 -0
  317. package/src/lib/model/shippingeasy.d.ts +94 -0
  318. package/src/lib/model/shippingeasy.js +267 -0
  319. package/src/lib/model/shippingeasy.js.map +1 -0
  320. package/src/lib/model/shipstation.d.ts +125 -0
  321. package/src/lib/model/shipstation.js +399 -0
  322. package/src/lib/model/shipstation.js.map +1 -0
  323. package/src/lib/model/smart-collection-reads.d.ts +32 -0
  324. package/src/lib/model/smart-collection-reads.js +63 -0
  325. package/src/lib/model/smart-collection-reads.js.map +1 -0
  326. package/src/lib/model/tracking-url.d.ts +74 -0
  327. package/src/lib/model/tracking-url.js +159 -0
  328. package/src/lib/model/tracking-url.js.map +1 -0
  329. package/src/lib/plugin-config.d.ts +13 -0
  330. package/src/lib/plugin-config.js +77 -5
  331. package/src/lib/plugin-config.js.map +1 -1
  332. package/src/lib/plugin.js +26 -0
  333. package/src/lib/plugin.js.map +1 -1
  334. package/src/lib/pos-ops-config.d.ts +39 -0
  335. package/src/lib/pos-ops-config.js +88 -0
  336. package/src/lib/pos-ops-config.js.map +1 -0
  337. package/src/lib/printing/print-document.d.ts +106 -0
  338. package/src/lib/printing/print-document.js +464 -0
  339. package/src/lib/printing/print-document.js.map +1 -0
  340. package/src/lib/printing/product-labels.d.ts +58 -0
  341. package/src/lib/printing/product-labels.js +116 -0
  342. package/src/lib/printing/product-labels.js.map +1 -0
  343. package/src/lib/printing/render-epson.d.ts +57 -0
  344. package/src/lib/printing/render-epson.js +135 -0
  345. package/src/lib/printing/render-epson.js.map +1 -0
  346. package/src/lib/printing/render-star.d.ts +45 -0
  347. package/src/lib/printing/render-star.js +100 -0
  348. package/src/lib/printing/render-star.js.map +1 -0
  349. package/src/lib/printing/render-text.d.ts +25 -0
  350. package/src/lib/printing/render-text.js +53 -0
  351. package/src/lib/printing/render-text.js.map +1 -0
  352. package/src/lib/server/api-v1/openapi.js +27 -4
  353. package/src/lib/server/api-v1/openapi.js.map +1 -1
  354. package/src/lib/server/api-v1/order-view.d.ts +67 -0
  355. package/src/lib/server/api-v1/order-view.js +120 -0
  356. package/src/lib/server/api-v1/order-view.js.map +1 -0
  357. package/src/lib/server/api-v1/orders-and-products.js +58 -65
  358. package/src/lib/server/api-v1/orders-and-products.js.map +1 -1
  359. package/src/lib/server/billing-webhook.js +135 -28
  360. package/src/lib/server/billing-webhook.js.map +1 -1
  361. package/src/lib/server/cancel-order.js +29 -0
  362. package/src/lib/server/cancel-order.js.map +1 -1
  363. package/src/lib/server/carrier-rates-availability.d.ts +26 -0
  364. package/src/lib/server/carrier-rates-availability.js +76 -0
  365. package/src/lib/server/carrier-rates-availability.js.map +1 -0
  366. package/src/lib/server/carrier-shipping.d.ts +84 -0
  367. package/src/lib/server/carrier-shipping.js +135 -0
  368. package/src/lib/server/carrier-shipping.js.map +1 -0
  369. package/src/lib/server/cart-checkout.d.ts +2 -0
  370. package/src/lib/server/cart-checkout.js +226 -22
  371. package/src/lib/server/cart-checkout.js.map +1 -1
  372. package/src/lib/server/channel-order-updates.d.ts +50 -0
  373. package/src/lib/server/channel-order-updates.js +290 -0
  374. package/src/lib/server/channel-order-updates.js.map +1 -0
  375. package/src/lib/server/channel-orders.d.ts +85 -0
  376. package/src/lib/server/channel-orders.js +543 -0
  377. package/src/lib/server/channel-orders.js.map +1 -0
  378. package/src/lib/server/checkout-extras.d.ts +64 -0
  379. package/src/lib/server/checkout-extras.js +157 -0
  380. package/src/lib/server/checkout-extras.js.map +1 -0
  381. package/src/lib/server/{feed.d.ts → checkout-status.d.ts} +2 -7
  382. package/src/lib/server/checkout-status.js +111 -0
  383. package/src/lib/server/checkout-status.js.map +1 -0
  384. package/src/lib/server/checkout.js +86 -9
  385. package/src/lib/server/checkout.js.map +1 -1
  386. package/src/lib/server/draft-order.js +34 -5
  387. package/src/lib/server/draft-order.js.map +1 -1
  388. package/src/lib/server/fulfill-order.d.ts +127 -10
  389. package/src/lib/server/fulfill-order.js +451 -49
  390. package/src/lib/server/fulfill-order.js.map +1 -1
  391. package/src/lib/server/legacy-feed.d.ts +28 -0
  392. package/src/lib/server/legacy-feed.js +52 -0
  393. package/src/lib/server/legacy-feed.js.map +1 -0
  394. package/src/lib/server/native-checkout.d.ts +34 -15
  395. package/src/lib/server/native-checkout.js +32 -17
  396. package/src/lib/server/native-checkout.js.map +1 -1
  397. package/src/lib/server/order-event-host-emit.d.ts +23 -0
  398. package/src/lib/server/order-event-host-emit.js +30 -0
  399. package/src/lib/server/order-event-host-emit.js.map +1 -0
  400. package/src/lib/server/order-event-triggers.d.ts +37 -0
  401. package/src/lib/server/order-event-triggers.js +119 -0
  402. package/src/lib/server/order-event-triggers.js.map +1 -0
  403. package/src/lib/server/order-events.d.ts +62 -0
  404. package/src/lib/server/order-events.js +109 -0
  405. package/src/lib/server/order-events.js.map +1 -0
  406. package/src/lib/server/order-history.d.ts +23 -0
  407. package/src/lib/server/order-history.js +65 -0
  408. package/src/lib/server/order-history.js.map +1 -0
  409. package/src/lib/server/order-notifications.d.ts +185 -0
  410. package/src/lib/server/order-notifications.js +567 -0
  411. package/src/lib/server/order-notifications.js.map +1 -0
  412. package/src/lib/server/order-receipt-send.d.ts +39 -0
  413. package/src/lib/server/order-receipt-send.js +151 -0
  414. package/src/lib/server/order-receipt-send.js.map +1 -0
  415. package/src/lib/server/order-status-token.d.ts +31 -0
  416. package/src/lib/server/order-status-token.js +75 -0
  417. package/src/lib/server/order-status-token.js.map +1 -0
  418. package/src/lib/server/order-status.d.ts +58 -0
  419. package/src/lib/server/order-status.js +141 -0
  420. package/src/lib/server/order-status.js.map +1 -0
  421. package/src/lib/server/order-webhooks.d.ts +108 -0
  422. package/src/lib/server/order-webhooks.js +622 -0
  423. package/src/lib/server/order-webhooks.js.map +1 -0
  424. package/src/lib/server/orders-shipping-prepare.d.ts +26 -0
  425. package/src/lib/server/orders-shipping-prepare.js +121 -0
  426. package/src/lib/server/orders-shipping-prepare.js.map +1 -0
  427. package/src/lib/server/payment-method-domains.d.ts +209 -0
  428. package/src/lib/server/payment-method-domains.js +444 -0
  429. package/src/lib/server/payment-method-domains.js.map +1 -0
  430. package/src/lib/server/payment-methods.d.ts +77 -0
  431. package/src/lib/server/payment-methods.js +284 -0
  432. package/src/lib/server/payment-methods.js.map +1 -0
  433. package/src/lib/server/pos-auth.d.ts +50 -0
  434. package/src/lib/server/pos-auth.js +121 -0
  435. package/src/lib/server/pos-auth.js.map +1 -0
  436. package/src/lib/server/pos-customer.d.ts +49 -0
  437. package/src/lib/server/pos-customer.js +257 -0
  438. package/src/lib/server/pos-customer.js.map +1 -0
  439. package/src/lib/server/pos-display.d.ts +57 -0
  440. package/src/lib/server/pos-display.js +419 -0
  441. package/src/lib/server/pos-display.js.map +1 -0
  442. package/src/lib/server/pos-fee-month.d.ts +34 -0
  443. package/src/lib/server/pos-fee-month.js +36 -0
  444. package/src/lib/server/pos-fee-month.js.map +1 -0
  445. package/src/lib/server/pos-ops-gate.d.ts +161 -0
  446. package/src/lib/server/pos-ops-gate.js +295 -0
  447. package/src/lib/server/pos-ops-gate.js.map +1 -0
  448. package/src/lib/server/pos-ops-routes.d.ts +22 -0
  449. package/src/lib/server/pos-ops-routes.js +36 -0
  450. package/src/lib/server/pos-ops-routes.js.map +1 -0
  451. package/src/lib/server/pos-order.d.ts +1 -18
  452. package/src/lib/server/pos-order.js +222 -42
  453. package/src/lib/server/pos-order.js.map +1 -1
  454. package/src/lib/server/pos-payment.d.ts +39 -0
  455. package/src/lib/server/pos-payment.js +922 -0
  456. package/src/lib/server/pos-payment.js.map +1 -0
  457. package/src/lib/server/pos-print.d.ts +82 -0
  458. package/src/lib/server/pos-print.js +193 -0
  459. package/src/lib/server/pos-print.js.map +1 -0
  460. package/src/lib/server/pos-readers.d.ts +27 -0
  461. package/src/lib/server/pos-readers.js +276 -0
  462. package/src/lib/server/pos-readers.js.map +1 -0
  463. package/src/lib/server/pos-refund-authority.d.ts +60 -0
  464. package/src/lib/server/pos-refund-authority.js +72 -0
  465. package/src/lib/server/pos-refund-authority.js.map +1 -0
  466. package/src/lib/server/pos-return.d.ts +58 -0
  467. package/src/lib/server/pos-return.js +891 -0
  468. package/src/lib/server/pos-return.js.map +1 -0
  469. package/src/lib/server/pos-sale-stamp.d.ts +66 -0
  470. package/src/lib/server/pos-sale-stamp.js +84 -0
  471. package/src/lib/server/pos-sale-stamp.js.map +1 -0
  472. package/src/lib/server/pos-sale.d.ts +170 -0
  473. package/src/lib/server/pos-sale.js +461 -0
  474. package/src/lib/server/pos-sale.js.map +1 -0
  475. package/src/lib/server/pos-shift.d.ts +45 -0
  476. package/src/lib/server/pos-shift.js +484 -0
  477. package/src/lib/server/pos-shift.js.map +1 -0
  478. package/src/lib/server/pos-staff-pin.d.ts +26 -0
  479. package/src/lib/server/pos-staff-pin.js +339 -0
  480. package/src/lib/server/pos-staff-pin.js.map +1 -0
  481. package/src/lib/server/pos-stripe.d.ts +91 -0
  482. package/src/lib/server/pos-stripe.js +129 -0
  483. package/src/lib/server/pos-stripe.js.map +1 -0
  484. package/src/lib/server/pos-terminal-connection-token.d.ts +48 -0
  485. package/src/lib/server/pos-terminal-connection-token.js +166 -0
  486. package/src/lib/server/pos-terminal-connection-token.js.map +1 -0
  487. package/src/lib/server/pos-terminal.d.ts +218 -0
  488. package/src/lib/server/pos-terminal.js +1014 -0
  489. package/src/lib/server/pos-terminal.js.map +1 -0
  490. package/src/lib/server/print-queue.d.ts +124 -0
  491. package/src/lib/server/print-queue.js +301 -0
  492. package/src/lib/server/print-queue.js.map +1 -0
  493. package/src/lib/server/printer-poll.d.ts +75 -0
  494. package/src/lib/server/printer-poll.js +325 -0
  495. package/src/lib/server/printer-poll.js.map +1 -0
  496. package/src/lib/server/printer-secret.d.ts +39 -0
  497. package/src/lib/server/printer-secret.js +56 -0
  498. package/src/lib/server/printer-secret.js.map +1 -0
  499. package/src/lib/server/printers.d.ts +114 -0
  500. package/src/lib/server/printers.js +546 -0
  501. package/src/lib/server/printers.js.map +1 -0
  502. package/src/lib/server/product-catalog.d.ts +42 -0
  503. package/src/lib/server/product-catalog.js +309 -0
  504. package/src/lib/server/product-catalog.js.map +1 -0
  505. package/src/lib/server/product-drafts.d.ts +5 -1
  506. package/src/lib/server/product-drafts.js +3 -3
  507. package/src/lib/server/product-drafts.js.map +1 -1
  508. package/src/lib/server/product-writer.d.ts +19 -0
  509. package/src/lib/server/product-writer.js +261 -0
  510. package/src/lib/server/product-writer.js.map +1 -0
  511. package/src/lib/server/products-write.d.ts +61 -0
  512. package/src/lib/server/products-write.js +375 -0
  513. package/src/lib/server/products-write.js.map +1 -0
  514. package/src/lib/server/refund.js +110 -45
  515. package/src/lib/server/refund.js.map +1 -1
  516. package/src/lib/server/reserve.js +2 -0
  517. package/src/lib/server/reserve.js.map +1 -1
  518. package/src/lib/server/return-status-action.d.ts +37 -0
  519. package/src/lib/server/return-status-action.js +57 -0
  520. package/src/lib/server/return-status-action.js.map +1 -0
  521. package/src/lib/server/returns.d.ts +119 -0
  522. package/src/lib/server/returns.js +938 -0
  523. package/src/lib/server/returns.js.map +1 -0
  524. package/src/lib/server/shipment-records.d.ts +36 -0
  525. package/src/lib/server/shipment-records.js +289 -0
  526. package/src/lib/server/shipment-records.js.map +1 -0
  527. package/src/lib/server/shipping-connector-gates.d.ts +40 -0
  528. package/src/lib/server/shipping-connector-gates.js +97 -0
  529. package/src/lib/server/shipping-connector-gates.js.map +1 -0
  530. package/src/lib/server/shipping-connectors.d.ts +29 -0
  531. package/src/lib/server/shipping-connectors.js +236 -0
  532. package/src/lib/server/shipping-connectors.js.map +1 -0
  533. package/src/lib/server/shippingeasy.d.ts +238 -0
  534. package/src/lib/server/shippingeasy.js +787 -0
  535. package/src/lib/server/shippingeasy.js.map +1 -0
  536. package/src/lib/server/shipstation.d.ts +129 -0
  537. package/src/lib/server/shipstation.js +483 -0
  538. package/src/lib/server/shipstation.js.map +1 -0
  539. package/src/lib/server/site-page-resolver.d.ts +5 -0
  540. package/src/lib/server/site-page-resolver.js +156 -1
  541. package/src/lib/server/site-page-resolver.js.map +1 -1
  542. package/src/lib/server/stock-levels.d.ts +21 -0
  543. package/src/lib/server/stock-levels.js +263 -0
  544. package/src/lib/server/stock-levels.js.map +1 -0
  545. package/src/lib/server/stripe-refund.d.ts +47 -0
  546. package/src/lib/server/stripe-refund.js +87 -0
  547. package/src/lib/server/stripe-refund.js.map +1 -0
  548. package/src/lib/server/supplier-update.js +46 -5
  549. package/src/lib/server/supplier-update.js.map +1 -1
  550. package/src/lib/server/tax-engine-quote.d.ts +47 -0
  551. package/src/lib/server/tax-engine-quote.js +105 -0
  552. package/src/lib/server/tax-engine-quote.js.map +1 -0
  553. package/src/lib/server.js +143 -2
  554. package/src/lib/server.js.map +1 -1
  555. package/src/lib/site.js +12 -0
  556. package/src/lib/site.js.map +1 -1
  557. package/src/lib/subprocessors.d.ts +26 -0
  558. package/src/lib/subprocessors.js +50 -0
  559. package/src/lib/subprocessors.js.map +1 -0
  560. package/src/lib/tenant-emails.js +461 -3
  561. package/src/lib/tenant-emails.js.map +1 -1
  562. package/src/lib/testing/fake-firestore.d.ts +45 -0
  563. package/src/lib/testing/fake-firestore.js +189 -0
  564. package/src/lib/testing/fake-firestore.js.map +1 -0
  565. package/src/lib/testing/memory-firestore.d.ts +136 -0
  566. package/src/lib/testing/memory-firestore.js +282 -0
  567. package/src/lib/testing/memory-firestore.js.map +1 -0
  568. package/src/lib/testing/pos-ops-harness.d.ts +50 -0
  569. package/src/lib/testing/pos-ops-harness.js +184 -0
  570. package/src/lib/testing/pos-ops-harness.js.map +1 -0
  571. package/src/lib/testing/pos-ops-memory-firestore.d.ts +55 -0
  572. package/src/lib/testing/pos-ops-memory-firestore.js +376 -0
  573. package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -0
  574. package/src/lib/transfer/products.server.d.ts +5 -0
  575. package/src/lib/transfer/products.server.js +2 -2
  576. package/src/lib/transfer/products.server.js.map +1 -1
  577. package/src/lib/transfer/records-transfer.d.ts +11 -1
  578. package/src/lib/transfer/records-transfer.js +127 -5
  579. package/src/lib/transfer/records-transfer.js.map +1 -1
  580. package/src/lib/transfer/records.server.d.ts +9 -2
  581. package/src/lib/transfer/records.server.js +58 -7
  582. package/src/lib/transfer/records.server.js.map +1 -1
  583. package/src/lib/transfer/register-transfer-resources.js +40 -1
  584. package/src/lib/transfer/register-transfer-resources.js.map +1 -1
  585. package/src/lib/transfer/register-transfer-ui.js +4 -1
  586. package/src/lib/transfer/register-transfer-ui.js.map +1 -1
  587. package/src/lib/transfer/shipping-presets.d.ts +23 -0
  588. package/src/lib/transfer/shipping-presets.js +156 -0
  589. package/src/lib/transfer/shipping-presets.js.map +1 -0
  590. package/src/lib/transfer/tracking-transfer.d.ts +101 -0
  591. package/src/lib/transfer/tracking-transfer.js +546 -0
  592. package/src/lib/transfer/tracking-transfer.js.map +1 -0
  593. package/src/lib/transfer/tracking.server.d.ts +37 -0
  594. package/src/lib/transfer/tracking.server.js +393 -0
  595. package/src/lib/transfer/tracking.server.js.map +1 -0
  596. package/src/lib/transfer/transfer-keys.d.ts +2 -1
  597. package/src/lib/transfer/transfer-keys.js +6 -2
  598. package/src/lib/transfer/transfer-keys.js.map +1 -1
  599. package/src/lib/utils/code128.d.ts +37 -0
  600. package/src/lib/utils/code128.js +199 -0
  601. package/src/lib/utils/code128.js.map +1 -0
  602. package/src/lib/utils/order-invoice.d.ts +55 -0
  603. package/src/lib/utils/order-invoice.js +127 -0
  604. package/src/lib/utils/order-invoice.js.map +1 -0
  605. package/src/lib/utils/use-checkout-return-notice.d.ts +34 -0
  606. package/src/lib/utils/use-checkout-return-notice.js +78 -0
  607. package/src/lib/utils/use-checkout-return-notice.js.map +1 -0
  608. package/src/lib/server/feed.js +0 -69
  609. package/src/lib/server/feed.js.map +0 -1
@@ -0,0 +1,399 @@
1
+ import { _ as _extends } from "@swc/helpers/_/_extends";
2
+ /**
3
+ * @license
4
+ * Copyright 2026 Aglyn LLC
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */ import { PLATFORM_BRAND_NAME } from "@aglyn/aglyn/app-utils/platform-brand";
18
+ import { lineRequiresShipping } from "./order-fulfillment.js";
19
+ import { gramsToOunces, shippingLines, shippingOrderNumber } from "./order-shipping-export.js";
20
+ /*
21
+ * SHIPSTATION'S CUSTOM STORE, AS PURE DATA (AGL-3613).
22
+ *
23
+ * ShipStation pulls a store's orders from one URL the merchant pastes into
24
+ * its Custom Store connection, and posts each shipment back to the same URL
25
+ * (Custom Store Development Guide, help.shipstation.com, read 2026-10-06):
26
+ *
27
+ * - `GET ?action=export&start_date=&end_date=&page=` answers an `<Orders
28
+ * pages="n">` document of every order MODIFIED in the window, whatever its
29
+ * status. Dates are UTC, `MM/dd/yyyy HH:mm`. Free text sits in CDATA.
30
+ * - `POST ?action=shipnotify&order_number=&carrier=&service=&tracking_number=`
31
+ * carries a `<ShipNotice>` body naming the shipped items; any 2xx is
32
+ * success.
33
+ *
34
+ * This module writes the feed and reads the notice. The route that serves
35
+ * them, its credentials and its query live in `server/shipstation.ts`.
36
+ *
37
+ * ## The status names a merchant types into ShipStation
38
+ *
39
+ * ShipStation maps a store's own status names onto its five, and the mapping
40
+ * is case-sensitive. These are the names this feed writes; the connection
41
+ * card and the guide print them for the merchant to copy.
42
+ */ export const SHIPSTATION_STATUS_NAMES = {
43
+ unpaid: 'unpaid',
44
+ paid: 'paid',
45
+ shipped: 'shipped',
46
+ canceled: 'canceled',
47
+ onHold: 'on_hold'
48
+ };
49
+ /** An Aglyn order status as the feed names it to ShipStation. */ export function shipStationOrderStatus(status) {
50
+ switch(status){
51
+ case 'pending':
52
+ return SHIPSTATION_STATUS_NAMES.unpaid;
53
+ case 'paid':
54
+ case 'partially_fulfilled':
55
+ return SHIPSTATION_STATUS_NAMES.paid;
56
+ case 'fulfilled':
57
+ case 'delivered':
58
+ return SHIPSTATION_STATUS_NAMES.shipped;
59
+ case 'cancelled':
60
+ case 'refunded':
61
+ return SHIPSTATION_STATUS_NAMES.canceled;
62
+ }
63
+ }
64
+ /** Orders per page of the feed. ShipStation follows `pages` until it has them all. */ export const SHIPSTATION_PAGE_SIZE = 100;
65
+ /** The widest window one request may ask for: a year, which no import needs. */ export const SHIPSTATION_MAX_WINDOW_MS = 366 * 24 * 60 * 60 * 1000;
66
+ const pad = (value)=>String(value).padStart(2, '0');
67
+ /** Epoch milliseconds as ShipStation's `MM/dd/yyyy HH:mm`, in UTC. */ export function formatShipStationDate(ms) {
68
+ const date = new Date(ms);
69
+ return `${pad(date.getUTCMonth() + 1)}/${pad(date.getUTCDate())}/${date.getUTCFullYear()} ` + `${pad(date.getUTCHours())}:${pad(date.getUTCMinutes())}`;
70
+ }
71
+ /**
72
+ * ShipStation's `MM/dd/yyyy HH:mm` (UTC; seconds and AM/PM tolerated) as
73
+ * epoch milliseconds, or `null` when the text is not a date. An ISO date is
74
+ * read too, for a merchant testing the URL by hand.
75
+ */ export function parseShipStationDate(value) {
76
+ const text = String(value != null ? value : '').trim();
77
+ if (!text) return null;
78
+ const match = /^(\d{1,2})\/(\d{1,2})\/(\d{4})(?:[ T]+(\d{1,2}):(\d{2})(?::(\d{2}))?\s*([AaPp][Mm])?)?$/.exec(text);
79
+ if (match) {
80
+ const [, month, day, year, hourText, minute, second, meridiem] = match;
81
+ let hour = Number(hourText != null ? hourText : 0);
82
+ if (meridiem) {
83
+ const pm = meridiem.toLowerCase() === 'pm';
84
+ if (hour === 12) hour = pm ? 12 : 0;
85
+ else if (pm) hour += 12;
86
+ }
87
+ const ms = Date.UTC(Number(year), Number(month) - 1, Number(day), hour, Number(minute != null ? minute : 0), Number(second != null ? second : 0));
88
+ const check = new Date(ms);
89
+ if (check.getUTCMonth() !== Number(month) - 1 || check.getUTCDate() !== Number(day) || hour > 23) return null;
90
+ return ms;
91
+ }
92
+ if (/^\d{4}-\d{2}-\d{2}/.test(text)) {
93
+ const ms = Date.parse(text);
94
+ return Number.isFinite(ms) ? ms : null;
95
+ }
96
+ return null;
97
+ }
98
+ /** The weights the shared shipping reading takes, from the products' facts. */ export function weightsOfProducts(products) {
99
+ const weights = {};
100
+ for (const [productId, variants] of Object.entries(products)){
101
+ for (const [variantId, facts] of Object.entries(variants)){
102
+ if (typeof facts.grams === 'number' && facts.grams > 0) {
103
+ var _weights, _productId, _;
104
+ ;
105
+ ((_ = (_weights = weights)[_productId = productId]) != null ? _ : _weights[_productId] = {})[variantId] = facts.grams;
106
+ }
107
+ }
108
+ }
109
+ return weights;
110
+ }
111
+ function factsFor(line, products) {
112
+ var _products_line_productId, _variants_;
113
+ const variants = (_products_line_productId = products[line.productId]) != null ? _products_line_productId : {};
114
+ const own = line.variantId ? variants[line.variantId] : undefined;
115
+ const base = (_variants_ = variants['']) != null ? _variants_ : {};
116
+ return _extends({}, base, own != null ? own : {});
117
+ }
118
+ /** Characters XML 1.0 cannot carry at all, dropped before anything is written. */ // eslint-disable-next-line no-control-regex
119
+ const XML_INVALID = /[\u0000-\u0008\u000B\u000C\u000E-\u001F￾￿]/g;
120
+ /** Text bounded to `max` characters with every character XML refuses dropped. */ function bounded(value, max) {
121
+ const text = value === null || value === undefined ? '' : String(value);
122
+ return text.replace(XML_INVALID, '').trim().slice(0, max);
123
+ }
124
+ /**
125
+ * Free text as a CDATA section, as the guide asks. A `]]>` inside the text
126
+ * would end the section early, so it is split across two sections — the
127
+ * standard escape, which reads back as the same characters.
128
+ */ export function xmlCdata(value, max) {
129
+ const text = bounded(value, max);
130
+ return text ? `<![CDATA[${text.replace(/]]>/g, ']]]]><![CDATA[>')}]]>` : '';
131
+ }
132
+ /** A plain value (a number, a date, a code) with the five XML entities escaped. */ export function xmlText(value, max = 100) {
133
+ return bounded(value, max).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;');
134
+ }
135
+ /** Cents as the feed's decimal dollars, `12.50`. */ function money(cents) {
136
+ const value = Math.round(Number(cents != null ? cents : 0));
137
+ return (Number.isFinite(value) ? value / 100 : 0).toFixed(2);
138
+ }
139
+ const element = (name, inner)=>`<${name}>${inner}</${name}>`;
140
+ /**
141
+ * Whether ShipStation can take this order at all: it insists on a ship-to
142
+ * name, street, city, postal code and two-letter country. An order without
143
+ * them could never become a label, and one invalid `<Order>` fails the whole
144
+ * import, so it is left out of the feed rather than sent with a guess.
145
+ */ export function shipStationCanImport(order) {
146
+ var _address_country, _address_line1, _address_city, _address_postalCode, _ref, _address_name;
147
+ const address = order.shippingAddress;
148
+ if (!address) return false;
149
+ const country = String((_address_country = address.country) != null ? _address_country : '').trim();
150
+ return Boolean(String((_address_line1 = address.line1) != null ? _address_line1 : '').trim() && String((_address_city = address.city) != null ? _address_city : '').trim() && String((_address_postalCode = address.postalCode) != null ? _address_postalCode : '').trim() && /^[A-Za-z]{2}$/.test(country) && String((_ref = (_address_name = address.name) != null ? _address_name : order.customerName) != null ? _ref : '').trim());
151
+ }
152
+ /**
153
+ * The items an order sends ShipStation. An order still to be shipped sends
154
+ * what is LEFT — a partially fulfilled order asks for the rest, never the
155
+ * whole order twice. A shipped or canceled order sends its shippable lines
156
+ * whole, which ShipStation only reads to show the order it is moving.
157
+ */ function feedItems(source, products) {
158
+ var _order_status, _order_lineItems, _order_fulfillments, _ref;
159
+ var _order_totals;
160
+ const { order } = source;
161
+ const status = (_order_status = order.status) != null ? _order_status : 'paid';
162
+ const lineItems = (_order_lineItems = order.lineItems) != null ? _order_lineItems : [];
163
+ const open = status === 'paid' || status === 'partially_fulfilled' || status === 'pending';
164
+ const entries = open ? shippingLines({
165
+ lineItems,
166
+ fulfillments: (_order_fulfillments = order.fulfillments) != null ? _order_fulfillments : []
167
+ }, weightsOfProducts(products)).map((entry)=>({
168
+ lineItemId: entry.lineItemId,
169
+ line: entry.line,
170
+ quantity: entry.quantity
171
+ })) : lineItems.map((line, lineItemId)=>{
172
+ var _ref;
173
+ return {
174
+ lineItemId,
175
+ line,
176
+ quantity: Math.max(0, Math.floor(Number((_ref = line == null ? void 0 : line.quantity) != null ? _ref : 0)))
177
+ };
178
+ }).filter((entry)=>entry.line && lineRequiresShipping(entry.line) && entry.quantity > 0);
179
+ const items = entries.map(({ lineItemId, line, quantity })=>{
180
+ var _facts_options;
181
+ const facts = factsFor(line, products);
182
+ const ounces = typeof facts.grams === 'number' && facts.grams > 0 ? gramsToOunces(facts.grams) : null;
183
+ const options = Object.entries((_facts_options = facts.options) != null ? _facts_options : {}).filter(([name, value])=>String(name).trim() && String(value).trim()).slice(0, 10);
184
+ return element('Item', [
185
+ element('LineItemID', xmlText(String(lineItemId), 50)),
186
+ element('SKU', xmlCdata(line.sku || (line.variantId ? `${line.productId}-${line.variantId}` : line.productId), 100)),
187
+ element('Name', xmlCdata(`${line.name}${line.variantLabel ? ` (${line.variantLabel})` : ''}`, 200)),
188
+ facts.imageUrl && /^https:\/\//.test(facts.imageUrl) ? element('ImageUrl', xmlCdata(facts.imageUrl, 500)) : '',
189
+ ounces !== null ? element('Weight', ounces.toFixed(2)) + element('WeightUnits', 'Ounces') : '',
190
+ element('Quantity', String(quantity)),
191
+ element('UnitPrice', money(line.unitAmountCents)),
192
+ options.length ? element('Options', options.map(([name, value])=>element('Option', element('Name', xmlCdata(name, 100)) + element('Value', xmlCdata(value, 100)))).join('')) : ''
193
+ ].join(''));
194
+ });
195
+ // The order's discount, as the guide's adjustment line: negative and
196
+ // flagged, so ShipStation's totals agree with what the buyer paid.
197
+ const discountCents = Math.round(Number((_ref = (_order_totals = order.totals) == null ? void 0 : _order_totals.discountCents) != null ? _ref : 0));
198
+ if (discountCents > 0) {
199
+ items.push(element('Item', element('SKU', '') + element('Name', xmlCdata(order.couponCode ? `Discount (${order.couponCode})` : 'Discount', 200)) + element('Quantity', '1') + element('UnitPrice', `-${money(discountCents)}`) + element('Adjustment', 'true')));
200
+ }
201
+ return items;
202
+ }
203
+ /** One `<Order>` element of the feed. */ export function shipStationOrderXml(source, products = {}) {
204
+ var _order_status, _order_createdAtMs, _order_updatedAtMs, _order_shippingAddress, _order_billingAddress, _ref, _ship_country;
205
+ const { docId, order } = source;
206
+ const status = (_order_status = order.status) != null ? _order_status : 'paid';
207
+ const created = Number((_order_createdAtMs = order.createdAtMs) != null ? _order_createdAtMs : 0) || Date.now();
208
+ const modified = Number((_order_updatedAtMs = order.updatedAtMs) != null ? _order_updatedAtMs : created) || created;
209
+ const ship = (_order_shippingAddress = order.shippingAddress) != null ? _order_shippingAddress : {};
210
+ const bill = (_order_billingAddress = order.billingAddress) != null ? _order_billingAddress : {};
211
+ const email = bounded(order.customerEmail, 100);
212
+ const recipient = ship.name || order.customerName || '';
213
+ const totals = order.totals;
214
+ return element('Order', [
215
+ element('OrderID', xmlCdata(docId, 50)),
216
+ element('OrderNumber', xmlCdata(shippingOrderNumber(order, docId), 50)),
217
+ element('OrderDate', formatShipStationDate(created)),
218
+ element('OrderStatus', xmlCdata(shipStationOrderStatus(status), 50)),
219
+ element('LastModified', formatShipStationDate(modified)),
220
+ element('CurrencyCode', 'USD'),
221
+ element('OrderTotal', money((_ref = totals == null ? void 0 : totals.totalCents) != null ? _ref : order.amountCents)),
222
+ element('TaxAmount', money(totals == null ? void 0 : totals.taxCents)),
223
+ element('ShippingAmount', money(totals == null ? void 0 : totals.shippingCents)),
224
+ order.note ? element('InternalNotes', xmlCdata(order.note, 1000)) : '',
225
+ element('Source', xmlCdata(order.channel === 'pos' ? `${PLATFORM_BRAND_NAME} POS` : PLATFORM_BRAND_NAME, 50)),
226
+ element('Customer', [
227
+ element('CustomerCode', xmlCdata(email || docId, 100)),
228
+ element('BillTo', [
229
+ element('Name', xmlCdata(bill.name || order.customerName || recipient, 100)),
230
+ bill.phone || order.customerPhone ? element('Phone', xmlCdata(bill.phone || order.customerPhone, 50)) : '',
231
+ email ? element('Email', xmlCdata(email, 100)) : ''
232
+ ].join('')),
233
+ element('ShipTo', [
234
+ element('Name', xmlCdata(recipient, 100)),
235
+ element('Address1', xmlCdata(ship.line1, 200)),
236
+ ship.line2 ? element('Address2', xmlCdata(ship.line2, 200)) : '',
237
+ element('City', xmlCdata(ship.city, 100)),
238
+ ship.state ? element('State', xmlCdata(ship.state, 100)) : '',
239
+ element('PostalCode', xmlCdata(ship.postalCode, 50)),
240
+ element('Country', xmlCdata(String((_ship_country = ship.country) != null ? _ship_country : '').toUpperCase(), 2)),
241
+ ship.phone ? element('Phone', xmlCdata(ship.phone, 50)) : ''
242
+ ].join(''))
243
+ ].join('')),
244
+ element('Items', feedItems(source, products).join(''))
245
+ ].join(''));
246
+ }
247
+ /** The whole `<Orders>` document for one page. */ export function shipStationOrdersXml(orders, pages) {
248
+ return `<?xml version="1.0" encoding="utf-8"?>\n<Orders pages="${Math.max(1, Math.floor(pages))}">${orders.join('')}</Orders>`;
249
+ }
250
+ const XML_ENTITIES = {
251
+ lt: '<',
252
+ gt: '>',
253
+ amp: '&',
254
+ quot: '"',
255
+ apos: "'"
256
+ };
257
+ /** XML character data with its five entities and numeric references decoded. Nothing else expands. */ function decodeEntities(text) {
258
+ return text.replace(/&(#x[0-9a-fA-F]{1,6}|#\d{1,7}|lt|gt|amp|quot|apos);/g, (whole, code)=>{
259
+ var _XML_ENTITIES_code;
260
+ if (code[0] !== '#') return (_XML_ENTITIES_code = XML_ENTITIES[code]) != null ? _XML_ENTITIES_code : whole;
261
+ const point = code[1] === 'x' ? parseInt(code.slice(2), 16) : parseInt(code.slice(1), 10);
262
+ return Number.isFinite(point) && point > 0 && point <= 0x10ffff ? String.fromCodePoint(point) : '';
263
+ });
264
+ }
265
+ /** An element's content as text: CDATA sections taken as written, the rest entity-decoded. */ function contentText(raw) {
266
+ let out = '';
267
+ let at = 0;
268
+ const cdata = /<!\[CDATA\[([\s\S]*?)\]\]>/g;
269
+ for(let match = cdata.exec(raw); match; match = cdata.exec(raw)){
270
+ out += decodeEntities(raw.slice(at, match.index).replace(/<[^>]*>/g, ''));
271
+ out += match[1];
272
+ at = match.index + match[0].length;
273
+ }
274
+ out += decodeEntities(raw.slice(at).replace(/<[^>]*>/g, ''));
275
+ return out.trim();
276
+ }
277
+ /** The text of the first `<name>` element in `xml`, or `''`. */ function elementText(xml, name) {
278
+ const match = new RegExp(`<${name}(?:\\s[^>]*)?>([\\s\\S]*?)</${name}\\s*>`).exec(xml);
279
+ return match ? contentText(match[1]) : '';
280
+ }
281
+ /** The inner XML of every `<name>` element in `xml`. */ function elementBodies(xml, name) {
282
+ const pattern = new RegExp(`<${name}(?:\\s[^>]*)?>([\\s\\S]*?)</${name}\\s*>`, 'g');
283
+ const bodies = [];
284
+ for(let match = pattern.exec(xml); match; match = pattern.exec(xml))bodies.push(match[1]);
285
+ return bodies;
286
+ }
287
+ /**
288
+ * A `<ShipNotice>` body read into a notice, or the reason it cannot be.
289
+ *
290
+ * Read by name, not by a general parser: the notice is a fixed, flat set of
291
+ * elements, and a document type declaration is refused outright, so no
292
+ * entity is ever defined or expanded beyond XML's five. The query string's
293
+ * `order_number`, `carrier`, `service` and `tracking_number` win when
294
+ * present — the guide names them first — and the body fills the rest.
295
+ */ export function readShipNotice(xml, query) {
296
+ var _elementBodies_, _elementBodies_1, _query_order_number, _query_carrier, _query_service, _query_tracking_number;
297
+ const body = String(xml != null ? xml : '');
298
+ if (/<!DOCTYPE|<!ENTITY/i.test(body)) return {
299
+ problem: `The notice declares a document type, which ${PLATFORM_BRAND_NAME} does not read.`
300
+ };
301
+ const root = (_elementBodies_ = elementBodies(body, 'ShipNotice')[0]) != null ? _elementBodies_ : '';
302
+ if (body.trim() && !root) return {
303
+ problem: 'The notice is not a ShipNotice.'
304
+ };
305
+ const itemsBlock = (_elementBodies_1 = elementBodies(root, 'Items')[0]) != null ? _elementBodies_1 : '';
306
+ const items = elementBodies(itemsBlock, 'Item').map((entry)=>({
307
+ lineItemId: elementText(entry, 'LineItemID') || null,
308
+ sku: elementText(entry, 'SKU') || null,
309
+ name: elementText(entry, 'Name') || null,
310
+ quantity: Math.floor(Number(elementText(entry, 'Quantity')))
311
+ })).filter((entry)=>Number.isFinite(entry.quantity) && entry.quantity > 0);
312
+ // The order-level fields, read from the notice with its Items and
313
+ // Recipient taken out, so a recipient's or an item's element never
314
+ // answers for the order's.
315
+ const top = root.replace(/<Items(?:\s[^>]*)?>[\s\S]*?<\/Items\s*>/g, '').replace(/<Recipient(?:\s[^>]*)?>[\s\S]*?<\/Recipient\s*>/g, '');
316
+ return {
317
+ orderNumber: String((_query_order_number = query['order_number']) != null ? _query_order_number : '').trim() || elementText(top, 'OrderNumber') || null,
318
+ orderId: elementText(top, 'OrderID') || null,
319
+ carrier: String((_query_carrier = query['carrier']) != null ? _query_carrier : '').trim() || elementText(top, 'Carrier'),
320
+ service: String((_query_service = query['service']) != null ? _query_service : '').trim() || elementText(top, 'Service'),
321
+ trackingNumber: String((_query_tracking_number = query['tracking_number']) != null ? _query_tracking_number : '').trim() || elementText(top, 'TrackingNumber'),
322
+ items
323
+ };
324
+ }
325
+ /**
326
+ * ShipStation's carrier code as a name a buyer reads and `trackingUrlFor`
327
+ * knows — `usps` → `USPS`, `fedex` → `FedEx`. An unknown code is passed on
328
+ * as sent, upper-cased at the first letter.
329
+ */ export function shipStationCarrierName(code) {
330
+ const key = code.trim().toLowerCase();
331
+ const known = {
332
+ usps: 'USPS',
333
+ stamps_com: 'USPS',
334
+ endicia: 'USPS',
335
+ express_1: 'USPS',
336
+ ups: 'UPS',
337
+ ups_walleted: 'UPS',
338
+ ups_mail_innovations: 'UPS',
339
+ fedex: 'FedEx',
340
+ fedex_uk: 'FedEx',
341
+ fedex_walleted: 'FedEx',
342
+ dhl_express: 'DHL',
343
+ dhl_express_uk: 'DHL',
344
+ dhl_express_canada: 'DHL',
345
+ dhl_express_australia: 'DHL',
346
+ dhl_ecommerce: 'DHL eCommerce',
347
+ dhl_global_mail: 'DHL eCommerce',
348
+ canada_post: 'Canada Post',
349
+ canada_post_walleted: 'Canada Post',
350
+ royal_mail: 'Royal Mail',
351
+ australia_post: 'Australia Post',
352
+ ontrac: 'OnTrac',
353
+ lasership: 'LaserShip'
354
+ };
355
+ if (known[key]) return known[key];
356
+ if (!key) return '';
357
+ return code.trim().charAt(0).toUpperCase() + code.trim().slice(1);
358
+ }
359
+ /**
360
+ * Which order lines and how many units a notice ships, against the order.
361
+ * An item is found by the `LineItemID` the feed sent (the line's index),
362
+ * then by SKU among the lines still to ship. `null` lines means the notice
363
+ * named no items: everything still to ship went in this parcel. An item that
364
+ * names no line of this order is reported, not guessed at.
365
+ */ export function shipNoticeLines(order, items) {
366
+ var _order_lineItems;
367
+ if (!items.length) return {
368
+ lines: null,
369
+ unknown: []
370
+ };
371
+ const lineItems = (_order_lineItems = order.lineItems) != null ? _order_lineItems : [];
372
+ const lines = [];
373
+ const unknown = [];
374
+ for (const item of items){
375
+ const index = item.lineItemId !== null && /^\d+$/.test(item.lineItemId) ? Number(item.lineItemId) : NaN;
376
+ let lineItemId = Number.isInteger(index) && index < lineItems.length ? index : -1;
377
+ if (lineItemId < 0 && item.sku) {
378
+ const wanted = item.sku.trim().toLowerCase();
379
+ lineItemId = lineItems.findIndex((line)=>{
380
+ var _line_sku;
381
+ return ((_line_sku = line.sku) != null ? _line_sku : '').trim().toLowerCase() === wanted || (line.variantId ? `${line.productId}-${line.variantId}` : line.productId).toLowerCase() === wanted;
382
+ });
383
+ }
384
+ if (lineItemId < 0) {
385
+ unknown.push(item.sku || item.name || item.lineItemId || '?');
386
+ continue;
387
+ }
388
+ lines.push({
389
+ lineItemId,
390
+ quantity: item.quantity
391
+ });
392
+ }
393
+ return {
394
+ lines,
395
+ unknown
396
+ };
397
+ }
398
+
399
+ //# sourceMappingURL=shipstation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/model/shipstation.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 { PLATFORM_BRAND_NAME } from '@aglyn/aglyn/app-utils/platform-brand'\nimport type { HostOrder, OrderLineItem, OrderStatus } from './commerce-orders'\nimport { lineRequiresShipping } from './order-fulfillment'\nimport {\n gramsToOunces,\n shippingLines,\n shippingOrderNumber,\n type ProductWeights,\n} from './order-shipping-export'\n\n/*\n * SHIPSTATION'S CUSTOM STORE, AS PURE DATA (AGL-3613).\n *\n * ShipStation pulls a store's orders from one URL the merchant pastes into\n * its Custom Store connection, and posts each shipment back to the same URL\n * (Custom Store Development Guide, help.shipstation.com, read 2026-10-06):\n *\n * - `GET ?action=export&start_date=&end_date=&page=` answers an `<Orders\n * pages=\"n\">` document of every order MODIFIED in the window, whatever its\n * status. Dates are UTC, `MM/dd/yyyy HH:mm`. Free text sits in CDATA.\n * - `POST ?action=shipnotify&order_number=&carrier=&service=&tracking_number=`\n * carries a `<ShipNotice>` body naming the shipped items; any 2xx is\n * success.\n *\n * This module writes the feed and reads the notice. The route that serves\n * them, its credentials and its query live in `server/shipstation.ts`.\n *\n * ## The status names a merchant types into ShipStation\n *\n * ShipStation maps a store's own status names onto its five, and the mapping\n * is case-sensitive. These are the names this feed writes; the connection\n * card and the guide print them for the merchant to copy.\n */\n\nexport const SHIPSTATION_STATUS_NAMES = {\n unpaid: 'unpaid',\n paid: 'paid',\n shipped: 'shipped',\n canceled: 'canceled',\n onHold: 'on_hold',\n} as const\n\n/** An Aglyn order status as the feed names it to ShipStation. */\nexport function shipStationOrderStatus(status: OrderStatus): string {\n switch (status) {\n case 'pending':\n return SHIPSTATION_STATUS_NAMES.unpaid\n case 'paid':\n case 'partially_fulfilled':\n return SHIPSTATION_STATUS_NAMES.paid\n case 'fulfilled':\n case 'delivered':\n return SHIPSTATION_STATUS_NAMES.shipped\n case 'cancelled':\n case 'refunded':\n return SHIPSTATION_STATUS_NAMES.canceled\n }\n}\n\n/** Orders per page of the feed. ShipStation follows `pages` until it has them all. */\nexport const SHIPSTATION_PAGE_SIZE = 100\n\n/** The widest window one request may ask for: a year, which no import needs. */\nexport const SHIPSTATION_MAX_WINDOW_MS = 366 * 24 * 60 * 60 * 1000\n\nconst pad = (value: number): string => String(value).padStart(2, '0')\n\n/** Epoch milliseconds as ShipStation's `MM/dd/yyyy HH:mm`, in UTC. */\nexport function formatShipStationDate(ms: number): string {\n const date = new Date(ms)\n return (\n `${pad(date.getUTCMonth() + 1)}/${pad(date.getUTCDate())}/${date.getUTCFullYear()} ` +\n `${pad(date.getUTCHours())}:${pad(date.getUTCMinutes())}`\n )\n}\n\n/**\n * ShipStation's `MM/dd/yyyy HH:mm` (UTC; seconds and AM/PM tolerated) as\n * epoch milliseconds, or `null` when the text is not a date. An ISO date is\n * read too, for a merchant testing the URL by hand.\n */\nexport function parseShipStationDate(value: unknown): number | null {\n const text = String(value ?? '').trim()\n if (!text) return null\n const match = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})(?:[ T]+(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*([AaPp][Mm])?)?$/.exec(text)\n if (match) {\n const [, month, day, year, hourText, minute, second, meridiem] = match\n let hour = Number(hourText ?? 0)\n if (meridiem) {\n const pm = meridiem.toLowerCase() === 'pm'\n if (hour === 12) hour = pm ? 12 : 0\n else if (pm) hour += 12\n }\n const ms = Date.UTC(Number(year), Number(month) - 1, Number(day), hour, Number(minute ?? 0), Number(second ?? 0))\n const check = new Date(ms)\n if (check.getUTCMonth() !== Number(month) - 1 || check.getUTCDate() !== Number(day) || hour > 23) return null\n return ms\n }\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(text)) {\n const ms = Date.parse(text)\n return Number.isFinite(ms) ? ms : null\n }\n return null\n}\n\n/*==========================================\n * THE ORDERS FEED\n *=========================================*/\n\n/** What the feed knows about one variant of a product, read once per page. */\nexport interface ShipStationProductFacts {\n grams?: number\n imageUrl?: string\n /** The variant's option choices: `{ Size: 'L', Color: 'Blue' }`. */\n options?: Readonly<Record<string, string>>\n}\n\n/** Product id → variant id (`''` for the product itself) → its facts. */\nexport type ShipStationProducts = Readonly<Record<string, Readonly<Record<string, ShipStationProductFacts>>>>\n\n/** The weights the shared shipping reading takes, from the products' facts. */\nexport function weightsOfProducts(products: ShipStationProducts): ProductWeights {\n const weights: Record<string, Record<string, number>> = {}\n for (const [productId, variants] of Object.entries(products)) {\n for (const [variantId, facts] of Object.entries(variants)) {\n if (typeof facts.grams === 'number' && facts.grams > 0) {\n ;(weights[productId] ??= {})[variantId] = facts.grams\n }\n }\n }\n return weights\n}\n\nfunction factsFor(line: Pick<OrderLineItem, 'productId' | 'variantId'>, products: ShipStationProducts): ShipStationProductFacts {\n const variants = products[line.productId] ?? {}\n const own = line.variantId ? variants[line.variantId] : undefined\n const base = variants[''] ?? {}\n return { ...base, ...(own ?? {}) }\n}\n\n/** Characters XML 1.0 cannot carry at all, dropped before anything is written. */\n// eslint-disable-next-line no-control-regex\nconst XML_INVALID = /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F￾￿]/g\n\n/** Text bounded to `max` characters with every character XML refuses dropped. */\nfunction bounded(value: unknown, max: number): string {\n const text = value === null || value === undefined ? '' : String(value)\n return text.replace(XML_INVALID, '').trim().slice(0, max)\n}\n\n/**\n * Free text as a CDATA section, as the guide asks. A `]]>` inside the text\n * would end the section early, so it is split across two sections — the\n * standard escape, which reads back as the same characters.\n */\nexport function xmlCdata(value: unknown, max: number): string {\n const text = bounded(value, max)\n return text ? `<![CDATA[${text.replace(/]]>/g, ']]]]><![CDATA[>')}]]>` : ''\n}\n\n/** A plain value (a number, a date, a code) with the five XML entities escaped. */\nexport function xmlText(value: unknown, max = 100): string {\n return bounded(value, max)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n}\n\n/** Cents as the feed's decimal dollars, `12.50`. */\nfunction money(cents: unknown): string {\n const value = Math.round(Number(cents ?? 0))\n return (Number.isFinite(value) ? value / 100 : 0).toFixed(2)\n}\n\nconst element = (name: string, inner: string): string => `<${name}>${inner}</${name}>`\n\n/** One order as the feed needs it: the stored order and its document id. */\nexport interface ShipStationOrderSource {\n docId: string\n order: Partial<HostOrder> & { createdAtMs?: number; updatedAtMs?: number }\n}\n\n/**\n * Whether ShipStation can take this order at all: it insists on a ship-to\n * name, street, city, postal code and two-letter country. An order without\n * them could never become a label, and one invalid `<Order>` fails the whole\n * import, so it is left out of the feed rather than sent with a guess.\n */\nexport function shipStationCanImport(order: Partial<HostOrder>): boolean {\n const address = order.shippingAddress\n if (!address) return false\n const country = String(address.country ?? '').trim()\n return Boolean(\n String(address.line1 ?? '').trim() &&\n String(address.city ?? '').trim() &&\n String(address.postalCode ?? '').trim() &&\n /^[A-Za-z]{2}$/.test(country) &&\n String(address.name ?? order.customerName ?? '').trim(),\n )\n}\n\n/**\n * The items an order sends ShipStation. An order still to be shipped sends\n * what is LEFT — a partially fulfilled order asks for the rest, never the\n * whole order twice. A shipped or canceled order sends its shippable lines\n * whole, which ShipStation only reads to show the order it is moving.\n */\nfunction feedItems(source: ShipStationOrderSource, products: ShipStationProducts): string[] {\n const { order } = source\n const status = (order.status ?? 'paid') as OrderStatus\n const lineItems = order.lineItems ?? []\n const open = status === 'paid' || status === 'partially_fulfilled' || status === 'pending'\n const entries = open\n ? shippingLines({ lineItems, fulfillments: order.fulfillments ?? [] }, weightsOfProducts(products)).map((entry) => ({\n lineItemId: entry.lineItemId,\n line: entry.line,\n quantity: entry.quantity,\n }))\n : lineItems\n .map((line, lineItemId) => ({ lineItemId, line, quantity: Math.max(0, Math.floor(Number(line?.quantity ?? 0))) }))\n .filter((entry) => entry.line && lineRequiresShipping(entry.line) && entry.quantity > 0)\n const items = entries.map(({ lineItemId, line, quantity }) => {\n const facts = factsFor(line, products)\n const ounces = typeof facts.grams === 'number' && facts.grams > 0 ? gramsToOunces(facts.grams) : null\n const options = Object.entries(facts.options ?? {})\n .filter(([name, value]) => String(name).trim() && String(value).trim())\n .slice(0, 10)\n return element(\n 'Item',\n [\n element('LineItemID', xmlText(String(lineItemId), 50)),\n element('SKU', xmlCdata(line.sku || (line.variantId ? `${line.productId}-${line.variantId}` : line.productId), 100)),\n element('Name', xmlCdata(`${line.name}${line.variantLabel ? ` (${line.variantLabel})` : ''}`, 200)),\n facts.imageUrl && /^https:\\/\\//.test(facts.imageUrl) ? element('ImageUrl', xmlCdata(facts.imageUrl, 500)) : '',\n ounces !== null ? element('Weight', ounces.toFixed(2)) + element('WeightUnits', 'Ounces') : '',\n element('Quantity', String(quantity)),\n element('UnitPrice', money(line.unitAmountCents)),\n options.length\n ? element(\n 'Options',\n options\n .map(([name, value]) => element('Option', element('Name', xmlCdata(name, 100)) + element('Value', xmlCdata(value, 100))))\n .join(''),\n )\n : '',\n ].join(''),\n )\n })\n // The order's discount, as the guide's adjustment line: negative and\n // flagged, so ShipStation's totals agree with what the buyer paid.\n const discountCents = Math.round(Number(order.totals?.discountCents ?? 0))\n if (discountCents > 0) {\n items.push(\n element(\n 'Item',\n element('SKU', '') +\n element('Name', xmlCdata(order.couponCode ? `Discount (${order.couponCode})` : 'Discount', 200)) +\n element('Quantity', '1') +\n element('UnitPrice', `-${money(discountCents)}`) +\n element('Adjustment', 'true'),\n ),\n )\n }\n return items\n}\n\n/** One `<Order>` element of the feed. */\nexport function shipStationOrderXml(source: ShipStationOrderSource, products: ShipStationProducts = {}): string {\n const { docId, order } = source\n const status = (order.status ?? 'paid') as OrderStatus\n const created = Number(order.createdAtMs ?? 0) || Date.now()\n const modified = Number(order.updatedAtMs ?? created) || created\n const ship = order.shippingAddress ?? {}\n const bill = order.billingAddress ?? {}\n const email = bounded(order.customerEmail, 100)\n const recipient = ship.name || order.customerName || ''\n const totals = order.totals\n return element(\n 'Order',\n [\n element('OrderID', xmlCdata(docId, 50)),\n element('OrderNumber', xmlCdata(shippingOrderNumber(order, docId), 50)),\n element('OrderDate', formatShipStationDate(created)),\n element('OrderStatus', xmlCdata(shipStationOrderStatus(status), 50)),\n element('LastModified', formatShipStationDate(modified)),\n element('CurrencyCode', 'USD'),\n element('OrderTotal', money(totals?.totalCents ?? order.amountCents)),\n element('TaxAmount', money(totals?.taxCents)),\n element('ShippingAmount', money(totals?.shippingCents)),\n order.note ? element('InternalNotes', xmlCdata(order.note, 1000)) : '',\n element('Source', xmlCdata(order.channel === 'pos' ? `${PLATFORM_BRAND_NAME} POS` : PLATFORM_BRAND_NAME, 50)),\n element(\n 'Customer',\n [\n element('CustomerCode', xmlCdata(email || docId, 100)),\n element(\n 'BillTo',\n [\n element('Name', xmlCdata(bill.name || order.customerName || recipient, 100)),\n bill.phone || order.customerPhone ? element('Phone', xmlCdata(bill.phone || order.customerPhone, 50)) : '',\n email ? element('Email', xmlCdata(email, 100)) : '',\n ].join(''),\n ),\n element(\n 'ShipTo',\n [\n element('Name', xmlCdata(recipient, 100)),\n element('Address1', xmlCdata(ship.line1, 200)),\n ship.line2 ? element('Address2', xmlCdata(ship.line2, 200)) : '',\n element('City', xmlCdata(ship.city, 100)),\n ship.state ? element('State', xmlCdata(ship.state, 100)) : '',\n element('PostalCode', xmlCdata(ship.postalCode, 50)),\n element('Country', xmlCdata(String(ship.country ?? '').toUpperCase(), 2)),\n ship.phone ? element('Phone', xmlCdata(ship.phone, 50)) : '',\n ].join(''),\n ),\n ].join(''),\n ),\n element('Items', feedItems(source, products).join('')),\n ].join(''),\n )\n}\n\n/** The whole `<Orders>` document for one page. */\nexport function shipStationOrdersXml(orders: readonly string[], pages: number): string {\n return `<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n<Orders pages=\"${Math.max(1, Math.floor(pages))}\">${orders.join('')}</Orders>`\n}\n\n/*==========================================\n * THE SHIP NOTICE\n *=========================================*/\n\n/** One shipped line of a notice. */\nexport interface ShipNoticeItem {\n lineItemId: string | null\n sku: string | null\n name: string | null\n quantity: number\n}\n\n/** What a ShipNotice says, from its query string and its body together. */\nexport interface ShipNotice {\n orderNumber: string | null\n orderId: string | null\n carrier: string\n service: string\n trackingNumber: string\n items: ShipNoticeItem[]\n}\n\nconst XML_ENTITIES: Readonly<Record<string, string>> = { lt: '<', gt: '>', amp: '&', quot: '\"', apos: \"'\" }\n\n/** XML character data with its five entities and numeric references decoded. Nothing else expands. */\nfunction decodeEntities(text: string): string {\n return text.replace(/&(#x[0-9a-fA-F]{1,6}|#\\d{1,7}|lt|gt|amp|quot|apos);/g, (whole, code: string) => {\n if (code[0] !== '#') return XML_ENTITIES[code] ?? whole\n const point = code[1] === 'x' ? parseInt(code.slice(2), 16) : parseInt(code.slice(1), 10)\n return Number.isFinite(point) && point > 0 && point <= 0x10ffff ? String.fromCodePoint(point) : ''\n })\n}\n\n/** An element's content as text: CDATA sections taken as written, the rest entity-decoded. */\nfunction contentText(raw: string): string {\n let out = ''\n let at = 0\n const cdata = /<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/g\n for (let match = cdata.exec(raw); match; match = cdata.exec(raw)) {\n out += decodeEntities(raw.slice(at, match.index).replace(/<[^>]*>/g, ''))\n out += match[1]\n at = match.index + match[0].length\n }\n out += decodeEntities(raw.slice(at).replace(/<[^>]*>/g, ''))\n return out.trim()\n}\n\n/** The text of the first `<name>` element in `xml`, or `''`. */\nfunction elementText(xml: string, name: string): string {\n const match = new RegExp(`<${name}(?:\\\\s[^>]*)?>([\\\\s\\\\S]*?)</${name}\\\\s*>`).exec(xml)\n return match ? contentText(match[1]) : ''\n}\n\n/** The inner XML of every `<name>` element in `xml`. */\nfunction elementBodies(xml: string, name: string): string[] {\n const pattern = new RegExp(`<${name}(?:\\\\s[^>]*)?>([\\\\s\\\\S]*?)</${name}\\\\s*>`, 'g')\n const bodies: string[] = []\n for (let match = pattern.exec(xml); match; match = pattern.exec(xml)) bodies.push(match[1])\n return bodies\n}\n\n/**\n * A `<ShipNotice>` body read into a notice, or the reason it cannot be.\n *\n * Read by name, not by a general parser: the notice is a fixed, flat set of\n * elements, and a document type declaration is refused outright, so no\n * entity is ever defined or expanded beyond XML's five. The query string's\n * `order_number`, `carrier`, `service` and `tracking_number` win when\n * present — the guide names them first — and the body fills the rest.\n */\nexport function readShipNotice(\n xml: string,\n query: Readonly<Record<string, string | undefined>>,\n): ShipNotice | { problem: string } {\n const body = String(xml ?? '')\n if (/<!DOCTYPE|<!ENTITY/i.test(body)) return { problem: `The notice declares a document type, which ${PLATFORM_BRAND_NAME} does not read.` }\n const root = elementBodies(body, 'ShipNotice')[0] ?? ''\n if (body.trim() && !root) return { problem: 'The notice is not a ShipNotice.' }\n const itemsBlock = elementBodies(root, 'Items')[0] ?? ''\n const items: ShipNoticeItem[] = elementBodies(itemsBlock, 'Item')\n .map((entry) => ({\n lineItemId: elementText(entry, 'LineItemID') || null,\n sku: elementText(entry, 'SKU') || null,\n name: elementText(entry, 'Name') || null,\n quantity: Math.floor(Number(elementText(entry, 'Quantity'))),\n }))\n .filter((entry) => Number.isFinite(entry.quantity) && entry.quantity > 0)\n // The order-level fields, read from the notice with its Items and\n // Recipient taken out, so a recipient's or an item's element never\n // answers for the order's.\n const top = root.replace(/<Items(?:\\s[^>]*)?>[\\s\\S]*?<\\/Items\\s*>/g, '').replace(/<Recipient(?:\\s[^>]*)?>[\\s\\S]*?<\\/Recipient\\s*>/g, '')\n return {\n orderNumber: String(query['order_number'] ?? '').trim() || elementText(top, 'OrderNumber') || null,\n orderId: elementText(top, 'OrderID') || null,\n carrier: String(query['carrier'] ?? '').trim() || elementText(top, 'Carrier'),\n service: String(query['service'] ?? '').trim() || elementText(top, 'Service'),\n trackingNumber: String(query['tracking_number'] ?? '').trim() || elementText(top, 'TrackingNumber'),\n items,\n }\n}\n\n/**\n * ShipStation's carrier code as a name a buyer reads and `trackingUrlFor`\n * knows — `usps` → `USPS`, `fedex` → `FedEx`. An unknown code is passed on\n * as sent, upper-cased at the first letter.\n */\nexport function shipStationCarrierName(code: string): string {\n const key = code.trim().toLowerCase()\n const known: Record<string, string> = {\n usps: 'USPS',\n stamps_com: 'USPS',\n endicia: 'USPS',\n express_1: 'USPS',\n ups: 'UPS',\n ups_walleted: 'UPS',\n ups_mail_innovations: 'UPS',\n fedex: 'FedEx',\n fedex_uk: 'FedEx',\n fedex_walleted: 'FedEx',\n dhl_express: 'DHL',\n dhl_express_uk: 'DHL',\n dhl_express_canada: 'DHL',\n dhl_express_australia: 'DHL',\n dhl_ecommerce: 'DHL eCommerce',\n dhl_global_mail: 'DHL eCommerce',\n canada_post: 'Canada Post',\n canada_post_walleted: 'Canada Post',\n royal_mail: 'Royal Mail',\n australia_post: 'Australia Post',\n ontrac: 'OnTrac',\n lasership: 'LaserShip',\n }\n if (known[key]) return known[key]\n if (!key) return ''\n return code.trim().charAt(0).toUpperCase() + code.trim().slice(1)\n}\n\n/**\n * Which order lines and how many units a notice ships, against the order.\n * An item is found by the `LineItemID` the feed sent (the line's index),\n * then by SKU among the lines still to ship. `null` lines means the notice\n * named no items: everything still to ship went in this parcel. An item that\n * names no line of this order is reported, not guessed at.\n */\nexport function shipNoticeLines(\n order: Pick<HostOrder, 'lineItems' | 'fulfillments'>,\n items: readonly ShipNoticeItem[],\n): { lines: Array<{ lineItemId: number; quantity: number }> | null; unknown: string[] } {\n if (!items.length) return { lines: null, unknown: [] }\n const lineItems = order.lineItems ?? []\n const lines: Array<{ lineItemId: number; quantity: number }> = []\n const unknown: string[] = []\n for (const item of items) {\n const index = item.lineItemId !== null && /^\\d+$/.test(item.lineItemId) ? Number(item.lineItemId) : NaN\n let lineItemId = Number.isInteger(index) && index < lineItems.length ? index : -1\n if (lineItemId < 0 && item.sku) {\n const wanted = item.sku.trim().toLowerCase()\n lineItemId = lineItems.findIndex(\n (line) =>\n (line.sku ?? '').trim().toLowerCase() === wanted ||\n (line.variantId ? `${line.productId}-${line.variantId}` : line.productId).toLowerCase() === wanted,\n )\n }\n if (lineItemId < 0) {\n unknown.push(item.sku || item.name || item.lineItemId || '?')\n continue\n }\n lines.push({ lineItemId, quantity: item.quantity })\n }\n return { lines, unknown }\n}\n"],"names":["PLATFORM_BRAND_NAME","lineRequiresShipping","gramsToOunces","shippingLines","shippingOrderNumber","SHIPSTATION_STATUS_NAMES","unpaid","paid","shipped","canceled","onHold","shipStationOrderStatus","status","SHIPSTATION_PAGE_SIZE","SHIPSTATION_MAX_WINDOW_MS","pad","value","String","padStart","formatShipStationDate","ms","date","Date","getUTCMonth","getUTCDate","getUTCFullYear","getUTCHours","getUTCMinutes","parseShipStationDate","text","trim","match","exec","month","day","year","hourText","minute","second","meridiem","hour","Number","pm","toLowerCase","UTC","check","test","parse","isFinite","weightsOfProducts","products","weights","productId","variants","Object","entries","variantId","facts","grams","factsFor","line","own","undefined","base","XML_INVALID","bounded","max","replace","slice","xmlCdata","xmlText","money","cents","Math","round","toFixed","element","name","inner","shipStationCanImport","order","address","shippingAddress","country","Boolean","line1","city","postalCode","customerName","feedItems","source","lineItems","open","fulfillments","map","entry","lineItemId","quantity","floor","filter","items","ounces","options","sku","variantLabel","imageUrl","unitAmountCents","length","join","discountCents","totals","push","couponCode","shipStationOrderXml","ship","docId","created","createdAtMs","now","modified","updatedAtMs","bill","billingAddress","email","customerEmail","recipient","totalCents","amountCents","taxCents","shippingCents","note","channel","phone","customerPhone","line2","state","toUpperCase","shipStationOrdersXml","orders","pages","XML_ENTITIES","lt","gt","amp","quot","apos","decodeEntities","whole","code","point","parseInt","fromCodePoint","contentText","raw","out","at","cdata","index","elementText","xml","RegExp","elementBodies","pattern","bodies","readShipNotice","query","body","problem","root","itemsBlock","top","orderNumber","orderId","carrier","service","trackingNumber","shipStationCarrierName","key","known","usps","stamps_com","endicia","express_1","ups","ups_walleted","ups_mail_innovations","fedex","fedex_uk","fedex_walleted","dhl_express","dhl_express_uk","dhl_express_canada","dhl_express_australia","dhl_ecommerce","dhl_global_mail","canada_post","canada_post_walleted","royal_mail","australia_post","ontrac","lasership","charAt","shipNoticeLines","lines","unknown","item","NaN","isInteger","wanted","findIndex"],"mappings":"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"}
@@ -0,0 +1,32 @@
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 Firestore } from 'firebase/firestore';
18
+ import { productCollectionIds, type SmartCollectionRules } from './commerce';
19
+ /**
20
+ * Every smart catalog collection on the host, with the rules membership is
21
+ * computed from. Two equalities, which Firestore's single-field indexes
22
+ * answer without a composite; content collections share the path and are
23
+ * excluded by `kind`.
24
+ */
25
+ export declare function readSmartCollections(firestore: Firestore, hostId: string): Promise<SmartCollectionRules[]>;
26
+ /**
27
+ * The `collectionIds` field for a product as it is about to be written.
28
+ * Spread it beside the rest of the payload.
29
+ */
30
+ export declare function productCollectionFields(firestore: Firestore, hostId: string, product: Parameters<typeof productCollectionIds>[0], smartCollections?: readonly SmartCollectionRules[]): Promise<{
31
+ collectionIds: string[];
32
+ }>;
@@ -0,0 +1,63 @@
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 { collection, getDocs, query, where } from "firebase/firestore";
17
+ import { productCollectionIds } from "./commerce.js";
18
+ /*
19
+ * THE HOST'S SMART COLLECTIONS, AS A PRODUCT WRITER NEEDS THEM (AGL-3321).
20
+ *
21
+ * A product carries `collectionIds` — the smart collections its rules
22
+ * answer — because the storefront reads a smart collection no query can
23
+ * express by that array. So every console path that writes a product's
24
+ * name, tags, categories, variants or type asks the STORE for the host's
25
+ * smart collections at the moment it writes, and stamps the membership
26
+ * `productCollectionIds` computes from them. Asked at write time rather
27
+ * than read off a listener: a listener's rows can be a cached picture, and a
28
+ * membership computed from a stale rule set is the drift this field exists
29
+ * to prevent. When a smart collection itself changes, the
30
+ * `commerce/collection-membership` route re-stamps every product instead.
31
+ *
32
+ * The native app's copy (AGL-3621). The console keeps its own in
33
+ * `components/console/smart-collections.ts`, untouched, because a web bundle
34
+ * may not grow by a byte for the app; `smart-collection-reads.spec.ts` holds
35
+ * the two to the same query and the same answer. Not in the model barrel: it
36
+ * reads through the browser SDK, and the barrel is server code's too.
37
+ */ /**
38
+ * Every smart catalog collection on the host, with the rules membership is
39
+ * computed from. Two equalities, which Firestore's single-field indexes
40
+ * answer without a composite; content collections share the path and are
41
+ * excluded by `kind`.
42
+ */ export async function readSmartCollections(firestore, hostId) {
43
+ const snapshot = await getDocs(query(collection(firestore, 'hosts', hostId, 'collections'), where('kind', '==', 'catalog'), where('mode', '==', 'smart')));
44
+ return snapshot.docs.map((entry)=>{
45
+ var _entry_get;
46
+ return {
47
+ id: entry.id,
48
+ rules: (_entry_get = entry.get('rules')) != null ? _entry_get : [],
49
+ matchAll: entry.get('matchAll')
50
+ };
51
+ });
52
+ }
53
+ /**
54
+ * The `collectionIds` field for a product as it is about to be written.
55
+ * Spread it beside the rest of the payload.
56
+ */ export async function productCollectionFields(firestore, hostId, product, smartCollections) {
57
+ const rules = smartCollections != null ? smartCollections : await readSmartCollections(firestore, hostId);
58
+ return {
59
+ collectionIds: productCollectionIds(product, rules)
60
+ };
61
+ }
62
+
63
+ //# sourceMappingURL=smart-collection-reads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/model/smart-collection-reads.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 {\n collection,\n type Firestore,\n getDocs,\n query,\n where,\n} from 'firebase/firestore'\nimport { productCollectionIds, type SmartCollectionRules } from './commerce'\n\n/*\n * THE HOST'S SMART COLLECTIONS, AS A PRODUCT WRITER NEEDS THEM (AGL-3321).\n *\n * A product carries `collectionIds` — the smart collections its rules\n * answer — because the storefront reads a smart collection no query can\n * express by that array. So every console path that writes a product's\n * name, tags, categories, variants or type asks the STORE for the host's\n * smart collections at the moment it writes, and stamps the membership\n * `productCollectionIds` computes from them. Asked at write time rather\n * than read off a listener: a listener's rows can be a cached picture, and a\n * membership computed from a stale rule set is the drift this field exists\n * to prevent. When a smart collection itself changes, the\n * `commerce/collection-membership` route re-stamps every product instead.\n *\n * The native app's copy (AGL-3621). The console keeps its own in\n * `components/console/smart-collections.ts`, untouched, because a web bundle\n * may not grow by a byte for the app; `smart-collection-reads.spec.ts` holds\n * the two to the same query and the same answer. Not in the model barrel: it\n * reads through the browser SDK, and the barrel is server code's too.\n */\n\n/**\n * Every smart catalog collection on the host, with the rules membership is\n * computed from. Two equalities, which Firestore's single-field indexes\n * answer without a composite; content collections share the path and are\n * excluded by `kind`.\n */\nexport async function readSmartCollections(\n firestore: Firestore,\n hostId: string,\n): Promise<SmartCollectionRules[]> {\n const snapshot = await getDocs(\n query(\n collection(firestore, 'hosts', hostId, 'collections'),\n where('kind', '==', 'catalog'),\n where('mode', '==', 'smart'),\n ),\n )\n return snapshot.docs.map((entry) => ({\n id: entry.id,\n rules: entry.get('rules') ?? [],\n matchAll: entry.get('matchAll'),\n }))\n}\n\n/**\n * The `collectionIds` field for a product as it is about to be written.\n * Spread it beside the rest of the payload.\n */\nexport async function productCollectionFields(\n firestore: Firestore,\n hostId: string,\n product: Parameters<typeof productCollectionIds>[0],\n smartCollections?: readonly SmartCollectionRules[],\n): Promise<{ collectionIds: string[] }> {\n const rules = smartCollections ?? (await readSmartCollections(firestore, hostId))\n return { collectionIds: productCollectionIds(product, rules) }\n}\n"],"names":["collection","getDocs","query","where","productCollectionIds","readSmartCollections","firestore","hostId","snapshot","docs","map","entry","id","rules","get","matchAll","productCollectionFields","product","smartCollections","collectionIds"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,SACEA,UAAU,EAEVC,OAAO,EACPC,KAAK,EACLC,KAAK,QACA,qBAAoB;AAC3B,SAASC,oBAAoB,QAAmC,gBAAY;AAE5E;;;;;;;;;;;;;;;;;;;CAmBC,GAED;;;;;CAKC,GACD,OAAO,eAAeC,qBACpBC,SAAoB,EACpBC,MAAc;IAEd,MAAMC,WAAW,MAAMP,QACrBC,MACEF,WAAWM,WAAW,SAASC,QAAQ,gBACvCJ,MAAM,QAAQ,MAAM,YACpBA,MAAM,QAAQ,MAAM;IAGxB,OAAOK,SAASC,IAAI,CAACC,GAAG,CAAC,CAACC;YAEjBA;eAF4B;YACnCC,IAAID,MAAMC,EAAE;YACZC,KAAK,GAAEF,aAAAA,MAAMG,GAAG,CAAC,oBAAVH,aAAsB,EAAE;YAC/BI,UAAUJ,MAAMG,GAAG,CAAC;QACtB;;AACF;AAEA;;;CAGC,GACD,OAAO,eAAeE,wBACpBV,SAAoB,EACpBC,MAAc,EACdU,OAAmD,EACnDC,gBAAkD;IAElD,MAAML,QAAQK,2BAAAA,mBAAqB,MAAMb,qBAAqBC,WAAWC;IACzE,OAAO;QAAEY,eAAef,qBAAqBa,SAASJ;IAAO;AAC/D"}