@mohasinac/appkit 4.59.0 → 4.60.0
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/dist/.build-stamp.json +3 -3
- package/dist/_internal/client/features/layout/DashboardLayoutClient.js +62 -5
- package/dist/_internal/client/features/maintenance/views/MaintenanceDashboardView.js +2 -2
- package/dist/_internal/server/features/brands/actions.js +78 -4
- package/dist/_internal/server/features/checkout/actions.d.ts +36 -13
- package/dist/_internal/server/features/checkout/actions.js +668 -183
- package/dist/_internal/server/features/checkout/supplier-identity.js +18 -1
- package/dist/_internal/server/features/gateway-events/index.d.ts +10 -0
- package/dist/_internal/server/features/gateway-events/index.js +10 -0
- package/dist/_internal/server/features/gateway-events/ingest.d.ts +127 -0
- package/dist/_internal/server/features/gateway-events/ingest.js +188 -0
- package/dist/_internal/server/features/gateway-events/redact.d.ts +66 -0
- package/dist/_internal/server/features/gateway-events/redact.js +151 -0
- package/dist/_internal/server/features/grievance/actions.d.ts +63 -0
- package/dist/_internal/server/features/grievance/actions.js +173 -0
- package/dist/_internal/server/features/grievance/index.d.ts +8 -0
- package/dist/_internal/server/features/grievance/index.js +8 -0
- package/dist/_internal/server/features/grouped/data.js +28 -3
- package/dist/_internal/server/features/lottery/actions.js +99 -4
- package/dist/_internal/server/features/order-completion/actions.d.ts +92 -0
- package/dist/_internal/server/features/order-completion/actions.js +336 -0
- package/dist/_internal/server/features/order-completion/index.d.ts +7 -0
- package/dist/_internal/server/features/order-completion/index.js +7 -0
- package/dist/_internal/server/features/orders/actions.d.ts +13 -0
- package/dist/_internal/server/features/orders/actions.js +56 -2
- package/dist/_internal/server/features/orders/adapters.js +26 -0
- package/dist/_internal/server/features/orders/cancellation-refund.d.ts +116 -0
- package/dist/_internal/server/features/orders/cancellation-refund.js +466 -0
- package/dist/_internal/server/features/orders/index.d.ts +2 -1
- package/dist/_internal/server/features/orders/index.js +1 -1
- package/dist/_internal/server/features/orders/service.d.ts +60 -0
- package/dist/_internal/server/features/orders/service.js +74 -0
- package/dist/_internal/server/features/payment-cases/disputes.d.ts +76 -0
- package/dist/_internal/server/features/payment-cases/disputes.js +241 -0
- package/dist/_internal/server/features/payment-cases/index.d.ts +9 -0
- package/dist/_internal/server/features/payment-cases/index.js +9 -0
- package/dist/_internal/server/features/payouts/actions.d.ts +28 -3
- package/dist/_internal/server/features/payouts/actions.js +84 -10
- package/dist/_internal/server/features/points/adjust.d.ts +61 -0
- package/dist/_internal/server/features/points/adjust.js +121 -0
- package/dist/_internal/server/features/points/award.d.ts +65 -0
- package/dist/_internal/server/features/points/award.js +145 -0
- package/dist/_internal/server/features/price-index/market.d.ts +33 -0
- package/dist/_internal/server/features/price-index/market.js +54 -1
- package/dist/_internal/server/features/products/data.js +40 -22
- package/dist/_internal/server/features/protection-claims/actions.d.ts +72 -0
- package/dist/_internal/server/features/protection-claims/actions.js +228 -0
- package/dist/_internal/server/features/protection-claims/index.d.ts +8 -0
- package/dist/_internal/server/features/protection-claims/index.js +8 -0
- package/dist/_internal/server/features/refunds/actions.d.ts +20 -0
- package/dist/_internal/server/features/refunds/actions.js +259 -17
- package/dist/_internal/server/features/refunds/capacity.d.ts +29 -0
- package/dist/_internal/server/features/refunds/capacity.js +37 -0
- package/dist/_internal/server/features/reviews/actions.js +3 -2
- package/dist/_internal/server/features/search/index-build/sources.js +20 -1
- package/dist/_internal/server/features/shipping/reconcile.d.ts +10 -1
- package/dist/_internal/server/features/shipping/reconcile.js +34 -3
- package/dist/_internal/server/features/shipping/reimbursement.d.ts +117 -0
- package/dist/_internal/server/features/shipping/reimbursement.js +223 -0
- package/dist/_internal/server/features/stores/tabs.d.ts +19 -4
- package/dist/_internal/server/features/stores/tabs.js +24 -4
- package/dist/_internal/server/functions/https.d.ts +31 -1
- package/dist/_internal/server/functions/https.js +52 -1
- package/dist/_internal/server/functions/scheduled.d.ts +72 -1
- package/dist/_internal/server/functions/scheduled.js +124 -1
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +62 -16
- package/dist/_internal/server/jobs/core/boxRollupReconcile.d.ts +46 -0
- package/dist/_internal/server/jobs/core/boxRollupReconcile.js +142 -0
- package/dist/_internal/server/jobs/core/dailyDataCleanup.js +149 -1
- package/dist/_internal/server/jobs/core/dailyStatusDigest.d.ts +14 -0
- package/dist/_internal/server/jobs/core/dailyStatusDigest.js +79 -1
- package/dist/_internal/server/jobs/core/index.d.ts +2 -0
- package/dist/_internal/server/jobs/core/index.js +2 -0
- package/dist/_internal/server/jobs/core/marketPriceRollup.d.ts +64 -0
- package/dist/_internal/server/jobs/core/marketPriceRollup.js +153 -0
- package/dist/_internal/server/jobs/core/obligationSweep.d.ts +36 -0
- package/dist/_internal/server/jobs/core/obligationSweep.js +503 -0
- package/dist/_internal/server/jobs/core/paymentReconcile.d.ts +79 -0
- package/dist/_internal/server/jobs/core/paymentReconcile.js +614 -0
- package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +34 -0
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +35 -4
- package/dist/_internal/server/jobs/handlers/boxRollupReconcile.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/boxRollupReconcile.js +15 -0
- package/dist/_internal/server/jobs/handlers/countersReconcileNow.d.ts +65 -0
- package/dist/_internal/server/jobs/handlers/countersReconcileNow.js +89 -0
- package/dist/_internal/server/jobs/handlers/index.d.ts +5 -0
- package/dist/_internal/server/jobs/handlers/index.js +5 -0
- package/dist/_internal/server/jobs/handlers/marketPriceRollup.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/marketPriceRollup.js +2 -0
- package/dist/_internal/server/jobs/handlers/obligationSweep.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/obligationSweep.js +15 -0
- package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.js +30 -1
- package/dist/_internal/server/jobs/handlers/paymentReconcile.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/paymentReconcile.js +6 -0
- package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
- package/dist/_internal/shared/actions/action-registry.js +71 -0
- package/dist/_internal/shared/checkout/coupon-discount.d.ts +73 -0
- package/dist/_internal/shared/checkout/coupon-discount.js +103 -0
- package/dist/_internal/shared/checkout/lanes.d.ts +42 -0
- package/dist/_internal/shared/checkout/lanes.js +46 -0
- package/dist/_internal/shared/checkout/order-math.d.ts +149 -1
- package/dist/_internal/shared/checkout/order-math.js +251 -3
- package/dist/_internal/shared/checkout/refundable-base.d.ts +116 -0
- package/dist/_internal/shared/checkout/refundable-base.js +122 -0
- package/dist/_internal/shared/features/auctions/config.d.ts +14 -1
- package/dist/_internal/shared/features/auctions/config.js +30 -1
- package/dist/_internal/shared/features/brands/schema.d.ts +42 -0
- package/dist/_internal/shared/features/brands/schema.js +18 -0
- package/dist/_internal/shared/features/orders/refund-copy.d.ts +22 -0
- package/dist/_internal/shared/features/orders/refund-copy.js +34 -0
- package/dist/_internal/shared/features/print/label-profiles.d.ts +198 -0
- package/dist/_internal/shared/features/print/label-profiles.js +350 -0
- package/dist/_internal/shared/features/products/to-product-item.js +33 -5
- package/dist/_internal/shared/fees/calculator.d.ts +31 -2
- package/dist/_internal/shared/fees/calculator.js +103 -5
- package/dist/_internal/shared/fees/india-states.d.ts +195 -0
- package/dist/_internal/shared/fees/india-states.js +190 -0
- package/dist/_internal/shared/fees/payout-hold.d.ts +80 -0
- package/dist/_internal/shared/fees/payout-hold.js +74 -0
- package/dist/_internal/shared/obligations/deadlines.d.ts +94 -0
- package/dist/_internal/shared/obligations/deadlines.js +155 -0
- package/dist/_internal/shared/shipping/quote.d.ts +96 -0
- package/dist/_internal/shared/shipping/quote.js +67 -0
- package/dist/_internal/shared/time/business-days.d.ts +91 -0
- package/dist/_internal/shared/time/business-days.js +185 -0
- package/dist/cli/index.js +0 -2
- package/dist/client.d.ts +9 -4
- package/dist/client.js +26 -3
- package/dist/configs/tailwind.d.ts +0 -12
- package/dist/configs/tailwind.js +28 -15
- package/dist/constants/api-endpoints.d.ts +51 -9
- package/dist/constants/api-endpoints.js +23 -7
- package/dist/constants/index.d.ts +1 -1
- package/dist/constants/index.js +1 -1
- package/dist/contracts/index.d.ts +1 -1
- package/dist/contracts/payment.d.ts +131 -0
- package/dist/features/about/components/AboutView.js +1 -1
- package/dist/features/about/components/DeveloperView.js +5 -2
- package/dist/features/about/components/FAQPageView.js +2 -1
- package/dist/features/about/components/FeesView.js +2 -1
- package/dist/features/about/components/HelpPageView.js +2 -1
- package/dist/features/about/components/HowAuctionsWorkView.js +2 -1
- package/dist/features/about/components/HowCheckoutWorksView.js +2 -1
- package/dist/features/about/components/HowEmiWorksView.js +2 -1
- package/dist/features/about/components/HowOffersWorkView.js +2 -1
- package/dist/features/about/components/HowOrdersWorkView.js +2 -1
- package/dist/features/about/components/HowPayoutsWorkView.js +2 -1
- package/dist/features/about/components/HowPreOrdersWorkView.js +2 -1
- package/dist/features/about/components/HowReviewsWorkView.js +2 -1
- package/dist/features/about/components/PolicyPageView.js +2 -1
- package/dist/features/about/components/ProseHero.d.ts +73 -0
- package/dist/features/about/components/ProseHero.js +18 -0
- package/dist/features/about/components/SecurityPrivacyView.js +2 -1
- package/dist/features/about/components/ShippingPolicyView.js +2 -1
- package/dist/features/about/components/TrackOrderView.js +2 -1
- package/dist/features/about/components/UnauthorizedView.js +1 -1
- package/dist/features/about/index.d.ts +2 -0
- package/dist/features/about/index.js +5 -0
- package/dist/features/account/actions/address-actions.d.ts +26 -2
- package/dist/features/account/actions/address-actions.js +25 -1
- package/dist/features/account/components/BuyerShoppingGuideView.js +1 -1
- package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
- package/dist/features/account/components/UserOrdersView.js +17 -0
- package/dist/features/account/components/UserSidebar.js +1 -1
- package/dist/features/account/hooks/useNotifications.js +29 -0
- package/dist/features/admin/actions/admin-coupon-actions.js +36 -0
- package/dist/features/admin/components/AdminBeysView.js +2 -2
- package/dist/features/admin/components/AdminBlogEditorView.js +2 -2
- package/dist/features/admin/components/AdminBrandEditorView.js +32 -2
- package/dist/features/admin/components/AdminBundleEditorView.js +1 -1
- package/dist/features/admin/components/AdminCarouselEditorView.js +1 -1
- package/dist/features/admin/components/AdminCategoriesView.js +1 -1
- package/dist/features/admin/components/AdminCategoryEditorView.js +73 -17
- package/dist/features/admin/components/AdminContactEditorView.js +1 -1
- package/dist/features/admin/components/AdminCouponEditorView.js +26 -1
- package/dist/features/admin/components/AdminFaqEditorView.js +1 -1
- package/dist/features/admin/components/AdminFaqsView.js +2 -2
- package/dist/features/admin/components/AdminGatewayEventsView.d.ts +54 -0
- package/dist/features/admin/components/AdminGatewayEventsView.js +209 -0
- package/dist/features/admin/components/AdminGuideHubView.js +1 -1
- package/dist/features/admin/components/AdminMoneyCasesView.d.ts +60 -0
- package/dist/features/admin/components/AdminMoneyCasesView.js +287 -0
- package/dist/features/admin/components/AdminPartsView.js +2 -2
- package/dist/features/admin/components/AdminProductsView.js +75 -4
- package/dist/features/admin/components/AdminSidebar.js +2 -2
- package/dist/features/admin/components/AdminSiteSettingsView.js +65 -7
- package/dist/features/admin/components/AdminSublistingCategoriesView.js +2 -0
- package/dist/features/admin/components/AdminSupportTicketDetailView.js +1 -1
- package/dist/features/admin/components/AdminSupportTicketsView.js +2 -2
- package/dist/features/admin/components/AdminTesterChecklistView.js +2 -2
- package/dist/features/admin/components/AdminUsersView.js +72 -1
- package/dist/features/admin/components/AdminViewCards.d.ts +3 -1
- package/dist/features/admin/components/AdminViewCards.js +4 -4
- package/dist/features/admin/components/DataListingView.d.ts +28 -0
- package/dist/features/admin/components/DataListingView.js +175 -14
- package/dist/features/admin/components/DataTable.d.ts +12 -1
- package/dist/features/admin/components/DataTable.js +3 -3
- package/dist/features/admin/components/OwnerQuickActions.d.ts +1 -1
- package/dist/features/admin/components/OwnerQuickActions.js +60 -2
- package/dist/features/admin/components/RecordOwnerQuickActions.d.ts +1 -1
- package/dist/features/admin/components/RecordOwnerQuickActions.js +61 -14
- package/dist/features/admin/components/analytics/AdminStatCard.d.ts +35 -1
- package/dist/features/admin/components/analytics/AdminStatCard.js +77 -2
- package/dist/features/admin/components/index.d.ts +4 -0
- package/dist/features/admin/components/index.js +6 -0
- package/dist/features/admin/constants/filter-tabs.d.ts +156 -0
- package/dist/features/admin/constants/filter-tabs.js +106 -0
- package/dist/features/admin/repository/site-settings.repository.d.ts +22 -0
- package/dist/features/admin/repository/site-settings.repository.js +82 -1
- package/dist/features/admin/schemas/admin-editor-forms.d.ts +21 -0
- package/dist/features/admin/schemas/admin-editor-forms.js +44 -0
- package/dist/features/admin/schemas/firestore.js +5 -1
- package/dist/features/admin/schemas/site-settings-form.js +30 -1
- package/dist/features/auctions/actions/bid-actions.js +13 -1
- package/dist/features/auctions/components/AuctionBottomActions.js +2 -2
- package/dist/features/auctions/components/AuctionDetailPageView.js +3 -1
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +11 -0
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +5 -3
- package/dist/features/auctions/components/PlaceBidFormClient.d.ts +8 -1
- package/dist/features/auctions/components/PlaceBidFormClient.js +2 -2
- package/dist/features/audit-log/schemas/firestore.d.ts +28 -0
- package/dist/features/audit-log/schemas/firestore.js +14 -0
- package/dist/features/auth/permissions/constants.d.ts +17 -1
- package/dist/features/auth/permissions/constants.js +18 -0
- package/dist/features/blog/components/BlogPostView.js +1 -1
- package/dist/features/catalogue/components/AdminCatalogueApprovalsView.js +1 -1
- package/dist/features/categories/api/[id]/description-template/route.js +107 -1
- package/dist/features/categories/components/BrandDetailPageView.js +2 -2
- package/dist/features/categories/components/BreadcrumbTrail.js +7 -1
- package/dist/features/categories/components/BundleDetailView.js +1 -1
- package/dist/features/categories/components/CategoryDetailPageView.js +2 -2
- package/dist/features/categories/components/CategoryForm.js +12 -1
- package/dist/features/categories/components/CategoryTemplatePicker.js +38 -5
- package/dist/features/categories/repository/market-price-index.repository.d.ts +123 -0
- package/dist/features/categories/repository/market-price-index.repository.js +105 -0
- package/dist/features/categories/repository/price-observation.repository.d.ts +166 -0
- package/dist/features/categories/repository/price-observation.repository.js +132 -0
- package/dist/features/events/components/EventSaleBanner.js +1 -1
- package/dist/features/events/components/EventStatusBadge.js +1 -1
- package/dist/features/faq/components/FAQAccordion.js +2 -1
- package/dist/features/faq/components/FAQCategorySidebar.js +2 -2
- package/dist/features/faq/components/FAQHelpfulButtons.js +4 -4
- package/dist/features/faq/components/RelatedFAQs.js +1 -1
- package/dist/features/filters/FilterFacetSection.js +1 -1
- package/dist/features/filters/SwitchFilter.js +1 -1
- package/dist/features/gateway-events/repository/gateway-events.repository.d.ts +117 -0
- package/dist/features/gateway-events/repository/gateway-events.repository.js +274 -0
- package/dist/features/gateway-events/schemas/firestore.d.ts +217 -0
- package/dist/features/gateway-events/schemas/firestore.js +125 -0
- package/dist/features/gateway-events/schemas/index.d.ts +81 -0
- package/dist/features/gateway-events/schemas/index.js +79 -0
- package/dist/features/grouped/components/GroupedListingDetailView.js +1 -1
- package/dist/features/homepage/components/AnnouncementBar.js +37 -1
- package/dist/features/homepage/components/AnnouncementBar.style.css +30 -0
- package/dist/features/homepage/components/BrandsSection.js +1 -1
- package/dist/features/homepage/components/CTABannerSection.js +1 -1
- package/dist/features/homepage/components/FeaturedBundlesSection.js +14 -24
- package/dist/features/homepage/components/HeroCarousel.js +2 -2
- package/dist/features/homepage/components/SocialPostCard.js +1 -1
- package/dist/features/inventory/components/AdminMoveLedgerView.d.ts +7 -0
- package/dist/features/inventory/components/AdminMoveLedgerView.js +157 -0
- package/dist/features/inventory/components/AdminStorageBoxesView.d.ts +11 -0
- package/dist/features/inventory/components/AdminStorageBoxesView.js +168 -0
- package/dist/features/inventory/components/ReceiveStationView.d.ts +39 -0
- package/dist/features/inventory/components/ReceiveStationView.js +413 -0
- package/dist/features/inventory/components/operator-message.d.ts +29 -0
- package/dist/features/inventory/components/operator-message.js +41 -0
- package/dist/features/inventory/index.d.ts +13 -0
- package/dist/features/inventory/index.js +28 -0
- package/dist/features/inventory/repository/inventory-movements.repository.d.ts +97 -0
- package/dist/features/inventory/repository/inventory-movements.repository.js +186 -0
- package/dist/features/inventory/repository/inventory-placements.repository.d.ts +179 -0
- package/dist/features/inventory/repository/inventory-placements.repository.js +345 -0
- package/dist/features/inventory/repository/storage-boxes.repository.d.ts +83 -0
- package/dist/features/inventory/repository/storage-boxes.repository.js +127 -0
- package/dist/features/inventory/schemas/firestore.d.ts +197 -0
- package/dist/features/inventory/schemas/firestore.js +159 -0
- package/dist/features/layout/AppLayoutShell.d.ts +12 -1
- package/dist/features/layout/AppLayoutShell.js +25 -12
- package/dist/features/layout/AutoBreadcrumbs.js +162 -3
- package/dist/features/layout/AutoBreadcrumbs.style.css +45 -0
- package/dist/features/layout/BottomNavbar.d.ts +1 -1
- package/dist/features/layout/BottomNavbar.js +2 -2
- package/dist/features/media/MediaAvatar.js +1 -1
- package/dist/features/media/MediaImage.d.ts +24 -4
- package/dist/features/media/MediaImage.js +44 -4
- package/dist/features/media/MediaLightbox.js +1 -1
- package/dist/features/media/modals/ImageCropModal.js +1 -1
- package/dist/features/media/modals/ImageEditor.js +1 -1
- package/dist/features/media/upload/MediaUploadField.js +91 -3
- package/dist/features/obligations/constants/policies.d.ts +92 -0
- package/dist/features/obligations/constants/policies.js +378 -0
- package/dist/features/obligations/repository/obligations.repository.d.ts +68 -0
- package/dist/features/obligations/repository/obligations.repository.js +158 -0
- package/dist/features/obligations/schemas/firestore.d.ts +160 -0
- package/dist/features/obligations/schemas/firestore.js +87 -0
- package/dist/features/orders/actions/order-actions.d.ts +43 -4
- package/dist/features/orders/actions/order-actions.js +60 -3
- package/dist/features/orders/actions/refund-actions.js +70 -10
- package/dist/features/orders/components/OrderCompletionPanel.d.ts +27 -0
- package/dist/features/orders/components/OrderCompletionPanel.js +192 -0
- package/dist/features/orders/components/OrdersList.js +2 -2
- package/dist/features/orders/components/RefundHistoryTable.js +3 -1
- package/dist/features/orders/components/index.d.ts +2 -0
- package/dist/features/orders/components/index.js +6 -0
- package/dist/features/orders/constants/transitions.d.ts +59 -0
- package/dist/features/orders/constants/transitions.js +104 -0
- package/dist/features/orders/repository/orders.repository.d.ts +109 -6
- package/dist/features/orders/repository/orders.repository.js +464 -21
- package/dist/features/orders/schemas/firestore.d.ts +270 -0
- package/dist/features/orders/schemas/firestore.js +24 -0
- package/dist/features/orders/schemas/index.d.ts +61 -0
- package/dist/features/orders/schemas/index.js +22 -0
- package/dist/features/orders/types/index.d.ts +79 -0
- package/dist/features/parts/components/PartsIndexPageView.js +8 -1
- package/dist/features/payment-cases/repository/payment-cases.repository.d.ts +170 -0
- package/dist/features/payment-cases/repository/payment-cases.repository.js +342 -0
- package/dist/features/payment-cases/schemas/firestore.d.ts +229 -0
- package/dist/features/payment-cases/schemas/firestore.js +105 -0
- package/dist/features/payment-cases/schemas/resolve-form.d.ts +97 -0
- package/dist/features/payment-cases/schemas/resolve-form.js +114 -0
- package/dist/features/payments/repository/payout.repository.d.ts +0 -1
- package/dist/features/payments/repository/payout.repository.js +0 -1
- package/dist/features/points/repository/points.repository.d.ts +122 -0
- package/dist/features/points/repository/points.repository.js +304 -1
- package/dist/features/points/schemas/adjust-form.d.ts +58 -0
- package/dist/features/points/schemas/adjust-form.js +63 -0
- package/dist/features/points/schemas/firestore.d.ts +108 -1
- package/dist/features/points/schemas/firestore.js +84 -0
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -3
- package/dist/features/pre-orders/components/PreOrderBadge.js +1 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +1 -1
- package/dist/features/price-index/components/PriceIndexToolView.d.ts +23 -4
- package/dist/features/price-index/components/PriceIndexToolView.js +71 -6
- package/dist/features/price-index/market-stats.d.ts +82 -0
- package/dist/features/price-index/market-stats.js +230 -0
- package/dist/features/print/components/BoxLabelPrintView.d.ts +25 -0
- package/dist/features/print/components/BoxLabelPrintView.js +66 -0
- package/dist/features/print/components/LabelProfilePicker.d.ts +13 -0
- package/dist/features/print/components/LabelProfilePicker.js +38 -0
- package/dist/features/print/components/labels.d.ts +117 -0
- package/dist/features/print/components/labels.js +258 -0
- package/dist/features/print/components/labels.style.css +46 -0
- package/dist/features/print/index.d.ts +6 -0
- package/dist/features/print/index.js +16 -0
- package/dist/features/products/columns/productTableColumns.js +5 -4
- package/dist/features/products/components/MarketplaceBundleCard.js +2 -2
- package/dist/features/products/components/MarketplacePrizeDrawCard.js +6 -6
- package/dist/features/products/components/PrizeDrawCollage.js +1 -1
- package/dist/features/products/components/PrizeDrawItemsEditor.js +1 -1
- package/dist/features/products/components/PrizeRevealModal.js +2 -2
- package/dist/features/products/components/ProductDetailPageView.js +18 -4
- package/dist/features/products/components/ProductForm.js +34 -23
- package/dist/features/products/components/ProductGrid.js +86 -62
- package/dist/features/products/constants/card-badges.d.ts +97 -0
- package/dist/features/products/constants/card-badges.js +100 -0
- package/dist/features/products/repository/products.repository.js +34 -1
- package/dist/features/products/schemas/firestore.d.ts +46 -3
- package/dist/features/products/schemas/firestore.js +21 -0
- package/dist/features/promotions/components/PromotionsView.js +1 -1
- package/dist/features/promotions/repository/claimed-coupons.repository.d.ts +32 -0
- package/dist/features/promotions/repository/claimed-coupons.repository.js +58 -0
- package/dist/features/promotions/schemas/firestore.js +30 -3
- package/dist/features/promotions/schemas/index.d.ts +6 -6
- package/dist/features/protection-claims/repository/protection-claims.repository.d.ts +54 -0
- package/dist/features/protection-claims/repository/protection-claims.repository.js +174 -0
- package/dist/features/protection-claims/schemas/firestore.d.ts +168 -0
- package/dist/features/protection-claims/schemas/firestore.js +130 -0
- package/dist/features/reviews/actions/review-actions.js +3 -2
- package/dist/features/reviews/components/ReviewModal.js +1 -1
- package/dist/features/reviews/components/ReviewsList.js +1 -1
- package/dist/features/reviews/schemas/firestore.d.ts +20 -1
- package/dist/features/scams/constants/scam-types.d.ts +2 -0
- package/dist/features/scams/constants/scam-types.js +18 -0
- package/dist/features/scams/schemas/report-form.d.ts +3 -3
- package/dist/features/scams/schemas/report-form.js +26 -1
- package/dist/features/search/components/Search.js +9 -9
- package/dist/features/search/components/SearchResultsClient.js +18 -3
- package/dist/features/search/components/SearchResultsPageView.d.ts +1 -6
- package/dist/features/search/components/SearchResultsPageView.js +2 -2
- package/dist/features/seller/actions/offer-actions.js +16 -1
- package/dist/features/seller/actions/seller-actions.js +14 -3
- package/dist/features/seller/components/CategoryInlineSelect.js +75 -11
- package/dist/features/seller/components/PrintCenterView.d.ts +5 -0
- package/dist/features/seller/components/PrintCenterView.js +41 -30
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutRequestView.js +16 -5
- package/dist/features/seller/components/SellerPayoutSettingsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.d.ts +16 -0
- package/dist/features/seller/components/SellerProductShell.js +123 -13
- package/dist/features/seller/components/SellerReviewsView.js +4 -2
- package/dist/features/seller/components/SellerSidebar.js +1 -1
- package/dist/features/seller/schemas/coupon-form.d.ts +26 -0
- package/dist/features/seller/schemas/coupon-form.js +27 -0
- package/dist/features/seller/schemas/product-form.d.ts +3 -0
- package/dist/features/seller/schemas/product-form.js +5 -0
- package/dist/features/shell/FormShell.js +2 -2
- package/dist/features/shell/QuickFormDrawer.js +14 -0
- package/dist/features/shell/SectionForm.d.ts +19 -0
- package/dist/features/shell/SectionForm.js +133 -9
- package/dist/features/shell/SectionForm.style.css +54 -0
- package/dist/features/shipments/components/AdminShipmentsView.js +16 -1
- package/dist/features/shipments/repository/shipment-items.repository.d.ts +9 -0
- package/dist/features/shipments/repository/shipment-items.repository.js +14 -0
- package/dist/features/site-settings/components/ActionPermissionsManager.js +1 -1
- package/dist/features/sticker-trace/components/StickerCommitPanel.js +1 -1
- package/dist/features/store-extensions/schemas/report-review-form.d.ts +8 -8
- package/dist/features/stores/components/StoreGuideHubView.js +1 -1
- package/dist/features/stores/components/StoreHeader.js +1 -1
- package/dist/features/support/schemas/firestore.d.ts +73 -2
- package/dist/features/support/schemas/firestore.js +59 -0
- package/dist/index.d.ts +16 -24
- package/dist/index.js +38 -47
- package/dist/next/ErrorBoundary.js +1 -1
- package/dist/next/routing/route-map.d.ts +24 -0
- package/dist/next/routing/route-map.js +40 -0
- package/dist/providers/payment-manual/index.d.ts +15 -1
- package/dist/providers/payment-manual/index.js +37 -0
- package/dist/providers/payment-phonepe/index.d.ts +14 -1
- package/dist/providers/payment-phonepe/index.js +36 -0
- package/dist/providers/payment-razorpay/index.d.ts +44 -1
- package/dist/providers/payment-razorpay/index.js +99 -0
- package/dist/providers/shipping-shiprocket/index.d.ts +18 -0
- package/dist/providers/shipping-shiprocket/index.js +18 -0
- package/dist/schemas/registry.d.ts +44 -11
- package/dist/server-entry.d.ts +2 -0
- package/dist/server-entry.js +27 -0
- package/dist/server.d.ts +42 -0
- package/dist/server.js +93 -0
- package/dist/styles.css +418 -149
- package/dist/tailwind-utilities.css +1 -1
- package/dist/tokens/themes/default-dark.js +15 -12
- package/dist/tokens/themes/default-light.js +14 -11
- package/dist/tokens/tokens.css +106 -23
- package/dist/ui/DataTable.style.css +4 -4
- package/dist/ui/columns/cell-renderers.d.ts +20 -0
- package/dist/ui/columns/cell-renderers.js +26 -1
- package/dist/ui/columns/index.d.ts +1 -1
- package/dist/ui/columns/index.js +4 -1
- package/dist/ui/components/Badge.style.css +1 -1
- package/dist/ui/components/Breadcrumb.js +19 -1
- package/dist/ui/components/BulkActionBar.style.css +4 -4
- package/dist/ui/components/Button.style.css +1 -1
- package/dist/ui/components/Checkbox.style.css +1 -1
- package/dist/ui/components/FallbackShell.js +1 -1
- package/dist/ui/components/Form.d.ts +14 -1
- package/dist/ui/components/Form.js +2 -2
- package/dist/ui/components/FormField.js +18 -4
- package/dist/ui/components/FormField.style.css +43 -3
- package/dist/ui/components/GatedPrice.style.css +1 -1
- package/dist/ui/components/IconButton.style.css +1 -1
- package/dist/ui/components/Input.js +22 -1
- package/dist/ui/components/Input.style.css +38 -22
- package/dist/ui/components/ListingFilterDrawer.js +1 -1
- package/dist/ui/components/ListingToolbar.js +1 -1
- package/dist/ui/components/PaginatedSelect.js +0 -0
- package/dist/ui/components/Radio.style.css +1 -1
- package/dist/ui/components/Repeater.d.ts +53 -0
- package/dist/ui/components/Repeater.js +7 -0
- package/dist/ui/components/RichTextEditor.d.ts +20 -1
- package/dist/ui/components/RichTextEditor.js +23 -2
- package/dist/ui/components/Select.style.css +7 -21
- package/dist/ui/components/Semantic.js +27 -3
- package/dist/ui/components/TagInput.style.css +4 -9
- package/dist/ui/components/Textarea.style.css +4 -18
- package/dist/ui/components/Toggle.style.css +1 -1
- package/dist/ui/components/Typography.d.ts +3 -3
- package/dist/ui/components/Typography.js +15 -15
- package/dist/ui/components/ViewToggle.style.css +4 -4
- package/dist/ui/forms/AddAnotherToggle.d.ts +16 -0
- package/dist/ui/forms/AddAnotherToggle.js +56 -0
- package/dist/ui/forms/ColorPickerField.js +15 -2
- package/dist/ui/forms/FieldCheckbox.js +15 -2
- package/dist/ui/forms/FieldInput.d.ts +22 -1
- package/dist/ui/forms/FieldInput.js +19 -5
- package/dist/ui/forms/FieldLabel.d.ts +35 -0
- package/dist/ui/forms/FieldLabel.js +70 -0
- package/dist/ui/forms/FieldSelect.d.ts +4 -1
- package/dist/ui/forms/FieldSelect.js +27 -5
- package/dist/ui/forms/FieldTextarea.d.ts +4 -1
- package/dist/ui/forms/FieldTextarea.js +22 -5
- package/dist/ui/forms/FormShell.d.ts +17 -1
- package/dist/ui/forms/FormShell.js +36 -2
- package/dist/ui/forms/FormShell.style.css +41 -33
- package/dist/ui/forms/index.d.ts +5 -1
- package/dist/ui/forms/index.js +2 -0
- package/dist/ui/icons/icon-registry.d.ts +1 -0
- package/dist/ui/icons/icon-registry.js +17 -1
- package/dist/utils/id-generators.d.ts +80 -0
- package/dist/utils/id-generators.js +93 -0
- package/dist/utils/search-txt-builders.d.ts +12 -0
- package/dist/utils/search-txt-builders.js +17 -0
- package/package.json +1 -1
- package/scripts/seed-cli.mjs +106 -5
- package/dist/features/loyalty/api/admin/loyalty/grant/route.d.ts +0 -12
- package/dist/features/loyalty/api/admin/loyalty/grant/route.js +0 -38
- package/dist/features/loyalty/api/balance/route.d.ts +0 -12
- package/dist/features/loyalty/api/balance/route.js +0 -41
- package/dist/features/loyalty/api/earn/route.d.ts +0 -12
- package/dist/features/loyalty/api/earn/route.js +0 -38
- package/dist/features/loyalty/api/history/route.d.ts +0 -12
- package/dist/features/loyalty/api/history/route.js +0 -58
- package/dist/features/loyalty/api/redeem/route.d.ts +0 -12
- package/dist/features/loyalty/api/redeem/route.js +0 -38
- package/dist/features/loyalty/columns/index.d.ts +0 -17
- package/dist/features/loyalty/columns/index.js +0 -40
- package/dist/features/loyalty/components/CoinsDisplay.d.ts +0 -12
- package/dist/features/loyalty/components/CoinsDisplay.js +0 -10
- package/dist/features/loyalty/components/index.d.ts +0 -1
- package/dist/features/loyalty/components/index.js +0 -1
- package/dist/features/loyalty/hooks/useLoyaltyBalance.d.ts +0 -4
- package/dist/features/loyalty/hooks/useLoyaltyBalance.js +0 -25
- package/dist/features/loyalty/index.d.ts +0 -6
- package/dist/features/loyalty/index.js +0 -6
- package/dist/features/loyalty/manifest.d.ts +0 -2
- package/dist/features/loyalty/manifest.js +0 -16
- package/dist/features/loyalty/messages/en.json +0 -19
- package/dist/features/loyalty/repository/loyalty.repository.d.ts +0 -8
- package/dist/features/loyalty/repository/loyalty.repository.js +0 -22
- package/dist/features/loyalty/schemas/index.d.ts +0 -85
- package/dist/features/loyalty/schemas/index.js +0 -40
- package/dist/features/loyalty/server.d.ts +0 -6
- package/dist/features/loyalty/server.js +0 -6
- package/dist/features/loyalty/types/index.d.ts +0 -31
- package/dist/features/loyalty/types/index.js +0 -1
- package/dist/features/loyalty/types/loyalty-config.d.ts +0 -7
- package/dist/features/loyalty/types/loyalty-config.js +0 -1
- package/dist/features/loyalty/types/loyalty-math.d.ts +0 -9
- package/dist/features/loyalty/types/loyalty-math.js +0 -27
- package/dist/features/products/components/ProductOwnerQuickActions.d.ts +0 -11
- package/dist/features/products/components/ProductOwnerQuickActions.js +0 -120
|
@@ -3,20 +3,20 @@
|
|
|
3
3
|
.appkit-formshell {
|
|
4
4
|
display: flex;
|
|
5
5
|
flex-direction: column;
|
|
6
|
-
gap: var(--appkit-
|
|
6
|
+
gap: var(--appkit-space-6, 1.5rem);
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
/* Header */
|
|
10
10
|
.appkit-formshell__header {
|
|
11
11
|
display: flex;
|
|
12
12
|
flex-direction: column;
|
|
13
|
-
gap: var(--appkit-
|
|
13
|
+
gap: var(--appkit-space-4, 1rem);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
.appkit-formshell__title {
|
|
17
|
-
font-size: var(--appkit-
|
|
17
|
+
font-size: var(--appkit-text-lg, 1.125rem);
|
|
18
18
|
font-weight: 600;
|
|
19
|
-
color: var(--appkit-color-text
|
|
19
|
+
color: var(--appkit-color-text);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
/* ─── Step Indicator ──────────────────────────────────────────────────────── */
|
|
@@ -24,22 +24,22 @@
|
|
|
24
24
|
.appkit-formshell__step-indicator {
|
|
25
25
|
display: flex;
|
|
26
26
|
flex-wrap: wrap;
|
|
27
|
-
gap: var(--appkit-
|
|
27
|
+
gap: var(--appkit-space-1, 0.25rem);
|
|
28
28
|
border-bottom: 1px solid var(--appkit-color-border);
|
|
29
|
-
padding-bottom: var(--appkit-
|
|
29
|
+
padding-bottom: var(--appkit-space-3, 0.75rem);
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
.appkit-formshell__step-btn {
|
|
33
33
|
display: flex;
|
|
34
34
|
align-items: center;
|
|
35
|
-
gap: var(--appkit-
|
|
36
|
-
padding: var(--appkit-
|
|
35
|
+
gap: var(--appkit-space-2, 0.5rem);
|
|
36
|
+
padding: var(--appkit-space-1-5, 0.375rem) var(--appkit-space-3, 0.75rem);
|
|
37
37
|
border-radius: var(--appkit-radius-md, 0.375rem);
|
|
38
38
|
background: transparent;
|
|
39
39
|
border: 1px solid transparent;
|
|
40
|
-
color: var(--appkit-color-text-
|
|
40
|
+
color: var(--appkit-color-text-muted);
|
|
41
41
|
cursor: pointer;
|
|
42
|
-
font-size: var(--appkit-
|
|
42
|
+
font-size: var(--appkit-text-sm, 0.875rem);
|
|
43
43
|
transition: background 0.15s, border-color 0.15s, color 0.15s;
|
|
44
44
|
}
|
|
45
45
|
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
.appkit-formshell__step-btn--active {
|
|
52
|
-
background: var(--appkit-color-primary-
|
|
52
|
+
background: var(--appkit-color-primary-surface);
|
|
53
53
|
border-color: var(--appkit-color-primary);
|
|
54
54
|
color: var(--appkit-color-primary);
|
|
55
55
|
font-weight: 500;
|
|
@@ -68,8 +68,8 @@
|
|
|
68
68
|
width: 1.5rem;
|
|
69
69
|
height: 1.5rem;
|
|
70
70
|
border-radius: 9999px;
|
|
71
|
-
background: var(--appkit-color-surface-
|
|
72
|
-
font-size: var(--appkit-
|
|
71
|
+
background: var(--appkit-color-surface-raised);
|
|
72
|
+
font-size: var(--appkit-text-xs, 0.75rem);
|
|
73
73
|
font-weight: 600;
|
|
74
74
|
flex-shrink: 0;
|
|
75
75
|
}
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
height: auto;
|
|
104
104
|
border-radius: var(--appkit-radius-full, 9999px);
|
|
105
105
|
padding: 0 0.375rem;
|
|
106
|
-
font-size: var(--appkit-
|
|
106
|
+
font-size: var(--appkit-text-xs, 0.75rem);
|
|
107
107
|
font-weight: 600;
|
|
108
108
|
color: #fff;
|
|
109
109
|
line-height: 1.4;
|
|
@@ -125,13 +125,13 @@
|
|
|
125
125
|
.appkit-formshell__error-summary {
|
|
126
126
|
border: 1px solid var(--appkit-color-error, #dc2626);
|
|
127
127
|
border-radius: var(--appkit-radius-md, 0.375rem);
|
|
128
|
-
padding: var(--appkit-
|
|
128
|
+
padding: var(--appkit-space-3, 0.75rem);
|
|
129
129
|
background: rgb(from var(--appkit-color-error, #dc2626) r g b / 0.05);
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
.appkit-formshell__error-summary__title {
|
|
133
133
|
font-weight: 600;
|
|
134
|
-
margin-bottom: var(--appkit-
|
|
134
|
+
margin-bottom: var(--appkit-space-2, 0.5rem);
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
.appkit-formshell__error-summary__list {
|
|
@@ -139,7 +139,7 @@
|
|
|
139
139
|
padding-left: 1.25rem;
|
|
140
140
|
display: flex;
|
|
141
141
|
flex-direction: column;
|
|
142
|
-
gap: var(--appkit-
|
|
142
|
+
gap: var(--appkit-space-1, 0.25rem);
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
.appkit-formshell__error-summary__step-link {
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
.appkit-formshell__steps {
|
|
172
172
|
display: flex;
|
|
173
173
|
flex-direction: column;
|
|
174
|
-
gap: var(--appkit-
|
|
174
|
+
gap: var(--appkit-space-1, 0.25rem);
|
|
175
175
|
}
|
|
176
176
|
|
|
177
177
|
.appkit-formshell__step {
|
|
@@ -194,13 +194,13 @@
|
|
|
194
194
|
align-items: center;
|
|
195
195
|
justify-content: space-between;
|
|
196
196
|
width: 100%;
|
|
197
|
-
padding: var(--appkit-
|
|
198
|
-
background: var(--appkit-color-surface-
|
|
197
|
+
padding: var(--appkit-space-3, 0.75rem) var(--appkit-space-4, 1rem);
|
|
198
|
+
background: var(--appkit-color-surface-raised);
|
|
199
199
|
border: none;
|
|
200
200
|
cursor: pointer;
|
|
201
|
-
font-size: var(--appkit-
|
|
201
|
+
font-size: var(--appkit-text-sm, 0.875rem);
|
|
202
202
|
font-weight: 500;
|
|
203
|
-
color: var(--appkit-color-text
|
|
203
|
+
color: var(--appkit-color-text);
|
|
204
204
|
text-align: left;
|
|
205
205
|
}
|
|
206
206
|
|
|
@@ -244,17 +244,25 @@
|
|
|
244
244
|
* action row in the codebase. Every live footer had lost it.
|
|
245
245
|
*/
|
|
246
246
|
|
|
247
|
-
/* ─── Dark mode
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
247
|
+
/* ─── Dark mode ──────────────────────────────────────────────────────────────
|
|
248
|
+
*
|
|
249
|
+
* Only the error summary needs a dark rule now. The two that stood here —
|
|
250
|
+
* `__title` and `__step-accordion-btn` — each restated the base rule's own
|
|
251
|
+
* tokens once those names were corrected, because `--appkit-color-text` and
|
|
252
|
+
* `--appkit-color-surface-raised` already invert with the theme.
|
|
253
|
+
*
|
|
254
|
+
* What they used to say is the whole reason this file mattered:
|
|
255
|
+
*
|
|
256
|
+
* background: var(--appkit-color-surface-secondary-dark,
|
|
257
|
+
* var(--appkit-color-surface-secondary));
|
|
258
|
+
* color: var(--appkit-color-text-primary-dark, inherit);
|
|
259
|
+
*
|
|
260
|
+
* Neither name in that chain exists, so the background fell through to a
|
|
261
|
+
* second undefined name and the declaration was DROPPED — a transparent
|
|
262
|
+
* accordion header — while the colour fell through to `inherit`, so the text
|
|
263
|
+
* took whatever an ancestor happened to set. Every editor screen in the
|
|
264
|
+
* product renders through this file.
|
|
265
|
+
*/
|
|
258
266
|
.dark .appkit-formshell__error-summary {
|
|
259
267
|
background: rgb(from var(--appkit-color-error, #dc2626) r g b / 0.1);
|
|
260
268
|
}
|
package/dist/ui/forms/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { FormShellProviderProps, FormShellStep, FormShellNav, FormShellContextValue, UseFormShellStateResult, } from "./FormShell";
|
|
1
|
+
export type { FormShellProviderProps, FormShellStep, FormShellNav, FormShellContextValue, FormShellStateOptions, UseFormShellStateResult, } from "./FormShell";
|
|
2
2
|
export { FormShellProvider, FormShellContext, useFormShell, useFormShellState } from "./FormShell";
|
|
3
3
|
export { applyZodIssues, hasAttachableIssue } from "./apply-zod-issues";
|
|
4
4
|
export type { FieldInputProps } from "./FieldInput";
|
|
@@ -13,5 +13,9 @@ export type { ColorPickerFieldProps } from "./ColorPickerField";
|
|
|
13
13
|
export { ColorPickerField } from "./ColorPickerField";
|
|
14
14
|
export type { FormErrorSummaryProps } from "./FormErrorSummary";
|
|
15
15
|
export { FormErrorSummary } from "./FormErrorSummary";
|
|
16
|
+
export type { AddAnotherToggleProps } from "./AddAnotherToggle";
|
|
17
|
+
export { AddAnotherToggle, addAnotherSubmitLabel } from "./AddAnotherToggle";
|
|
18
|
+
export type { FieldLabelProps, LabelPlacement } from "./FieldLabel";
|
|
19
|
+
export { FieldLabel, LabelPlacementContext, useLabelPlacement, } from "./FieldLabel";
|
|
16
20
|
export type { FormErrorListProps } from "./FormErrorList";
|
|
17
21
|
export { FormErrorList } from "./FormErrorList";
|
package/dist/ui/forms/index.js
CHANGED
|
@@ -6,4 +6,6 @@ export { FieldCheckbox } from "./FieldCheckbox.js";
|
|
|
6
6
|
export { FieldTextarea } from "./FieldTextarea.js";
|
|
7
7
|
export { ColorPickerField } from "./ColorPickerField.js";
|
|
8
8
|
export { FormErrorSummary } from "./FormErrorSummary.js";
|
|
9
|
+
export { AddAnotherToggle, addAnotherSubmitLabel } from "./AddAnotherToggle.js";
|
|
10
|
+
export { FieldLabel, LabelPlacementContext, useLabelPlacement, } from "./FieldLabel.js";
|
|
9
11
|
export { FormErrorList } from "./FormErrorList.js";
|
|
@@ -65,6 +65,7 @@ export declare const ICONS: {
|
|
|
65
65
|
readonly stickers: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
66
66
|
readonly spares: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
67
67
|
readonly live: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
68
|
+
readonly points: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
68
69
|
};
|
|
69
70
|
/** Every valid `iconKey`. A typo is a compile error, not a silent blank. */
|
|
70
71
|
export type IconKey = keyof typeof ICONS;
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
* @tag consumers:Button,RowActionMenu,BulkActionBar,action-registry
|
|
40
40
|
* @tag sideEffects:none
|
|
41
41
|
*/
|
|
42
|
-
import { Archive, ArrowLeft, Ban, Bell, Check, CheckCircle, ChevronDown, Copy, Download, Edit, Eye, EyeOff, FileDown, Filter, Flag, Gavel, HelpCircle, Heart, Link as LinkIcon, Lock, Mail, Menu, MessageSquare, Moon, Package, Pause, Play, Plus, RefreshCw, Reply, RotateCcw, Save, Search, Send, Settings, Share2, ShieldCheck, ShoppingCart, Star, Sun, Scale, Tag, Trash2, TrendingUp, Truck, Upload, User, X, XCircle, CalendarClock, Gift, KeyRound, Palette, Sticker, Puzzle, PawPrint, } from "lucide-react";
|
|
42
|
+
import { Archive, ArrowLeft, Ban, Coins, Bell, Check, CheckCircle, ChevronDown, Copy, Download, Edit, Eye, EyeOff, FileDown, Filter, Flag, Gavel, HelpCircle, Heart, Link as LinkIcon, Lock, Mail, Menu, MessageSquare, Moon, Package, Pause, Play, Plus, RefreshCw, Reply, RotateCcw, Save, Search, Send, Settings, Share2, ShieldCheck, ShoppingCart, Star, Sun, Scale, Tag, Trash2, TrendingUp, Truck, Upload, User, X, XCircle, CalendarClock, Gift, KeyRound, Palette, Sticker, Puzzle, PawPrint, } from "lucide-react";
|
|
43
43
|
/**
|
|
44
44
|
* Semantic name → component.
|
|
45
45
|
*
|
|
@@ -134,6 +134,22 @@ export const ICONS = {
|
|
|
134
134
|
*/
|
|
135
135
|
spares: Puzzle,
|
|
136
136
|
live: PawPrint,
|
|
137
|
+
/*
|
|
138
|
+
* Buyer points. Minted rather than reused, which this registry's header
|
|
139
|
+
* allows only when nothing already means it — and nothing did.
|
|
140
|
+
*
|
|
141
|
+
* `deals` (Tag) was the closest and is wrong: a tag means a DISCOUNT ON A
|
|
142
|
+
* LISTING, while points are a buyer's balance. `analytics` (TrendingUp) is a
|
|
143
|
+
* chart. Reusing either would make the admin row action read as something it
|
|
144
|
+
* is not, and the glyph is what an operator scans before the label.
|
|
145
|
+
*
|
|
146
|
+
* `Coins` over `Wallet` deliberately: `points/schemas/firestore.ts` opens by
|
|
147
|
+
* stating this is NOT a wallet, and that the distinction is legal rather than
|
|
148
|
+
* stylistic (a wallet is stored value, which is PPI territory with RBI
|
|
149
|
+
* authorisation attached). An icon that says "wallet" would undercut the one
|
|
150
|
+
* property the feature must not have.
|
|
151
|
+
*/
|
|
152
|
+
points: Coins,
|
|
137
153
|
};
|
|
138
154
|
/**
|
|
139
155
|
* The ONLY sanctioned glyph sizes.
|
|
@@ -323,6 +323,35 @@ export declare function validateMediaFilename(filename: string): boolean;
|
|
|
323
323
|
* without changing the finalize request contract.
|
|
324
324
|
*/
|
|
325
325
|
export declare function deriveContextTypeFromFilename(filename: string): string | undefined;
|
|
326
|
+
/**
|
|
327
|
+
* ── 🛑 BARCODE vs SKU — the two formats, reconciled ─────────────────────────
|
|
328
|
+
*
|
|
329
|
+
* `barcodeId` held BOTH of these, which is why the audit found
|
|
330
|
+
* `LIR-1A99AEA8` printed directly above `LIR-BEY-X-005` in one list:
|
|
331
|
+
*
|
|
332
|
+
* · 23 seeded products carried a hand-authored SEMANTIC code
|
|
333
|
+
* (`LIR-BEY-BURS-001`, `LIR-BEY-X-005`) — meaningful, variable width,
|
|
334
|
+
* readable by a human, sortable by line.
|
|
335
|
+
* · everything created through the app got `generateBarcodeId`'s SHA-1
|
|
336
|
+
* form — meaningless, fixed width, verifiable only by scanning.
|
|
337
|
+
*
|
|
338
|
+
* One field was doing two jobs, and the jobs have opposite requirements. The
|
|
339
|
+
* split is the reconciliation:
|
|
340
|
+
*
|
|
341
|
+
* `barcodeId` THE MACHINE KEY. Fixed shape, uniform width, derived. This
|
|
342
|
+
* is what a CODE128 symbol encodes and what a scan resolves
|
|
343
|
+
* through `findByBarcodeId`.
|
|
344
|
+
* `sku` THE HUMAN KEY. Author-editable, meaningful, variable width.
|
|
345
|
+
* The 23 semantic codes belong here and have moved.
|
|
346
|
+
*
|
|
347
|
+
* 🛑 Why the width matters and is not cosmetic: a label's geometry is sized
|
|
348
|
+
* for its symbol, and Phase 5's thermal presets derive a ~42 mm minimum from
|
|
349
|
+
* the 12-character `LIR-XXXXXXXX` form. A variable-width code in the same
|
|
350
|
+
* field means one product's label fits its stock and the next one's does
|
|
351
|
+
* not — and `labelFitsProfile()` is specified to REPORT rather than scale,
|
|
352
|
+
* so the failure surfaces as a refusal to print rather than a squashed
|
|
353
|
+
* barcode. Keeping `barcodeId` uniform is what makes that check meaningful.
|
|
354
|
+
*/
|
|
326
355
|
/**
|
|
327
356
|
* Generates a scannable barcode identifier for a product listing.
|
|
328
357
|
* Returns `LIR-XXXXXXXX` (8 uppercase hex chars) derived from a SHA-1
|
|
@@ -331,3 +360,54 @@ export declare function deriveContextTypeFromFilename(filename: string): string
|
|
|
331
360
|
* Uses `globalThis.crypto.subtle` available in Node ≥18 and modern browsers.
|
|
332
361
|
*/
|
|
333
362
|
export declare function generateBarcodeId(productId: string): Promise<string>;
|
|
363
|
+
export interface StorageBoxIdInput {
|
|
364
|
+
/** `AC60-03` — exactly what is written on the physical label. */
|
|
365
|
+
code: string;
|
|
366
|
+
customId?: string;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* `storagebox-ac60-03` — a PURE SLUG, and that is the whole point.
|
|
370
|
+
*
|
|
371
|
+
* 🛑 No date, no random suffix, unlike `generateShipmentId` beside it. A
|
|
372
|
+
* second `AC60-03` *is the same physical box*: two registry rows for one
|
|
373
|
+
* object means "where is this" has two answers with no way to tell which
|
|
374
|
+
* shelf was meant. A generated id would permit exactly that, and the
|
|
375
|
+
* duplicate would look like a legitimate second box in every list.
|
|
376
|
+
*
|
|
377
|
+
* The same reasoning the slug table already applies to stores and categories,
|
|
378
|
+
* and the opposite of `stickersheet-`, where re-scanning one sheet is normal
|
|
379
|
+
* and a pure slug would make the second scan overwrite the first.
|
|
380
|
+
*/
|
|
381
|
+
export declare function generateStorageBoxId(input: StorageBoxIdInput): string;
|
|
382
|
+
export interface SkuInput {
|
|
383
|
+
/** The product's own id — the uniqueness source. */
|
|
384
|
+
productId: string;
|
|
385
|
+
/** Leaf category slug, for the readable middle segment. */
|
|
386
|
+
categorySlug?: string;
|
|
387
|
+
/** Brand name, used when there is no category to read. */
|
|
388
|
+
brand?: string;
|
|
389
|
+
/** A seller-authored SKU. Returned as-is when non-empty. */
|
|
390
|
+
customId?: string;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* `LIR-BURS-K3F9P` — the HUMAN key for a listing.
|
|
394
|
+
*
|
|
395
|
+
* 🛑 DETERMINISTIC, not sequential, and that is the decision worth knowing.
|
|
396
|
+
*
|
|
397
|
+
* The 23 seeded codes are sequential (`-001`, `-002`), which reads beautifully
|
|
398
|
+
* and cannot be generated without a per-line counter — i.e. a Firestore read
|
|
399
|
+
* and a write on every product create, a contended document, and a number
|
|
400
|
+
* that cannot be reproduced offline. Seed files are re-executed on every
|
|
401
|
+
* `appkit-seed` invocation, so a counter there would also break idempotency
|
|
402
|
+
* outright (Root Cause #25).
|
|
403
|
+
*
|
|
404
|
+
* So the sequence is replaced by a base36 hash of the product id: unique
|
|
405
|
+
* without coordination, identical on every run, and still prefixed with a
|
|
406
|
+
* readable line token so a human can tell a Burst from a Metal Fight at a
|
|
407
|
+
* glance. Hand-authored sequential codes remain legal — `customId` is
|
|
408
|
+
* returned untouched, which is how the seeded 23 keep theirs.
|
|
409
|
+
*
|
|
410
|
+
* 🛑 NOT fed into `barcodeId`. See the note above `generateBarcodeId`: the
|
|
411
|
+
* barcode must stay uniform-width for the label geometry to mean anything.
|
|
412
|
+
*/
|
|
413
|
+
export declare function generateSku(input: SkuInput): string;
|
|
@@ -545,6 +545,35 @@ export function validateMediaFilename(filename) {
|
|
|
545
545
|
export function deriveContextTypeFromFilename(filename) {
|
|
546
546
|
return MEDIA_FILENAME_PATTERNS.find(({ pattern }) => pattern.test(filename))?.context;
|
|
547
547
|
}
|
|
548
|
+
/**
|
|
549
|
+
* ── 🛑 BARCODE vs SKU — the two formats, reconciled ─────────────────────────
|
|
550
|
+
*
|
|
551
|
+
* `barcodeId` held BOTH of these, which is why the audit found
|
|
552
|
+
* `LIR-1A99AEA8` printed directly above `LIR-BEY-X-005` in one list:
|
|
553
|
+
*
|
|
554
|
+
* · 23 seeded products carried a hand-authored SEMANTIC code
|
|
555
|
+
* (`LIR-BEY-BURS-001`, `LIR-BEY-X-005`) — meaningful, variable width,
|
|
556
|
+
* readable by a human, sortable by line.
|
|
557
|
+
* · everything created through the app got `generateBarcodeId`'s SHA-1
|
|
558
|
+
* form — meaningless, fixed width, verifiable only by scanning.
|
|
559
|
+
*
|
|
560
|
+
* One field was doing two jobs, and the jobs have opposite requirements. The
|
|
561
|
+
* split is the reconciliation:
|
|
562
|
+
*
|
|
563
|
+
* `barcodeId` THE MACHINE KEY. Fixed shape, uniform width, derived. This
|
|
564
|
+
* is what a CODE128 symbol encodes and what a scan resolves
|
|
565
|
+
* through `findByBarcodeId`.
|
|
566
|
+
* `sku` THE HUMAN KEY. Author-editable, meaningful, variable width.
|
|
567
|
+
* The 23 semantic codes belong here and have moved.
|
|
568
|
+
*
|
|
569
|
+
* 🛑 Why the width matters and is not cosmetic: a label's geometry is sized
|
|
570
|
+
* for its symbol, and Phase 5's thermal presets derive a ~42 mm minimum from
|
|
571
|
+
* the 12-character `LIR-XXXXXXXX` form. A variable-width code in the same
|
|
572
|
+
* field means one product's label fits its stock and the next one's does
|
|
573
|
+
* not — and `labelFitsProfile()` is specified to REPORT rather than scale,
|
|
574
|
+
* so the failure surfaces as a refusal to print rather than a squashed
|
|
575
|
+
* barcode. Keeping `barcodeId` uniform is what makes that check meaningful.
|
|
576
|
+
*/
|
|
548
577
|
/**
|
|
549
578
|
* Generates a scannable barcode identifier for a product listing.
|
|
550
579
|
* Returns `LIR-XXXXXXXX` (8 uppercase hex chars) derived from a SHA-1
|
|
@@ -559,3 +588,67 @@ export async function generateBarcodeId(productId) {
|
|
|
559
588
|
.join("");
|
|
560
589
|
return `LIR-${hex.slice(0, 8).toUpperCase()}`;
|
|
561
590
|
}
|
|
591
|
+
/**
|
|
592
|
+
* `storagebox-ac60-03` — a PURE SLUG, and that is the whole point.
|
|
593
|
+
*
|
|
594
|
+
* 🛑 No date, no random suffix, unlike `generateShipmentId` beside it. A
|
|
595
|
+
* second `AC60-03` *is the same physical box*: two registry rows for one
|
|
596
|
+
* object means "where is this" has two answers with no way to tell which
|
|
597
|
+
* shelf was meant. A generated id would permit exactly that, and the
|
|
598
|
+
* duplicate would look like a legitimate second box in every list.
|
|
599
|
+
*
|
|
600
|
+
* The same reasoning the slug table already applies to stores and categories,
|
|
601
|
+
* and the opposite of `stickersheet-`, where re-scanning one sheet is normal
|
|
602
|
+
* and a pure slug would make the second scan overwrite the first.
|
|
603
|
+
*/
|
|
604
|
+
export function generateStorageBoxId(input) {
|
|
605
|
+
if (input.customId?.trim())
|
|
606
|
+
return input.customId.trim();
|
|
607
|
+
return `storagebox-${slugify(input.code)}`;
|
|
608
|
+
}
|
|
609
|
+
/** A short uppercase token from a slug or name — `beyblade-burst` -> `BURS`. */
|
|
610
|
+
function skuToken(input, length) {
|
|
611
|
+
const letters = (input ?? "").replace(/[^a-zA-Z0-9]/g, "").toUpperCase();
|
|
612
|
+
return letters.slice(0, length);
|
|
613
|
+
}
|
|
614
|
+
/**
|
|
615
|
+
* `LIR-BURS-K3F9P` — the HUMAN key for a listing.
|
|
616
|
+
*
|
|
617
|
+
* 🛑 DETERMINISTIC, not sequential, and that is the decision worth knowing.
|
|
618
|
+
*
|
|
619
|
+
* The 23 seeded codes are sequential (`-001`, `-002`), which reads beautifully
|
|
620
|
+
* and cannot be generated without a per-line counter — i.e. a Firestore read
|
|
621
|
+
* and a write on every product create, a contended document, and a number
|
|
622
|
+
* that cannot be reproduced offline. Seed files are re-executed on every
|
|
623
|
+
* `appkit-seed` invocation, so a counter there would also break idempotency
|
|
624
|
+
* outright (Root Cause #25).
|
|
625
|
+
*
|
|
626
|
+
* So the sequence is replaced by a base36 hash of the product id: unique
|
|
627
|
+
* without coordination, identical on every run, and still prefixed with a
|
|
628
|
+
* readable line token so a human can tell a Burst from a Metal Fight at a
|
|
629
|
+
* glance. Hand-authored sequential codes remain legal — `customId` is
|
|
630
|
+
* returned untouched, which is how the seeded 23 keep theirs.
|
|
631
|
+
*
|
|
632
|
+
* 🛑 NOT fed into `barcodeId`. See the note above `generateBarcodeId`: the
|
|
633
|
+
* barcode must stay uniform-width for the label geometry to mean anything.
|
|
634
|
+
*/
|
|
635
|
+
export function generateSku(input) {
|
|
636
|
+
if (input.customId?.trim())
|
|
637
|
+
return input.customId.trim();
|
|
638
|
+
const token = skuToken(input.categorySlug, 4) || skuToken(input.brand, 4) || "GEN";
|
|
639
|
+
/*
|
|
640
|
+
* A 5-char base36 hash of the id — ~60M values, which is far past what a
|
|
641
|
+
* physical inventory needs, and short enough to read aloud down a phone.
|
|
642
|
+
*
|
|
643
|
+
* `Math.imul` rather than a crypto digest because this must be callable
|
|
644
|
+
* SYNCHRONOUSLY from a form and from seed data. `generateBarcodeId` is
|
|
645
|
+
* async precisely because it uses `crypto.subtle`, and an async SKU would
|
|
646
|
+
* push a promise into every row builder.
|
|
647
|
+
*/
|
|
648
|
+
let hash = 0;
|
|
649
|
+
for (let i = 0; i < input.productId.length; i += 1) {
|
|
650
|
+
hash = Math.imul(hash ^ input.productId.charCodeAt(i), 0x01000193);
|
|
651
|
+
}
|
|
652
|
+
const suffix = (hash >>> 0).toString(36).toUpperCase().padStart(5, "0").slice(-5);
|
|
653
|
+
return `LIR-${token}-${suffix}`;
|
|
654
|
+
}
|
|
@@ -32,6 +32,18 @@ export declare function buildProductSearchTxt(p: Partial<ProductDocument>): stri
|
|
|
32
32
|
export declare function buildCategorySearchTxt(c: Partial<CategoryDocument>): string[];
|
|
33
33
|
/** stores — name, description, category. No payout details, no contact. */
|
|
34
34
|
export declare function buildStoreSearchTxt(s: Partial<StoreDocument>): string[];
|
|
35
|
+
/**
|
|
36
|
+
* storageBoxes — the printed code, the type, and where the box is.
|
|
37
|
+
*
|
|
38
|
+
* One builder per entity, matching every sibling here. The code is the field
|
|
39
|
+
* an operator actually types or scans; `location` is free text and is indexed
|
|
40
|
+
* so "shelf B" finds the boxes on it.
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildStorageBoxSearchTxt(x: {
|
|
43
|
+
code?: string;
|
|
44
|
+
boxType?: string;
|
|
45
|
+
location?: string;
|
|
46
|
+
}): string[];
|
|
35
47
|
/** events — title, description, type, tags. */
|
|
36
48
|
export declare function buildEventSearchTxt(e: Partial<EventDocument>): string[];
|
|
37
49
|
/**
|
|
@@ -43,6 +43,13 @@ export function buildProductSearchTxt(p) {
|
|
|
43
43
|
p.tags,
|
|
44
44
|
p.features,
|
|
45
45
|
p.condition,
|
|
46
|
+
/*
|
|
47
|
+
* The human stock key. 🛑 Existing rows keep their stored searchTxt until
|
|
48
|
+
* something re-saves them, so SKU search is only true after
|
|
49
|
+
* backfill-sku.mjs runs — which is why the admin placeholder does not
|
|
50
|
+
* promise it yet.
|
|
51
|
+
*/
|
|
52
|
+
p.sku,
|
|
46
53
|
p.card?.setName,
|
|
47
54
|
p.card?.cardNumber,
|
|
48
55
|
p.grading?.service,
|
|
@@ -163,6 +170,16 @@ export function buildStoreSearchTxt(s) {
|
|
|
163
170
|
s.storeCategory,
|
|
164
171
|
]);
|
|
165
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* storageBoxes — the printed code, the type, and where the box is.
|
|
175
|
+
*
|
|
176
|
+
* One builder per entity, matching every sibling here. The code is the field
|
|
177
|
+
* an operator actually types or scans; `location` is free text and is indexed
|
|
178
|
+
* so "shelf B" finds the boxes on it.
|
|
179
|
+
*/
|
|
180
|
+
export function buildStorageBoxSearchTxt(x) {
|
|
181
|
+
return buildSearchTxt([x.code, x.boxType, x.location]);
|
|
182
|
+
}
|
|
166
183
|
/** events — title, description, type, tags. */
|
|
167
184
|
export function buildEventSearchTxt(e) {
|
|
168
185
|
return buildSearchTxt([
|
package/package.json
CHANGED
package/scripts/seed-cli.mjs
CHANGED
|
@@ -273,7 +273,7 @@ const {
|
|
|
273
273
|
siteSettingsSeedData, faqSeedData,
|
|
274
274
|
wishlistsSeedData, historySeedData,
|
|
275
275
|
groupedListingsSeedData,
|
|
276
|
-
mediaAssetsSeedData,
|
|
276
|
+
mediaAssetsSeedData, mediaAssetsEditorialSeedData,
|
|
277
277
|
scammersSeedData, productFeaturesSeedData, taxCodesSeedData,
|
|
278
278
|
authenticityKnowledgeSeedData,
|
|
279
279
|
partGlossarySeedData, modelCompositionSeedData,
|
|
@@ -758,7 +758,10 @@ const SEED_DATA_MAP = {
|
|
|
758
758
|
groupedListings: groupedListingsSeedData,
|
|
759
759
|
// The other half of the wiring — load() short-circuits on an empty array, so
|
|
760
760
|
// the COLLECTION_MAP entry above does nothing on its own (Root Cause #90).
|
|
761
|
-
|
|
761
|
+
// Two source files, one collection: the taxonomy rows are GENERATED and
|
|
762
|
+
// rewritten wholesale by upload-taxonomy-images.mjs, so the editorial rows
|
|
763
|
+
// are kept beside them rather than inside that file.
|
|
764
|
+
mediaAssets: [...mediaAssetsSeedData, ...mediaAssetsEditorialSeedData],
|
|
762
765
|
scammerProfiles: scammersSeedData,
|
|
763
766
|
productFeatures: productFeaturesSeedData,
|
|
764
767
|
authenticityKnowledge: authenticityKnowledgeSeedData,
|
|
@@ -1137,6 +1140,79 @@ function stripAdminOwned(payload, ownedFields) {
|
|
|
1137
1140
|
|
|
1138
1141
|
const ADMIN_EDIT_PROTECTED = new Set(["partGlossary", "beys"]);
|
|
1139
1142
|
|
|
1143
|
+
/**
|
|
1144
|
+
* Fields a seed may CREATE but must never OVERWRITE — derived counters.
|
|
1145
|
+
*
|
|
1146
|
+
* 🛑 This exists because seeding silently zeroed the whole taxonomy. Every row
|
|
1147
|
+
* in `categories-seed-data.ts` hard-codes
|
|
1148
|
+
* `metrics: { productCount: 0, totalProductCount: 0, … }`, and `seed-cli`
|
|
1149
|
+
* merge-writes — a merge overwrites any key PRESENT in the payload. So
|
|
1150
|
+
* `appkit-seed load --collections categories` set every counter on every
|
|
1151
|
+
* category to zero.
|
|
1152
|
+
*
|
|
1153
|
+
* Measured 2026-10-21: after a demo purge, all 17 categories that should have
|
|
1154
|
+
* carried stock read `total=0` while their products were filed perfectly --
|
|
1155
|
+
* `category-beyblade-x` stored 0 against an actual 14. Every parent looked
|
|
1156
|
+
* empty. Reseeding to add four bundles then zeroed them a SECOND time,
|
|
1157
|
+
* minutes after they had been repaired.
|
|
1158
|
+
*
|
|
1159
|
+
* Nothing errors, because a wrong number is just a number. The symptom reaches
|
|
1160
|
+
* only a human looking at a page that says a category has nothing in it.
|
|
1161
|
+
*
|
|
1162
|
+
* 🛑 CREATE but not OVERWRITE, not "always strip" — `CategoryDocument.metrics`
|
|
1163
|
+
* is a REQUIRED field with three unguarded readers (`CategoryTableColumns`,
|
|
1164
|
+
* `CategoryTree`, `isFeaturedEligible`). Stripping it unconditionally would
|
|
1165
|
+
* leave a freshly seeded document violating its own type until the reconciler
|
|
1166
|
+
* first ran. Establishing zeros on create is correct; overwriting live counts
|
|
1167
|
+
* is not.
|
|
1168
|
+
*
|
|
1169
|
+
* The authority for these fields is `runCountersReconcile` plus the live
|
|
1170
|
+
* write triggers — see the `countersReconcileNow` Function for the on-demand
|
|
1171
|
+
* run that belongs immediately after a seed.
|
|
1172
|
+
*/
|
|
1173
|
+
const DERIVED_COUNTER_FIELDS = {
|
|
1174
|
+
categories: ["metrics"],
|
|
1175
|
+
stores: ["stats"],
|
|
1176
|
+
};
|
|
1177
|
+
|
|
1178
|
+
/**
|
|
1179
|
+
* The ids a collection already holds, when it has derived counters to protect.
|
|
1180
|
+
*
|
|
1181
|
+
* 🛑 A `.select()` projection — ids only, no document bodies — so this costs
|
|
1182
|
+
* reads but transfers almost nothing. It runs ONLY for the two collections in
|
|
1183
|
+
* `DERIVED_COUNTER_FIELDS`, and only when that collection is actually being
|
|
1184
|
+
* loaded; every other collection pays nothing.
|
|
1185
|
+
*
|
|
1186
|
+
* Fails OPEN to an empty set: if the existence probe itself fails we would
|
|
1187
|
+
* rather write the seed's zeros (recoverable by one reconcile) than abort a
|
|
1188
|
+
* load. The reconciler is the backstop either way.
|
|
1189
|
+
*/
|
|
1190
|
+
async function fetchExistingIds(db, collection) {
|
|
1191
|
+
const fields = DERIVED_COUNTER_FIELDS[collection];
|
|
1192
|
+
if (!fields) return null;
|
|
1193
|
+
try {
|
|
1194
|
+
const snap = await db.collection(collection).select().get();
|
|
1195
|
+
return new Set(snap.docs.map((d) => d.id));
|
|
1196
|
+
} catch (err) {
|
|
1197
|
+
console.log(
|
|
1198
|
+
` ⚠ could not probe existing ${collection} ids (${err?.message ?? err}) — derived counters may be reset; run countersReconcileNow after this load`,
|
|
1199
|
+
);
|
|
1200
|
+
return null;
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
/** Drop derived-counter keys when the document already exists. */
|
|
1205
|
+
function stripDerivedCounters(collection, payload, docId, existingIds) {
|
|
1206
|
+
const fields = DERIVED_COUNTER_FIELDS[collection];
|
|
1207
|
+
if (!fields || !existingIds || !existingIds.has(docId)) return payload;
|
|
1208
|
+
const out = {};
|
|
1209
|
+
for (const [k, v] of Object.entries(payload)) {
|
|
1210
|
+
if (fields.includes(k)) continue;
|
|
1211
|
+
out[k] = v;
|
|
1212
|
+
}
|
|
1213
|
+
return out;
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1140
1216
|
/**
|
|
1141
1217
|
* The fields a human owns, per document id, for one collection.
|
|
1142
1218
|
*
|
|
@@ -1190,6 +1266,20 @@ async function loadGeneric(colName, seed, firestoreCollection, stats) {
|
|
|
1190
1266
|
const removed = await purgeCollection(firestoreCollection);
|
|
1191
1267
|
if (VERBOSE) console.log(` purged ${removed} pre-existing docs`);
|
|
1192
1268
|
}
|
|
1269
|
+
/*
|
|
1270
|
+
* 🛑 Probed AFTER any replace-purge, never before. On a `REPLACE_ON_LOAD`
|
|
1271
|
+
* collection the purge removes every document, so an id set taken earlier
|
|
1272
|
+
* would claim rows exist that no longer do — and their derived counters
|
|
1273
|
+
* would then be stripped from a payload that is now a CREATE, leaving the
|
|
1274
|
+
* field absent on a required type. Probing here means a purged collection
|
|
1275
|
+
* correctly reports nothing existing.
|
|
1276
|
+
*/
|
|
1277
|
+
const existingIds = await fetchExistingIds(db, colName);
|
|
1278
|
+
if (existingIds && existingIds.size > 0) {
|
|
1279
|
+
console.log(
|
|
1280
|
+
` • ${colName}: preserving live ${DERIVED_COUNTER_FIELDS[colName].join("/")} on ${existingIds.size} existing doc(s)`,
|
|
1281
|
+
);
|
|
1282
|
+
}
|
|
1193
1283
|
const items = [];
|
|
1194
1284
|
for (const docData of seed) {
|
|
1195
1285
|
let { id, ...data } = docData;
|
|
@@ -1236,9 +1326,20 @@ async function loadGeneric(colName, seed, firestoreCollection, stats) {
|
|
|
1236
1326
|
* merge-write leaves an absent key exactly as it was, which is how the
|
|
1237
1327
|
* correction survives.
|
|
1238
1328
|
*/
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1329
|
+
/*
|
|
1330
|
+
* 🛑 Derived counters dropped on an EXISTING document, after everything
|
|
1331
|
+
* else, for the same reason admin-owned keys are: a merge-write leaves
|
|
1332
|
+
* an absent key exactly as it was, which is what preserves the live
|
|
1333
|
+
* value. Stripping earlier would let a later transform re-add it.
|
|
1334
|
+
*/
|
|
1335
|
+
data: stripDerivedCounters(
|
|
1336
|
+
colName,
|
|
1337
|
+
stripAdminOwned(
|
|
1338
|
+
encryptSeedPii(colName, stripUndefined(stampSeedPurpose(colName, data, docId))),
|
|
1339
|
+
adminOwned.get(docId),
|
|
1340
|
+
),
|
|
1341
|
+
docId,
|
|
1342
|
+
existingIds,
|
|
1242
1343
|
),
|
|
1243
1344
|
});
|
|
1244
1345
|
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* feat-loyalty — POST /api/admin/loyalty/grant
|
|
3
|
-
*
|
|
4
|
-
* Admin endpoint to grant loyalty points.
|
|
5
|
-
*
|
|
6
|
-
* Consumer stub:
|
|
7
|
-
* ```ts
|
|
8
|
-
* export { adminLoyaltyGrantPOST as POST } from "@mohasinac/feat-loyalty";
|
|
9
|
-
* ```
|
|
10
|
-
*/
|
|
11
|
-
import { NextResponse } from "next/server.js";
|
|
12
|
-
export declare function POST(request: Request): Promise<NextResponse>;
|