@aglyn/plugins-commerce 1.0.0-beta.230 → 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.
- package/package.json +13 -13
- package/src/index.d.ts +0 -1
- package/src/index.js +0 -1
- package/src/index.js.map +1 -1
- package/src/lib/barcode/barcode-decode.d.ts +71 -0
- package/src/lib/barcode/barcode-decode.js +498 -0
- package/src/lib/barcode/barcode-decode.js.map +1 -0
- package/src/lib/barcode/barcode-encode.d.ts +44 -0
- package/src/lib/barcode/barcode-encode.js +138 -0
- package/src/lib/barcode/barcode-encode.js.map +1 -0
- package/src/lib/barcode/barcode-scanner.component.d.ts +23 -0
- package/src/lib/barcode/barcode-scanner.component.js +260 -0
- package/src/lib/barcode/barcode-scanner.component.js.map +1 -0
- package/src/lib/barcode/scan-button.component.d.ts +10 -0
- package/src/lib/barcode/scan-button.component.js +62 -0
- package/src/lib/barcode/scan-button.component.js.map +1 -0
- package/src/lib/barcode/scanner-wedge.d.ts +35 -0
- package/src/lib/barcode/scanner-wedge.js +108 -0
- package/src/lib/barcode/scanner-wedge.js.map +1 -0
- package/src/lib/components/account.js +10 -1
- package/src/lib/components/account.js.map +1 -1
- package/src/lib/components/cart-extras.d.ts +45 -0
- package/src/lib/components/cart-extras.js +127 -0
- package/src/lib/components/cart-extras.js.map +1 -0
- package/src/lib/components/cart.js +82 -15
- package/src/lib/components/cart.js.map +1 -1
- package/src/lib/components/checkout-return-notice.d.ts +26 -0
- package/src/lib/components/checkout-return-notice.js +48 -0
- package/src/lib/components/checkout-return-notice.js.map +1 -0
- package/src/lib/components/commerce-console-page.js +124 -0
- package/src/lib/components/commerce-console-page.js.map +1 -1
- package/src/lib/components/commerce-console-sections.d.ts +1 -1
- package/src/lib/components/commerce-console-sections.js +4 -0
- package/src/lib/components/commerce-console-sections.js.map +1 -1
- package/src/lib/components/console/bulk-fulfill.d.ts +44 -0
- package/src/lib/components/console/bulk-fulfill.js +84 -0
- package/src/lib/components/console/bulk-fulfill.js.map +1 -0
- package/src/lib/components/console/customer-notifications-card.component.d.ts +19 -0
- package/src/lib/components/console/customer-notifications-card.component.js +149 -0
- package/src/lib/components/console/customer-notifications-card.component.js.map +1 -0
- package/src/lib/components/console/host-orders-card.component.js +84 -5
- package/src/lib/components/console/host-orders-card.component.js.map +1 -1
- package/src/lib/components/console/locations-card.component.js +164 -57
- package/src/lib/components/console/locations-card.component.js.map +1 -1
- package/src/lib/components/console/order-detail-dialog.component.js +209 -61
- package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
- package/src/lib/components/console/order-fulfillment-panel.component.d.ts +48 -0
- package/src/lib/components/console/order-fulfillment-panel.component.js +542 -0
- package/src/lib/components/console/order-fulfillment-panel.component.js.map +1 -0
- package/src/lib/components/console/order-invoice.component.d.ts +33 -0
- package/src/lib/components/console/order-invoice.component.js +81 -0
- package/src/lib/components/console/order-invoice.component.js.map +1 -0
- package/src/lib/components/console/order-receipt-resend.component.d.ts +21 -0
- package/src/lib/components/console/order-receipt-resend.component.js +203 -0
- package/src/lib/components/console/order-receipt-resend.component.js.map +1 -0
- package/src/lib/components/console/order-returns.component.d.ts +36 -0
- package/src/lib/components/console/order-returns.component.js +142 -0
- package/src/lib/components/console/order-returns.component.js.map +1 -0
- package/src/lib/components/console/order-shipping-actions.component.d.ts +54 -0
- package/src/lib/components/console/order-shipping-actions.component.js +149 -0
- package/src/lib/components/console/order-shipping-actions.component.js.map +1 -0
- package/src/lib/components/console/order-webhooks-card.component.d.ts +50 -0
- package/src/lib/components/console/order-webhooks-card.component.js +623 -0
- package/src/lib/components/console/order-webhooks-card.component.js.map +1 -0
- package/src/lib/components/console/order-zones.d.ts +155 -0
- package/src/lib/components/console/order-zones.js +40 -0
- package/src/lib/components/console/order-zones.js.map +1 -0
- package/src/lib/components/console/payment-methods-card.component.d.ts +67 -0
- package/src/lib/components/console/payment-methods-card.component.js +395 -0
- package/src/lib/components/console/payment-methods-card.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-api.d.ts +124 -0
- package/src/lib/components/console/pos/pos-api.js +101 -0
- package/src/lib/components/console/pos/pos-api.js.map +1 -0
- package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +36 -0
- package/src/lib/components/console/pos/pos-cart-panel.component.js +160 -0
- package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-item-dialog.component.d.ts +39 -0
- package/src/lib/components/console/pos/pos-item-dialog.component.js +352 -0
- package/src/lib/components/console/pos/pos-item-dialog.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-product-grid.component.d.ts +47 -0
- package/src/lib/components/console/pos/pos-product-grid.component.js +272 -0
- package/src/lib/components/console/pos/pos-product-grid.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-receipt-panel.component.d.ts +27 -0
- package/src/lib/components/console/pos/pos-receipt-panel.component.js +282 -0
- package/src/lib/components/console/pos/pos-receipt-panel.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-tender-dialogs.component.d.ts +53 -0
- package/src/lib/components/console/pos/pos-tender-dialogs.component.js +445 -0
- package/src/lib/components/console/pos/pos-tender-dialogs.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-tender-panel.component.d.ts +31 -0
- package/src/lib/components/console/pos/pos-tender-panel.component.js +640 -0
- package/src/lib/components/console/pos/pos-tender-panel.component.js.map +1 -0
- package/src/lib/components/console/pos/use-pos-display.d.ts +43 -0
- package/src/lib/components/console/pos/use-pos-display.js +161 -0
- package/src/lib/components/console/pos/use-pos-display.js.map +1 -0
- package/src/lib/components/console/pos-devices-card.component.d.ts +14 -0
- package/src/lib/components/console/pos-devices-card.component.js +546 -0
- package/src/lib/components/console/pos-devices-card.component.js.map +1 -0
- package/src/lib/components/console/pos-display/brand-screen.d.ts +33 -0
- package/src/lib/components/console/pos-display/brand-screen.js +85 -0
- package/src/lib/components/console/pos-display/brand-screen.js.map +1 -0
- package/src/lib/components/console/pos-display/cart-screen.d.ts +29 -0
- package/src/lib/components/console/pos-display/cart-screen.js +166 -0
- package/src/lib/components/console/pos-display/cart-screen.js.map +1 -0
- package/src/lib/components/console/pos-display/pairing-screen.d.ts +24 -0
- package/src/lib/components/console/pos-display/pairing-screen.js +127 -0
- package/src/lib/components/console/pos-display/pairing-screen.js.map +1 -0
- package/src/lib/components/console/pos-display/pos-display-api.d.ts +90 -0
- package/src/lib/components/console/pos-display/pos-display-api.js +140 -0
- package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -0
- package/src/lib/components/console/pos-display/receipt-screen.d.ts +35 -0
- package/src/lib/components/console/pos-display/receipt-screen.js +200 -0
- package/src/lib/components/console/pos-display/receipt-screen.js.map +1 -0
- package/src/lib/components/console/pos-display/tip-screen.d.ts +36 -0
- package/src/lib/components/console/pos-display/tip-screen.js +211 -0
- package/src/lib/components/console/pos-display/tip-screen.js.map +1 -0
- package/src/lib/components/console/pos-display-page.component.d.ts +16 -0
- package/src/lib/components/console/pos-display-page.component.js +407 -0
- package/src/lib/components/console/pos-display-page.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-customer-lookup.component.d.ts +40 -0
- package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js +289 -0
- package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-last-receipt.component.d.ts +34 -0
- package/src/lib/components/console/pos-ops/pos-last-receipt.component.js +61 -0
- package/src/lib/components/console/pos-ops/pos-last-receipt.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +38 -0
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +129 -0
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-ops-api.d.ts +37 -0
- package/src/lib/components/console/pos-ops/pos-ops-api.js +60 -0
- package/src/lib/components/console/pos-ops/pos-ops-api.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-pin-pad.component.d.ts +48 -0
- package/src/lib/components/console/pos-ops/pos-pin-pad.component.js +220 -0
- package/src/lib/components/console/pos-ops/pos-pin-pad.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-receipt-actions.component.d.ts +63 -0
- package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js +186 -0
- package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-receipt.d.ts +39 -0
- package/src/lib/components/console/pos-ops/pos-receipt.js +182 -0
- package/src/lib/components/console/pos-ops/pos-receipt.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-return-dialog.component.d.ts +40 -0
- package/src/lib/components/console/pos-ops/pos-return-dialog.component.js +465 -0
- package/src/lib/components/console/pos-ops/pos-return-dialog.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-shift-history-card.component.d.ts +29 -0
- package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js +253 -0
- package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +34 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +494 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-shift-report.component.d.ts +37 -0
- package/src/lib/components/console/pos-ops/pos-shift-report.component.js +102 -0
- package/src/lib/components/console/pos-ops/pos-shift-report.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.d.ts +30 -0
- package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js +277 -0
- package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/register-ops.d.ts +28 -0
- package/src/lib/components/console/pos-ops/register-ops.js +28 -0
- package/src/lib/components/console/pos-ops/register-ops.js.map +1 -0
- package/src/lib/components/console/pos-ops/use-pos-cashier.d.ts +46 -0
- package/src/lib/components/console/pos-ops/use-pos-cashier.js +128 -0
- package/src/lib/components/console/pos-ops/use-pos-cashier.js.map +1 -0
- package/src/lib/components/console/pos-ops/use-pos-sale-receipt.d.ts +36 -0
- package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js +64 -0
- package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js.map +1 -0
- package/src/lib/components/console/pos-page.component.d.ts +13 -5
- package/src/lib/components/console/pos-page.component.js +729 -657
- package/src/lib/components/console/pos-page.component.js.map +1 -1
- package/src/lib/components/console/product-editor-dialog.component.js +51 -7
- package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
- package/src/lib/components/console/product-labels-dialog.component.d.ts +13 -0
- package/src/lib/components/console/product-labels-dialog.component.js +197 -0
- package/src/lib/components/console/product-labels-dialog.component.js.map +1 -0
- package/src/lib/components/console/product-register-fields.component.d.ts +19 -0
- package/src/lib/components/console/product-register-fields.component.js +241 -0
- package/src/lib/components/console/product-register-fields.component.js.map +1 -0
- package/src/lib/components/console/product-zones.d.ts +44 -0
- package/src/lib/components/console/product-zones.js.map +1 -1
- package/src/lib/components/console/products-hub-card.component.js +12 -0
- package/src/lib/components/console/products-hub-card.component.js.map +1 -1
- package/src/lib/components/console/register-hardware-card.component.d.ts +33 -0
- package/src/lib/components/console/register-hardware-card.component.js +826 -0
- package/src/lib/components/console/register-hardware-card.component.js.map +1 -0
- package/src/lib/components/console/registers-card.component.js +24 -5
- package/src/lib/components/console/registers-card.component.js.map +1 -1
- package/src/lib/components/console/return-actions.d.ts +38 -0
- package/src/lib/components/console/return-actions.js +76 -0
- package/src/lib/components/console/return-actions.js.map +1 -0
- package/src/lib/components/console/return-detail-dialog.component.d.ts +34 -0
- package/src/lib/components/console/return-detail-dialog.component.js +718 -0
- package/src/lib/components/console/return-detail-dialog.component.js.map +1 -0
- package/src/lib/components/console/return-settings-card.component.d.ts +34 -0
- package/src/lib/components/console/return-settings-card.component.js +195 -0
- package/src/lib/components/console/return-settings-card.component.js.map +1 -0
- package/src/lib/components/console/return-zones.d.ts +87 -0
- package/src/lib/components/console/return-zones.js +31 -0
- package/src/lib/components/console/return-zones.js.map +1 -0
- package/src/lib/components/console/returns-card.component.d.ts +45 -0
- package/src/lib/components/console/returns-card.component.js +159 -0
- package/src/lib/components/console/returns-card.component.js.map +1 -0
- package/src/lib/components/console/shipping-settings-card.component.js +161 -5
- package/src/lib/components/console/shipping-settings-card.component.js.map +1 -1
- package/src/lib/components/console/shippingeasy-card.component.d.ts +59 -0
- package/src/lib/components/console/shippingeasy-card.component.js +378 -0
- package/src/lib/components/console/shippingeasy-card.component.js.map +1 -0
- package/src/lib/components/console/shipstation-card.component.d.ts +35 -0
- package/src/lib/components/console/shipstation-card.component.js +345 -0
- package/src/lib/components/console/shipstation-card.component.js.map +1 -0
- package/src/lib/components/console/start-return-dialog.component.d.ts +40 -0
- package/src/lib/components/console/start-return-dialog.component.js +243 -0
- package/src/lib/components/console/start-return-dialog.component.js.map +1 -0
- package/src/lib/components/console/stock-movements-card.component.js +2 -1
- package/src/lib/components/console/stock-movements-card.component.js.map +1 -1
- package/src/lib/components/console/store-settings-card.component.js +2 -66
- package/src/lib/components/console/store-settings-card.component.js.map +1 -1
- package/src/lib/components/console/store-zones.d.ts +42 -0
- package/src/lib/components/console/store-zones.js +39 -0
- package/src/lib/components/console/store-zones.js.map +1 -0
- package/src/lib/components/order-status.d.ts +36 -0
- package/src/lib/components/order-status.js +502 -0
- package/src/lib/components/order-status.js.map +1 -0
- package/src/lib/components/product-detail.js +41 -2
- package/src/lib/components/product-detail.js.map +1 -1
- package/src/lib/components/return-request.d.ts +32 -0
- package/src/lib/components/return-request.js +576 -0
- package/src/lib/components/return-request.js.map +1 -0
- package/src/lib/components/storefront-payment-appearance.d.ts +32 -0
- package/src/lib/components/storefront-payment-appearance.js +114 -0
- package/src/lib/components/storefront-payment-appearance.js.map +1 -0
- package/src/lib/components/storefront-payment-element.d.ts +57 -1
- package/src/lib/components/storefront-payment-element.js +332 -33
- package/src/lib/components/storefront-payment-element.js.map +1 -1
- package/src/lib/constants/order-status.d.ts +22 -0
- package/src/lib/constants/order-status.js +22 -0
- package/src/lib/constants/order-status.js.map +1 -0
- package/src/lib/constants/return-request.d.ts +27 -0
- package/src/lib/constants/return-request.js +32 -0
- package/src/lib/constants/return-request.js.map +1 -0
- package/src/lib/constants/stock-movement-query.js +2 -1
- package/src/lib/constants/stock-movement-query.js.map +1 -1
- package/src/lib/declarations.console-server.js +9 -0
- package/src/lib/declarations.console-server.js.map +1 -1
- package/src/lib/declarations.server.d.ts +2 -1
- package/src/lib/declarations.server.js +47 -1
- package/src/lib/declarations.server.js.map +1 -1
- package/src/lib/model/buyer-notifications.d.ts +59 -0
- package/src/lib/model/buyer-notifications.js +97 -0
- package/src/lib/model/buyer-notifications.js.map +1 -0
- package/src/lib/model/commerce-orders.d.ts +127 -1
- package/src/lib/model/commerce-orders.js +24 -15
- package/src/lib/model/commerce-orders.js.map +1 -1
- package/src/lib/model/commerce-payment-methods.d.ts +146 -0
- package/src/lib/model/commerce-payment-methods.js +247 -0
- package/src/lib/model/commerce-payment-methods.js.map +1 -0
- package/src/lib/model/commerce-pos-ops.d.ts +437 -0
- package/src/lib/model/commerce-pos-ops.js +721 -0
- package/src/lib/model/commerce-pos-ops.js.map +1 -0
- package/src/lib/model/commerce-pos.d.ts +263 -0
- package/src/lib/model/commerce-pos.js +375 -0
- package/src/lib/model/commerce-pos.js.map +1 -0
- package/src/lib/model/commerce-printers.d.ts +211 -0
- package/src/lib/model/commerce-printers.js +181 -0
- package/src/lib/model/commerce-printers.js.map +1 -0
- package/src/lib/model/commerce-receipt.d.ts +97 -0
- package/src/lib/model/commerce-receipt.js +180 -0
- package/src/lib/model/commerce-receipt.js.map +1 -0
- package/src/lib/model/commerce-returns.d.ts +207 -0
- package/src/lib/model/commerce-returns.js +300 -0
- package/src/lib/model/commerce-returns.js.map +1 -0
- package/src/lib/model/commerce-shipping.d.ts +44 -1
- package/src/lib/model/commerce-shipping.js +53 -9
- package/src/lib/model/commerce-shipping.js.map +1 -1
- package/src/lib/model/commerce-tax-engine.d.ts +90 -0
- package/src/lib/model/commerce-tax-engine.js +129 -0
- package/src/lib/model/commerce-tax-engine.js.map +1 -0
- package/src/lib/model/commerce.d.ts +88 -2
- package/src/lib/model/commerce.js +89 -1
- package/src/lib/model/commerce.js.map +1 -1
- package/src/lib/model/index.d.ts +15 -0
- package/src/lib/model/index.js +15 -0
- package/src/lib/model/index.js.map +1 -1
- package/src/lib/model/order-events.d.ts +154 -0
- package/src/lib/model/order-events.js +153 -0
- package/src/lib/model/order-events.js.map +1 -0
- package/src/lib/model/order-fulfillment.d.ts +117 -0
- package/src/lib/model/order-fulfillment.js +217 -0
- package/src/lib/model/order-fulfillment.js.map +1 -0
- package/src/lib/model/order-history.d.ts +58 -0
- package/src/lib/model/order-history.js +22 -0
- package/src/lib/model/order-history.js.map +1 -0
- package/src/lib/model/order-list-fields.d.ts +9 -1
- package/src/lib/model/order-list-fields.js +7 -1
- package/src/lib/model/order-list-fields.js.map +1 -1
- package/src/lib/model/order-shipping-export.d.ts +91 -0
- package/src/lib/model/order-shipping-export.js +192 -0
- package/src/lib/model/order-shipping-export.js.map +1 -0
- package/src/lib/model/order-status-view.d.ts +103 -0
- package/src/lib/model/order-status-view.js +156 -0
- package/src/lib/model/order-status-view.js.map +1 -0
- package/src/lib/model/order-webhooks.d.ts +142 -0
- package/src/lib/model/order-webhooks.js +91 -0
- package/src/lib/model/order-webhooks.js.map +1 -0
- package/src/lib/model/product-channel.d.ts +56 -0
- package/src/lib/model/product-channel.js +86 -0
- package/src/lib/model/product-channel.js.map +1 -0
- package/src/lib/model/product-modifiers.d.ts +80 -0
- package/src/lib/model/product-modifiers.js +140 -0
- package/src/lib/model/product-modifiers.js.map +1 -0
- package/src/lib/model/shippingeasy.d.ts +94 -0
- package/src/lib/model/shippingeasy.js +267 -0
- package/src/lib/model/shippingeasy.js.map +1 -0
- package/src/lib/model/shipstation.d.ts +125 -0
- package/src/lib/model/shipstation.js +399 -0
- package/src/lib/model/shipstation.js.map +1 -0
- package/src/lib/model/smart-collection-reads.d.ts +32 -0
- package/src/lib/model/smart-collection-reads.js +63 -0
- package/src/lib/model/smart-collection-reads.js.map +1 -0
- package/src/lib/model/tracking-url.d.ts +74 -0
- package/src/lib/model/tracking-url.js +159 -0
- package/src/lib/model/tracking-url.js.map +1 -0
- package/src/lib/plugin-config.d.ts +13 -0
- package/src/lib/plugin-config.js +77 -5
- package/src/lib/plugin-config.js.map +1 -1
- package/src/lib/plugin.js +23 -0
- package/src/lib/plugin.js.map +1 -1
- package/src/lib/pos-ops-config.d.ts +39 -0
- package/src/lib/pos-ops-config.js +88 -0
- package/src/lib/pos-ops-config.js.map +1 -0
- package/src/lib/printing/print-document.d.ts +106 -0
- package/src/lib/printing/print-document.js +464 -0
- package/src/lib/printing/print-document.js.map +1 -0
- package/src/lib/printing/product-labels.d.ts +58 -0
- package/src/lib/printing/product-labels.js +116 -0
- package/src/lib/printing/product-labels.js.map +1 -0
- package/src/lib/printing/render-epson.d.ts +57 -0
- package/src/lib/printing/render-epson.js +135 -0
- package/src/lib/printing/render-epson.js.map +1 -0
- package/src/lib/printing/render-star.d.ts +45 -0
- package/src/lib/printing/render-star.js +100 -0
- package/src/lib/printing/render-star.js.map +1 -0
- package/src/lib/printing/render-text.d.ts +25 -0
- package/src/lib/printing/render-text.js +53 -0
- package/src/lib/printing/render-text.js.map +1 -0
- package/src/lib/server/api-v1/openapi.js +27 -4
- package/src/lib/server/api-v1/openapi.js.map +1 -1
- package/src/lib/server/api-v1/order-view.d.ts +67 -0
- package/src/lib/server/api-v1/order-view.js +120 -0
- package/src/lib/server/api-v1/order-view.js.map +1 -0
- package/src/lib/server/api-v1/orders-and-products.js +58 -65
- package/src/lib/server/api-v1/orders-and-products.js.map +1 -1
- package/src/lib/server/billing-webhook.js +135 -28
- package/src/lib/server/billing-webhook.js.map +1 -1
- package/src/lib/server/cancel-order.js +29 -0
- package/src/lib/server/cancel-order.js.map +1 -1
- package/src/lib/server/carrier-rates-availability.d.ts +26 -0
- package/src/lib/server/carrier-rates-availability.js +76 -0
- package/src/lib/server/carrier-rates-availability.js.map +1 -0
- package/src/lib/server/carrier-shipping.d.ts +84 -0
- package/src/lib/server/carrier-shipping.js +135 -0
- package/src/lib/server/carrier-shipping.js.map +1 -0
- package/src/lib/server/cart-checkout.d.ts +2 -0
- package/src/lib/server/cart-checkout.js +226 -22
- package/src/lib/server/cart-checkout.js.map +1 -1
- package/src/lib/server/checkout-extras.d.ts +64 -0
- package/src/lib/server/checkout-extras.js +157 -0
- package/src/lib/server/checkout-extras.js.map +1 -0
- package/src/lib/server/{feed.d.ts → checkout-status.d.ts} +2 -7
- package/src/lib/server/checkout-status.js +111 -0
- package/src/lib/server/checkout-status.js.map +1 -0
- package/src/lib/server/checkout.js +86 -9
- package/src/lib/server/checkout.js.map +1 -1
- package/src/lib/server/draft-order.js +34 -5
- package/src/lib/server/draft-order.js.map +1 -1
- package/src/lib/server/fulfill-order.d.ts +127 -10
- package/src/lib/server/fulfill-order.js +451 -49
- package/src/lib/server/fulfill-order.js.map +1 -1
- package/src/lib/server/legacy-feed.d.ts +28 -0
- package/src/lib/server/legacy-feed.js +52 -0
- package/src/lib/server/legacy-feed.js.map +1 -0
- package/src/lib/server/native-checkout.d.ts +34 -15
- package/src/lib/server/native-checkout.js +32 -17
- package/src/lib/server/native-checkout.js.map +1 -1
- package/src/lib/server/order-event-host-emit.d.ts +23 -0
- package/src/lib/server/order-event-host-emit.js +30 -0
- package/src/lib/server/order-event-host-emit.js.map +1 -0
- package/src/lib/server/order-event-triggers.d.ts +37 -0
- package/src/lib/server/order-event-triggers.js +119 -0
- package/src/lib/server/order-event-triggers.js.map +1 -0
- package/src/lib/server/order-events.d.ts +62 -0
- package/src/lib/server/order-events.js +109 -0
- package/src/lib/server/order-events.js.map +1 -0
- package/src/lib/server/order-history.d.ts +23 -0
- package/src/lib/server/order-history.js +65 -0
- package/src/lib/server/order-history.js.map +1 -0
- package/src/lib/server/order-notifications.d.ts +185 -0
- package/src/lib/server/order-notifications.js +567 -0
- package/src/lib/server/order-notifications.js.map +1 -0
- package/src/lib/server/order-receipt-send.d.ts +39 -0
- package/src/lib/server/order-receipt-send.js +151 -0
- package/src/lib/server/order-receipt-send.js.map +1 -0
- package/src/lib/server/order-status-token.d.ts +31 -0
- package/src/lib/server/order-status-token.js +75 -0
- package/src/lib/server/order-status-token.js.map +1 -0
- package/src/lib/server/order-status.d.ts +58 -0
- package/src/lib/server/order-status.js +141 -0
- package/src/lib/server/order-status.js.map +1 -0
- package/src/lib/server/order-webhooks.d.ts +108 -0
- package/src/lib/server/order-webhooks.js +622 -0
- package/src/lib/server/order-webhooks.js.map +1 -0
- package/src/lib/server/orders-shipping-prepare.d.ts +26 -0
- package/src/lib/server/orders-shipping-prepare.js +121 -0
- package/src/lib/server/orders-shipping-prepare.js.map +1 -0
- package/src/lib/server/payment-method-domains.d.ts +209 -0
- package/src/lib/server/payment-method-domains.js +444 -0
- package/src/lib/server/payment-method-domains.js.map +1 -0
- package/src/lib/server/payment-methods.d.ts +77 -0
- package/src/lib/server/payment-methods.js +284 -0
- package/src/lib/server/payment-methods.js.map +1 -0
- package/src/lib/server/pos-auth.d.ts +50 -0
- package/src/lib/server/pos-auth.js +121 -0
- package/src/lib/server/pos-auth.js.map +1 -0
- package/src/lib/server/pos-customer.d.ts +49 -0
- package/src/lib/server/pos-customer.js +257 -0
- package/src/lib/server/pos-customer.js.map +1 -0
- package/src/lib/server/pos-display.d.ts +57 -0
- package/src/lib/server/pos-display.js +419 -0
- package/src/lib/server/pos-display.js.map +1 -0
- package/src/lib/server/pos-fee-month.d.ts +34 -0
- package/src/lib/server/pos-fee-month.js +36 -0
- package/src/lib/server/pos-fee-month.js.map +1 -0
- package/src/lib/server/pos-ops-gate.d.ts +161 -0
- package/src/lib/server/pos-ops-gate.js +295 -0
- package/src/lib/server/pos-ops-gate.js.map +1 -0
- package/src/lib/server/pos-ops-routes.d.ts +22 -0
- package/src/lib/server/pos-ops-routes.js +36 -0
- package/src/lib/server/pos-ops-routes.js.map +1 -0
- package/src/lib/server/pos-order.d.ts +1 -18
- package/src/lib/server/pos-order.js +222 -42
- package/src/lib/server/pos-order.js.map +1 -1
- package/src/lib/server/pos-payment.d.ts +39 -0
- package/src/lib/server/pos-payment.js +922 -0
- package/src/lib/server/pos-payment.js.map +1 -0
- package/src/lib/server/pos-print.d.ts +82 -0
- package/src/lib/server/pos-print.js +193 -0
- package/src/lib/server/pos-print.js.map +1 -0
- package/src/lib/server/pos-readers.d.ts +27 -0
- package/src/lib/server/pos-readers.js +276 -0
- package/src/lib/server/pos-readers.js.map +1 -0
- package/src/lib/server/pos-refund-authority.d.ts +60 -0
- package/src/lib/server/pos-refund-authority.js +72 -0
- package/src/lib/server/pos-refund-authority.js.map +1 -0
- package/src/lib/server/pos-return.d.ts +58 -0
- package/src/lib/server/pos-return.js +891 -0
- package/src/lib/server/pos-return.js.map +1 -0
- package/src/lib/server/pos-sale-stamp.d.ts +66 -0
- package/src/lib/server/pos-sale-stamp.js +84 -0
- package/src/lib/server/pos-sale-stamp.js.map +1 -0
- package/src/lib/server/pos-sale.d.ts +170 -0
- package/src/lib/server/pos-sale.js +461 -0
- package/src/lib/server/pos-sale.js.map +1 -0
- package/src/lib/server/pos-shift.d.ts +45 -0
- package/src/lib/server/pos-shift.js +484 -0
- package/src/lib/server/pos-shift.js.map +1 -0
- package/src/lib/server/pos-staff-pin.d.ts +26 -0
- package/src/lib/server/pos-staff-pin.js +339 -0
- package/src/lib/server/pos-staff-pin.js.map +1 -0
- package/src/lib/server/pos-stripe.d.ts +91 -0
- package/src/lib/server/pos-stripe.js +129 -0
- package/src/lib/server/pos-stripe.js.map +1 -0
- package/src/lib/server/pos-terminal-connection-token.d.ts +48 -0
- package/src/lib/server/pos-terminal-connection-token.js +166 -0
- package/src/lib/server/pos-terminal-connection-token.js.map +1 -0
- package/src/lib/server/pos-terminal.d.ts +218 -0
- package/src/lib/server/pos-terminal.js +1014 -0
- package/src/lib/server/pos-terminal.js.map +1 -0
- package/src/lib/server/print-queue.d.ts +124 -0
- package/src/lib/server/print-queue.js +301 -0
- package/src/lib/server/print-queue.js.map +1 -0
- package/src/lib/server/printer-poll.d.ts +75 -0
- package/src/lib/server/printer-poll.js +325 -0
- package/src/lib/server/printer-poll.js.map +1 -0
- package/src/lib/server/printer-secret.d.ts +39 -0
- package/src/lib/server/printer-secret.js +56 -0
- package/src/lib/server/printer-secret.js.map +1 -0
- package/src/lib/server/printers.d.ts +114 -0
- package/src/lib/server/printers.js +546 -0
- package/src/lib/server/printers.js.map +1 -0
- package/src/lib/server/product-catalog.d.ts +42 -0
- package/src/lib/server/product-catalog.js +305 -0
- package/src/lib/server/product-catalog.js.map +1 -0
- package/src/lib/server/refund.js +110 -45
- package/src/lib/server/refund.js.map +1 -1
- package/src/lib/server/reserve.js +2 -0
- package/src/lib/server/reserve.js.map +1 -1
- package/src/lib/server/return-status-action.d.ts +37 -0
- package/src/lib/server/return-status-action.js +57 -0
- package/src/lib/server/return-status-action.js.map +1 -0
- package/src/lib/server/returns.d.ts +119 -0
- package/src/lib/server/returns.js +938 -0
- package/src/lib/server/returns.js.map +1 -0
- package/src/lib/server/shipment-records.d.ts +36 -0
- package/src/lib/server/shipment-records.js +289 -0
- package/src/lib/server/shipment-records.js.map +1 -0
- package/src/lib/server/shipping-connector-gates.d.ts +40 -0
- package/src/lib/server/shipping-connector-gates.js +97 -0
- package/src/lib/server/shipping-connector-gates.js.map +1 -0
- package/src/lib/server/shipping-connectors.d.ts +29 -0
- package/src/lib/server/shipping-connectors.js +236 -0
- package/src/lib/server/shipping-connectors.js.map +1 -0
- package/src/lib/server/shippingeasy.d.ts +238 -0
- package/src/lib/server/shippingeasy.js +787 -0
- package/src/lib/server/shippingeasy.js.map +1 -0
- package/src/lib/server/shipstation.d.ts +129 -0
- package/src/lib/server/shipstation.js +483 -0
- package/src/lib/server/shipstation.js.map +1 -0
- package/src/lib/server/site-page-resolver.d.ts +5 -0
- package/src/lib/server/site-page-resolver.js +156 -1
- package/src/lib/server/site-page-resolver.js.map +1 -1
- package/src/lib/server/stock-levels.d.ts +21 -0
- package/src/lib/server/stock-levels.js +263 -0
- package/src/lib/server/stock-levels.js.map +1 -0
- package/src/lib/server/stripe-refund.d.ts +47 -0
- package/src/lib/server/stripe-refund.js +87 -0
- package/src/lib/server/stripe-refund.js.map +1 -0
- package/src/lib/server/supplier-update.js +46 -5
- package/src/lib/server/supplier-update.js.map +1 -1
- package/src/lib/server/tax-engine-quote.d.ts +47 -0
- package/src/lib/server/tax-engine-quote.js +105 -0
- package/src/lib/server/tax-engine-quote.js.map +1 -0
- package/src/lib/server.js +138 -2
- package/src/lib/server.js.map +1 -1
- package/src/lib/site.js +12 -0
- package/src/lib/site.js.map +1 -1
- package/src/lib/subprocessors.d.ts +26 -0
- package/src/lib/subprocessors.js +50 -0
- package/src/lib/subprocessors.js.map +1 -0
- package/src/lib/tenant-emails.js +461 -3
- package/src/lib/tenant-emails.js.map +1 -1
- package/src/lib/testing/fake-firestore.d.ts +45 -0
- package/src/lib/testing/fake-firestore.js +189 -0
- package/src/lib/testing/fake-firestore.js.map +1 -0
- package/src/lib/testing/memory-firestore.d.ts +123 -0
- package/src/lib/testing/memory-firestore.js +274 -0
- package/src/lib/testing/memory-firestore.js.map +1 -0
- package/src/lib/testing/pos-ops-harness.d.ts +50 -0
- package/src/lib/testing/pos-ops-harness.js +184 -0
- package/src/lib/testing/pos-ops-harness.js.map +1 -0
- package/src/lib/testing/pos-ops-memory-firestore.d.ts +55 -0
- package/src/lib/testing/pos-ops-memory-firestore.js +376 -0
- package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -0
- package/src/lib/transfer/records-transfer.d.ts +11 -1
- package/src/lib/transfer/records-transfer.js +127 -5
- package/src/lib/transfer/records-transfer.js.map +1 -1
- package/src/lib/transfer/records.server.d.ts +9 -2
- package/src/lib/transfer/records.server.js +58 -7
- package/src/lib/transfer/records.server.js.map +1 -1
- package/src/lib/transfer/register-transfer-resources.js +40 -1
- package/src/lib/transfer/register-transfer-resources.js.map +1 -1
- package/src/lib/transfer/register-transfer-ui.js +4 -1
- package/src/lib/transfer/register-transfer-ui.js.map +1 -1
- package/src/lib/transfer/shipping-presets.d.ts +23 -0
- package/src/lib/transfer/shipping-presets.js +156 -0
- package/src/lib/transfer/shipping-presets.js.map +1 -0
- package/src/lib/transfer/tracking-transfer.d.ts +101 -0
- package/src/lib/transfer/tracking-transfer.js +546 -0
- package/src/lib/transfer/tracking-transfer.js.map +1 -0
- package/src/lib/transfer/tracking.server.d.ts +37 -0
- package/src/lib/transfer/tracking.server.js +393 -0
- package/src/lib/transfer/tracking.server.js.map +1 -0
- package/src/lib/transfer/transfer-keys.d.ts +2 -1
- package/src/lib/transfer/transfer-keys.js +6 -2
- package/src/lib/transfer/transfer-keys.js.map +1 -1
- package/src/lib/utils/code128.d.ts +37 -0
- package/src/lib/utils/code128.js +199 -0
- package/src/lib/utils/code128.js.map +1 -0
- package/src/lib/utils/order-invoice.d.ts +55 -0
- package/src/lib/utils/order-invoice.js +127 -0
- package/src/lib/utils/order-invoice.js.map +1 -0
- package/src/lib/utils/use-checkout-return-notice.d.ts +34 -0
- package/src/lib/utils/use-checkout-return-notice.js +78 -0
- package/src/lib/utils/use-checkout-return-notice.js.map +1 -0
- package/src/lib/server/feed.js +0 -69
- package/src/lib/server/feed.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/server/printers.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as Aglyn from '@aglyn/aglyn/server'\nimport type { PluginApiHandler, PluginApiRequest } from '@aglyn/aglyn/server'\nimport { createResourceUid } from '@aglyn/aglyn/app-utils/create-resource-uid'\nimport { resolveSiteTimeZone } from '@aglyn/aglyn/app-utils/collection-entry-date'\nimport { firebaseAdmin, getOrgForHost } from '@aglyn/tenant-data-admin'\nimport { resolveOrgPermissions } from '@aglyn/tenant-runtime/org-permissions'\nimport {\n normalizePrinterDeviceId,\n PRINTER_BRANDS,\n type PosPrinter,\n type PrinterBrand,\n type PrintReport,\n} from '../model/commerce-printers'\nimport { receiptDataFromOrder, type ReceiptData } from '../model/commerce-receipt'\nimport type { HostOrder } from '../model/commerce-orders'\nimport { enqueuePrintJob, printJobsRef, printersRef } from './print-queue'\nimport { printerPollUrl } from './printer-secret'\nimport { isRefusedIdToken } from '@aglyn/tenant-data-admin/server/id-token-refusal'\n\n/**\n * `POST /api/commerce/printers` (AGL-3619): a register's cloud receipt\n * printers, from the Hardware card, and the jobs a manager sends them by hand\n * (a test page, a reprint, \"open drawer\").\n *\n * Every write to `printers` and `printJobs` is here or in the poll routes:\n * the Firestore rules deny both to every client, so a printer's identity, its\n * secret's version and its queue cannot be edited around this gate.\n */\n\n/** A counter seldom has more than two; the cap keeps a typo loop from minting dozens. */\nexport const MAX_PRINTERS_PER_REGISTER = 4\n\ninterface PrinterManager {\n uid: string\n hostId: string\n}\n\n/**\n * The register's gate (`pos-order.ts`): `admin` or `editor` on THIS site,\n * `managePos` on the member's permissions, and `pos` on the owning plan.\n */\nexport async function authorizePrinterManager(\n req: PluginApiRequest,\n hostId: string,\n): Promise<{ ok: true; manager: PrinterManager } | { ok: false; status: number; error: string }> {\n const authorization = String(req.headers.authorization ?? '')\n const idToken = authorization.startsWith('Bearer ') ? authorization.slice(7) : ''\n if (!idToken) return { ok: false, status: 401, error: 'Unauthenticated' }\n if (!/^[A-Za-z0-9_-]{1,128}$/.test(hostId)) return { ok: false, status: 400, error: 'Missing hostId' }\n let uid: string\n try {\n uid = (await firebaseAdmin.app().auth().verifyIdToken(idToken)).uid\n } catch (error) {\n if (!isRefusedIdToken(error)) throw error\n return { ok: false, status: 401, error: 'Unauthenticated' }\n }\n const host = await firebaseAdmin.app().firestore().collection('hosts').doc(hostId).get()\n if (!host.exists) return { ok: false, status: 404, error: 'Unknown site' }\n const role = (host.get('memberRoles') ?? {})[uid]\n if (role !== 'admin' && role !== 'editor') return { ok: false, status: 403, error: 'Not permitted' }\n const membership = await resolveOrgPermissions(uid, { hostId })\n if (!membership.permissions.managePos) return { ok: false, status: 403, error: 'Not permitted' }\n const owner = await getOrgForHost(hostId)\n if (!Aglyn.checkEntitlement(owner?.org as any, 'pos')) {\n return { ok: false, status: 403, error: 'POS requires the Pro plan or above' }\n }\n return { ok: true, manager: { uid, hostId } }\n}\n\nfunction requestBody(req: PluginApiRequest): Record<string, any> {\n if (typeof req.body === 'string') {\n try {\n const parsed = JSON.parse(req.body)\n return parsed && typeof parsed === 'object' ? parsed : {}\n } catch {\n return {}\n }\n }\n return req.body && typeof req.body === 'object' ? req.body : {}\n}\n\nconst text = (value: unknown, max: number): string => String(value ?? '').trim().slice(0, max)\n\n/** The editable settings in a create or update body, validated. */\nexport function printerSettingsFromBody(\n body: Record<string, any>,\n brand: PrinterBrand,\n): { ok: true; patch: Partial<PosPrinter> } | { ok: false; error: string } {\n const patch: Partial<PosPrinter> = {}\n if ('name' in body) {\n const name = text(body['name'], 60)\n if (!name) return { ok: false, error: 'Name the printer' }\n patch.name = name\n }\n if ('model' in body) patch.model = text(body['model'], 40)\n if ('deviceId' in body) {\n const deviceId = normalizePrinterDeviceId(brand, body['deviceId'])\n if (!deviceId) {\n return {\n ok: false,\n error:\n brand === 'star'\n ? 'Enter the printer’s MAC address, e.g. 00:11:62:12:34:56'\n : 'Enter the Server Direct Print ID: 1-30 letters, digits, dots, dashes or underscores',\n }\n }\n patch.deviceId = deviceId\n }\n if ('paperWidthMm' in body) patch.paperWidthMm = Number(body['paperWidthMm']) === 58 ? 58 : 80\n if ('autoPrintReceipts' in body) patch.autoPrintReceipts = body['autoPrintReceipts'] === true\n if ('kickDrawer' in body) patch.kickDrawer = body['kickDrawer'] === true\n if ('kitchenTickets' in body) patch.kitchenTickets = body['kitchenTickets'] === true\n if ('logoKey' in body) {\n const logoKey = text(body['logoKey'], 10)\n const valid =\n !logoKey ||\n (brand === 'star'\n ? /^\\d{1,3}$/.test(logoKey) && Number(logoKey) >= 1 && Number(logoKey) <= 255\n : /^\\d{2,3}\\s*,\\s*\\d{2,3}$/.test(logoKey))\n if (!valid) {\n return {\n ok: false,\n error:\n brand === 'star'\n ? 'The logo number is 1-255, as stored with Star Quick Setup Utility'\n : 'The logo key is two numbers, e.g. 48,48, as stored with Epson TM Utility',\n }\n }\n patch.logoKey = logoKey.replace(/\\s+/g, '')\n }\n return { ok: true, patch }\n}\n\n/** What the card shows a manager to paste into the printer's web configuration. */\nexport function printerCredentials(hostId: string, printerId: string, printer: PosPrinter) {\n return {\n printerId,\n brand: printer.brand,\n pollUrl: printerPollUrl(printer.brand, hostId, printerId, printer.secretVersion),\n deviceId: printer.deviceId,\n }\n}\n\n/** What a receipt needs from the site, the location and the register. */\nexport async function receiptContextFor(\n hostId: string,\n order: Pick<HostOrder, 'locationId'> & { registerId?: string },\n firestore: any = firebaseAdmin.app().firestore(),\n) {\n const hostRef = firestore.collection('hosts').doc(hostId)\n const [host, owner, location, register] = await Promise.all([\n hostRef.get(),\n getOrgForHost(hostId).catch(() => null),\n order.locationId ? hostRef.collection('locations').doc(order.locationId).get() : null,\n order.registerId ? hostRef.collection('registers').doc(order.registerId).get() : null,\n ])\n const storeLines = [location?.get?.('address')].filter(Boolean).map(String)\n return {\n storeName: String(host.get('displayName') ?? host.get('subdomain') ?? 'Receipt'),\n ...(storeLines.length ? { storeLines } : {}),\n ...(register?.exists ? { registerName: String(register.get('name') ?? '') } : {}),\n timeZone: resolveSiteTimeZone(owner?.org as any, host.data?.() ?? {}),\n }\n}\n\n/** The receipt an order prints, with the site's name, address and time zone. */\nexport async function orderReceipt(\n hostId: string,\n orderId: string,\n order: HostOrder & Record<string, any>,\n options: { banner?: string; firestore?: any } = {},\n): Promise<ReceiptData> {\n const context = await receiptContextFor(hostId, order, options.firestore)\n return receiptDataFromOrder(orderId, order, {\n ...context,\n ...(options.banner ? { banner: options.banner } : {}),\n })\n}\n\n/**\n * Queues work for a register's printers (AGL-3619): a receipt for every\n * printer set to auto-print, and a drawer kick on the FIRST printer set to\n * kick the drawer (a till has one drawer; two kicks would be one too many).\n * When the receipt printer is also the drawer printer, the kick rides the\n * receipt job so the drawer opens as the receipt starts.\n *\n * `kitchenTicket` prints on every printer set to print kitchen tickets, and\n * only when asked for: a Z-report or a paid-out slip is not an order to make.\n *\n * `receiptChoice` is what the customer said at the register: `none` (or a\n * receipt sent by email or text) prints no customer receipt; `print` prints\n * one even when no printer auto-prints, on the register's first printer.\n * Absent, the printers' own \"every sale\" setting decides.\n *\n * `idempotencyKey` names the cause (a sale's order id, a shift event's id): a\n * cause delivered twice queues its jobs once.\n */\nexport async function queueRegisterPrint(input: {\n hostId: string\n registerId: string\n receipt?: ReceiptData\n /** A shift report (AGL-3609): printed once, on the register's receipt printer. */\n report?: PrintReport\n kitchenTicket?: ReceiptData\n receiptChoice?: 'print' | 'none'\n openDrawer?: boolean\n orderId?: string\n reason: string\n idempotencyKey?: string\n createdBy?: string\n firestore?: any\n nowMs?: number\n}): Promise<{ jobIds: string[] }> {\n const firestore = input.firestore ?? firebaseAdmin.app().firestore()\n if (!input.registerId) return { jobIds: [] }\n const snapshot = await printersRef(firestore, input.hostId)\n .where('registerId', '==', input.registerId)\n .limit(MAX_PRINTERS_PER_REGISTER)\n .get()\n const printers = snapshot.docs\n .map((doc: any) => ({ id: doc.id, printer: doc.data() as PosPrinter }))\n .sort((a: any, b: any) => a.printer.createdAtMs - b.printer.createdAtMs || a.id.localeCompare(b.id))\n const drawerPrinter = input.openDrawer\n ? printers.find((entry: any) => entry.printer.kickDrawer)\n : undefined\n const jobIds: string[] = []\n const key = (suffix: string) =>\n input.idempotencyKey\n ? `${input.reason}-${input.idempotencyKey}-${suffix}`.replace(/[^A-Za-z0-9_-]/g, '').slice(0, 120)\n : undefined\n let drawerHandled = false\n const receiptPrinters =\n input.receiptChoice === 'none'\n ? []\n : printers.filter((entry: any) => entry.printer.autoPrintReceipts)\n if (input.receiptChoice === 'print' && !receiptPrinters.length && printers.length) {\n receiptPrinters.push(printers[0])\n }\n if (input.receipt) {\n for (const entry of receiptPrinters) {\n const openDrawer = drawerPrinter?.id === entry.id\n drawerHandled ||= openDrawer\n const { jobId } = await enqueuePrintJob(\n firestore,\n input.hostId,\n entry.id,\n {\n kind: 'receipt',\n receipt: input.receipt,\n openDrawer,\n orderId: input.orderId,\n registerId: input.registerId,\n reason: input.reason,\n createdBy: input.createdBy,\n jobId: key(entry.id),\n },\n input.nowMs,\n )\n jobIds.push(jobId)\n }\n }\n if (input.report) {\n // One copy, on the printer that prints receipts — or the till's only one.\n const target = printers.find((entry: any) => entry.printer.autoPrintReceipts) ?? printers[0]\n if (target) {\n const { jobId } = await enqueuePrintJob(\n firestore,\n input.hostId,\n target.id,\n {\n kind: 'report',\n report: input.report,\n registerId: input.registerId,\n reason: input.reason,\n createdBy: input.createdBy,\n jobId: key(`${target.id}-report`),\n },\n input.nowMs,\n )\n jobIds.push(jobId)\n }\n }\n if (input.kitchenTicket) {\n for (const entry of printers) {\n if (!entry.printer.kitchenTickets) continue\n const { jobId } = await enqueuePrintJob(\n firestore,\n input.hostId,\n entry.id,\n {\n kind: 'kitchen',\n receipt: input.kitchenTicket,\n orderId: input.orderId,\n registerId: input.registerId,\n reason: input.reason,\n createdBy: input.createdBy,\n jobId: key(`${entry.id}-kitchen`),\n },\n input.nowMs,\n )\n jobIds.push(jobId)\n }\n }\n if (drawerPrinter && !drawerHandled) {\n const { jobId } = await enqueuePrintJob(\n firestore,\n input.hostId,\n drawerPrinter.id,\n {\n kind: 'drawer',\n orderId: input.orderId,\n registerId: input.registerId,\n reason: input.reason,\n createdBy: input.createdBy,\n jobId: key(`${drawerPrinter.id}-drawer`),\n },\n input.nowMs,\n )\n jobIds.push(jobId)\n }\n return { jobIds }\n}\n\nexport const printersHandler: PluginApiHandler = async (req, res) => {\n if (req.method !== 'POST') return res.status(405).json({ error: 'Method not allowed' })\n const body = requestBody(req)\n const hostId = text(body['hostId'], 128)\n const gate = await authorizePrinterManager(req, hostId)\n if ('error' in gate) return res.status(gate.status).json({ error: gate.error })\n const { uid } = gate.manager\n const firestore = firebaseAdmin.app().firestore()\n const printers = printersRef(firestore, hostId)\n const action = text(body['action'], 20)\n const printerId = text(body['printerId'], 128)\n const loadPrinter = async () => {\n if (!/^[A-Za-z0-9_-]{1,128}$/.test(printerId)) return null\n const snapshot = await printers.doc(printerId).get()\n return snapshot.exists ? { ref: snapshot.ref, printer: snapshot.data() as PosPrinter } : null\n }\n try {\n switch (action) {\n case 'create': {\n const brand = text(body['brand'], 10) as PrinterBrand\n if (!PRINTER_BRANDS.includes(brand)) return res.status(400).json({ error: 'Choose Star or Epson' })\n const registerId = text(body['registerId'], 128)\n const register = /^[A-Za-z0-9_-]{1,128}$/.test(registerId)\n ? await firestore.collection('hosts').doc(hostId).collection('registers').doc(registerId).get()\n : null\n if (!register?.exists) return res.status(404).json({ error: 'Unknown register' })\n const settings = printerSettingsFromBody(\n { name: '', deviceId: '', ...body },\n brand,\n )\n if ('error' in settings) return res.status(400).json({ error: settings.error })\n const siblings = await printers.where('registerId', '==', registerId).limit(MAX_PRINTERS_PER_REGISTER).get()\n if (siblings.size >= MAX_PRINTERS_PER_REGISTER) {\n return res.status(409).json({\n error: `A register can have up to ${MAX_PRINTERS_PER_REGISTER} printers.`,\n })\n }\n const duplicate = await printers.where('deviceId', '==', settings.patch.deviceId).limit(1).get()\n if (!duplicate.empty) {\n return res.status(409).json({ error: 'That printer is already added to this site.' })\n }\n const ref = printers.doc(createResourceUid())\n const printer: PosPrinter = {\n name: settings.patch.name!,\n brand,\n model: settings.patch.model ?? '',\n deviceId: settings.patch.deviceId!,\n registerId,\n paperWidthMm: settings.patch.paperWidthMm ?? 80,\n autoPrintReceipts: settings.patch.autoPrintReceipts ?? true,\n kickDrawer: settings.patch.kickDrawer ?? false,\n kitchenTickets: settings.patch.kitchenTickets ?? false,\n ...(settings.patch.logoKey ? { logoKey: settings.patch.logoKey } : {}),\n secretVersion: 1,\n createdAtMs: Date.now(),\n createdBy: uid,\n }\n await ref.set(printer)\n return res.status(200).json(printerCredentials(hostId, ref.id, printer))\n }\n case 'update': {\n const loaded = await loadPrinter()\n if (!loaded) return res.status(404).json({ error: 'Unknown printer' })\n const settings = printerSettingsFromBody(body, loaded.printer.brand)\n if ('error' in settings) return res.status(400).json({ error: settings.error })\n if (settings.patch.deviceId && settings.patch.deviceId !== loaded.printer.deviceId) {\n const duplicate = await printers.where('deviceId', '==', settings.patch.deviceId).limit(1).get()\n if (!duplicate.empty) {\n return res.status(409).json({ error: 'That printer is already added to this site.' })\n }\n }\n await loaded.ref.set({ ...settings.patch, updatedAtMs: Date.now() }, { merge: true })\n return res.status(200).json({ ok: true })\n }\n case 'remove': {\n const loaded = await loadPrinter()\n if (!loaded) return res.status(200).json({ ok: true })\n const active = await printJobsRef(firestore, hostId)\n .where('printerId', '==', printerId)\n .where('status', 'in', ['queued', 'printing'])\n .orderBy('createdAtMs', 'asc')\n .limit(50)\n .get()\n const batch = firestore.batch()\n for (const doc of active.docs) {\n batch.update(doc.ref, { status: 'canceled', finishedAtMs: Date.now() })\n }\n batch.delete(loaded.ref)\n await batch.commit()\n return res.status(200).json({ ok: true })\n }\n case 'credentials': {\n const loaded = await loadPrinter()\n if (!loaded) return res.status(404).json({ error: 'Unknown printer' })\n return res.status(200).json(printerCredentials(hostId, printerId, loaded.printer))\n }\n case 'regenerate': {\n const loaded = await loadPrinter()\n if (!loaded) return res.status(404).json({ error: 'Unknown printer' })\n const secretVersion = Math.max(1, Number(loaded.printer.secretVersion) || 1) + 1\n await loaded.ref.set({ secretVersion, updatedAtMs: Date.now() }, { merge: true })\n return res\n .status(200)\n .json(printerCredentials(hostId, printerId, { ...loaded.printer, secretVersion }))\n }\n case 'test':\n case 'drawer': {\n const loaded = await loadPrinter()\n if (!loaded) return res.status(404).json({ error: 'Unknown printer' })\n const context = action === 'test' ? await receiptContextFor(hostId, {}, firestore) : null\n const { jobId } = await enqueuePrintJob(firestore, hostId, printerId, {\n kind: action,\n registerId: loaded.printer.registerId,\n reason: action === 'test' ? 'test' : 'open_drawer',\n createdBy: uid,\n ...(context ? { storeName: context.storeName, timeZone: context.timeZone } : {}),\n ...(action === 'test' && body['openDrawer'] === true ? { openDrawer: true } : {}),\n })\n return res.status(200).json({ jobId })\n }\n case 'reprint': {\n const orderId = text(body['orderId'], 128)\n if (!/^[A-Za-z0-9_-]{1,128}$/.test(orderId)) return res.status(400).json({ error: 'Missing orderId' })\n const orderSnapshot = await firestore.collection('hosts').doc(hostId).collection('orders').doc(orderId).get()\n if (!orderSnapshot.exists) return res.status(404).json({ error: 'Unknown order' })\n const order = orderSnapshot.data() as HostOrder & Record<string, any>\n let target = printerId ? await loadPrinter() : null\n if (!target && order['registerId']) {\n const candidates = await printers\n .where('registerId', '==', String(order['registerId']))\n .limit(MAX_PRINTERS_PER_REGISTER)\n .get()\n const doc = candidates.docs.find((d: any) => d.get('autoPrintReceipts')) ?? candidates.docs[0]\n if (doc) target = { ref: doc.ref, printer: doc.data() as PosPrinter }\n }\n if (!target) return res.status(404).json({ error: 'No printer for this register' })\n const receipt = await orderReceipt(hostId, orderId, order, { banner: 'REPRINT', firestore })\n const { jobId } = await enqueuePrintJob(firestore, hostId, target.ref.id, {\n kind: 'receipt',\n receipt,\n orderId,\n registerId: target.printer.registerId,\n reason: 'reprint',\n createdBy: uid,\n })\n return res.status(200).json({ jobId })\n }\n case 'cancel': {\n const jobId = text(body['jobId'], 128)\n if (!/^[A-Za-z0-9_-]{1,128}$/.test(jobId)) return res.status(400).json({ error: 'Missing jobId' })\n const ref = printJobsRef(firestore, hostId).doc(jobId)\n const outcome = await firestore.runTransaction(async (transaction: any) => {\n const snapshot = await transaction.get(ref)\n if (!snapshot.exists) return 'missing'\n if (snapshot.get('status') !== 'queued') return 'started'\n transaction.update(ref, { status: 'canceled', finishedAtMs: Date.now() })\n return 'canceled'\n })\n if (outcome === 'missing') return res.status(404).json({ error: 'Unknown job' })\n if (outcome === 'started') {\n return res.status(409).json({ error: 'The printer already has it.' })\n }\n return res.status(200).json({ ok: true })\n }\n default:\n return res.status(400).json({ error: 'Unknown action' })\n }\n } catch (error) {\n console.error('[printers]', action, error)\n return res.status(500).json({ error: 'The printer could not be updated' })\n }\n}\n"],"names":["Aglyn","createResourceUid","resolveSiteTimeZone","firebaseAdmin","getOrgForHost","resolveOrgPermissions","normalizePrinterDeviceId","PRINTER_BRANDS","receiptDataFromOrder","enqueuePrintJob","printJobsRef","printersRef","printerPollUrl","isRefusedIdToken","MAX_PRINTERS_PER_REGISTER","authorizePrinterManager","req","hostId","host","authorization","String","headers","idToken","startsWith","slice","ok","status","error","test","uid","app","auth","verifyIdToken","firestore","collection","doc","get","exists","role","membership","permissions","managePos","owner","checkEntitlement","org","manager","requestBody","body","parsed","JSON","parse","text","value","max","trim","printerSettingsFromBody","brand","patch","name","model","deviceId","paperWidthMm","Number","autoPrintReceipts","kickDrawer","kitchenTickets","logoKey","valid","replace","printerCredentials","printerId","printer","pollUrl","secretVersion","receiptContextFor","order","register","location","hostRef","Promise","all","catch","locationId","registerId","storeLines","filter","Boolean","map","storeName","length","registerName","timeZone","data","orderReceipt","orderId","options","context","banner","queueRegisterPrint","input","jobIds","snapshot","where","limit","printers","docs","id","sort","a","b","createdAtMs","localeCompare","drawerPrinter","openDrawer","find","entry","undefined","key","suffix","idempotencyKey","reason","drawerHandled","receiptPrinters","receiptChoice","push","receipt","jobId","kind","createdBy","nowMs","report","target","kitchenTicket","printersHandler","res","method","json","gate","action","loadPrinter","ref","settings","includes","siblings","size","duplicate","empty","Date","now","set","loaded","updatedAtMs","merge","active","orderBy","batch","update","finishedAtMs","delete","commit","Math","orderSnapshot","candidates","d","outcome","runTransaction","transaction","console"],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
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 { CatalogOffer, CatalogShippingPrice, PluginProductCatalog } from '@aglyn/aglyn/plugin-manager/plugin-product-catalog';
|
|
18
|
+
import * as CommerceModel from '../model';
|
|
19
|
+
type DocumentData = FirebaseFirestore.DocumentData;
|
|
20
|
+
/** Plain text from a description that may hold markup. */
|
|
21
|
+
export declare function plainDescription(value: unknown): string;
|
|
22
|
+
/** The origin the store's pages answer on: its live custom domain, else its subdomain. */
|
|
23
|
+
export declare function storeOrigin(host: DocumentData | undefined): string | null;
|
|
24
|
+
/** A stable offer id within the longest any channel accepts. */
|
|
25
|
+
export declare function offerId(productId: string, variantId: string, hasVariants: boolean): string;
|
|
26
|
+
/** The countries the store's zones price by a live carrier quote, upper case. */
|
|
27
|
+
export declare function carrierPricedCountries(settings: CommerceModel.ShippingSettings | undefined, countries: readonly string[]): string[];
|
|
28
|
+
/** What one unit of an offer costs to ship to each country, the cheapest rate each. */
|
|
29
|
+
export declare function offerShipping(settings: CommerceModel.ShippingSettings | undefined, countries: readonly string[], unit: {
|
|
30
|
+
priceMinor: number;
|
|
31
|
+
weightGrams?: number;
|
|
32
|
+
}): CatalogShippingPrice[];
|
|
33
|
+
interface PageContext {
|
|
34
|
+
origin: string | null;
|
|
35
|
+
categories: ReadonlyMap<string, CommerceModel.ProductCategory>;
|
|
36
|
+
shipping: CommerceModel.ShippingSettings | undefined;
|
|
37
|
+
countries: readonly string[];
|
|
38
|
+
}
|
|
39
|
+
/** The offers of one stored product; empty for a product that is not listed. */
|
|
40
|
+
export declare function productOffers(productId: string, raw: DocumentData, context: PageContext): CatalogOffer[];
|
|
41
|
+
export declare const productCatalog: PluginProductCatalog;
|
|
42
|
+
export {};
|
|
@@ -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(/ /gi, ' ').replace(/&/gi, '&').replace(/</gi, '<').replace(/>/gi, '>').replace(/"/gi, '"').replace(/'/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(/ /gi, ' ')\n .replace(/&/gi, '&')\n .replace(/</gi, '<')\n .replace(/>/gi, '>')\n .replace(/"/gi, '\"')\n .replace(/'/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":"AAAA;;;;;;;;;;;;;;;CAeC;AASD,SAASA,gBAAgB,QAAQ,qCAAoC;AACrE,SAASC,WAAW,QAAQ,qCAAoC;AAChE,SAASC,aAAa,QAAQ,iDAAgD;AAC9E,YAAYC,mBAAmB,oBAAU;AA6BzC,MAAMC,wBAAwB;AAC9B,8EAA8E,GAC9E,MAAMC,eAAe;AAErB,MAAMC,YAAY,IAAiBJ,cAAcK,GAAG,GAAGD,SAAS;AAEhE,MAAME,MAAM,CAACC,QAA4B,OAAOA,UAAU,WAAWA,QAAQ;AAE7E,wDAAwD,GACxD,OAAO,SAASC,iBAAiBD,KAAc;IAC7C,OAAOD,IAAIC,OACRE,OAAO,CAAC,6CAA6C,MACrDA,OAAO,CAAC,YAAY,KACpBA,OAAO,CAAC,YAAY,KACpBA,OAAO,CAAC,WAAW,KACnBA,OAAO,CAAC,UAAU,KAClBA,OAAO,CAAC,UAAU,KAClBA,OAAO,CAAC,YAAY,KACpBA,OAAO,CAAC,WAAW,KACnBA,OAAO,CAAC,eAAe,KACvBA,OAAO,CAAC,aAAa,MACrBC,IAAI;AACT;AAEA,MAAMC,UAAU,CAACC;IACf,MAAMC,SAASC,OAAOF;IACtB,OAAOE,OAAOC,QAAQ,CAACF,WAAWA,SAAS,IAAIG,KAAKC,KAAK,CAACJ,SAAS,OAAO;AAC5E;AAEA,wFAAwF,GACxF,OAAO,SAASK,YAAYC,IAA8B;IACxD,MAAMC,SAAStB,iBAAiBqB;IAChC,IAAIC,QAAQ,OAAO,CAAC,QAAQ,EAAEA,QAAQ;IACtC,MAAMC,YAAYf,IAAIa,wBAAAA,IAAM,CAAC,YAAY,EAAET,IAAI;IAC/C,OAAOW,YAAY,CAAC,QAAQ,EAAEA,UAAU,CAAC,EAAEtB,aAAa,GAAG;AAC7D;AAEA,gEAAgE,GAChE,SAASuB,cAAcC,GAAY,EAAEC,MAAqB;IACxD,MAAMjB,QAAQD,IAAIiB,KAAKb,IAAI;IAC3B,IAAI,CAACH,OAAO,OAAOkB;IACnB,IAAI,gBAAgBC,IAAI,CAACnB,QAAQ,OAAOA;IACxC,IAAIA,MAAMoB,UAAU,CAAC,OAAO,OAAO,CAAC,MAAM,EAAEpB,OAAO;IACnD,IAAIA,MAAMoB,UAAU,CAAC,QAAQH,QAAQ,OAAO,GAAGA,SAASjB,OAAO;IAC/D,OAAOkB;AACT;AAEA,8DAA8D,GAC9D,OAAO,SAASG,QAAQC,SAAiB,EAAEC,SAAiB,EAAEC,WAAoB;IAChF,IAAI,CAACA,aAAa,OAAOF,UAAUG,KAAK,CAAC,GAAG7B;IAC5C,MAAM8B,OAAO,GAAGJ,UAAU,CAAC,EAAEC,WAAW;IACxC,IAAIG,KAAKC,MAAM,IAAI/B,cAAc,OAAO8B;IACxC,sDAAsD;IACtD,IAAIE,OAAO;IACX,KAAK,MAAMC,QAAQH,KAAME,OAAO,AAACnB,KAAKqB,IAAI,CAACF,MAAM,MAAMC,KAAKE,UAAU,CAAC,KAAM;IAC7E,MAAMC,SAAS,AAACJ,CAAAA,SAAS,CAAA,EAAGK,QAAQ,CAAC;IACrC,OAAO,GAAGX,UAAUG,KAAK,CAAC,GAAG7B,eAAeoC,OAAOL,MAAM,GAAG,GAAG,CAAC,EAAEK,QAAQ;AAC5E;AAEA,MAAME,eAAe;AACrB,MAAMC,cAAc;AAEpB,SAASC,YAAYC,OAA+B,EAAEC,OAAe;IACnE,KAAK,MAAM,CAACC,MAAMvC,MAAM,IAAIwC,OAAOC,OAAO,CAACJ,SAAU;QACnD,IAAIC,QAAQnB,IAAI,CAACoB,KAAKpC,IAAI,OAAOH,OAAO,OAAOA;IACjD;IACA,OAAOkB;AACT;AAEA,uEAAuE,GACvE,SAASwB,aACPC,WAA0C,EAC1CC,UAA8D;IAE9D,MAAMC,QAAQ,CAACF,sBAAAA,cAAe,EAAE,EAAEG,IAAI,CAAC,CAACC,KAAOH,WAAWI,GAAG,CAACD;IAC9D,IAAI,CAACF,OAAO,OAAO3B;IACnB,MAAM+B,QAAkB,EAAE;IAC1B,MAAMC,OAAO,IAAIC;IACjB,IAAIC,KAAgCP;IACpC,MAAOO,MAAM,CAACF,KAAKF,GAAG,CAACI,OAAOR,WAAWI,GAAG,CAACI,OAAOH,MAAMtB,MAAM,GAAG,EAAG;QACpEuB,KAAKG,GAAG,CAACD;QACT,MAAME,WAA0CV,WAAWW,GAAG,CAACH;QAC/D,IAAIE,SAASf,IAAI,EAAEU,MAAMO,OAAO,CAACF,SAASf,IAAI;QAC9Ca,KAAKE,SAASG,QAAQ;IACxB;IACA,OAAOR,MAAMtB,MAAM,GAAGsB,MAAMS,IAAI,CAAC,SAASxC;AAC5C;AAEA,kFAAkF,GAClF,SAASyC,kBAAkBC,QAAoD;;IAC7E,MAAMC,YAAY,IAAIV;IACtB,KAAK,MAAMW,gBAAQF,4BAAAA,SAAUG,KAAK,mBAAI,EAAE,CAAE;YACrBD;QAAnB,KAAK,MAAME,SAAQF,kBAAAA,KAAKD,SAAS,YAAdC,kBAAkB,EAAE,CAAE;YACvC,MAAMG,UAAUC,OAAOF,eAAAA,OAAQ,IAAI7D,IAAI,GAAGgE,WAAW;YACrD,IAAI,aAAahD,IAAI,CAAC8C,UAAUJ,UAAUR,GAAG,CAACY;QAChD;IACF;IACA,OAAO;WAAIJ;KAAU,CAACpC,KAAK,CAAC,GAAG;AACjC;AAEA,+EAA+E,GAC/E,OAAO,SAAS2C,uBACdR,QAAoD,EACpDC,SAA4B;IAE5B,IAAI,CAACnE,cAAc2E,eAAe,CAACT,WAAW,OAAO,EAAE;IACvD,OAAOC,UAAUS,MAAM,CAAC,CAACL,UAAYvE,cAAc6E,eAAe,CAACX,UAAUK,SAAStC,MAAM,GAAG;AACjG;AAEA,2DAA2D,GAC3D,SAAS6C,aAAaC,OAAkC;IACtD,MAAMC,QAAQhF,cAAciF,6BAA6B,CAACF,QAAQG,QAAQ;IAC1E,IAAI,EAACF,yBAAAA,MAAOG,QAAQ,KAAI,CAACH,MAAMI,OAAO,IAAI,CAACJ,MAAMK,QAAQ,EAAE,OAAO7D;IAClE,OAAO;QAAES,QAAQ+C,MAAMG,QAAQ;QAAEG,OAAON,MAAMI,OAAO;QAAEG,QAAQP,MAAMK,QAAQ;IAAC;AAChF;AAEA,qFAAqF,GACrF,OAAO,SAASG,cACdtB,QAAoD,EACpDC,SAA4B,EAC5BsB,IAAkD;IAElD,MAAMC,SAAiC,EAAE;IACzC,KAAK,MAAMnB,WAAWJ,UAAW;YAGjBsB;QAFd,MAAM,CAACE,SAAS,GAAG3F,cAAc4F,oBAAoB,CAAC1B,UAAUK,SAAS;YACvEsB,eAAeJ,KAAKK,UAAU;YAC9BC,UAAU,GAAEN,oBAAAA,KAAKO,WAAW,YAAhBP,oBAAoB;QAClC,GAAGb,MAAM,CAAC,CAACqB,OAASA,KAAKC,MAAM,KAAKlG,cAAcmG,oBAAoB;QACtE,IAAIR,UAAUD,OAAOU,IAAI,CAAC;YAAE7B;YAAS8B,SAASV,SAAS9C,IAAI;YAAEiD,YAAYH,SAASW,WAAW;QAAC;IAChG;IACA,OAAOZ;AACT;AASA,8EAA8E,GAC9E,OAAO,SAASa,cAAc3E,SAAiB,EAAE4E,GAAiB,EAAEC,OAAoB;QAIpE1B,mBAICA,oBAMQA,sBACLA;IAdtB,IAAI,CAACyB,OAAOA,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE;IACvC,MAAMzB,UAAU/E,cAAc0G,iBAAiB,CAACF;IAChD,IAAIzB,QAAQ4B,MAAM,KAAK,YAAY,CAACtG,IAAI0E,QAAQlC,IAAI,EAAEpC,IAAI,MAAM,CAACJ,IAAI0E,QAAQ6B,IAAI,GAAG,OAAO,EAAE;IAC7F,MAAMC,WAAW,EAAC9B,oBAAAA,QAAQ8B,QAAQ,YAAhB9B,oBAAoB,EAAE,EAAEH,MAAM,CAAC,CAACkC,UAAYA,WAAWzG,IAAIyG,QAAQzD,EAAE;IACvF,IAAI,CAACwD,SAAS5E,MAAM,EAAE,OAAO,EAAE;IAC/B,MAAMH,cAAc+E,SAAS5E,MAAM,GAAG;IACtC,MAAM+C,QAAQhF,cAAc+G,4BAA4B,CAAChC,QAAQiC,OAAO;IACxE,MAAMC,QAAQ;YAAKlC,qBAAAA,QAAQmC,SAAS,YAAjBnC,qBAAqB,EAAE;WAAOA,QAAQoC,QAAQ,GAAG;YAACpC,QAAQoC,QAAQ;SAAC,GAAG,EAAE;KAAE,CAC1FC,GAAG,CAAC,CAAC9F,MAAQD,cAAcC,KAAKmF,QAAQlF,MAAM,GAC9CqD,MAAM,CAAC,CAACtD,MAAuB+F,QAAQ/F;IAC1C,MAAMgG,cAAc/G,iBAAiBwE,QAAQuC,WAAW;IACxD,MAAMC,cAAcvE,aAAa+B,QAAQ9B,WAAW,EAAEwD,QAAQvD,UAAU;IACxE,MAAMsE,mBAAmBH,QAAQtC,QAAQ0C,YAAY,KAAK1C,QAAQ2C,oBAAoB,KAAK;IAC3F,MAAMC,cAAc9G,QAAOkE,uBAAAA,QAAQ4C,WAAW,YAAnB5C,uBAAuBA,QAAQ6C,WAAW,KAAKpG;IAC1E,MAAMqG,eAAe,EAAC9C,gBAAAA,QAAQ+C,IAAI,YAAZ/C,gBAAgB,gBAAgB,aAAaD,aAAaC,WAAWvD;IAC3F,OAAOqF,SAASO,GAAG,CAAC,CAACN;YAEFA,kBAEA/B,wBAmCTA,eAcHA;QApDL,MAAMpC,UAAUG,OAAOiF,WAAW,CAChCjF,OAAOC,OAAO,EAAC+D,mBAAAA,QAAQnE,OAAO,YAAfmE,mBAAmB,CAAC,GAAGlC,MAAM,CAAC,CAAC,GAAGtE,MAAM,GAAK,OAAOA,UAAU,YAAYA;QAE3F,MAAM0H,UAAU,EAACjD,mBAAAA,QAAQpC,OAAO,YAAfoC,mBAAmB,EAAE,EACnCqC,GAAG,CAAC,CAACa,SAAWtF,OAAO,CAACsF,OAAOpF,IAAI,CAAC,EACpC+B,MAAM,CAAC,CAACtE,QAA2B+G,QAAQ/G;QAC9C,MAAM4H,WAAWxH,QAAQoG,QAAQqB,QAAQ;QACzC,MAAMC,YAAY1H,QAAQoG,QAAQuB,iBAAiB;QACnD,MAAMC,SAASF,YAAYF,YAAYA,WAAW;QAClD,MAAMpC,aAAawC,SAASF,YAAYF;QACxC,MAAMK,UAAUvI,cAAcwI,oBAAoB,CAACzD,YAAY+B,QAAQ2B,SAAS,IAAI;QACpF,MAAMC,WAAWH,UAAUxH,KAAK4H,GAAG,CAAC,GAAG5H,KAAK6H,KAAK,CAAC/H,OAAOiG,QAAQ2B,SAAS,KAAK,MAAM;QACrF,MAAMI,eACJH,aAAa,QAAQA,WAAW,IAC5B,aACA3D,QAAQ+D,cAAc,KAAK,cACzB,cACA;QACR,MAAMC,eAAe1H,cAAcyF,QAAQK,QAAQ,EAAEV,QAAQlF,MAAM;QACnE,MAAM4F,WAAW4B,uBAAAA,eAAgB9B,KAAK,CAAC,EAAE;QACzC,MAAMjB,cAAcnF,OAAOiG,QAAQd,WAAW,IAAI,IAAIjF,KAAKC,KAAK,CAACH,OAAOiG,QAAQd,WAAW,KAAKxE;QAChG,MAAMwH,OAAOhJ,cAAciJ,aAAa,CAACnC,QAAQoC,OAAO,KAAMpH,CAAAA,cAAc,aAAKkD,yBAAAA,MAAOgE,IAAI,mBAAI,EAAC;QACjG,MAAMG,QAAsB;YAC1B9F,IAAI1B,QAAQC,WAAWkF,QAAQzD,EAAE,EAAEvB;YACnCsH,SAASxH;YACTE;YACAF;YACAC,WAAWiF,QAAQzD,EAAE;YACrBgG,aAAatE,QAAQlC,IAAI,CAACpC,IAAI;YAC9B6I,OAAOtB,QAAQ/F,MAAM,GAAG,GAAG8C,QAAQlC,IAAI,CAACpC,IAAI,GAAG,GAAG,EAAEuH,QAAQhE,IAAI,CAAC,QAAQ,GAAGe,QAAQlC,IAAI,CAACpC,IAAI;YAC7F6G;YACAiC,MAAM,CAAC,UAAU,EAAExE,QAAQ6B,IAAI,EAAE;WAC7BO,WAAW;YAAEA;QAAS,IAAI,CAAC;YAC/BqC,qBAAqBvC,MAAMrC,MAAM,CAAC,CAACtD,MAAQA,QAAQ6F,UAAUpF,KAAK,CAAC,GAAG;YACtE+D;WACIwC,SAAS;YAAEmB,gBAAgBvB;QAAS,IAAI,CAAC;YAC7CW;YACAH;YACAgB,IAAI,GAAE3E,gBAAAA,QAAQ+C,IAAI,YAAZ/C,gBAAgB;YACtByC;WACIxC,CAAAA,yBAAAA,MAAO2E,SAAS,IAAG;YAAEA,WAAW3E,MAAM2E,SAAS;QAAC,IAAI,CAAC,GACrD3E,CAAAA,yBAAAA,MAAO4E,KAAK,IAAG;YAAEA,OAAO5E,MAAM4E,KAAK;QAAC,IAAI,CAAC,GACzCZ,KAAK/G,MAAM,IAAI,IAAI;YAAE+G;QAAK,IAAI,CAAC,GAC/BhE,CAAAA,yBAAAA,MAAO6E,GAAG,IAAG;YAAEA,KAAK7E,MAAM6E,GAAG;QAAC,IAAI,CAAC,GACnC7E,CAAAA,yBAAAA,MAAO8E,qBAAqB,IAAG;YAAEA,uBAAuB9E,MAAM8E,qBAAqB;QAAC,IAAI,CAAC,GACzFvC,cAAc;YAAEA;QAAY,IAAI,CAAC;YACrC5E;WACID,YAAYC,SAASH,gBAAgB;YAAEuH,OAAOrH,YAAYC,SAASH;QAAc,IAAI,CAAC,GACtFE,YAAYC,SAASF,eAAe;YAAEuH,MAAMtH,YAAYC,SAASF;QAAa,IAAI,CAAC,GACnFuD,cAAc;YAAEA;QAAY,IAAI,CAAC,GACjC6B,eAAe;YAAEA;QAAa,IAAI,CAAC;YACvC3C,UACE,EAACH,iBAAAA,QAAQ+C,IAAI,YAAZ/C,iBAAgB,gBAAgB,aAC7BS,cAAciB,QAAQvB,QAAQ,EAAEuB,QAAQtC,SAAS,EAAE;gBACjD2B,YAAYwC,SAASJ,WAAWpC;eAC5BE,cAAc;gBAAEA;YAAY,IAAI,CAAC,MAEvC,EAAE;WACJ2B,cAAc;YAAEA;QAAY,IAAI,CAAC;QAEvC,OAAOwB;IACT;AACF;AAEA,eAAec,UAAUC,MAAc;IACrC,MAAMC,UAAUhK,YAAYiK,UAAU,CAAC,SAASC,GAAG,CAACH;IACpD,MAAM,CAAChJ,MAAMoJ,MAAM,GAAG,MAAMC,QAAQC,GAAG,CAAC;QAACL,QAAQtG,GAAG;QAAIsG,QAAQC,UAAU,CAAC,YAAYC,GAAG,CAAC,SAASxG,GAAG;KAAG;IAC1G,OAAO;QAAE3C;QAAMoJ;IAAM;AACvB;AAEA,eAAeG,eAAeP,MAAc;IAC1C,MAAMQ,WAAW,MAAMvK,YACpBiK,UAAU,CAAC,SACXC,GAAG,CAACH,QACJE,UAAU,CAAC,qBACXO,KAAK,CAAC,KACN9G,GAAG;IACN,OAAO,IAAI+G,IACTF,SAASG,IAAI,CAACzD,GAAG,CAAC,CAACiD,MAAQ;YAACA,IAAIhH,EAAE;YAAEgH,IAAIS,IAAI;SAAoC;AAEpF;AAEA,MAAMC,eAAe,CAACzK,QACpB+G,QAAQ/G,UAAUA,MAAM2B,MAAM,IAAI,OAAO,CAAC3B,MAAM0K,QAAQ,CAAC,QAAQ,CAAC,WAAWvJ,IAAI,CAACnB;AAEpF,OAAO,MAAM2K,iBAAuC;IAClD,MAAMX,OAAMJ,MAAc;YAIXhJ,YACIoJ;QAJjB,IAAI,CAACS,aAAab,SAAS,OAAO;QAClC,MAAM,EAAEhJ,IAAI,EAAEoJ,KAAK,EAAE,GAAG,MAAML,UAAUC;QACxC,IAAI,CAAChJ,KAAKgK,MAAM,EAAE,OAAO;QACzB,MAAMJ,QAAO5J,aAAAA,KAAK4J,IAAI,cAAT5J,aAAe,CAAC;QAC7B,MAAMgD,YAAWoG,cAAAA,MAAMQ,IAAI,cAAVR,cAAgB,CAAC;QAClC,MAAM/I,SAASN,YAAY6J;QAC3B,MAAM5F,WAAWhB,QAAQ,CAAC,WAAW;QACrC,MAAMrB,OACJxC,IAAIyK,IAAI,CAAC,cAAc,EAAErK,IAAI,MAC5Bc,CAAAA,SAASA,OAAOf,OAAO,CAAC,gBAAgB,MAAM,EAAC,KAChD;QACF,OAAO;YACL0J;YACArH;YACAtB;YACA4J,UAAU9K,IAAI6D,QAAQ,CAAC,WAAW,EAAEzD,IAAI,GAAGgE,WAAW,MAAM;YAC5D2G,oBAAoB/D,QAAQhH,IAAI6D,QAAQ,CAAC,cAAc;YACvDQ,wBAAwBA,uBAAuBQ,UAAUjB,kBAAkBiB;QAC7E;IACF;IAEA,MAAMmG,MAAK,EAAEnB,MAAM,EAAEoB,MAAM,EAAEX,KAAK,EAAE;QAClC,IAAI,CAACI,aAAab,SAAS,OAAO;YAAEqB,QAAQ,EAAE;YAAEC,YAAY;QAAK;QACjE,MAAMC,OAAO1K,KAAK4H,GAAG,CAAC,GAAG5H,KAAK2K,GAAG,CAAC3K,KAAK6H,KAAK,CAAC+B,UAAU,GAAG;QAC1D,MAAM,CAAC,EAAEzJ,IAAI,EAAEoJ,KAAK,EAAE,EAAEpH,WAAW,GAAG,MAAMqH,QAAQC,GAAG,CAAC;YAACP,UAAUC;YAASO,eAAeP;SAAQ;QACnG,IAAI,CAAChJ,KAAKgK,MAAM,EAAE,OAAO;YAAEK,QAAQ,EAAE;YAAEC,YAAY;QAAK;QACxD,MAAMtG,WAAWoF,MAAMzG,GAAG,CAAC;QAC3B,MAAM4C,UAAuB;YAC3BlF,QAAQN,YAAYC,KAAK4J,IAAI;YAC7B5H;YACAgC;YACAf,WAAWF,kBAAkBiB;QAC/B;QACA,MAAMyG,WAAWxL,YAAYiK,UAAU,CAAC,SAASC,GAAG,CAACH,QAAQE,UAAU,CAAC;QACxE,MAAMwB,SAAS7L,cAAcI,SAAS,CAAC0L,SAAS,CAACC,UAAU;QAC3D,MAAMP,SAAyB,EAAE;QACjC,IAAIQ,QAAQT,UAAUP,aAAaO,UAAUA,SAAS;QACtD,yEAAyE;QACzE,wEAAwE;QACxE,iDAAiD;QACjD,OAAS;YACP,IAAIU,QAAQL,SAASM,OAAO,CAACL,QAAQjB,KAAK,CAAC1K;YAC3C,IAAI8L,OAAOC,QAAQA,MAAME,UAAU,CAACH;YACpC,MAAMrB,WAAW,MAAMsB,MAAMnI,GAAG;YAChC,KAAK,MAAMwG,OAAOK,SAASG,IAAI,CAAE;gBAC/BU,OAAOnF,IAAI,IAAIG,cAAc8D,IAAIhH,EAAE,EAAEgH,IAAIS,IAAI,IAAIrE;gBACjDsF,QAAQ1B,IAAIhH,EAAE;gBACd,IAAIkI,OAAOtJ,MAAM,IAAIwJ,MAAM;oBACzB,MAAMU,OAAOzB,SAASG,IAAI,CAACH,SAASG,IAAI,CAAC5I,MAAM,GAAG,EAAE;oBACpD,mEAAmE;oBACnE,yDAAyD;oBACzD,MAAMmK,QAAQ/B,IAAIhH,EAAE,KAAK8I,KAAK9I,EAAE,IAAIqH,SAASV,IAAI,GAAG/J;oBACpD,OAAO;wBAAEsL;wBAAQC,YAAYY,QAAQ,OAAO/B,IAAIhH,EAAE;oBAAC;gBACrD;YACF;YACA,IAAIqH,SAASV,IAAI,GAAG/J,uBAAuB,OAAO;gBAAEsL;gBAAQC,YAAY;YAAK;QAC/E;IACF;AACF,EAAC"}
|