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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. package/package.json +13 -13
  2. package/src/index.d.ts +0 -1
  3. package/src/index.js +0 -1
  4. package/src/index.js.map +1 -1
  5. package/src/lib/barcode/barcode-decode.d.ts +71 -0
  6. package/src/lib/barcode/barcode-decode.js +498 -0
  7. package/src/lib/barcode/barcode-decode.js.map +1 -0
  8. package/src/lib/barcode/barcode-encode.d.ts +44 -0
  9. package/src/lib/barcode/barcode-encode.js +138 -0
  10. package/src/lib/barcode/barcode-encode.js.map +1 -0
  11. package/src/lib/barcode/barcode-scanner.component.d.ts +23 -0
  12. package/src/lib/barcode/barcode-scanner.component.js +260 -0
  13. package/src/lib/barcode/barcode-scanner.component.js.map +1 -0
  14. package/src/lib/barcode/scan-button.component.d.ts +10 -0
  15. package/src/lib/barcode/scan-button.component.js +62 -0
  16. package/src/lib/barcode/scan-button.component.js.map +1 -0
  17. package/src/lib/barcode/scanner-wedge.d.ts +35 -0
  18. package/src/lib/barcode/scanner-wedge.js +108 -0
  19. package/src/lib/barcode/scanner-wedge.js.map +1 -0
  20. package/src/lib/components/account.js +10 -1
  21. package/src/lib/components/account.js.map +1 -1
  22. package/src/lib/components/cart-extras.d.ts +45 -0
  23. package/src/lib/components/cart-extras.js +127 -0
  24. package/src/lib/components/cart-extras.js.map +1 -0
  25. package/src/lib/components/cart.js +82 -15
  26. package/src/lib/components/cart.js.map +1 -1
  27. package/src/lib/components/checkout-return-notice.d.ts +26 -0
  28. package/src/lib/components/checkout-return-notice.js +48 -0
  29. package/src/lib/components/checkout-return-notice.js.map +1 -0
  30. package/src/lib/components/commerce-console-page.js +124 -0
  31. package/src/lib/components/commerce-console-page.js.map +1 -1
  32. package/src/lib/components/commerce-console-sections.d.ts +1 -1
  33. package/src/lib/components/commerce-console-sections.js +4 -0
  34. package/src/lib/components/commerce-console-sections.js.map +1 -1
  35. package/src/lib/components/console/bulk-fulfill.d.ts +44 -0
  36. package/src/lib/components/console/bulk-fulfill.js +84 -0
  37. package/src/lib/components/console/bulk-fulfill.js.map +1 -0
  38. package/src/lib/components/console/customer-notifications-card.component.d.ts +19 -0
  39. package/src/lib/components/console/customer-notifications-card.component.js +149 -0
  40. package/src/lib/components/console/customer-notifications-card.component.js.map +1 -0
  41. package/src/lib/components/console/host-orders-card.component.js +84 -5
  42. package/src/lib/components/console/host-orders-card.component.js.map +1 -1
  43. package/src/lib/components/console/locations-card.component.js +164 -57
  44. package/src/lib/components/console/locations-card.component.js.map +1 -1
  45. package/src/lib/components/console/order-detail-dialog.component.js +209 -61
  46. package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
  47. package/src/lib/components/console/order-fulfillment-panel.component.d.ts +48 -0
  48. package/src/lib/components/console/order-fulfillment-panel.component.js +542 -0
  49. package/src/lib/components/console/order-fulfillment-panel.component.js.map +1 -0
  50. package/src/lib/components/console/order-invoice.component.d.ts +33 -0
  51. package/src/lib/components/console/order-invoice.component.js +81 -0
  52. package/src/lib/components/console/order-invoice.component.js.map +1 -0
  53. package/src/lib/components/console/order-receipt-resend.component.d.ts +21 -0
  54. package/src/lib/components/console/order-receipt-resend.component.js +203 -0
  55. package/src/lib/components/console/order-receipt-resend.component.js.map +1 -0
  56. package/src/lib/components/console/order-returns.component.d.ts +36 -0
  57. package/src/lib/components/console/order-returns.component.js +142 -0
  58. package/src/lib/components/console/order-returns.component.js.map +1 -0
  59. package/src/lib/components/console/order-shipping-actions.component.d.ts +54 -0
  60. package/src/lib/components/console/order-shipping-actions.component.js +149 -0
  61. package/src/lib/components/console/order-shipping-actions.component.js.map +1 -0
  62. package/src/lib/components/console/order-webhooks-card.component.d.ts +50 -0
  63. package/src/lib/components/console/order-webhooks-card.component.js +623 -0
  64. package/src/lib/components/console/order-webhooks-card.component.js.map +1 -0
  65. package/src/lib/components/console/order-zones.d.ts +155 -0
  66. package/src/lib/components/console/order-zones.js +40 -0
  67. package/src/lib/components/console/order-zones.js.map +1 -0
  68. package/src/lib/components/console/payment-methods-card.component.d.ts +67 -0
  69. package/src/lib/components/console/payment-methods-card.component.js +395 -0
  70. package/src/lib/components/console/payment-methods-card.component.js.map +1 -0
  71. package/src/lib/components/console/pos/pos-api.d.ts +124 -0
  72. package/src/lib/components/console/pos/pos-api.js +101 -0
  73. package/src/lib/components/console/pos/pos-api.js.map +1 -0
  74. package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +36 -0
  75. package/src/lib/components/console/pos/pos-cart-panel.component.js +160 -0
  76. package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -0
  77. package/src/lib/components/console/pos/pos-item-dialog.component.d.ts +39 -0
  78. package/src/lib/components/console/pos/pos-item-dialog.component.js +352 -0
  79. package/src/lib/components/console/pos/pos-item-dialog.component.js.map +1 -0
  80. package/src/lib/components/console/pos/pos-product-grid.component.d.ts +47 -0
  81. package/src/lib/components/console/pos/pos-product-grid.component.js +272 -0
  82. package/src/lib/components/console/pos/pos-product-grid.component.js.map +1 -0
  83. package/src/lib/components/console/pos/pos-receipt-panel.component.d.ts +27 -0
  84. package/src/lib/components/console/pos/pos-receipt-panel.component.js +282 -0
  85. package/src/lib/components/console/pos/pos-receipt-panel.component.js.map +1 -0
  86. package/src/lib/components/console/pos/pos-tender-dialogs.component.d.ts +53 -0
  87. package/src/lib/components/console/pos/pos-tender-dialogs.component.js +445 -0
  88. package/src/lib/components/console/pos/pos-tender-dialogs.component.js.map +1 -0
  89. package/src/lib/components/console/pos/pos-tender-panel.component.d.ts +31 -0
  90. package/src/lib/components/console/pos/pos-tender-panel.component.js +640 -0
  91. package/src/lib/components/console/pos/pos-tender-panel.component.js.map +1 -0
  92. package/src/lib/components/console/pos/use-pos-display.d.ts +43 -0
  93. package/src/lib/components/console/pos/use-pos-display.js +161 -0
  94. package/src/lib/components/console/pos/use-pos-display.js.map +1 -0
  95. package/src/lib/components/console/pos-devices-card.component.d.ts +14 -0
  96. package/src/lib/components/console/pos-devices-card.component.js +546 -0
  97. package/src/lib/components/console/pos-devices-card.component.js.map +1 -0
  98. package/src/lib/components/console/pos-display/brand-screen.d.ts +33 -0
  99. package/src/lib/components/console/pos-display/brand-screen.js +85 -0
  100. package/src/lib/components/console/pos-display/brand-screen.js.map +1 -0
  101. package/src/lib/components/console/pos-display/cart-screen.d.ts +29 -0
  102. package/src/lib/components/console/pos-display/cart-screen.js +166 -0
  103. package/src/lib/components/console/pos-display/cart-screen.js.map +1 -0
  104. package/src/lib/components/console/pos-display/pairing-screen.d.ts +24 -0
  105. package/src/lib/components/console/pos-display/pairing-screen.js +127 -0
  106. package/src/lib/components/console/pos-display/pairing-screen.js.map +1 -0
  107. package/src/lib/components/console/pos-display/pos-display-api.d.ts +90 -0
  108. package/src/lib/components/console/pos-display/pos-display-api.js +140 -0
  109. package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -0
  110. package/src/lib/components/console/pos-display/receipt-screen.d.ts +35 -0
  111. package/src/lib/components/console/pos-display/receipt-screen.js +200 -0
  112. package/src/lib/components/console/pos-display/receipt-screen.js.map +1 -0
  113. package/src/lib/components/console/pos-display/tip-screen.d.ts +36 -0
  114. package/src/lib/components/console/pos-display/tip-screen.js +211 -0
  115. package/src/lib/components/console/pos-display/tip-screen.js.map +1 -0
  116. package/src/lib/components/console/pos-display-page.component.d.ts +16 -0
  117. package/src/lib/components/console/pos-display-page.component.js +407 -0
  118. package/src/lib/components/console/pos-display-page.component.js.map +1 -0
  119. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.d.ts +40 -0
  120. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js +289 -0
  121. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js.map +1 -0
  122. package/src/lib/components/console/pos-ops/pos-last-receipt.component.d.ts +34 -0
  123. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js +61 -0
  124. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js.map +1 -0
  125. package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +38 -0
  126. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +129 -0
  127. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -0
  128. package/src/lib/components/console/pos-ops/pos-ops-api.d.ts +37 -0
  129. package/src/lib/components/console/pos-ops/pos-ops-api.js +60 -0
  130. package/src/lib/components/console/pos-ops/pos-ops-api.js.map +1 -0
  131. package/src/lib/components/console/pos-ops/pos-pin-pad.component.d.ts +48 -0
  132. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js +220 -0
  133. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js.map +1 -0
  134. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.d.ts +63 -0
  135. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js +186 -0
  136. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js.map +1 -0
  137. package/src/lib/components/console/pos-ops/pos-receipt.d.ts +39 -0
  138. package/src/lib/components/console/pos-ops/pos-receipt.js +182 -0
  139. package/src/lib/components/console/pos-ops/pos-receipt.js.map +1 -0
  140. package/src/lib/components/console/pos-ops/pos-return-dialog.component.d.ts +40 -0
  141. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js +465 -0
  142. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js.map +1 -0
  143. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.d.ts +29 -0
  144. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js +253 -0
  145. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js.map +1 -0
  146. package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +34 -0
  147. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +494 -0
  148. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -0
  149. package/src/lib/components/console/pos-ops/pos-shift-report.component.d.ts +37 -0
  150. package/src/lib/components/console/pos-ops/pos-shift-report.component.js +102 -0
  151. package/src/lib/components/console/pos-ops/pos-shift-report.component.js.map +1 -0
  152. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.d.ts +30 -0
  153. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js +277 -0
  154. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js.map +1 -0
  155. package/src/lib/components/console/pos-ops/register-ops.d.ts +28 -0
  156. package/src/lib/components/console/pos-ops/register-ops.js +28 -0
  157. package/src/lib/components/console/pos-ops/register-ops.js.map +1 -0
  158. package/src/lib/components/console/pos-ops/use-pos-cashier.d.ts +46 -0
  159. package/src/lib/components/console/pos-ops/use-pos-cashier.js +128 -0
  160. package/src/lib/components/console/pos-ops/use-pos-cashier.js.map +1 -0
  161. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.d.ts +36 -0
  162. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js +64 -0
  163. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js.map +1 -0
  164. package/src/lib/components/console/pos-page.component.d.ts +13 -5
  165. package/src/lib/components/console/pos-page.component.js +729 -657
  166. package/src/lib/components/console/pos-page.component.js.map +1 -1
  167. package/src/lib/components/console/product-editor-dialog.component.js +51 -7
  168. package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
  169. package/src/lib/components/console/product-labels-dialog.component.d.ts +13 -0
  170. package/src/lib/components/console/product-labels-dialog.component.js +197 -0
  171. package/src/lib/components/console/product-labels-dialog.component.js.map +1 -0
  172. package/src/lib/components/console/product-register-fields.component.d.ts +19 -0
  173. package/src/lib/components/console/product-register-fields.component.js +241 -0
  174. package/src/lib/components/console/product-register-fields.component.js.map +1 -0
  175. package/src/lib/components/console/product-zones.d.ts +58 -2
  176. package/src/lib/components/console/product-zones.js +10 -2
  177. package/src/lib/components/console/product-zones.js.map +1 -1
  178. package/src/lib/components/console/products-hub-card.component.js +51 -11
  179. package/src/lib/components/console/products-hub-card.component.js.map +1 -1
  180. package/src/lib/components/console/register-hardware-card.component.d.ts +33 -0
  181. package/src/lib/components/console/register-hardware-card.component.js +826 -0
  182. package/src/lib/components/console/register-hardware-card.component.js.map +1 -0
  183. package/src/lib/components/console/registers-card.component.js +24 -5
  184. package/src/lib/components/console/registers-card.component.js.map +1 -1
  185. package/src/lib/components/console/return-actions.d.ts +38 -0
  186. package/src/lib/components/console/return-actions.js +76 -0
  187. package/src/lib/components/console/return-actions.js.map +1 -0
  188. package/src/lib/components/console/return-detail-dialog.component.d.ts +34 -0
  189. package/src/lib/components/console/return-detail-dialog.component.js +718 -0
  190. package/src/lib/components/console/return-detail-dialog.component.js.map +1 -0
  191. package/src/lib/components/console/return-settings-card.component.d.ts +34 -0
  192. package/src/lib/components/console/return-settings-card.component.js +195 -0
  193. package/src/lib/components/console/return-settings-card.component.js.map +1 -0
  194. package/src/lib/components/console/return-zones.d.ts +87 -0
  195. package/src/lib/components/console/return-zones.js +31 -0
  196. package/src/lib/components/console/return-zones.js.map +1 -0
  197. package/src/lib/components/console/returns-card.component.d.ts +45 -0
  198. package/src/lib/components/console/returns-card.component.js +159 -0
  199. package/src/lib/components/console/returns-card.component.js.map +1 -0
  200. package/src/lib/components/console/shipping-settings-card.component.js +161 -5
  201. package/src/lib/components/console/shipping-settings-card.component.js.map +1 -1
  202. package/src/lib/components/console/shippingeasy-card.component.d.ts +59 -0
  203. package/src/lib/components/console/shippingeasy-card.component.js +378 -0
  204. package/src/lib/components/console/shippingeasy-card.component.js.map +1 -0
  205. package/src/lib/components/console/shipstation-card.component.d.ts +35 -0
  206. package/src/lib/components/console/shipstation-card.component.js +345 -0
  207. package/src/lib/components/console/shipstation-card.component.js.map +1 -0
  208. package/src/lib/components/console/start-return-dialog.component.d.ts +40 -0
  209. package/src/lib/components/console/start-return-dialog.component.js +243 -0
  210. package/src/lib/components/console/start-return-dialog.component.js.map +1 -0
  211. package/src/lib/components/console/stock-movements-card.component.js +2 -1
  212. package/src/lib/components/console/stock-movements-card.component.js.map +1 -1
  213. package/src/lib/components/console/store-settings-card.component.js +2 -66
  214. package/src/lib/components/console/store-settings-card.component.js.map +1 -1
  215. package/src/lib/components/console/store-zones.d.ts +42 -0
  216. package/src/lib/components/console/store-zones.js +39 -0
  217. package/src/lib/components/console/store-zones.js.map +1 -0
  218. package/src/lib/components/order-status.d.ts +36 -0
  219. package/src/lib/components/order-status.js +502 -0
  220. package/src/lib/components/order-status.js.map +1 -0
  221. package/src/lib/components/product-detail.js +44 -2
  222. package/src/lib/components/product-detail.js.map +1 -1
  223. package/src/lib/components/return-request.d.ts +32 -0
  224. package/src/lib/components/return-request.js +576 -0
  225. package/src/lib/components/return-request.js.map +1 -0
  226. package/src/lib/components/storefront-payment-appearance.d.ts +32 -0
  227. package/src/lib/components/storefront-payment-appearance.js +114 -0
  228. package/src/lib/components/storefront-payment-appearance.js.map +1 -0
  229. package/src/lib/components/storefront-payment-element.d.ts +57 -1
  230. package/src/lib/components/storefront-payment-element.js +332 -33
  231. package/src/lib/components/storefront-payment-element.js.map +1 -1
  232. package/src/lib/constants/order-status.d.ts +22 -0
  233. package/src/lib/constants/order-status.js +22 -0
  234. package/src/lib/constants/order-status.js.map +1 -0
  235. package/src/lib/constants/return-request.d.ts +27 -0
  236. package/src/lib/constants/return-request.js +32 -0
  237. package/src/lib/constants/return-request.js.map +1 -0
  238. package/src/lib/constants/stock-movement-query.js +2 -1
  239. package/src/lib/constants/stock-movement-query.js.map +1 -1
  240. package/src/lib/declarations.console-server.js +9 -0
  241. package/src/lib/declarations.console-server.js.map +1 -1
  242. package/src/lib/declarations.server.d.ts +2 -1
  243. package/src/lib/declarations.server.js +47 -1
  244. package/src/lib/declarations.server.js.map +1 -1
  245. package/src/lib/model/buyer-notifications.d.ts +59 -0
  246. package/src/lib/model/buyer-notifications.js +97 -0
  247. package/src/lib/model/buyer-notifications.js.map +1 -0
  248. package/src/lib/model/commerce-orders.d.ts +127 -1
  249. package/src/lib/model/commerce-orders.js +24 -15
  250. package/src/lib/model/commerce-orders.js.map +1 -1
  251. package/src/lib/model/commerce-payment-methods.d.ts +146 -0
  252. package/src/lib/model/commerce-payment-methods.js +247 -0
  253. package/src/lib/model/commerce-payment-methods.js.map +1 -0
  254. package/src/lib/model/commerce-pos-ops.d.ts +437 -0
  255. package/src/lib/model/commerce-pos-ops.js +721 -0
  256. package/src/lib/model/commerce-pos-ops.js.map +1 -0
  257. package/src/lib/model/commerce-pos.d.ts +263 -0
  258. package/src/lib/model/commerce-pos.js +375 -0
  259. package/src/lib/model/commerce-pos.js.map +1 -0
  260. package/src/lib/model/commerce-printers.d.ts +211 -0
  261. package/src/lib/model/commerce-printers.js +181 -0
  262. package/src/lib/model/commerce-printers.js.map +1 -0
  263. package/src/lib/model/commerce-receipt.d.ts +97 -0
  264. package/src/lib/model/commerce-receipt.js +180 -0
  265. package/src/lib/model/commerce-receipt.js.map +1 -0
  266. package/src/lib/model/commerce-returns.d.ts +207 -0
  267. package/src/lib/model/commerce-returns.js +300 -0
  268. package/src/lib/model/commerce-returns.js.map +1 -0
  269. package/src/lib/model/commerce-shipping.d.ts +44 -1
  270. package/src/lib/model/commerce-shipping.js +53 -9
  271. package/src/lib/model/commerce-shipping.js.map +1 -1
  272. package/src/lib/model/commerce-tax-engine.d.ts +90 -0
  273. package/src/lib/model/commerce-tax-engine.js +129 -0
  274. package/src/lib/model/commerce-tax-engine.js.map +1 -0
  275. package/src/lib/model/commerce.d.ts +88 -2
  276. package/src/lib/model/commerce.js +89 -1
  277. package/src/lib/model/commerce.js.map +1 -1
  278. package/src/lib/model/index.d.ts +15 -0
  279. package/src/lib/model/index.js +15 -0
  280. package/src/lib/model/index.js.map +1 -1
  281. package/src/lib/model/order-events.d.ts +154 -0
  282. package/src/lib/model/order-events.js +153 -0
  283. package/src/lib/model/order-events.js.map +1 -0
  284. package/src/lib/model/order-fulfillment.d.ts +117 -0
  285. package/src/lib/model/order-fulfillment.js +217 -0
  286. package/src/lib/model/order-fulfillment.js.map +1 -0
  287. package/src/lib/model/order-history.d.ts +58 -0
  288. package/src/lib/model/order-history.js +22 -0
  289. package/src/lib/model/order-history.js.map +1 -0
  290. package/src/lib/model/order-list-fields.d.ts +9 -1
  291. package/src/lib/model/order-list-fields.js +7 -1
  292. package/src/lib/model/order-list-fields.js.map +1 -1
  293. package/src/lib/model/order-shipping-export.d.ts +91 -0
  294. package/src/lib/model/order-shipping-export.js +192 -0
  295. package/src/lib/model/order-shipping-export.js.map +1 -0
  296. package/src/lib/model/order-status-view.d.ts +103 -0
  297. package/src/lib/model/order-status-view.js +156 -0
  298. package/src/lib/model/order-status-view.js.map +1 -0
  299. package/src/lib/model/order-webhooks.d.ts +142 -0
  300. package/src/lib/model/order-webhooks.js +91 -0
  301. package/src/lib/model/order-webhooks.js.map +1 -0
  302. package/src/lib/model/product-channel.d.ts +56 -0
  303. package/src/lib/model/product-channel.js +86 -0
  304. package/src/lib/model/product-channel.js.map +1 -0
  305. package/src/lib/model/product-modifiers.d.ts +80 -0
  306. package/src/lib/model/product-modifiers.js +140 -0
  307. package/src/lib/model/product-modifiers.js.map +1 -0
  308. package/src/lib/model/shippingeasy.d.ts +94 -0
  309. package/src/lib/model/shippingeasy.js +267 -0
  310. package/src/lib/model/shippingeasy.js.map +1 -0
  311. package/src/lib/model/shipstation.d.ts +125 -0
  312. package/src/lib/model/shipstation.js +399 -0
  313. package/src/lib/model/shipstation.js.map +1 -0
  314. package/src/lib/model/smart-collection-reads.d.ts +32 -0
  315. package/src/lib/model/smart-collection-reads.js +63 -0
  316. package/src/lib/model/smart-collection-reads.js.map +1 -0
  317. package/src/lib/model/tracking-url.d.ts +74 -0
  318. package/src/lib/model/tracking-url.js +159 -0
  319. package/src/lib/model/tracking-url.js.map +1 -0
  320. package/src/lib/plugin-config.d.ts +13 -0
  321. package/src/lib/plugin-config.js +77 -5
  322. package/src/lib/plugin-config.js.map +1 -1
  323. package/src/lib/plugin.js +23 -0
  324. package/src/lib/plugin.js.map +1 -1
  325. package/src/lib/pos-ops-config.d.ts +39 -0
  326. package/src/lib/pos-ops-config.js +88 -0
  327. package/src/lib/pos-ops-config.js.map +1 -0
  328. package/src/lib/printing/print-document.d.ts +106 -0
  329. package/src/lib/printing/print-document.js +464 -0
  330. package/src/lib/printing/print-document.js.map +1 -0
  331. package/src/lib/printing/product-labels.d.ts +58 -0
  332. package/src/lib/printing/product-labels.js +116 -0
  333. package/src/lib/printing/product-labels.js.map +1 -0
  334. package/src/lib/printing/render-epson.d.ts +57 -0
  335. package/src/lib/printing/render-epson.js +135 -0
  336. package/src/lib/printing/render-epson.js.map +1 -0
  337. package/src/lib/printing/render-star.d.ts +45 -0
  338. package/src/lib/printing/render-star.js +100 -0
  339. package/src/lib/printing/render-star.js.map +1 -0
  340. package/src/lib/printing/render-text.d.ts +25 -0
  341. package/src/lib/printing/render-text.js +53 -0
  342. package/src/lib/printing/render-text.js.map +1 -0
  343. package/src/lib/server/api-v1/openapi.js +27 -4
  344. package/src/lib/server/api-v1/openapi.js.map +1 -1
  345. package/src/lib/server/api-v1/order-view.d.ts +67 -0
  346. package/src/lib/server/api-v1/order-view.js +120 -0
  347. package/src/lib/server/api-v1/order-view.js.map +1 -0
  348. package/src/lib/server/api-v1/orders-and-products.js +58 -65
  349. package/src/lib/server/api-v1/orders-and-products.js.map +1 -1
  350. package/src/lib/server/billing-webhook.js +135 -28
  351. package/src/lib/server/billing-webhook.js.map +1 -1
  352. package/src/lib/server/cancel-order.js +29 -0
  353. package/src/lib/server/cancel-order.js.map +1 -1
  354. package/src/lib/server/carrier-rates-availability.d.ts +26 -0
  355. package/src/lib/server/carrier-rates-availability.js +76 -0
  356. package/src/lib/server/carrier-rates-availability.js.map +1 -0
  357. package/src/lib/server/carrier-shipping.d.ts +84 -0
  358. package/src/lib/server/carrier-shipping.js +135 -0
  359. package/src/lib/server/carrier-shipping.js.map +1 -0
  360. package/src/lib/server/cart-checkout.d.ts +2 -0
  361. package/src/lib/server/cart-checkout.js +226 -22
  362. package/src/lib/server/cart-checkout.js.map +1 -1
  363. package/src/lib/server/checkout-extras.d.ts +64 -0
  364. package/src/lib/server/checkout-extras.js +157 -0
  365. package/src/lib/server/checkout-extras.js.map +1 -0
  366. package/src/lib/server/{feed.d.ts → checkout-status.d.ts} +2 -7
  367. package/src/lib/server/checkout-status.js +111 -0
  368. package/src/lib/server/checkout-status.js.map +1 -0
  369. package/src/lib/server/checkout.js +86 -9
  370. package/src/lib/server/checkout.js.map +1 -1
  371. package/src/lib/server/draft-order.js +34 -5
  372. package/src/lib/server/draft-order.js.map +1 -1
  373. package/src/lib/server/fulfill-order.d.ts +127 -10
  374. package/src/lib/server/fulfill-order.js +451 -49
  375. package/src/lib/server/fulfill-order.js.map +1 -1
  376. package/src/lib/server/legacy-feed.d.ts +28 -0
  377. package/src/lib/server/legacy-feed.js +52 -0
  378. package/src/lib/server/legacy-feed.js.map +1 -0
  379. package/src/lib/server/native-checkout.d.ts +34 -15
  380. package/src/lib/server/native-checkout.js +32 -17
  381. package/src/lib/server/native-checkout.js.map +1 -1
  382. package/src/lib/server/order-event-host-emit.d.ts +23 -0
  383. package/src/lib/server/order-event-host-emit.js +30 -0
  384. package/src/lib/server/order-event-host-emit.js.map +1 -0
  385. package/src/lib/server/order-event-triggers.d.ts +37 -0
  386. package/src/lib/server/order-event-triggers.js +119 -0
  387. package/src/lib/server/order-event-triggers.js.map +1 -0
  388. package/src/lib/server/order-events.d.ts +62 -0
  389. package/src/lib/server/order-events.js +109 -0
  390. package/src/lib/server/order-events.js.map +1 -0
  391. package/src/lib/server/order-history.d.ts +23 -0
  392. package/src/lib/server/order-history.js +65 -0
  393. package/src/lib/server/order-history.js.map +1 -0
  394. package/src/lib/server/order-notifications.d.ts +185 -0
  395. package/src/lib/server/order-notifications.js +567 -0
  396. package/src/lib/server/order-notifications.js.map +1 -0
  397. package/src/lib/server/order-receipt-send.d.ts +39 -0
  398. package/src/lib/server/order-receipt-send.js +151 -0
  399. package/src/lib/server/order-receipt-send.js.map +1 -0
  400. package/src/lib/server/order-status-token.d.ts +31 -0
  401. package/src/lib/server/order-status-token.js +75 -0
  402. package/src/lib/server/order-status-token.js.map +1 -0
  403. package/src/lib/server/order-status.d.ts +58 -0
  404. package/src/lib/server/order-status.js +141 -0
  405. package/src/lib/server/order-status.js.map +1 -0
  406. package/src/lib/server/order-webhooks.d.ts +108 -0
  407. package/src/lib/server/order-webhooks.js +622 -0
  408. package/src/lib/server/order-webhooks.js.map +1 -0
  409. package/src/lib/server/orders-shipping-prepare.d.ts +26 -0
  410. package/src/lib/server/orders-shipping-prepare.js +121 -0
  411. package/src/lib/server/orders-shipping-prepare.js.map +1 -0
  412. package/src/lib/server/payment-method-domains.d.ts +209 -0
  413. package/src/lib/server/payment-method-domains.js +444 -0
  414. package/src/lib/server/payment-method-domains.js.map +1 -0
  415. package/src/lib/server/payment-methods.d.ts +77 -0
  416. package/src/lib/server/payment-methods.js +284 -0
  417. package/src/lib/server/payment-methods.js.map +1 -0
  418. package/src/lib/server/pos-auth.d.ts +50 -0
  419. package/src/lib/server/pos-auth.js +121 -0
  420. package/src/lib/server/pos-auth.js.map +1 -0
  421. package/src/lib/server/pos-customer.d.ts +49 -0
  422. package/src/lib/server/pos-customer.js +257 -0
  423. package/src/lib/server/pos-customer.js.map +1 -0
  424. package/src/lib/server/pos-display.d.ts +57 -0
  425. package/src/lib/server/pos-display.js +419 -0
  426. package/src/lib/server/pos-display.js.map +1 -0
  427. package/src/lib/server/pos-fee-month.d.ts +34 -0
  428. package/src/lib/server/pos-fee-month.js +36 -0
  429. package/src/lib/server/pos-fee-month.js.map +1 -0
  430. package/src/lib/server/pos-ops-gate.d.ts +161 -0
  431. package/src/lib/server/pos-ops-gate.js +295 -0
  432. package/src/lib/server/pos-ops-gate.js.map +1 -0
  433. package/src/lib/server/pos-ops-routes.d.ts +22 -0
  434. package/src/lib/server/pos-ops-routes.js +36 -0
  435. package/src/lib/server/pos-ops-routes.js.map +1 -0
  436. package/src/lib/server/pos-order.d.ts +1 -18
  437. package/src/lib/server/pos-order.js +222 -42
  438. package/src/lib/server/pos-order.js.map +1 -1
  439. package/src/lib/server/pos-payment.d.ts +39 -0
  440. package/src/lib/server/pos-payment.js +922 -0
  441. package/src/lib/server/pos-payment.js.map +1 -0
  442. package/src/lib/server/pos-print.d.ts +82 -0
  443. package/src/lib/server/pos-print.js +193 -0
  444. package/src/lib/server/pos-print.js.map +1 -0
  445. package/src/lib/server/pos-readers.d.ts +27 -0
  446. package/src/lib/server/pos-readers.js +276 -0
  447. package/src/lib/server/pos-readers.js.map +1 -0
  448. package/src/lib/server/pos-refund-authority.d.ts +60 -0
  449. package/src/lib/server/pos-refund-authority.js +72 -0
  450. package/src/lib/server/pos-refund-authority.js.map +1 -0
  451. package/src/lib/server/pos-return.d.ts +58 -0
  452. package/src/lib/server/pos-return.js +891 -0
  453. package/src/lib/server/pos-return.js.map +1 -0
  454. package/src/lib/server/pos-sale-stamp.d.ts +66 -0
  455. package/src/lib/server/pos-sale-stamp.js +84 -0
  456. package/src/lib/server/pos-sale-stamp.js.map +1 -0
  457. package/src/lib/server/pos-sale.d.ts +170 -0
  458. package/src/lib/server/pos-sale.js +461 -0
  459. package/src/lib/server/pos-sale.js.map +1 -0
  460. package/src/lib/server/pos-shift.d.ts +45 -0
  461. package/src/lib/server/pos-shift.js +484 -0
  462. package/src/lib/server/pos-shift.js.map +1 -0
  463. package/src/lib/server/pos-staff-pin.d.ts +26 -0
  464. package/src/lib/server/pos-staff-pin.js +339 -0
  465. package/src/lib/server/pos-staff-pin.js.map +1 -0
  466. package/src/lib/server/pos-stripe.d.ts +91 -0
  467. package/src/lib/server/pos-stripe.js +129 -0
  468. package/src/lib/server/pos-stripe.js.map +1 -0
  469. package/src/lib/server/pos-terminal-connection-token.d.ts +48 -0
  470. package/src/lib/server/pos-terminal-connection-token.js +166 -0
  471. package/src/lib/server/pos-terminal-connection-token.js.map +1 -0
  472. package/src/lib/server/pos-terminal.d.ts +218 -0
  473. package/src/lib/server/pos-terminal.js +1014 -0
  474. package/src/lib/server/pos-terminal.js.map +1 -0
  475. package/src/lib/server/print-queue.d.ts +124 -0
  476. package/src/lib/server/print-queue.js +301 -0
  477. package/src/lib/server/print-queue.js.map +1 -0
  478. package/src/lib/server/printer-poll.d.ts +75 -0
  479. package/src/lib/server/printer-poll.js +325 -0
  480. package/src/lib/server/printer-poll.js.map +1 -0
  481. package/src/lib/server/printer-secret.d.ts +39 -0
  482. package/src/lib/server/printer-secret.js +56 -0
  483. package/src/lib/server/printer-secret.js.map +1 -0
  484. package/src/lib/server/printers.d.ts +114 -0
  485. package/src/lib/server/printers.js +546 -0
  486. package/src/lib/server/printers.js.map +1 -0
  487. package/src/lib/server/product-ai-capability.d.ts +42 -0
  488. package/src/lib/server/product-ai-capability.js +159 -0
  489. package/src/lib/server/product-ai-capability.js.map +1 -0
  490. package/src/lib/server/product-catalog.d.ts +42 -0
  491. package/src/lib/server/product-catalog.js +305 -0
  492. package/src/lib/server/product-catalog.js.map +1 -0
  493. package/src/lib/server/product-drafts.d.ts +119 -0
  494. package/src/lib/server/product-drafts.js +384 -0
  495. package/src/lib/server/product-drafts.js.map +1 -0
  496. package/src/lib/server/refund.js +110 -45
  497. package/src/lib/server/refund.js.map +1 -1
  498. package/src/lib/server/reserve.js +2 -0
  499. package/src/lib/server/reserve.js.map +1 -1
  500. package/src/lib/server/return-status-action.d.ts +37 -0
  501. package/src/lib/server/return-status-action.js +57 -0
  502. package/src/lib/server/return-status-action.js.map +1 -0
  503. package/src/lib/server/returns.d.ts +119 -0
  504. package/src/lib/server/returns.js +938 -0
  505. package/src/lib/server/returns.js.map +1 -0
  506. package/src/lib/server/shipment-records.d.ts +36 -0
  507. package/src/lib/server/shipment-records.js +289 -0
  508. package/src/lib/server/shipment-records.js.map +1 -0
  509. package/src/lib/server/shipping-connector-gates.d.ts +40 -0
  510. package/src/lib/server/shipping-connector-gates.js +97 -0
  511. package/src/lib/server/shipping-connector-gates.js.map +1 -0
  512. package/src/lib/server/shipping-connectors.d.ts +29 -0
  513. package/src/lib/server/shipping-connectors.js +236 -0
  514. package/src/lib/server/shipping-connectors.js.map +1 -0
  515. package/src/lib/server/shippingeasy.d.ts +238 -0
  516. package/src/lib/server/shippingeasy.js +787 -0
  517. package/src/lib/server/shippingeasy.js.map +1 -0
  518. package/src/lib/server/shipstation.d.ts +129 -0
  519. package/src/lib/server/shipstation.js +483 -0
  520. package/src/lib/server/shipstation.js.map +1 -0
  521. package/src/lib/server/site-page-resolver.d.ts +5 -0
  522. package/src/lib/server/site-page-resolver.js +156 -1
  523. package/src/lib/server/site-page-resolver.js.map +1 -1
  524. package/src/lib/server/stock-levels.d.ts +21 -0
  525. package/src/lib/server/stock-levels.js +263 -0
  526. package/src/lib/server/stock-levels.js.map +1 -0
  527. package/src/lib/server/stripe-refund.d.ts +47 -0
  528. package/src/lib/server/stripe-refund.js +87 -0
  529. package/src/lib/server/stripe-refund.js.map +1 -0
  530. package/src/lib/server/supplier-update.js +46 -5
  531. package/src/lib/server/supplier-update.js.map +1 -1
  532. package/src/lib/server/tax-engine-quote.d.ts +47 -0
  533. package/src/lib/server/tax-engine-quote.js +105 -0
  534. package/src/lib/server/tax-engine-quote.js.map +1 -0
  535. package/src/lib/server.js +146 -2
  536. package/src/lib/server.js.map +1 -1
  537. package/src/lib/site.js +12 -0
  538. package/src/lib/site.js.map +1 -1
  539. package/src/lib/subprocessors.d.ts +26 -0
  540. package/src/lib/subprocessors.js +50 -0
  541. package/src/lib/subprocessors.js.map +1 -0
  542. package/src/lib/tenant-emails.js +461 -3
  543. package/src/lib/tenant-emails.js.map +1 -1
  544. package/src/lib/testing/fake-firestore.d.ts +45 -0
  545. package/src/lib/testing/fake-firestore.js +189 -0
  546. package/src/lib/testing/fake-firestore.js.map +1 -0
  547. package/src/lib/testing/memory-firestore.d.ts +123 -0
  548. package/src/lib/testing/memory-firestore.js +274 -0
  549. package/src/lib/testing/memory-firestore.js.map +1 -0
  550. package/src/lib/testing/pos-ops-harness.d.ts +50 -0
  551. package/src/lib/testing/pos-ops-harness.js +184 -0
  552. package/src/lib/testing/pos-ops-harness.js.map +1 -0
  553. package/src/lib/testing/pos-ops-memory-firestore.d.ts +55 -0
  554. package/src/lib/testing/pos-ops-memory-firestore.js +376 -0
  555. package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -0
  556. package/src/lib/transfer/records-transfer.d.ts +11 -1
  557. package/src/lib/transfer/records-transfer.js +127 -5
  558. package/src/lib/transfer/records-transfer.js.map +1 -1
  559. package/src/lib/transfer/records.server.d.ts +9 -2
  560. package/src/lib/transfer/records.server.js +58 -7
  561. package/src/lib/transfer/records.server.js.map +1 -1
  562. package/src/lib/transfer/register-transfer-resources.js +40 -1
  563. package/src/lib/transfer/register-transfer-resources.js.map +1 -1
  564. package/src/lib/transfer/register-transfer-ui.js +4 -1
  565. package/src/lib/transfer/register-transfer-ui.js.map +1 -1
  566. package/src/lib/transfer/shipping-presets.d.ts +23 -0
  567. package/src/lib/transfer/shipping-presets.js +156 -0
  568. package/src/lib/transfer/shipping-presets.js.map +1 -0
  569. package/src/lib/transfer/tracking-transfer.d.ts +101 -0
  570. package/src/lib/transfer/tracking-transfer.js +546 -0
  571. package/src/lib/transfer/tracking-transfer.js.map +1 -0
  572. package/src/lib/transfer/tracking.server.d.ts +37 -0
  573. package/src/lib/transfer/tracking.server.js +393 -0
  574. package/src/lib/transfer/tracking.server.js.map +1 -0
  575. package/src/lib/transfer/transfer-keys.d.ts +2 -1
  576. package/src/lib/transfer/transfer-keys.js +6 -2
  577. package/src/lib/transfer/transfer-keys.js.map +1 -1
  578. package/src/lib/utils/code128.d.ts +37 -0
  579. package/src/lib/utils/code128.js +199 -0
  580. package/src/lib/utils/code128.js.map +1 -0
  581. package/src/lib/utils/order-invoice.d.ts +55 -0
  582. package/src/lib/utils/order-invoice.js +127 -0
  583. package/src/lib/utils/order-invoice.js.map +1 -0
  584. package/src/lib/utils/use-checkout-return-notice.d.ts +34 -0
  585. package/src/lib/utils/use-checkout-return-notice.js +78 -0
  586. package/src/lib/utils/use-checkout-return-notice.js.map +1 -0
  587. package/src/lib/utils/use-storefront-purchase-event.js +4 -0
  588. package/src/lib/utils/use-storefront-purchase-event.js.map +1 -1
  589. package/src/lib/server/feed.js +0 -69
  590. package/src/lib/server/feed.js.map +0 -1
