@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/transfer/records.server.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 {\n buildMatchLookup,\n type BuildTransferPlanInput,\n type MatchKeySpec,\n type MatchLookupRequest,\n type PlannedTransferRow,\n type TransferChunk,\n type TransferPlan,\n type TransferRowResult,\n type TransferUndoEntry,\n type TransferUndoSnapshot,\n} from '@aglyn/aglyn/data-transfer'\nimport type {\n PluginTransferResource,\n TransferApplyResult,\n TransferApplyWriter,\n TransferLookupResult,\n TransferReadOptions,\n TransferReadPage,\n TransferResourceContext,\n TransferRevertDecisions,\n TransferRevertResult,\n} from '@aglyn/aglyn/plugin-manager/plugin-transfer-resources'\nimport { firebaseAdmin } from '@aglyn/tenant-data-admin'\nimport { ORDER_LIST_QUERY } from '../constants/orders-list-query'\nimport {\n CATEGORY_MATCH_KEYS,\n COUPON_MATCH_KEYS,\n DISCOUNT_KIND_PICKLIST,\n DISCOUNT_KIND_SPEC,\n DISCOUNT_MATCH_KEYS,\n categoryRecord,\n categoryWrite,\n couponRecord,\n couponWrite,\n discountRecord,\n discountWrite,\n orderRecord,\n planWithCreateRequired,\n promotionCode,\n rowChanges,\n type CategoryIndex,\n type StoredCategory,\n type StoredCoupon,\n type StoredOrder,\n} from './records-transfer'\nimport {\n NOTHING,\n ROW_BUDGET_MS,\n countSource,\n firestoreOf,\n hostRefOf,\n readSourcePage,\n readerSeesHost,\n revertEntries,\n withoutUndefined,\n type CommerceListSource,\n type Firestore,\n} from './server-common'\n\n/*\n * THE SERVER HALVES OF ORDERS, DISCOUNTS, COUPONS AND CATEGORIES\n * (AGL-3531), and the reads gift cards share (`gift-cards.server.ts`,\n * AGL-3551). Their records are plain documents under the site,\n * so one shape serves each: an export reads the list's query (orders) or the\n * whole collection page by page; a lookup finds documents by the resource's\n * keys; an import writes the same document the console's card writes, and\n * undo puts back what it held or deletes what the import made.\n *\n * Orders declare `records` too — the kind a file of rows is — but refuse\n * every row they are handed: their fields are all read-only\n * and the invariant below fails a row that would write, so a dry run says\n * why rather than an apply discovering it.\n */\n\nexport type Doc = Record<string, unknown>\ntype Collection = FirebaseFirestore.CollectionReference\n\nconst IN_MAX = 30\n\nexport interface RecordsSpec {\n collection(firestore: Firestore, ctx: TransferResourceContext): Collection\n /** The list's query an export may carry a filter of. */\n source?: Omit<CommerceListSource, 'collection'>\n /** A document as a file names it. */\n record(id: string, data: Doc, extra: RecordsExtra): Record<string, unknown>\n /** The values a document is found by, per match key. */\n matchValues(id: string, data: Doc): Record<string, unknown>\n /** What a lookup or export reads once per call, besides the documents. */\n extra?(firestore: Firestore, ctx: TransferResourceContext, docs: readonly FirebaseFirestore.DocumentSnapshot[]): Promise<RecordsExtra>\n /** Finds documents by a key's values (at most 30); the id key is read directly. */\n find?: Record<string, (collection: Collection, values: string[]) => FirebaseFirestore.Query>\n}\n\nexport type RecordsExtra = {\n productNames?: Record<string, string>\n categories?: CategoryIndex\n}\n\nconst noExtra = async (): Promise<RecordsExtra> => ({})\n\nfunction sourceFor(spec: RecordsSpec, firestore: Firestore, ctx: TransferResourceContext): CommerceListSource {\n return {\n collection: spec.collection(firestore, ctx),\n declaration: spec.source?.declaration ?? { fields: [], sorts: [] },\n ...(spec.source?.order ? { order: spec.source.order } : {}),\n }\n}\n\nfunction refuseFilterWithout(spec: RecordsSpec, options?: TransferReadOptions): void {\n if (options?.filter && !spec.source) throw new Error('This list exports everything, or the records you select.')\n}\n\nasync function readPage(\n spec: RecordsSpec,\n ctx: TransferResourceContext,\n cursor: string | null,\n fieldIds: readonly string[],\n options: TransferReadOptions | undefined,\n firestore: Firestore,\n): Promise<TransferReadPage> {\n if (!readerSeesHost(ctx, options)) return NOTHING\n refuseFilterWithout(spec, options)\n const pageSize = Math.max(1, Math.min(500, options?.pageSize ?? 500))\n const page = await readSourcePage(firestore, sourceFor(spec, firestore, ctx), cursor, options, pageSize)\n const extra = await (spec.extra ?? noExtra)(firestore, ctx, page.docs)\n const rows = page.docs.map((doc) => {\n const record = spec.record(doc.id, (doc.data() ?? {}) as Doc, extra)\n return Object.fromEntries(fieldIds.map((fieldId) => [fieldId, record[fieldId] ?? null]))\n })\n return { rows, next: page.next }\n}\n\nasync function count(\n spec: RecordsSpec,\n ctx: TransferResourceContext,\n options: TransferReadOptions,\n firestore: Firestore,\n): Promise<number> {\n if (!readerSeesHost(ctx, options)) return 0\n refuseFilterWithout(spec, options)\n return countSource(firestore, sourceFor(spec, firestore, ctx), options)\n}\n\nasync function lookup(\n spec: RecordsSpec,\n ctx: TransferResourceContext,\n requests: readonly MatchLookupRequest[],\n firestore: Firestore,\n): Promise<TransferLookupResult> {\n const collection = spec.collection(firestore, ctx)\n const found = new Map<string, FirebaseFirestore.DocumentSnapshot>()\n const keys: MatchKeySpec[] = []\n for (const request of requests) {\n keys.push({ fieldId: request.fieldId, normalizer: request.normalizer })\n for (let at = 0; at < request.values.length; at += IN_MAX) {\n const slice = request.values.slice(at, at + IN_MAX)\n if (request.fieldId === 'id') {\n for (const doc of await firestore.getAll(...slice.map((id) => collection.doc(id)))) {\n if (doc.exists) found.set(doc.id, doc)\n }\n continue\n }\n const query = spec.find?.[request.fieldId]\n if (!query) continue\n for (const doc of (await query(collection, slice).get()).docs) found.set(doc.id, doc)\n }\n }\n const docs = [...found.values()]\n const extra = docs.length ? await (spec.extra ?? noExtra)(firestore, ctx, docs) : {}\n const records = new Map<string, Readonly<Record<string, unknown>>>()\n for (const doc of docs) records.set(doc.id, spec.record(doc.id, (doc.data() ?? {}) as Doc, extra))\n const lookupMap = buildMatchLookup(\n docs.map((doc) => ({ id: doc.id, values: spec.matchValues(doc.id, (doc.data() ?? {}) as Doc) })),\n keys,\n )\n return { lookup: lookupMap, records }\n}\n\n/** The reading hooks every records resource shares: count, a page of an export, and the lookup. */\nexport function readableRecords(spec: RecordsSpec): Pick<PluginTransferResource, 'count' | 'readPage' | 'lookup'> {\n return {\n count: (ctx, options) => count(spec, ctx, options, firestoreOf()),\n readPage: (ctx, cursor, fieldIds, options) => readPage(spec, ctx, cursor, fieldIds, options, firestoreOf()),\n lookup: (ctx, requests) => lookup(spec, ctx, requests, firestoreOf()),\n }\n}\n\n/** The hooks an export-only resource answers with: read, find by id, and refuse every write. */\nfunction exportOnly(spec: RecordsSpec, noun: string, why: string): PluginTransferResource {\n return {\n matchKeys: [{ fieldId: 'id', normalizer: 'aglynId' }],\n ...readableRecords(spec),\n invariants: [{ id: `${noun}-export-only`, label: why, check: () => why }],\n async apply(_ctx, chunk) {\n const results: TransferRowResult[] = chunk.rows.map((row) => ({\n row: row.index,\n outcome: 'failed',\n reason: 'refusedValue',\n message: why,\n }))\n return { results, undo: [] }\n },\n async revert() {\n return { done: [], conflicts: [] }\n },\n }\n}\n\n/*==========================================\n * ORDERS — exported only\n *=========================================*/\n\nconst ORDERS: RecordsSpec = {\n collection: (firestore, ctx) => hostRefOf(firestore, ctx).collection('orders'),\n source: { declaration: ORDER_LIST_QUERY, order: { path: 'createdAtMs', direction: 'desc' } },\n record: (id, data, extra) => orderRecord(id, data as StoredOrder, extra.productNames),\n matchValues: (id) => ({ id }),\n /** A legacy flat row is named by its product, read for that page alone. */\n async extra(firestore, ctx, docs) {\n const ids = [\n ...new Set(\n docs\n .filter((doc) => !(doc.get('lineItems') as unknown[] | undefined)?.length && doc.get('productId'))\n .map((doc) => String(doc.get('productId'))),\n ),\n ]\n const productNames: Record<string, string> = {}\n const products = hostRefOf(firestore, ctx).collection('products')\n for (let at = 0; at < ids.length; at += 100) {\n for (const doc of await firestore.getAll(...ids.slice(at, at + 100).map((id) => products.doc(id)))) {\n if (doc.exists && doc.get('name')) productNames[doc.id] = String(doc.get('name'))\n }\n }\n return { productNames }\n },\n}\n\nexport const ordersTransfer: PluginTransferResource = exportOnly(\n ORDERS,\n 'orders',\n 'Orders are exported, never imported: an order is the record of a sale, written by checkout, the register or a paid draft.',\n)\n\n\n/*==========================================\n * IMPORTABLE RECORDS\n *=========================================*/\n\n/** A row the apply refuses, with the sentence the results show. */\nclass RowRefusal extends Error {}\n\ninterface WritableSpec extends RecordsSpec {\n /** The fields a new record cannot be made without. */\n requiredToCreate: readonly string[]\n /** A new record's id: a fresh one, or what the row names (a coupon's code). */\n newId(row: PlannedTransferRow, changes: Readonly<Record<string, unknown>>): string\n /** The document a row's changes make, or the refusal. */\n write(\n id: string,\n current: Doc | null,\n changes: Readonly<Record<string, unknown>>,\n extra: RecordsExtra,\n ): { doc: Record<string, unknown> } | { problem: string }\n /** Stamps a create carries beyond its fields. */\n createStamps?(): Record<string, unknown>\n /** Values normalized before matching and planning (a code's case). */\n normalize?(values: Record<string, unknown>): Record<string, unknown>\n /** Called after a record is written, with what the next rows resolve against. */\n afterWrite?(id: string, doc: Doc, extra: RecordsExtra): void\n}\n\nfunction writable(spec: WritableSpec, matchKeys: readonly MatchKeySpec[]): PluginTransferResource {\n return {\n matchKeys,\n count: (ctx, options) => count(spec, ctx, options, firestoreOf()),\n readPage: (ctx, cursor, fieldIds, options) => readPage(spec, ctx, cursor, fieldIds, options, firestoreOf()),\n lookup: (ctx, requests) => lookup(spec, ctx, requests, firestoreOf()),\n plan(_ctx, input: BuildTransferPlanInput): TransferPlan {\n const rows = spec.normalize\n ? input.rows.map((row) => ({ ...row, values: spec.normalize?.({ ...row.values }) ?? row.values }))\n : input.rows\n return planWithCreateRequired({ ...input, rows }, spec.requiredToCreate)\n },\n apply: (ctx, chunk, writer) => applyRecords(spec, ctx, chunk, writer, firestoreOf()),\n revert: (ctx, snapshot, decisions) => revertRecords(spec, ctx, snapshot, decisions, firestoreOf()),\n }\n}\n\n/** Writes one chunk of planned rows: each a create or an update of one document. */\nexport async function applyRecords(\n spec: WritableSpec,\n ctx: TransferResourceContext,\n chunk: TransferChunk<PlannedTransferRow>,\n writer: TransferApplyWriter,\n firestore: Firestore,\n): Promise<TransferApplyResult> {\n const collection = spec.collection(firestore, ctx)\n const results: TransferRowResult[] = []\n const undo: TransferUndoEntry[] = []\n const extra = await (spec.extra ?? noExtra)(firestore, ctx, [])\n for (const row of chunk.rows) {\n const earlier = await writer.alreadyApplied(row.index)\n if (earlier) {\n results.push(earlier)\n continue\n }\n if (writer.timeLeftMs() < ROW_BUDGET_MS) break\n const changes = rowChanges(row)\n const creating = row.verdict === 'create'\n const id = creating ? spec.newId(row, changes) : (row.recordId as string)\n const ref = collection.doc(id)\n try {\n const outcome = await firestore.runTransaction(async (tx) => {\n const snapshot = await tx.get(ref)\n if (creating && snapshot.exists) throw new RowRefusal(`\"${id}\" already exists; match it to update it instead.`)\n if (!creating && !snapshot.exists) throw new RowRefusal('The record was deleted after the dry run.')\n const current = snapshot.exists ? ((snapshot.data() ?? {}) as Doc) : null\n const made = spec.write(id, current, changes, extra)\n if ('problem' in made) throw new RowRefusal(made.problem)\n const doc = withoutUndefined({ ...made.doc, ...(creating ? (spec.createStamps?.() ?? {}) : {}) })\n if (creating) tx.create(ref, doc)\n else tx.set(ref, doc)\n return { current, doc }\n })\n spec.afterWrite?.(id, outcome.doc, extra)\n const after = spec.record(id, outcome.doc, extra)\n const before = outcome.current ? spec.record(id, outcome.current, extra) : null\n const touched = Object.keys(changes)\n const result: TransferRowResult = { row: row.index, outcome: creating ? 'created' : 'updated', recordId: id }\n const entry: TransferUndoEntry = creating\n ? { row: row.index, recordId: id, action: 'created', written: pickKeys(after, touched) }\n : {\n row: row.index,\n recordId: id,\n action: 'updated',\n previous: pickKeys(before ?? {}, touched),\n written: pickKeys(after, touched),\n }\n results.push(result)\n undo.push(entry)\n await writer.markApplied(result, entry)\n } catch (error) {\n if (!(error instanceof RowRefusal)) throw error\n const result: TransferRowResult = { row: row.index, outcome: 'failed', reason: 'refusedValue', message: error.message }\n results.push(result)\n await writer.markApplied(result)\n }\n }\n return { results, undo }\n}\n\nconst pickKeys = (record: Readonly<Record<string, unknown>>, keys: readonly string[]) =>\n Object.fromEntries(keys.map((key) => [key, record[key] ?? null]))\n\n/** Reverses one chunk: a created record deleted, an updated one's fields put back. */\nexport async function revertRecords(\n spec: WritableSpec,\n ctx: TransferResourceContext,\n snapshot: TransferUndoSnapshot,\n decisions: TransferRevertDecisions | undefined,\n firestore: Firestore,\n): Promise<TransferRevertResult> {\n const collection = spec.collection(firestore, ctx)\n const extra = await (spec.extra ?? noExtra)(firestore, ctx, [])\n return revertEntries(snapshot, decisions, {\n async current(entry) {\n const doc = await collection.doc(entry.recordId).get()\n return doc.exists ? spec.record(doc.id, (doc.data() ?? {}) as Doc, extra) : null\n },\n async remove(entry) {\n await collection.doc(entry.recordId).delete()\n },\n async restore(entry, values) {\n const ref = collection.doc(entry.recordId)\n const doc = await ref.get()\n if (!doc.exists) return\n const made = spec.write(entry.recordId, (doc.data() ?? {}) as Doc, values, extra)\n // A value the record held before the import is put back as it was, even one a file could not set.\n if ('problem' in made) throw new Error(`Undo could not restore ${entry.recordId}: ${made.problem}`)\n await ref.set(withoutUndefined(made.doc))\n },\n })\n}\n\n/*------------------------------------------\n * Discounts\n *-----------------------------------------*/\n\nconst DISCOUNTS: WritableSpec = {\n collection: (firestore, ctx) => hostRefOf(firestore, ctx).collection('discounts'),\n record: (id, data) => discountRecord(id, data),\n matchValues: (id, data) => ({ id, code: data['code'] ?? null, name: data['name'] ?? null }),\n find: {\n code: (collection, values) => collection.where('code', 'in', values.map((value) => promotionCode(value))),\n name: (collection, values) => collection.where('name', 'in', values),\n },\n requiredToCreate: ['kind'],\n newId: () => Aglyn.createResourceUid(),\n write: (_id, current, changes) => discountWrite(current, changes),\n normalize(values) {\n if ('code' in values) values['code'] = promotionCode(values['code']) || null\n return values\n },\n}\n\nexport const discountsTransfer: PluginTransferResource = {\n ...writable(DISCOUNTS, DISCOUNT_MATCH_KEYS),\n async picklists(_ctx, picklistIds) {\n return picklistIds.includes(DISCOUNT_KIND_PICKLIST)\n ? {\n [DISCOUNT_KIND_PICKLIST]: {\n spec: DISCOUNT_KIND_SPEC,\n set: {\n values: DISCOUNT_KIND_SPEC.standardValues.map((value) => ({ id: value.id, label: value.label, active: true })),\n defaultValueId: 'percent',\n },\n },\n }\n : {}\n },\n}\n\n/*------------------------------------------\n * Coupons\n *-----------------------------------------*/\n\nconst COUPONS: WritableSpec = {\n collection: (firestore, ctx) => hostRefOf(firestore, ctx).collection('coupons'),\n record: (id, data) => couponRecord(id, data as StoredCoupon),\n matchValues: (id) => ({ id, code: id }),\n // A coupon's code is its document id: a code is looked up by id.\n find: {\n code: (collection, values) =>\n collection.where(\n firebaseAdmin.firestore.FieldPath.documentId(),\n 'in',\n values.map((value) => promotionCode(value)).filter(Boolean),\n ),\n },\n requiredToCreate: ['code', 'percentOff'],\n newId: (_row, changes) => {\n const code = promotionCode(changes['code'])\n if (!code) throw new RowRefusal('A coupon needs a code.')\n return code\n },\n write: (_id, current, changes) => couponWrite(current as StoredCoupon | null, changes),\n createStamps: () => ({ createdAt: firebaseAdmin.firestore.Timestamp.now() }),\n normalize(values) {\n if ('code' in values) values['code'] = promotionCode(values['code']) || null\n return values\n },\n}\n\nexport const couponsTransfer: PluginTransferResource = writable(COUPONS, COUPON_MATCH_KEYS)\n\n/*------------------------------------------\n * Categories\n *-----------------------------------------*/\n\n/** Every category of the site, for parents and for naming them. */\nasync function readCategories(firestore: Firestore, ctx: TransferResourceContext): Promise<CategoryIndex> {\n const snapshot = await hostRefOf(firestore, ctx).collection('productCategories').limit(2000).get()\n return new Map(snapshot.docs.map((doc) => [doc.id, (doc.data() ?? {}) as StoredCategory]))\n}\n\nconst CATEGORIES: WritableSpec = {\n collection: (firestore, ctx) => hostRefOf(firestore, ctx).collection('productCategories'),\n record(id, data, extra) {\n const slugs = new Map([...(extra.categories ?? new Map())].map(([key, category]) => [key, String(category.slug ?? key)]))\n return categoryRecord(id, data as StoredCategory, slugs)\n },\n matchValues: (id, data) => ({ id, slug: data['slug'] ?? null, name: data['name'] ?? null }),\n find: {\n slug: (collection, values) => collection.where('slug', 'in', values),\n name: (collection, values) => collection.where('name', 'in', values),\n },\n extra: async (firestore, ctx) => ({ categories: await readCategories(firestore, ctx) }),\n requiredToCreate: ['name'],\n newId: () => Aglyn.createResourceUid(),\n write: (id, current, changes, extra) =>\n categoryWrite(id, current as StoredCategory | null, changes, extra.categories ?? new Map()),\n // A category written earlier in the file is a parent a later row can name.\n afterWrite(id, doc, extra) {\n extra.categories?.set(id, doc as StoredCategory)\n },\n}\n\nexport const categoriesTransfer: PluginTransferResource = writable(CATEGORIES, CATEGORY_MATCH_KEYS)\n"],"names":["Aglyn","buildMatchLookup","firebaseAdmin","ORDER_LIST_QUERY","CATEGORY_MATCH_KEYS","COUPON_MATCH_KEYS","DISCOUNT_KIND_PICKLIST","DISCOUNT_KIND_SPEC","DISCOUNT_MATCH_KEYS","categoryRecord","categoryWrite","couponRecord","couponWrite","discountRecord","discountWrite","orderRecord","planWithCreateRequired","promotionCode","rowChanges","NOTHING","ROW_BUDGET_MS","countSource","firestoreOf","hostRefOf","readSourcePage","readerSeesHost","revertEntries","withoutUndefined","IN_MAX","noExtra","sourceFor","spec","firestore","ctx","collection","declaration","source","fields","sorts","order","refuseFilterWithout","options","filter","Error","readPage","cursor","fieldIds","pageSize","Math","max","min","page","extra","docs","rows","map","doc","record","id","data","Object","fromEntries","fieldId","next","count","lookup","requests","found","Map","keys","request","push","normalizer","at","values","length","slice","getAll","exists","set","query","find","get","records","lookupMap","matchValues","readableRecords","exportOnly","noun","why","matchKeys","invariants","label","check","apply","_ctx","chunk","results","row","index","outcome","reason","message","undo","revert","done","conflicts","ORDERS","path","direction","productNames","ids","Set","String","products","ordersTransfer","RowRefusal","writable","plan","input","normalize","requiredToCreate","writer","applyRecords","snapshot","decisions","revertRecords","earlier","alreadyApplied","timeLeftMs","changes","creating","verdict","newId","recordId","ref","runTransaction","tx","current","made","write","problem","createStamps","create","afterWrite","after","before","touched","result","entry","action","written","pickKeys","previous","markApplied","error","key","remove","delete","restore","DISCOUNTS","code","name","where","value","createResourceUid","_id","discountsTransfer","picklists","picklistIds","includes","standardValues","active","defaultValueId","COUPONS","FieldPath","documentId","Boolean","_row","createdAt","Timestamp","now","couponsTransfer","readCategories","limit","CATEGORIES","slugs","categories","category","slug","categoriesTransfer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/transfer/records.server.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 {\n buildMatchLookup,\n type BuildTransferPlanInput,\n type MatchKeySpec,\n type MatchLookupRequest,\n type PlannedTransferRow,\n type TransferChunk,\n type TransferPlan,\n type TransferRowResult,\n type TransferUndoEntry,\n type TransferUndoSnapshot,\n} from '@aglyn/aglyn/data-transfer'\nimport type {\n PluginTransferResource,\n TransferApplyResult,\n TransferApplyWriter,\n TransferLookupResult,\n TransferReadOptions,\n TransferReadPage,\n TransferResourceContext,\n TransferRevertDecisions,\n TransferRevertResult,\n} from '@aglyn/aglyn/plugin-manager/plugin-transfer-resources'\nimport { firebaseAdmin } from '@aglyn/tenant-data-admin'\nimport type { ListQueryDeclaration } from '@aglyn/shared-ui-jsx/const/list-query-plan'\nimport { ORDER_LIST_QUERY } from '../constants/orders-list-query'\nimport type { ProductWeights } from '../model/order-shipping-export'\nimport {\n CATEGORY_MATCH_KEYS,\n COUPON_MATCH_KEYS,\n DISCOUNT_KIND_PICKLIST,\n DISCOUNT_KIND_SPEC,\n DISCOUNT_MATCH_KEYS,\n categoryRecord,\n categoryWrite,\n couponRecord,\n couponWrite,\n discountRecord,\n discountWrite,\n orderRecord,\n planWithCreateRequired,\n promotionCode,\n rowChanges,\n type CategoryIndex,\n type StoredCategory,\n type StoredCoupon,\n type StoredOrder,\n} from './records-transfer'\nimport {\n NOTHING,\n ROW_BUDGET_MS,\n countSource,\n firestoreOf,\n hostRefOf,\n readSourcePage,\n readerSeesHost,\n revertEntries,\n withoutUndefined,\n type CommerceListSource,\n type Firestore,\n} from './server-common'\n\n/*\n * THE SERVER HALVES OF ORDERS, DISCOUNTS, COUPONS AND CATEGORIES\n * (AGL-3531), and the reads gift cards share (`gift-cards.server.ts`,\n * AGL-3551). Their records are plain documents under the site,\n * so one shape serves each: an export reads the list's query (orders) or the\n * whole collection page by page; a lookup finds documents by the resource's\n * keys; an import writes the same document the console's card writes, and\n * undo puts back what it held or deletes what the import made.\n *\n * Orders declare `records` too — the kind a file of rows is — but refuse\n * every row they are handed: their fields are all read-only\n * and the invariant below fails a row that would write, so a dry run says\n * why rather than an apply discovering it.\n */\n\nexport type Doc = Record<string, unknown>\ntype Collection = FirebaseFirestore.CollectionReference\n\nconst IN_MAX = 30\n\nexport interface RecordsSpec {\n collection(firestore: Firestore, ctx: TransferResourceContext): Collection\n /** The list's query an export may carry a filter of. */\n source?: Omit<CommerceListSource, 'collection'>\n /** A document as a file names it. */\n record(id: string, data: Doc, extra: RecordsExtra): Record<string, unknown>\n /** The values a document is found by, per match key. */\n matchValues(id: string, data: Doc): Record<string, unknown>\n /**\n * What a lookup or export reads once per call, besides the documents. An\n * export names the fields it writes, so a read only some fields need is\n * skipped when none of them is asked for.\n */\n extra?(\n firestore: Firestore,\n ctx: TransferResourceContext,\n docs: readonly FirebaseFirestore.DocumentSnapshot[],\n fieldIds?: readonly string[],\n ): Promise<RecordsExtra>\n /** Finds documents by a key's values (at most 30); the id key is read directly. */\n find?: Record<string, (collection: Collection, values: string[]) => FirebaseFirestore.Query>\n}\n\nexport type RecordsExtra = {\n productNames?: Record<string, string>\n /** Each product's variant weights in grams, for the shipping columns (AGL-3613). */\n weights?: ProductWeights\n categories?: CategoryIndex\n}\n\nconst noExtra = async (): Promise<RecordsExtra> => ({})\n\nfunction sourceFor(spec: RecordsSpec, firestore: Firestore, ctx: TransferResourceContext): CommerceListSource {\n return {\n collection: spec.collection(firestore, ctx),\n declaration: spec.source?.declaration ?? { fields: [], sorts: [] },\n ...(spec.source?.order ? { order: spec.source.order } : {}),\n }\n}\n\nfunction refuseFilterWithout(spec: RecordsSpec, options?: TransferReadOptions): void {\n if (options?.filter && !spec.source) throw new Error('This list exports everything, or the records you select.')\n}\n\nasync function readPage(\n spec: RecordsSpec,\n ctx: TransferResourceContext,\n cursor: string | null,\n fieldIds: readonly string[],\n options: TransferReadOptions | undefined,\n firestore: Firestore,\n): Promise<TransferReadPage> {\n if (!readerSeesHost(ctx, options)) return NOTHING\n refuseFilterWithout(spec, options)\n const pageSize = Math.max(1, Math.min(500, options?.pageSize ?? 500))\n const page = await readSourcePage(firestore, sourceFor(spec, firestore, ctx), cursor, options, pageSize)\n const extra = await (spec.extra ?? noExtra)(firestore, ctx, page.docs, fieldIds)\n const rows = page.docs.map((doc) => {\n const record = spec.record(doc.id, (doc.data() ?? {}) as Doc, extra)\n return Object.fromEntries(fieldIds.map((fieldId) => [fieldId, record[fieldId] ?? null]))\n })\n return { rows, next: page.next }\n}\n\nasync function count(\n spec: RecordsSpec,\n ctx: TransferResourceContext,\n options: TransferReadOptions,\n firestore: Firestore,\n): Promise<number> {\n if (!readerSeesHost(ctx, options)) return 0\n refuseFilterWithout(spec, options)\n return countSource(firestore, sourceFor(spec, firestore, ctx), options)\n}\n\nasync function lookup(\n spec: RecordsSpec,\n ctx: TransferResourceContext,\n requests: readonly MatchLookupRequest[],\n firestore: Firestore,\n): Promise<TransferLookupResult> {\n const collection = spec.collection(firestore, ctx)\n const found = new Map<string, FirebaseFirestore.DocumentSnapshot>()\n const keys: MatchKeySpec[] = []\n for (const request of requests) {\n keys.push({ fieldId: request.fieldId, normalizer: request.normalizer })\n for (let at = 0; at < request.values.length; at += IN_MAX) {\n const slice = request.values.slice(at, at + IN_MAX)\n if (request.fieldId === 'id') {\n for (const doc of await firestore.getAll(...slice.map((id) => collection.doc(id)))) {\n if (doc.exists) found.set(doc.id, doc)\n }\n continue\n }\n const query = spec.find?.[request.fieldId]\n if (!query) continue\n for (const doc of (await query(collection, slice).get()).docs) found.set(doc.id, doc)\n }\n }\n const docs = [...found.values()]\n const extra = docs.length ? await (spec.extra ?? noExtra)(firestore, ctx, docs) : {}\n const records = new Map<string, Readonly<Record<string, unknown>>>()\n for (const doc of docs) records.set(doc.id, spec.record(doc.id, (doc.data() ?? {}) as Doc, extra))\n const lookupMap = buildMatchLookup(\n docs.map((doc) => ({ id: doc.id, values: spec.matchValues(doc.id, (doc.data() ?? {}) as Doc) })),\n keys,\n )\n return { lookup: lookupMap, records }\n}\n\n/** The reading hooks every records resource shares: count, a page of an export, and the lookup. */\nexport function readableRecords(spec: RecordsSpec): Pick<PluginTransferResource, 'count' | 'readPage' | 'lookup'> {\n return {\n count: (ctx, options) => count(spec, ctx, options, firestoreOf()),\n readPage: (ctx, cursor, fieldIds, options) => readPage(spec, ctx, cursor, fieldIds, options, firestoreOf()),\n lookup: (ctx, requests) => lookup(spec, ctx, requests, firestoreOf()),\n }\n}\n\n/** The hooks an export-only resource answers with: read, find by id, and refuse every write. */\nfunction exportOnly(spec: RecordsSpec, noun: string, why: string): PluginTransferResource {\n return {\n matchKeys: [{ fieldId: 'id', normalizer: 'aglynId' }],\n ...readableRecords(spec),\n invariants: [{ id: `${noun}-export-only`, label: why, check: () => why }],\n async apply(_ctx, chunk) {\n const results: TransferRowResult[] = chunk.rows.map((row) => ({\n row: row.index,\n outcome: 'failed',\n reason: 'refusedValue',\n message: why,\n }))\n return { results, undo: [] }\n },\n async revert() {\n return { done: [], conflicts: [] }\n },\n }\n}\n\n/*==========================================\n * ORDERS — exported only\n *=========================================*/\n\n/**\n * The orders list's query, with the one predicate the list itself never\n * shows: `requiresShipping`, which the orders card's Export for shipping\n * asks (AGL-3613) and every creator stamps.\n */\nconst ORDER_EXPORT_QUERY: ListQueryDeclaration = {\n ...ORDER_LIST_QUERY,\n fields: [\n ...ORDER_LIST_QUERY.fields,\n { column: 'requiresShipping', kind: 'exact', path: 'requiresShipping', operators: ['equals'] },\n ],\n}\n\nconst ORDERS: RecordsSpec = {\n collection: (firestore, ctx) => hostRefOf(firestore, ctx).collection('orders'),\n source: { declaration: ORDER_EXPORT_QUERY, order: { path: 'createdAtMs', direction: 'desc' } },\n record: (id, data, extra) => orderRecord(id, data as StoredOrder, extra.productNames, extra.weights),\n matchValues: (id) => ({ id }),\n /** A legacy flat row is named by its product, read for that page alone. */\n async extra(firestore, ctx, docs, fieldIds) {\n const ids = [\n ...new Set(\n docs\n .filter((doc) => !(doc.get('lineItems') as unknown[] | undefined)?.length && doc.get('productId'))\n .map((doc) => String(doc.get('productId'))),\n ),\n ]\n const productNames: Record<string, string> = {}\n const products = hostRefOf(firestore, ctx).collection('products')\n for (let at = 0; at < ids.length; at += 100) {\n for (const doc of await firestore.getAll(...ids.slice(at, at + 100).map((id) => products.doc(id)))) {\n if (doc.exists && doc.get('name')) productNames[doc.id] = String(doc.get('name'))\n }\n }\n // The page's products are read for their weights only when a weight\n // column is written (AGL-3613) — never for an ordinary orders export.\n const wantsWeight = (fieldIds ?? []).some((fieldId) => fieldId === 'weightOz' || fieldId === 'weightLb' || fieldId === 'weightUnit')\n return { productNames, ...(wantsWeight ? { weights: await productWeightsFor(firestore, ctx, docs) } : {}) }\n },\n}\n\n/**\n * The products a page of orders names, by variant weight in grams. One\n * `getAll` per hundred products.\n */\nasync function productWeightsFor(\n firestore: Firestore,\n ctx: TransferResourceContext,\n docs: readonly FirebaseFirestore.DocumentSnapshot[],\n): Promise<ProductWeights> {\n const ids = [\n ...new Set(\n docs.flatMap((doc) =>\n ((doc.get('lineItems') as Array<{ productId?: unknown }> | undefined) ?? [])\n .map((line) => (typeof line?.productId === 'string' ? line.productId : ''))\n .filter((id) => id && !id.includes('/')),\n ),\n ),\n ]\n const weights: Record<string, Record<string, number>> = {}\n const products = hostRefOf(firestore, ctx).collection('products')\n for (let at = 0; at < ids.length; at += 100) {\n for (const doc of await firestore.getAll(...ids.slice(at, at + 100).map((id) => products.doc(id)))) {\n if (!doc.exists) continue\n const variants = (doc.get('variants') as Array<{ id?: string; weightGrams?: unknown }> | undefined) ?? []\n const byVariant: Record<string, number> = {}\n for (const [index, variant] of variants.entries()) {\n const grams = Number(variant?.weightGrams)\n if (!Number.isFinite(grams) || grams <= 0) continue\n if (variant?.id) byVariant[variant.id] = grams\n if (index === 0) byVariant[''] = grams\n }\n if (Object.keys(byVariant).length) weights[doc.id] = byVariant\n }\n }\n return weights\n}\n\nexport const ordersTransfer: PluginTransferResource = exportOnly(\n ORDERS,\n 'orders',\n 'Orders are exported, never imported: an order is the record of a sale, written by checkout, the register or a paid draft.',\n)\n\n\n/*==========================================\n * IMPORTABLE RECORDS\n *=========================================*/\n\n/** A row the apply refuses, with the sentence the results show. */\nclass RowRefusal extends Error {}\n\ninterface WritableSpec extends RecordsSpec {\n /** The fields a new record cannot be made without. */\n requiredToCreate: readonly string[]\n /** A new record's id: a fresh one, or what the row names (a coupon's code). */\n newId(row: PlannedTransferRow, changes: Readonly<Record<string, unknown>>): string\n /** The document a row's changes make, or the refusal. */\n write(\n id: string,\n current: Doc | null,\n changes: Readonly<Record<string, unknown>>,\n extra: RecordsExtra,\n ): { doc: Record<string, unknown> } | { problem: string }\n /** Stamps a create carries beyond its fields. */\n createStamps?(): Record<string, unknown>\n /** Values normalized before matching and planning (a code's case). */\n normalize?(values: Record<string, unknown>): Record<string, unknown>\n /** Called after a record is written, with what the next rows resolve against. */\n afterWrite?(id: string, doc: Doc, extra: RecordsExtra): void\n}\n\nfunction writable(spec: WritableSpec, matchKeys: readonly MatchKeySpec[]): PluginTransferResource {\n return {\n matchKeys,\n count: (ctx, options) => count(spec, ctx, options, firestoreOf()),\n readPage: (ctx, cursor, fieldIds, options) => readPage(spec, ctx, cursor, fieldIds, options, firestoreOf()),\n lookup: (ctx, requests) => lookup(spec, ctx, requests, firestoreOf()),\n plan(_ctx, input: BuildTransferPlanInput): TransferPlan {\n const rows = spec.normalize\n ? input.rows.map((row) => ({ ...row, values: spec.normalize?.({ ...row.values }) ?? row.values }))\n : input.rows\n return planWithCreateRequired({ ...input, rows }, spec.requiredToCreate)\n },\n apply: (ctx, chunk, writer) => applyRecords(spec, ctx, chunk, writer, firestoreOf()),\n revert: (ctx, snapshot, decisions) => revertRecords(spec, ctx, snapshot, decisions, firestoreOf()),\n }\n}\n\n/** Writes one chunk of planned rows: each a create or an update of one document. */\nexport async function applyRecords(\n spec: WritableSpec,\n ctx: TransferResourceContext,\n chunk: TransferChunk<PlannedTransferRow>,\n writer: TransferApplyWriter,\n firestore: Firestore,\n): Promise<TransferApplyResult> {\n const collection = spec.collection(firestore, ctx)\n const results: TransferRowResult[] = []\n const undo: TransferUndoEntry[] = []\n const extra = await (spec.extra ?? noExtra)(firestore, ctx, [])\n for (const row of chunk.rows) {\n const earlier = await writer.alreadyApplied(row.index)\n if (earlier) {\n results.push(earlier)\n continue\n }\n if (writer.timeLeftMs() < ROW_BUDGET_MS) break\n const changes = rowChanges(row)\n const creating = row.verdict === 'create'\n const id = creating ? spec.newId(row, changes) : (row.recordId as string)\n const ref = collection.doc(id)\n try {\n const outcome = await firestore.runTransaction(async (tx) => {\n const snapshot = await tx.get(ref)\n if (creating && snapshot.exists) throw new RowRefusal(`\"${id}\" already exists; match it to update it instead.`)\n if (!creating && !snapshot.exists) throw new RowRefusal('The record was deleted after the dry run.')\n const current = snapshot.exists ? ((snapshot.data() ?? {}) as Doc) : null\n const made = spec.write(id, current, changes, extra)\n if ('problem' in made) throw new RowRefusal(made.problem)\n const doc = withoutUndefined({ ...made.doc, ...(creating ? (spec.createStamps?.() ?? {}) : {}) })\n if (creating) tx.create(ref, doc)\n else tx.set(ref, doc)\n return { current, doc }\n })\n spec.afterWrite?.(id, outcome.doc, extra)\n const after = spec.record(id, outcome.doc, extra)\n const before = outcome.current ? spec.record(id, outcome.current, extra) : null\n const touched = Object.keys(changes)\n const result: TransferRowResult = { row: row.index, outcome: creating ? 'created' : 'updated', recordId: id }\n const entry: TransferUndoEntry = creating\n ? { row: row.index, recordId: id, action: 'created', written: pickKeys(after, touched) }\n : {\n row: row.index,\n recordId: id,\n action: 'updated',\n previous: pickKeys(before ?? {}, touched),\n written: pickKeys(after, touched),\n }\n results.push(result)\n undo.push(entry)\n await writer.markApplied(result, entry)\n } catch (error) {\n if (!(error instanceof RowRefusal)) throw error\n const result: TransferRowResult = { row: row.index, outcome: 'failed', reason: 'refusedValue', message: error.message }\n results.push(result)\n await writer.markApplied(result)\n }\n }\n return { results, undo }\n}\n\nconst pickKeys = (record: Readonly<Record<string, unknown>>, keys: readonly string[]) =>\n Object.fromEntries(keys.map((key) => [key, record[key] ?? null]))\n\n/** Reverses one chunk: a created record deleted, an updated one's fields put back. */\nexport async function revertRecords(\n spec: WritableSpec,\n ctx: TransferResourceContext,\n snapshot: TransferUndoSnapshot,\n decisions: TransferRevertDecisions | undefined,\n firestore: Firestore,\n): Promise<TransferRevertResult> {\n const collection = spec.collection(firestore, ctx)\n const extra = await (spec.extra ?? noExtra)(firestore, ctx, [])\n return revertEntries(snapshot, decisions, {\n async current(entry) {\n const doc = await collection.doc(entry.recordId).get()\n return doc.exists ? spec.record(doc.id, (doc.data() ?? {}) as Doc, extra) : null\n },\n async remove(entry) {\n await collection.doc(entry.recordId).delete()\n },\n async restore(entry, values) {\n const ref = collection.doc(entry.recordId)\n const doc = await ref.get()\n if (!doc.exists) return\n const made = spec.write(entry.recordId, (doc.data() ?? {}) as Doc, values, extra)\n // A value the record held before the import is put back as it was, even one a file could not set.\n if ('problem' in made) throw new Error(`Undo could not restore ${entry.recordId}: ${made.problem}`)\n await ref.set(withoutUndefined(made.doc))\n },\n })\n}\n\n/*------------------------------------------\n * Discounts\n *-----------------------------------------*/\n\nconst DISCOUNTS: WritableSpec = {\n collection: (firestore, ctx) => hostRefOf(firestore, ctx).collection('discounts'),\n record: (id, data) => discountRecord(id, data),\n matchValues: (id, data) => ({ id, code: data['code'] ?? null, name: data['name'] ?? null }),\n find: {\n code: (collection, values) => collection.where('code', 'in', values.map((value) => promotionCode(value))),\n name: (collection, values) => collection.where('name', 'in', values),\n },\n requiredToCreate: ['kind'],\n newId: () => Aglyn.createResourceUid(),\n write: (_id, current, changes) => discountWrite(current, changes),\n normalize(values) {\n if ('code' in values) values['code'] = promotionCode(values['code']) || null\n return values\n },\n}\n\nexport const discountsTransfer: PluginTransferResource = {\n ...writable(DISCOUNTS, DISCOUNT_MATCH_KEYS),\n async picklists(_ctx, picklistIds) {\n return picklistIds.includes(DISCOUNT_KIND_PICKLIST)\n ? {\n [DISCOUNT_KIND_PICKLIST]: {\n spec: DISCOUNT_KIND_SPEC,\n set: {\n values: DISCOUNT_KIND_SPEC.standardValues.map((value) => ({ id: value.id, label: value.label, active: true })),\n defaultValueId: 'percent',\n },\n },\n }\n : {}\n },\n}\n\n/*------------------------------------------\n * Coupons\n *-----------------------------------------*/\n\nconst COUPONS: WritableSpec = {\n collection: (firestore, ctx) => hostRefOf(firestore, ctx).collection('coupons'),\n record: (id, data) => couponRecord(id, data as StoredCoupon),\n matchValues: (id) => ({ id, code: id }),\n // A coupon's code is its document id: a code is looked up by id.\n find: {\n code: (collection, values) =>\n collection.where(\n firebaseAdmin.firestore.FieldPath.documentId(),\n 'in',\n values.map((value) => promotionCode(value)).filter(Boolean),\n ),\n },\n requiredToCreate: ['code', 'percentOff'],\n newId: (_row, changes) => {\n const code = promotionCode(changes['code'])\n if (!code) throw new RowRefusal('A coupon needs a code.')\n return code\n },\n write: (_id, current, changes) => couponWrite(current as StoredCoupon | null, changes),\n createStamps: () => ({ createdAt: firebaseAdmin.firestore.Timestamp.now() }),\n normalize(values) {\n if ('code' in values) values['code'] = promotionCode(values['code']) || null\n return values\n },\n}\n\nexport const couponsTransfer: PluginTransferResource = writable(COUPONS, COUPON_MATCH_KEYS)\n\n/*------------------------------------------\n * Categories\n *-----------------------------------------*/\n\n/** Every category of the site, for parents and for naming them. */\nasync function readCategories(firestore: Firestore, ctx: TransferResourceContext): Promise<CategoryIndex> {\n const snapshot = await hostRefOf(firestore, ctx).collection('productCategories').limit(2000).get()\n return new Map(snapshot.docs.map((doc) => [doc.id, (doc.data() ?? {}) as StoredCategory]))\n}\n\nconst CATEGORIES: WritableSpec = {\n collection: (firestore, ctx) => hostRefOf(firestore, ctx).collection('productCategories'),\n record(id, data, extra) {\n const slugs = new Map([...(extra.categories ?? new Map())].map(([key, category]) => [key, String(category.slug ?? key)]))\n return categoryRecord(id, data as StoredCategory, slugs)\n },\n matchValues: (id, data) => ({ id, slug: data['slug'] ?? null, name: data['name'] ?? null }),\n find: {\n slug: (collection, values) => collection.where('slug', 'in', values),\n name: (collection, values) => collection.where('name', 'in', values),\n },\n extra: async (firestore, ctx) => ({ categories: await readCategories(firestore, ctx) }),\n requiredToCreate: ['name'],\n newId: () => Aglyn.createResourceUid(),\n write: (id, current, changes, extra) =>\n categoryWrite(id, current as StoredCategory | null, changes, extra.categories ?? new Map()),\n // A category written earlier in the file is a parent a later row can name.\n afterWrite(id, doc, extra) {\n extra.categories?.set(id, doc as StoredCategory)\n },\n}\n\nexport const categoriesTransfer: PluginTransferResource = writable(CATEGORIES, CATEGORY_MATCH_KEYS)\n"],"names":["Aglyn","buildMatchLookup","firebaseAdmin","ORDER_LIST_QUERY","CATEGORY_MATCH_KEYS","COUPON_MATCH_KEYS","DISCOUNT_KIND_PICKLIST","DISCOUNT_KIND_SPEC","DISCOUNT_MATCH_KEYS","categoryRecord","categoryWrite","couponRecord","couponWrite","discountRecord","discountWrite","orderRecord","planWithCreateRequired","promotionCode","rowChanges","NOTHING","ROW_BUDGET_MS","countSource","firestoreOf","hostRefOf","readSourcePage","readerSeesHost","revertEntries","withoutUndefined","IN_MAX","noExtra","sourceFor","spec","firestore","ctx","collection","declaration","source","fields","sorts","order","refuseFilterWithout","options","filter","Error","readPage","cursor","fieldIds","pageSize","Math","max","min","page","extra","docs","rows","map","doc","record","id","data","Object","fromEntries","fieldId","next","count","lookup","requests","found","Map","keys","request","push","normalizer","at","values","length","slice","getAll","exists","set","query","find","get","records","lookupMap","matchValues","readableRecords","exportOnly","noun","why","matchKeys","invariants","label","check","apply","_ctx","chunk","results","row","index","outcome","reason","message","undo","revert","done","conflicts","ORDER_EXPORT_QUERY","column","kind","path","operators","ORDERS","direction","productNames","weights","ids","Set","String","products","wantsWeight","some","productWeightsFor","flatMap","line","productId","includes","variants","byVariant","variant","entries","grams","Number","weightGrams","isFinite","ordersTransfer","RowRefusal","writable","plan","input","normalize","requiredToCreate","writer","applyRecords","snapshot","decisions","revertRecords","earlier","alreadyApplied","timeLeftMs","changes","creating","verdict","newId","recordId","ref","runTransaction","tx","current","made","write","problem","createStamps","create","afterWrite","after","before","touched","result","entry","action","written","pickKeys","previous","markApplied","error","key","remove","delete","restore","DISCOUNTS","code","name","where","value","createResourceUid","_id","discountsTransfer","picklists","picklistIds","standardValues","active","defaultValueId","COUPONS","FieldPath","documentId","Boolean","_row","createdAt","Timestamp","now","couponsTransfer","readCategories","limit","CATEGORIES","slugs","categories","category","slug","categoriesTransfer"],"mappings":"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"}
|
|
@@ -18,7 +18,9 @@ import { registerPluginTransferResource } from "@aglyn/aglyn/plugin-manager/plug
|
|
|
18
18
|
import { BUNDLE_ID } from "../constants/bundle-common.js";
|
|
19
19
|
import { PRODUCT_ALIAS_DICTIONARIES, PRODUCT_DERIVED_FIELDS, PRODUCT_LOCKED_RULES, PRODUCT_MATCH_KEYS, PRODUCT_STANDARD_FIELDS, PRODUCT_SYSTEM_FIELDS, PRODUCT_TRANSFER_GROUPS, SHOPIFY_PRODUCT_PRESET } from "./product-transfer.js";
|
|
20
20
|
import { CATEGORY_MATCH_KEYS, CATEGORY_TRANSFER_FIELDS, COUPON_MATCH_KEYS, COUPON_TRANSFER_FIELDS, DISCOUNT_MATCH_KEYS, DISCOUNT_TRANSFER_FIELDS, GIFT_CARD_MATCH_KEYS, GIFT_CARD_TRANSFER_FIELDS, ORDER_TRANSFER_FIELDS, ORDER_TRANSFER_GROUPS } from "./records-transfer.js";
|
|
21
|
-
import {
|
|
21
|
+
import { ORDER_SHIPPING_PRESETS } from "./shipping-presets.js";
|
|
22
|
+
import { TRACKING_DEFAULT_POLICY, TRACKING_MATCH_KEYS, TRACKING_TRANSFER_FIELDS, TRACKING_TRANSFER_GROUPS, matchTrackingRows } from "./tracking-transfer.js";
|
|
23
|
+
import { COMMERCE_CATEGORIES_TRANSFER, COMMERCE_COUPONS_TRANSFER, COMMERCE_DISCOUNTS_TRANSFER, COMMERCE_GIFT_CARDS_TRANSFER, COMMERCE_ORDERS_TRANSFER, COMMERCE_PRODUCTS_TRANSFER, COMMERCE_TRACKING_TRANSFER } from "./transfer-keys.js";
|
|
22
24
|
/*
|
|
23
25
|
* THE SERVER HALVES, REGISTERED AT BOOT (AGL-3531), from the console's
|
|
24
26
|
* server declarations — the transfer routes are the console's alone. What a
|
|
@@ -28,6 +30,7 @@ import { COMMERCE_CATEGORIES_TRANSFER, COMMERCE_COUPONS_TRANSFER, COMMERCE_DISCO
|
|
|
28
30
|
*/ const productsServer = ()=>import("./products.server.js");
|
|
29
31
|
const recordsServer = ()=>import("./records.server.js");
|
|
30
32
|
const giftCardsServer = ()=>import("./gift-cards.server.js");
|
|
33
|
+
const trackingServer = ()=>import("./tracking.server.js");
|
|
31
34
|
/** A resource whose store-touching hooks load `pick(module)` on first use. */ function deferred(load, data, hooks = [
|
|
32
35
|
'count'
|
|
33
36
|
]) {
|
|
@@ -105,6 +108,9 @@ export function registerCommerceTransferResources() {
|
|
|
105
108
|
normalizer: 'aglynId'
|
|
106
109
|
}
|
|
107
110
|
],
|
|
111
|
+
// Pirate Ship, Shippo, EasyPost and any tool (AGL-3613): the orders
|
|
112
|
+
// card's Export for shipping opens on one of these.
|
|
113
|
+
presets: ORDER_SHIPPING_PRESETS,
|
|
108
114
|
invariants: [
|
|
109
115
|
{
|
|
110
116
|
id: 'orders-export-only',
|
|
@@ -166,6 +172,39 @@ export function registerCommerceTransferResources() {
|
|
|
166
172
|
}), {
|
|
167
173
|
pluginId: BUNDLE_ID
|
|
168
174
|
});
|
|
175
|
+
// A file of tracking numbers ships the orders it names (AGL-3613): each
|
|
176
|
+
// row is a parcel, recorded through the order's own shipment paths, and
|
|
177
|
+
// the buyer is emailed as for any shipment. Rows are matched by order
|
|
178
|
+
// number with the resource's own `match`, so two parcels of one order are
|
|
179
|
+
// two rows rather than a duplicate.
|
|
180
|
+
registerPluginTransferResource(COMMERCE_TRACKING_TRANSFER, {
|
|
181
|
+
fields: catalog({
|
|
182
|
+
standard: TRACKING_TRANSFER_FIELDS,
|
|
183
|
+
groups: TRACKING_TRANSFER_GROUPS
|
|
184
|
+
}),
|
|
185
|
+
matchKeys: TRACKING_MATCH_KEYS,
|
|
186
|
+
defaultPolicy: TRACKING_DEFAULT_POLICY,
|
|
187
|
+
invariants: [
|
|
188
|
+
{
|
|
189
|
+
id: 'tracking-parcel',
|
|
190
|
+
label: 'A parcel for an order that can ship',
|
|
191
|
+
check: (row)=>{
|
|
192
|
+
const planned = row;
|
|
193
|
+
return planned.verdict === 'update' && !planned.tracking ? 'This row records nothing.' : null;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
],
|
|
197
|
+
readPage: async (ctx, cursor, fieldIds, options)=>(await trackingServer()).readTrackingPage(ctx, cursor, fieldIds, options),
|
|
198
|
+
lookup: async (ctx, requests)=>(await trackingServer()).lookupTrackingOrders(ctx, requests),
|
|
199
|
+
match: (_ctx, input)=>({
|
|
200
|
+
outcomes: matchTrackingRows(input.rows, input.lookup)
|
|
201
|
+
}),
|
|
202
|
+
plan: async (ctx, input)=>(await trackingServer()).planTracking(ctx, input),
|
|
203
|
+
apply: async (ctx, chunk, writer)=>(await trackingServer()).applyTracking(ctx, chunk, writer),
|
|
204
|
+
revert: async (ctx, snapshot, decisions)=>(await trackingServer()).revertTracking(ctx, snapshot, decisions)
|
|
205
|
+
}, {
|
|
206
|
+
pluginId: BUNDLE_ID
|
|
207
|
+
});
|
|
169
208
|
}
|
|
170
209
|
|
|
171
210
|
//# sourceMappingURL=register-transfer-resources.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/transfer/register-transfer-resources.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 { TransferCatalogInput } from '@aglyn/aglyn/data-transfer'\nimport {\n registerPluginTransferResource,\n type PluginTransferResource,\n} from '@aglyn/aglyn/plugin-manager/plugin-transfer-resources'\nimport { BUNDLE_ID } from '../constants/bundle-common'\nimport {\n PRODUCT_ALIAS_DICTIONARIES,\n PRODUCT_DERIVED_FIELDS,\n PRODUCT_LOCKED_RULES,\n PRODUCT_MATCH_KEYS,\n PRODUCT_STANDARD_FIELDS,\n PRODUCT_SYSTEM_FIELDS,\n PRODUCT_TRANSFER_GROUPS,\n SHOPIFY_PRODUCT_PRESET,\n type ProductPlannedRow,\n} from './product-transfer'\nimport {\n CATEGORY_MATCH_KEYS,\n CATEGORY_TRANSFER_FIELDS,\n COUPON_MATCH_KEYS,\n COUPON_TRANSFER_FIELDS,\n DISCOUNT_MATCH_KEYS,\n DISCOUNT_TRANSFER_FIELDS,\n GIFT_CARD_MATCH_KEYS,\n GIFT_CARD_TRANSFER_FIELDS,\n ORDER_TRANSFER_FIELDS,\n ORDER_TRANSFER_GROUPS,\n type GiftCardPlannedRow,\n} from './records-transfer'\nimport {\n COMMERCE_CATEGORIES_TRANSFER,\n COMMERCE_COUPONS_TRANSFER,\n COMMERCE_DISCOUNTS_TRANSFER,\n COMMERCE_GIFT_CARDS_TRANSFER,\n COMMERCE_ORDERS_TRANSFER,\n COMMERCE_PRODUCTS_TRANSFER,\n} from './transfer-keys'\n\n/*\n * THE SERVER HALVES, REGISTERED AT BOOT (AGL-3531), from the console's\n * server declarations — the transfer routes are the console's alone. What a\n * route reads before any record (fields, keys, dictionaries, presets, rules)\n * is data from the pure modules; every hook that touches the store loads its\n * module the first time a job or an export asks.\n */\n\nconst productsServer = () => import('./products.server')\nconst recordsServer = () => import('./records.server')\nconst giftCardsServer = () => import('./gift-cards.server')\n\n/** A resource whose store-touching hooks load `pick(module)` on first use. */\nfunction deferred(\n load: () => Promise<PluginTransferResource>,\n data: Pick<PluginTransferResource, 'fields' | 'matchKeys' | 'aliases' | 'presets' | 'lockedRules' | 'invariants'>,\n hooks: ReadonlyArray<'count' | 'picklists' | 'addPicklistValues' | 'plan'> = ['count'],\n): PluginTransferResource {\n const call =\n <K extends keyof PluginTransferResource>(name: K) =>\n async (...args: unknown[]) => {\n const impl = await load()\n const hook = impl[name] as unknown as (...rest: unknown[]) => unknown\n return hook(...args)\n }\n return {\n ...data,\n readPage: call('readPage') as PluginTransferResource['readPage'],\n lookup: call('lookup') as PluginTransferResource['lookup'],\n apply: call('apply') as PluginTransferResource['apply'],\n revert: call('revert') as PluginTransferResource['revert'],\n ...Object.fromEntries(hooks.map((name) => [name, call(name)])),\n }\n}\n\nconst catalog = (input: TransferCatalogInput) => () => input\n\nexport function registerCommerceTransferResources(): void {\n registerPluginTransferResource(\n COMMERCE_PRODUCTS_TRANSFER,\n {\n fields: catalog({\n standard: PRODUCT_STANDARD_FIELDS,\n derived: PRODUCT_DERIVED_FIELDS,\n system: PRODUCT_SYSTEM_FIELDS,\n groups: PRODUCT_TRANSFER_GROUPS,\n }),\n matchKeys: PRODUCT_MATCH_KEYS,\n aliases: PRODUCT_ALIAS_DICTIONARIES,\n presets: [SHOPIFY_PRODUCT_PRESET],\n lockedRules: () => PRODUCT_LOCKED_RULES,\n invariants: [\n {\n id: 'product-storable',\n label: 'A product the store can hold',\n check: (row) => (row as ProductPlannedRow).commerce?.problem ?? null,\n },\n ],\n count: async (ctx, options) => (await productsServer()).countProductRows(ctx, options),\n readPage: async (ctx, cursor, fieldIds, options) =>\n (await productsServer()).readProductsPage(ctx, cursor, fieldIds, options),\n lookup: async (ctx, requests) => (await productsServer()).lookupProducts(ctx, requests),\n picklists: async (ctx, ids) => (await productsServer()).productPicklists(ctx, ids),\n addPicklistValues: async (ctx, id, values) => (await productsServer()).addProductCategories(ctx, id, values),\n plan: async (ctx, input) => (await productsServer()).planProducts(ctx, input),\n apply: async (ctx, chunk, writer) =>\n (await productsServer()).applyProducts(ctx, chunk as Parameters<typeof import('./products.server').applyProducts>[1], writer),\n revert: async (ctx, snapshot, decisions) => (await productsServer()).revertProducts(ctx, snapshot, decisions),\n },\n { pluginId: BUNDLE_ID },\n )\n\n registerPluginTransferResource(\n COMMERCE_CATEGORIES_TRANSFER,\n deferred(async () => (await recordsServer()).categoriesTransfer, {\n fields: catalog({ standard: CATEGORY_TRANSFER_FIELDS }),\n matchKeys: CATEGORY_MATCH_KEYS,\n }, ['count', 'plan']),\n { pluginId: BUNDLE_ID },\n )\n\n registerPluginTransferResource(\n COMMERCE_ORDERS_TRANSFER,\n deferred(async () => (await recordsServer()).ordersTransfer, {\n fields: catalog({ standard: ORDER_TRANSFER_FIELDS, groups: ORDER_TRANSFER_GROUPS }),\n matchKeys: [{ fieldId: 'id', normalizer: 'aglynId' }],\n invariants: [\n {\n id: 'orders-export-only',\n label: 'Orders are exported only',\n check: () =>\n 'Orders are exported, never imported: an order is the record of a sale, written by checkout, the register or a paid draft.',\n },\n ],\n }),\n { pluginId: BUNDLE_ID },\n )\n\n registerPluginTransferResource(\n COMMERCE_DISCOUNTS_TRANSFER,\n deferred(\n async () => (await recordsServer()).discountsTransfer,\n { fields: catalog({ standard: DISCOUNT_TRANSFER_FIELDS }), matchKeys: DISCOUNT_MATCH_KEYS },\n ['count', 'plan', 'picklists'],\n ),\n { pluginId: BUNDLE_ID },\n )\n\n registerPluginTransferResource(\n COMMERCE_COUPONS_TRANSFER,\n deferred(\n async () => (await recordsServer()).couponsTransfer,\n { fields: catalog({ standard: COUPON_TRANSFER_FIELDS }), matchKeys: COUPON_MATCH_KEYS },\n ['count', 'plan'],\n ),\n { pluginId: BUNDLE_ID },\n )\n\n // Imported by ISSUING each card (AGL-3551): the plan decides each card and\n // the total, and a row it refuses is failed here with the reason. Only on\n // a plan with gift cards (`featureFlag: \"giftCards\"`, imports only,\n // AGL-3548), refused in the issue route's words.\n registerPluginTransferResource(\n COMMERCE_GIFT_CARDS_TRANSFER,\n {\n ...deferred(\n async () => (await giftCardsServer()).giftCardsTransfer,\n {\n fields: catalog({ standard: GIFT_CARD_TRANSFER_FIELDS }),\n matchKeys: GIFT_CARD_MATCH_KEYS,\n invariants: [\n {\n id: 'gift-card-issuable',\n label: 'A gift card the store can issue',\n check: (row) => (row as GiftCardPlannedRow).giftCard?.problem ?? null,\n },\n ],\n },\n ['count', 'plan'],\n ),\n planGate: async (subject) => (await import('./gift-cards-plan')).giftCardsPlanRefusal(subject.org),\n },\n { pluginId: BUNDLE_ID },\n )\n}\n"],"names":["registerPluginTransferResource","BUNDLE_ID","PRODUCT_ALIAS_DICTIONARIES","PRODUCT_DERIVED_FIELDS","PRODUCT_LOCKED_RULES","PRODUCT_MATCH_KEYS","PRODUCT_STANDARD_FIELDS","PRODUCT_SYSTEM_FIELDS","PRODUCT_TRANSFER_GROUPS","SHOPIFY_PRODUCT_PRESET","CATEGORY_MATCH_KEYS","CATEGORY_TRANSFER_FIELDS","COUPON_MATCH_KEYS","COUPON_TRANSFER_FIELDS","DISCOUNT_MATCH_KEYS","DISCOUNT_TRANSFER_FIELDS","GIFT_CARD_MATCH_KEYS","GIFT_CARD_TRANSFER_FIELDS","ORDER_TRANSFER_FIELDS","ORDER_TRANSFER_GROUPS","COMMERCE_CATEGORIES_TRANSFER","COMMERCE_COUPONS_TRANSFER","COMMERCE_DISCOUNTS_TRANSFER","COMMERCE_GIFT_CARDS_TRANSFER","COMMERCE_ORDERS_TRANSFER","COMMERCE_PRODUCTS_TRANSFER","productsServer","recordsServer","giftCardsServer","deferred","load","data","hooks","call","name","args","impl","hook","readPage","lookup","apply","revert","Object","fromEntries","map","catalog","input","registerCommerceTransferResources","fields","standard","derived","system","groups","matchKeys","aliases","presets","lockedRules","invariants","id","label","check","row","commerce","problem","count","ctx","options","countProductRows","cursor","fieldIds","readProductsPage","requests","lookupProducts","picklists","ids","productPicklists","addPicklistValues","values","addProductCategories","plan","planProducts","chunk","writer","applyProducts","snapshot","decisions","revertProducts","pluginId","categoriesTransfer","ordersTransfer","fieldId","normalizer","discountsTransfer","couponsTransfer","giftCardsTransfer","giftCard","planGate","subject","giftCardsPlanRefusal","org"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/transfer/register-transfer-resources.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 { TransferCatalogInput } from '@aglyn/aglyn/data-transfer'\nimport {\n registerPluginTransferResource,\n type PluginTransferResource,\n} from '@aglyn/aglyn/plugin-manager/plugin-transfer-resources'\nimport { BUNDLE_ID } from '../constants/bundle-common'\nimport {\n PRODUCT_ALIAS_DICTIONARIES,\n PRODUCT_DERIVED_FIELDS,\n PRODUCT_LOCKED_RULES,\n PRODUCT_MATCH_KEYS,\n PRODUCT_STANDARD_FIELDS,\n PRODUCT_SYSTEM_FIELDS,\n PRODUCT_TRANSFER_GROUPS,\n SHOPIFY_PRODUCT_PRESET,\n type ProductPlannedRow,\n} from './product-transfer'\nimport {\n CATEGORY_MATCH_KEYS,\n CATEGORY_TRANSFER_FIELDS,\n COUPON_MATCH_KEYS,\n COUPON_TRANSFER_FIELDS,\n DISCOUNT_MATCH_KEYS,\n DISCOUNT_TRANSFER_FIELDS,\n GIFT_CARD_MATCH_KEYS,\n GIFT_CARD_TRANSFER_FIELDS,\n ORDER_TRANSFER_FIELDS,\n ORDER_TRANSFER_GROUPS,\n type GiftCardPlannedRow,\n} from './records-transfer'\nimport { ORDER_SHIPPING_PRESETS } from './shipping-presets'\nimport {\n TRACKING_DEFAULT_POLICY,\n TRACKING_MATCH_KEYS,\n TRACKING_TRANSFER_FIELDS,\n TRACKING_TRANSFER_GROUPS,\n matchTrackingRows,\n type TrackingPlannedRow,\n} from './tracking-transfer'\nimport {\n COMMERCE_CATEGORIES_TRANSFER,\n COMMERCE_COUPONS_TRANSFER,\n COMMERCE_DISCOUNTS_TRANSFER,\n COMMERCE_GIFT_CARDS_TRANSFER,\n COMMERCE_ORDERS_TRANSFER,\n COMMERCE_PRODUCTS_TRANSFER,\n COMMERCE_TRACKING_TRANSFER,\n} from './transfer-keys'\n\n/*\n * THE SERVER HALVES, REGISTERED AT BOOT (AGL-3531), from the console's\n * server declarations — the transfer routes are the console's alone. What a\n * route reads before any record (fields, keys, dictionaries, presets, rules)\n * is data from the pure modules; every hook that touches the store loads its\n * module the first time a job or an export asks.\n */\n\nconst productsServer = () => import('./products.server')\nconst recordsServer = () => import('./records.server')\nconst giftCardsServer = () => import('./gift-cards.server')\nconst trackingServer = () => import('./tracking.server')\n\n/** A resource whose store-touching hooks load `pick(module)` on first use. */\nfunction deferred(\n load: () => Promise<PluginTransferResource>,\n data: Pick<PluginTransferResource, 'fields' | 'matchKeys' | 'aliases' | 'presets' | 'lockedRules' | 'invariants'>,\n hooks: ReadonlyArray<'count' | 'picklists' | 'addPicklistValues' | 'plan'> = ['count'],\n): PluginTransferResource {\n const call =\n <K extends keyof PluginTransferResource>(name: K) =>\n async (...args: unknown[]) => {\n const impl = await load()\n const hook = impl[name] as unknown as (...rest: unknown[]) => unknown\n return hook(...args)\n }\n return {\n ...data,\n readPage: call('readPage') as PluginTransferResource['readPage'],\n lookup: call('lookup') as PluginTransferResource['lookup'],\n apply: call('apply') as PluginTransferResource['apply'],\n revert: call('revert') as PluginTransferResource['revert'],\n ...Object.fromEntries(hooks.map((name) => [name, call(name)])),\n }\n}\n\nconst catalog = (input: TransferCatalogInput) => () => input\n\nexport function registerCommerceTransferResources(): void {\n registerPluginTransferResource(\n COMMERCE_PRODUCTS_TRANSFER,\n {\n fields: catalog({\n standard: PRODUCT_STANDARD_FIELDS,\n derived: PRODUCT_DERIVED_FIELDS,\n system: PRODUCT_SYSTEM_FIELDS,\n groups: PRODUCT_TRANSFER_GROUPS,\n }),\n matchKeys: PRODUCT_MATCH_KEYS,\n aliases: PRODUCT_ALIAS_DICTIONARIES,\n presets: [SHOPIFY_PRODUCT_PRESET],\n lockedRules: () => PRODUCT_LOCKED_RULES,\n invariants: [\n {\n id: 'product-storable',\n label: 'A product the store can hold',\n check: (row) => (row as ProductPlannedRow).commerce?.problem ?? null,\n },\n ],\n count: async (ctx, options) => (await productsServer()).countProductRows(ctx, options),\n readPage: async (ctx, cursor, fieldIds, options) =>\n (await productsServer()).readProductsPage(ctx, cursor, fieldIds, options),\n lookup: async (ctx, requests) => (await productsServer()).lookupProducts(ctx, requests),\n picklists: async (ctx, ids) => (await productsServer()).productPicklists(ctx, ids),\n addPicklistValues: async (ctx, id, values) => (await productsServer()).addProductCategories(ctx, id, values),\n plan: async (ctx, input) => (await productsServer()).planProducts(ctx, input),\n apply: async (ctx, chunk, writer) =>\n (await productsServer()).applyProducts(ctx, chunk as Parameters<typeof import('./products.server').applyProducts>[1], writer),\n revert: async (ctx, snapshot, decisions) => (await productsServer()).revertProducts(ctx, snapshot, decisions),\n },\n { pluginId: BUNDLE_ID },\n )\n\n registerPluginTransferResource(\n COMMERCE_CATEGORIES_TRANSFER,\n deferred(async () => (await recordsServer()).categoriesTransfer, {\n fields: catalog({ standard: CATEGORY_TRANSFER_FIELDS }),\n matchKeys: CATEGORY_MATCH_KEYS,\n }, ['count', 'plan']),\n { pluginId: BUNDLE_ID },\n )\n\n registerPluginTransferResource(\n COMMERCE_ORDERS_TRANSFER,\n deferred(async () => (await recordsServer()).ordersTransfer, {\n fields: catalog({ standard: ORDER_TRANSFER_FIELDS, groups: ORDER_TRANSFER_GROUPS }),\n matchKeys: [{ fieldId: 'id', normalizer: 'aglynId' }],\n // Pirate Ship, Shippo, EasyPost and any tool (AGL-3613): the orders\n // card's Export for shipping opens on one of these.\n presets: ORDER_SHIPPING_PRESETS,\n invariants: [\n {\n id: 'orders-export-only',\n label: 'Orders are exported only',\n check: () =>\n 'Orders are exported, never imported: an order is the record of a sale, written by checkout, the register or a paid draft.',\n },\n ],\n }),\n { pluginId: BUNDLE_ID },\n )\n\n registerPluginTransferResource(\n COMMERCE_DISCOUNTS_TRANSFER,\n deferred(\n async () => (await recordsServer()).discountsTransfer,\n { fields: catalog({ standard: DISCOUNT_TRANSFER_FIELDS }), matchKeys: DISCOUNT_MATCH_KEYS },\n ['count', 'plan', 'picklists'],\n ),\n { pluginId: BUNDLE_ID },\n )\n\n registerPluginTransferResource(\n COMMERCE_COUPONS_TRANSFER,\n deferred(\n async () => (await recordsServer()).couponsTransfer,\n { fields: catalog({ standard: COUPON_TRANSFER_FIELDS }), matchKeys: COUPON_MATCH_KEYS },\n ['count', 'plan'],\n ),\n { pluginId: BUNDLE_ID },\n )\n\n // Imported by ISSUING each card (AGL-3551): the plan decides each card and\n // the total, and a row it refuses is failed here with the reason. Only on\n // a plan with gift cards (`featureFlag: \"giftCards\"`, imports only,\n // AGL-3548), refused in the issue route's words.\n registerPluginTransferResource(\n COMMERCE_GIFT_CARDS_TRANSFER,\n {\n ...deferred(\n async () => (await giftCardsServer()).giftCardsTransfer,\n {\n fields: catalog({ standard: GIFT_CARD_TRANSFER_FIELDS }),\n matchKeys: GIFT_CARD_MATCH_KEYS,\n invariants: [\n {\n id: 'gift-card-issuable',\n label: 'A gift card the store can issue',\n check: (row) => (row as GiftCardPlannedRow).giftCard?.problem ?? null,\n },\n ],\n },\n ['count', 'plan'],\n ),\n planGate: async (subject) => (await import('./gift-cards-plan')).giftCardsPlanRefusal(subject.org),\n },\n { pluginId: BUNDLE_ID },\n )\n // A file of tracking numbers ships the orders it names (AGL-3613): each\n // row is a parcel, recorded through the order's own shipment paths, and\n // the buyer is emailed as for any shipment. Rows are matched by order\n // number with the resource's own `match`, so two parcels of one order are\n // two rows rather than a duplicate.\n registerPluginTransferResource(\n COMMERCE_TRACKING_TRANSFER,\n {\n fields: catalog({ standard: TRACKING_TRANSFER_FIELDS, groups: TRACKING_TRANSFER_GROUPS }),\n matchKeys: TRACKING_MATCH_KEYS,\n defaultPolicy: TRACKING_DEFAULT_POLICY,\n invariants: [\n {\n id: 'tracking-parcel',\n label: 'A parcel for an order that can ship',\n check: (row) => {\n const planned = row as TrackingPlannedRow\n return planned.verdict === 'update' && !planned.tracking ? 'This row records nothing.' : null\n },\n },\n ],\n readPage: async (ctx, cursor, fieldIds, options) =>\n (await trackingServer()).readTrackingPage(ctx, cursor, fieldIds, options),\n lookup: async (ctx, requests) => (await trackingServer()).lookupTrackingOrders(ctx, requests),\n match: (_ctx, input) => ({ outcomes: matchTrackingRows(input.rows, input.lookup) }),\n plan: async (ctx, input) => (await trackingServer()).planTracking(ctx, input),\n apply: async (ctx, chunk, writer) => (await trackingServer()).applyTracking(ctx, chunk, writer),\n revert: async (ctx, snapshot, decisions) => (await trackingServer()).revertTracking(ctx, snapshot, decisions),\n },\n { pluginId: BUNDLE_ID },\n )\n}\n"],"names":["registerPluginTransferResource","BUNDLE_ID","PRODUCT_ALIAS_DICTIONARIES","PRODUCT_DERIVED_FIELDS","PRODUCT_LOCKED_RULES","PRODUCT_MATCH_KEYS","PRODUCT_STANDARD_FIELDS","PRODUCT_SYSTEM_FIELDS","PRODUCT_TRANSFER_GROUPS","SHOPIFY_PRODUCT_PRESET","CATEGORY_MATCH_KEYS","CATEGORY_TRANSFER_FIELDS","COUPON_MATCH_KEYS","COUPON_TRANSFER_FIELDS","DISCOUNT_MATCH_KEYS","DISCOUNT_TRANSFER_FIELDS","GIFT_CARD_MATCH_KEYS","GIFT_CARD_TRANSFER_FIELDS","ORDER_TRANSFER_FIELDS","ORDER_TRANSFER_GROUPS","ORDER_SHIPPING_PRESETS","TRACKING_DEFAULT_POLICY","TRACKING_MATCH_KEYS","TRACKING_TRANSFER_FIELDS","TRACKING_TRANSFER_GROUPS","matchTrackingRows","COMMERCE_CATEGORIES_TRANSFER","COMMERCE_COUPONS_TRANSFER","COMMERCE_DISCOUNTS_TRANSFER","COMMERCE_GIFT_CARDS_TRANSFER","COMMERCE_ORDERS_TRANSFER","COMMERCE_PRODUCTS_TRANSFER","COMMERCE_TRACKING_TRANSFER","productsServer","recordsServer","giftCardsServer","trackingServer","deferred","load","data","hooks","call","name","args","impl","hook","readPage","lookup","apply","revert","Object","fromEntries","map","catalog","input","registerCommerceTransferResources","fields","standard","derived","system","groups","matchKeys","aliases","presets","lockedRules","invariants","id","label","check","row","commerce","problem","count","ctx","options","countProductRows","cursor","fieldIds","readProductsPage","requests","lookupProducts","picklists","ids","productPicklists","addPicklistValues","values","addProductCategories","plan","planProducts","chunk","writer","applyProducts","snapshot","decisions","revertProducts","pluginId","categoriesTransfer","ordersTransfer","fieldId","normalizer","discountsTransfer","couponsTransfer","giftCardsTransfer","giftCard","planGate","subject","giftCardsPlanRefusal","org","defaultPolicy","planned","verdict","tracking","readTrackingPage","lookupTrackingOrders","match","_ctx","outcomes","rows","planTracking","applyTracking","revertTracking"],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
*/ import { registerPluginTransferResourceUi } from "@aglyn/aglyn/plugin-manager/plugin-transfer-resources";
|
|
17
17
|
import { createElement, lazy, Suspense } from "react";
|
|
18
18
|
import { BUNDLE_ID } from "../constants/bundle-common.js";
|
|
19
|
-
import { COMMERCE_CATEGORIES_TRANSFER, COMMERCE_COUPONS_TRANSFER, COMMERCE_DISCOUNTS_TRANSFER, COMMERCE_GIFT_CARDS_TRANSFER, COMMERCE_ORDERS_TRANSFER, COMMERCE_PRODUCTS_TRANSFER, GIFT_CARD_CONFIRM_STEP_ID } from "./transfer-keys.js";
|
|
19
|
+
import { COMMERCE_CATEGORIES_TRANSFER, COMMERCE_COUPONS_TRANSFER, COMMERCE_DISCOUNTS_TRANSFER, COMMERCE_GIFT_CARDS_TRANSFER, COMMERCE_ORDERS_TRANSFER, COMMERCE_PRODUCTS_TRANSFER, COMMERCE_TRACKING_TRANSFER, GIFT_CARD_CONFIRM_STEP_ID } from "./transfer-keys.js";
|
|
20
20
|
/** The After import step loads with the wizard, not with the products page. */ const ProductImportOptionsStep = lazy(()=>import("./product-import-step.component.js"));
|
|
21
21
|
function AfterImportStep(props) {
|
|
22
22
|
return createElement(Suspense, {
|
|
@@ -58,6 +58,9 @@ function GiftCardConfirmStep(props) {
|
|
|
58
58
|
registerPluginTransferResourceUi(COMMERCE_DISCOUNTS_TRANSFER, {
|
|
59
59
|
label: 'Discounts'
|
|
60
60
|
}, owner);
|
|
61
|
+
registerPluginTransferResourceUi(COMMERCE_TRACKING_TRANSFER, {
|
|
62
|
+
label: 'Tracking numbers'
|
|
63
|
+
}, owner);
|
|
61
64
|
registerPluginTransferResourceUi(COMMERCE_COUPONS_TRANSFER, {
|
|
62
65
|
label: 'Coupons'
|
|
63
66
|
}, owner);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/transfer/register-transfer-ui.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n registerPluginTransferResourceUi,\n type TransferWizardStepProps,\n} from '@aglyn/aglyn/plugin-manager/plugin-transfer-resources'\nimport { createElement, lazy, Suspense } from 'react'\nimport { BUNDLE_ID } from '../constants/bundle-common'\nimport {\n COMMERCE_CATEGORIES_TRANSFER,\n COMMERCE_COUPONS_TRANSFER,\n COMMERCE_DISCOUNTS_TRANSFER,\n COMMERCE_GIFT_CARDS_TRANSFER,\n COMMERCE_ORDERS_TRANSFER,\n COMMERCE_PRODUCTS_TRANSFER,\n GIFT_CARD_CONFIRM_STEP_ID,\n} from './transfer-keys'\n\n/** The After import step loads with the wizard, not with the products page. */\nconst ProductImportOptionsStep = lazy(() => import('./product-import-step.component'))\n\nfunction AfterImportStep(props: TransferWizardStepProps) {\n return createElement(Suspense, { fallback: null }, createElement(ProductImportOptionsStep, props))\n}\n\n/** The gift card import's Confirm step loads with the wizard, not with the Gift cards card. */\nconst GiftCardConfirmStepBody = lazy(() => import('./gift-card-confirm-step.component'))\n\nfunction GiftCardConfirmStep(props: TransferWizardStepProps) {\n return createElement(Suspense, { fallback: null }, createElement(GiftCardConfirmStepBody, props))\n}\n\n/**\n * The client halves of the commerce transfer resources (AGL-3531): how the\n * wizard and the dialog name each, the products wizard's own After import\n * step, where the `productImport` zone sets what happens to new products,\n * and the gift card import's Confirm step (AGL-3551).\n */\nexport function registerCommerceTransferUi(): void {\n const owner = { pluginId: BUNDLE_ID }\n registerPluginTransferResourceUi(\n COMMERCE_PRODUCTS_TRANSFER,\n {\n label: 'Products',\n extraSteps: [\n { id: 'afterImport', label: 'After import', after: 'conflicts', component: AfterImportStep },\n ],\n },\n owner,\n )\n registerPluginTransferResourceUi(COMMERCE_CATEGORIES_TRANSFER, { label: 'Product categories' }, owner)\n registerPluginTransferResourceUi(COMMERCE_ORDERS_TRANSFER, { label: 'Orders' }, owner)\n registerPluginTransferResourceUi(COMMERCE_DISCOUNTS_TRANSFER, { label: 'Discounts' }, owner)\n registerPluginTransferResourceUi(COMMERCE_COUPONS_TRANSFER, { label: 'Coupons' }, owner)\n registerPluginTransferResourceUi(\n COMMERCE_GIFT_CARDS_TRANSFER,\n {\n label: 'Gift cards',\n // Every card and its value, and the total typed back (AGL-3551).\n extraSteps: [\n { id: GIFT_CARD_CONFIRM_STEP_ID, label: 'Confirm the cards', after: 'conflicts', component: GiftCardConfirmStep },\n ],\n },\n owner,\n )\n}\n"],"names":["registerPluginTransferResourceUi","createElement","lazy","Suspense","BUNDLE_ID","COMMERCE_CATEGORIES_TRANSFER","COMMERCE_COUPONS_TRANSFER","COMMERCE_DISCOUNTS_TRANSFER","COMMERCE_GIFT_CARDS_TRANSFER","COMMERCE_ORDERS_TRANSFER","COMMERCE_PRODUCTS_TRANSFER","GIFT_CARD_CONFIRM_STEP_ID","ProductImportOptionsStep","AfterImportStep","props","fallback","GiftCardConfirmStepBody","GiftCardConfirmStep","registerCommerceTransferUi","owner","pluginId","label","extraSteps","id","after","component"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,SACEA,gCAAgC,QAE3B,wDAAuD;AAC9D,SAASC,aAAa,EAAEC,IAAI,EAAEC,QAAQ,QAAQ,QAAO;AACrD,SAASC,SAAS,QAAQ,gCAA4B;AACtD,SACEC,4BAA4B,EAC5BC,yBAAyB,EACzBC,2BAA2B,EAC3BC,4BAA4B,EAC5BC,wBAAwB,EACxBC,0BAA0B,EAC1BC,yBAAyB,QACpB,qBAAiB;AAExB,6EAA6E,GAC7E,MAAMC,
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/transfer/register-transfer-ui.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n registerPluginTransferResourceUi,\n type TransferWizardStepProps,\n} from '@aglyn/aglyn/plugin-manager/plugin-transfer-resources'\nimport { createElement, lazy, Suspense } from 'react'\nimport { BUNDLE_ID } from '../constants/bundle-common'\nimport {\n COMMERCE_CATEGORIES_TRANSFER,\n COMMERCE_COUPONS_TRANSFER,\n COMMERCE_DISCOUNTS_TRANSFER,\n COMMERCE_GIFT_CARDS_TRANSFER,\n COMMERCE_ORDERS_TRANSFER,\n COMMERCE_PRODUCTS_TRANSFER,\n COMMERCE_TRACKING_TRANSFER,\n GIFT_CARD_CONFIRM_STEP_ID,\n} from './transfer-keys'\n\n/** The After import step loads with the wizard, not with the products page. */\nconst ProductImportOptionsStep = lazy(() => import('./product-import-step.component'))\n\nfunction AfterImportStep(props: TransferWizardStepProps) {\n return createElement(Suspense, { fallback: null }, createElement(ProductImportOptionsStep, props))\n}\n\n/** The gift card import's Confirm step loads with the wizard, not with the Gift cards card. */\nconst GiftCardConfirmStepBody = lazy(() => import('./gift-card-confirm-step.component'))\n\nfunction GiftCardConfirmStep(props: TransferWizardStepProps) {\n return createElement(Suspense, { fallback: null }, createElement(GiftCardConfirmStepBody, props))\n}\n\n/**\n * The client halves of the commerce transfer resources (AGL-3531): how the\n * wizard and the dialog name each, the products wizard's own After import\n * step, where the `productImport` zone sets what happens to new products,\n * and the gift card import's Confirm step (AGL-3551).\n */\nexport function registerCommerceTransferUi(): void {\n const owner = { pluginId: BUNDLE_ID }\n registerPluginTransferResourceUi(\n COMMERCE_PRODUCTS_TRANSFER,\n {\n label: 'Products',\n extraSteps: [\n { id: 'afterImport', label: 'After import', after: 'conflicts', component: AfterImportStep },\n ],\n },\n owner,\n )\n registerPluginTransferResourceUi(COMMERCE_CATEGORIES_TRANSFER, { label: 'Product categories' }, owner)\n registerPluginTransferResourceUi(COMMERCE_ORDERS_TRANSFER, { label: 'Orders' }, owner)\n registerPluginTransferResourceUi(COMMERCE_DISCOUNTS_TRANSFER, { label: 'Discounts' }, owner)\n registerPluginTransferResourceUi(COMMERCE_TRACKING_TRANSFER, { label: 'Tracking numbers' }, owner)\n registerPluginTransferResourceUi(COMMERCE_COUPONS_TRANSFER, { label: 'Coupons' }, owner)\n registerPluginTransferResourceUi(\n COMMERCE_GIFT_CARDS_TRANSFER,\n {\n label: 'Gift cards',\n // Every card and its value, and the total typed back (AGL-3551).\n extraSteps: [\n { id: GIFT_CARD_CONFIRM_STEP_ID, label: 'Confirm the cards', after: 'conflicts', component: GiftCardConfirmStep },\n ],\n },\n owner,\n )\n}\n"],"names":["registerPluginTransferResourceUi","createElement","lazy","Suspense","BUNDLE_ID","COMMERCE_CATEGORIES_TRANSFER","COMMERCE_COUPONS_TRANSFER","COMMERCE_DISCOUNTS_TRANSFER","COMMERCE_GIFT_CARDS_TRANSFER","COMMERCE_ORDERS_TRANSFER","COMMERCE_PRODUCTS_TRANSFER","COMMERCE_TRACKING_TRANSFER","GIFT_CARD_CONFIRM_STEP_ID","ProductImportOptionsStep","AfterImportStep","props","fallback","GiftCardConfirmStepBody","GiftCardConfirmStep","registerCommerceTransferUi","owner","pluginId","label","extraSteps","id","after","component"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,SACEA,gCAAgC,QAE3B,wDAAuD;AAC9D,SAASC,aAAa,EAAEC,IAAI,EAAEC,QAAQ,QAAQ,QAAO;AACrD,SAASC,SAAS,QAAQ,gCAA4B;AACtD,SACEC,4BAA4B,EAC5BC,yBAAyB,EACzBC,2BAA2B,EAC3BC,4BAA4B,EAC5BC,wBAAwB,EACxBC,0BAA0B,EAC1BC,0BAA0B,EAC1BC,yBAAyB,QACpB,qBAAiB;AAExB,6EAA6E,GAC7E,MAAMC,2BAA2BX,KAAK,IAAM,MAAM,CAAC;AAEnD,SAASY,gBAAgBC,KAA8B;IACrD,OAAOd,cAAcE,UAAU;QAAEa,UAAU;IAAK,GAAGf,cAAcY,0BAA0BE;AAC7F;AAEA,6FAA6F,GAC7F,MAAME,0BAA0Bf,KAAK,IAAM,MAAM,CAAC;AAElD,SAASgB,oBAAoBH,KAA8B;IACzD,OAAOd,cAAcE,UAAU;QAAEa,UAAU;IAAK,GAAGf,cAAcgB,yBAAyBF;AAC5F;AAEA;;;;;CAKC,GACD,OAAO,SAASI;IACd,MAAMC,QAAQ;QAAEC,UAAUjB;IAAU;IACpCJ,iCACEU,4BACA;QACEY,OAAO;QACPC,YAAY;YACV;gBAAEC,IAAI;gBAAeF,OAAO;gBAAgBG,OAAO;gBAAaC,WAAWZ;YAAgB;SAC5F;IACH,GACAM;IAEFpB,iCAAiCK,8BAA8B;QAAEiB,OAAO;IAAqB,GAAGF;IAChGpB,iCAAiCS,0BAA0B;QAAEa,OAAO;IAAS,GAAGF;IAChFpB,iCAAiCO,6BAA6B;QAAEe,OAAO;IAAY,GAAGF;IACtFpB,iCAAiCW,4BAA4B;QAAEW,OAAO;IAAmB,GAAGF;IAC5FpB,iCAAiCM,2BAA2B;QAAEgB,OAAO;IAAU,GAAGF;IAClFpB,iCACEQ,8BACA;QACEc,OAAO;QACP,iEAAiE;QACjEC,YAAY;YACV;gBAAEC,IAAIZ;gBAA2BU,OAAO;gBAAqBG,OAAO;gBAAaC,WAAWR;YAAoB;SACjH;IACH,GACAE;AAEJ"}
|
|
@@ -0,0 +1,23 @@
|
|
|
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 { TransferResourcePreset } from '@aglyn/aglyn/data-transfer';
|
|
18
|
+
export declare const PIRATE_SHIP_ORDER_PRESET: TransferResourcePreset;
|
|
19
|
+
export declare const SHIPPO_ORDER_PRESET: TransferResourcePreset;
|
|
20
|
+
export declare const EASYPOST_ORDER_PRESET: TransferResourcePreset;
|
|
21
|
+
export declare const GENERIC_SHIPPING_ORDER_PRESET: TransferResourcePreset;
|
|
22
|
+
/** The shipping presets, in the order the export dialog lists them. */
|
|
23
|
+
export declare const ORDER_SHIPPING_PRESETS: readonly TransferResourcePreset[];
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ /*
|
|
17
|
+
* THE SHIPPING PRESETS (AGL-3613): the orders a label tool still has to ship,
|
|
18
|
+
* laid out under each tool's own column names so the file uploads without
|
|
19
|
+
* remapping. Verified 2026-10-06 against each tool's help:
|
|
20
|
+
*
|
|
21
|
+
* - Pirate Ship takes any spreadsheet and maps its columns on the first
|
|
22
|
+
* upload; weight in ounces OR pounds, numbers only.
|
|
23
|
+
* - Shippo's order CSV template (`shippo_sample_csv_v3.csv`).
|
|
24
|
+
* - EasyPost's label CSV: `to_address.*`, `parcel.weight_oz`, `reference`.
|
|
25
|
+
* It also needs the sender, carrier and service, which a store's export
|
|
26
|
+
* cannot know; the guide says to add them before uploading.
|
|
27
|
+
*/ export const PIRATE_SHIP_ORDER_PRESET = {
|
|
28
|
+
id: 'pirate-ship',
|
|
29
|
+
label: 'Pirate Ship',
|
|
30
|
+
description: 'Pirate Ship’s spreadsheet upload: one row per order to ship, weight in ounces.',
|
|
31
|
+
fieldIds: [
|
|
32
|
+
'orderRef',
|
|
33
|
+
'shipName',
|
|
34
|
+
'shipEmail',
|
|
35
|
+
'shipPhone',
|
|
36
|
+
'shipLine1',
|
|
37
|
+
'shipLine2',
|
|
38
|
+
'shipCity',
|
|
39
|
+
'shipState',
|
|
40
|
+
'shipPostalCode',
|
|
41
|
+
'shipCountry',
|
|
42
|
+
'weightOz',
|
|
43
|
+
'itemsToShip'
|
|
44
|
+
],
|
|
45
|
+
headers: {
|
|
46
|
+
orderRef: 'Order ID',
|
|
47
|
+
shipName: 'Name',
|
|
48
|
+
shipEmail: 'Email',
|
|
49
|
+
shipPhone: 'Phone',
|
|
50
|
+
shipLine1: 'Address 1',
|
|
51
|
+
shipLine2: 'Address 2',
|
|
52
|
+
shipCity: 'City',
|
|
53
|
+
shipState: 'State',
|
|
54
|
+
shipPostalCode: 'Zip',
|
|
55
|
+
shipCountry: 'Country',
|
|
56
|
+
weightOz: 'Ounces',
|
|
57
|
+
itemsToShip: 'Items'
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
export const SHIPPO_ORDER_PRESET = {
|
|
61
|
+
id: 'shippo',
|
|
62
|
+
label: 'Shippo',
|
|
63
|
+
description: 'Shippo’s order CSV: its column names, with the order weight in ounces.',
|
|
64
|
+
fieldIds: [
|
|
65
|
+
'orderRef',
|
|
66
|
+
'shipName',
|
|
67
|
+
'shipEmail',
|
|
68
|
+
'shipPhone',
|
|
69
|
+
'shipLine1',
|
|
70
|
+
'shipLine2',
|
|
71
|
+
'shipCity',
|
|
72
|
+
'shipState',
|
|
73
|
+
'shipPostalCode',
|
|
74
|
+
'shipCountry',
|
|
75
|
+
'weightOz',
|
|
76
|
+
'weightUnit',
|
|
77
|
+
'itemsToShip'
|
|
78
|
+
],
|
|
79
|
+
headers: {
|
|
80
|
+
orderRef: 'Order Number',
|
|
81
|
+
shipName: 'Recipient Name',
|
|
82
|
+
shipEmail: 'Email',
|
|
83
|
+
shipPhone: 'Phone',
|
|
84
|
+
shipLine1: 'Street Line 1',
|
|
85
|
+
shipLine2: 'Street Line 2',
|
|
86
|
+
shipCity: 'City',
|
|
87
|
+
shipState: 'State/Province',
|
|
88
|
+
shipPostalCode: 'Zip/Postal Code',
|
|
89
|
+
shipCountry: 'Country',
|
|
90
|
+
weightOz: 'Order Weight',
|
|
91
|
+
weightUnit: 'Order Weight Unit',
|
|
92
|
+
itemsToShip: 'Item Title'
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
export const EASYPOST_ORDER_PRESET = {
|
|
96
|
+
id: 'easypost',
|
|
97
|
+
label: 'EasyPost',
|
|
98
|
+
description: 'EasyPost’s label CSV: the recipient and the parcel weight. Add your from address, carrier and service before uploading.',
|
|
99
|
+
fieldIds: [
|
|
100
|
+
'orderRef',
|
|
101
|
+
'shipName',
|
|
102
|
+
'shipPhone',
|
|
103
|
+
'shipEmail',
|
|
104
|
+
'shipLine1',
|
|
105
|
+
'shipLine2',
|
|
106
|
+
'shipCity',
|
|
107
|
+
'shipState',
|
|
108
|
+
'shipPostalCode',
|
|
109
|
+
'shipCountry',
|
|
110
|
+
'weightOz'
|
|
111
|
+
],
|
|
112
|
+
headers: {
|
|
113
|
+
orderRef: 'reference',
|
|
114
|
+
shipName: 'to_address.name',
|
|
115
|
+
shipPhone: 'to_address.phone',
|
|
116
|
+
shipEmail: 'to_address.email',
|
|
117
|
+
shipLine1: 'to_address.street1',
|
|
118
|
+
shipLine2: 'to_address.street2',
|
|
119
|
+
shipCity: 'to_address.city',
|
|
120
|
+
shipState: 'to_address.state',
|
|
121
|
+
shipPostalCode: 'to_address.zip',
|
|
122
|
+
shipCountry: 'to_address.country',
|
|
123
|
+
weightOz: 'parcel.weight_oz'
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
export const GENERIC_SHIPPING_ORDER_PRESET = {
|
|
127
|
+
id: 'shipping',
|
|
128
|
+
label: 'Shipping (any tool)',
|
|
129
|
+
description: 'Every shipping column under its own name, for any tool that maps columns on upload.',
|
|
130
|
+
fieldIds: [
|
|
131
|
+
'orderRef',
|
|
132
|
+
'date',
|
|
133
|
+
'shipName',
|
|
134
|
+
'shipEmail',
|
|
135
|
+
'shipPhone',
|
|
136
|
+
'shipLine1',
|
|
137
|
+
'shipLine2',
|
|
138
|
+
'shipCity',
|
|
139
|
+
'shipState',
|
|
140
|
+
'shipPostalCode',
|
|
141
|
+
'shipCountry',
|
|
142
|
+
'itemsToShip',
|
|
143
|
+
'unitsToShip',
|
|
144
|
+
'weightOz',
|
|
145
|
+
'weightLb',
|
|
146
|
+
'total'
|
|
147
|
+
]
|
|
148
|
+
};
|
|
149
|
+
/** The shipping presets, in the order the export dialog lists them. */ export const ORDER_SHIPPING_PRESETS = [
|
|
150
|
+
PIRATE_SHIP_ORDER_PRESET,
|
|
151
|
+
SHIPPO_ORDER_PRESET,
|
|
152
|
+
EASYPOST_ORDER_PRESET,
|
|
153
|
+
GENERIC_SHIPPING_ORDER_PRESET
|
|
154
|
+
];
|
|
155
|
+
|
|
156
|
+
//# sourceMappingURL=shipping-presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/transfer/shipping-presets.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 { TransferResourcePreset } from '@aglyn/aglyn/data-transfer'\n\n/*\n * THE SHIPPING PRESETS (AGL-3613): the orders a label tool still has to ship,\n * laid out under each tool's own column names so the file uploads without\n * remapping. Verified 2026-10-06 against each tool's help:\n *\n * - Pirate Ship takes any spreadsheet and maps its columns on the first\n * upload; weight in ounces OR pounds, numbers only.\n * - Shippo's order CSV template (`shippo_sample_csv_v3.csv`).\n * - EasyPost's label CSV: `to_address.*`, `parcel.weight_oz`, `reference`.\n * It also needs the sender, carrier and service, which a store's export\n * cannot know; the guide says to add them before uploading.\n */\nexport const PIRATE_SHIP_ORDER_PRESET: TransferResourcePreset = {\n id: 'pirate-ship',\n label: 'Pirate Ship',\n description: 'Pirate Ship’s spreadsheet upload: one row per order to ship, weight in ounces.',\n fieldIds: ['orderRef', 'shipName', 'shipEmail', 'shipPhone', 'shipLine1', 'shipLine2', 'shipCity', 'shipState', 'shipPostalCode', 'shipCountry', 'weightOz', 'itemsToShip'],\n headers: {\n orderRef: 'Order ID',\n shipName: 'Name',\n shipEmail: 'Email',\n shipPhone: 'Phone',\n shipLine1: 'Address 1',\n shipLine2: 'Address 2',\n shipCity: 'City',\n shipState: 'State',\n shipPostalCode: 'Zip',\n shipCountry: 'Country',\n weightOz: 'Ounces',\n itemsToShip: 'Items',\n },\n}\n\nexport const SHIPPO_ORDER_PRESET: TransferResourcePreset = {\n id: 'shippo',\n label: 'Shippo',\n description: 'Shippo’s order CSV: its column names, with the order weight in ounces.',\n fieldIds: ['orderRef', 'shipName', 'shipEmail', 'shipPhone', 'shipLine1', 'shipLine2', 'shipCity', 'shipState', 'shipPostalCode', 'shipCountry', 'weightOz', 'weightUnit', 'itemsToShip'],\n headers: {\n orderRef: 'Order Number',\n shipName: 'Recipient Name',\n shipEmail: 'Email',\n shipPhone: 'Phone',\n shipLine1: 'Street Line 1',\n shipLine2: 'Street Line 2',\n shipCity: 'City',\n shipState: 'State/Province',\n shipPostalCode: 'Zip/Postal Code',\n shipCountry: 'Country',\n weightOz: 'Order Weight',\n weightUnit: 'Order Weight Unit',\n itemsToShip: 'Item Title',\n },\n}\n\nexport const EASYPOST_ORDER_PRESET: TransferResourcePreset = {\n id: 'easypost',\n label: 'EasyPost',\n description: 'EasyPost’s label CSV: the recipient and the parcel weight. Add your from address, carrier and service before uploading.',\n fieldIds: ['orderRef', 'shipName', 'shipPhone', 'shipEmail', 'shipLine1', 'shipLine2', 'shipCity', 'shipState', 'shipPostalCode', 'shipCountry', 'weightOz'],\n headers: {\n orderRef: 'reference',\n shipName: 'to_address.name',\n shipPhone: 'to_address.phone',\n shipEmail: 'to_address.email',\n shipLine1: 'to_address.street1',\n shipLine2: 'to_address.street2',\n shipCity: 'to_address.city',\n shipState: 'to_address.state',\n shipPostalCode: 'to_address.zip',\n shipCountry: 'to_address.country',\n weightOz: 'parcel.weight_oz',\n },\n}\n\nexport const GENERIC_SHIPPING_ORDER_PRESET: TransferResourcePreset = {\n id: 'shipping',\n label: 'Shipping (any tool)',\n description: 'Every shipping column under its own name, for any tool that maps columns on upload.',\n fieldIds: ['orderRef', 'date', 'shipName', 'shipEmail', 'shipPhone', 'shipLine1', 'shipLine2', 'shipCity', 'shipState', 'shipPostalCode', 'shipCountry', 'itemsToShip', 'unitsToShip', 'weightOz', 'weightLb', 'total'],\n}\n\n/** The shipping presets, in the order the export dialog lists them. */\nexport const ORDER_SHIPPING_PRESETS: readonly TransferResourcePreset[] = [\n PIRATE_SHIP_ORDER_PRESET,\n SHIPPO_ORDER_PRESET,\n EASYPOST_ORDER_PRESET,\n GENERIC_SHIPPING_ORDER_PRESET,\n]\n"],"names":["PIRATE_SHIP_ORDER_PRESET","id","label","description","fieldIds","headers","orderRef","shipName","shipEmail","shipPhone","shipLine1","shipLine2","shipCity","shipState","shipPostalCode","shipCountry","weightOz","itemsToShip","SHIPPO_ORDER_PRESET","weightUnit","EASYPOST_ORDER_PRESET","GENERIC_SHIPPING_ORDER_PRESET","ORDER_SHIPPING_PRESETS"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAID;;;;;;;;;;;CAWC,GACD,OAAO,MAAMA,2BAAmD;IAC9DC,IAAI;IACJC,OAAO;IACPC,aAAa;IACbC,UAAU;QAAC;QAAY;QAAY;QAAa;QAAa;QAAa;QAAa;QAAY;QAAa;QAAkB;QAAe;QAAY;KAAc;IAC3KC,SAAS;QACPC,UAAU;QACVC,UAAU;QACVC,WAAW;QACXC,WAAW;QACXC,WAAW;QACXC,WAAW;QACXC,UAAU;QACVC,WAAW;QACXC,gBAAgB;QAChBC,aAAa;QACbC,UAAU;QACVC,aAAa;IACf;AACF,EAAC;AAED,OAAO,MAAMC,sBAA8C;IACzDjB,IAAI;IACJC,OAAO;IACPC,aAAa;IACbC,UAAU;QAAC;QAAY;QAAY;QAAa;QAAa;QAAa;QAAa;QAAY;QAAa;QAAkB;QAAe;QAAY;QAAc;KAAc;IACzLC,SAAS;QACPC,UAAU;QACVC,UAAU;QACVC,WAAW;QACXC,WAAW;QACXC,WAAW;QACXC,WAAW;QACXC,UAAU;QACVC,WAAW;QACXC,gBAAgB;QAChBC,aAAa;QACbC,UAAU;QACVG,YAAY;QACZF,aAAa;IACf;AACF,EAAC;AAED,OAAO,MAAMG,wBAAgD;IAC3DnB,IAAI;IACJC,OAAO;IACPC,aAAa;IACbC,UAAU;QAAC;QAAY;QAAY;QAAa;QAAa;QAAa;QAAa;QAAY;QAAa;QAAkB;QAAe;KAAW;IAC5JC,SAAS;QACPC,UAAU;QACVC,UAAU;QACVE,WAAW;QACXD,WAAW;QACXE,WAAW;QACXC,WAAW;QACXC,UAAU;QACVC,WAAW;QACXC,gBAAgB;QAChBC,aAAa;QACbC,UAAU;IACZ;AACF,EAAC;AAED,OAAO,MAAMK,gCAAwD;IACnEpB,IAAI;IACJC,OAAO;IACPC,aAAa;IACbC,UAAU;QAAC;QAAY;QAAQ;QAAY;QAAa;QAAa;QAAa;QAAa;QAAY;QAAa;QAAkB;QAAe;QAAe;QAAe;QAAY;QAAY;KAAQ;AACzN,EAAC;AAED,qEAAqE,GACrE,OAAO,MAAMkB,yBAA4D;IACvEtB;IACAkB;IACAE;IACAC;CACD,CAAA"}
|