@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
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seed/test PROVENANCE METADATA β the vocabulary, not the data.
|
|
3
|
+
*
|
|
4
|
+
* ββ π WHY THIS IS IN `constants/` AND NOT IN `seed/` βββββββββββββββββββββ
|
|
5
|
+
*
|
|
6
|
+
* `appkit/src/seed/` is **61% of this package's source bytes and 60% of the
|
|
7
|
+
* published dist** β 540 files and 24.6 MB of pure fixture data that no
|
|
8
|
+
* runtime code reads. It is being extracted into its own package so a purge,
|
|
9
|
+
* a seed or a reseed stops requiring an appkit release, and so Turbopack stops
|
|
10
|
+
* tracing a graph through 24 MB of object literals.
|
|
11
|
+
*
|
|
12
|
+
* Two things stood in the way, and both were in `seed/` by accident of
|
|
13
|
+
* history rather than by nature:
|
|
14
|
+
*
|
|
15
|
+
* Β· `TEST_DATA_TTL_DAYS` / `testDataExpiresAt()` β a job handler re-exports
|
|
16
|
+
* them, so the SWEEP that reclaims expired fixtures depended on the
|
|
17
|
+
* fixture data shipping alongside it.
|
|
18
|
+
* Β· `SeedPurpose` β `BaseDocument` carries the field, so the base type of
|
|
19
|
+
* every document in the system pointed into the seed directory.
|
|
20
|
+
*
|
|
21
|
+
* Neither is data. A TTL and a three-value union are metadata ABOUT seeding
|
|
22
|
+
* that runtime code legitimately reads, so they live with the other shared
|
|
23
|
+
* constants and `seed/` keeps only rows.
|
|
24
|
+
*
|
|
25
|
+
* π What deliberately did NOT move: `SEED_COLLECTION_PURPOSE`,
|
|
26
|
+
* `SEED_ROW_PURPOSE` and `SEED_PURPOSE_DERIVED_FROM`. Those name specific
|
|
27
|
+
* collections and specific seeded ids β they are registries over the data, so
|
|
28
|
+
* they belong with it, and only `appkit-seed` and `audit-seed-purpose` read
|
|
29
|
+
* them.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* The TTL stamp every disposable test fixture must carry.
|
|
33
|
+
*
|
|
34
|
+
* π `isTestData: true` WITHOUT `testDataExpiresAt` means PERMANENT β nothing
|
|
35
|
+
* ever reclaims it (see `jobs/handlers/_helpers.ts`, which documents the same
|
|
36
|
+
* rule from the sweep's side). That is not a theoretical hazard: until
|
|
37
|
+
* 2026-10-10 the only two `isTestData` rows in the whole seed,
|
|
38
|
+
* `product-tester-crossstore-a` / `-b`, were in exactly that state β live in
|
|
39
|
+
* the public catalogue of 72 products, never purged, and one of them was
|
|
40
|
+
* `store-letitrip-official`'s ONLY buyable standard product, so it was hidden
|
|
41
|
+
* from every real buyer by `hidePublicTestData` while being the only thing
|
|
42
|
+
* that store had to sell. Both are deleted.
|
|
43
|
+
*
|
|
44
|
+
* And the reason they were permanent is that **this module had zero callers**.
|
|
45
|
+
* The helper that enforces the rule existed, was documented as the rule that
|
|
46
|
+
* matters most, and no fixture used it. So: a fixture's three obligations are
|
|
47
|
+
* an id containing `-test-`, `isTestData: true`, and an expiry FROM HERE.
|
|
48
|
+
*
|
|
49
|
+
* Recomputed fresh on every seed run (seed files are re-imported per
|
|
50
|
+
* invocation), so re-seeding naturally refreshes the expiry rather than
|
|
51
|
+
* leaving a fixture that expired between runs.
|
|
52
|
+
*
|
|
53
|
+
* π Do NOT re-declare the day count elsewhere. It used to be declared twice β
|
|
54
|
+
* in the seed directory and in `jobs/handlers/messages.ts` β with a comment as
|
|
55
|
+
* the only thing keeping them equal, which is the drift shape Root Cause #42
|
|
56
|
+
* describes. `messages.ts` re-exports this one.
|
|
57
|
+
*/
|
|
58
|
+
export declare const TEST_DATA_TTL_DAYS = 7;
|
|
59
|
+
export declare function testDataExpiresAt(): Date;
|
|
60
|
+
/**
|
|
61
|
+
* Why a seeded row exists β i.e. what a purge is allowed to do with it.
|
|
62
|
+
*
|
|
63
|
+
* π Not a severity scale. Two different answers to one question: never, and
|
|
64
|
+
* on request.
|
|
65
|
+
*/
|
|
66
|
+
export type SeedPurpose =
|
|
67
|
+
/**
|
|
68
|
+
* Clearable test data. **The default**, and what almost everything is.
|
|
69
|
+
*
|
|
70
|
+
* Users, stores, listings, auctions, orders, bids, reviews, offers, carts,
|
|
71
|
+
* payouts β everything seeded to exercise a path rather than to be read as
|
|
72
|
+
* content. `appkit-seed purge` removes these and nothing else.
|
|
73
|
+
*
|
|
74
|
+
* π `test` says nothing about PUBLIC VISIBILITY. A demo product is `test`
|
|
75
|
+
* and fully visible; that is what makes the demo a demo. Hiding a row from
|
|
76
|
+
* the public is `isTestData`, which is a separate decision.
|
|
77
|
+
*/
|
|
78
|
+
"test"
|
|
79
|
+
/**
|
|
80
|
+
* Real content. **A purge must NEVER remove it**, because re-creating it is
|
|
81
|
+
* not a re-seed, it is authoring.
|
|
82
|
+
*
|
|
83
|
+
* The test to apply: *if clearing this means somebody has to WRITE it again
|
|
84
|
+
* rather than re-run a loader, it is permanent.*
|
|
85
|
+
*
|
|
86
|
+
* That is why the **tester checklist cases** are in here and not in some
|
|
87
|
+
* harness tier β they are the real catalogue of issues the testers test
|
|
88
|
+
* against and keep updating, which is authored content that happens to be
|
|
89
|
+
* about testing. Its 1,500-odd cases are no more disposable than the 85 FAQs.
|
|
90
|
+
*/
|
|
91
|
+
| "permanent";
|
|
92
|
+
/**
|
|
93
|
+
* `Record<SeedPurpose, true>`, so a third value is a compile error in every map
|
|
94
|
+
* keyed on the union rather than a silent gap (Root Cause #61).
|
|
95
|
+
*/
|
|
96
|
+
export declare const SEED_PURPOSE_VALUES: Record<SeedPurpose, true>;
|
|
97
|
+
export declare const ALL_SEED_PURPOSES: SeedPurpose[];
|
|
98
|
+
export declare function isSeedPurpose(value: unknown): value is SeedPurpose;
|
|
99
|
+
/**
|
|
100
|
+
* π There is deliberately NO third `fixture` tier.
|
|
101
|
+
*
|
|
102
|
+
* An earlier draft had one, meaning "clearable but only by an explicit full
|
|
103
|
+
* purge", intended for the tester checklist. Once the cases were correctly
|
|
104
|
+
* classified as permanent content it had **nothing in it** β and a union member
|
|
105
|
+
* with no members is the dead-enum-value shape this codebase keeps paying for:
|
|
106
|
+
* a filter chip whose value no row carries returns zero rows forever and reads
|
|
107
|
+
* as a working control (Root Cause #33), and nine section types that exist in a
|
|
108
|
+
* dropdown and have never rendered.
|
|
109
|
+
*
|
|
110
|
+
* Two values answer the question that was actually asked. If a genuine third
|
|
111
|
+
* case appears, add it then β with a row that needs it.
|
|
112
|
+
*/
|
|
113
|
+
export declare const PURGEABLE: Record<SeedPurpose, boolean>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seed/test PROVENANCE METADATA β the vocabulary, not the data.
|
|
3
|
+
*
|
|
4
|
+
* ββ π WHY THIS IS IN `constants/` AND NOT IN `seed/` βββββββββββββββββββββ
|
|
5
|
+
*
|
|
6
|
+
* `appkit/src/seed/` is **61% of this package's source bytes and 60% of the
|
|
7
|
+
* published dist** β 540 files and 24.6 MB of pure fixture data that no
|
|
8
|
+
* runtime code reads. It is being extracted into its own package so a purge,
|
|
9
|
+
* a seed or a reseed stops requiring an appkit release, and so Turbopack stops
|
|
10
|
+
* tracing a graph through 24 MB of object literals.
|
|
11
|
+
*
|
|
12
|
+
* Two things stood in the way, and both were in `seed/` by accident of
|
|
13
|
+
* history rather than by nature:
|
|
14
|
+
*
|
|
15
|
+
* Β· `TEST_DATA_TTL_DAYS` / `testDataExpiresAt()` β a job handler re-exports
|
|
16
|
+
* them, so the SWEEP that reclaims expired fixtures depended on the
|
|
17
|
+
* fixture data shipping alongside it.
|
|
18
|
+
* Β· `SeedPurpose` β `BaseDocument` carries the field, so the base type of
|
|
19
|
+
* every document in the system pointed into the seed directory.
|
|
20
|
+
*
|
|
21
|
+
* Neither is data. A TTL and a three-value union are metadata ABOUT seeding
|
|
22
|
+
* that runtime code legitimately reads, so they live with the other shared
|
|
23
|
+
* constants and `seed/` keeps only rows.
|
|
24
|
+
*
|
|
25
|
+
* π What deliberately did NOT move: `SEED_COLLECTION_PURPOSE`,
|
|
26
|
+
* `SEED_ROW_PURPOSE` and `SEED_PURPOSE_DERIVED_FROM`. Those name specific
|
|
27
|
+
* collections and specific seeded ids β they are registries over the data, so
|
|
28
|
+
* they belong with it, and only `appkit-seed` and `audit-seed-purpose` read
|
|
29
|
+
* them.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* The TTL stamp every disposable test fixture must carry.
|
|
33
|
+
*
|
|
34
|
+
* π `isTestData: true` WITHOUT `testDataExpiresAt` means PERMANENT β nothing
|
|
35
|
+
* ever reclaims it (see `jobs/handlers/_helpers.ts`, which documents the same
|
|
36
|
+
* rule from the sweep's side). That is not a theoretical hazard: until
|
|
37
|
+
* 2026-10-10 the only two `isTestData` rows in the whole seed,
|
|
38
|
+
* `product-tester-crossstore-a` / `-b`, were in exactly that state β live in
|
|
39
|
+
* the public catalogue of 72 products, never purged, and one of them was
|
|
40
|
+
* `store-letitrip-official`'s ONLY buyable standard product, so it was hidden
|
|
41
|
+
* from every real buyer by `hidePublicTestData` while being the only thing
|
|
42
|
+
* that store had to sell. Both are deleted.
|
|
43
|
+
*
|
|
44
|
+
* And the reason they were permanent is that **this module had zero callers**.
|
|
45
|
+
* The helper that enforces the rule existed, was documented as the rule that
|
|
46
|
+
* matters most, and no fixture used it. So: a fixture's three obligations are
|
|
47
|
+
* an id containing `-test-`, `isTestData: true`, and an expiry FROM HERE.
|
|
48
|
+
*
|
|
49
|
+
* Recomputed fresh on every seed run (seed files are re-imported per
|
|
50
|
+
* invocation), so re-seeding naturally refreshes the expiry rather than
|
|
51
|
+
* leaving a fixture that expired between runs.
|
|
52
|
+
*
|
|
53
|
+
* π Do NOT re-declare the day count elsewhere. It used to be declared twice β
|
|
54
|
+
* in the seed directory and in `jobs/handlers/messages.ts` β with a comment as
|
|
55
|
+
* the only thing keeping them equal, which is the drift shape Root Cause #42
|
|
56
|
+
* describes. `messages.ts` re-exports this one.
|
|
57
|
+
*/
|
|
58
|
+
export const TEST_DATA_TTL_DAYS = 7;
|
|
59
|
+
export function testDataExpiresAt() {
|
|
60
|
+
return new Date(Date.now() + TEST_DATA_TTL_DAYS * 24 * 60 * 60 * 1000);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* `Record<SeedPurpose, true>`, so a third value is a compile error in every map
|
|
64
|
+
* keyed on the union rather than a silent gap (Root Cause #61).
|
|
65
|
+
*/
|
|
66
|
+
export const SEED_PURPOSE_VALUES = {
|
|
67
|
+
test: true,
|
|
68
|
+
permanent: true,
|
|
69
|
+
};
|
|
70
|
+
export const ALL_SEED_PURPOSES = Object.keys(SEED_PURPOSE_VALUES);
|
|
71
|
+
export function isSeedPurpose(value) {
|
|
72
|
+
return typeof value === "string" && value in SEED_PURPOSE_VALUES;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* π There is deliberately NO third `fixture` tier.
|
|
76
|
+
*
|
|
77
|
+
* An earlier draft had one, meaning "clearable but only by an explicit full
|
|
78
|
+
* purge", intended for the tester checklist. Once the cases were correctly
|
|
79
|
+
* classified as permanent content it had **nothing in it** β and a union member
|
|
80
|
+
* with no members is the dead-enum-value shape this codebase keeps paying for:
|
|
81
|
+
* a filter chip whose value no row carries returns zero rows forever and reads
|
|
82
|
+
* as a working control (Root Cause #33), and nine section types that exist in a
|
|
83
|
+
* dropdown and have never rendered.
|
|
84
|
+
*
|
|
85
|
+
* Two values answer the question that was actually asked. If a genuine third
|
|
86
|
+
* case appears, add it then β with a row that needs it.
|
|
87
|
+
*/
|
|
88
|
+
export const PURGEABLE = {
|
|
89
|
+
test: true,
|
|
90
|
+
permanent: false,
|
|
91
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AdminBeysView β browse and correct the generated Beyblade database.
|
|
3
|
+
*
|
|
4
|
+
* ββ π WHY THIS IS A CORRECTION SURFACE, NOT A CRUD SCREEN ββββββββββββββββ
|
|
5
|
+
*
|
|
6
|
+
* `beys` is 1,988 rows built by committed generators from a crawled corpus. So
|
|
7
|
+
* there is no "Add Beyblade" button: a row authored here would have no source,
|
|
8
|
+
* would vanish on the next regeneration, and would make the claim "this dataset
|
|
9
|
+
* rebuilds from `appkit/src/seed/` alone" false. Adding one is a change to the
|
|
10
|
+
* generator.
|
|
11
|
+
*
|
|
12
|
+
* What this surface IS for is the thing the corpus demonstrably needs β fixing
|
|
13
|
+
* a wrong extraction. On mode data alone the source was wrong five times in one
|
|
14
|
+
* session: an inverted tip transition, a mechanism attributed to the wrong
|
|
15
|
+
* part, a part with no modes at all, and two misexpanded abbreviations. A
|
|
16
|
+
* correction made here survives the next reseed, field by field
|
|
17
|
+
* (`adminEditedFields`).
|
|
18
|
+
*
|
|
19
|
+
* @tag domain:beys
|
|
20
|
+
* @tag layer:feature
|
|
21
|
+
* @tag access:client
|
|
22
|
+
* @tag consumers:app/[locale]/admin/beys/page.tsx
|
|
23
|
+
*/
|
|
24
|
+
import React from "react";
|
|
25
|
+
import type { ListingLayoutProps } from "../../../ui";
|
|
26
|
+
export type AdminBeysViewProps = ListingLayoutProps;
|
|
27
|
+
export declare function AdminBeysView({ children, ...props }: AdminBeysViewProps): React.JSX.Element;
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* AdminBeysView β browse and correct the generated Beyblade database.
|
|
5
|
+
*
|
|
6
|
+
* ββ π WHY THIS IS A CORRECTION SURFACE, NOT A CRUD SCREEN ββββββββββββββββ
|
|
7
|
+
*
|
|
8
|
+
* `beys` is 1,988 rows built by committed generators from a crawled corpus. So
|
|
9
|
+
* there is no "Add Beyblade" button: a row authored here would have no source,
|
|
10
|
+
* would vanish on the next regeneration, and would make the claim "this dataset
|
|
11
|
+
* rebuilds from `appkit/src/seed/` alone" false. Adding one is a change to the
|
|
12
|
+
* generator.
|
|
13
|
+
*
|
|
14
|
+
* What this surface IS for is the thing the corpus demonstrably needs β fixing
|
|
15
|
+
* a wrong extraction. On mode data alone the source was wrong five times in one
|
|
16
|
+
* session: an inverted tip transition, a mechanism attributed to the wrong
|
|
17
|
+
* part, a part with no modes at all, and two misexpanded abbreviations. A
|
|
18
|
+
* correction made here survives the next reseed, field by field
|
|
19
|
+
* (`adminEditedFields`).
|
|
20
|
+
*
|
|
21
|
+
* @tag domain:beys
|
|
22
|
+
* @tag layer:feature
|
|
23
|
+
* @tag access:client
|
|
24
|
+
* @tag consumers:app/[locale]/admin/beys/page.tsx
|
|
25
|
+
*/
|
|
26
|
+
import React from "react";
|
|
27
|
+
import { Heading, ListingLayout, Stack, Text } from "../../../ui/index.js";
|
|
28
|
+
import { ADMIN_ENDPOINTS } from "../../../constants/api-endpoints.js";
|
|
29
|
+
import { BEY_FIELDS } from "../../../constants/field-names.js";
|
|
30
|
+
import { sortBy } from "../../../constants/sort.js";
|
|
31
|
+
import { ROUTES } from "../../../next/routing/route-map.js";
|
|
32
|
+
import { DataListingView } from "./DataListingView.js";
|
|
33
|
+
/**
|
|
34
|
+
* π Rows are read from WHICHEVER envelope shape arrives.
|
|
35
|
+
*
|
|
36
|
+
* `apiClient.get()` unwraps `{success, data}` and returns `data` itself, so an
|
|
37
|
+
* endpoint that puts rows directly in `data` hands `mapRows` an ARRAY while one
|
|
38
|
+
* that nests them hands it an object. Reading `.data` off an array yields
|
|
39
|
+
* undefined β which is exactly how the categories listing rendered "No
|
|
40
|
+
* categories found" against a 200 carrying 58 rows. This route returns the
|
|
41
|
+
* object shape, and tolerating both is what keeps that from mattering.
|
|
42
|
+
*/
|
|
43
|
+
function extractRows(response) {
|
|
44
|
+
if (Array.isArray(response))
|
|
45
|
+
return response;
|
|
46
|
+
if (!response || typeof response !== "object")
|
|
47
|
+
return [];
|
|
48
|
+
const obj = response;
|
|
49
|
+
if (Array.isArray(obj.data))
|
|
50
|
+
return obj.data;
|
|
51
|
+
return Array.isArray(obj.items) ? obj.items : [];
|
|
52
|
+
}
|
|
53
|
+
function extractTotal(response) {
|
|
54
|
+
if (Array.isArray(response) || !response || typeof response !== "object")
|
|
55
|
+
return undefined;
|
|
56
|
+
const total = response.total;
|
|
57
|
+
return typeof total === "number" ? total : undefined;
|
|
58
|
+
}
|
|
59
|
+
/*
|
|
60
|
+
* audit-create-affordance-ok: this listing is deliberately inbound-only.
|
|
61
|
+
* The 1,988 rows are produced by committed generators from a crawled
|
|
62
|
+
* corpus, so there is no POST endpoint and no create route key to point a
|
|
63
|
+
* button at β a Beyblade authored by hand would have no source, would vanish
|
|
64
|
+
* on the next regeneration, and would make "this dataset rebuilds from
|
|
65
|
+
* appkit/src/seed/ alone" false. Adding one is a change to the generator.
|
|
66
|
+
* The surface exists to CORRECT a wrong extraction and to REMOVE a row that
|
|
67
|
+
* should not exist, which are the two operations the data actually needs.
|
|
68
|
+
*/
|
|
69
|
+
const COLUMNS = [
|
|
70
|
+
{
|
|
71
|
+
key: "primary",
|
|
72
|
+
header: "Beyblade",
|
|
73
|
+
sortable: true,
|
|
74
|
+
render: (row) => (_jsxs(Stack, { gap: "xs", children: [_jsx(Text, { weight: "semibold", color: "primary", children: row.primary }), _jsx(Text, { size: "xs", color: "muted", children: row.secondary })] })),
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
key: "weight",
|
|
78
|
+
header: "Mass",
|
|
79
|
+
className: "w-28",
|
|
80
|
+
render: (row) => (_jsx(Text, { size: "sm", color: "muted", children: row.weight })),
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
key: "edited",
|
|
84
|
+
header: "Corrected",
|
|
85
|
+
className: "w-28",
|
|
86
|
+
/*
|
|
87
|
+
* π Shown as a COLUMN, because a hand-corrected row behaves differently
|
|
88
|
+
* from its neighbours β the generator no longer owns the fields somebody
|
|
89
|
+
* fixed. Leaving that invisible is how a later maintainer concludes the
|
|
90
|
+
* generator is producing a value it is actually being prevented from
|
|
91
|
+
* writing. Text, not a colour-only dot (colour is never the only signal).
|
|
92
|
+
*/
|
|
93
|
+
render: (row) => row.edited ? (_jsx(Text, { size: "xs", weight: "medium", children: "By hand" })) : (_jsx(Text, { size: "xs", color: "faint", children: "Generated" })),
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
const ADMIN_BEYS_CONFIG = {
|
|
97
|
+
portal: "admin",
|
|
98
|
+
title: "Beyblades",
|
|
99
|
+
subtitle: "The generated Beyblade database. Corrections made here are kept when the database is regenerated.",
|
|
100
|
+
searchPlaceholder: "Search Beyblades by name β Dranzer F, Variaresβ¦",
|
|
101
|
+
/*
|
|
102
|
+
* π `searchCommit: "enter"`, not debounce. The route's search is an indexed
|
|
103
|
+
* PREFIX range, so a partial word is a different query rather than a
|
|
104
|
+
* narrowing one β debouncing would fire a range query per pause and show
|
|
105
|
+
* confusing intermediate results. Enter also makes the prefix-only behaviour
|
|
106
|
+
* legible: you typed a prefix and asked for it.
|
|
107
|
+
*/
|
|
108
|
+
searchCommit: "enter",
|
|
109
|
+
/*
|
|
110
|
+
* π DECLARED, so the placeholder can be CHECKED rather than trusted.
|
|
111
|
+
* The route matches exactly one field β an indexed prefix range on
|
|
112
|
+
* `name` β and the placeholder must not imply more. It is a prefix and
|
|
113
|
+
* it is case-sensitive; `mode` says so where a reader will see it.
|
|
114
|
+
*/
|
|
115
|
+
search: {
|
|
116
|
+
placeholder: "Search Beyblades by name β a prefix, case-sensitive",
|
|
117
|
+
fields: ["name"],
|
|
118
|
+
},
|
|
119
|
+
emptyLabel: "No Beyblade matches that name",
|
|
120
|
+
filterKeys: [],
|
|
121
|
+
/*
|
|
122
|
+
* π Through `sortBy`, not a bare "name". The route currently ALWAYS
|
|
123
|
+
* orders by name and ignores the `sorts` param, so this is the only
|
|
124
|
+
* option β but writing it as a literal is what lets a field rename
|
|
125
|
+
* leave a sort string that silently sorts nothing.
|
|
126
|
+
*/
|
|
127
|
+
defaultSort: sortBy(BEY_FIELDS.NAME, "ASC"),
|
|
128
|
+
pageSize: 25,
|
|
129
|
+
queryKey: ["admin", "beys"],
|
|
130
|
+
endpoint: ADMIN_ENDPOINTS.BEYS,
|
|
131
|
+
sortOptions: [{ value: sortBy(BEY_FIELDS.NAME, "ASC"), label: "Name A-Z" }],
|
|
132
|
+
columns: COLUMNS,
|
|
133
|
+
buildFilters: () => undefined,
|
|
134
|
+
getTotal: (response, rows) => extractTotal(response) ?? rows.length,
|
|
135
|
+
mapRows: (response) => extractRows(response).map((raw) => {
|
|
136
|
+
const r = raw;
|
|
137
|
+
/*
|
|
138
|
+
* π `β` when the mass was SUMMED from the parts rather than stated by
|
|
139
|
+
* the source. 93% of beys have a mass but only 248 state it, and a
|
|
140
|
+
* derived figure shown as an exact one is the easiest way for this
|
|
141
|
+
* dataset to start lying β the same marking the detail page and the OG
|
|
142
|
+
* card use.
|
|
143
|
+
*/
|
|
144
|
+
const summed = typeof r.weightGFromParts === "number" ? r.weightGFromParts : null;
|
|
145
|
+
const weight = typeof r.weightG === "number"
|
|
146
|
+
? `${r.weightG} g`
|
|
147
|
+
: summed !== null
|
|
148
|
+
? `β ${Math.round(summed * 10) / 10} g`
|
|
149
|
+
: "β";
|
|
150
|
+
return {
|
|
151
|
+
id: String(r.id ?? ""),
|
|
152
|
+
primary: String(r.name ?? r.id ?? "Unnamed Beyblade"),
|
|
153
|
+
/*
|
|
154
|
+
* System first: it is the one line a collector uses to place a bey in
|
|
155
|
+
* time, and it is present on 94% of them. The product code follows
|
|
156
|
+
* because two vendor releases of one model differ by little else.
|
|
157
|
+
*/
|
|
158
|
+
secondary: [r.system, Array.isArray(r.productCodes) ? r.productCodes[0] : null]
|
|
159
|
+
.filter(Boolean)
|
|
160
|
+
.join(" Β· ") || "β",
|
|
161
|
+
weight,
|
|
162
|
+
edited: r.adminEdited === true,
|
|
163
|
+
};
|
|
164
|
+
}),
|
|
165
|
+
/*
|
|
166
|
+
* π `rowHrefTemplate`, not `rowHref`. Verified against the interface
|
|
167
|
+
* rather than guessed β there is no `rowHref` field, and an unknown key on
|
|
168
|
+
* an object literal typed by an interface is a compile error I could not
|
|
169
|
+
* have seen under this session's no-build cap.
|
|
170
|
+
*/
|
|
171
|
+
rowHrefTemplate: (row) => String(ROUTES.ADMIN.BEYS_EDIT(row.id)),
|
|
172
|
+
};
|
|
173
|
+
export function AdminBeysView({ children, ...props }) {
|
|
174
|
+
if (React.Children.count(children) > 0) {
|
|
175
|
+
return (_jsxs(ListingLayout, { portal: "admin", ...props, children: [_jsx(Heading, { level: 1, className: "sr-only", children: "Beyblades" }), children] }));
|
|
176
|
+
}
|
|
177
|
+
return (_jsxs(_Fragment, { children: [_jsx(Heading, { level: 1, className: "sr-only", children: "Beyblades" }), _jsx(DataListingView, { config: ADMIN_BEYS_CONFIG })] }));
|
|
178
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AdminPartsView β browse and correct the generated part glossary.
|
|
3
|
+
*
|
|
4
|
+
* ββ π WHY THIS IS A CORRECTION SURFACE, NOT A CRUD SCREEN ββββββββββββββββ
|
|
5
|
+
*
|
|
6
|
+
* `partGlossary` is 2,488 rows built by committed generators from a crawled
|
|
7
|
+
* corpus. So there is no "Add part" button: a row authored here would have no
|
|
8
|
+
* source, would vanish on the next regeneration, and would make the claim
|
|
9
|
+
* "this dataset rebuilds from `appkit/src/seed/` alone" false. Adding a part is
|
|
10
|
+
* a change to the generator.
|
|
11
|
+
*
|
|
12
|
+
* What this surface IS for is the thing the corpus demonstrably needs β fixing
|
|
13
|
+
* a wrong extraction. On mode data alone the source was wrong five times in one
|
|
14
|
+
* session: an inverted tip transition, a mechanism attributed to the wrong
|
|
15
|
+
* part, a part with no modes at all, and two misexpanded abbreviations. A
|
|
16
|
+
* correction made here survives the next reseed, field by field
|
|
17
|
+
* (`adminEditedFields`).
|
|
18
|
+
*
|
|
19
|
+
* @tag domain:parts
|
|
20
|
+
* @tag layer:feature
|
|
21
|
+
* @tag access:client
|
|
22
|
+
* @tag consumers:app/[locale]/admin/parts/page.tsx
|
|
23
|
+
*/
|
|
24
|
+
import React from "react";
|
|
25
|
+
import type { ListingLayoutProps } from "../../../ui";
|
|
26
|
+
export type AdminPartsViewProps = ListingLayoutProps;
|
|
27
|
+
export declare function AdminPartsView({ children, ...props }: AdminPartsViewProps): React.JSX.Element;
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* AdminPartsView β browse and correct the generated part glossary.
|
|
5
|
+
*
|
|
6
|
+
* ββ π WHY THIS IS A CORRECTION SURFACE, NOT A CRUD SCREEN ββββββββββββββββ
|
|
7
|
+
*
|
|
8
|
+
* `partGlossary` is 2,488 rows built by committed generators from a crawled
|
|
9
|
+
* corpus. So there is no "Add part" button: a row authored here would have no
|
|
10
|
+
* source, would vanish on the next regeneration, and would make the claim
|
|
11
|
+
* "this dataset rebuilds from `appkit/src/seed/` alone" false. Adding a part is
|
|
12
|
+
* a change to the generator.
|
|
13
|
+
*
|
|
14
|
+
* What this surface IS for is the thing the corpus demonstrably needs β fixing
|
|
15
|
+
* a wrong extraction. On mode data alone the source was wrong five times in one
|
|
16
|
+
* session: an inverted tip transition, a mechanism attributed to the wrong
|
|
17
|
+
* part, a part with no modes at all, and two misexpanded abbreviations. A
|
|
18
|
+
* correction made here survives the next reseed, field by field
|
|
19
|
+
* (`adminEditedFields`).
|
|
20
|
+
*
|
|
21
|
+
* @tag domain:parts
|
|
22
|
+
* @tag layer:feature
|
|
23
|
+
* @tag access:client
|
|
24
|
+
* @tag consumers:app/[locale]/admin/parts/page.tsx
|
|
25
|
+
*/
|
|
26
|
+
import React from "react";
|
|
27
|
+
import { Heading, ListingLayout, Stack, Text } from "../../../ui/index.js";
|
|
28
|
+
import { ADMIN_ENDPOINTS } from "../../../constants/api-endpoints.js";
|
|
29
|
+
import { PART_GLOSSARY_FIELDS } from "../../../constants/field-names.js";
|
|
30
|
+
import { sortBy } from "../../../constants/sort.js";
|
|
31
|
+
import { ROUTES } from "../../../next/routing/route-map.js";
|
|
32
|
+
import { DataListingView } from "./DataListingView.js";
|
|
33
|
+
/**
|
|
34
|
+
* π Rows are read from WHICHEVER envelope shape arrives.
|
|
35
|
+
*
|
|
36
|
+
* `apiClient.get()` unwraps `{success, data}` and returns `data` itself, so an
|
|
37
|
+
* endpoint that puts rows directly in `data` hands `mapRows` an ARRAY while one
|
|
38
|
+
* that nests them hands it an object. Reading `.data` off an array yields
|
|
39
|
+
* undefined β which is exactly how the categories listing rendered "No
|
|
40
|
+
* categories found" against a 200 carrying 58 rows. This route returns the
|
|
41
|
+
* object shape, and tolerating both is what keeps that from mattering.
|
|
42
|
+
*/
|
|
43
|
+
function extractRows(response) {
|
|
44
|
+
if (Array.isArray(response))
|
|
45
|
+
return response;
|
|
46
|
+
if (!response || typeof response !== "object")
|
|
47
|
+
return [];
|
|
48
|
+
const obj = response;
|
|
49
|
+
if (Array.isArray(obj.data))
|
|
50
|
+
return obj.data;
|
|
51
|
+
return Array.isArray(obj.items) ? obj.items : [];
|
|
52
|
+
}
|
|
53
|
+
function extractTotal(response) {
|
|
54
|
+
if (Array.isArray(response) || !response || typeof response !== "object")
|
|
55
|
+
return undefined;
|
|
56
|
+
const total = response.total;
|
|
57
|
+
return typeof total === "number" ? total : undefined;
|
|
58
|
+
}
|
|
59
|
+
/*
|
|
60
|
+
* audit-create-affordance-ok: this listing is deliberately inbound-only.
|
|
61
|
+
* The 2,488 rows are produced by committed generators from a crawled
|
|
62
|
+
* corpus, so there is no POST endpoint and no create route key to point a
|
|
63
|
+
* button at β a part authored by hand would have no source, would vanish
|
|
64
|
+
* on the next regeneration, and would make "this dataset rebuilds from
|
|
65
|
+
* appkit/src/seed/ alone" false. Adding one is a change to the generator.
|
|
66
|
+
* The surface exists to CORRECT a wrong extraction and to REMOVE a row that
|
|
67
|
+
* should not exist, which are the two operations the data actually needs.
|
|
68
|
+
*/
|
|
69
|
+
const COLUMNS = [
|
|
70
|
+
{
|
|
71
|
+
key: "primary",
|
|
72
|
+
header: "Part",
|
|
73
|
+
sortable: true,
|
|
74
|
+
render: (row) => (_jsxs(Stack, { gap: "xs", children: [_jsx(Text, { weight: "semibold", color: "primary", children: row.primary }), _jsx(Text, { size: "xs", color: "muted", children: row.secondary })] })),
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
key: "weight",
|
|
78
|
+
header: "Weight",
|
|
79
|
+
className: "w-24",
|
|
80
|
+
render: (row) => (_jsx(Text, { size: "sm", color: "muted", children: row.weight })),
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
key: "edited",
|
|
84
|
+
header: "Corrected",
|
|
85
|
+
className: "w-28",
|
|
86
|
+
/*
|
|
87
|
+
* π Shown as a COLUMN, because a hand-corrected row behaves differently
|
|
88
|
+
* from its neighbours β the generator no longer owns the fields somebody
|
|
89
|
+
* fixed. Leaving that invisible is how a later maintainer concludes the
|
|
90
|
+
* generator is producing a value it is actually being prevented from
|
|
91
|
+
* writing. Text, not a colour-only dot (colour is never the only signal).
|
|
92
|
+
*/
|
|
93
|
+
render: (row) => row.edited ? (_jsx(Text, { size: "xs", weight: "medium", children: "By hand" })) : (_jsx(Text, { size: "xs", color: "faint", children: "Generated" })),
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
const ADMIN_PARTS_CONFIG = {
|
|
97
|
+
portal: "admin",
|
|
98
|
+
title: "Parts",
|
|
99
|
+
subtitle: "The generated part glossary. Corrections made here are kept when the database is regenerated.",
|
|
100
|
+
searchPlaceholder: "Search parts by name β Rubber Flat, Dranzerβ¦",
|
|
101
|
+
/*
|
|
102
|
+
* π `searchCommit: "enter"`, not debounce. The route's search is an indexed
|
|
103
|
+
* PREFIX range, so a partial word is a different query rather than a
|
|
104
|
+
* narrowing one β debouncing would fire a range query per pause and show
|
|
105
|
+
* confusing intermediate results. Enter also makes the prefix-only behaviour
|
|
106
|
+
* legible: you typed a prefix and asked for it.
|
|
107
|
+
*/
|
|
108
|
+
searchCommit: "enter",
|
|
109
|
+
/*
|
|
110
|
+
* π DECLARED, so the placeholder can be CHECKED rather than trusted.
|
|
111
|
+
* The route matches exactly one field β an indexed prefix range on
|
|
112
|
+
* `name` β and the placeholder must not imply more. It is a prefix and
|
|
113
|
+
* it is case-sensitive; `mode` says so where a reader will see it.
|
|
114
|
+
*/
|
|
115
|
+
search: {
|
|
116
|
+
placeholder: "Search parts by name β a prefix, case-sensitive",
|
|
117
|
+
fields: ["name"],
|
|
118
|
+
},
|
|
119
|
+
emptyLabel: "No part matches that name",
|
|
120
|
+
filterKeys: [],
|
|
121
|
+
/*
|
|
122
|
+
* π Through `sortBy`, not a bare "name". The route currently ALWAYS
|
|
123
|
+
* orders by name and ignores the `sorts` param, so this is the only
|
|
124
|
+
* option β but writing it as a literal is what lets a field rename
|
|
125
|
+
* leave a sort string that silently sorts nothing.
|
|
126
|
+
*/
|
|
127
|
+
defaultSort: sortBy(PART_GLOSSARY_FIELDS.NAME, "ASC"),
|
|
128
|
+
pageSize: 25,
|
|
129
|
+
queryKey: ["admin", "parts"],
|
|
130
|
+
endpoint: ADMIN_ENDPOINTS.PARTS,
|
|
131
|
+
sortOptions: [{ value: sortBy(PART_GLOSSARY_FIELDS.NAME, "ASC"), label: "Name A-Z" }],
|
|
132
|
+
columns: COLUMNS,
|
|
133
|
+
buildFilters: () => undefined,
|
|
134
|
+
getTotal: (response, rows) => extractTotal(response) ?? rows.length,
|
|
135
|
+
mapRows: (response) => extractRows(response).map((raw) => {
|
|
136
|
+
const r = raw;
|
|
137
|
+
const weight = typeof r.weightG === "number" ? `${r.weightG} g` : "β";
|
|
138
|
+
return {
|
|
139
|
+
id: String(r.id ?? ""),
|
|
140
|
+
primary: String(r.name ?? r.id ?? "Unnamed part"),
|
|
141
|
+
/* The classification is what disambiguates a bare code like "105". */
|
|
142
|
+
secondary: [r.classification, r.code].filter(Boolean).join(" Β· ") || "β",
|
|
143
|
+
weight,
|
|
144
|
+
edited: r.adminEdited === true,
|
|
145
|
+
};
|
|
146
|
+
}),
|
|
147
|
+
/*
|
|
148
|
+
* π `rowHrefTemplate`, not `rowHref`. Verified against the interface
|
|
149
|
+
* rather than guessed β there is no `rowHref` field, and an unknown key on
|
|
150
|
+
* an object literal typed by an interface is a compile error I could not
|
|
151
|
+
* have seen under this session's no-build cap.
|
|
152
|
+
*/
|
|
153
|
+
rowHrefTemplate: (row) => String(ROUTES.ADMIN.PARTS_EDIT(row.id)),
|
|
154
|
+
};
|
|
155
|
+
export function AdminPartsView({ children, ...props }) {
|
|
156
|
+
if (React.Children.count(children) > 0) {
|
|
157
|
+
return (_jsxs(ListingLayout, { portal: "admin", ...props, children: [_jsx(Heading, { level: 1, className: "sr-only", children: "Parts" }), children] }));
|
|
158
|
+
}
|
|
159
|
+
return (_jsxs(_Fragment, { children: [_jsx(Heading, { level: 1, className: "sr-only", children: "Parts" }), _jsx(DataListingView, { config: ADMIN_PARTS_CONFIG })] }));
|
|
160
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Which registry bucket supplies the labels and the confirm copy. */
|
|
2
|
-
export type OwnerQuickActionsResource = "PRODUCT" | "CATEGORY" | "BRAND" | "FRANCHISE" | "BUNDLE" | "GROUP" | "SUBLISTING" | "EVENT" | "BLOG" | "REVIEW" | "STORE" | "USER" | "CAROUSEL" | "SECTION";
|
|
2
|
+
export type OwnerQuickActionsResource = "PRODUCT" | "CATEGORY" | "BRAND" | "FRANCHISE" | "PART" | "BEY" | "BUNDLE" | "GROUP" | "SUBLISTING" | "EVENT" | "BLOG" | "REVIEW" | "STORE" | "USER" | "CAROUSEL" | "SECTION";
|
|
3
3
|
export interface OwnerQuickActionsProps {
|
|
4
4
|
resource: OwnerQuickActionsResource;
|
|
5
5
|
/** Where the pencil goes β that record's dashboard editor. */
|
|
@@ -24,6 +24,23 @@ export interface OwnerQuickActionsProps {
|
|
|
24
24
|
* `detail` sits in a header row beside the title.
|
|
25
25
|
*/
|
|
26
26
|
placement?: "card" | "detail";
|
|
27
|
+
/**
|
|
28
|
+
* π Set this whenever `placement="detail"` sits on a DARK cover hero.
|
|
29
|
+
*
|
|
30
|
+
* `detail` otherwise renders the `ghost` variant, which is
|
|
31
|
+
* `color: var(--appkit-color-zinc-600)` β a dark grey that is correct on a
|
|
32
|
+
* page-surface header row and invisible on a cover photo. Every detail view
|
|
33
|
+
* that has a hero already computes a `hasCover` flag and flips each of its
|
|
34
|
+
* siblings to `color="inverse"`; this toolbar was the one element in that
|
|
35
|
+
* block that did not, so the pencil rendered near-black on near-black and
|
|
36
|
+
* read as "admins get no edit button" (Root Cause #67 β a theme-relative ink
|
|
37
|
+
* on a theme-invariant dark surface).
|
|
38
|
+
*
|
|
39
|
+
* Pass the SAME flag the rest of the hero branches on, not a literal `true`:
|
|
40
|
+
* a coverless hero falls back to the page surface, where the scrim's white
|
|
41
|
+
* ink would be invisible in the mirror-image way.
|
|
42
|
+
*/
|
|
43
|
+
onMedia?: boolean;
|
|
27
44
|
className?: string;
|
|
28
45
|
}
|
|
29
|
-
export declare function OwnerQuickActions({ resource, editHref, onDelete, onClone, ownerId, storeId, recordLabel, placement, className, }: OwnerQuickActionsProps): import("react").JSX.Element | null;
|
|
46
|
+
export declare function OwnerQuickActions({ resource, editHref, onDelete, onClone, ownerId, storeId, recordLabel, placement, onMedia, className, }: OwnerQuickActionsProps): import("react").JSX.Element | null;
|