@mohasinac/appkit 4.53.0 → 4.53.2
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/client/theme/ThemeProvider.js +15 -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/categories/price-guidance-resolve.d.ts +66 -0
- package/dist/_internal/server/features/categories/price-guidance-resolve.js +138 -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/market.d.ts +57 -0
- package/dist/_internal/server/features/price-index/market.js +120 -0
- 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/list-public.d.ts +12 -0
- package/dist/_internal/server/features/products/list-public.js +10 -1
- package/dist/_internal/server/features/products/listing-tab-counts.d.ts +25 -1
- package/dist/_internal/server/features/products/listing-tab-counts.js +128 -10
- 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 +30 -0
- package/dist/_internal/server/features/stores/tabs.js +124 -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 +30 -3
- 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 +46 -15
- package/dist/constants/api-endpoints.js +35 -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 +12 -18
- 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 +90 -0
- package/dist/features/categories/components/BrandDetailPageView.js +32 -8
- package/dist/features/categories/components/BrandDetailTabs.d.ts +7 -1
- package/dist/features/categories/components/BrandDetailTabs.js +28 -3
- package/dist/features/categories/components/BundleCollage.js +3 -2
- package/dist/features/categories/components/BundleItemsPicker.js +3 -4
- package/dist/features/categories/components/CategoriesIndexListing.js +23 -8
- package/dist/features/categories/components/CategoryDetailPageView.js +157 -20
- package/dist/features/categories/components/CategoryDetailTabs.d.ts +7 -1
- package/dist/features/categories/components/CategoryDetailTabs.js +41 -7
- 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 +14 -10
- 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 +14 -10
- 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 +14 -10
- 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 +12 -18
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +1 -1
- package/dist/features/price-index/components/PriceIndexToolView.d.ts +24 -1
- package/dist/features/price-index/components/PriceIndexToolView.js +299 -17
- package/dist/features/price-index/lookup-target.d.ts +48 -0
- package/dist/features/price-index/lookup-target.js +107 -0
- package/dist/features/products/components/AvailabilityScopeHint.d.ts +22 -0
- package/dist/features/products/components/AvailabilityScopeHint.js +27 -0
- package/dist/features/products/components/CompareOverlay.d.ts +20 -2
- package/dist/features/products/components/CompareOverlay.js +23 -3
- 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 +92 -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 +81 -17
- 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/components/SublistingCarouselSection.js +2 -1
- 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 +99 -0
- package/dist/features/products/repository/products.repository.js +240 -18
- 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 +46 -0
- package/dist/features/products/utils/group-member-image.js +4 -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/SellerProductsView.js +3 -2
- 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/StoreAuctionsListing.js +2 -1
- 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 +392 -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 +384 -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 +476 -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 +11 -9
- package/dist/server.js +35 -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 +250 -35
- 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
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: `listingType: "spares"` is the user's own case, in their words — *"if I
|
|
3
|
+
* have a spare attack ring for Galeon I can sell it to someone who wants
|
|
4
|
+
* it in the same colour, instead of wasting time with it."* A spare is one
|
|
5
|
+
* physical component off a disassembled top, usually quantity 1, priced by
|
|
6
|
+
* condition and colourway rather than by a catalogue number.
|
|
7
|
+
* WHAT: Six spares on Beyblade Arena, one per part classification that has a
|
|
8
|
+
* real glossary row and a real cover image, spanning three generations.
|
|
9
|
+
*
|
|
10
|
+
* 🛑 Each one links to a REAL `partGlossary` id and files under the REAL
|
|
11
|
+
* generated part leaf. Both were verified against the committed seed rather
|
|
12
|
+
* than composed by hand:
|
|
13
|
+
*
|
|
14
|
+
* node -e '…/"id": "(attack-ring--[a-z0-9-]+)"/…' → the glossary rows
|
|
15
|
+
* grep partGlossaryId products-catalogue-seed-data → the category chains
|
|
16
|
+
*
|
|
17
|
+
* A fabricated id here would be invisible: `partGlossaryId` is optional by
|
|
18
|
+
* design (the glossary holds 752 rows and does not cover every component ever
|
|
19
|
+
* moulded), so a wrong value does not error — the glossary cross-sell simply
|
|
20
|
+
* never matches, which reads as "no spares listed" rather than as a bad link.
|
|
21
|
+
*
|
|
22
|
+
* 🛑 `mainImage` points at the part leaf's OWN cover, which exists because the
|
|
23
|
+
* taxonomy-image pipeline uploaded it — `/media/<shortId>` resolves through
|
|
24
|
+
* `mediaAssets/{slug}` → `storagePath`, so a slug with no row is a silent 404
|
|
25
|
+
* that renders as an ordinary broken image (the 2026-10-17 incident where 504
|
|
26
|
+
* covers were missing). Five of the six were CHECKED present in
|
|
27
|
+
* `media-assets-seed-data.ts`; the sixth part (`spin-gear--right-sg`) has no
|
|
28
|
+
* uploaded cover, so it is not in this file at all rather than carrying a slug
|
|
29
|
+
* that 404s.
|
|
30
|
+
*
|
|
31
|
+
* EXPORTS:
|
|
32
|
+
* productsSparesSeedData — 6 Partial<ProductDocument> with listingType:"spares"
|
|
33
|
+
*
|
|
34
|
+
* @tag domain:products,spares
|
|
35
|
+
* @tag layer:seed
|
|
36
|
+
* @tag pattern:none
|
|
37
|
+
* @tag access:server-only
|
|
38
|
+
* @tag consumers:seed/index.ts,seed/manifest.ts
|
|
39
|
+
* @tag sideEffects:none
|
|
40
|
+
*/
|
|
41
|
+
import { seedGallery } from "./_helpers/media.js";
|
|
42
|
+
import { PRODUCT_FIELDS } from "../constants/field-names.js";
|
|
43
|
+
import { buildSearchTxt } from "../utils/search-txt.js";
|
|
44
|
+
import { withFinalSale } from "./_helpers/final-sale-fixtures.js";
|
|
45
|
+
import { withDerivedCategoryNames } from "./_helpers/category-names.js";
|
|
46
|
+
const _rawProductsSparesSeedData = [
|
|
47
|
+
{
|
|
48
|
+
id: "spare-cross-dranzer-attack-ring-red",
|
|
49
|
+
slug: "spare-cross-dranzer-attack-ring-red",
|
|
50
|
+
title: "Cross Dranzer Attack Ring — red, Dranzer V2 pull",
|
|
51
|
+
description: "A loose Cross Dranzer attack ring pulled from a Dranzer V2. Red, with the usual contact-point scuffing on two of the four blades and no cracks. Fits any Plastic-Generation combo that takes a standard attack ring.",
|
|
52
|
+
categorySlugs: [
|
|
53
|
+
"category-cross-dranzer",
|
|
54
|
+
"category-original-attack-rings",
|
|
55
|
+
"category-original-parts",
|
|
56
|
+
"category-beyblade-original",
|
|
57
|
+
"category-spinning-tops",
|
|
58
|
+
],
|
|
59
|
+
brandSlug: "brand-beyblade",
|
|
60
|
+
brand: "Beyblade",
|
|
61
|
+
price: 320,
|
|
62
|
+
currency: "INR",
|
|
63
|
+
gstRate: 5,
|
|
64
|
+
hsnCode: "95030020",
|
|
65
|
+
// Quantity 1 is the NORMAL case for this type, not an edge case: it is one
|
|
66
|
+
// object the seller happens to have. A spare at quantity 12 is the unusual
|
|
67
|
+
// row, which is why `-sg-metal-ball-base` below exists.
|
|
68
|
+
stockQuantity: 1,
|
|
69
|
+
availableQuantity: 1,
|
|
70
|
+
isSold: false,
|
|
71
|
+
mainImage: "/media/category-cross-dranzer-image",
|
|
72
|
+
images: seedGallery("/media/category-cross-dranzer-image"),
|
|
73
|
+
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
74
|
+
condition: PRODUCT_FIELDS.CONDITION_VALUES.USED,
|
|
75
|
+
listingType: "spares",
|
|
76
|
+
storeId: "store-beyblade-arena",
|
|
77
|
+
storeName: "Beyblade Arena",
|
|
78
|
+
partGlossaryId: "attack-ring--cross-dranzer",
|
|
79
|
+
colourway: "Red",
|
|
80
|
+
unitLabel: "Dranzer V2 pull",
|
|
81
|
+
customFields: [],
|
|
82
|
+
customSections: [],
|
|
83
|
+
featured: false,
|
|
84
|
+
isPromoted: false,
|
|
85
|
+
isOnSale: false,
|
|
86
|
+
tags: ["spares", "attack-ring", "plastic-gen"],
|
|
87
|
+
createdAt: new Date("2026-10-19"),
|
|
88
|
+
updatedAt: new Date("2026-10-19"),
|
|
89
|
+
searchTxt: buildSearchTxt([
|
|
90
|
+
"Cross Dranzer Attack Ring — red, Dranzer V2 pull",
|
|
91
|
+
"A loose Cross Dranzer attack ring pulled from a Dranzer V2.",
|
|
92
|
+
"Beyblade",
|
|
93
|
+
"brand-beyblade",
|
|
94
|
+
["Cross Dranzer", "Attack Rings", "Original Parts"],
|
|
95
|
+
["spares", "attack-ring", "plastic-gen"],
|
|
96
|
+
]),
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
id: "spare-bit-chip-galeon-gold",
|
|
100
|
+
slug: "spare-bit-chip-galeon-gold",
|
|
101
|
+
title: "Galeon Bit Chip — gold foil",
|
|
102
|
+
description: "The Galeon bit chip in gold foil, lifted cleanly from a spare attack ring. Foil is intact with no lift at the edges. This is the exact case this listing type exists for — a single chip somebody rebuilding a Galeon needs in this colour.",
|
|
103
|
+
categorySlugs: [
|
|
104
|
+
"category-bit-chip-galeon",
|
|
105
|
+
"category-original-bit-chips",
|
|
106
|
+
"category-original-parts",
|
|
107
|
+
"category-beyblade-original",
|
|
108
|
+
"category-spinning-tops",
|
|
109
|
+
],
|
|
110
|
+
brandSlug: "brand-beyblade",
|
|
111
|
+
brand: "Beyblade",
|
|
112
|
+
price: 180,
|
|
113
|
+
currency: "INR",
|
|
114
|
+
gstRate: 5,
|
|
115
|
+
hsnCode: "95030020",
|
|
116
|
+
stockQuantity: 1,
|
|
117
|
+
availableQuantity: 1,
|
|
118
|
+
isSold: false,
|
|
119
|
+
mainImage: "/media/category-bit-chip-galeon-image",
|
|
120
|
+
images: seedGallery("/media/category-bit-chip-galeon-image"),
|
|
121
|
+
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
122
|
+
condition: PRODUCT_FIELDS.CONDITION_VALUES.LIKE_NEW,
|
|
123
|
+
listingType: "spares",
|
|
124
|
+
storeId: "store-beyblade-arena",
|
|
125
|
+
storeName: "Beyblade Arena",
|
|
126
|
+
partGlossaryId: "bit-chip--galeon",
|
|
127
|
+
colourway: "Gold foil",
|
|
128
|
+
customFields: [],
|
|
129
|
+
customSections: [],
|
|
130
|
+
featured: false,
|
|
131
|
+
isPromoted: false,
|
|
132
|
+
isOnSale: false,
|
|
133
|
+
tags: ["spares", "bit-chip", "plastic-gen"],
|
|
134
|
+
createdAt: new Date("2026-10-19"),
|
|
135
|
+
updatedAt: new Date("2026-10-19"),
|
|
136
|
+
searchTxt: buildSearchTxt([
|
|
137
|
+
"Galeon Bit Chip — gold foil",
|
|
138
|
+
"The Galeon bit chip in gold foil, lifted cleanly from a spare attack ring.",
|
|
139
|
+
"Beyblade",
|
|
140
|
+
"brand-beyblade",
|
|
141
|
+
["Galeon", "Bit Chips", "Original Parts"],
|
|
142
|
+
["spares", "bit-chip", "plastic-gen"],
|
|
143
|
+
]),
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
id: "spare-eight-heavy-weight-disk-lot",
|
|
147
|
+
slug: "spare-eight-heavy-weight-disk-lot",
|
|
148
|
+
title: "Eight Heavy Weight Disk — pick one of four",
|
|
149
|
+
description: "Four Eight Heavy weight disks from a parts drawer, all original Takara. Surface oxidation varies between them and is shown in the photos; none is bent. Sold individually — the quantity is how many are left.",
|
|
150
|
+
categorySlugs: [
|
|
151
|
+
"category-eight-heavy",
|
|
152
|
+
"category-original-weight-disks",
|
|
153
|
+
"category-original-parts",
|
|
154
|
+
"category-beyblade-original",
|
|
155
|
+
"category-spinning-tops",
|
|
156
|
+
],
|
|
157
|
+
brandSlug: "brand-beyblade",
|
|
158
|
+
brand: "Beyblade",
|
|
159
|
+
price: 140,
|
|
160
|
+
currency: "INR",
|
|
161
|
+
gstRate: 5,
|
|
162
|
+
hsnCode: "95030020",
|
|
163
|
+
/*
|
|
164
|
+
* The counter-example to quantity 1: a seller who stripped several tops has
|
|
165
|
+
* four interchangeable disks and does not want four listings. Worth seeding
|
|
166
|
+
* because every stock-path test (cart cap, decrement, sell-out) needs a
|
|
167
|
+
* spare with room above 1 to exercise it at all.
|
|
168
|
+
*/
|
|
169
|
+
stockQuantity: 4,
|
|
170
|
+
availableQuantity: 4,
|
|
171
|
+
isSold: false,
|
|
172
|
+
mainImage: "/media/category-eight-heavy-image",
|
|
173
|
+
images: seedGallery("/media/category-eight-heavy-image"),
|
|
174
|
+
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
175
|
+
condition: PRODUCT_FIELDS.CONDITION_VALUES.USED,
|
|
176
|
+
listingType: "spares",
|
|
177
|
+
storeId: "store-beyblade-arena",
|
|
178
|
+
storeName: "Beyblade Arena",
|
|
179
|
+
partGlossaryId: "weight-disk--eight-heavy",
|
|
180
|
+
customFields: [],
|
|
181
|
+
customSections: [],
|
|
182
|
+
featured: false,
|
|
183
|
+
isPromoted: false,
|
|
184
|
+
isOnSale: false,
|
|
185
|
+
tags: ["spares", "weight-disk", "plastic-gen"],
|
|
186
|
+
createdAt: new Date("2026-10-19"),
|
|
187
|
+
updatedAt: new Date("2026-10-19"),
|
|
188
|
+
searchTxt: buildSearchTxt([
|
|
189
|
+
"Eight Heavy Weight Disk — pick one of four",
|
|
190
|
+
"Four Eight Heavy weight disks from a parts drawer, all original Takara.",
|
|
191
|
+
"Beyblade",
|
|
192
|
+
"brand-beyblade",
|
|
193
|
+
["Eight Heavy", "Weight Disks", "Original Parts"],
|
|
194
|
+
["spares", "weight-disk", "plastic-gen"],
|
|
195
|
+
]),
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
id: "spare-final-drive-performance-tip",
|
|
199
|
+
slug: "spare-final-drive-performance-tip",
|
|
200
|
+
title: "4D Bottom: Final Drive (F:D) — spare tip",
|
|
201
|
+
description: "A spare F:D performance tip off a Big Bang Pegasis. The free-spinning mode still engages cleanly and the rubber flat is worn but not flattened. Metal Fight 4D fitment only.",
|
|
202
|
+
categorySlugs: [
|
|
203
|
+
"category-f-d",
|
|
204
|
+
"category-metal-performance-tips",
|
|
205
|
+
"category-metal-parts",
|
|
206
|
+
"category-beyblade-metal",
|
|
207
|
+
"category-spinning-tops",
|
|
208
|
+
],
|
|
209
|
+
brandSlug: "brand-beyblade",
|
|
210
|
+
brand: "Beyblade",
|
|
211
|
+
price: 450,
|
|
212
|
+
currency: "INR",
|
|
213
|
+
gstRate: 5,
|
|
214
|
+
hsnCode: "95030020",
|
|
215
|
+
stockQuantity: 1,
|
|
216
|
+
availableQuantity: 1,
|
|
217
|
+
isSold: false,
|
|
218
|
+
mainImage: "/media/category-f-d-image",
|
|
219
|
+
images: seedGallery("/media/category-f-d-image"),
|
|
220
|
+
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
221
|
+
condition: PRODUCT_FIELDS.CONDITION_VALUES.USED,
|
|
222
|
+
listingType: "spares",
|
|
223
|
+
storeId: "store-beyblade-arena",
|
|
224
|
+
storeName: "Beyblade Arena",
|
|
225
|
+
partGlossaryId: "performance-tip--f-d",
|
|
226
|
+
unitLabel: "Big Bang Pegasis pull",
|
|
227
|
+
customFields: [],
|
|
228
|
+
customSections: [],
|
|
229
|
+
featured: false,
|
|
230
|
+
isPromoted: false,
|
|
231
|
+
isOnSale: false,
|
|
232
|
+
tags: ["spares", "performance-tip", "metal-fight"],
|
|
233
|
+
createdAt: new Date("2026-10-19"),
|
|
234
|
+
updatedAt: new Date("2026-10-19"),
|
|
235
|
+
searchTxt: buildSearchTxt([
|
|
236
|
+
"4D Bottom: Final Drive (F:D) — spare tip",
|
|
237
|
+
"A spare F:D performance tip off a Big Bang Pegasis.",
|
|
238
|
+
"Beyblade",
|
|
239
|
+
"brand-beyblade",
|
|
240
|
+
["4D Bottom: Final Drive", "Performance Tips", "Metal Fight Parts"],
|
|
241
|
+
["spares", "performance-tip", "metal-fight"],
|
|
242
|
+
]),
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
id: "spare-atomic-driver-burst",
|
|
246
|
+
slug: "spare-atomic-driver-burst",
|
|
247
|
+
title: "Atomic Driver — spare, Burst",
|
|
248
|
+
description: "An Atomic driver off a Maximum Garuda. The free-spinning ring turns without catching and the tip has even wear. Fits any Burst layer-and-disc combo.",
|
|
249
|
+
categorySlugs: [
|
|
250
|
+
"category-driver-atomic",
|
|
251
|
+
"category-burst-drivers",
|
|
252
|
+
"category-burst-parts",
|
|
253
|
+
"category-beyblade-burst",
|
|
254
|
+
"category-spinning-tops",
|
|
255
|
+
],
|
|
256
|
+
brandSlug: "brand-beyblade",
|
|
257
|
+
brand: "Beyblade",
|
|
258
|
+
price: 260,
|
|
259
|
+
currency: "INR",
|
|
260
|
+
gstRate: 5,
|
|
261
|
+
hsnCode: "95030020",
|
|
262
|
+
stockQuantity: 2,
|
|
263
|
+
availableQuantity: 2,
|
|
264
|
+
isSold: false,
|
|
265
|
+
mainImage: "/media/category-driver-atomic-image",
|
|
266
|
+
images: seedGallery("/media/category-driver-atomic-image"),
|
|
267
|
+
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
268
|
+
condition: PRODUCT_FIELDS.CONDITION_VALUES.USED,
|
|
269
|
+
listingType: "spares",
|
|
270
|
+
storeId: "store-beyblade-arena",
|
|
271
|
+
storeName: "Beyblade Arena",
|
|
272
|
+
partGlossaryId: "driver--atomic",
|
|
273
|
+
unitLabel: "Maximum Garuda pull",
|
|
274
|
+
customFields: [],
|
|
275
|
+
customSections: [],
|
|
276
|
+
featured: false,
|
|
277
|
+
isPromoted: false,
|
|
278
|
+
isOnSale: false,
|
|
279
|
+
tags: ["spares", "driver", "burst"],
|
|
280
|
+
createdAt: new Date("2026-10-19"),
|
|
281
|
+
updatedAt: new Date("2026-10-19"),
|
|
282
|
+
searchTxt: buildSearchTxt([
|
|
283
|
+
"Atomic Driver — spare, Burst",
|
|
284
|
+
"An Atomic driver off a Maximum Garuda.",
|
|
285
|
+
"Beyblade",
|
|
286
|
+
"brand-beyblade",
|
|
287
|
+
["Atomic", "Drivers", "Burst Parts"],
|
|
288
|
+
["spares", "driver", "burst"],
|
|
289
|
+
]),
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
/*
|
|
293
|
+
* 🛑 The SOLD fixture, and it is not optional.
|
|
294
|
+
*
|
|
295
|
+
* The "Sold & Ended" availability scope is otherwise EMPTY for this type,
|
|
296
|
+
* so the middle tab on `/spares` would render nothing and be untestable —
|
|
297
|
+
* the same gap CLAUDE.md records being closed for every other listing type
|
|
298
|
+
* on 2026-08-24. Status stays `published`: an archived row is removed by
|
|
299
|
+
* the status filter before the availability predicate ever runs, so an
|
|
300
|
+
* archived fixture proves nothing about the scope.
|
|
301
|
+
*/
|
|
302
|
+
id: "spare-eight-heavy-weight-disk-sold",
|
|
303
|
+
slug: "spare-eight-heavy-weight-disk-sold",
|
|
304
|
+
title: "Eight Heavy Weight Disk — mint, sold",
|
|
305
|
+
description: "A mint Eight Heavy weight disk with no oxidation at all, from a sealed Galeon. Sold.",
|
|
306
|
+
categorySlugs: [
|
|
307
|
+
"category-eight-heavy",
|
|
308
|
+
"category-original-weight-disks",
|
|
309
|
+
"category-original-parts",
|
|
310
|
+
"category-beyblade-original",
|
|
311
|
+
"category-spinning-tops",
|
|
312
|
+
],
|
|
313
|
+
brandSlug: "brand-beyblade",
|
|
314
|
+
brand: "Beyblade",
|
|
315
|
+
price: 390,
|
|
316
|
+
currency: "INR",
|
|
317
|
+
gstRate: 5,
|
|
318
|
+
hsnCode: "95030020",
|
|
319
|
+
stockQuantity: 1,
|
|
320
|
+
availableQuantity: 0,
|
|
321
|
+
isSold: true,
|
|
322
|
+
mainImage: "/media/category-eight-heavy-image",
|
|
323
|
+
images: seedGallery("/media/category-eight-heavy-image"),
|
|
324
|
+
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
325
|
+
condition: PRODUCT_FIELDS.CONDITION_VALUES.LIKE_NEW,
|
|
326
|
+
listingType: "spares",
|
|
327
|
+
storeId: "store-beyblade-arena",
|
|
328
|
+
storeName: "Beyblade Arena",
|
|
329
|
+
partGlossaryId: "weight-disk--eight-heavy",
|
|
330
|
+
colourway: "Unoxidised silver",
|
|
331
|
+
unitLabel: "Sealed Galeon pull",
|
|
332
|
+
customFields: [],
|
|
333
|
+
customSections: [],
|
|
334
|
+
featured: false,
|
|
335
|
+
isPromoted: false,
|
|
336
|
+
isOnSale: false,
|
|
337
|
+
tags: ["spares", "weight-disk", "sold-out"],
|
|
338
|
+
createdAt: new Date("2026-10-19"),
|
|
339
|
+
updatedAt: new Date("2026-10-19"),
|
|
340
|
+
searchTxt: buildSearchTxt([
|
|
341
|
+
"Eight Heavy Weight Disk — mint, sold",
|
|
342
|
+
"A mint Eight Heavy weight disk with no oxidation at all.",
|
|
343
|
+
"Beyblade",
|
|
344
|
+
"brand-beyblade",
|
|
345
|
+
["Eight Heavy", "Weight Disks", "Original Parts"],
|
|
346
|
+
["spares", "weight-disk", "sold-out"],
|
|
347
|
+
]),
|
|
348
|
+
},
|
|
349
|
+
];
|
|
350
|
+
/*
|
|
351
|
+
* 🛑 The wrappers go AFTER the closing `]`, applied to the whole array — never
|
|
352
|
+
* to a spread inside it.
|
|
353
|
+
*
|
|
354
|
+
* This file's siblings carry the scar: `products-auctions-seed-data.ts` had
|
|
355
|
+
* `..._raw.map(withTokens)` with fixtures appended after the spread, so the
|
|
356
|
+
* appended rows got none of it. That was found once for `searchTxt`, fixed, and
|
|
357
|
+
* documented in a comment directly above the pipeline — and `listingType`
|
|
358
|
+
* stayed inside the spread, so the same bug survived its own fix one field
|
|
359
|
+
* over, under a comment describing it. A missing `listingType` is silent in the
|
|
360
|
+
* worst way: `normalizeListingType` returns `?? "standard"` so the row looks
|
|
361
|
+
* right in every inspection, while a Firestore equality cannot match an absent
|
|
362
|
+
* field — the row is absent from its own catalogue while rendering perfectly by
|
|
363
|
+
* slug (Root Cause #101).
|
|
364
|
+
*
|
|
365
|
+
* `audit-seed-listing-type` is strict-zero on exactly that, with no suppression
|
|
366
|
+
* marker, and it checks the slug prefix agrees too.
|
|
367
|
+
*/
|
|
368
|
+
export const productsSparesSeedData = _rawProductsSparesSeedData.map(withFinalSale).map(withDerivedCategoryNames);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* WHY: Seeds a minimal, Beyblade-focused catalog of standard product listings — 2 products per
|
|
3
|
-
* generation (Original, Metal Fight, Burst
|
|
3
|
+
* generation (Original, Metal Fight, Burst), all from the Beyblade Arena store, plus
|
|
4
4
|
* 4 video-demo products so the product gallery's video slide (theater-mode playback,
|
|
5
5
|
* zoom/rotate, fullscreen) has real, playable fixtures covering every supported video
|
|
6
6
|
* source: a raw file from Google's public sample-video bucket (x2, one per Original/X),
|
|
@@ -9,11 +9,19 @@
|
|
|
9
9
|
* 2026-08-21). A real MediaUploadField file-upload video can't be reproduced from seed
|
|
10
10
|
* data (no Storage object actually exists for a seeded URL to point at) — that path is
|
|
11
11
|
* covered by a tester-checklist manual test case instead, not a fixture here.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
12
|
+
*
|
|
13
|
+
* 🛑 The Beyblade X pair (2 of the original "2 per generation") was REMOVED 2026-10-19 —
|
|
14
|
+
* both were fictional (one named itself "Wizard Arrow 4-60F" while filed under the real
|
|
15
|
+
* `category-wizardarrow-4-80b`, a different model; the other, "CrimsonGaruda 4-70TP",
|
|
16
|
+
* matches nothing in the research corpus). Real, wiki-verified Beyblade X products —
|
|
17
|
+
* including a real WizardArrow 4-80B — now live in `products-beyblade-x-seed-data.ts`.
|
|
18
|
+
*
|
|
19
|
+
* WHAT: Exports 13 standard products with listingType:"standard", covering the Original,
|
|
20
|
+
* Metal Fight and Burst generation leaf categories (tagged with both leaf + root
|
|
21
|
+
* category slugs). Beyblade X real content is a separate file — see above.
|
|
14
22
|
*
|
|
15
23
|
* EXPORTS:
|
|
16
|
-
* productsStandardSeedData — Array of
|
|
24
|
+
* productsStandardSeedData — Array of 13 standard products with listingType:"standard"
|
|
17
25
|
*
|
|
18
26
|
* @tag domain:products,catalog
|
|
19
27
|
* @tag layer:seed
|
|
@@ -24,7 +32,7 @@
|
|
|
24
32
|
*/
|
|
25
33
|
import { PRODUCT_FIELDS } from "../constants/field-names.js";
|
|
26
34
|
import { buildSearchTxt } from "../utils/search-txt.js";
|
|
27
|
-
import { seedPhoto } from "./_helpers/media.js";
|
|
35
|
+
import { seedPhoto, seedGallery } from "./_helpers/media.js";
|
|
28
36
|
import { withFinalSale } from "./_helpers/final-sale-fixtures.js";
|
|
29
37
|
import { withDerivedCategoryNames } from "./_helpers/category-names.js";
|
|
30
38
|
/*
|
|
@@ -199,11 +207,7 @@ const _rawProductsStandardSeedData = [
|
|
|
199
207
|
availableQuantity: 4,
|
|
200
208
|
isSold: false,
|
|
201
209
|
mainImage: seedPhoto("product-image-beyblade-original-dranzer-s-1-20260101", 900, 900),
|
|
202
|
-
images:
|
|
203
|
-
seedPhoto("product-image-beyblade-original-dranzer-s-1-20260101", 900, 900),
|
|
204
|
-
seedPhoto("product-image-beyblade-original-dranzer-s-2-20260101", 900, 900),
|
|
205
|
-
seedPhoto("product-image-beyblade-original-dranzer-s-3-20260101", 900, 900),
|
|
206
|
-
],
|
|
210
|
+
images: seedGallery(seedPhoto("product-image-beyblade-original-dranzer-s-1-20260101", 900, 900), seedPhoto("product-image-beyblade-original-dranzer-s-2-20260101", 900, 900), seedPhoto("product-image-beyblade-original-dranzer-s-3-20260101", 900, 900)),
|
|
207
211
|
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
208
212
|
condition: PRODUCT_FIELDS.CONDITION_VALUES.LIKE_NEW,
|
|
209
213
|
featured: true,
|
|
@@ -245,11 +249,7 @@ const _rawProductsStandardSeedData = [
|
|
|
245
249
|
availableQuantity: 2,
|
|
246
250
|
isSold: false,
|
|
247
251
|
mainImage: seedPhoto("product-image-beyblade-original-driger-v-1-20260101", 900, 900),
|
|
248
|
-
images:
|
|
249
|
-
seedPhoto("product-image-beyblade-original-driger-v-1-20260101", 900, 900),
|
|
250
|
-
seedPhoto("product-image-beyblade-original-driger-v-2-20260101", 900, 900),
|
|
251
|
-
seedPhoto("product-image-beyblade-original-driger-v-3-20260101", 900, 900),
|
|
252
|
-
],
|
|
252
|
+
images: seedGallery(seedPhoto("product-image-beyblade-original-driger-v-1-20260101", 900, 900), seedPhoto("product-image-beyblade-original-driger-v-2-20260101", 900, 900), seedPhoto("product-image-beyblade-original-driger-v-3-20260101", 900, 900)),
|
|
253
253
|
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
254
254
|
condition: PRODUCT_FIELDS.CONDITION_VALUES.GOOD,
|
|
255
255
|
tags: ["vintage-collectible"],
|
|
@@ -277,11 +277,7 @@ const _rawProductsStandardSeedData = [
|
|
|
277
277
|
availableQuantity: 6,
|
|
278
278
|
isSold: false,
|
|
279
279
|
mainImage: seedPhoto("product-image-beyblade-metal-storm-pegasus-1-20260101", 900, 900),
|
|
280
|
-
images:
|
|
281
|
-
seedPhoto("product-image-beyblade-metal-storm-pegasus-1-20260101", 900, 900),
|
|
282
|
-
seedPhoto("product-image-beyblade-metal-storm-pegasus-2-20260101", 900, 900),
|
|
283
|
-
seedPhoto("product-image-beyblade-metal-storm-pegasus-3-20260101", 900, 900),
|
|
284
|
-
],
|
|
280
|
+
images: seedGallery(seedPhoto("product-image-beyblade-metal-storm-pegasus-1-20260101", 900, 900), seedPhoto("product-image-beyblade-metal-storm-pegasus-2-20260101", 900, 900), seedPhoto("product-image-beyblade-metal-storm-pegasus-3-20260101", 900, 900)),
|
|
285
281
|
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
286
282
|
condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
|
|
287
283
|
featured: true,
|
|
@@ -309,11 +305,7 @@ const _rawProductsStandardSeedData = [
|
|
|
309
305
|
availableQuantity: 3,
|
|
310
306
|
isSold: false,
|
|
311
307
|
mainImage: seedPhoto("product-image-beyblade-metal-flame-sagittario-1-20260101", 900, 900),
|
|
312
|
-
images:
|
|
313
|
-
seedPhoto("product-image-beyblade-metal-flame-sagittario-1-20260101", 900, 900),
|
|
314
|
-
seedPhoto("product-image-beyblade-metal-flame-sagittario-2-20260101", 900, 900),
|
|
315
|
-
seedPhoto("product-image-beyblade-metal-flame-sagittario-3-20260101", 900, 900),
|
|
316
|
-
],
|
|
308
|
+
images: seedGallery(seedPhoto("product-image-beyblade-metal-flame-sagittario-1-20260101", 900, 900), seedPhoto("product-image-beyblade-metal-flame-sagittario-2-20260101", 900, 900), seedPhoto("product-image-beyblade-metal-flame-sagittario-3-20260101", 900, 900)),
|
|
317
309
|
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
318
310
|
condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
|
|
319
311
|
tags: ["balance-type", "tournament-grade"],
|
|
@@ -341,11 +333,7 @@ const _rawProductsStandardSeedData = [
|
|
|
341
333
|
availableQuantity: 10,
|
|
342
334
|
isSold: false,
|
|
343
335
|
mainImage: seedPhoto("product-image-beyblade-burst-valkyrie-1-20260101", 900, 900),
|
|
344
|
-
images:
|
|
345
|
-
seedPhoto("product-image-beyblade-burst-valkyrie-1-20260101", 900, 900),
|
|
346
|
-
seedPhoto("product-image-beyblade-burst-valkyrie-2-20260101", 900, 900),
|
|
347
|
-
seedPhoto("product-image-beyblade-burst-valkyrie-3-20260101", 900, 900),
|
|
348
|
-
],
|
|
336
|
+
images: seedGallery(seedPhoto("product-image-beyblade-burst-valkyrie-1-20260101", 900, 900), seedPhoto("product-image-beyblade-burst-valkyrie-2-20260101", 900, 900), seedPhoto("product-image-beyblade-burst-valkyrie-3-20260101", 900, 900)),
|
|
349
337
|
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
350
338
|
condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
|
|
351
339
|
featured: true,
|
|
@@ -373,11 +361,7 @@ const _rawProductsStandardSeedData = [
|
|
|
373
361
|
availableQuantity: 5,
|
|
374
362
|
isSold: false,
|
|
375
363
|
mainImage: seedPhoto("product-image-beyblade-burst-regalia-genesis-1-20260101", 900, 900),
|
|
376
|
-
images:
|
|
377
|
-
seedPhoto("product-image-beyblade-burst-regalia-genesis-1-20260101", 900, 900),
|
|
378
|
-
seedPhoto("product-image-beyblade-burst-regalia-genesis-2-20260101", 900, 900),
|
|
379
|
-
seedPhoto("product-image-beyblade-burst-regalia-genesis-3-20260101", 900, 900),
|
|
380
|
-
],
|
|
364
|
+
images: seedGallery(seedPhoto("product-image-beyblade-burst-regalia-genesis-1-20260101", 900, 900), seedPhoto("product-image-beyblade-burst-regalia-genesis-2-20260101", 900, 900), seedPhoto("product-image-beyblade-burst-regalia-genesis-3-20260101", 900, 900)),
|
|
381
365
|
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
382
366
|
condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
|
|
383
367
|
tags: ["attack-type"],
|
|
@@ -386,70 +370,19 @@ const _rawProductsStandardSeedData = [
|
|
|
386
370
|
createdAt: new Date("2026-04-20"),
|
|
387
371
|
updatedAt: new Date("2026-05-03"),
|
|
388
372
|
},
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
minOfferPercent: 70,
|
|
403
|
-
currency: "INR",
|
|
404
|
-
stockQuantity: 12,
|
|
405
|
-
availableQuantity: 12,
|
|
406
|
-
isSold: false,
|
|
407
|
-
mainImage: seedPhoto("product-image-beyblade-x-wizard-arrow-1-20260101", 900, 900),
|
|
408
|
-
images: [
|
|
409
|
-
seedPhoto("product-image-beyblade-x-wizard-arrow-1-20260101", 900, 900),
|
|
410
|
-
seedPhoto("product-image-beyblade-x-wizard-arrow-2-20260101", 900, 900),
|
|
411
|
-
seedPhoto("product-image-beyblade-x-wizard-arrow-3-20260101", 900, 900),
|
|
412
|
-
],
|
|
413
|
-
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
414
|
-
condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
|
|
415
|
-
featured: true,
|
|
416
|
-
tags: ["attack-type", "starter-set"],
|
|
417
|
-
storeId: "store-beyblade-arena",
|
|
418
|
-
storeName: "Beyblade Arena",
|
|
419
|
-
createdAt: new Date("2026-04-22"),
|
|
420
|
-
updatedAt: new Date("2026-05-04"),
|
|
421
|
-
},
|
|
422
|
-
{
|
|
423
|
-
id: "product-beyblade-x-knife-shinobi",
|
|
424
|
-
slug: "product-beyblade-x-knife-shinobi",
|
|
425
|
-
barcodeId: "LIR-BEY-X-002",
|
|
426
|
-
title: "Beyblade X CrimsonGaruda 4-70TP",
|
|
427
|
-
description: "CrimsonGaruda 4-70TP, a balance-type top with tournament-grade stamina parts.",
|
|
428
|
-
categorySlugs: ["category-crimsongaruda-4-70tp", "category-x-basic", "category-x-tops", "category-beyblade-x", "category-spinning-tops"],
|
|
429
|
-
categoryNames: ["Basic Line", "Beyblade X Tops", "Beyblade X", "Spinning Tops"],
|
|
430
|
-
brandSlug: "brand-takara-tomy",
|
|
431
|
-
brand: "Takara-Tomy",
|
|
432
|
-
price: 949,
|
|
433
|
-
allowOffers: true,
|
|
434
|
-
minOfferPercent: 70,
|
|
435
|
-
currency: "INR",
|
|
436
|
-
stockQuantity: 7,
|
|
437
|
-
availableQuantity: 7,
|
|
438
|
-
isSold: false,
|
|
439
|
-
mainImage: seedPhoto("product-image-beyblade-x-knife-shinobi-1-20260101", 900, 900),
|
|
440
|
-
images: [
|
|
441
|
-
seedPhoto("product-image-beyblade-x-knife-shinobi-1-20260101", 900, 900),
|
|
442
|
-
seedPhoto("product-image-beyblade-x-knife-shinobi-2-20260101", 900, 900),
|
|
443
|
-
seedPhoto("product-image-beyblade-x-knife-shinobi-3-20260101", 900, 900),
|
|
444
|
-
],
|
|
445
|
-
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
446
|
-
condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
|
|
447
|
-
tags: ["balance-type", "tournament-grade"],
|
|
448
|
-
storeId: "store-beyblade-arena",
|
|
449
|
-
storeName: "Beyblade Arena",
|
|
450
|
-
createdAt: new Date("2026-04-24"),
|
|
451
|
-
updatedAt: new Date("2026-05-04"),
|
|
452
|
-
},
|
|
373
|
+
/*
|
|
374
|
+
* ===== Beyblade X ===== — REMOVED 2026-10-19.
|
|
375
|
+
*
|
|
376
|
+
* Two fictional fixtures lived here: "Beyblade X BX-01 Wizard Arrow"
|
|
377
|
+
* (described as "Wizard Arrow 4-60F" while its own categorySlugs pointed at
|
|
378
|
+
* `category-wizardarrow-4-80b` — a different real model, 4-80B not 4-60F)
|
|
379
|
+
* and "Beyblade X CrimsonGaruda 4-70TP" (no such model exists in the
|
|
380
|
+
* research corpus at all). Both predate the real Beyblade X product seed
|
|
381
|
+
* (`products-beyblade-x-seed-data.ts`), which now occupies
|
|
382
|
+
* `category-wizardarrow-4-80b` with the real WizardArrow 4-80B Ver.2.0 —
|
|
383
|
+
* leaving the old entry in place would have put two differently-named
|
|
384
|
+
* "WizardArrow" products in the same category, one of them fictional.
|
|
385
|
+
*/
|
|
453
386
|
// ===== Video-demo fixtures — real playable video field for gallery testing =====
|
|
454
387
|
{
|
|
455
388
|
id: "product-beyblade-original-dragoon-f-video-demo",
|
|
@@ -467,10 +400,7 @@ const _rawProductsStandardSeedData = [
|
|
|
467
400
|
availableQuantity: 5,
|
|
468
401
|
isSold: false,
|
|
469
402
|
mainImage: seedPhoto("product-image-beyblade-original-dragoon-f-video-demo-1-20260819", 900, 900),
|
|
470
|
-
images:
|
|
471
|
-
seedPhoto("product-image-beyblade-original-dragoon-f-video-demo-1-20260819", 900, 900),
|
|
472
|
-
seedPhoto("product-image-beyblade-original-dragoon-f-video-demo-2-20260819", 900, 900),
|
|
473
|
-
],
|
|
403
|
+
images: seedGallery(seedPhoto("product-image-beyblade-original-dragoon-f-video-demo-1-20260819", 900, 900), seedPhoto("product-image-beyblade-original-dragoon-f-video-demo-2-20260819", 900, 900)),
|
|
474
404
|
video: {
|
|
475
405
|
url: "/demo-media/sample-video.mp4",
|
|
476
406
|
thumbnailUrl: seedPhoto("product-video-thumb-beyblade-original-dragoon-f-video-demo-20260819", 800, 450),
|
|
@@ -500,10 +430,7 @@ const _rawProductsStandardSeedData = [
|
|
|
500
430
|
availableQuantity: 8,
|
|
501
431
|
isSold: false,
|
|
502
432
|
mainImage: seedPhoto("product-image-beyblade-x-dran-sword-video-demo-1-20260819", 900, 900),
|
|
503
|
-
images:
|
|
504
|
-
seedPhoto("product-image-beyblade-x-dran-sword-video-demo-1-20260819", 900, 900),
|
|
505
|
-
seedPhoto("product-image-beyblade-x-dran-sword-video-demo-2-20260819", 900, 900),
|
|
506
|
-
],
|
|
433
|
+
images: seedGallery(seedPhoto("product-image-beyblade-x-dran-sword-video-demo-1-20260819", 900, 900), seedPhoto("product-image-beyblade-x-dran-sword-video-demo-2-20260819", 900, 900)),
|
|
507
434
|
video: {
|
|
508
435
|
url: "/demo-media/sample-video.mp4",
|
|
509
436
|
thumbnailUrl: seedPhoto("product-video-thumb-beyblade-x-dran-sword-video-demo-20260819", 800, 450),
|
|
@@ -541,10 +468,7 @@ const _rawProductsStandardSeedData = [
|
|
|
541
468
|
availableQuantity: 4,
|
|
542
469
|
isSold: false,
|
|
543
470
|
mainImage: seedPhoto("product-image-beyblade-metal-dark-bull-video-demo-1-20260821", 900, 900),
|
|
544
|
-
images:
|
|
545
|
-
seedPhoto("product-image-beyblade-metal-dark-bull-video-demo-1-20260821", 900, 900),
|
|
546
|
-
seedPhoto("product-image-beyblade-metal-dark-bull-video-demo-2-20260821", 900, 900),
|
|
547
|
-
],
|
|
471
|
+
images: seedGallery(seedPhoto("product-image-beyblade-metal-dark-bull-video-demo-1-20260821", 900, 900), seedPhoto("product-image-beyblade-metal-dark-bull-video-demo-2-20260821", 900, 900)),
|
|
548
472
|
video: {
|
|
549
473
|
// audit-seed-external-url-ok: MediaUploadField's YouTube tab always stores a
|
|
550
474
|
// youtube.com/watch?v= URL — this is exactly that shape, not a raw file.
|
|
@@ -583,10 +507,7 @@ const _rawProductsStandardSeedData = [
|
|
|
583
507
|
availableQuantity: 7,
|
|
584
508
|
isSold: false,
|
|
585
509
|
mainImage: seedPhoto("product-image-beyblade-burst-spryzen-video-demo-1-20260821", 900, 900),
|
|
586
|
-
images:
|
|
587
|
-
seedPhoto("product-image-beyblade-burst-spryzen-video-demo-1-20260821", 900, 900),
|
|
588
|
-
seedPhoto("product-image-beyblade-burst-spryzen-video-demo-2-20260821", 900, 900),
|
|
589
|
-
],
|
|
510
|
+
images: seedGallery(seedPhoto("product-image-beyblade-burst-spryzen-video-demo-1-20260821", 900, 900), seedPhoto("product-image-beyblade-burst-spryzen-video-demo-2-20260821", 900, 900)),
|
|
590
511
|
video: {
|
|
591
512
|
url: "https://upload.wikimedia.org/wikipedia/commons/4/42/Slow_motion_of_running_greyhound.webm", // audit-seed-external-url-ok: raw <video> src, CC-BY-SA 4.0 (Wikimedia Commons)
|
|
592
513
|
thumbnailUrl: seedPhoto("product-video-thumb-beyblade-burst-spryzen-video-demo-20260821", 800, 450),
|
|
@@ -619,10 +540,7 @@ const _rawProductsStandardSeedData = [
|
|
|
619
540
|
availableQuantity: 0,
|
|
620
541
|
isSold: true,
|
|
621
542
|
mainImage: seedPhoto("product-image-dran-buster-sold-out-1-20260824", 900, 900),
|
|
622
|
-
images:
|
|
623
|
-
seedPhoto("product-image-dran-buster-sold-out-1-20260824", 900, 900),
|
|
624
|
-
seedPhoto("product-image-dran-buster-sold-out-2-20260824", 900, 900),
|
|
625
|
-
],
|
|
543
|
+
images: seedGallery(seedPhoto("product-image-dran-buster-sold-out-1-20260824", 900, 900), seedPhoto("product-image-dran-buster-sold-out-2-20260824", 900, 900)),
|
|
626
544
|
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
627
545
|
condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
|
|
628
546
|
tags: ["attack-type", "sold-out"],
|
|
@@ -646,9 +564,7 @@ const _rawProductsStandardSeedData = [
|
|
|
646
564
|
availableQuantity: 0,
|
|
647
565
|
isSold: true,
|
|
648
566
|
mainImage: seedPhoto("product-image-valtryek-v3-sold-out-1-20260824", 900, 900),
|
|
649
|
-
images:
|
|
650
|
-
seedPhoto("product-image-valtryek-v3-sold-out-1-20260824", 900, 900),
|
|
651
|
-
],
|
|
567
|
+
images: seedGallery(seedPhoto("product-image-valtryek-v3-sold-out-1-20260824", 900, 900)),
|
|
652
568
|
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
653
569
|
condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
|
|
654
570
|
tags: ["balance-type", "sold-out"],
|
|
@@ -697,10 +613,7 @@ const _rawProductsStandardSeedData = [
|
|
|
697
613
|
availableQuantity: 6,
|
|
698
614
|
isSold: false,
|
|
699
615
|
mainImage: seedPhoto("product-image-beypointer-digital-battle-counter-1-20261012", 900, 900),
|
|
700
|
-
images:
|
|
701
|
-
seedPhoto("product-image-beypointer-digital-battle-counter-1-20261012", 900, 900),
|
|
702
|
-
seedPhoto("product-image-beypointer-digital-battle-counter-2-20261012", 900, 900),
|
|
703
|
-
],
|
|
616
|
+
images: seedGallery(seedPhoto("product-image-beypointer-digital-battle-counter-1-20261012", 900, 900), seedPhoto("product-image-beypointer-digital-battle-counter-2-20261012", 900, 900)),
|
|
704
617
|
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
705
618
|
condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
|
|
706
619
|
tags: ["accessory"],
|