@mohasinac/appkit 4.57.0 → 4.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-stamp.json +4 -4
- package/dist/_internal/server/features/beys/data.d.ts +44 -0
- package/dist/_internal/server/features/beys/data.js +107 -0
- package/dist/_internal/server/features/beys/og.d.ts +42 -0
- package/dist/_internal/server/features/beys/og.js +89 -0
- package/dist/_internal/server/features/parts/data.js +3 -2
- package/dist/_internal/server/jobs/handlers/messages.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/messages.js +1 -1
- package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
- package/dist/_internal/shared/actions/action-registry.js +86 -0
- package/dist/_internal/shared/types/base-document.d.ts +1 -1
- package/dist/client.d.ts +2 -0
- package/dist/client.js +1 -0
- package/dist/constants/api-endpoints.d.ts +12 -0
- package/dist/constants/api-endpoints.js +10 -0
- package/dist/constants/field-names.d.ts +46 -0
- package/dist/constants/field-names.js +46 -0
- package/dist/constants/seed-meta.d.ts +113 -0
- package/dist/constants/seed-meta.js +91 -0
- package/dist/features/admin/components/AdminBeysView.d.ts +27 -0
- package/dist/features/admin/components/AdminBeysView.js +178 -0
- package/dist/features/admin/components/AdminPartsView.d.ts +27 -0
- package/dist/features/admin/components/AdminPartsView.js +160 -0
- package/dist/features/admin/components/OwnerQuickActions.d.ts +19 -2
- package/dist/features/admin/components/OwnerQuickActions.js +31 -3
- package/dist/features/admin/components/RecordOwnerQuickActions.d.ts +31 -0
- package/dist/features/admin/components/RecordOwnerQuickActions.js +128 -0
- package/dist/features/admin/components/ReferenceRecordEditor.d.ts +45 -0
- package/dist/features/admin/components/ReferenceRecordEditor.js +153 -0
- package/dist/features/admin/schemas/firestore.d.ts +1 -1
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +15 -2
- package/dist/features/auth/permissions/constants.d.ts +1 -1
- package/dist/features/auth/permissions/constants.js +12 -1
- package/dist/features/beys/components/BeyDetailPageView.d.ts +50 -0
- package/dist/features/beys/components/BeyDetailPageView.js +98 -0
- package/dist/features/beys/schemas/firestore.d.ts +417 -0
- package/dist/features/beys/schemas/firestore.js +65 -0
- package/dist/features/blog/components/BlogFeaturedCard.js +15 -2
- package/dist/features/blog/components/BlogPostView.js +2 -2
- package/dist/features/categories/components/BrandDetailPageView.js +4 -2
- package/dist/features/categories/components/BundleDetailView.js +2 -2
- package/dist/features/categories/components/CategoryDetailPageView.js +36 -3
- package/dist/features/categories/components/CategoryGrid.js +24 -2
- package/dist/features/categories/components/FranchiseDetailPageView.js +2 -3
- package/dist/features/events/components/EventCard.js +15 -2
- package/dist/features/grouped/components/GroupedListingDetailView.js +2 -3
- package/dist/features/homepage/components/CustomCardsSection.js +67 -50
- package/dist/features/homepage/components/ShopByCategorySection.js +23 -10
- package/dist/features/homepage/schemas/index.d.ts +10 -10
- package/dist/features/parts/components/PartDetailPageView.js +5 -3
- package/dist/features/parts/components/PartsSearchBox.js +79 -4
- package/dist/features/parts/schemas/admin-edit.d.ts +81 -0
- package/dist/features/parts/schemas/admin-edit.js +89 -0
- package/dist/features/parts/schemas/firestore.d.ts +2 -1
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +15 -2
- package/dist/features/products/components/MarketplaceBundleCard.js +15 -2
- package/dist/features/products/components/MarketplacePrizeDrawCard.js +15 -2
- package/dist/features/products/components/ProductGrid.js +18 -2
- package/dist/features/products/schemas/firestore.d.ts +18 -0
- package/dist/features/seller/components/CategoryInlineSelect.d.ts +10 -1
- package/dist/features/seller/components/CategoryInlineSelect.js +53 -5
- package/dist/features/seller/components/SellerProductShell.d.ts +39 -0
- package/dist/features/seller/components/SellerProductShell.js +31 -3
- package/dist/index.d.ts +6 -129
- package/dist/index.js +61 -292
- package/dist/next/routing/route-map.d.ts +13 -1
- package/dist/next/routing/route-map.js +37 -0
- package/dist/schemas/registry.d.ts +6 -6
- package/dist/server.d.ts +2 -69
- package/dist/server.js +8 -69
- package/dist/styles.css +468 -1
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/PosterCard.d.ts +99 -0
- package/dist/ui/components/PosterCard.js +109 -0
- package/dist/ui/components/PosterCard.style.css +466 -0
- package/dist/ui/components/index.style.css +1 -0
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +2 -0
- package/package.json +4 -2
- package/scripts/seed-cli.mjs +177 -2
- package/dist/features/tester/seed-data/_happy-path.d.ts +0 -23
- package/dist/features/tester/seed-data/_happy-path.js +0 -710
- package/dist/features/tester/seed-data/_money-flows.d.ts +0 -23
- package/dist/features/tester/seed-data/_money-flows.js +0 -610
- package/dist/features/tester/seed-data/authored/_types.d.ts +0 -57
- package/dist/features/tester/seed-data/authored/_types.js +0 -35
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +0 -226
- package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +0 -329
- package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__address-filters.js +0 -41
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +0 -76
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +0 -78
- package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__state-picker.js +0 -59
- package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__unban-request.js +0 -77
- package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.js +0 -151
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +0 -265
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +0 -131
- package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.js +0 -143
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +0 -207
- package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bundles.js +0 -144
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +0 -265
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +0 -318
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +0 -177
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +0 -165
- package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__content-deletes.js +0 -267
- package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__content-marketing.js +0 -188
- package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__coupons.js +0 -215
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +0 -202
- package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.js +0 -249
- package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__media-watermark.js +0 -148
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +0 -350
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +0 -129
- package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__site-system.js +0 -586
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +0 -260
- package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__users-trust.js +0 -569
- package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__bidding.js +0 -449
- package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +0 -684
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +0 -546
- package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +0 -379
- package/dist/features/tester/seed-data/authored/buying__cart.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__cart.js +0 -1264
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +0 -122
- package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__my-orders.js +0 -279
- package/dist/features/tester/seed-data/authored/buying__offers.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__offers.js +0 -1127
- package/dist/features/tester/seed-data/authored/buying__order-detail-actions.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__order-detail-actions.js +0 -153
- package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +0 -252
- package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__product-detail.js +0 -474
- package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__return-request.js +0 -165
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +0 -260
- package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__reviews.js +0 -128
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +0 -96
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +0 -283
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +0 -169
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +0 -105
- package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +0 -374
- package/dist/features/tester/seed-data/authored/community-support__messages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/community-support__messages.js +0 -200
- package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/community-support__public-profile.js +0 -54
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +0 -76
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +0 -4
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +0 -590
- package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__blog.js +0 -110
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +0 -149
- package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.js +0 -145
- package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +0 -174
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +0 -169
- package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.js +0 -209
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +0 -207
- package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +0 -377
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +0 -87
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +0 -147
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +0 -209
- package/dist/features/tester/seed-data/authored/content-discovery__parts-database.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +0 -167
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +0 -73
- package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__search.js +0 -363
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +0 -340
- package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.js +0 -88
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +0 -78
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +0 -76
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +0 -62
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +0 -163
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +0 -61
- package/dist/features/tester/seed-data/authored/design-ux__action-bar-placement.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__action-bar-placement.js +0 -89
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +0 -95
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +0 -191
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +0 -158
- package/dist/features/tester/seed-data/authored/design-ux__feature-badge-picker.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__feature-badge-picker.js +0 -82
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +0 -106
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +0 -88
- package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__general-design.js +0 -204
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +0 -301
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +0 -90
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.js +0 -85
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +0 -407
- package/dist/features/tester/seed-data/authored/design-ux__nav-reachability.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__nav-reachability.js +0 -88
- package/dist/features/tester/seed-data/authored/design-ux__rich-text-readability.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__rich-text-readability.js +0 -84
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +0 -214
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +0 -275
- package/dist/features/tester/seed-data/authored/index.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/index.js +0 -301
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +0 -125
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +0 -85
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +0 -92
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +0 -115
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +0 -137
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +0 -263
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +0 -229
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +0 -325
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +0 -126
- package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.js +0 -141
- package/dist/features/tester/seed-data/authored/public-pages__store-tabs.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__store-tabs.js +0 -115
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +0 -253
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +0 -93
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +0 -3
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +0 -185
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +0 -82
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +0 -60
- package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__become-seller.js +0 -117
- package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.js +0 -148
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +0 -108
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +0 -274
- package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.js +0 -145
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +0 -336
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +0 -136
- package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +0 -135
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +0 -155
- package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.js +0 -138
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +0 -191
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +0 -138
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +0 -106
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +0 -192
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +0 -109
- package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-guide.js +0 -34
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +0 -348
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +0 -87
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +0 -90
- package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.js +0 -85
- package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-orders.js +0 -213
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +0 -192
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +0 -77
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +0 -165
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +0 -116
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +0 -127
- package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__og-images.js +0 -107
- package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__page-metadata.js +0 -120
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +0 -105
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +0 -58
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +0 -284
- package/dist/features/tester/seed-data/index.d.ts +0 -2
- package/dist/features/tester/seed-data/index.js +0 -2
- package/dist/features/tester/seed-data/tester-checklist-seed-data.d.ts +0 -2
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +0 -7601
- package/dist/features/tester/seed-data/tester-responses-seed-data.d.ts +0 -2
- package/dist/features/tester/seed-data/tester-responses-seed-data.js +0 -95
- package/dist/features/tester/seed-data/tester-window.d.ts +0 -25
- package/dist/features/tester/seed-data/tester-window.js +0 -66
- package/dist/seed/_helpers/brand-rows.d.ts +0 -35
- package/dist/seed/_helpers/brand-rows.js +0 -600
- package/dist/seed/_helpers/category-content-generated.d.ts +0 -24
- package/dist/seed/_helpers/category-content-generated.js +0 -1853
- package/dist/seed/_helpers/category-content.d.ts +0 -68
- package/dist/seed/_helpers/category-content.js +0 -731
- package/dist/seed/_helpers/category-forest.d.ts +0 -4
- package/dist/seed/_helpers/category-forest.js +0 -824
- package/dist/seed/_helpers/category-images-generated.d.ts +0 -57
- package/dist/seed/_helpers/category-images-generated.js +0 -618
- package/dist/seed/_helpers/category-models/chunk0.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk0.js +0 -2648
- package/dist/seed/_helpers/category-models/chunk1.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk1.js +0 -2318
- package/dist/seed/_helpers/category-models/chunk2.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk2.js +0 -2560
- package/dist/seed/_helpers/category-models/chunk3.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk3.js +0 -2196
- package/dist/seed/_helpers/category-models/chunk4.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk4.js +0 -1732
- package/dist/seed/_helpers/category-models.d.ts +0 -12
- package/dist/seed/_helpers/category-models.js +0 -45
- package/dist/seed/_helpers/category-names.d.ts +0 -54
- package/dist/seed/_helpers/category-names.js +0 -118
- package/dist/seed/_helpers/category-parts-glossary-map.d.ts +0 -1
- package/dist/seed/_helpers/category-parts-glossary-map.js +0 -2499
- package/dist/seed/_helpers/category-parts.d.ts +0 -9
- package/dist/seed/_helpers/category-parts.js +0 -15022
- package/dist/seed/_helpers/category-tree.d.ts +0 -27
- package/dist/seed/_helpers/category-tree.js +0 -119
- package/dist/seed/_helpers/character-features.d.ts +0 -10
- package/dist/seed/_helpers/character-features.js +0 -120
- package/dist/seed/_helpers/final-sale-fixtures.d.ts +0 -35
- package/dist/seed/_helpers/final-sale-fixtures.js +0 -61
- package/dist/seed/_helpers/franchise-rows.d.ts +0 -43
- package/dist/seed/_helpers/franchise-rows.js +0 -189
- package/dist/seed/_helpers/media.d.ts +0 -67
- package/dist/seed/_helpers/media.js +0 -172
- package/dist/seed/_helpers/part-colours-generated.d.ts +0 -18
- package/dist/seed/_helpers/part-colours-generated.js +0 -273
- package/dist/seed/_helpers/product-search-txt.d.ts +0 -18
- package/dist/seed/_helpers/product-search-txt.js +0 -23
- package/dist/seed/_helpers/search-txt-wrappers.d.ts +0 -26
- package/dist/seed/_helpers/search-txt-wrappers.js +0 -58
- package/dist/seed/addresses-seed-data.d.ts +0 -2
- package/dist/seed/addresses-seed-data.js +0 -78
- package/dist/seed/authenticity-knowledge-seed-data.d.ts +0 -78
- package/dist/seed/authenticity-knowledge-seed-data.js +0 -10729
- package/dist/seed/bids-seed-data.d.ts +0 -2
- package/dist/seed/bids-seed-data.js +0 -206
- package/dist/seed/blog-posts-seed-data.d.ts +0 -6
- package/dist/seed/blog-posts-seed-data.js +0 -442
- package/dist/seed/carousel-slides-seed-data.d.ts +0 -2
- package/dist/seed/carousel-slides-seed-data.js +0 -411
- package/dist/seed/carousels-seed-data.d.ts +0 -2
- package/dist/seed/carousels-seed-data.js +0 -36
- package/dist/seed/cart-seed-data.d.ts +0 -2
- package/dist/seed/cart-seed-data.js +0 -241
- package/dist/seed/catalogue-seed-data.d.ts +0 -2
- package/dist/seed/catalogue-seed-data.js +0 -112
- package/dist/seed/categories-seed-data.d.ts +0 -3
- package/dist/seed/categories-seed-data.js +0 -816
- package/dist/seed/claimed-coupons-seed-data.d.ts +0 -2
- package/dist/seed/claimed-coupons-seed-data.js +0 -85
- package/dist/seed/coupon-usage-seed-data.d.ts +0 -9
- package/dist/seed/coupon-usage-seed-data.js +0 -55
- package/dist/seed/coupons-seed-data.d.ts +0 -2
- package/dist/seed/coupons-seed-data.js +0 -226
- package/dist/seed/defaults/categories.d.ts +0 -2
- package/dist/seed/defaults/categories.js +0 -12
- package/dist/seed/defaults/faqs.d.ts +0 -2
- package/dist/seed/defaults/faqs.js +0 -40
- package/dist/seed/events-seed-data.d.ts +0 -7
- package/dist/seed/events-seed-data.js +0 -482
- package/dist/seed/factories/address.factory.d.ts +0 -21
- package/dist/seed/factories/address.factory.js +0 -44
- package/dist/seed/factories/bid.factory.d.ts +0 -15
- package/dist/seed/factories/bid.factory.js +0 -33
- package/dist/seed/factories/blog-post.factory.d.ts +0 -15
- package/dist/seed/factories/blog-post.factory.js +0 -22
- package/dist/seed/factories/carousel.factory.d.ts +0 -11
- package/dist/seed/factories/carousel.factory.js +0 -17
- package/dist/seed/factories/cart.factory.d.ts +0 -25
- package/dist/seed/factories/cart.factory.js +0 -35
- package/dist/seed/factories/category.factory.d.ts +0 -11
- package/dist/seed/factories/category.factory.js +0 -16
- package/dist/seed/factories/coupon.factory.d.ts +0 -21
- package/dist/seed/factories/coupon.factory.js +0 -43
- package/dist/seed/factories/faq.factory.d.ts +0 -10
- package/dist/seed/factories/faq.factory.js +0 -15
- package/dist/seed/factories/notification.factory.d.ts +0 -18
- package/dist/seed/factories/notification.factory.js +0 -39
- package/dist/seed/factories/order.factory.d.ts +0 -20
- package/dist/seed/factories/order.factory.js +0 -20
- package/dist/seed/factories/payout.factory.d.ts +0 -21
- package/dist/seed/factories/payout.factory.js +0 -38
- package/dist/seed/factories/product.factory.d.ts +0 -27
- package/dist/seed/factories/product.factory.js +0 -80
- package/dist/seed/factories/review.factory.d.ts +0 -14
- package/dist/seed/factories/review.factory.js +0 -52
- package/dist/seed/factories/session.factory.d.ts +0 -15
- package/dist/seed/factories/session.factory.js +0 -31
- package/dist/seed/factories/store.factory.d.ts +0 -23
- package/dist/seed/factories/store.factory.js +0 -47
- package/dist/seed/factories/user.factory.d.ts +0 -19
- package/dist/seed/factories/user.factory.js +0 -56
- package/dist/seed/faq-seed-data.d.ts +0 -18
- package/dist/seed/faq-seed-data.js +0 -1956
- package/dist/seed/firestore-indexes.d.ts +0 -12
- package/dist/seed/firestore-indexes.js +0 -31
- package/dist/seed/grouped-listings-seed-data.d.ts +0 -2
- package/dist/seed/grouped-listings-seed-data.js +0 -283
- package/dist/seed/history-seed-data.d.ts +0 -12
- package/dist/seed/history-seed-data.js +0 -70
- package/dist/seed/homepage-sections-seed-data.d.ts +0 -2
- package/dist/seed/homepage-sections-seed-data.js +0 -1018
- package/dist/seed/index.d.ts +0 -98
- package/dist/seed/index.js +0 -112
- package/dist/seed/lottery-entries-seed-data.d.ts +0 -2
- package/dist/seed/lottery-entries-seed-data.js +0 -108
- package/dist/seed/manifest.d.ts +0 -16
- package/dist/seed/manifest.js +0 -235
- package/dist/seed/media-assets-seed-data.d.ts +0 -22
- package/dist/seed/media-assets-seed-data.js +0 -5593
- package/dist/seed/model-composition-seed-data.d.ts +0 -15
- package/dist/seed/model-composition-seed-data.js +0 -9032
- package/dist/seed/notifications-seed-data.d.ts +0 -2
- package/dist/seed/notifications-seed-data.js +0 -606
- package/dist/seed/offers-seed-data.d.ts +0 -2
- package/dist/seed/offers-seed-data.js +0 -398
- package/dist/seed/orders-seed-data.d.ts +0 -2
- package/dist/seed/orders-seed-data.js +0 -845
- package/dist/seed/part-glossary/chunk0.d.ts +0 -9
- package/dist/seed/part-glossary/chunk0.js +0 -35448
- package/dist/seed/part-glossary/chunk1.d.ts +0 -9
- package/dist/seed/part-glossary/chunk1.js +0 -40494
- package/dist/seed/part-glossary/chunk2.d.ts +0 -9
- package/dist/seed/part-glossary/chunk2.js +0 -51242
- package/dist/seed/part-glossary/chunk3.d.ts +0 -9
- package/dist/seed/part-glossary/chunk3.js +0 -53337
- package/dist/seed/part-glossary/chunk4.d.ts +0 -9
- package/dist/seed/part-glossary/chunk4.js +0 -51454
- package/dist/seed/part-glossary-seed-data.d.ts +0 -15
- package/dist/seed/part-glossary-seed-data.js +0 -25
- package/dist/seed/payouts-seed-data.d.ts +0 -2
- package/dist/seed/payouts-seed-data.js +0 -302
- package/dist/seed/product-features-seed-data.d.ts +0 -3
- package/dist/seed/product-features-seed-data.js +0 -366
- package/dist/seed/products-art-seed-data.d.ts +0 -2
- package/dist/seed/products-art-seed-data.js +0 -289
- package/dist/seed/products-auctions-seed-data.d.ts +0 -2
- package/dist/seed/products-auctions-seed-data.js +0 -475
- package/dist/seed/products-beyblade-x-seed-data.d.ts +0 -2
- package/dist/seed/products-beyblade-x-seed-data.js +0 -476
- package/dist/seed/products-catalogue-seed-data.d.ts +0 -22
- package/dist/seed/products-catalogue-seed-data.js +0 -86384
- package/dist/seed/products-classifieds-seed-data.d.ts +0 -7
- package/dist/seed/products-classifieds-seed-data.js +0 -435
- package/dist/seed/products-digital-codes-seed-data.d.ts +0 -7
- package/dist/seed/products-digital-codes-seed-data.js +0 -395
- package/dist/seed/products-live-items-seed-data.d.ts +0 -7
- package/dist/seed/products-live-items-seed-data.js +0 -269
- package/dist/seed/products-preorders-seed-data.d.ts +0 -2
- package/dist/seed/products-preorders-seed-data.js +0 -360
- package/dist/seed/products-prize-draws-seed-data.d.ts +0 -7
- package/dist/seed/products-prize-draws-seed-data.js +0 -427
- package/dist/seed/products-spares-seed-data.d.ts +0 -2
- package/dist/seed/products-spares-seed-data.js +0 -368
- package/dist/seed/products-standard-seed-data.d.ts +0 -2
- package/dist/seed/products-standard-seed-data.js +0 -632
- package/dist/seed/products-stickers-seed-data.d.ts +0 -2
- package/dist/seed/products-stickers-seed-data.js +0 -319
- package/dist/seed/reviews-seed-data.d.ts +0 -1
- package/dist/seed/reviews-seed-data.js +0 -185
- package/dist/seed/runner.d.ts +0 -2
- package/dist/seed/runner.js +0 -125
- package/dist/seed/scammers-seed-data.d.ts +0 -2
- package/dist/seed/scammers-seed-data.js +0 -235
- package/dist/seed/seed-market-config.d.ts +0 -48
- package/dist/seed/seed-market-config.js +0 -199
- package/dist/seed/seed-purpose.d.ts +0 -299
- package/dist/seed/seed-purpose.js +0 -431
- package/dist/seed/sessions-seed-data.d.ts +0 -3
- package/dist/seed/sessions-seed-data.js +0 -116
- package/dist/seed/shipments-seed-data.d.ts +0 -5
- package/dist/seed/shipments-seed-data.js +0 -185
- package/dist/seed/site-settings-seed-data.d.ts +0 -2
- package/dist/seed/site-settings-seed-data.js +0 -1069
- package/dist/seed/store-addresses-seed-data.d.ts +0 -18
- package/dist/seed/store-addresses-seed-data.js +0 -71
- package/dist/seed/store-extensions-seed-data.d.ts +0 -11
- package/dist/seed/store-extensions-seed-data.js +0 -292
- package/dist/seed/stores-seed-data.d.ts +0 -6
- package/dist/seed/stores-seed-data.js +0 -242
- package/dist/seed/support-tickets-seed-data.d.ts +0 -16
- package/dist/seed/support-tickets-seed-data.js +0 -239
- package/dist/seed/tax-codes-seed-data.d.ts +0 -34
- package/dist/seed/tax-codes-seed-data.js +0 -100
- package/dist/seed/test-data-ttl.d.ts +0 -29
- package/dist/seed/test-data-ttl.js +0 -31
- package/dist/seed/test-utils.d.ts +0 -49
- package/dist/seed/test-utils.js +0 -110
- package/dist/seed/types.d.ts +0 -89
- package/dist/seed/types.js +0 -15
- package/dist/seed/users-seed-data.d.ts +0 -2
- package/dist/seed/users-seed-data.js +0 -597
- package/dist/seed/wishlists-seed-data.d.ts +0 -12
- package/dist/seed/wishlists-seed-data.js +0 -54
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import type { CategoryDocument } from "../../features/categories/schemas";
|
|
2
|
-
/** The authoring shape — only the fields a human should have to write. */
|
|
3
|
-
export interface CategoryTreeNode {
|
|
4
|
-
/** Doc id AND slug; they are always equal for categories (`id === slug`). */
|
|
5
|
-
id: string;
|
|
6
|
-
name: string;
|
|
7
|
-
description: string;
|
|
8
|
-
/** Per-row extras: display, seo, highlights, faqs, isFeatured, … */
|
|
9
|
-
extra?: Partial<CategoryDocument>;
|
|
10
|
-
children?: CategoryTreeNode[];
|
|
11
|
-
}
|
|
12
|
-
export interface BuildCategoryTreeOptions {
|
|
13
|
-
createdBy: string;
|
|
14
|
-
createdAt: Date;
|
|
15
|
-
updatedAt: Date;
|
|
16
|
-
/** Applied to every row unless the node's own `extra` overrides it. */
|
|
17
|
-
defaults?: Partial<CategoryDocument>;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Flatten a forest of nested nodes into seed rows with every structural field
|
|
21
|
-
* computed.
|
|
22
|
-
*
|
|
23
|
-
* Traversal is DFS pre-order, and `position` is a single counter running across
|
|
24
|
-
* ALL roots — the numbering is global to the collection, not per-tree, which is
|
|
25
|
-
* what `onCategoryWrite`'s range shifting assumes.
|
|
26
|
-
*/
|
|
27
|
-
export declare function buildCategoryTree(roots: CategoryTreeNode[], opts: BuildCategoryTreeOptions): Partial<CategoryDocument>[];
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* WHY: `CategoryDocument` requires nine interlocking structural fields on every
|
|
3
|
-
* row — rootId, parentIds (the FULL ancestor chain), childrenIds, tier,
|
|
4
|
-
* path, isLeaf, ancestors, position and subtreeSize. Hand-writing those
|
|
5
|
-
* across a real tree guarantees mistakes, and the seed already had them:
|
|
6
|
-
* the old root claimed `subtreeSize: 4` at `position: 0` while all four of
|
|
7
|
-
* its children ALSO sat at positions 0-3, which is not a valid DFS
|
|
8
|
-
* pre-order numbering.
|
|
9
|
-
* WHAT: Declare the tree once as a nested literal; derive every structural
|
|
10
|
-
* field from it. Purely deterministic — no Math.random, no Date.now — so
|
|
11
|
-
* reseeding is idempotent (Root Cause #25).
|
|
12
|
-
*
|
|
13
|
-
* EXPORTS:
|
|
14
|
-
* CategoryTreeNode — the authoring shape (id/name/... plus `children`)
|
|
15
|
-
* buildCategoryTree — nested literal -> flat Partial<CategoryDocument>[]
|
|
16
|
-
*
|
|
17
|
-
* `position`/`subtreeSize` are DFS pre-order coordinates: a node's subtree
|
|
18
|
-
* occupies exactly `[position, position + subtreeSize - 1]`, which is what lets
|
|
19
|
-
* `onCategoryWrite` shift ranges on insert/delete. Seeding them correctly means
|
|
20
|
-
* that Function has nothing to repair on first write.
|
|
21
|
-
*
|
|
22
|
-
* @tag domain:categories
|
|
23
|
-
* @tag layer:seed
|
|
24
|
-
* @tag pattern:derived
|
|
25
|
-
* @tag access:server-only
|
|
26
|
-
* @tag consumers:seed/categories-seed-data.ts
|
|
27
|
-
* @tag sideEffects:none
|
|
28
|
-
*/
|
|
29
|
-
/**
|
|
30
|
-
* Flatten a forest of nested nodes into seed rows with every structural field
|
|
31
|
-
* computed.
|
|
32
|
-
*
|
|
33
|
-
* Traversal is DFS pre-order, and `position` is a single counter running across
|
|
34
|
-
* ALL roots — the numbering is global to the collection, not per-tree, which is
|
|
35
|
-
* what `onCategoryWrite`'s range shifting assumes.
|
|
36
|
-
*/
|
|
37
|
-
export function buildCategoryTree(roots, opts) {
|
|
38
|
-
const rows = [];
|
|
39
|
-
/*
|
|
40
|
-
* 🛑 1-BASED, and that is not cosmetic — it must match `positionsReconcile`,
|
|
41
|
-
* which starts its own DFS at `let counter = 1`.
|
|
42
|
-
*
|
|
43
|
-
* This counter started at 0 until 2026-10-10. The nightly reconcile then
|
|
44
|
-
* found every row off by one (`current.position !== position`) and rewrote
|
|
45
|
-
* the entire collection on the first run after any reseed — 58 writes then,
|
|
46
|
-
* ~330 once the catalogue grows, each re-entering `onCategoryWrite` as a
|
|
47
|
-
* no-op invocation. Measured in production before the change: seed emits
|
|
48
|
-
* 0..57, live data reads 1..58, i.e. the reconcile had already corrected
|
|
49
|
-
* all of it.
|
|
50
|
-
*
|
|
51
|
-
* It also makes position 0 UNAMBIGUOUS, which `handleCategoryWrite` now
|
|
52
|
-
* relies on: a document arriving with `position >= 1` was numbered by this
|
|
53
|
-
* builder, and one with 0/absent was not.
|
|
54
|
-
*/
|
|
55
|
-
let position = 1;
|
|
56
|
-
function visit(node, rootId,
|
|
57
|
-
/** Ancestors nearest-last, matching how `parentIds` is read elsewhere. */
|
|
58
|
-
ancestors, tier, parentPath, order) {
|
|
59
|
-
const myPosition = position++;
|
|
60
|
-
// The slug segment is the id minus its `category-` prefix, so
|
|
61
|
-
// `spinning-tops/beyblade-burst/burst-parts` reads as a real path.
|
|
62
|
-
const segment = node.id.replace(/^category-/, "");
|
|
63
|
-
const path = parentPath ? `${parentPath}/${segment}` : segment;
|
|
64
|
-
const children = node.children ?? [];
|
|
65
|
-
// `seo` and `display` are REQUIRED on CategoryDocument, so synthesise
|
|
66
|
-
// sensible ones rather than make every row hand-write a block. A node that
|
|
67
|
-
// wants a real icon/cover/keywords overrides via `extra`, which is spread
|
|
68
|
-
// last.
|
|
69
|
-
const seo = {
|
|
70
|
-
title: `${node.name} | LetItRip`,
|
|
71
|
-
description: node.description,
|
|
72
|
-
keywords: node.name.toLowerCase().split(/\s+/).filter(Boolean),
|
|
73
|
-
};
|
|
74
|
-
const display = {
|
|
75
|
-
// Deeper rows are navigational, not menu-worthy: showing all four tiers
|
|
76
|
-
// in the header menu would drown it.
|
|
77
|
-
showInMenu: tier <= 1,
|
|
78
|
-
showInFooter: false,
|
|
79
|
-
};
|
|
80
|
-
const row = {
|
|
81
|
-
...opts.defaults,
|
|
82
|
-
seo,
|
|
83
|
-
display,
|
|
84
|
-
id: node.id,
|
|
85
|
-
slug: node.id,
|
|
86
|
-
name: node.name,
|
|
87
|
-
description: node.description,
|
|
88
|
-
rootId,
|
|
89
|
-
parentIds: ancestors.map((a) => a.id),
|
|
90
|
-
childrenIds: children.map((c) => c.id),
|
|
91
|
-
ancestors: ancestors.map((a) => ({ ...a })),
|
|
92
|
-
tier,
|
|
93
|
-
path,
|
|
94
|
-
order,
|
|
95
|
-
isLeaf: children.length === 0,
|
|
96
|
-
position: myPosition,
|
|
97
|
-
createdBy: opts.createdBy,
|
|
98
|
-
createdAt: opts.createdAt,
|
|
99
|
-
updatedAt: opts.updatedAt,
|
|
100
|
-
...node.extra,
|
|
101
|
-
};
|
|
102
|
-
rows.push(row);
|
|
103
|
-
const nextAncestors = [
|
|
104
|
-
...ancestors,
|
|
105
|
-
{ id: node.id, name: node.name, tier },
|
|
106
|
-
];
|
|
107
|
-
let descendants = 0;
|
|
108
|
-
children.forEach((child, index) => {
|
|
109
|
-
descendants += visit(child, rootId, nextAncestors, tier + 1, path, index + 1);
|
|
110
|
-
});
|
|
111
|
-
// A node's subtree spans itself plus everything beneath it.
|
|
112
|
-
row.subtreeSize = descendants + 1;
|
|
113
|
-
return row.subtreeSize;
|
|
114
|
-
}
|
|
115
|
-
for (const [index, root] of roots.entries()) {
|
|
116
|
-
visit(root, root.id, [], 0, "", index + 1);
|
|
117
|
-
}
|
|
118
|
-
return rows;
|
|
119
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/** A blader, and how many canonical beys the corpus attributes to them. */
|
|
2
|
-
export interface CharacterSeed {
|
|
3
|
-
/** Without the `feature-` prefix — the factory prepends it. */
|
|
4
|
-
slug: string;
|
|
5
|
-
name: string;
|
|
6
|
-
/** Canonical beys owned. Drives display order; not stored on the row. */
|
|
7
|
-
beyCount: number;
|
|
8
|
-
}
|
|
9
|
-
export declare const CHARACTER_SEEDS: CharacterSeed[];
|
|
10
|
-
export declare const CHARACTER_SEED_COUNT = 95;
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* GENERATED by scripts/gen-category-models.mjs — do not edit by hand.
|
|
3
|
-
*
|
|
4
|
-
* WHY: the clickable owner linkage. `Owner (Anime)` is 100% populated in the
|
|
5
|
-
* corpus but it is a SENTENCE — "Tyson Granger (Tyson's 9th and final
|
|
6
|
-
* bey)" — so it renders as prose and filters nothing. These are the
|
|
7
|
-
* normalised names as `character`-group features, which makes
|
|
8
|
-
* "show me every Tyson Granger bey" one click from any listing page.
|
|
9
|
-
*
|
|
10
|
-
* 🛑 A FEATURE and never a category node. A blader crosses every generation —
|
|
11
|
-
* Tyson owns nine beys spanning Spin Gear, Magnacore, Engine Gear and HMS —
|
|
12
|
-
* so a tree node would duplicate all nine under a second parent and break
|
|
13
|
-
* the one-chain-per-product invariant. As a feature it COMPOSES with the
|
|
14
|
-
* generation tree instead of competing with it: browse Beyblade Original,
|
|
15
|
-
* then narrow to Tyson's.
|
|
16
|
-
*
|
|
17
|
-
* @tag domain:products
|
|
18
|
-
* @tag layer:seed
|
|
19
|
-
* @tag pattern:generated
|
|
20
|
-
* @tag access:server-only
|
|
21
|
-
* @tag sideEffects:none
|
|
22
|
-
*/
|
|
23
|
-
export const CHARACTER_SEEDS = [
|
|
24
|
-
{ slug: "blader-tyson-granger", name: "Tyson Granger", beyCount: 9 },
|
|
25
|
-
{ slug: "blader-kai-hiwatari", name: "Kai Hiwatari", beyCount: 8 },
|
|
26
|
-
{ slug: "blader-shu-kurenai", name: "Shu Kurenai", beyCount: 7 },
|
|
27
|
-
{ slug: "blader-daichi-sumeragi", name: "Daichi Sumeragi", beyCount: 6 },
|
|
28
|
-
{ slug: "blader-max-tate", name: "Max Tate", beyCount: 6 },
|
|
29
|
-
{ slug: "blader-ray-kon", name: "Ray Kon", beyCount: 6 },
|
|
30
|
-
{ slug: "blader-gingka-hagane", name: "Gingka Hagane", beyCount: 5 },
|
|
31
|
-
{ slug: "blader-lui-shirosagi", name: "Lui Shirosagi", beyCount: 5 },
|
|
32
|
-
{ slug: "blader-tala", name: "Tala", beyCount: 5 },
|
|
33
|
-
{ slug: "blader-valt-aoi", name: "Valt Aoi", beyCount: 5 },
|
|
34
|
-
{ slug: "blader-free-de-la-hoya", name: "Free De La Hoya", beyCount: 4 },
|
|
35
|
-
{ slug: "blader-aiger-akabane", name: "Aiger Akabane", beyCount: 3 },
|
|
36
|
-
{ slug: "blader-dante-koryu", name: "Dante Koryu", beyCount: 3 },
|
|
37
|
-
{ slug: "blader-jaxon-cross", name: "Jaxon Cross", beyCount: 3 },
|
|
38
|
-
{ slug: "blader-kenta-yumiya", name: "Kenta Yumiya", beyCount: 3 },
|
|
39
|
-
{ slug: "blader-kyoya-tategami", name: "Kyoya Tategami", beyCount: 3 },
|
|
40
|
-
{ slug: "blader-multi-nana-iro", name: "Multi Nana-iro", beyCount: 3 },
|
|
41
|
-
{ slug: "blader-ryuga", name: "Ryuga", beyCount: 3 },
|
|
42
|
-
{ slug: "blader-benkei-hanawa", name: "Benkei Hanawa", beyCount: 2 },
|
|
43
|
-
{ slug: "blader-daigo-kurogami", name: "Daigo Kurogami", beyCount: 2 },
|
|
44
|
-
{ slug: "blader-damian-hart", name: "Damian Hart", beyCount: 2 },
|
|
45
|
-
{ slug: "blader-dashan-wang", name: "Dashan Wang", beyCount: 2 },
|
|
46
|
-
{ slug: "blader-delta-zakuro", name: "Delta Zakuro", beyCount: 2 },
|
|
47
|
-
{ slug: "blader-dunga", name: "Dunga", beyCount: 2 },
|
|
48
|
-
{ slug: "blader-eddy", name: "Eddy", beyCount: 2 },
|
|
49
|
-
{ slug: "blader-fumiya-kindo", name: "Fumiya Kindo", beyCount: 2 },
|
|
50
|
-
{ slug: "blader-hikaru-hizashi", name: "Hikaru Hizashi", beyCount: 2 },
|
|
51
|
-
{ slug: "blader-hyde", name: "Hyde", beyCount: 2 },
|
|
52
|
-
{ slug: "blader-jin-of-the-gale", name: "Jin of the Gale", beyCount: 2 },
|
|
53
|
-
{ slug: "blader-kira-hayama", name: "Kira Hayama", beyCount: 2 },
|
|
54
|
-
{ slug: "blader-lee", name: "Lee", beyCount: 2 },
|
|
55
|
-
{ slug: "blader-masamune-kadoya", name: "Masamune Kadoya", beyCount: 2 },
|
|
56
|
-
{ slug: "blader-michael-summers", name: "Michael Summers", beyCount: 2 },
|
|
57
|
-
{ slug: "blader-miguel", name: "Miguel", beyCount: 2 },
|
|
58
|
-
{ slug: "blader-ozuma", name: "Ozuma", beyCount: 2 },
|
|
59
|
-
{ slug: "blader-rago", name: "Rago", beyCount: 2 },
|
|
60
|
-
{ slug: "blader-robin-kazami", name: "Robin Kazami", beyCount: 2 },
|
|
61
|
-
{ slug: "blader-tsubasa-otori", name: "Tsubasa Otori", beyCount: 2 },
|
|
62
|
-
{ slug: "blader-wakiya-murasaki", name: "Wakiya Murasaki", beyCount: 2 },
|
|
63
|
-
{ slug: "blader-xander-shakadera", name: "Xander Shakadera", beyCount: 2 },
|
|
64
|
-
{ slug: "blader-yu-tendo", name: "Yu Tendo", beyCount: 2 },
|
|
65
|
-
{ slug: "blader-aguma", name: "Aguma", beyCount: 1 },
|
|
66
|
-
{ slug: "blader-akuya-onizaki", name: "Akuya Onizaki", beyCount: 1 },
|
|
67
|
-
{ slug: "blader-anime", name: "Anime", beyCount: 1 },
|
|
68
|
-
{ slug: "blader-anime-secondary", name: "Anime-secondary", beyCount: 1 },
|
|
69
|
-
{ slug: "blader-blader-dj", name: "Blader DJ", beyCount: 1 },
|
|
70
|
-
{ slug: "blader-brooklyn", name: "Brooklyn", beyCount: 1 },
|
|
71
|
-
{ slug: "blader-burn-fujiwara", name: "Burn Fujiwara", beyCount: 1 },
|
|
72
|
-
{ slug: "blader-chris", name: "Chris", beyCount: 1 },
|
|
73
|
-
{ slug: "blader-claude", name: "Claude", beyCount: 1 },
|
|
74
|
-
{ slug: "blader-clio-delon", name: "Clio Delon", beyCount: 1 },
|
|
75
|
-
{ slug: "blader-crusher", name: "Crusher", beyCount: 1 },
|
|
76
|
-
{ slug: "blader-cycnus", name: "Cycnus", beyCount: 1 },
|
|
77
|
-
{ slug: "blader-dan-sodo-and-reiki-sodo", name: "Dan Sodo and Reiki Sodo", beyCount: 1 },
|
|
78
|
-
{ slug: "blader-doji", name: "Doji", beyCount: 1 },
|
|
79
|
-
{ slug: "blader-faust", name: "Faust", beyCount: 1 },
|
|
80
|
-
{ slug: "blader-fubuki-sumiye", name: "Fubuki Sumiye", beyCount: 1 },
|
|
81
|
-
{ slug: "blader-garland-siebald", name: "Garland Siebald", beyCount: 1 },
|
|
82
|
-
{ slug: "blader-gary", name: "Gary", beyCount: 1 },
|
|
83
|
-
{ slug: "blader-ginro", name: "Ginro", beyCount: 1 },
|
|
84
|
-
{ slug: "blader-hikaru-hasama", name: "Hikaru Hasama", beyCount: 1 },
|
|
85
|
-
{ slug: "blader-hokuto", name: "Hokuto", beyCount: 1 },
|
|
86
|
-
{ slug: "blader-hyoma", name: "Hyoma", beyCount: 1 },
|
|
87
|
-
{ slug: "blader-hyuga-hizashi", name: "Hyuga Hizashi", beyCount: 1 },
|
|
88
|
-
{ slug: "blader-ian-papov", name: "Ian Papov", beyCount: 1 },
|
|
89
|
-
{ slug: "blader-johnny-mcgregor", name: "Johnny McGregor", beyCount: 1 },
|
|
90
|
-
{ slug: "blader-joseph-burton", name: "Joseph Burton", beyCount: 1 },
|
|
91
|
-
{ slug: "blader-julia-fernandez", name: "Julia Fernandez", beyCount: 1 },
|
|
92
|
-
{ slug: "blader-julian-konzern", name: "Julian Konzern", beyCount: 1 },
|
|
93
|
-
{ slug: "blader-karla-konjiki", name: "Karla Konjiki", beyCount: 1 },
|
|
94
|
-
{ slug: "blader-ken-midori", name: "Ken Midori", beyCount: 1 },
|
|
95
|
-
{ slug: "blader-kenny", name: "Kenny", beyCount: 1 },
|
|
96
|
-
{ slug: "blader-kevin", name: "Kevin", beyCount: 1 },
|
|
97
|
-
{ slug: "blader-kite-unabara", name: "Kite Unabara", beyCount: 1 },
|
|
98
|
-
{ slug: "blader-lain-valhalla", name: "Lain Valhalla", beyCount: 1 },
|
|
99
|
-
{ slug: "blader-meiko-myoden", name: "Meiko Myoden", beyCount: 1 },
|
|
100
|
-
{ slug: "blader-nile", name: "Nile", beyCount: 1 },
|
|
101
|
-
{ slug: "blader-nine-kurosu", name: "Nine Kurosu", beyCount: 1 },
|
|
102
|
-
{ slug: "blader-omega-shiroboshi", name: "Omega Shiroboshi", beyCount: 1 },
|
|
103
|
-
{ slug: "blader-phi", name: "Phi", beyCount: 1 },
|
|
104
|
-
{ slug: "blader-reiji-mizuchi", name: "Reiji Mizuchi", beyCount: 1 },
|
|
105
|
-
{ slug: "blader-reiyu-kuwabara", name: "Reiyu Kuwabara", beyCount: 1 },
|
|
106
|
-
{ slug: "blader-rex-jura", name: "Rex Jura", beyCount: 1 },
|
|
107
|
-
{ slug: "blader-rick-anderson", name: "Rick Anderson", beyCount: 1 },
|
|
108
|
-
{ slug: "blader-robert-jurgens", name: "Robert Jurgens", beyCount: 1 },
|
|
109
|
-
{ slug: "blader-sakyo-kurayami", name: "Sakyo Kurayami", beyCount: 1 },
|
|
110
|
-
{ slug: "blader-silas-karlisle", name: "Silas Karlisle", beyCount: 1 },
|
|
111
|
-
{ slug: "blader-spencer", name: "Spencer", beyCount: 1 },
|
|
112
|
-
{ slug: "blader-teru-saotome", name: "Teru Saotome", beyCount: 1 },
|
|
113
|
-
{ slug: "blader-tobio-oike", name: "Tobio Oike", beyCount: 1 },
|
|
114
|
-
{ slug: "blader-toby", name: "Toby", beyCount: 1 },
|
|
115
|
-
{ slug: "blader-toguro-okunaga", name: "Toguro Okunaga", beyCount: 1 },
|
|
116
|
-
{ slug: "blader-yuki-mizusawa", name: "Yuki Mizusawa", beyCount: 1 },
|
|
117
|
-
{ slug: "blader-yuni-naniwa", name: "Yuni Naniwa", beyCount: 1 },
|
|
118
|
-
{ slug: "blader-zyro-kurogane", name: "Zyro Kurogane", beyCount: 1 },
|
|
119
|
-
];
|
|
120
|
-
export const CHARACTER_SEED_COUNT = 95;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import type { ProductDocument } from "../../features/products/schemas";
|
|
2
|
-
/**
|
|
3
|
-
* Seeded listings that explicitly ACCEPT change-of-mind returns.
|
|
4
|
-
*
|
|
5
|
-
* `finalSale` is absent on every other fixture, and absent means final sale —
|
|
6
|
-
* so the default path is exercised by the bulk of the catalogue exactly as it
|
|
7
|
-
* will be in production, where the field did not exist until now and no
|
|
8
|
-
* pre-existing document carries it.
|
|
9
|
-
*
|
|
10
|
-
* One per listing type, deliberately. The "Final Sale" badge and the refund
|
|
11
|
-
* gate both branch on this, and a badge that renders identically on every row
|
|
12
|
-
* proves nothing: without at least one opted-out fixture per type there is no
|
|
13
|
-
* way to tell "the predicate works" from "the predicate returns a constant".
|
|
14
|
-
* That is the same reason the availability work seeded one unavailable row per
|
|
15
|
-
* type rather than trusting the shared checks.
|
|
16
|
-
*
|
|
17
|
-
* Ids are listed rather than a `finalSale: false` written inline at each
|
|
18
|
-
* record because the records live in nine files with five different export
|
|
19
|
-
* wrappers, and a per-record edit is invisible to review — this set can be
|
|
20
|
-
* read in one glance and cross-checked against the badge.
|
|
21
|
-
*/
|
|
22
|
-
export declare const RETURNABLE_FIXTURE_IDS: ReadonlySet<string>;
|
|
23
|
-
/**
|
|
24
|
-
* Set `finalSale: false` on the opted-out fixtures and leave it ABSENT on
|
|
25
|
-
* every other record.
|
|
26
|
-
*
|
|
27
|
-
* Absent rather than `finalSale: true`, on purpose: writing the default
|
|
28
|
-
* explicitly would mean the seed never produces the shape that production data
|
|
29
|
-
* actually has, so `isFinalSale`'s handling of `undefined` — the only part of
|
|
30
|
-
* it that can be got wrong — would go untested by the entire fixture set.
|
|
31
|
-
*
|
|
32
|
-
* Pure and deterministic, so it does not reintroduce the `appkit-seed`
|
|
33
|
-
* idempotency problem of Root Cause #25.
|
|
34
|
-
*/
|
|
35
|
-
export declare function withFinalSale(p: Partial<ProductDocument>): Partial<ProductDocument>;
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Seeded listings that explicitly ACCEPT change-of-mind returns.
|
|
3
|
-
*
|
|
4
|
-
* `finalSale` is absent on every other fixture, and absent means final sale —
|
|
5
|
-
* so the default path is exercised by the bulk of the catalogue exactly as it
|
|
6
|
-
* will be in production, where the field did not exist until now and no
|
|
7
|
-
* pre-existing document carries it.
|
|
8
|
-
*
|
|
9
|
-
* One per listing type, deliberately. The "Final Sale" badge and the refund
|
|
10
|
-
* gate both branch on this, and a badge that renders identically on every row
|
|
11
|
-
* proves nothing: without at least one opted-out fixture per type there is no
|
|
12
|
-
* way to tell "the predicate works" from "the predicate returns a constant".
|
|
13
|
-
* That is the same reason the availability work seeded one unavailable row per
|
|
14
|
-
* type rather than trusting the shared checks.
|
|
15
|
-
*
|
|
16
|
-
* Ids are listed rather than a `finalSale: false` written inline at each
|
|
17
|
-
* record because the records live in nine files with five different export
|
|
18
|
-
* wrappers, and a per-record edit is invisible to review — this set can be
|
|
19
|
-
* read in one glance and cross-checked against the badge.
|
|
20
|
-
*/
|
|
21
|
-
export const RETURNABLE_FIXTURE_IDS = new Set([
|
|
22
|
-
// standard
|
|
23
|
-
"product-beyblade-burst-valkyrie",
|
|
24
|
-
// auction
|
|
25
|
-
"auction-beyblade-x-shark-edge",
|
|
26
|
-
// pre-order
|
|
27
|
-
"preorder-beyblade-x-bx-09-glide-ring",
|
|
28
|
-
// prize-draw
|
|
29
|
-
"prizedraw-beyblade-scheduled-demo",
|
|
30
|
-
// classified
|
|
31
|
-
"classified-beyblade-x-starter-pune",
|
|
32
|
-
// digital-code
|
|
33
|
-
"digitalcode-beyblade-x-app-legendary-pack",
|
|
34
|
-
// live
|
|
35
|
-
"live-bonsai-juniper-10yr",
|
|
36
|
-
// art
|
|
37
|
-
"art-valkyrie-holographic-print",
|
|
38
|
-
// stickers
|
|
39
|
-
"sticker-beyblade-x-holographic-pack",
|
|
40
|
-
]);
|
|
41
|
-
/**
|
|
42
|
-
* Set `finalSale: false` on the opted-out fixtures and leave it ABSENT on
|
|
43
|
-
* every other record.
|
|
44
|
-
*
|
|
45
|
-
* Absent rather than `finalSale: true`, on purpose: writing the default
|
|
46
|
-
* explicitly would mean the seed never produces the shape that production data
|
|
47
|
-
* actually has, so `isFinalSale`'s handling of `undefined` — the only part of
|
|
48
|
-
* it that can be got wrong — would go untested by the entire fixture set.
|
|
49
|
-
*
|
|
50
|
-
* Pure and deterministic, so it does not reintroduce the `appkit-seed`
|
|
51
|
-
* idempotency problem of Root Cause #25.
|
|
52
|
-
*/
|
|
53
|
-
export function withFinalSale(p) {
|
|
54
|
-
// Spread FIRST so a record that sets `finalSale` itself keeps its own value;
|
|
55
|
-
// this helper only fills in the opt-outs it owns.
|
|
56
|
-
const next = { ...p };
|
|
57
|
-
if (typeof next.finalSale === "undefined" && next.id && RETURNABLE_FIXTURE_IDS.has(next.id)) {
|
|
58
|
-
next.finalSale = false;
|
|
59
|
-
}
|
|
60
|
-
return next;
|
|
61
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import type { CategoryDocument } from "../../features/categories/schemas";
|
|
2
|
-
export interface FranchiseSeedInput {
|
|
3
|
-
/** Without the `franchise-` prefix. Products match on this, never the name. */
|
|
4
|
-
slug: string;
|
|
5
|
-
name: string;
|
|
6
|
-
description: string;
|
|
7
|
-
/** Live only when real stock exists — see the dead-facet rule above. */
|
|
8
|
-
active: boolean;
|
|
9
|
-
featured?: boolean;
|
|
10
|
-
keywords: string[];
|
|
11
|
-
seoDescription: string;
|
|
12
|
-
}
|
|
13
|
-
export declare function franchiseRow(input: FranchiseSeedInput, order: number, stamps: {
|
|
14
|
-
createdBy: string;
|
|
15
|
-
createdAt: Date;
|
|
16
|
-
updatedAt: Date;
|
|
17
|
-
}): Partial<CategoryDocument>;
|
|
18
|
-
export declare function buildFranchiseRows(stamps: {
|
|
19
|
-
createdBy: string;
|
|
20
|
-
createdAt: Date;
|
|
21
|
-
updatedAt: Date;
|
|
22
|
-
}): Partial<CategoryDocument>[];
|
|
23
|
-
export declare const FRANCHISE_ROW_COUNT: number;
|
|
24
|
-
/** The slugs a product's `franchiseSlug` may point at. */
|
|
25
|
-
export declare const FRANCHISE_SLUGS: readonly string[];
|
|
26
|
-
/**
|
|
27
|
-
* Category ROOT -> the franchise everything beneath it belongs to.
|
|
28
|
-
*
|
|
29
|
-
* Derived rather than stamped per product: a product already carries its full
|
|
30
|
-
* ancestor chain, so the root is free and cannot drift from the taxonomy the
|
|
31
|
-
* way a hand-written field would (Root Cause #42).
|
|
32
|
-
*
|
|
33
|
-
* 🛑 Deliberately PARTIAL. `category-living-collectibles` is absent because a
|
|
34
|
-
* juniper bonsai and a leucistic axolotl are not from an IP — they are living
|
|
35
|
-
* things. Mapping every root for completeness' sake would assert a franchise
|
|
36
|
-
* that does not exist, and "no franchise" is the correct answer for 4 of the
|
|
37
|
-
* 1,308 seeded products. A root with no entry yields no franchise, not a
|
|
38
|
-
* fallback.
|
|
39
|
-
*/
|
|
40
|
-
export declare const FRANCHISE_BY_CATEGORY_ROOT: Readonly<Record<string, {
|
|
41
|
-
slug: string;
|
|
42
|
-
name: string;
|
|
43
|
-
}>>;
|
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* WHY: a product's BRAND is who made it (Takara-Tomy); its FRANCHISE is what
|
|
3
|
-
* it is from (Beyblade). The site had no way to express the second, while
|
|
4
|
-
* `CharacterHotspot` shipped eighteen `/franchise/*` links to a route that
|
|
5
|
-
* did not exist. This is that unit, modelled on brands per the explicit
|
|
6
|
-
* instruction — "like brands make franchise its own separate unit".
|
|
7
|
-
*
|
|
8
|
-
* WHAT: one factory plus eight declarations.
|
|
9
|
-
*
|
|
10
|
-
* EXPORTS:
|
|
11
|
-
* FRANCHISE_ROWS — Partial<CategoryDocument>[], categoryType:"franchise"
|
|
12
|
-
* FRANCHISE_ROW_COUNT — asserted by the seed so a silent drop is loud
|
|
13
|
-
*
|
|
14
|
-
* ── 🛑 THE DEAD-FACET RULE, AND HOW THESE OBEY IT ─────────────────────────
|
|
15
|
-
*
|
|
16
|
-
* `brand-rows.ts` trap 3 states it exactly: *"A brand row with no product is a
|
|
17
|
-
* DEAD FACET, and worse than absent — it renders as a card in the grid that
|
|
18
|
-
* opens an empty page."* Seven of the eight rows below have no stock today,
|
|
19
|
-
* because this catalogue sells Beyblade.
|
|
20
|
-
*
|
|
21
|
-
* So they are seeded **`isActive: false`**. That is not a soft delete — the row
|
|
22
|
-
* exists, it is editable in the admin category editor, its page resolves, and
|
|
23
|
-
* `/franchise/marvel` stops being a 404. It is excluded from the grid and from
|
|
24
|
-
* search until it has something to sell, at which point one flag flips.
|
|
25
|
-
*
|
|
26
|
-
* The alternative readings were both worse: omitting them leaves eighteen links
|
|
27
|
-
* broken, and seeding them active puts seven empty shopfronts on a live grid.
|
|
28
|
-
*
|
|
29
|
-
* 🛑 `isActive` is therefore load-bearing here, not boilerplate. A future
|
|
30
|
-
* franchise row should be `false` until a product carries its `franchiseSlug`.
|
|
31
|
-
*
|
|
32
|
-
* ── Why tier-0 and outside the forest ─────────────────────────────────────
|
|
33
|
-
*
|
|
34
|
-
* Same as brands: `position` is NOT set, because these live outside the
|
|
35
|
-
* category forest's DFS numbering and a position inside it would corrupt the
|
|
36
|
-
* ranges `onCategoryWrite` shifts on insert.
|
|
37
|
-
*
|
|
38
|
-
* @tag domain:categories
|
|
39
|
-
* @tag layer:seed
|
|
40
|
-
* @tag pattern:shared-literal
|
|
41
|
-
* @tag access:server-only
|
|
42
|
-
* @tag consumers:seed/categories-seed-data.ts
|
|
43
|
-
* @tag sideEffects:none
|
|
44
|
-
*/
|
|
45
|
-
/* 🛑 `constants/field-names`, NOT the schema copy — there are two
|
|
46
|
-
* `CATEGORY_FIELDS` and only this one carries `CATEGORY_TYPE_VALUES`.
|
|
47
|
-
* `categories-seed-data.ts` imports this one; matching it is what keeps the
|
|
48
|
-
* discriminator a single spelling. Same reasoning as `brand-rows.ts`. */
|
|
49
|
-
import { CATEGORY_FIELDS } from "../../constants/field-names.js";
|
|
50
|
-
import { seedPhoto } from "./media.js";
|
|
51
|
-
export function franchiseRow(input, order, stamps) {
|
|
52
|
-
const id = `franchise-${input.slug}`;
|
|
53
|
-
return {
|
|
54
|
-
id,
|
|
55
|
-
slug: id,
|
|
56
|
-
name: input.name,
|
|
57
|
-
categoryType: CATEGORY_FIELDS.CATEGORY_TYPE_VALUES.FRANCHISE,
|
|
58
|
-
description: input.description,
|
|
59
|
-
rootId: id,
|
|
60
|
-
parentIds: [],
|
|
61
|
-
childrenIds: [],
|
|
62
|
-
ancestors: [],
|
|
63
|
-
tier: 0,
|
|
64
|
-
path: id,
|
|
65
|
-
isLeaf: true,
|
|
66
|
-
order,
|
|
67
|
-
/*
|
|
68
|
-
* A placeholder tile that a real wordmark OVERRIDES — same rule as
|
|
69
|
-
* `brand-rows.ts`: `withGeneratedCoverImage` treats a `/images/seed-tiles/`
|
|
70
|
-
* path as a default rather than a hand-authored decision. Only
|
|
71
|
-
* `franchise-beyblade` resolves a real one today; the other seven are the
|
|
72
|
-
* inactive dead-facet rows and keep the tile.
|
|
73
|
-
*
|
|
74
|
-
* `icon` stays unset — the brands grid reads `display.icon` first and an
|
|
75
|
-
* emoji there would beat a real cover image (brand-rows trap 2).
|
|
76
|
-
*/
|
|
77
|
-
display: {
|
|
78
|
-
coverImage: seedPhoto(`franchise-cover-${input.slug}-20261014`, 800, 800),
|
|
79
|
-
showInMenu: false,
|
|
80
|
-
showInFooter: false,
|
|
81
|
-
},
|
|
82
|
-
isFeatured: input.featured ?? false,
|
|
83
|
-
isActive: input.active,
|
|
84
|
-
isSearchable: input.active,
|
|
85
|
-
createdBy: stamps.createdBy,
|
|
86
|
-
createdAt: stamps.createdAt,
|
|
87
|
-
updatedAt: stamps.updatedAt,
|
|
88
|
-
seo: {
|
|
89
|
-
title: `${input.name} | LetItRip`,
|
|
90
|
-
description: input.seoDescription,
|
|
91
|
-
keywords: input.keywords,
|
|
92
|
-
},
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
/*
|
|
96
|
-
* The eight. Beyblade is the catalogue; the other seven are the IPs
|
|
97
|
-
* `CharacterHotspot` already links to, seeded inactive so those links resolve
|
|
98
|
-
* without advertising an empty shop.
|
|
99
|
-
*/
|
|
100
|
-
const INPUTS = [
|
|
101
|
-
{
|
|
102
|
-
slug: "beyblade",
|
|
103
|
-
name: "Beyblade",
|
|
104
|
-
description: "The spinning-top battling franchise — every generation from the original Spin Gear tops through Metal Fight, Burst and Beyblade X. Complete tops, loose parts, stadiums and accessories.",
|
|
105
|
-
active: true,
|
|
106
|
-
featured: true,
|
|
107
|
-
keywords: ["beyblade", "spinning tops", "burst", "metal fight", "beyblade x"],
|
|
108
|
-
seoDescription: "Shop Beyblade across every generation — tops, parts, stadiums and spares, new and pre-owned.",
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
slug: "marvel",
|
|
112
|
-
name: "Marvel",
|
|
113
|
-
description: "Figures, collectibles and merchandise from the Marvel universe.",
|
|
114
|
-
active: false,
|
|
115
|
-
keywords: ["marvel", "comics", "superhero", "figures"],
|
|
116
|
-
seoDescription: "Marvel collectibles and figures.",
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
slug: "dc-comics",
|
|
120
|
-
name: "DC Comics",
|
|
121
|
-
description: "Figures, collectibles and merchandise from the DC universe.",
|
|
122
|
-
active: false,
|
|
123
|
-
keywords: ["dc", "dc comics", "superhero", "figures"],
|
|
124
|
-
seoDescription: "DC Comics collectibles and figures.",
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
slug: "dragon-ball",
|
|
128
|
-
name: "Dragon Ball",
|
|
129
|
-
description: "Figures and collectibles from the Dragon Ball series.",
|
|
130
|
-
active: false,
|
|
131
|
-
keywords: ["dragon ball", "anime", "figures", "shonen"],
|
|
132
|
-
seoDescription: "Dragon Ball collectibles and figures.",
|
|
133
|
-
},
|
|
134
|
-
{
|
|
135
|
-
slug: "naruto",
|
|
136
|
-
name: "Naruto",
|
|
137
|
-
description: "Figures and collectibles from the Naruto series.",
|
|
138
|
-
active: false,
|
|
139
|
-
keywords: ["naruto", "anime", "figures", "shonen"],
|
|
140
|
-
seoDescription: "Naruto collectibles and figures.",
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
slug: "bleach",
|
|
144
|
-
name: "Bleach",
|
|
145
|
-
description: "Figures and collectibles from the Bleach series.",
|
|
146
|
-
active: false,
|
|
147
|
-
keywords: ["bleach", "anime", "figures", "shonen"],
|
|
148
|
-
seoDescription: "Bleach collectibles and figures.",
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
slug: "one-piece",
|
|
152
|
-
name: "One Piece",
|
|
153
|
-
description: "Figures and collectibles from the One Piece series.",
|
|
154
|
-
active: false,
|
|
155
|
-
keywords: ["one piece", "anime", "figures", "shonen"],
|
|
156
|
-
seoDescription: "One Piece collectibles and figures.",
|
|
157
|
-
},
|
|
158
|
-
{
|
|
159
|
-
slug: "one-punch-man",
|
|
160
|
-
name: "One Punch Man",
|
|
161
|
-
description: "Figures and collectibles from the One Punch Man series.",
|
|
162
|
-
active: false,
|
|
163
|
-
keywords: ["one punch man", "anime", "figures"],
|
|
164
|
-
seoDescription: "One Punch Man collectibles and figures.",
|
|
165
|
-
},
|
|
166
|
-
];
|
|
167
|
-
export function buildFranchiseRows(stamps) {
|
|
168
|
-
return INPUTS.map((input, i) => franchiseRow(input, i + 1, stamps));
|
|
169
|
-
}
|
|
170
|
-
export const FRANCHISE_ROW_COUNT = INPUTS.length;
|
|
171
|
-
/** The slugs a product's `franchiseSlug` may point at. */
|
|
172
|
-
export const FRANCHISE_SLUGS = INPUTS.map((i) => `franchise-${i.slug}`);
|
|
173
|
-
/**
|
|
174
|
-
* Category ROOT -> the franchise everything beneath it belongs to.
|
|
175
|
-
*
|
|
176
|
-
* Derived rather than stamped per product: a product already carries its full
|
|
177
|
-
* ancestor chain, so the root is free and cannot drift from the taxonomy the
|
|
178
|
-
* way a hand-written field would (Root Cause #42).
|
|
179
|
-
*
|
|
180
|
-
* 🛑 Deliberately PARTIAL. `category-living-collectibles` is absent because a
|
|
181
|
-
* juniper bonsai and a leucistic axolotl are not from an IP — they are living
|
|
182
|
-
* things. Mapping every root for completeness' sake would assert a franchise
|
|
183
|
-
* that does not exist, and "no franchise" is the correct answer for 4 of the
|
|
184
|
-
* 1,308 seeded products. A root with no entry yields no franchise, not a
|
|
185
|
-
* fallback.
|
|
186
|
-
*/
|
|
187
|
-
export const FRANCHISE_BY_CATEGORY_ROOT = {
|
|
188
|
-
"category-spinning-tops": { slug: "franchise-beyblade", name: "Beyblade" },
|
|
189
|
-
};
|