@mohasinac/appkit 4.53.0 → 4.53.1
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/scaffolds/AppShell.js +1 -1
- package/dist/_internal/server/features/auctions/og.d.ts +3 -1
- package/dist/_internal/server/features/auctions/og.js +3 -1
- package/dist/_internal/server/features/bundles/actions.js +1 -1
- package/dist/_internal/server/features/business-documents/download.d.ts +41 -0
- package/dist/_internal/server/features/business-documents/download.js +91 -0
- package/dist/_internal/server/features/categories/adapters.d.ts +1 -1
- package/dist/_internal/server/features/categories/adapters.js +10 -0
- package/dist/_internal/server/features/checkout/actions.d.ts +14 -0
- package/dist/_internal/server/features/checkout/actions.js +106 -12
- package/dist/_internal/server/features/checkout/bundle-expansion.js +17 -0
- package/dist/_internal/server/features/checkout/data.d.ts +22 -0
- package/dist/_internal/server/features/checkout/group-rule-revalidation.d.ts +34 -0
- package/dist/_internal/server/features/checkout/group-rule-revalidation.js +124 -0
- package/dist/_internal/server/features/checkout/supplier-identity.d.ts +55 -0
- package/dist/_internal/server/features/checkout/supplier-identity.js +81 -0
- package/dist/_internal/server/features/classified/metadata.js +1 -1
- package/dist/_internal/server/features/classified/og.d.ts +3 -1
- package/dist/_internal/server/features/classified/og.js +3 -1
- package/dist/_internal/server/features/digital-code/metadata.js +1 -1
- package/dist/_internal/server/features/digital-code/og.d.ts +3 -1
- package/dist/_internal/server/features/digital-code/og.js +3 -1
- package/dist/_internal/server/features/digital-code/pool.d.ts +19 -4
- package/dist/_internal/server/features/digital-code/pool.js +19 -4
- package/dist/_internal/server/features/live/metadata.js +1 -1
- package/dist/_internal/server/features/live/og.d.ts +3 -1
- package/dist/_internal/server/features/live/og.js +3 -1
- package/dist/_internal/server/features/messages/actions.js +1 -1
- package/dist/_internal/server/features/parts/og.js +1 -1
- package/dist/_internal/server/features/pre-orders/og.d.ts +3 -1
- package/dist/_internal/server/features/pre-orders/og.js +3 -1
- package/dist/_internal/server/features/price-index/search.d.ts +18 -0
- package/dist/_internal/server/features/price-index/search.js +47 -7
- package/dist/_internal/server/features/prize-draws/og.d.ts +3 -1
- package/dist/_internal/server/features/prize-draws/og.js +3 -1
- package/dist/_internal/server/features/products/group-members.d.ts +26 -0
- package/dist/_internal/server/features/products/group-members.js +7 -1
- package/dist/_internal/server/features/products/og.d.ts +3 -1
- package/dist/_internal/server/features/products/og.js +3 -1
- package/dist/_internal/server/features/search/scoped-sources.d.ts +26 -0
- package/dist/_internal/server/features/search/scoped-sources.js +252 -0
- package/dist/_internal/server/features/search/search-everything.d.ts +57 -0
- package/dist/_internal/server/features/search/search-everything.js +70 -20
- package/dist/_internal/server/features/seo/sitemap.js +6 -0
- package/dist/_internal/server/features/shared/listing-adapters.js +4 -2
- package/dist/_internal/server/features/sticker-trace/adapters.d.ts +11 -0
- package/dist/_internal/server/features/sticker-trace/adapters.js +1 -0
- package/dist/_internal/server/features/sticker-trace/promote-to-listings.d.ts +26 -0
- package/dist/_internal/server/features/sticker-trace/promote-to-listings.js +264 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +3 -1
- package/dist/_internal/server/features/sticker-trace/sheet-actions.js +32 -0
- package/dist/_internal/server/features/sticker-trace/storage.d.ts +20 -1
- package/dist/_internal/server/features/sticker-trace/storage.js +20 -1
- package/dist/_internal/server/features/stores/adapters.d.ts +1 -1
- package/dist/_internal/server/features/stores/adapters.js +16 -0
- package/dist/_internal/server/features/stores/index.d.ts +1 -0
- package/dist/_internal/server/features/stores/index.js +1 -0
- package/dist/_internal/server/features/stores/tabs.d.ts +25 -0
- package/dist/_internal/server/features/stores/tabs.js +122 -0
- package/dist/_internal/shared/checkout/rules/_defaults.js +0 -2
- package/dist/_internal/shared/checkout/rules/_limits.d.ts +14 -1
- package/dist/_internal/shared/checkout/rules/_limits.js +14 -1
- package/dist/_internal/shared/checkout/rules/_registry.js +2 -0
- package/dist/_internal/shared/checkout/rules/auction.rule.js +9 -1
- package/dist/_internal/shared/checkout/rules/bundle.rule.js +13 -0
- package/dist/_internal/shared/checkout/rules/index.d.ts +2 -0
- package/dist/_internal/shared/checkout/rules/index.js +9 -0
- package/dist/_internal/shared/checkout/rules/offer.rule.js +0 -1
- package/dist/_internal/shared/checkout/rules/payment-gate.d.ts +26 -0
- package/dist/_internal/shared/checkout/rules/payment-gate.js +133 -0
- package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +29 -8
- package/dist/_internal/shared/checkout/rules/spares.rule.d.ts +16 -0
- package/dist/_internal/shared/checkout/rules/spares.rule.js +5 -0
- package/dist/_internal/shared/checkout/rules/types.d.ts +26 -2
- package/dist/_internal/shared/config/schema.d.ts +122 -0
- package/dist/_internal/shared/features/cart/schema.js +3 -2
- package/dist/_internal/shared/features/products/group-rules.d.ts +75 -0
- package/dist/_internal/shared/features/products/group-rules.js +142 -0
- package/dist/_internal/shared/listing-types/_registry.d.ts +24 -0
- package/dist/_internal/shared/listing-types/_registry.js +39 -1
- package/dist/_internal/shared/listing-types/art/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/art/config.js +2 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/auction/config.js +2 -0
- package/dist/_internal/shared/listing-types/availability.js +48 -0
- package/dist/_internal/shared/listing-types/capabilities.js +19 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/classified/config.js +2 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +2 -0
- package/dist/_internal/shared/listing-types/feature-flags.js +1 -0
- package/dist/_internal/shared/listing-types/live/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/live/config.js +2 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +2 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +2 -0
- package/dist/_internal/shared/listing-types/spares/config.d.ts +74 -0
- package/dist/_internal/shared/listing-types/spares/config.js +60 -0
- package/dist/_internal/shared/listing-types/spares/ctas.d.ts +1 -0
- package/dist/_internal/shared/listing-types/spares/ctas.js +4 -0
- package/dist/_internal/shared/listing-types/spares/og.js +1 -0
- package/dist/_internal/shared/listing-types/spares/schema.d.ts +2 -0
- package/dist/_internal/shared/listing-types/spares/schema.js +3 -0
- package/dist/_internal/shared/listing-types/spares/seed-factory.d.ts +1 -0
- package/dist/_internal/shared/listing-types/spares/seed-factory.js +1 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/standard/config.js +2 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +2 -0
- package/dist/_internal/shared/search/match.d.ts +11 -0
- package/dist/_internal/shared/search/match.js +2 -1
- package/dist/_internal/shared/search/to-groups.d.ts +52 -0
- package/dist/_internal/shared/search/to-groups.js +141 -0
- package/dist/client.d.ts +8 -2
- package/dist/client.js +4 -1
- package/dist/constants/api-endpoints.d.ts +39 -15
- package/dist/constants/api-endpoints.js +28 -5
- package/dist/constants/cache-invalidation.js +3 -1
- package/dist/constants/field-names.d.ts +6 -0
- package/dist/constants/field-names.js +6 -0
- package/dist/features/about/components/PolicyPageView.d.ts +22 -2
- package/dist/features/about/components/PolicyPageView.js +14 -2
- package/dist/features/about/components/PublicProfileView.js +2 -1
- package/dist/features/about/components/ShippingPolicyView.js +42 -2
- package/dist/features/account/components/NotificationBell.js +1 -1
- package/dist/features/account/hooks/useProfileStats.js +5 -1
- package/dist/features/addresses/repository/addresses.repository.d.ts +16 -0
- package/dist/features/addresses/repository/addresses.repository.js +21 -0
- package/dist/features/admin/actions/admin-actions.js +16 -1
- package/dist/features/admin/components/AdminCategoryEditorView.js +19 -2
- package/dist/features/admin/components/AdminNavigationView.js +1 -1
- package/dist/features/admin/components/AdminPageHeader.js +1 -1
- package/dist/features/admin/components/AdminProductEditorView.js +17 -2
- package/dist/features/admin/components/AdminSidebar.js +1 -1
- package/dist/features/admin/components/AdminSiteSettingsView.js +39 -8
- package/dist/features/admin/components/AdminSparesView.d.ts +12 -0
- package/dist/features/admin/components/AdminSparesView.js +30 -0
- package/dist/features/admin/components/AdminUsersView.js +9 -7
- package/dist/features/admin/components/index.d.ts +2 -0
- package/dist/features/admin/components/index.js +1 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.js +7 -0
- package/dist/features/admin/constants/filter-tabs.d.ts +3 -0
- package/dist/features/admin/constants/filter-tabs.js +1 -0
- package/dist/features/admin/schemas/firestore.d.ts +26 -2
- package/dist/features/auctions/components/AuctionDetailPageView.js +4 -11
- package/dist/features/auth/repository/user.repository.d.ts +13 -0
- package/dist/features/auth/repository/user.repository.js +28 -0
- package/dist/features/auth/schemas/firestore.d.ts +2 -0
- package/dist/features/auth/schemas/firestore.js +2 -0
- package/dist/features/business-documents/repository/business-documents.repository.d.ts +58 -0
- package/dist/features/business-documents/repository/business-documents.repository.js +54 -0
- package/dist/features/business-documents/schemas/firestore.d.ts +105 -0
- package/dist/features/business-documents/schemas/firestore.js +75 -0
- package/dist/features/cart/actions/cart-actions.js +83 -6
- package/dist/features/cart/repository/cart.repository.js +32 -4
- package/dist/features/cart/schemas/firestore.d.ts +20 -0
- package/dist/features/cart/schemas/index.d.ts +2 -2
- package/dist/features/catalogue/components/PublicCatalogueItemDetailView.js +1 -1
- package/dist/features/categories/api/[id]/price-guidance/route.d.ts +42 -0
- package/dist/features/categories/api/[id]/price-guidance/route.js +113 -0
- package/dist/features/categories/components/BrandDetailPageView.js +19 -3
- package/dist/features/categories/components/BrandDetailTabs.js +10 -0
- package/dist/features/categories/components/CategoriesIndexListing.js +23 -8
- package/dist/features/categories/components/CategoryDetailPageView.js +141 -14
- package/dist/features/categories/components/CategoryDetailTabs.js +12 -0
- package/dist/features/categories/components/CategoryGrid.js +10 -1
- package/dist/features/categories/components/PriceGuidanceHint.d.ts +29 -0
- package/dist/features/categories/components/PriceGuidanceHint.js +61 -0
- package/dist/features/categories/components/SubcategoryCardRow.d.ts +27 -0
- package/dist/features/categories/components/SubcategoryCardRow.js +98 -0
- package/dist/features/categories/constants/category-tabs.d.ts +20 -25
- package/dist/features/categories/constants/category-tabs.js +22 -39
- package/dist/features/categories/repository/categories.repository.d.ts +12 -0
- package/dist/features/categories/repository/categories.repository.js +20 -0
- package/dist/features/categories/schemas/firestore.d.ts +22 -1
- package/dist/features/categories/schemas/firestore.js +10 -0
- package/dist/features/categories/schemas/index.d.ts +6 -0
- package/dist/features/categories/schemas/index.js +2 -0
- package/dist/features/categories/types/index.d.ts +8 -0
- package/dist/features/categories/utils/taxonomy-visual.d.ts +16 -3
- package/dist/features/categories/utils/taxonomy-visual.js +26 -10
- package/dist/features/classified/components/ClassifiedDetailPageView.js +4 -9
- package/dist/features/contact/components/ContactPageView.d.ts +33 -1
- package/dist/features/contact/components/ContactPageView.js +58 -28
- package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +4 -9
- package/dist/features/grouped/components/GroupedListingDetailView.js +9 -1
- package/dist/features/grouped/schemas/firestore.d.ts +5 -0
- package/dist/features/homepage/actions/homepage-section-actions.d.ts +3 -3
- package/dist/features/homepage/components/CollectionCardsSection.d.ts +28 -6
- package/dist/features/homepage/components/CollectionCardsSection.js +43 -8
- package/dist/features/homepage/components/HowItWorksSection.d.ts +23 -6
- package/dist/features/homepage/components/HowItWorksSection.js +4 -4
- package/dist/features/homepage/components/PromoGrid.d.ts +31 -2
- package/dist/features/homepage/components/PromoGrid.js +12 -3
- package/dist/features/homepage/components/TestimonialsCarousel.d.ts +34 -2
- package/dist/features/homepage/components/TestimonialsCarousel.js +1 -1
- package/dist/features/homepage/components/index.d.ts +0 -20
- package/dist/features/homepage/components/index.js +0 -11
- package/dist/features/homepage/index.d.ts +0 -2
- package/dist/features/homepage/index.js +0 -2
- package/dist/features/homepage/lib/section-renderer.d.ts +9 -0
- package/dist/features/homepage/lib/section-renderer.js +202 -58
- package/dist/features/homepage/repository/homepage-sections.repository.d.ts +35 -3
- package/dist/features/homepage/repository/homepage-sections.repository.js +58 -8
- package/dist/features/homepage/schemas/firestore.d.ts +106 -3
- package/dist/features/homepage/schemas/firestore.js +32 -2
- package/dist/features/homepage/schemas/index.d.ts +36 -7
- package/dist/features/homepage/schemas/index.js +39 -27
- package/dist/features/homepage/server.d.ts +0 -3
- package/dist/features/homepage/server.js +0 -3
- package/dist/features/homepage/types/index.d.ts +0 -47
- package/dist/features/homepage/types/index.js +49 -0
- package/dist/features/layout/AppLayoutShell.js +1 -1
- package/dist/features/layout/BottomNavItem.js +1 -1
- package/dist/features/layout/BottomSheet.js +1 -1
- package/dist/features/layout/TitleBarLayout.js +1 -1
- package/dist/features/live/components/LiveItemDetailPageView.js +4 -9
- package/dist/features/media/hooks/useMedia.js +17 -0
- package/dist/features/media/repository/media-assets.repository.d.ts +46 -0
- package/dist/features/media/repository/media-assets.repository.js +31 -0
- package/dist/features/media/trust-signals.d.ts +85 -0
- package/dist/features/media/trust-signals.js +126 -0
- package/dist/features/parts/components/PartDetailPageView.d.ts +14 -1
- package/dist/features/parts/components/PartDetailPageView.js +2 -2
- package/dist/features/parts/components/PartsIndexPageView.d.ts +11 -2
- package/dist/features/parts/components/PartsIndexPageView.js +2 -2
- package/dist/features/parts/components/PartsSearchBox.d.ts +9 -0
- package/dist/features/parts/components/PartsSearchBox.js +57 -0
- package/dist/features/parts/schemas/firestore.d.ts +149 -3
- package/dist/features/parts/schemas/firestore.js +184 -0
- package/dist/features/payments/repository/payout.repository.d.ts +15 -0
- package/dist/features/payments/repository/payout.repository.js +21 -0
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +4 -11
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +1 -1
- package/dist/features/price-index/components/PriceIndexToolView.d.ts +3 -1
- package/dist/features/price-index/components/PriceIndexToolView.js +92 -13
- package/dist/features/products/components/CompareOverlay.d.ts +18 -1
- package/dist/features/products/components/CompareOverlay.js +21 -2
- package/dist/features/products/components/CustomSectionTabContent.d.ts +31 -0
- package/dist/features/products/components/CustomSectionTabContent.js +29 -3
- package/dist/features/products/components/GroupMemberPicker.d.ts +19 -1
- package/dist/features/products/components/GroupMemberPicker.js +46 -8
- package/dist/features/products/components/GroupSettingsPanel.d.ts +11 -1
- package/dist/features/products/components/GroupSettingsPanel.js +91 -3
- package/dist/features/products/components/PrizeDrawDetailPageView.js +1 -1
- package/dist/features/products/components/PrizeDrawEntryActions.d.ts +15 -1
- package/dist/features/products/components/PrizeDrawEntryActions.js +70 -8
- package/dist/features/products/components/ProductDetailPageView.js +74 -15
- package/dist/features/products/components/ProductForm.d.ts +13 -1
- package/dist/features/products/components/ProductForm.js +16 -2
- package/dist/features/products/components/ProductsIndexListing.d.ts +16 -1
- package/dist/features/products/components/ProductsIndexListing.js +3 -3
- package/dist/features/products/components/ShowGroupSection.js +15 -2
- package/dist/features/products/components/SparesListView.d.ts +7 -0
- package/dist/features/products/components/SparesListView.js +39 -0
- package/dist/features/products/constants/action-defs.d.ts +1 -0
- package/dist/features/products/constants/action-defs.js +1 -0
- package/dist/features/products/repository/products.repository.d.ts +98 -0
- package/dist/features/products/repository/products.repository.js +235 -17
- package/dist/features/products/schemas/firestore.d.ts +97 -4
- package/dist/features/products/schemas/firestore.js +104 -0
- package/dist/features/products/schemas/index.d.ts +10 -19
- package/dist/features/products/schemas/index.js +23 -6
- package/dist/features/products/types/index.d.ts +45 -1
- package/dist/features/products/utils/group-member-image.d.ts +39 -0
- package/dist/features/products/utils/group-member-image.js +3 -0
- package/dist/features/products/utils/listing-badge-variant.js +4 -0
- package/dist/features/reviews/components/ReviewsList.js +1 -1
- package/dist/features/scams/components/ScamProfileView.js +1 -1
- package/dist/features/search/components/EntityTypeahead.d.ts +44 -0
- package/dist/features/search/components/EntityTypeahead.js +92 -0
- package/dist/features/search/components/Search.d.ts +12 -1
- package/dist/features/search/components/Search.js +47 -3
- package/dist/features/search/components/SearchFacetRail.d.ts +11 -0
- package/dist/features/search/components/SearchFacetRail.js +92 -0
- package/dist/features/search/components/SearchResultsClient.d.ts +33 -0
- package/dist/features/search/components/SearchResultsClient.js +103 -0
- package/dist/features/search/components/SearchResultsPageView.d.ts +15 -1
- package/dist/features/search/components/SearchResultsPageView.js +2 -2
- package/dist/features/search/components/index.d.ts +0 -6
- package/dist/features/search/components/index.js +0 -3
- package/dist/features/search/hooks/useNavSuggestions.d.ts +13 -0
- package/dist/features/search/hooks/useScopedSearch.d.ts +34 -0
- package/dist/features/search/hooks/useScopedSearch.js +114 -0
- package/dist/features/search/hooks/useSiteSearch.d.ts +26 -0
- package/dist/features/search/hooks/useSiteSearch.js +149 -0
- package/dist/features/search/index.d.ts +0 -4
- package/dist/features/search/index.js +0 -4
- package/dist/features/search/manifest.d.ts +12 -0
- package/dist/features/search/manifest.js +17 -2
- package/dist/features/search/server.d.ts +0 -3
- package/dist/features/search/server.js +0 -3
- package/dist/features/seller/components/SellerListingTypeView.d.ts +1 -1
- package/dist/features/seller/components/SellerListingTypeView.js +20 -0
- package/dist/features/seller/components/SellerPayoutSettingsView.js +35 -14
- package/dist/features/seller/components/SellerProductShell.d.ts +1 -1
- package/dist/features/seller/components/SellerProductShell.js +2 -1
- package/dist/features/seller/components/SellerSidebar.js +1 -1
- package/dist/features/seller/components/SellerSparesView.d.ts +17 -0
- package/dist/features/seller/components/SellerSparesView.js +6 -0
- package/dist/features/seller/components/index.d.ts +2 -0
- package/dist/features/seller/components/index.js +1 -0
- package/dist/features/shell/CommandPalette.js +1 -1
- package/dist/features/sticker-trace/schemas/firestore.d.ts +19 -0
- package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
- package/dist/features/stores/components/StoreDetailLayoutView.js +7 -82
- package/dist/features/stores/components/StoreHeader.js +1 -2
- package/dist/features/stores/components/StoreSparesPageView.d.ts +27 -0
- package/dist/features/stores/components/StoreSparesPageView.js +48 -0
- package/dist/features/stores/schemas/firestore.d.ts +19 -0
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +96 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +280 -45
- package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +54 -32
- package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +3 -2
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +73 -0
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +340 -0
- package/dist/features/tester/seed-data/authored/index.js +16 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +1 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +57 -0
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +77 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +58 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +5 -4
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +372 -18
- package/dist/index.d.ts +17 -57
- package/dist/index.js +35 -96
- package/dist/next/routing/route-map.d.ts +42 -1
- package/dist/next/routing/route-map.js +45 -0
- package/dist/providers/db-firebase/base.repository.d.ts +22 -0
- package/dist/providers/db-firebase/base.repository.js +36 -0
- package/dist/schemas/registry.d.ts +15 -6
- package/dist/security/blind-index-tokens.d.ts +54 -0
- package/dist/security/blind-index-tokens.js +152 -0
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.js +1 -1
- package/dist/security/settings-encryption.d.ts +35 -0
- package/dist/security/settings-encryption.js +91 -0
- package/dist/seed/_helpers/brand-rows.js +38 -14
- package/dist/seed/_helpers/category-forest.js +73 -7
- package/dist/seed/_helpers/category-images-generated.d.ts +25 -6
- package/dist/seed/_helpers/category-images-generated.js +81 -6
- package/dist/seed/_helpers/category-models.d.ts +1 -1
- package/dist/seed/_helpers/category-models.js +7 -1
- package/dist/seed/_helpers/category-parts-glossary-map.js +8 -0
- package/dist/seed/_helpers/category-parts.d.ts +1 -1
- package/dist/seed/_helpers/category-parts.js +50 -2
- package/dist/seed/_helpers/character-features.d.ts +1 -1
- package/dist/seed/_helpers/character-features.js +2 -1
- package/dist/seed/_helpers/franchise-rows.js +10 -2
- package/dist/seed/_helpers/media.d.ts +47 -0
- package/dist/seed/_helpers/media.js +34 -0
- package/dist/seed/authenticity-knowledge-seed-data.d.ts +49 -5
- package/dist/seed/authenticity-knowledge-seed-data.js +10001 -549
- package/dist/seed/categories-seed-data.js +124 -20
- package/dist/seed/grouped-listings-seed-data.js +16 -0
- package/dist/seed/homepage-sections-seed-data.js +94 -5
- package/dist/seed/index.d.ts +2 -3
- package/dist/seed/index.js +2 -2
- package/dist/seed/manifest.js +3 -0
- package/dist/seed/media-assets-seed-data.d.ts +1 -1
- package/dist/seed/media-assets-seed-data.js +746 -196
- package/dist/seed/model-composition-seed-data.js +122 -6
- package/dist/seed/part-glossary-seed-data.d.ts +1 -1
- package/dist/seed/part-glossary-seed-data.js +37219 -463
- package/dist/seed/products-art-seed-data.js +7 -18
- package/dist/seed/products-auctions-seed-data.js +56 -47
- package/dist/seed/products-beyblade-x-seed-data.d.ts +2 -0
- package/dist/seed/products-beyblade-x-seed-data.js +441 -0
- package/dist/seed/products-catalogue-seed-data.d.ts +5 -5
- package/dist/seed/products-catalogue-seed-data.js +1500 -1240
- package/dist/seed/products-classifieds-seed-data.js +9 -27
- package/dist/seed/products-digital-codes-seed-data.js +9 -18
- package/dist/seed/products-live-items-seed-data.js +5 -13
- package/dist/seed/products-preorders-seed-data.js +67 -33
- package/dist/seed/products-prize-draws-seed-data.js +8 -17
- package/dist/seed/products-spares-seed-data.d.ts +2 -0
- package/dist/seed/products-spares-seed-data.js +368 -0
- package/dist/seed/products-standard-seed-data.js +39 -126
- package/dist/seed/products-stickers-seed-data.js +59 -15
- package/dist/seed/site-settings-seed-data.js +8 -0
- package/dist/seo/json-ld.d.ts +25 -0
- package/dist/seo/json-ld.js +28 -0
- package/dist/server-entry.d.ts +3 -1
- package/dist/server-entry.js +2 -2
- package/dist/server.d.ts +9 -9
- package/dist/server.js +27 -25
- package/dist/styles.css +202 -1
- package/dist/tailwind-input.css +31 -17
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Accordion.js +1 -1
- package/dist/ui/components/Breadcrumb.js +1 -1
- package/dist/ui/components/DetailPageGallery.js +0 -2
- package/dist/ui/components/DetailPageHero.js +0 -1
- package/dist/ui/components/DetailPageTabs.js +1 -1
- package/dist/ui/components/Divider.js +3 -3
- package/dist/ui/components/GatedPrice.js +5 -1
- package/dist/ui/components/HorizontalScroller.js +1 -1
- package/dist/ui/components/ListingLayout.js +3 -3
- package/dist/ui/components/MediaTabs.style.css +81 -0
- package/dist/ui/components/Pagination.js +1 -1
- package/dist/ui/components/PendingValue.d.ts +45 -0
- package/dist/ui/components/PendingValue.js +7 -0
- package/dist/ui/components/Radio.style.css +119 -0
- package/dist/ui/components/RatingDisplay.js +2 -2
- package/dist/ui/components/SettingsSection.js +0 -2
- package/dist/ui/components/SiteLogo.js +3 -0
- package/dist/ui/components/SiteMark.js +3 -0
- package/dist/ui/components/SortDropdown.js +1 -1
- package/dist/ui/components/SpecTable.d.ts +58 -0
- package/dist/ui/components/SpecTable.js +8 -0
- package/dist/ui/components/StarRating.js +1 -3
- package/dist/ui/components/SummaryCard.js +1 -1
- package/dist/ui/components/index.style.css +1 -0
- package/dist/ui/icons/icon-registry.d.ts +1 -0
- package/dist/ui/icons/icon-registry.js +9 -1
- package/dist/ui/index.d.ts +4 -0
- package/dist/ui/index.js +2 -0
- package/dist/utils/search-txt-query.d.ts +12 -0
- package/dist/utils/search-txt-query.js +12 -0
- package/package.json +1 -1
- package/scripts/dedupe-peer-deps.mjs +18 -0
- package/scripts/seed-cli.mjs +135 -26
- package/scripts/verify-css-build.mjs +118 -37
- package/dist/_internal/server/features/search/actions.d.ts +0 -7
- package/dist/_internal/server/features/search/actions.js +0 -21
- package/dist/_internal/server/features/search/data.d.ts +0 -15
- package/dist/_internal/server/features/search/data.js +0 -18
- package/dist/_internal/server/features/search/index.d.ts +0 -3
- package/dist/_internal/server/features/search/index.js +0 -2
- package/dist/features/homepage/api/[id]/route.d.ts +0 -23
- package/dist/features/homepage/api/[id]/route.js +0 -103
- package/dist/features/homepage/api/route.d.ts +0 -14
- package/dist/features/homepage/api/route.js +0 -140
- package/dist/features/homepage/api/sections/[id]/route.d.ts +0 -26
- package/dist/features/homepage/api/sections/[id]/route.js +0 -95
- package/dist/features/homepage/api/sections/route.d.ts +0 -13
- package/dist/features/homepage/api/sections/route.js +0 -82
- package/dist/features/homepage/components/AdvertisementBanner.d.ts +0 -14
- package/dist/features/homepage/components/AdvertisementBanner.js +0 -35
- package/dist/features/homepage/components/BeforeAfterCard.d.ts +0 -9
- package/dist/features/homepage/components/BeforeAfterCard.js +0 -73
- package/dist/features/homepage/components/FeaturedResultsSection.d.ts +0 -17
- package/dist/features/homepage/components/FeaturedResultsSection.js +0 -17
- package/dist/features/homepage/components/HeroBanner.d.ts +0 -7
- package/dist/features/homepage/components/HeroBanner.js +0 -43
- package/dist/features/homepage/components/HeroSection.d.ts +0 -7
- package/dist/features/homepage/components/HeroSection.js +0 -6
- package/dist/features/homepage/components/HomepageSkeleton.d.ts +0 -2
- package/dist/features/homepage/components/HomepageSkeleton.js +0 -21
- package/dist/features/homepage/components/HomepageView.d.ts +0 -25
- package/dist/features/homepage/components/HomepageView.js +0 -5
- package/dist/features/homepage/components/NewsletterBanner.d.ts +0 -23
- package/dist/features/homepage/components/NewsletterBanner.js +0 -37
- package/dist/features/homepage/components/SiteFeaturesSection.d.ts +0 -14
- package/dist/features/homepage/components/SiteFeaturesSection.js +0 -11
- package/dist/features/homepage/components/TrustBadges.d.ts +0 -6
- package/dist/features/homepage/components/TrustBadges.js +0 -46
- package/dist/features/homepage/components/TrustIndicatorsSection.d.ts +0 -12
- package/dist/features/homepage/components/TrustIndicatorsSection.js +0 -11
- package/dist/features/homepage/hooks/useHomepage.d.ts +0 -11
- package/dist/features/homepage/hooks/useHomepage.js +0 -17
- package/dist/features/homepage/hooks/useHomepageSections.d.ts +0 -2
- package/dist/features/homepage/hooks/useHomepageSections.js +0 -10
- package/dist/features/homepage/repository/homepage.repository.d.ts +0 -11
- package/dist/features/homepage/repository/homepage.repository.js +0 -25
- package/dist/features/search/actions/index.d.ts +0 -1
- package/dist/features/search/actions/index.js +0 -1
- package/dist/features/search/actions/search-actions.d.ts +0 -18
- package/dist/features/search/actions/search-actions.js +0 -43
- package/dist/features/search/api/route.d.ts +0 -22
- package/dist/features/search/api/route.js +0 -128
- package/dist/features/search/columns/index.d.ts +0 -17
- package/dist/features/search/columns/index.js +0 -49
- package/dist/features/search/components/SearchFiltersRow.d.ts +0 -22
- package/dist/features/search/components/SearchFiltersRow.js +0 -21
- package/dist/features/search/components/SearchResultsSection.d.ts +0 -53
- package/dist/features/search/components/SearchResultsSection.js +0 -35
- package/dist/features/search/components/SearchView.d.ts +0 -27
- package/dist/features/search/components/SearchView.js +0 -8
- package/dist/features/search/hooks/useSearch.d.ts +0 -21
- package/dist/features/search/hooks/useSearch.js +0 -33
- package/dist/features/search/repository/search.repository.d.ts +0 -14
- package/dist/features/search/repository/search.repository.js +0 -59
- package/dist/features/search/schemas/index.d.ts +0 -70
- package/dist/features/search/schemas/index.js +0 -36
- package/dist/features/search/types/index.d.ts +0 -48
- package/dist/features/stores/components/StoreScopedSearch.d.ts +0 -17
- package/dist/features/stores/components/StoreScopedSearch.js +0 -27
- package/dist/seed/defaults/homepage-sections.d.ts +0 -2
- package/dist/seed/defaults/homepage-sections.js +0 -60
- package/dist/seed/factories/homepage-section.factory.d.ts +0 -10
- package/dist/seed/factories/homepage-section.factory.js +0 -13
- /package/dist/{features/search/types/index.js → _internal/shared/listing-types/spares/og.d.ts} +0 -0
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
* @tag sideEffects:none
|
|
52
52
|
*/
|
|
53
53
|
import { CATEGORY_FIELDS } from "../constants/field-names.js";
|
|
54
|
-
import { seedPhoto } from "./_helpers/media.js";
|
|
54
|
+
import { seedPhoto, isSeedPlaceholderImage } from "./_helpers/media.js";
|
|
55
55
|
import { buildCategoryTree } from "./_helpers/category-tree.js";
|
|
56
56
|
import { withCategorySearchTxt } from "./_helpers/search-txt-wrappers.js";
|
|
57
57
|
import { CATEGORY_FOREST } from "./_helpers/category-forest.js";
|
|
@@ -61,8 +61,9 @@ import { MODEL_LEAF_COUNT } from "./_helpers/category-models.js";
|
|
|
61
61
|
import { PART_LEAF_COUNT } from "./_helpers/category-parts.js";
|
|
62
62
|
import { MARKET_BAND_LEAF_IDS } from "./_helpers/category-content.js";
|
|
63
63
|
import { GENERATED_CATEGORY_CONTENT, GENERATED_CATEGORY_CONTENT_COUNT, } from "./_helpers/category-content-generated.js";
|
|
64
|
-
import { GENERATED_CATEGORY_IMAGES, GENERATED_CATEGORY_IMAGE_COUNT, } from "./_helpers/category-images-generated.js";
|
|
64
|
+
import { GENERATED_CATEGORY_IMAGES, GENERATED_CATEGORY_IMAGE_COUNT, GENERATED_CATEGORY_HASBRO_IMAGES, } from "./_helpers/category-images-generated.js";
|
|
65
65
|
import { productsStandardSeedData } from "./products-standard-seed-data.js";
|
|
66
|
+
import { productsBeybladeXSeedData } from "./products-beyblade-x-seed-data.js";
|
|
66
67
|
const NOW = new Date();
|
|
67
68
|
const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
|
|
68
69
|
const emptyMetrics = {
|
|
@@ -228,19 +229,36 @@ const franchiseRows = buildFranchiseRows({
|
|
|
228
229
|
* Deriving from the members' own chains means the union cannot disagree with
|
|
229
230
|
* them, and a member whose chain moves updates every bundle holding it.
|
|
230
231
|
*/
|
|
231
|
-
|
|
232
|
+
/*
|
|
233
|
+
* Both real-product arrays, not just the standard one.
|
|
234
|
+
*
|
|
235
|
+
* `productsBeybladeXSeedData` was added 2026-10-19 as a separate file (real,
|
|
236
|
+
* wiki-verified Beyblade X listings under store-letitrip-official). A bundle
|
|
237
|
+
* may legitimately hold one of those, and resolving only the standard array
|
|
238
|
+
* would make `bundleCategorySlugsFor` throw "not in productsStandardSeedData"
|
|
239
|
+
* for a product that genuinely exists — which is exactly what happened when
|
|
240
|
+
* the two fictional X fixtures this file's bundles used to reference were
|
|
241
|
+
* removed in favour of real ones.
|
|
242
|
+
*/
|
|
243
|
+
const PRODUCT_CHAINS = new Map([...productsStandardSeedData, ...productsBeybladeXSeedData].map((p) => [
|
|
244
|
+
String(p.id),
|
|
245
|
+
(p.categorySlugs ?? []),
|
|
246
|
+
]));
|
|
232
247
|
function bundleCategorySlugsFor(productIds) {
|
|
233
248
|
const out = [];
|
|
234
249
|
for (const id of productIds) {
|
|
235
250
|
const chain = PRODUCT_CHAINS.get(id);
|
|
236
251
|
/*
|
|
237
|
-
* A member missing from the
|
|
238
|
-
* past: the bundle would silently lose that member's categories and
|
|
239
|
-
* Bundles tab would under-report.
|
|
240
|
-
*
|
|
252
|
+
* A member missing from the real-product seeds is a BUG, not something to
|
|
253
|
+
* shrug past: the bundle would silently lose that member's categories and
|
|
254
|
+
* the Bundles tab would under-report. The map was widened (rather than
|
|
255
|
+
* this check softened) on 2026-10-19 to cover
|
|
256
|
+
* `productsBeybladeXSeedData` as well — if another real-product file is
|
|
257
|
+
* added, widen it again.
|
|
241
258
|
*/
|
|
242
|
-
if (!chain)
|
|
243
|
-
throw new Error(`bundle member ${id} is
|
|
259
|
+
if (!chain) {
|
|
260
|
+
throw new Error(`bundle member ${id} is in neither productsStandardSeedData nor productsBeybladeXSeedData`);
|
|
261
|
+
}
|
|
244
262
|
for (const c of chain)
|
|
245
263
|
if (!out.includes(c))
|
|
246
264
|
out.push(c);
|
|
@@ -268,8 +286,11 @@ function withBundleMosaic(row) {
|
|
|
268
286
|
// half-built.
|
|
269
287
|
if (ids.length === 0 || !row.display)
|
|
270
288
|
return row;
|
|
289
|
+
// Both real-product arrays, for the same reason as PRODUCT_CHAINS above —
|
|
290
|
+
// otherwise a bundle holding a Beyblade X member silently loses that tile.
|
|
271
291
|
const images = ids
|
|
272
|
-
.map((id) => productsStandardSeedData.find((p) => p.id === id)
|
|
292
|
+
.map((id) => [...productsStandardSeedData, ...productsBeybladeXSeedData].find((p) => p.id === id)
|
|
293
|
+
?.mainImage)
|
|
273
294
|
.filter((src) => typeof src === "string" && src.length > 0);
|
|
274
295
|
if (images.length === 0)
|
|
275
296
|
return row;
|
|
@@ -387,18 +408,21 @@ const bundleRows = [
|
|
|
387
408
|
id: "bundle-x-series-starter",
|
|
388
409
|
name: "X-Series Starter Set",
|
|
389
410
|
slug: "bundle-x-series-starter",
|
|
390
|
-
description: "
|
|
411
|
+
description: "WizardArrow and KnightShield Ver.2.0 — the re-tuned Stamina and Defense tops from the BX-53 set, paired with a Burst-era Valkyrie.",
|
|
391
412
|
categoryType: "bundle",
|
|
392
413
|
bundleKind: "special",
|
|
393
414
|
brandSlug: "brand-takara-tomy",
|
|
394
415
|
bundlePrice: 2499,
|
|
395
416
|
bundleQueryRule: {
|
|
396
417
|
type: "static",
|
|
397
|
-
productIds: ["product-beyblade-x-
|
|
418
|
+
productIds: ["product-beyblade-x-bx-53-wizardarrow-v2", "product-beyblade-x-bx-53-knightshield-v2", "product-beyblade-burst-valkyrie"],
|
|
398
419
|
},
|
|
399
|
-
bundleProductIds: ["product-beyblade-x-
|
|
400
|
-
bundleCategorySlugs: bundleCategorySlugsFor(["product-beyblade-x-
|
|
401
|
-
|
|
420
|
+
bundleProductIds: ["product-beyblade-x-bx-53-wizardarrow-v2", "product-beyblade-x-bx-53-knightshield-v2", "product-beyblade-burst-valkyrie"],
|
|
421
|
+
bundleCategorySlugs: bundleCategorySlugsFor(["product-beyblade-x-bx-53-wizardarrow-v2", "product-beyblade-x-bx-53-knightshield-v2", "product-beyblade-burst-valkyrie"]),
|
|
422
|
+
// 1500 + 1500 + 999. Recomputed 2026-10-19 when the two fictional X
|
|
423
|
+
// fixtures (899 + 949) were replaced by the real BX-53 component
|
|
424
|
+
// listings — a stale total here drives a wrong discount-% badge.
|
|
425
|
+
bundleOriginalTotal: 3999,
|
|
402
426
|
bundleStockStatus: "in_stock",
|
|
403
427
|
display: { coverImage: seedPhoto("bundle-x-series-starter-20260101", 1200, 900), showInFooter: false },
|
|
404
428
|
isActive: true,
|
|
@@ -436,17 +460,20 @@ const bundleRows = [
|
|
|
436
460
|
"product-beyblade-original-driger-v",
|
|
437
461
|
"product-beyblade-metal-storm-pegasus",
|
|
438
462
|
"product-beyblade-burst-valkyrie",
|
|
439
|
-
"product-beyblade-x-
|
|
463
|
+
"product-beyblade-x-bx-53-wizardarrow-v2",
|
|
440
464
|
],
|
|
441
465
|
},
|
|
442
466
|
bundleProductIds: [
|
|
443
467
|
"product-beyblade-original-driger-v",
|
|
444
468
|
"product-beyblade-metal-storm-pegasus",
|
|
445
469
|
"product-beyblade-burst-valkyrie",
|
|
446
|
-
"product-beyblade-x-
|
|
470
|
+
"product-beyblade-x-bx-53-wizardarrow-v2",
|
|
447
471
|
],
|
|
448
|
-
bundleCategorySlugs: bundleCategorySlugsFor(["product-beyblade-original-driger-v", "product-beyblade-metal-storm-pegasus", "product-beyblade-burst-valkyrie", "product-beyblade-x-
|
|
449
|
-
|
|
472
|
+
bundleCategorySlugs: bundleCategorySlugsFor(["product-beyblade-original-driger-v", "product-beyblade-metal-storm-pegasus", "product-beyblade-burst-valkyrie", "product-beyblade-x-bx-53-wizardarrow-v2"]),
|
|
473
|
+
// 1799 + 1299 + 999 + 1500. Recomputed 2026-10-19 — the X member changed
|
|
474
|
+
// from the fictional "wizard-arrow" (899) to the real BX-53 WizardArrow
|
|
475
|
+
// 4-80B Ver.2.0 (1500).
|
|
476
|
+
bundleOriginalTotal: 5597,
|
|
450
477
|
bundleStockStatus: "in_stock",
|
|
451
478
|
display: { coverImage: seedPhoto("bundle-every-generation-starter-pack-20260101", 1200, 900), showInFooter: false },
|
|
452
479
|
isActive: true,
|
|
@@ -530,13 +557,51 @@ function withGeneratedContent(row) {
|
|
|
530
557
|
*/
|
|
531
558
|
function withGeneratedCoverImage(row) {
|
|
532
559
|
const existing = row.display?.coverImage;
|
|
533
|
-
|
|
560
|
+
/*
|
|
561
|
+
* 🛑 A seed PLACEHOLDER tile does not count as hand-authored.
|
|
562
|
+
*
|
|
563
|
+
* The rule is still "a hand-authored cover wins", but a `seedPhoto(...)`
|
|
564
|
+
* tile was never authored — it is what the seed emits when it has nothing
|
|
565
|
+
* better. Treating it as a decision is what made the placeholder BLOCK every
|
|
566
|
+
* fetched wordmark: a logo could be downloaded, uploaded to Storage, mapped,
|
|
567
|
+
* and the card would still show a grey tile, with nothing anywhere
|
|
568
|
+
* reporting why.
|
|
569
|
+
*
|
|
570
|
+
* So the precedence is: real authored path > generated image > placeholder
|
|
571
|
+
* tile. That lets every branch row keep an honest tile in source — which is
|
|
572
|
+
* what it falls back to when no image exists, and is much better than the
|
|
573
|
+
* empty grey box a brand row would otherwise render, since brand rows carry
|
|
574
|
+
* no `color` and no `icon` either.
|
|
575
|
+
*/
|
|
576
|
+
if (typeof existing === "string" && existing.trim().length > 0 && !isSeedPlaceholderImage(existing)) {
|
|
534
577
|
return row;
|
|
578
|
+
}
|
|
535
579
|
const generated = row.id ? GENERATED_CATEGORY_IMAGES[row.id] : undefined;
|
|
536
580
|
if (!generated)
|
|
537
581
|
return row;
|
|
538
582
|
return { ...row, display: { ...(row.display ?? {}), coverImage: generated } };
|
|
539
583
|
}
|
|
584
|
+
/**
|
|
585
|
+
* Attach the REGIONAL-VARIANT logo to a row that names a Hasbro equivalent.
|
|
586
|
+
*
|
|
587
|
+
* 🛑 Gated on `hasbroName`, not merely on the map having an entry. The image is
|
|
588
|
+
* rendered beside the "Also known as" line, so without the name there is
|
|
589
|
+
* nothing to label it and a bare second logo reads as a duplicate of the
|
|
590
|
+
* cover. The name is the fact; the image only illustrates it.
|
|
591
|
+
*
|
|
592
|
+
* Same hand-authored-wins rule as the cover, for the same reason: the admin
|
|
593
|
+
* editor can set `hasbroCoverImage` on a row the generator knows nothing
|
|
594
|
+
* about, and a reseed must not take that away.
|
|
595
|
+
*/
|
|
596
|
+
function withGeneratedHasbroCover(row) {
|
|
597
|
+
if (!row.hasbroName)
|
|
598
|
+
return row;
|
|
599
|
+
const existing = row.hasbroCoverImage;
|
|
600
|
+
if (typeof existing === "string" && existing.trim().length > 0)
|
|
601
|
+
return row;
|
|
602
|
+
const generated = row.id ? GENERATED_CATEGORY_HASBRO_IMAGES[row.id] : undefined;
|
|
603
|
+
return generated ? { ...row, hasbroCoverImage: generated } : row;
|
|
604
|
+
}
|
|
540
605
|
const allCategoryRows = [
|
|
541
606
|
...rawCategories.map((c) => ({ ancestors: [], ...c, createdByType: "admin" })),
|
|
542
607
|
...sublistingRows.map((s) => ({ ancestors: [], ...s, createdByType: "admin" })),
|
|
@@ -546,6 +611,7 @@ const allCategoryRows = [
|
|
|
546
611
|
]
|
|
547
612
|
.map(withGeneratedContent)
|
|
548
613
|
.map(withGeneratedCoverImage)
|
|
614
|
+
.map(withGeneratedHasbroCover)
|
|
549
615
|
.map(withCategorySearchTxt);
|
|
550
616
|
/*
|
|
551
617
|
* ── Assertions, at MODULE LOAD, so a silent drop is loud ─────────────────────
|
|
@@ -626,6 +692,44 @@ if (generatedImagesApplied < Math.floor(GENERATED_CATEGORY_IMAGE_COUNT * 0.9)) {
|
|
|
626
692
|
`scripts/fetch-taxonomy-images.mjs against the current forest. Nothing would error ` +
|
|
627
693
|
`at load time: the category grids would just go back to blank cards.`);
|
|
628
694
|
}
|
|
695
|
+
/*
|
|
696
|
+
* The regional-variant logos. This catches ORPHANED logos, and deliberately
|
|
697
|
+
* only those.
|
|
698
|
+
*
|
|
699
|
+
* 🛑 The two directions are NOT symmetric, which a first draft of this comment
|
|
700
|
+
* got wrong until a negative control was actually run against it:
|
|
701
|
+
*
|
|
702
|
+
* - **A map entry whose row does not name a Hasbro wave is an ERROR.**
|
|
703
|
+
* `withGeneratedHasbroCover` gates on `hasbroName`, so that image can
|
|
704
|
+
* never render — it was fetched, uploaded to Storage and mapped, and is
|
|
705
|
+
* now a stored object nothing will ever serve. Silent waste. Throw.
|
|
706
|
+
*
|
|
707
|
+
* - **A named wave with no logo is FINE.** The "Also known as" block renders
|
|
708
|
+
* the name and omits the image (`CategoryDetailPageView` makes the picture
|
|
709
|
+
* conditional), which is a correct, intentional-looking page. Setting a
|
|
710
|
+
* name we can evidence while having no logo we can source is exactly the
|
|
711
|
+
* honest-gap rule the rest of this work follows, so failing the seed for
|
|
712
|
+
* it would punish the right behaviour.
|
|
713
|
+
*
|
|
714
|
+
* Hence `covered !== keys` and NOT `covered !== named`. Exact equality rather
|
|
715
|
+
* than a 90% floor because there are five, hand-set against five confirmed
|
|
716
|
+
* pairings: "most of them" is not a meaningful tolerance at that size.
|
|
717
|
+
*/
|
|
718
|
+
const hasbroNamed = allCategoryRows.filter((c) => typeof c.hasbroName === "string" && c.hasbroName);
|
|
719
|
+
const hasbroCovered = hasbroNamed.filter((c) => typeof c.id === "string" && GENERATED_CATEGORY_HASBRO_IMAGES[c.id] === c.hasbroCoverImage);
|
|
720
|
+
const hasbroMapKeys = Object.keys(GENERATED_CATEGORY_HASBRO_IMAGES);
|
|
721
|
+
if (hasbroCovered.length !== hasbroMapKeys.length) {
|
|
722
|
+
const namedIds = new Set(hasbroNamed.map((c) => c.id));
|
|
723
|
+
const orphanLogos = hasbroMapKeys.filter((k) => !namedIds.has(k));
|
|
724
|
+
throw new Error(`category seed: ${hasbroCovered.length} of ${hasbroMapKeys.length} regional-variant logos ` +
|
|
725
|
+
`reached a row that names one. ` +
|
|
726
|
+
(orphanLogos.length > 0
|
|
727
|
+
? `These have a logo but no hasbroName: ${orphanLogos.join(", ")}. `
|
|
728
|
+
: "") +
|
|
729
|
+
`Either set hasbroName in category-forest.ts, or drop the entry from the manifest and ` +
|
|
730
|
+
`re-run scripts/fetch-category-images.mjs. Nothing would error at load time — the ` +
|
|
731
|
+
`"Also known as" block would just render without its logo.`);
|
|
732
|
+
}
|
|
629
733
|
const allIds = allCategoryRows.map((c) => c.id).filter((x) => typeof x === "string");
|
|
630
734
|
const duplicateIds = [...new Set(allIds.filter((id, i) => allIds.indexOf(id) !== i))];
|
|
631
735
|
if (duplicateIds.length > 0) {
|
|
@@ -96,6 +96,22 @@ export const groupedListingsSeedData = [
|
|
|
96
96
|
createdBy: "user-admin-letitrip",
|
|
97
97
|
createdAt: daysAgo(15),
|
|
98
98
|
updatedAt: daysAgo(3),
|
|
99
|
+
/*
|
|
100
|
+
* Part Two E — the one seeded fixture exercising self-assembled-selection
|
|
101
|
+
* rules end to end (`GroupMemberPicker` ↔ `checkGroupRules` ↔
|
|
102
|
+
* `deriveLinePrice`'s discount), without requiring the sticker tracer's
|
|
103
|
+
* multi-step admin flow to produce one first.
|
|
104
|
+
*
|
|
105
|
+
* 🛑 Deliberately NOT `minActiveMembers` (above) — that is visibility ("hide
|
|
106
|
+
* the whole group below 2 ACTIVE members"). `groupMinMembers` constrains
|
|
107
|
+
* what ONE BUYER'S SELECTION may contain, and the two can legitimately
|
|
108
|
+
* disagree: this group stays visible at 2 active members while requiring a
|
|
109
|
+
* buyer to pick at least 2 of the 4.
|
|
110
|
+
*/
|
|
111
|
+
groupMinMembers: 2,
|
|
112
|
+
groupMaxMembers: 3,
|
|
113
|
+
groupMaxUnitsPerMember: 2,
|
|
114
|
+
groupDiscountPercent: 10,
|
|
99
115
|
},
|
|
100
116
|
// --- Coverage for every other listing type — previously only standard products had a
|
|
101
117
|
// group, so the public GroupedListingsCarousel (Phase 3) had nothing to render on
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* WHY: Seeds the homepage layout — which sections render, in what order, with what copy.
|
|
3
|
-
* WHAT:
|
|
3
|
+
* WHAT: 24 sections (23 enabled + 1 deliberately disabled), ordered 1..24 contiguously.
|
|
4
|
+
* `google-reviews` is a REGISTERED type with no document — see the note
|
|
5
|
+
* beside the deliberate budget-tile omission below for why. Three more joined
|
|
6
|
+
* it 2026-10-19 (`how-it-works`/`testimonials`/`promo-grid`, promoted out of
|
|
7
|
+
* the orphan-component set into real `SectionType`s + `SECTION_REGISTRY`
|
|
8
|
+
* entries) — deliberately left unseeded too: each is now available in the
|
|
9
|
+
* admin section builder's create picker, so an admin can add one when there is
|
|
10
|
+
* real copy to put in it, rather than this file inventing placeholder "How It
|
|
11
|
+
* Works" steps or testimonials nobody actually said.
|
|
4
12
|
*
|
|
5
13
|
* 🛑 That count and range are ASSERTED, not described — `order` must stay unique
|
|
6
14
|
* and contiguous. Until 2026-10-19 this header read "22 sections … 1..21" while
|
|
@@ -8,7 +16,10 @@
|
|
|
8
16
|
* `section-featured-products` BOTH claimed `order: 5`. `MarketplaceHomepageView`
|
|
9
17
|
* tie-breaks on `updatedAt` (identical for both) and then `id.localeCompare`, so
|
|
10
18
|
* the live running order of the homepage was decided alphabetically — a silent
|
|
11
|
-
* accident, not a layout decision.
|
|
19
|
+
* accident, not a layout decision. The 24th document (`collection-cards`,
|
|
20
|
+
* added the same day) closed the other half of that finding: a registered
|
|
21
|
+
* section type with a renderer and zero seeded rows is the same class of gap,
|
|
22
|
+
* just silent rather than colliding.
|
|
12
23
|
*
|
|
13
24
|
* ORDER follows current marketplace-homepage research rather than the previous
|
|
14
25
|
* arbitrary arrangement: hero → trust → orient (categories, systems matrix) →
|
|
@@ -146,7 +157,14 @@ export const homepageSectionsSeedData = [
|
|
|
146
157
|
enabled: true,
|
|
147
158
|
config: {
|
|
148
159
|
title: "Shop by Category",
|
|
149
|
-
|
|
160
|
+
/*
|
|
161
|
+
* 6, from the `categories-generation-tiles` SECTION_TEMPLATE — and 6 is a
|
|
162
|
+
* measured number, not a round one: worldhobbyshop's "Shop Beyblades by
|
|
163
|
+
* Generation" is exactly six tiles (Beyblade X, Burst, Metal, Plastic
|
|
164
|
+
* Generation, Launchers & Grips, Stadiums & Arenas), 3 columns at 1280 and
|
|
165
|
+
* 1 at 390. See docs/research/competitor-crawl-2026-10/layout.md.
|
|
166
|
+
*/
|
|
167
|
+
maxCategories: 6,
|
|
150
168
|
viewMoreLabel: "All categories →",
|
|
151
169
|
autoScroll: false,
|
|
152
170
|
scrollInterval: 5000,
|
|
@@ -166,7 +184,20 @@ export const homepageSectionsSeedData = [
|
|
|
166
184
|
config: {
|
|
167
185
|
title: "Featured Products",
|
|
168
186
|
subtitle: "Hand-picked listings from verified sellers.",
|
|
169
|
-
|
|
187
|
+
/*
|
|
188
|
+
* 8, from the `products-recently-added` SECTION_TEMPLATE, which took it
|
|
189
|
+
* from worldhobbyshop's one product rail — measured 2026-10-19 at exactly
|
|
190
|
+
* 8 cards, 4 columns (docs/research/competitor-crawl-2026-10/layout.md).
|
|
191
|
+
* The SEO leader ships the fewest products on its homepage; its advantage
|
|
192
|
+
* is taxonomy routing, not merchandising volume.
|
|
193
|
+
*
|
|
194
|
+
* Safe against the `<= 12` rule above: SSR still supplies 12 via
|
|
195
|
+
* getFeatured*(12) and this renders 8 of them, so it can never under-fill.
|
|
196
|
+
* The 4-row over-fetch is deliberate — `getFeaturedProducts(12)` is shared
|
|
197
|
+
* with the auctions and pre-orders rails, so narrowing it to match would
|
|
198
|
+
* couple three sections' counts to one fetch.
|
|
199
|
+
*/
|
|
200
|
+
maxItems: 8,
|
|
170
201
|
viewMoreLabel: "View all products →",
|
|
171
202
|
rows: 1,
|
|
172
203
|
autoScroll: false,
|
|
@@ -324,7 +355,10 @@ export const homepageSectionsSeedData = [
|
|
|
324
355
|
enabled: true,
|
|
325
356
|
config: {
|
|
326
357
|
title: "From Our Blog",
|
|
327
|
-
|
|
358
|
+
// 4, from the `blog-four-excerpts` SECTION_TEMPLATE (beybladeartshop ships
|
|
359
|
+
// four article excerpts). Safe against the SSR fetch, which supplies 6 via
|
|
360
|
+
// getFeaturedBlogPosts(6) — this renders 4 of them.
|
|
361
|
+
maxArticles: 4,
|
|
328
362
|
viewMoreLabel: "View all posts →",
|
|
329
363
|
showReadTime: true,
|
|
330
364
|
showAuthor: true,
|
|
@@ -676,6 +710,61 @@ export const homepageSectionsSeedData = [
|
|
|
676
710
|
createdAt: daysAgo(1),
|
|
677
711
|
updatedAt: daysAgo(1),
|
|
678
712
|
},
|
|
713
|
+
/*
|
|
714
|
+
* `collection-cards` had a renderer and a builder with zero seeded rows — a
|
|
715
|
+
* type nobody ever saw, structurally identical to 22 missing-order or
|
|
716
|
+
* mis-ordered sections elsewhere in this file: a gap only a human reading
|
|
717
|
+
* the schema would ever notice.
|
|
718
|
+
*
|
|
719
|
+
* 🛑 Deliberately scoped to `categories` / `brands` / `stores` — the three
|
|
720
|
+
* axes that are PERMANENT regardless of product count. Even if every one of
|
|
721
|
+
* the 1,237 generated catalogue products were deleted, these three entry
|
|
722
|
+
* types would still resolve to real, populated rows: 1,185 categories, 28
|
|
723
|
+
* brand rows, 5 stores, all seeded independently of the product catalogue.
|
|
724
|
+
* A `"products"` or `"auctions"` entry here would be the opposite — a card
|
|
725
|
+
* that goes empty the moment the catalogue does, on a section whose entire
|
|
726
|
+
* point is to always have something to show.
|
|
727
|
+
*/
|
|
728
|
+
{
|
|
729
|
+
id: "section-top-collections",
|
|
730
|
+
type: "collection-cards",
|
|
731
|
+
order: 24,
|
|
732
|
+
enabled: true,
|
|
733
|
+
config: {
|
|
734
|
+
title: "Explore the Marketplace",
|
|
735
|
+
subtitle: "Three ways into the catalogue that never go empty.",
|
|
736
|
+
layout: "grid",
|
|
737
|
+
itemsPerRow: 3,
|
|
738
|
+
showCollectionTabs: false,
|
|
739
|
+
collections: [
|
|
740
|
+
{ type: "categories", label: "Shop by Generation", limit: 6 },
|
|
741
|
+
{ type: "brands", label: "Shop by Brand", limit: 8 },
|
|
742
|
+
{ type: "stores", label: "Verified Sellers", limit: 5 },
|
|
743
|
+
],
|
|
744
|
+
cta: { label: "View all categories →", href: String(ROUTES.PUBLIC.CATEGORIES), variant: "text" },
|
|
745
|
+
},
|
|
746
|
+
createdAt: daysAgo(1),
|
|
747
|
+
updatedAt: daysAgo(1),
|
|
748
|
+
},
|
|
749
|
+
/*
|
|
750
|
+
* 🛑 `google-reviews` stays DELIBERATELY UNSEEDED — not an oversight, the
|
|
751
|
+
* same decision already made for `googleMapsApiKey`/`googlePlaceId` in
|
|
752
|
+
* `site-settings-seed-data.ts`: those are seeded `""` on purpose, because
|
|
753
|
+
* their consumers (`GoogleReviewsSectionConfig.placeId` is this section's
|
|
754
|
+
* only REQUIRED field) read them directly and would treat a placeholder as
|
|
755
|
+
* a usable credential, producing a failed, possibly BILLED Google Places
|
|
756
|
+
* API call instead of skipping cleanly.
|
|
757
|
+
*
|
|
758
|
+
* Reviews pulled from this section are real third-party content keyed to a
|
|
759
|
+
* real Google Business Profile this project does not have. Fabricating a
|
|
760
|
+
* `placeId` would either hit Google's API with an invalid key (cost, for a
|
|
761
|
+
* call that can never succeed) or — worse — a VALID placeId for a real,
|
|
762
|
+
* unrelated business, rendering someone else's reviews as this store's own.
|
|
763
|
+
* Neither is a seed-data problem to paper over; it is a real business
|
|
764
|
+
* prerequisite (a Google Business Profile must exist) that has not happened
|
|
765
|
+
* yet. The type stays in `SectionType` and `SECTION_REGISTRY` — it is a real
|
|
766
|
+
* feature with zero fabricated data, not a bug.
|
|
767
|
+
*/
|
|
679
768
|
/*
|
|
680
769
|
* 🛑 TCI's five BUDGET TILES ("Under ₹499 / ₹799 / ₹999 / ₹1499") are
|
|
681
770
|
* DELIBERATELY NOT SEEDED, and this is a decision rather than an omission.
|
package/dist/seed/index.d.ts
CHANGED
|
@@ -19,8 +19,6 @@ export type { SeedCategoryDocument } from "./factories/category.factory";
|
|
|
19
19
|
export { makeCategory } from "./factories/category.factory";
|
|
20
20
|
export type { SeedCarouselSlideDocument } from "./factories/carousel.factory";
|
|
21
21
|
export { makeCarouselSlide } from "./factories/carousel.factory";
|
|
22
|
-
export type { SeedHomepageSectionDocument, HomepageSectionType, } from "./factories/homepage-section.factory";
|
|
23
|
-
export { makeHomepageSection } from "./factories/homepage-section.factory";
|
|
24
22
|
export type { SeedAddressDocument } from "./factories/address.factory";
|
|
25
23
|
export { makeAddress, makeFullAddress, ADDRESS_FIXTURES, } from "./factories/address.factory";
|
|
26
24
|
export type { SeedCartDocument, SeedCartItemDocument, } from "./factories/cart.factory";
|
|
@@ -37,7 +35,6 @@ export type { SeedPayoutDocument, PayoutStatus, } from "./factories/payout.facto
|
|
|
37
35
|
export { makePayout, makeFullPayout, PAYOUT_FIXTURES, } from "./factories/payout.factory";
|
|
38
36
|
export { DEFAULT_CATEGORIES } from "./defaults/categories";
|
|
39
37
|
export { DEFAULT_FAQS } from "./defaults/faqs";
|
|
40
|
-
export { DEFAULT_HOMEPAGE_SECTIONS } from "./defaults/homepage-sections";
|
|
41
38
|
export { usersSeedData } from "./users-seed-data";
|
|
42
39
|
export { sessionsSeedData, SESSION_COLLECTION } from "./sessions-seed-data";
|
|
43
40
|
export { addressesSeedData } from "./addresses-seed-data";
|
|
@@ -45,6 +42,7 @@ export { storesSeedData } from "./stores-seed-data";
|
|
|
45
42
|
export { storeAddressesSeedData } from "./store-addresses-seed-data";
|
|
46
43
|
export { categoriesSeedData, categoriesP1SeedData } from "./categories-seed-data";
|
|
47
44
|
export { productsStandardSeedData } from "./products-standard-seed-data";
|
|
45
|
+
export { productsBeybladeXSeedData } from "./products-beyblade-x-seed-data";
|
|
48
46
|
export { productsAuctionsSeedData } from "./products-auctions-seed-data";
|
|
49
47
|
export { productsPreordersSeedData } from "./products-preorders-seed-data";
|
|
50
48
|
export { productsPrizeDrawsSeedData } from "./products-prize-draws-seed-data";
|
|
@@ -53,6 +51,7 @@ export { productsDigitalCodesSeedData } from "./products-digital-codes-seed-data
|
|
|
53
51
|
export { productsLiveItemsSeedData } from "./products-live-items-seed-data";
|
|
54
52
|
export { productsArtSeedData } from "./products-art-seed-data";
|
|
55
53
|
export { productsStickersSeedData } from "./products-stickers-seed-data";
|
|
54
|
+
export { productsSparesSeedData } from "./products-spares-seed-data";
|
|
56
55
|
export { ordersSeedData } from "./orders-seed-data";
|
|
57
56
|
export { reviewsSeedData } from "./reviews-seed-data";
|
|
58
57
|
export { cartsSeedData } from "./cart-seed-data";
|
package/dist/seed/index.js
CHANGED
|
@@ -14,7 +14,6 @@ export { makeBlogPost } from "./factories/blog-post.factory.js";
|
|
|
14
14
|
export { makeFaq } from "./factories/faq.factory.js";
|
|
15
15
|
export { makeCategory } from "./factories/category.factory.js";
|
|
16
16
|
export { makeCarouselSlide } from "./factories/carousel.factory.js";
|
|
17
|
-
export { makeHomepageSection } from "./factories/homepage-section.factory.js";
|
|
18
17
|
export { makeAddress, makeFullAddress, ADDRESS_FIXTURES, } from "./factories/address.factory.js";
|
|
19
18
|
export { makeCart, makeCartItem, makeFullCart, CART_FIXTURES, } from "./factories/cart.factory.js";
|
|
20
19
|
export { makeBid, makeWinningBid, BID_FIXTURES } from "./factories/bid.factory.js";
|
|
@@ -25,7 +24,6 @@ export { makePayout, makeFullPayout, PAYOUT_FIXTURES, } from "./factories/payout
|
|
|
25
24
|
// Defaults
|
|
26
25
|
export { DEFAULT_CATEGORIES } from "./defaults/categories.js";
|
|
27
26
|
export { DEFAULT_FAQS } from "./defaults/faqs.js";
|
|
28
|
-
export { DEFAULT_HOMEPAGE_SECTIONS } from "./defaults/homepage-sections.js";
|
|
29
27
|
// Migrated seed datasets from consumer repositories
|
|
30
28
|
// SB-UNI-C — brandsSeedData merged into categoriesSeedData with categoryType:"brand".
|
|
31
29
|
export { usersSeedData } from "./users-seed-data.js";
|
|
@@ -35,6 +33,7 @@ export { storesSeedData } from "./stores-seed-data.js";
|
|
|
35
33
|
export { storeAddressesSeedData } from "./store-addresses-seed-data.js";
|
|
36
34
|
export { categoriesSeedData, categoriesP1SeedData } from "./categories-seed-data.js";
|
|
37
35
|
export { productsStandardSeedData } from "./products-standard-seed-data.js";
|
|
36
|
+
export { productsBeybladeXSeedData } from "./products-beyblade-x-seed-data.js";
|
|
38
37
|
/*
|
|
39
38
|
* 🛑 `productsCatalogueSeedData` DELETED (I6, 2026-10-13) — 968 generated
|
|
40
39
|
* listings, one per tier-4 leaf. "I do not need products ... rest is either
|
|
@@ -53,6 +52,7 @@ export { productsDigitalCodesSeedData } from "./products-digital-codes-seed-data
|
|
|
53
52
|
export { productsLiveItemsSeedData } from "./products-live-items-seed-data.js";
|
|
54
53
|
export { productsArtSeedData } from "./products-art-seed-data.js";
|
|
55
54
|
export { productsStickersSeedData } from "./products-stickers-seed-data.js";
|
|
55
|
+
export { productsSparesSeedData } from "./products-spares-seed-data.js";
|
|
56
56
|
export { ordersSeedData } from "./orders-seed-data.js";
|
|
57
57
|
export { reviewsSeedData } from "./reviews-seed-data.js";
|
|
58
58
|
export { cartsSeedData } from "./cart-seed-data.js";
|
package/dist/seed/manifest.js
CHANGED
|
@@ -19,6 +19,7 @@ import { productsDigitalCodesSeedData } from "./products-digital-codes-seed-data
|
|
|
19
19
|
import { productsLiveItemsSeedData } from "./products-live-items-seed-data.js";
|
|
20
20
|
import { productsArtSeedData } from "./products-art-seed-data.js";
|
|
21
21
|
import { productsStickersSeedData } from "./products-stickers-seed-data.js";
|
|
22
|
+
import { productsSparesSeedData } from "./products-spares-seed-data.js";
|
|
22
23
|
import { ordersSeedData } from "./orders-seed-data.js";
|
|
23
24
|
import { reviewsSeedData } from "./reviews-seed-data.js";
|
|
24
25
|
import { bidsSeedData } from "./bids-seed-data.js";
|
|
@@ -68,6 +69,7 @@ function pick(items, nameKey = "name") {
|
|
|
68
69
|
// "bundle" is a categoryType, not a ListingType — falls through to "bundle" below.
|
|
69
70
|
const LISTING_TYPE_TO_MANIFEST_TAG = {
|
|
70
71
|
standard: "standard",
|
|
72
|
+
spares: "spares",
|
|
71
73
|
auction: "auction",
|
|
72
74
|
"pre-order": "preorder",
|
|
73
75
|
"prize-draw": "prize-draw",
|
|
@@ -97,6 +99,7 @@ export const SEED_MANIFEST = {
|
|
|
97
99
|
...asArr(productsLiveItemsSeedData),
|
|
98
100
|
...asArr(productsArtSeedData),
|
|
99
101
|
...asArr(productsStickersSeedData),
|
|
102
|
+
...asArr(productsSparesSeedData),
|
|
100
103
|
].map((p) => ({
|
|
101
104
|
...p,
|
|
102
105
|
type: p.listingType === "bundle"
|
|
@@ -19,4 +19,4 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import type { MediaAssetDocument } from "../features/media/repository/media-assets.repository";
|
|
21
21
|
export declare const mediaAssetsSeedData: Partial<MediaAssetDocument>[];
|
|
22
|
-
export declare const MEDIA_ASSET_SEED_COUNT =
|
|
22
|
+
export declare const MEDIA_ASSET_SEED_COUNT = 559;
|