@@ -0,0 +1,305 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ import { _ as _extends } from "@swc/helpers/_/_extends";
17
+ import { liveCustomDomain } from "@aglyn/aglyn/app-utils/host-naming";
18
+ import { TENANT_APEX } from "@aglyn/aglyn/app-utils/tenant-apex";
19
+ import { firebaseAdmin } from "@aglyn/tenant-data-admin/server/firebase-admin";
20
+ import * as CommerceModel from "../model/index.js";
21
+ const MAX_PRODUCTS_PER_READ = 200;
22
+ /** Google's ceiling; the longest any channel accepts for every channel's id. */ const MAX_OFFER_ID = 50;
23
+ const firestore = ()=>firebaseAdmin.app().firestore();
24
+ const str = (value)=>typeof value === 'string' ? value : '';
25
+ /** Plain text from a description that may hold markup. */ export function plainDescription(value) {
26
+ return str(value).replace(/<\s*(br|\/p|\/div|\/li|\/h[1-6])\s*\/?>/gi, '\n').replace(/<[^>]*>/g, ' ').replace(/&nbsp;/gi, ' ').replace(/&amp;/gi, '&').replace(/&lt;/gi, '<').replace(/&gt;/gi, '>').replace(/&quot;/gi, '"').replace(/&#39;/gi, "'").replace(/[ \t\f\v]+/g, ' ').replace(/\s*\n\s*/g, '\n').trim();
27
+ }
28
+ const toMinor = (amount)=>{
29
+ const number = Number(amount);
30
+ return Number.isFinite(number) && number > 0 ? Math.round(number * 100) : 0;
31
+ };
32
+ /** The origin the store's pages answer on: its live custom domain, else its subdomain. */ export function storeOrigin(host) {
33
+ const domain = liveCustomDomain(host);
34
+ if (domain) return `https://${domain}`;
35
+ const subdomain = str(host == null ? void 0 : host['subdomain']).trim();
36
+ return subdomain ? `https://${subdomain}.${TENANT_APEX}` : null;
37
+ }
38
+ /** An absolute URL for a stored media reference, or undefined. */ function absoluteImage(url, origin) {
39
+ const value = str(url).trim();
40
+ if (!value) return undefined;
41
+ if (/^https?:\/\//i.test(value)) return value;
42
+ if (value.startsWith('//')) return `https:${value}`;
43
+ if (value.startsWith('/') && origin) return `${origin}${value}`;
44
+ return undefined;
45
+ }
46
+ /** A stable offer id within the longest any channel accepts. */ export function offerId(productId, variantId, hasVariants) {
47
+ if (!hasVariants) return productId.slice(0, MAX_OFFER_ID);
48
+ const full = `${productId}_${variantId}`;
49
+ if (full.length <= MAX_OFFER_ID) return full;
50
+ // Deterministic, so the id is the same on every read.
51
+ let hash = 0;
52
+ for (const char of full)hash = Math.imul(hash, 31) + char.charCodeAt(0) | 0;
53
+ const suffix = (hash >>> 0).toString(36);
54
+ return `${productId.slice(0, MAX_OFFER_ID - suffix.length - 1)}_${suffix}`;
55
+ }
56
+ const COLOR_OPTION = /^(colou?r|shade|finish)$/i;
57
+ const SIZE_OPTION = /^(size|fit)$/i;
58
+ function optionValue(options, pattern) {
59
+ for (const [name, value] of Object.entries(options)){
60
+ if (pattern.test(name.trim()) && value) return value;
61
+ }
62
+ return undefined;
63
+ }
64
+ /** The category path `Parent > Child` for a product's first category. */ function categoryPath(categoryIds, categories) {
65
+ const first = (categoryIds != null ? categoryIds : []).find((id)=>categories.has(id));
66
+ if (!first) return undefined;
67
+ const names = [];
68
+ const seen = new Set();
69
+ let at = first;
70
+ while(at && !seen.has(at) && categories.has(at) && names.length < 5){
71
+ seen.add(at);
72
+ const category = categories.get(at);
73
+ if (category.name) names.unshift(category.name);
74
+ at = category.parentId;
75
+ }
76
+ return names.length ? names.join(' > ') : undefined;
77
+ }
78
+ /** The specific countries the store's shipping zones name, in order, upper case. */ function shippingCountries(settings) {
79
+ var _ref;
80
+ const countries = new Set();
81
+ for (const zone of (_ref = settings == null ? void 0 : settings.zones) != null ? _ref : []){
82
+ var _zone_countries;
83
+ for (const code of (_zone_countries = zone.countries) != null ? _zone_countries : []){
84
+ const country = String(code != null ? code : '').trim().toUpperCase();
85
+ if (/^[A-Z]{2}$/.test(country)) countries.add(country);
86
+ }
87
+ }
88
+ return [
89
+ ...countries
90
+ ].slice(0, 100);
91
+ }
92
+ /** The countries the store's zones price by a live carrier quote, upper case. */ export function carrierPricedCountries(settings, countries) {
93
+ if (!CommerceModel.hasCarrierRates(settings)) return [];
94
+ return countries.filter((country)=>CommerceModel.carrierRatesFor(settings, country).length > 0);
95
+ }
96
+ /** The packed size of one unit, when every side is known. */ function dimensionsOf(product) {
97
+ const facts = CommerceModel.normalizeProductShippingFacts(product.shipping);
98
+ if (!(facts == null ? void 0 : facts.lengthCm) || !facts.widthCm || !facts.heightCm) return undefined;
99
+ return {
100
+ length: facts.lengthCm,
101
+ width: facts.widthCm,
102
+ height: facts.heightCm
103
+ };
104
+ }
105
+ /** What one unit of an offer costs to ship to each country, the cheapest rate each. */ export function offerShipping(settings, countries, unit) {
106
+ const prices = [];
107
+ for (const country of countries){
108
+ var _unit_weightGrams;
109
+ const [cheapest] = CommerceModel.resolveShippingRates(settings, country, {
110
+ subtotalCents: unit.priceMinor,
111
+ totalGrams: (_unit_weightGrams = unit.weightGrams) != null ? _unit_weightGrams : 0
112
+ }).filter((rate)=>rate.rateId !== CommerceModel.LOCAL_PICKUP_RATE_ID);
113
+ if (cheapest) prices.push({
114
+ country,
115
+ service: cheapest.name,
116
+ priceMinor: cheapest.amountCents
117
+ });
118
+ }
119
+ return prices;
120
+ }
121
+ /** The offers of one stored product; empty for a product that is not listed. */ export function productOffers(productId, raw, context) {
122
+ var _product_variants, _product_mediaUrls, _product_updatedAtMs, _product_type;
123
+ if (!raw || raw['deletedAt']) return [];
124
+ const product = CommerceModel.liftLegacyProduct(raw);
125
+ if (product.status !== 'active' || !str(product.name).trim() || !str(product.slug)) return [];
126
+ const variants = ((_product_variants = product.variants) != null ? _product_variants : []).filter((variant)=>variant && str(variant.id));
127
+ if (!variants.length) return [];
128
+ const hasVariants = variants.length > 1;
129
+ const facts = CommerceModel.normalizeProductChannelFacts(product.channel);
130
+ const media = [
131
+ ...(_product_mediaUrls = product.mediaUrls) != null ? _product_mediaUrls : [],
132
+ ...product.imageUrl ? [
133
+ product.imageUrl
134
+ ] : []
135
+ ].map((url)=>absoluteImage(url, context.origin)).filter((url)=>Boolean(url));
136
+ const description = plainDescription(product.description);
137
+ const productType = categoryPath(product.categoryIds, context.categories);
138
+ const subscriptionOnly = Boolean(product.subscription) && product.subscriptionOptional !== true;
139
+ const updatedAtMs = Number((_product_updatedAtMs = product.updatedAtMs) != null ? _product_updatedAtMs : product.createdAtMs) || undefined;
140
+ const dimensionsCm = ((_product_type = product.type) != null ? _product_type : 'physical') === 'physical' ? dimensionsOf(product) : undefined;
141
+ return variants.map((variant)=>{
142
+ var _variant_options, _product_options, _ref, _product_type, _product_type1;
143
+ const options = Object.fromEntries(Object.entries((_variant_options = variant.options) != null ? _variant_options : {}).filter(([, value])=>typeof value === 'string' && value));
144
+ const choices = ((_product_options = product.options) != null ? _product_options : []).map((option)=>options[option.name]).filter((value)=>Boolean(value));
145
+ const ownPrice = toMinor(variant.priceUsd);
146
+ const compareAt = toMinor(variant.compareAtPriceUsd);
147
+ const onSale = compareAt > ownPrice && ownPrice > 0;
148
+ const priceMinor = onSale ? compareAt : ownPrice;
149
+ const tracked = CommerceModel.stockTrackingApplies(product) && variant.inventory != null;
150
+ const quantity = tracked ? Math.max(0, Math.trunc(Number(variant.inventory) || 0)) : null;
151
+ const availability = quantity === null || quantity > 0 ? 'in_stock' : product.oversellPolicy === 'backorder' ? 'backorder' : 'out_of_stock';
152
+ const variantImage = absoluteImage(variant.imageUrl, context.origin);
153
+ const imageUrl = variantImage != null ? variantImage : media[0];
154
+ const weightGrams = Number(variant.weightGrams) > 0 ? Math.round(Number(variant.weightGrams)) : undefined;
155
+ const gtin = CommerceModel.normalizeGtin(variant.barcode) || (hasVariants ? '' : (_ref = facts == null ? void 0 : facts.gtin) != null ? _ref : '');
156
+ const offer = _extends({
157
+ id: offerId(productId, variant.id, hasVariants),
158
+ groupId: productId,
159
+ hasVariants,
160
+ productId,
161
+ variantId: variant.id,
162
+ productName: product.name.trim(),
163
+ title: choices.length ? `${product.name.trim()} - ${choices.join(' / ')}` : product.name.trim(),
164
+ description,
165
+ path: `/products/${product.slug}`
166
+ }, imageUrl ? {
167
+ imageUrl
168
+ } : {}, {
169
+ additionalImageUrls: media.filter((url)=>url !== imageUrl).slice(0, 10),
170
+ priceMinor
171
+ }, onSale ? {
172
+ salePriceMinor: ownPrice
173
+ } : {}, {
174
+ availability,
175
+ quantity,
176
+ kind: (_product_type = product.type) != null ? _product_type : 'physical',
177
+ subscriptionOnly
178
+ }, (facts == null ? void 0 : facts.condition) ? {
179
+ condition: facts.condition
180
+ } : {}, (facts == null ? void 0 : facts.brand) ? {
181
+ brand: facts.brand
182
+ } : {}, gtin.length >= 8 ? {
183
+ gtin
184
+ } : {}, (facts == null ? void 0 : facts.mpn) ? {
185
+ mpn: facts.mpn
186
+ } : {}, (facts == null ? void 0 : facts.googleProductCategory) ? {
187
+ googleProductCategory: facts.googleProductCategory
188
+ } : {}, productType ? {
189
+ productType
190
+ } : {}, {
191
+ options
192
+ }, optionValue(options, COLOR_OPTION) ? {
193
+ color: optionValue(options, COLOR_OPTION)
194
+ } : {}, optionValue(options, SIZE_OPTION) ? {
195
+ size: optionValue(options, SIZE_OPTION)
196
+ } : {}, weightGrams ? {
197
+ weightGrams
198
+ } : {}, dimensionsCm ? {
199
+ dimensionsCm
200
+ } : {}, {
201
+ shipping: ((_product_type1 = product.type) != null ? _product_type1 : 'physical') === 'physical' ? offerShipping(context.shipping, context.countries, _extends({
202
+ priceMinor: onSale ? ownPrice : priceMinor
203
+ }, weightGrams ? {
204
+ weightGrams
205
+ } : {})) : []
206
+ }, updatedAtMs ? {
207
+ updatedAtMs
208
+ } : {});
209
+ return offer;
210
+ });
211
+ }
212
+ async function readStore(hostId) {
213
+ const hostRef = firestore().collection('hosts').doc(hostId);
214
+ const [host, store] = await Promise.all([
215
+ hostRef.get(),
216
+ hostRef.collection('settings').doc('store').get()
217
+ ]);
218
+ return {
219
+ host,
220
+ store
221
+ };
222
+ }
223
+ async function readCategories(hostId) {
224
+ const snapshot = await firestore().collection('hosts').doc(hostId).collection('productCategories').limit(500).get();
225
+ return new Map(snapshot.docs.map((doc)=>[
226
+ doc.id,
227
+ doc.data()
228
+ ]));
229
+ }
230
+ const isDocumentId = (value)=>Boolean(value) && value.length <= 200 && !value.includes('/') && !/^__.*__$/.test(value);
231
+ export const productCatalog = {
232
+ async store (hostId) {
233
+ var _host_data, _store_data;
234
+ if (!isDocumentId(hostId)) return null;
235
+ const { host, store } = await readStore(hostId);
236
+ if (!host.exists) return null;
237
+ const data = (_host_data = host.data()) != null ? _host_data : {};
238
+ const settings = (_store_data = store.data()) != null ? _store_data : {};
239
+ const origin = storeOrigin(data);
240
+ const shipping = settings['shipping'];
241
+ const name = str(data['displayName']).trim() || (origin ? origin.replace(/^https?:\/\//, '') : '') || 'Store';
242
+ return {
243
+ hostId,
244
+ name,
245
+ origin,
246
+ currency: str(settings['currency']).trim().toUpperCase() || 'USD',
247
+ productPagesServed: Boolean(str(settings['pdpScreenId'])),
248
+ carrierPricedCountries: carrierPricedCountries(shipping, shippingCountries(shipping))
249
+ };
250
+ },
251
+ async page ({ hostId, cursor, limit }) {
252
+ if (!isDocumentId(hostId)) return {
253
+ offers: [],
254
+ nextCursor: null
255
+ };
256
+ const want = Math.max(1, Math.min(Math.trunc(limit) || 1, 1000));
257
+ const [{ host, store }, categories] = await Promise.all([
258
+ readStore(hostId),
259
+ readCategories(hostId)
260
+ ]);
261
+ if (!host.exists) return {
262
+ offers: [],
263
+ nextCursor: null
264
+ };
265
+ const shipping = store.get('shipping');
266
+ const context = {
267
+ origin: storeOrigin(host.data()),
268
+ categories,
269
+ shipping,
270
+ countries: shippingCountries(shipping)
271
+ };
272
+ const products = firestore().collection('hosts').doc(hostId).collection('products');
273
+ const idPath = firebaseAdmin.firestore.FieldPath.documentId();
274
+ const offers = [];
275
+ let after = cursor && isDocumentId(cursor) ? cursor : null;
276
+ // Reads products until the page holds `want` offers or the catalog ends.
277
+ // Drafts and archived products are read and skipped, so a store of many
278
+ // drafts may take more than one read for a page.
279
+ for(;;){
280
+ let query = products.orderBy(idPath).limit(MAX_PRODUCTS_PER_READ);
281
+ if (after) query = query.startAfter(after);
282
+ const snapshot = await query.get();
283
+ for (const doc of snapshot.docs){
284
+ offers.push(...productOffers(doc.id, doc.data(), context));
285
+ after = doc.id;
286
+ if (offers.length >= want) {
287
+ const last = snapshot.docs[snapshot.docs.length - 1];
288
+ // The page is full: continue after this product, unless it was the
289
+ // last of a short read, which is the end of the catalog.
290
+ const ended = doc.id === last.id && snapshot.size < MAX_PRODUCTS_PER_READ;
291
+ return {
292
+ offers,
293
+ nextCursor: ended ? null : doc.id
294
+ };
295
+ }
296
+ }
297
+ if (snapshot.size < MAX_PRODUCTS_PER_READ) return {
298
+ offers,
299
+ nextCursor: null
300
+ };
301
+ }
302
+ }
303
+ };
304
+
305
+ //# sourceMappingURL=product-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/server/product-catalog.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n CatalogOffer,\n CatalogPage,\n CatalogShippingPrice,\n CatalogStore,\n PluginProductCatalog,\n} from '@aglyn/aglyn/plugin-manager/plugin-product-catalog'\nimport { liveCustomDomain } from '@aglyn/aglyn/app-utils/host-naming'\nimport { TENANT_APEX } from '@aglyn/aglyn/app-utils/tenant-apex'\nimport { firebaseAdmin } from '@aglyn/tenant-data-admin/server/firebase-admin'\nimport * as CommerceModel from '../model'\n\n/**\n * THE STORE'S CATALOG, AS OTHER PLUGINS READ IT (AGL-3637): core's\n * `core.product-catalog` contract, answered from this plugin's products.\n *\n * A shopping-channel feed, an ad catalog and a marketplace sync read every\n * offer the store sells through here and never through `hosts/{id}/products`.\n * What counts as listed, how a variant becomes an offer, what the store's\n * currency is and what shipping costs are this plugin's decisions, made once:\n *\n * - Listed is `status: 'active'` and not soft-deleted. Drafts, archived and\n * deleted products are never offered.\n * - A product with one configuration is one offer under the product's own\n * id — the id the site's analytics events already send — and a product\n * with several is one offer per variant, `{productId}_{variantId}`.\n * - A variant on sale (`compareAtPriceUsd` above `priceUsd`) offers the\n * compare-at price as its price and its own as the sale price.\n * - Shipping is priced per country the store's zones name, for one unit of\n * the offer, through the same resolver checkout charges with; local pickup\n * is not shipping and a `*` zone names no country.\n *\n * Walked in document-id order, so a page boundary is stable while products\n * are added and edited, and a product is never split across two pages.\n */\n\ntype Firestore = FirebaseFirestore.Firestore\ntype DocumentData = FirebaseFirestore.DocumentData\n\nconst MAX_PRODUCTS_PER_READ = 200\n/** Google's ceiling; the longest any channel accepts for every channel's id. */\nconst MAX_OFFER_ID = 50\n\nconst firestore = (): Firestore => firebaseAdmin.app().firestore()\n\nconst str = (value: unknown): string => (typeof value === 'string' ? value : '')\n\n/** Plain text from a description that may hold markup. */\nexport function plainDescription(value: unknown): string {\n return str(value)\n .replace(/<\\s*(br|\\/p|\\/div|\\/li|\\/h[1-6])\\s*\\/?>/gi, '\\n')\n .replace(/<[^>]*>/g, ' ')\n .replace(/&nbsp;/gi, ' ')\n .replace(/&amp;/gi, '&')\n .replace(/&lt;/gi, '<')\n .replace(/&gt;/gi, '>')\n .replace(/&quot;/gi, '\"')\n .replace(/&#39;/gi, \"'\")\n .replace(/[ \\t\\f\\v]+/g, ' ')\n .replace(/\\s*\\n\\s*/g, '\\n')\n .trim()\n}\n\nconst toMinor = (amount: unknown): number => {\n const number = Number(amount)\n return Number.isFinite(number) && number > 0 ? Math.round(number * 100) : 0\n}\n\n/** The origin the store's pages answer on: its live custom domain, else its subdomain. */\nexport function storeOrigin(host: DocumentData | undefined): string | null {\n const domain = liveCustomDomain(host as Parameters<typeof liveCustomDomain>[0])\n if (domain) return `https://${domain}`\n const subdomain = str(host?.['subdomain']).trim()\n return subdomain ? `https://${subdomain}.${TENANT_APEX}` : null\n}\n\n/** An absolute URL for a stored media reference, or undefined. */\nfunction absoluteImage(url: unknown, origin: string | null): string | undefined {\n const value = str(url).trim()\n if (!value) return undefined\n if (/^https?:\\/\\//i.test(value)) return value\n if (value.startsWith('//')) return `https:${value}`\n if (value.startsWith('/') && origin) return `${origin}${value}`\n return undefined\n}\n\n/** A stable offer id within the longest any channel accepts. */\nexport function offerId(productId: string, variantId: string, hasVariants: boolean): string {\n if (!hasVariants) return productId.slice(0, MAX_OFFER_ID)\n const full = `${productId}_${variantId}`\n if (full.length <= MAX_OFFER_ID) return full\n // Deterministic, so the id is the same on every read.\n let hash = 0\n for (const char of full) hash = (Math.imul(hash, 31) + char.charCodeAt(0)) | 0\n const suffix = (hash >>> 0).toString(36)\n return `${productId.slice(0, MAX_OFFER_ID - suffix.length - 1)}_${suffix}`\n}\n\nconst COLOR_OPTION = /^(colou?r|shade|finish)$/i\nconst SIZE_OPTION = /^(size|fit)$/i\n\nfunction optionValue(options: Record<string, string>, pattern: RegExp): string | undefined {\n for (const [name, value] of Object.entries(options)) {\n if (pattern.test(name.trim()) && value) return value\n }\n return undefined\n}\n\n/** The category path `Parent > Child` for a product's first category. */\nfunction categoryPath(\n categoryIds: readonly string[] | undefined,\n categories: ReadonlyMap<string, CommerceModel.ProductCategory>,\n): string | undefined {\n const first = (categoryIds ?? []).find((id) => categories.has(id))\n if (!first) return undefined\n const names: string[] = []\n const seen = new Set<string>()\n let at: string | null | undefined = first\n while (at && !seen.has(at) && categories.has(at) && names.length < 5) {\n seen.add(at)\n const category: CommerceModel.ProductCategory = categories.get(at)!\n if (category.name) names.unshift(category.name)\n at = category.parentId\n }\n return names.length ? names.join(' > ') : undefined\n}\n\n/** The specific countries the store's shipping zones name, in order, upper case. */\nfunction shippingCountries(settings: CommerceModel.ShippingSettings | undefined): string[] {\n const countries = new Set<string>()\n for (const zone of settings?.zones ?? []) {\n for (const code of zone.countries ?? []) {\n const country = String(code ?? '').trim().toUpperCase()\n if (/^[A-Z]{2}$/.test(country)) countries.add(country)\n }\n }\n return [...countries].slice(0, 100)\n}\n\n/** The countries the store's zones price by a live carrier quote, upper case. */\nexport function carrierPricedCountries(\n settings: CommerceModel.ShippingSettings | undefined,\n countries: readonly string[],\n): string[] {\n if (!CommerceModel.hasCarrierRates(settings)) return []\n return countries.filter((country) => CommerceModel.carrierRatesFor(settings, country).length > 0)\n}\n\n/** The packed size of one unit, when every side is known. */\nfunction dimensionsOf(product: CommerceModel.HostProduct): CatalogOffer['dimensionsCm'] {\n const facts = CommerceModel.normalizeProductShippingFacts(product.shipping)\n if (!facts?.lengthCm || !facts.widthCm || !facts.heightCm) return undefined\n return { length: facts.lengthCm, width: facts.widthCm, height: facts.heightCm }\n}\n\n/** What one unit of an offer costs to ship to each country, the cheapest rate each. */\nexport function offerShipping(\n settings: CommerceModel.ShippingSettings | undefined,\n countries: readonly string[],\n unit: { priceMinor: number; weightGrams?: number },\n): CatalogShippingPrice[] {\n const prices: CatalogShippingPrice[] = []\n for (const country of countries) {\n const [cheapest] = CommerceModel.resolveShippingRates(settings, country, {\n subtotalCents: unit.priceMinor,\n totalGrams: unit.weightGrams ?? 0,\n }).filter((rate) => rate.rateId !== CommerceModel.LOCAL_PICKUP_RATE_ID)\n if (cheapest) prices.push({ country, service: cheapest.name, priceMinor: cheapest.amountCents })\n }\n return prices\n}\n\ninterface PageContext {\n origin: string | null\n categories: ReadonlyMap<string, CommerceModel.ProductCategory>\n shipping: CommerceModel.ShippingSettings | undefined\n countries: readonly string[]\n}\n\n/** The offers of one stored product; empty for a product that is not listed. */\nexport function productOffers(productId: string, raw: DocumentData, context: PageContext): CatalogOffer[] {\n if (!raw || raw['deletedAt']) return []\n const product = CommerceModel.liftLegacyProduct(raw as CommerceModel.HostProduct)\n if (product.status !== 'active' || !str(product.name).trim() || !str(product.slug)) return []\n const variants = (product.variants ?? []).filter((variant) => variant && str(variant.id))\n if (!variants.length) return []\n const hasVariants = variants.length > 1\n const facts = CommerceModel.normalizeProductChannelFacts(product.channel)\n const media = [...(product.mediaUrls ?? []), ...(product.imageUrl ? [product.imageUrl] : [])]\n .map((url) => absoluteImage(url, context.origin))\n .filter((url): url is string => Boolean(url))\n const description = plainDescription(product.description)\n const productType = categoryPath(product.categoryIds, context.categories)\n const subscriptionOnly = Boolean(product.subscription) && product.subscriptionOptional !== true\n const updatedAtMs = Number(product.updatedAtMs ?? product.createdAtMs) || undefined\n const dimensionsCm = (product.type ?? 'physical') === 'physical' ? dimensionsOf(product) : undefined\n return variants.map((variant) => {\n const options = Object.fromEntries(\n Object.entries(variant.options ?? {}).filter(([, value]) => typeof value === 'string' && value),\n ) as Record<string, string>\n const choices = (product.options ?? [])\n .map((option) => options[option.name])\n .filter((value): value is string => Boolean(value))\n const ownPrice = toMinor(variant.priceUsd)\n const compareAt = toMinor(variant.compareAtPriceUsd)\n const onSale = compareAt > ownPrice && ownPrice > 0\n const priceMinor = onSale ? compareAt : ownPrice\n const tracked = CommerceModel.stockTrackingApplies(product) && variant.inventory != null\n const quantity = tracked ? Math.max(0, Math.trunc(Number(variant.inventory) || 0)) : null\n const availability: CatalogOffer['availability'] =\n quantity === null || quantity > 0\n ? 'in_stock'\n : product.oversellPolicy === 'backorder'\n ? 'backorder'\n : 'out_of_stock'\n const variantImage = absoluteImage(variant.imageUrl, context.origin)\n const imageUrl = variantImage ?? media[0]\n const weightGrams = Number(variant.weightGrams) > 0 ? Math.round(Number(variant.weightGrams)) : undefined\n const gtin = CommerceModel.normalizeGtin(variant.barcode) || (hasVariants ? '' : facts?.gtin ?? '')\n const offer: CatalogOffer = {\n id: offerId(productId, variant.id, hasVariants),\n groupId: productId,\n hasVariants,\n productId,\n variantId: variant.id,\n productName: product.name.trim(),\n title: choices.length ? `${product.name.trim()} - ${choices.join(' / ')}` : product.name.trim(),\n description,\n path: `/products/${product.slug}`,\n ...(imageUrl ? { imageUrl } : {}),\n additionalImageUrls: media.filter((url) => url !== imageUrl).slice(0, 10),\n priceMinor,\n ...(onSale ? { salePriceMinor: ownPrice } : {}),\n availability,\n quantity,\n kind: product.type ?? 'physical',\n subscriptionOnly,\n ...(facts?.condition ? { condition: facts.condition } : {}),\n ...(facts?.brand ? { brand: facts.brand } : {}),\n ...(gtin.length >= 8 ? { gtin } : {}),\n ...(facts?.mpn ? { mpn: facts.mpn } : {}),\n ...(facts?.googleProductCategory ? { googleProductCategory: facts.googleProductCategory } : {}),\n ...(productType ? { productType } : {}),\n options,\n ...(optionValue(options, COLOR_OPTION) ? { color: optionValue(options, COLOR_OPTION) } : {}),\n ...(optionValue(options, SIZE_OPTION) ? { size: optionValue(options, SIZE_OPTION) } : {}),\n ...(weightGrams ? { weightGrams } : {}),\n ...(dimensionsCm ? { dimensionsCm } : {}),\n shipping:\n (product.type ?? 'physical') === 'physical'\n ? offerShipping(context.shipping, context.countries, {\n priceMinor: onSale ? ownPrice : priceMinor,\n ...(weightGrams ? { weightGrams } : {}),\n })\n : [],\n ...(updatedAtMs ? { updatedAtMs } : {}),\n }\n return offer\n })\n}\n\nasync function readStore(hostId: string) {\n const hostRef = firestore().collection('hosts').doc(hostId)\n const [host, store] = await Promise.all([hostRef.get(), hostRef.collection('settings').doc('store').get()])\n return { host, store }\n}\n\nasync function readCategories(hostId: string): Promise<Map<string, CommerceModel.ProductCategory>> {\n const snapshot = await firestore()\n .collection('hosts')\n .doc(hostId)\n .collection('productCategories')\n .limit(500)\n .get()\n return new Map(\n snapshot.docs.map((doc) => [doc.id, doc.data() as CommerceModel.ProductCategory] as const),\n )\n}\n\nconst isDocumentId = (value: string) =>\n Boolean(value) && value.length <= 200 && !value.includes('/') && !/^__.*__$/.test(value)\n\nexport const productCatalog: PluginProductCatalog = {\n async store(hostId: string): Promise<CatalogStore | null> {\n if (!isDocumentId(hostId)) return null\n const { host, store } = await readStore(hostId)\n if (!host.exists) return null\n const data = host.data() ?? {}\n const settings = store.data() ?? {}\n const origin = storeOrigin(data)\n const shipping = settings['shipping'] as CommerceModel.ShippingSettings | undefined\n const name =\n str(data['displayName']).trim() ||\n (origin ? origin.replace(/^https?:\\/\\//, '') : '') ||\n 'Store'\n return {\n hostId,\n name,\n origin,\n currency: str(settings['currency']).trim().toUpperCase() || 'USD',\n productPagesServed: Boolean(str(settings['pdpScreenId'])),\n carrierPricedCountries: carrierPricedCountries(shipping, shippingCountries(shipping)),\n }\n },\n\n async page({ hostId, cursor, limit }): Promise<CatalogPage> {\n if (!isDocumentId(hostId)) return { offers: [], nextCursor: null }\n const want = Math.max(1, Math.min(Math.trunc(limit) || 1, 1000))\n const [{ host, store }, categories] = await Promise.all([readStore(hostId), readCategories(hostId)])\n if (!host.exists) return { offers: [], nextCursor: null }\n const shipping = store.get('shipping') as CommerceModel.ShippingSettings | undefined\n const context: PageContext = {\n origin: storeOrigin(host.data()),\n categories,\n shipping,\n countries: shippingCountries(shipping),\n }\n const products = firestore().collection('hosts').doc(hostId).collection('products')\n const idPath = firebaseAdmin.firestore.FieldPath.documentId()\n const offers: CatalogOffer[] = []\n let after = cursor && isDocumentId(cursor) ? cursor : null\n // Reads products until the page holds `want` offers or the catalog ends.\n // Drafts and archived products are read and skipped, so a store of many\n // drafts may take more than one read for a page.\n for (;;) {\n let query = products.orderBy(idPath).limit(MAX_PRODUCTS_PER_READ)\n if (after) query = query.startAfter(after)\n const snapshot = await query.get()\n for (const doc of snapshot.docs) {\n offers.push(...productOffers(doc.id, doc.data(), context))\n after = doc.id\n if (offers.length >= want) {\n const last = snapshot.docs[snapshot.docs.length - 1]\n // The page is full: continue after this product, unless it was the\n // last of a short read, which is the end of the catalog.\n const ended = doc.id === last.id && snapshot.size < MAX_PRODUCTS_PER_READ\n return { offers, nextCursor: ended ? null : doc.id }\n }\n }\n if (snapshot.size < MAX_PRODUCTS_PER_READ) return { offers, nextCursor: null }\n }\n },\n}\n"],"names":["liveCustomDomain","TENANT_APEX","firebaseAdmin","CommerceModel","MAX_PRODUCTS_PER_READ","MAX_OFFER_ID","firestore","app","str","value","plainDescription","replace","trim","toMinor","amount","number","Number","isFinite","Math","round","storeOrigin","host","domain","subdomain","absoluteImage","url","origin","undefined","test","startsWith","offerId","productId","variantId","hasVariants","slice","full","length","hash","char","imul","charCodeAt","suffix","toString","COLOR_OPTION","SIZE_OPTION","optionValue","options","pattern","name","Object","entries","categoryPath","categoryIds","categories","first","find","id","has","names","seen","Set","at","add","category","get","unshift","parentId","join","shippingCountries","settings","countries","zone","zones","code","country","String","toUpperCase","carrierPricedCountries","hasCarrierRates","filter","carrierRatesFor","dimensionsOf","product","facts","normalizeProductShippingFacts","shipping","lengthCm","widthCm","heightCm","width","height","offerShipping","unit","prices","cheapest","resolveShippingRates","subtotalCents","priceMinor","totalGrams","weightGrams","rate","rateId","LOCAL_PICKUP_RATE_ID","push","service","amountCents","productOffers","raw","context","liftLegacyProduct","status","slug","variants","variant","normalizeProductChannelFacts","channel","media","mediaUrls","imageUrl","map","Boolean","description","productType","subscriptionOnly","subscription","subscriptionOptional","updatedAtMs","createdAtMs","dimensionsCm","type","fromEntries","choices","option","ownPrice","priceUsd","compareAt","compareAtPriceUsd","onSale","tracked","stockTrackingApplies","inventory","quantity","max","trunc","availability","oversellPolicy","variantImage","gtin","normalizeGtin","barcode","offer","groupId","productName","title","path","additionalImageUrls","salePriceMinor","kind","condition","brand","mpn","googleProductCategory","color","size","readStore","hostId","hostRef","collection","doc","store","Promise","all","readCategories","snapshot","limit","Map","docs","data","isDocumentId","includes","productCatalog","exists","currency","productPagesServed","page","cursor","offers","nextCursor","want","min","products","idPath","FieldPath","documentId","after","query","orderBy","startAfter","last","ended"],"mappings":"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"}
@@ -0,0 +1,119 @@
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 PluginDraftCheck, type PluginResourceDraftWriter } from '@aglyn/aglyn/plugin-manager/plugin-resource-drafts';
18
+ import { type HostProduct, type ProductType, type ProposedProduct, type UnpricedProductDraft } from '../model/commerce';
19
+ /**
20
+ * A PRODUCT ANOTHER PLUGIN ASKS FOR (AGL-3616).
21
+ *
22
+ * The draft writer this plugin registers for the `product` resource on the
23
+ * core's resource-drafts seam. A plugin that sets a store up from a brief
24
+ * asks for the writer by name and gets this plugin's rules:
25
+ *
26
+ * - THE DOCUMENT is the one the products card makes from an accepted AI
27
+ * proposal (`unpricedProductDraft`): a `draft` — off the storefront, and
28
+ * refused by every sale door — with one variant per combination of its
29
+ * options, no photo, and the search, stock and smart-collection keys every
30
+ * product write derives. Born live (`deletedAt: null`), as the product
31
+ * resource stamps it, so the products table lists it.
32
+ * - THE PRICE is left empty unless the content states one. An unpriced
33
+ * product is marked for the merchant to price: the editor will not save it
34
+ * and the card will not activate it until every variant has a price.
35
+ * - THE ROOM is the `productsPerHost` allowance, counted the way the
36
+ * resources route and the importer count it, inside the transaction that
37
+ * creates. THE PLAN is the `commerce` feature, and THE ROLE a member who
38
+ * may write the site's content — refused in the resources route's words.
39
+ * - THE CHECK is `validateProduct`, the rule every product write is held to,
40
+ * with a placeholder price standing in where none was stated.
41
+ *
42
+ * Nothing is published, priced or sold. The writer touches the one new
43
+ * product document.
44
+ */
45
+ type Firestore = FirebaseFirestore.Firestore;
46
+ /** The resource name this writer is registered under. */
47
+ export declare const PRODUCT_DRAFT_RESOURCE = "product";
48
+ /** The longest product name the proposals and the editor keep. */
49
+ export declare const PRODUCT_DRAFT_NAME_MAX = 120;
50
+ /** The longest description a draft keeps. */
51
+ export declare const PRODUCT_DRAFT_DESCRIPTION_MAX = 5000;
52
+ /** The most tags a draft keeps, and the longest one. */
53
+ export declare const PRODUCT_DRAFT_TAGS_MAX = 20;
54
+ export declare const PRODUCT_DRAFT_TAG_MAX = 40;
55
+ /** The most categories a draft is filed under. */
56
+ export declare const PRODUCT_DRAFT_CATEGORIES_MAX = 10;
57
+ /** The longest search-listing title and description a draft keeps. */
58
+ export declare const PRODUCT_DRAFT_SEO_TITLE_MAX = 120;
59
+ export declare const PRODUCT_DRAFT_SEO_DESCRIPTION_MAX = 320;
60
+ /** The resources route's refusal for a member who may not write the site. */
61
+ export declare const PRODUCT_DRAFT_ROLE_REFUSAL = "Editing requires the editor role";
62
+ /** The resources route's refusal for a plan without the feature. */
63
+ export declare const PRODUCT_DRAFT_PLAN_REFUSAL = "This feature is not included in your plan \u2014 see Billing";
64
+ /** The resources route's refusal at the plan's allowance. */
65
+ export declare function productDraftLimitRefusal(limit: number): string;
66
+ /**
67
+ * What a caller sends as `content`: a proposed product, as the AI products
68
+ * job proposes one, with an optional stated price for every variant and the
69
+ * ids of categories the site already has. A photo is never taken: the
70
+ * merchant adds pictures in the editor.
71
+ */
72
+ export interface ProductDraftContent {
73
+ name: string;
74
+ type?: ProductType;
75
+ description?: string;
76
+ tags?: string[];
77
+ options?: Array<{
78
+ name: string;
79
+ values: string[];
80
+ }>;
81
+ seoTitle?: string;
82
+ seoDescription?: string;
83
+ /** One price for every variant, in dollars; absent leaves them unpriced. */
84
+ priceUsd?: number;
85
+ /** Ids of the site's product categories; one the site lacks is dropped. */
86
+ categoryIds?: string[];
87
+ }
88
+ /** A draft as the writer will store it, before its slug and keys are settled. */
89
+ export interface ProductDraftRead {
90
+ proposal: ProposedProduct;
91
+ /** The price stated for every variant, or `null` for the merchant to set. */
92
+ priceUsd: number | null;
93
+ categoryIds: string[];
94
+ }
95
+ export type ProductDraftContentRead = {
96
+ ok: true;
97
+ value: ProductDraftRead;
98
+ } | {
99
+ ok: false;
100
+ problems: string[];
101
+ };
102
+ /** The content as the writer reads it, or every problem that stops it. */
103
+ export declare function readProductDraftContent(content: Readonly<Record<string, unknown>>): ProductDraftContentRead;
104
+ /** The product document a read builds, under `slug`, at `nowMs`. */
105
+ export declare function productDraftDocument(read: ProductDraftRead, slug: string, nowMs: number): UnpricedProductDraft | HostProduct;
106
+ /** Whether content is a product this plugin would store, with what it says about it. Pure. */
107
+ export declare function checkProductDraftContent(content: Readonly<Record<string, unknown>>): PluginDraftCheck;
108
+ export interface ProductDraftWriterDeps {
109
+ /** The Admin SDK handle; specs hand in a double. */
110
+ firestore?: () => Firestore;
111
+ }
112
+ export declare function createProductDraftWriter(deps?: ProductDraftWriterDeps): PluginResourceDraftWriter;
113
+ export declare const productDraftWriter: PluginResourceDraftWriter;
114
+ /**
115
+ * Registers the writer; the console surface calls it, since only the console
116
+ * runs AI jobs (AGL-3026). Idempotent: a second call replaces the first.
117
+ */
118
+ export declare function registerProductDraftWriter(): void;
119
+ export {};