@mohasinac/appkit 4.53.1 → 4.54.0-next.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 +5 -5
- package/dist/_internal/client/theme/ThemeProvider.js +15 -1
- package/dist/_internal/server/features/auth/capabilities.js +7 -5
- package/dist/_internal/server/features/categories/price-guidance-resolve.d.ts +66 -0
- package/dist/_internal/server/features/categories/price-guidance-resolve.js +138 -0
- package/dist/_internal/server/features/checkout/supplier-identity.js +28 -6
- package/dist/_internal/server/features/price-index/market.d.ts +57 -0
- package/dist/_internal/server/features/price-index/market.js +120 -0
- package/dist/_internal/server/features/products/list-public.d.ts +12 -0
- package/dist/_internal/server/features/products/list-public.js +10 -1
- package/dist/_internal/server/features/products/listing-tab-counts.d.ts +25 -1
- package/dist/_internal/server/features/products/listing-tab-counts.js +184 -10
- package/dist/_internal/server/features/search/index-build/sources.js +43 -2
- package/dist/_internal/server/features/stores/tabs.d.ts +7 -2
- package/dist/_internal/server/features/stores/tabs.js +5 -3
- package/dist/_internal/server/jobs/core/jobRunners.js +0 -10
- package/dist/_internal/server/jobs/core/onOrderCreate.js +10 -104
- package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
- package/dist/_internal/shared/actions/action-registry.js +128 -0
- package/dist/_internal/shared/features/categories/bundle-copy.d.ts +1 -1
- package/dist/_internal/shared/features/site-settings/supplier-of-record.d.ts +56 -0
- package/dist/_internal/shared/features/site-settings/supplier-of-record.js +57 -0
- package/dist/_internal/shared/listing-types/tiers.d.ts +94 -0
- package/dist/_internal/shared/listing-types/tiers.js +150 -0
- package/dist/_internal/shared/search/match.js +28 -2
- package/dist/cli/index.js +0 -2
- package/dist/client.d.ts +21 -2
- package/dist/client.js +23 -4
- package/dist/constants/api-endpoints.d.ts +28 -0
- package/dist/constants/api-endpoints.js +14 -0
- package/dist/features/account/components/UserOrdersView.js +26 -7
- package/dist/features/addresses/utils/postal-autofill.d.ts +39 -0
- package/dist/features/addresses/utils/postal-autofill.js +54 -0
- package/dist/features/admin/components/AdminStoreEditorView.js +73 -34
- package/dist/features/admin/components/OwnerQuickActions.d.ts +29 -0
- package/dist/features/admin/components/OwnerQuickActions.js +142 -0
- package/dist/features/admin/schemas/admin-editor-forms.d.ts +1 -1
- package/dist/features/admin/schemas/admin-editor-forms.js +4 -1
- package/dist/features/auctions/components/AuctionDetailPageView.js +8 -7
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +11 -1
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +9 -2
- package/dist/features/auth/permissions/constants.d.ts +29 -2
- package/dist/features/auth/permissions/constants.js +68 -1
- package/dist/features/blog/components/BlogFeaturedCard.d.ts +11 -1
- package/dist/features/blog/components/BlogFeaturedCard.js +9 -2
- package/dist/features/cart/components/CartDrawer.js +3 -2
- package/dist/features/cart/components/CartGroupLineRow.js +2 -1
- package/dist/features/cart/hooks/useAddToCart.js +10 -5
- package/dist/features/cart/utils/pending-ops.d.ts +11 -1
- package/dist/features/cart/utils/pending-ops.js +14 -2
- package/dist/features/categories/api/[id]/price-guidance/route.js +1 -24
- package/dist/features/categories/components/BrandDetailPageView.js +15 -6
- package/dist/features/categories/components/BrandDetailTabs.d.ts +7 -1
- package/dist/features/categories/components/BrandDetailTabs.js +18 -3
- package/dist/features/categories/components/BundleCollage.js +3 -2
- package/dist/features/categories/components/BundleItemsPicker.js +3 -4
- package/dist/features/categories/components/CategoryDetailPageView.js +19 -8
- package/dist/features/categories/components/CategoryDetailTabs.d.ts +7 -1
- package/dist/features/categories/components/CategoryDetailTabs.js +29 -7
- package/dist/features/categories/components/CategoryGrid.d.ts +11 -1
- package/dist/features/categories/components/CategoryGrid.js +9 -2
- package/dist/features/checkout/actions/checkout-value-otp-actions.d.ts +10 -5
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +2 -88
- package/dist/features/classified/components/ClassifiedDetailPageView.js +10 -1
- package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +10 -1
- package/dist/features/events/components/EventCard.d.ts +11 -1
- package/dist/features/events/components/EventCard.js +9 -2
- package/dist/features/layout/AppLayoutShell.js +2 -1
- package/dist/features/layout/BottomActions.d.ts +1 -0
- package/dist/features/layout/BottomActions.js +330 -0
- package/dist/features/layout/BottomChrome.d.ts +45 -0
- package/dist/features/layout/BottomChrome.js +5 -17
- package/dist/features/layout/SideActionDock.js +36 -13
- package/dist/features/layout/index.d.ts +2 -7
- package/dist/features/layout/index.js +7 -7
- package/dist/features/layout/useIsDesktop.d.ts +36 -0
- package/dist/features/layout/useIsDesktop.js +48 -0
- package/dist/features/live/components/LiveItemDetailPageView.js +10 -1
- package/dist/features/media/messages/en.json +67 -67
- package/dist/features/orders/components/YourPurchaseStrip.d.ts +24 -0
- package/dist/features/orders/components/YourPurchaseStrip.js +77 -0
- package/dist/features/orders/components/index.d.ts +2 -1
- package/dist/features/orders/components/index.js +1 -1
- package/dist/features/orders/utils/order-announcement-message.d.ts +18 -0
- package/dist/features/orders/utils/order-announcement-message.js +16 -0
- package/dist/features/orders/utils/payment-proof-message.d.ts +20 -0
- package/dist/features/orders/utils/payment-proof-message.js +17 -0
- package/dist/features/parts/schemas/firestore.d.ts +227 -0
- package/dist/features/parts/schemas/firestore.js +6 -6
- package/dist/features/pre-orders/components/MarketplacePreorderCard.d.ts +11 -1
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +10 -3
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +8 -7
- package/dist/features/price-index/components/PriceIndexToolView.d.ts +21 -0
- package/dist/features/price-index/components/PriceIndexToolView.js +230 -27
- package/dist/features/price-index/lookup-target.d.ts +48 -0
- package/dist/features/price-index/lookup-target.js +107 -0
- package/dist/features/products/api/[id]/route.js +8 -1
- package/dist/features/products/api/route.js +16 -4
- package/dist/features/products/components/AvailabilityScopeHint.d.ts +22 -0
- package/dist/features/products/components/AvailabilityScopeHint.js +27 -0
- package/dist/features/products/components/CompareOverlay.d.ts +2 -1
- package/dist/features/products/components/CompareOverlay.js +2 -1
- package/dist/features/products/components/GroupSettingsPanel.js +2 -1
- package/dist/features/products/components/InteractiveProductCard.d.ts +7 -1
- package/dist/features/products/components/InteractiveProductCard.js +16 -4
- package/dist/features/products/components/MarketplaceBundleCard.d.ts +11 -1
- package/dist/features/products/components/MarketplaceBundleCard.js +9 -2
- package/dist/features/products/components/MarketplacePrizeDrawCard.d.ts +11 -1
- package/dist/features/products/components/MarketplacePrizeDrawCard.js +9 -2
- package/dist/features/products/components/ProductDetailPageView.js +34 -4
- package/dist/features/products/components/ProductGrid.d.ts +14 -1
- package/dist/features/products/components/ProductGrid.js +22 -5
- package/dist/features/products/components/ProductsIndexListing.js +2 -2
- package/dist/features/products/components/SublistingCarouselSection.js +2 -1
- package/dist/features/products/repository/products.repository.d.ts +1 -0
- package/dist/features/products/repository/products.repository.js +5 -1
- package/dist/features/products/utils/group-member-image.d.ts +9 -2
- package/dist/features/products/utils/group-member-image.js +2 -1
- package/dist/features/reviews/api/[id]/route.js +83 -23
- package/dist/features/reviews/components/PurchaseReviewAffordance.d.ts +6 -0
- package/dist/features/reviews/components/PurchaseReviewAffordance.js +42 -0
- package/dist/features/reviews/components/ReviewFormDrawer.d.ts +34 -0
- package/dist/features/reviews/components/ReviewFormDrawer.js +127 -0
- package/dist/features/reviews/components/index.d.ts +4 -0
- package/dist/features/reviews/components/index.js +2 -0
- package/dist/features/seller/actions/seller-actions.d.ts +1 -1
- package/dist/features/seller/actions/seller-actions.js +49 -3
- package/dist/features/seller/components/SellerPayoutSettingsView.js +30 -2
- package/dist/features/seller/components/SellerProductShell.d.ts +17 -1
- package/dist/features/seller/components/SellerProductsView.js +3 -2
- package/dist/features/seller/hooks/useStoreListingEntitlements.d.ts +8 -0
- package/dist/features/seller/hooks/useStoreListingEntitlements.js +70 -0
- package/dist/features/stores/components/InteractiveStoreCard.d.ts +11 -1
- package/dist/features/stores/components/InteractiveStoreCard.js +9 -2
- package/dist/features/stores/components/StoreAuctionsListing.js +2 -1
- package/dist/features/stores/components/index.d.ts +0 -2
- package/dist/features/stores/components/index.js +0 -1
- package/dist/features/stores/schemas/index.d.ts +1 -1
- package/dist/features/stores/schemas/index.js +10 -1
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +114 -2
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +415 -0
- package/dist/index.d.ts +8 -27
- package/dist/index.js +14 -35
- package/dist/next/routing/route-map.d.ts +2 -0
- package/dist/next/routing/route-map.js +9 -0
- package/dist/providers/shipping-shiprocket/index.d.ts +98 -0
- package/dist/providers/shipping-shiprocket/index.js +353 -0
- package/dist/schemas/registry.d.ts +2 -2
- package/dist/security/csp.d.ts +16 -1
- package/dist/security/csp.js +5 -3
- package/dist/seed/_helpers/category-forest.js +27 -0
- package/dist/seed/_helpers/category-parts-glossary-map.js +1816 -86
- package/dist/seed/_helpers/category-parts.d.ts +1 -1
- package/dist/seed/_helpers/category-parts.js +13412 -3020
- package/dist/seed/categories-seed-data.js +48 -6
- package/dist/seed/homepage-sections-seed-data.js +41 -28
- package/dist/seed/model-composition-seed-data.js +6 -8
- package/dist/seed/part-glossary/chunk0.d.ts +9 -0
- package/dist/seed/part-glossary/chunk0.js +35044 -0
- package/dist/seed/part-glossary/chunk1.d.ts +9 -0
- package/dist/seed/part-glossary/chunk1.js +39955 -0
- package/dist/seed/part-glossary/chunk2.d.ts +9 -0
- package/dist/seed/part-glossary/chunk2.js +50335 -0
- package/dist/seed/part-glossary/chunk3.d.ts +9 -0
- package/dist/seed/part-glossary/chunk3.js +52386 -0
- package/dist/seed/part-glossary/chunk4.d.ts +9 -0
- package/dist/seed/part-glossary/chunk4.js +50549 -0
- package/dist/seed/part-glossary-seed-data.d.ts +1 -1
- package/dist/seed/part-glossary-seed-data.js +23 -47483
- package/dist/seed/products-beyblade-x-seed-data.js +36 -1
- package/dist/server.d.ts +6 -8
- package/dist/server.js +16 -20
- package/dist/styles.css +516 -358
- package/dist/tailwind-utilities.css +1 -1
- package/dist/tokens/themes/index.d.ts +3 -1
- package/dist/tokens/themes/index.js +11 -1
- package/dist/tokens/themes/technical-dark.d.ts +30 -0
- package/dist/tokens/themes/technical-dark.js +103 -0
- package/dist/tokens/themes/technical-light.d.ts +22 -0
- package/dist/tokens/themes/technical-light.js +89 -0
- package/dist/tokens/tokens.css +155 -0
- package/dist/ui/components/GatedPrice.js +30 -3
- package/dist/ui/components/GatedPrice.style.css +22 -19
- package/dist/ui/components/QuickCreateModal.style.css +78 -78
- package/dist/ui/forms/FormShell.style.css +260 -260
- package/package.json +1 -1
- package/scripts/seed-cli.mjs +133 -27
- package/dist/_internal/server/jobs/core/whatsappCatalogImport.d.ts +0 -27
- package/dist/_internal/server/jobs/core/whatsappCatalogImport.js +0 -172
- package/dist/_internal/server/jobs/core/whatsappNotify.d.ts +0 -35
- package/dist/_internal/server/jobs/core/whatsappNotify.js +0 -140
- package/dist/features/admin/components/AdminWhatsAppGuideView.d.ts +0 -2
- package/dist/features/admin/components/AdminWhatsAppGuideView.js +0 -35
- package/dist/features/orders/components/MarketplaceOrderCard.d.ts +0 -36
- package/dist/features/orders/components/MarketplaceOrderCard.js +0 -57
- package/dist/features/stores/components/StoreWhatsAppGuideView.d.ts +0 -3
- package/dist/features/stores/components/StoreWhatsAppGuideView.js +0 -12
- package/dist/features/whatsapp-bot/api/send-status/route.d.ts +0 -12
- package/dist/features/whatsapp-bot/api/send-status/route.js +0 -38
- package/dist/features/whatsapp-bot/api/webhook/route.d.ts +0 -12
- package/dist/features/whatsapp-bot/api/webhook/route.js +0 -43
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.d.ts +0 -6
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +0 -270
- package/dist/features/whatsapp-bot/components/WhatsAppChatButton.d.ts +0 -9
- package/dist/features/whatsapp-bot/components/WhatsAppChatButton.js +0 -7
- package/dist/features/whatsapp-bot/components/index.d.ts +0 -3
- package/dist/features/whatsapp-bot/components/index.js +0 -2
- package/dist/features/whatsapp-bot/helpers/payment-proof-message.d.ts +0 -14
- package/dist/features/whatsapp-bot/helpers/payment-proof-message.js +0 -17
- package/dist/features/whatsapp-bot/helpers/whatsapp.d.ts +0 -52
- package/dist/features/whatsapp-bot/helpers/whatsapp.js +0 -283
- package/dist/features/whatsapp-bot/index.d.ts +0 -3
- package/dist/features/whatsapp-bot/index.js +0 -3
- package/dist/features/whatsapp-bot/manifest.d.ts +0 -2
- package/dist/features/whatsapp-bot/manifest.js +0 -13
- package/dist/features/whatsapp-bot/messages/en.json +0 -7
- package/dist/features/whatsapp-bot/server.d.ts +0 -7
- package/dist/features/whatsapp-bot/server.js +0 -7
- package/dist/features/whatsapp-bot/types/index.d.ts +0 -126
- package/dist/features/whatsapp-bot/types/index.js +0 -1
|
@@ -3301,6 +3301,18 @@ const rawTesterChecklistItems = [
|
|
|
3301
3301
|
{ key: "regional-code-reads-as-regional", label: "A Korean or Middle-East code names its region instead of coming back unrecorded" },
|
|
3302
3302
|
{ key: "series-window-names-the-production-run", label: "A derivable date names its Metal-series production window, or names none outside all four" },
|
|
3303
3303
|
{ key: "temporal-context-for-an-unmatched-code", label: "An unmatched code reports what else the tables record from the same month, framed as context not a match" },
|
|
3304
|
+
/* ── The model picker and the per-model code list (2026-10-20) ───
|
|
3305
|
+
* The reported bug: naming a bey the tool holds 33 recorded box
|
|
3306
|
+
* codes for produced "Nothing contradicts it, and nothing confirms
|
|
3307
|
+
* it either" and never mentioned them. Every case here compares the
|
|
3308
|
+
* answer against data the tool demonstrably has.
|
|
3309
|
+
*/
|
|
3310
|
+
{ key: "model-picker-finds-l-drago", label: "The model picker finds all three L-Dragos by partial name, and each shows how many box codes are on file" },
|
|
3311
|
+
{ key: "picked-model-lists-its-box-codes", label: "Picking a model with no code returns the codes recorded for that exact bey, not a bare 'inconclusive'" },
|
|
3312
|
+
{ key: "picked-model-plus-its-own-code", label: "A code recorded against the picked bey reads as agreement; one recorded against a different bey reads as weak support, not a mismatch" },
|
|
3313
|
+
{ key: "missing-code-is-not-an-accusation", label: "A code absent from the picked model's list says 'unrecorded', never 'fake', and the verdict stays inconclusive" },
|
|
3314
|
+
{ key: "working-out-is-collapsed-by-default", label: "The verdict is readable without expanding anything, and a concern auto-opens the working-out" },
|
|
3315
|
+
{ key: "result-scrolls-into-view", label: "Submitting scrolls the verdict into view on a phone rather than leaving it below the fold" },
|
|
3304
3316
|
],
|
|
3305
3317
|
},
|
|
3306
3318
|
{
|
|
@@ -7235,6 +7247,409 @@ const rawTesterChecklistItems = [
|
|
|
7235
7247
|
],
|
|
7236
7248
|
},
|
|
7237
7249
|
], { adminOnly: true }),
|
|
7250
|
+
/*
|
|
7251
|
+
* OWNER QUICK-ACTIONS, BUYER PURCHASE CONTEXT, AND THE ADVANCED-TYPE GATE.
|
|
7252
|
+
*
|
|
7253
|
+
* 🛑 Every case here is an explicit BEFORE -> AFTER, and that is not a
|
|
7254
|
+
* stylistic choice. Each defect these cover returned HTTP 200 with plausible
|
|
7255
|
+
* content: a form that saved nothing, a gate that permitted everything, a
|
|
7256
|
+
* review whose search tokens silently described its previous text. A case
|
|
7257
|
+
* reading "check the editor works" passes against all of them.
|
|
7258
|
+
*
|
|
7259
|
+
* The spares case is the proof. Before the fix, every /store/spares/new save
|
|
7260
|
+
* failed Zod validation because the schema's hand-written listingType enum
|
|
7261
|
+
* omitted the type — so a tester told to "check creating a spares listing
|
|
7262
|
+
* works" would answer no, with no idea what correct looked like.
|
|
7263
|
+
*/
|
|
7264
|
+
...group("owner-tools", "Owner tools & purchase context", [
|
|
7265
|
+
{
|
|
7266
|
+
pageKey: "listing-types",
|
|
7267
|
+
pageLabel: "Listing types & the advanced gate",
|
|
7268
|
+
href: "/store/products",
|
|
7269
|
+
cases: [
|
|
7270
|
+
{
|
|
7271
|
+
key: "spares-can-be-created",
|
|
7272
|
+
label: "A spares listing can be created at all",
|
|
7273
|
+
roles: ["seller"],
|
|
7274
|
+
startPage: "/store/spares/new",
|
|
7275
|
+
steps: [
|
|
7276
|
+
"Sign in as the seller who owns store-beyblade-arena.",
|
|
7277
|
+
"Open /store/spares/new and fill in a title, a price and a stock quantity.",
|
|
7278
|
+
"Save as draft, then publish.",
|
|
7279
|
+
"Open /spares and look for the listing.",
|
|
7280
|
+
],
|
|
7281
|
+
inputs: { title: "QA Spare attack ring", price: 249, stockQuantity: 3 },
|
|
7282
|
+
expectedBehaviour: "productCreateSchema accepts listingType 'spares'. Its enum is DERIVED from ALL_LISTING_TYPES rather than hand-written, so a type in the union cannot be missing from the schema.",
|
|
7283
|
+
expectedUiState: "Both the autosave and the publish succeed, with no field error on listingType. The published row appears on /spares.",
|
|
7284
|
+
endResult: "BEFORE: every save failed validation — the hand-written enum omitted 'spares' while carrying a dead 'bundle' — so the type could not be created at all, even though its 21 pages, its nav entry and its browse page all existed. AFTER: it saves and appears.",
|
|
7285
|
+
},
|
|
7286
|
+
{
|
|
7287
|
+
key: "dead-bundle-type-rejected",
|
|
7288
|
+
label: "listingType 'bundle' is rejected rather than silently stored",
|
|
7289
|
+
roles: ["admin"],
|
|
7290
|
+
startPage: "/admin/products",
|
|
7291
|
+
steps: [
|
|
7292
|
+
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
7293
|
+
"POST to /api/admin/products with a valid product body and listingType set to 'bundle'.",
|
|
7294
|
+
"Read the response status and body.",
|
|
7295
|
+
],
|
|
7296
|
+
inputs: { listingType: "bundle" },
|
|
7297
|
+
expectedBehaviour: "'bundle' stopped being a listingType in SB-UNI-D — bundles are a categoryType on categories. The derived enum no longer accepts it.",
|
|
7298
|
+
expectedUiState: "A 400 naming listingType. No product is created.",
|
|
7299
|
+
endResult: "BEFORE: it passed validation and wrote a product that pluginFor, LISTING_KIND_ALIAS_MAP and isListingRowAvailable have no branch for — invisible on every surface and uneditable from any UI. AFTER: refused at the door.",
|
|
7300
|
+
},
|
|
7301
|
+
{
|
|
7302
|
+
key: "advanced-types-hidden-for-new-store",
|
|
7303
|
+
label: "A new store sees only Products, Spares and Auctions under Listings",
|
|
7304
|
+
roles: ["seller"],
|
|
7305
|
+
startPage: "/store",
|
|
7306
|
+
steps: [
|
|
7307
|
+
"Sign in as a seller whose store has no advanced_listing_types capability.",
|
|
7308
|
+
"Read every entry in the Listings group of the store sidebar.",
|
|
7309
|
+
"Type /store/live/new directly into the address bar.",
|
|
7310
|
+
],
|
|
7311
|
+
expectedBehaviour: "The nav filter resolves the store's entitlements SERVER-side — capabilities is a private store field, so a client filter has nothing to read. The create shell refuses a type the store may not use.",
|
|
7312
|
+
expectedUiState: "The Listings group lists Products, Spares and Auctions and nothing else. /store/live/new renders a refusal naming the type and linking to store preferences, not a usable form.",
|
|
7313
|
+
expectedData: { listingNavItems: 3 },
|
|
7314
|
+
endResult: "BEFORE: all eleven entries showed and every per-type new page rendered a complete, usable form for any store. AFTER: three entries, and the advanced pages refuse.",
|
|
7315
|
+
},
|
|
7316
|
+
{
|
|
7317
|
+
key: "advanced-create-refused-server-side",
|
|
7318
|
+
label: "The API refuses an advanced type even when the form is bypassed",
|
|
7319
|
+
roles: ["seller"],
|
|
7320
|
+
startPage: "/store/products",
|
|
7321
|
+
steps: [
|
|
7322
|
+
"Sign in as a seller without the advanced_listing_types capability.",
|
|
7323
|
+
"Call the seller create-product action with listingType 'prize-draw'.",
|
|
7324
|
+
"Read the result.",
|
|
7325
|
+
],
|
|
7326
|
+
inputs: { listingType: "prize-draw" },
|
|
7327
|
+
expectedBehaviour: "assertListingTypeAllowed runs inside createSellerProduct, where the store document is already loaded — so the refusal costs no extra read and cannot be skipped by calling a different entry point.",
|
|
7328
|
+
expectedUiState: "An authorization error naming the type. No listing is created.",
|
|
7329
|
+
endResult: "BEFORE: the only gate covered auction and pre-order, and it sat behind an if-store check that let a storeless caller through. AFTER: all seven advanced types refused, and a non-admin with no store is refused rather than waved past.",
|
|
7330
|
+
},
|
|
7331
|
+
{
|
|
7332
|
+
key: "cannot-patch-into-advanced-type",
|
|
7333
|
+
label: "A standard listing cannot be PATCHed into an advanced type",
|
|
7334
|
+
roles: ["seller"],
|
|
7335
|
+
startPage: "/store/products",
|
|
7336
|
+
steps: [
|
|
7337
|
+
"Sign in as a seller without the advanced_listing_types capability.",
|
|
7338
|
+
"Create a standard listing and note its id.",
|
|
7339
|
+
"Call the seller update action on it with listingType 'auction', then again with 'prize-draw'.",
|
|
7340
|
+
"Reload the listing and read its type.",
|
|
7341
|
+
],
|
|
7342
|
+
expectedBehaviour: "The update gate fires on a CHANGE of type. 'auction' is a basic type so it is allowed; 'prize-draw' is advanced and is refused.",
|
|
7343
|
+
expectedUiState: "The prize-draw PATCH returns an authorization error. The listing's type is unchanged after a reload.",
|
|
7344
|
+
endResult: "BEFORE: sellerUpdateProduct had NO type check at all, so the create gate was bypassable in one request. AFTER: it is refused. 🛑 And editing an EXISTING advanced listing still works — the gate fires only on a change, because every per-type edit page re-sends its own type literal.",
|
|
7345
|
+
},
|
|
7346
|
+
{
|
|
7347
|
+
key: "advanced-optin-round-trips",
|
|
7348
|
+
label: "The advanced-types checkbox survives a reload",
|
|
7349
|
+
roles: ["seller"],
|
|
7350
|
+
startPage: "/store/payout-settings",
|
|
7351
|
+
steps: [
|
|
7352
|
+
"Sign in as a seller and open Payout & Preferences from the store sidebar.",
|
|
7353
|
+
"Tick 'Enable advanced listing types' and save.",
|
|
7354
|
+
"RELOAD the page and read the checkbox.",
|
|
7355
|
+
"Open the store sidebar and read the Listings group.",
|
|
7356
|
+
],
|
|
7357
|
+
expectedBehaviour: "The flag is stored as the advanced_listing_types capability, MERGED into the array rather than replacing it, so admin-granted capabilities survive. The route echoes the saved value back.",
|
|
7358
|
+
expectedUiState: "After the reload the checkbox is still ticked and the Listings group now lists all ten types.",
|
|
7359
|
+
expectedData: { listingNavItems: 10 },
|
|
7360
|
+
endResult: "BEFORE: there was no such control, and /store/payout-settings had no nav entry at all — reachable only by typing the URL. AFTER: it is in the sidebar, and the value round-trips.",
|
|
7361
|
+
},
|
|
7362
|
+
{
|
|
7363
|
+
key: "optin-preserves-admin-capabilities",
|
|
7364
|
+
label: "Saving the seller checkbox does not revoke admin-granted capabilities",
|
|
7365
|
+
roles: ["admin", "seller"],
|
|
7366
|
+
startPage: "/admin/stores",
|
|
7367
|
+
steps: [
|
|
7368
|
+
"As admin, open the store editor for the seller's store and tick 'Verified Seller Badge'. Save.",
|
|
7369
|
+
"Sign in as that seller, open Payout & Preferences, tick 'Enable advanced listing types' and save.",
|
|
7370
|
+
"As admin again, reopen the store editor and read the capability list.",
|
|
7371
|
+
],
|
|
7372
|
+
expectedBehaviour: "The seller's form owns ONE member of the capabilities array and touches only that member; everything else is read from the stored document and written back unchanged.",
|
|
7373
|
+
expectedUiState: "Verified Seller Badge is still ticked, alongside the new advanced_listing_types.",
|
|
7374
|
+
endResult: "A seller form whose write shape can EXPRESS state it does not own will eventually overwrite it (Root Cause #76). This is the case that proves it does not.",
|
|
7375
|
+
},
|
|
7376
|
+
],
|
|
7377
|
+
},
|
|
7378
|
+
{
|
|
7379
|
+
pageKey: "owner-quick-actions",
|
|
7380
|
+
pageLabel: "Pencil, clone and bin on public pages",
|
|
7381
|
+
href: "/products",
|
|
7382
|
+
cases: [
|
|
7383
|
+
{
|
|
7384
|
+
key: "no-controls-for-guest",
|
|
7385
|
+
label: "A signed-out visitor sees no pencil, clone or bin anywhere",
|
|
7386
|
+
roles: ["guest"],
|
|
7387
|
+
startPage: "/products",
|
|
7388
|
+
steps: [
|
|
7389
|
+
"Open /products signed out and read a product card.",
|
|
7390
|
+
"Open a product detail page.",
|
|
7391
|
+
"Open /categories and a category page.",
|
|
7392
|
+
],
|
|
7393
|
+
expectedBehaviour: "The toolbar renders nothing when there is no session, and nothing while the session is still resolving.",
|
|
7394
|
+
expectedUiState: "No edit, duplicate or delete control on any card or detail page.",
|
|
7395
|
+
endResult: "A visitor must never see an owner control, and must never see one flash in and out.",
|
|
7396
|
+
},
|
|
7397
|
+
{
|
|
7398
|
+
key: "no-flash-for-signed-in-owner",
|
|
7399
|
+
label: "The toolbar appears once, without flashing",
|
|
7400
|
+
roles: ["admin"],
|
|
7401
|
+
startPage: "/products",
|
|
7402
|
+
steps: [
|
|
7403
|
+
"Sign in as admin@letitrip.in / TempPass123!.",
|
|
7404
|
+
"HARD-reload /products and watch the first second of the page closely.",
|
|
7405
|
+
"Repeat twice more.",
|
|
7406
|
+
],
|
|
7407
|
+
expectedBehaviour: "Public pages are ISR and read no session, so loading starts true on every hard load even for a signed-in user. The toolbar renders NOTHING until auth resolves.",
|
|
7408
|
+
expectedUiState: "The controls are absent, then appear once. They never appear, vanish and reappear.",
|
|
7409
|
+
endResult: "A two-state gate here would show nothing, then pop the toolbar in a few hundred ms after every single page load. Appearing late is invisible; flashing is a bug people report.",
|
|
7410
|
+
},
|
|
7411
|
+
{
|
|
7412
|
+
key: "pencil-opens-that-records-editor",
|
|
7413
|
+
label: "The pencil lands on that record's editor, not a list",
|
|
7414
|
+
roles: ["admin"],
|
|
7415
|
+
startPage: "/products",
|
|
7416
|
+
steps: [
|
|
7417
|
+
"Signed in as admin, open a product detail page and note the product title.",
|
|
7418
|
+
"Press the pencil.",
|
|
7419
|
+
"Read the page that opens.",
|
|
7420
|
+
],
|
|
7421
|
+
expectedBehaviour: "The pencil navigates to that product's edit route.",
|
|
7422
|
+
expectedUiState: "The editor opens on the SAME product, with its title already filled in.",
|
|
7423
|
+
endResult: "BEFORE: there was no control at all — ZERO public detail views rendered any owner affordance — so fixing a typo meant going to the dashboard, finding the list and searching for the row.",
|
|
7424
|
+
},
|
|
7425
|
+
{
|
|
7426
|
+
key: "card-navigation-still-works",
|
|
7427
|
+
label: "A card with owner controls still navigates when clicked",
|
|
7428
|
+
roles: ["admin"],
|
|
7429
|
+
startPage: "/products",
|
|
7430
|
+
steps: [
|
|
7431
|
+
"Signed in as admin, open /products.",
|
|
7432
|
+
"Click a product card anywhere OTHER than the owner controls.",
|
|
7433
|
+
"Go back, then click the pencil on the same card.",
|
|
7434
|
+
],
|
|
7435
|
+
expectedBehaviour: "The toolbar is rendered OUTSIDE the card's anchor. A button inside an anchor is invalid HTML that browsers resolve by closing the anchor early, which breaks the CARD's navigation.",
|
|
7436
|
+
expectedUiState: "Clicking the card opens the product. Clicking the pencil opens the editor. Neither does both.",
|
|
7437
|
+
endResult: "The card's own link must survive the toolbar being added to it.",
|
|
7438
|
+
},
|
|
7439
|
+
{
|
|
7440
|
+
key: "clone-is-admin-only",
|
|
7441
|
+
label: "A seller sees pencil and bin but NOT clone",
|
|
7442
|
+
roles: ["seller"],
|
|
7443
|
+
startPage: "/products",
|
|
7444
|
+
steps: [
|
|
7445
|
+
"Sign in as the seller who owns store-beyblade-arena.",
|
|
7446
|
+
"Open one of that store's product detail pages.",
|
|
7447
|
+
"Read the owner controls.",
|
|
7448
|
+
],
|
|
7449
|
+
expectedBehaviour: "Clone is gated on useIsAdmin, not the owner check — useIsOwner returns true for the owner too, so reusing it would hand every seller a staff tool.",
|
|
7450
|
+
expectedUiState: "A pencil and a bin. No duplicate control.",
|
|
7451
|
+
endResult: "Clone is a staff tool; editing and deleting your own listing is ordinary.",
|
|
7452
|
+
},
|
|
7453
|
+
{
|
|
7454
|
+
key: "clone-creates-a-draft-copy",
|
|
7455
|
+
label: "Clone creates a (Copy) draft and opens its editor",
|
|
7456
|
+
roles: ["admin"],
|
|
7457
|
+
startPage: "/products",
|
|
7458
|
+
steps: [
|
|
7459
|
+
"Signed in as admin, open a product detail page and note its title, stock and whether it has bids.",
|
|
7460
|
+
"Press the duplicate control.",
|
|
7461
|
+
"Read the editor that opens: its title, its status, its bid count and its group membership.",
|
|
7462
|
+
"Go back to the original product page and read its title and status.",
|
|
7463
|
+
],
|
|
7464
|
+
expectedBehaviour: "The duplicate endpoint strips identity (id/slug/barcodeId), analytics (viewCount/avgRating/reviewCount), auction bid state and group membership, titles the copy with a (Copy) suffix and forces status draft. It returns the new id so the UI can land on the copy.",
|
|
7465
|
+
expectedUiState: "The editor opens on a NEW record whose title ends in (Copy), status draft, no bids and no group. The original is untouched.",
|
|
7466
|
+
expectedData: { copyStatus: "draft", copyBidCount: 0 },
|
|
7467
|
+
endResult: "A duplicate must start standalone — silently joined to the source's group is how one edit changes two listings.",
|
|
7468
|
+
},
|
|
7469
|
+
{
|
|
7470
|
+
key: "bin-confirms-before-deleting",
|
|
7471
|
+
label: "The bin confirms, names the record, and cancelling changes nothing",
|
|
7472
|
+
roles: ["admin"],
|
|
7473
|
+
startPage: "/products",
|
|
7474
|
+
steps: [
|
|
7475
|
+
"Signed in as admin, open a product detail page and note its title.",
|
|
7476
|
+
"Press the bin and read the dialog.",
|
|
7477
|
+
"Press Cancel. Reload the page.",
|
|
7478
|
+
"Press the bin again and confirm.",
|
|
7479
|
+
"Try to open the same product URL.",
|
|
7480
|
+
],
|
|
7481
|
+
expectedBehaviour: "The confirm copy comes from the ACTIONS registry, never inline, and names the record being deleted.",
|
|
7482
|
+
expectedUiState: "The dialog names the product. After Cancel the product is still there on reload. After confirming, the product URL no longer resolves.",
|
|
7483
|
+
endResult: "A destructive control on a PUBLIC page must state what it will destroy, and cancelling must be a true no-op.",
|
|
7484
|
+
},
|
|
7485
|
+
],
|
|
7486
|
+
},
|
|
7487
|
+
{
|
|
7488
|
+
pageKey: "purchase-context",
|
|
7489
|
+
pageLabel: "Your order & your review on a product page",
|
|
7490
|
+
href: "/products",
|
|
7491
|
+
cases: [
|
|
7492
|
+
{
|
|
7493
|
+
key: "strip-links-to-your-order",
|
|
7494
|
+
label: "A buyer who ordered this item gets a Track link to that order",
|
|
7495
|
+
roles: ["buyer"],
|
|
7496
|
+
startPage: "/user/orders",
|
|
7497
|
+
steps: [
|
|
7498
|
+
"Sign in as a buyer with a seeded order and note the order id and one item in it.",
|
|
7499
|
+
"Open that item's product page.",
|
|
7500
|
+
"Read the strip above the reviews.",
|
|
7501
|
+
"Press Track.",
|
|
7502
|
+
],
|
|
7503
|
+
expectedBehaviour: "The lookup scans the buyer's recent orders for one containing this product — items[] holds objects, so no Firestore query can match a nested productId.",
|
|
7504
|
+
expectedUiState: "The strip names the order date and its short reference, and Track lands on the track page for THAT order.",
|
|
7505
|
+
endResult: "BEFORE: no surface linked a product to the buyer's own order; the route was remember-you-bought-it, go to /user/orders, page through. 🛑 No price appears in the strip.",
|
|
7506
|
+
},
|
|
7507
|
+
{
|
|
7508
|
+
key: "older-than-window-says-so",
|
|
7509
|
+
label: "A purchase older than 90 days says so rather than denying it",
|
|
7510
|
+
roles: ["buyer"],
|
|
7511
|
+
startPage: "/products",
|
|
7512
|
+
steps: [
|
|
7513
|
+
"Sign in as a buyer and open a product page for an item they have NOT ordered in the last 90 days.",
|
|
7514
|
+
"Read the strip's wording exactly.",
|
|
7515
|
+
],
|
|
7516
|
+
expectedBehaviour: "The order lookup is a bounded 90-day window, and the response carries windowDays so the UI can state the bound.",
|
|
7517
|
+
expectedUiState: "It reads 'No order for this item in the last 90 days' with a link to all orders. It does NOT read 'you haven't bought this'.",
|
|
7518
|
+
endResult: "🛑 A filtered empty result reported as an absolute zero is a lie the buyer cannot check — the same defect UserOrdersView carries a long comment about.",
|
|
7519
|
+
},
|
|
7520
|
+
{
|
|
7521
|
+
key: "write-then-edit-a-review",
|
|
7522
|
+
label: "A buyer can write a review and then edit it",
|
|
7523
|
+
roles: ["buyer"],
|
|
7524
|
+
startPage: "/products",
|
|
7525
|
+
steps: [
|
|
7526
|
+
"Sign in as a buyer with a delivered order and open one of its items.",
|
|
7527
|
+
"Press 'Write a review' in the strip, give 4 stars, a title and a comment, and save.",
|
|
7528
|
+
"RELOAD the product page and read the strip and the review list.",
|
|
7529
|
+
"Press 'Edit review', change the comment, and save.",
|
|
7530
|
+
"RELOAD again and read the review.",
|
|
7531
|
+
],
|
|
7532
|
+
inputs: { rating: 4, title: "QA review purchase-context", comment: "First version." },
|
|
7533
|
+
expectedBehaviour: "One form component serves both the inline drawer and /user/reviews/[id]/edit, so the two cannot drift. An approved review edited by its author stays approved.",
|
|
7534
|
+
expectedUiState: "The strip shows 'Your review: 4/5' and the edited comment is the one displayed after the reload.",
|
|
7535
|
+
endResult: "BEFORE: there was NO review form anywhere in the application — useCreateReview had zero component consumers and ViewReviewModal is read-only. AFTER: a review can be written and changed.",
|
|
7536
|
+
},
|
|
7537
|
+
{
|
|
7538
|
+
key: "review-edit-keeps-search-and-images-honest",
|
|
7539
|
+
label: "Editing a review rebuilds its search tokens and its hasImages flag",
|
|
7540
|
+
roles: ["buyer"],
|
|
7541
|
+
startPage: "/user/reviews",
|
|
7542
|
+
steps: [
|
|
7543
|
+
"Sign in as a buyer with an existing review that has at least one image.",
|
|
7544
|
+
"Open /user/reviews and note the review's id.",
|
|
7545
|
+
"Edit the review, replacing a distinctive word in the comment with a new distinctive word, and save.",
|
|
7546
|
+
"Search the product's reviews for the OLD word, then for the NEW word.",
|
|
7547
|
+
"Read the review's stored hasImages against whether it still has images.",
|
|
7548
|
+
],
|
|
7549
|
+
expectedBehaviour: "The PATCH goes through reviewRepository, so searchTxt is rebuilt and userName stays encrypted; hasImages is derived whenever images is sent.",
|
|
7550
|
+
expectedUiState: "Searching the NEW word finds the review. Searching the OLD word does not.",
|
|
7551
|
+
expectedData: { foundByNewWord: true, foundByOldWord: false },
|
|
7552
|
+
endResult: "BEFORE: the route wrote through a GENERIC repository, so the tokens still described the previous text — the review was findable only by what it used to say — and hasImages went stale.",
|
|
7553
|
+
},
|
|
7554
|
+
{
|
|
7555
|
+
key: "review-get-returns-a-name-not-ciphertext",
|
|
7556
|
+
label: "GET a review by id returns a display name, not enc:v1 ciphertext",
|
|
7557
|
+
roles: ["guest"],
|
|
7558
|
+
startPage: "/reviews",
|
|
7559
|
+
steps: [
|
|
7560
|
+
"Open /api/reviews/{id} for any seeded review.",
|
|
7561
|
+
"Read the userName field and look for a helpfulVoterIds field.",
|
|
7562
|
+
],
|
|
7563
|
+
expectedBehaviour: "The read goes through reviewRepository, so mapDoc decrypts userName and strips helpfulVoterIds.",
|
|
7564
|
+
expectedUiState: "userName is a readable name. There is no helpfulVoterIds field in the response.",
|
|
7565
|
+
endResult: "BEFORE: the generic repository returned the document verbatim, so this public endpoint served the reviewer's name as raw enc:v1 ciphertext and published the list of everyone who had voted it helpful.",
|
|
7566
|
+
},
|
|
7567
|
+
],
|
|
7568
|
+
},
|
|
7569
|
+
{
|
|
7570
|
+
pageKey: "order-journey",
|
|
7571
|
+
pageLabel: "Order tracking & search",
|
|
7572
|
+
href: "/user/orders",
|
|
7573
|
+
cases: [
|
|
7574
|
+
{
|
|
7575
|
+
key: "track-offered-before-shipping",
|
|
7576
|
+
label: "Track is offered on a pending order, not only a shipped one",
|
|
7577
|
+
roles: ["buyer"],
|
|
7578
|
+
startPage: "/user/orders",
|
|
7579
|
+
steps: [
|
|
7580
|
+
"Sign in as a buyer with orders in several statuses.",
|
|
7581
|
+
"Find an order that is pending, confirmed or processing.",
|
|
7582
|
+
"Read its row's actions.",
|
|
7583
|
+
"Press Track.",
|
|
7584
|
+
],
|
|
7585
|
+
expectedBehaviour: "Every pre-delivery status offers Track. The timeline reads correctly for all of them — it shows the stages reached and the stages still ahead.",
|
|
7586
|
+
expectedUiState: "A Track action is present, and it opens the track page for that order.",
|
|
7587
|
+
endResult: "BEFORE: Track appeared only once an order was shipped, so a buyer waiting on a pending order — exactly when they most want to know — had no link at all.",
|
|
7588
|
+
},
|
|
7589
|
+
{
|
|
7590
|
+
key: "track-page-shows-the-parcel",
|
|
7591
|
+
label: "The track page shows items, address, carrier and onward links",
|
|
7592
|
+
roles: ["buyer"],
|
|
7593
|
+
startPage: "/user/orders",
|
|
7594
|
+
steps: [
|
|
7595
|
+
"Open the track page for an order with more than one item and a delivery address.",
|
|
7596
|
+
"Read everything on the page.",
|
|
7597
|
+
],
|
|
7598
|
+
expectedBehaviour: "Items, the delivery address, the carrier and tracking number, and links to the detail page, the invoice and — once delivered — a return, all come from data already on the order.",
|
|
7599
|
+
expectedUiState: "Item thumbnails and titles with quantities, the delivery address, the short order reference, and the onward action buttons. No price anywhere.",
|
|
7600
|
+
endResult: "BEFORE: the page rendered a timeline and nothing else — a wiring gap, not a data gap. A buyer who wanted their invoice had to go back to the list and find the order again.",
|
|
7601
|
+
},
|
|
7602
|
+
{
|
|
7603
|
+
key: "search-orders-by-item-name",
|
|
7604
|
+
label: "Searching orders matches the item name, and a nonsense term returns the filtered message",
|
|
7605
|
+
roles: ["buyer"],
|
|
7606
|
+
startPage: "/user/orders",
|
|
7607
|
+
steps: [
|
|
7608
|
+
"Sign in as a buyer with several orders and note one item's title.",
|
|
7609
|
+
"Search /user/orders for a distinctive word from that title.",
|
|
7610
|
+
"Now search for 'zzzznope'.",
|
|
7611
|
+
"Read the empty-state wording exactly.",
|
|
7612
|
+
],
|
|
7613
|
+
inputs: { nonsenseTerm: "zzzznope" },
|
|
7614
|
+
expectedBehaviour: "The in-memory filter matches the item TITLES as well as the order id, and a filtered empty result is reported as filtered.",
|
|
7615
|
+
expectedUiState: "The item word returns that order. 'zzzznope' returns 'No orders match your search or filters.' — NOT 'You haven't placed any orders yet.'",
|
|
7616
|
+
expectedData: { nonsenseResults: 0 },
|
|
7617
|
+
endResult: "BEFORE: the route matched the order id only, so a buyer searching for what they bought got nothing. 🛑 The nonsense control is the point — a real term returns plausible rows whether or not the filter works.",
|
|
7618
|
+
},
|
|
7619
|
+
{
|
|
7620
|
+
key: "invoice-supplier-from-business-block",
|
|
7621
|
+
label: "The invoice names the registered entity from the business block",
|
|
7622
|
+
roles: ["buyer", "admin"],
|
|
7623
|
+
startPage: "/user/orders",
|
|
7624
|
+
steps: [
|
|
7625
|
+
"Open the invoice for a recent order and read the supplier block — legal name, GSTIN, address.",
|
|
7626
|
+
"Compare them against appkit.config.js's business block.",
|
|
7627
|
+
"Download the PDF invoice for the SAME order and compare it line for line with the HTML one.",
|
|
7628
|
+
],
|
|
7629
|
+
expectedBehaviour: "resolveSupplierIdentity's platform branch reads the injected business identity, and both renderers read the snapshot stamped on the order at creation.",
|
|
7630
|
+
expectedUiState: "The HTML and PDF invoices agree, and the supplier block matches the business block.",
|
|
7631
|
+
endResult: "BEFORE: it read siteSettings.gst, making the invoice path a sixth owner of the statutory identity — and the one that decides what a tax invoice says. 🛑 The snapshot is unchanged, so correcting a typo must NOT reissue historical invoices.",
|
|
7632
|
+
},
|
|
7633
|
+
{
|
|
7634
|
+
key: "user-reviews-list-is-paginated",
|
|
7635
|
+
label: "The user reviews endpoint returns a page, not everything ever written",
|
|
7636
|
+
roles: ["buyer"],
|
|
7637
|
+
startPage: "/user/reviews",
|
|
7638
|
+
steps: [
|
|
7639
|
+
"Sign in as a buyer with several reviews.",
|
|
7640
|
+
"Call /api/user/reviews and read the response keys.",
|
|
7641
|
+
"Call it again with pageSize=1 and read how many reviews come back.",
|
|
7642
|
+
"Call it with pageSize=5000.",
|
|
7643
|
+
],
|
|
7644
|
+
inputs: { pageSize: 1, oversizedPageSize: 5000 },
|
|
7645
|
+
expectedBehaviour: "The endpoint pages, and clamps pageSize to Rule #6's ceiling of 50.",
|
|
7646
|
+
expectedUiState: "The response carries reviews, total, page, pageSize and totalPages. pageSize=1 returns one review. pageSize=5000 returns at most 50.",
|
|
7647
|
+
expectedData: { maxPageSize: 50 },
|
|
7648
|
+
endResult: "BEFORE: it returned every review the account had ever written, unbounded, in one response.",
|
|
7649
|
+
},
|
|
7650
|
+
],
|
|
7651
|
+
},
|
|
7652
|
+
]),
|
|
7238
7653
|
];
|
|
7239
7654
|
const defaultPhases = assignDefaultPhases(rawTesterChecklistItems);
|
|
7240
7655
|
export const testerChecklistSeedData = rawTesterChecklistItems.map((item, index) => ({
|
package/dist/index.d.ts
CHANGED
|
@@ -2076,7 +2076,6 @@ export { finalizeStagedMediaObject } from "./features/media/server";
|
|
|
2076
2076
|
export { finalizeStagedMediaObjectArray } from "./features/media/server";
|
|
2077
2077
|
export { finalizeStagedMediaUrl } from "./features/media/server";
|
|
2078
2078
|
export { DEFAULT_ORDER_DATA } from "./features/orders/index";
|
|
2079
|
-
export { MarketplaceOrderCard } from "./features/orders/index";
|
|
2080
2079
|
export { ORDER_ADMIN_SORT_OPTIONS } from "./features/orders/index";
|
|
2081
2080
|
export { ORDER_COLLECTION } from "./features/orders/index";
|
|
2082
2081
|
export { ORDER_FILTER_KEYS } from "./features/orders/index";
|
|
@@ -2125,10 +2124,6 @@ export { orderTimelineSchema } from "./features/orders/index";
|
|
|
2125
2124
|
export { useOrder } from "./features/orders/index";
|
|
2126
2125
|
export { useOrders } from "./features/orders/index";
|
|
2127
2126
|
export { useTrackOrder } from "./features/orders/index";
|
|
2128
|
-
export type { MarketplaceOrderCardLabels } from "./features/orders/index";
|
|
2129
|
-
export type { MarketplaceOrderCardLinks } from "./features/orders/index";
|
|
2130
|
-
export type { MarketplaceOrderCardOrder } from "./features/orders/index";
|
|
2131
|
-
export type { MarketplaceOrderCardProps } from "./features/orders/index";
|
|
2132
2127
|
export type { Order } from "./features/orders/index";
|
|
2133
2128
|
export type { OrderAdminUpdateInput } from "./features/orders/index";
|
|
2134
2129
|
export type { AppliedOrderDiscount } from "./features/orders/index";
|
|
@@ -2311,6 +2306,8 @@ export { getProductTableColumns } from "./features/products/index";
|
|
|
2311
2306
|
export { normalizeListingType, isAuctionListing, isPreOrderListing, isStandardListing, isPrizeDrawListing, isClassifiedListing, isDigitalCodeListing, isLiveListing, isArtListing, isStickersListing, } from "./features/products/index";
|
|
2312
2307
|
export { isFinalSale, acceptsChangeOfMindReturns, } from "./features/products/constants/final-sale";
|
|
2313
2308
|
export { isListingTypeEnabled, isCategoryTypeEnabled, enabledListingTypes, enabledCategoryTypes, ALL_LISTING_TYPES, isListingType, } from "./_internal/shared/listing-types/feature-flags";
|
|
2309
|
+
export { ADVANCED_LISTING_TYPE_CAPABILITY, ADVANCED_LISTING_TYPES, BASIC_LISTING_TYPES, LISTING_TYPE_TIER, assertListingTypeAllowed, hasAdvancedListingTypes, isAdvancedListingType, isListingTypeAllowedFor, listingTypesAllowedFor, } from "./_internal/shared/listing-types/tiers";
|
|
2310
|
+
export type { ListingTypeAccessContext, ListingTypeTier, } from "./_internal/shared/listing-types/tiers";
|
|
2314
2311
|
export { actionTracker, setActionTrackerSink, resetActionTrackerSink, type ActionEvent, type ActionTrackerSink, } from "./_internal/shared/listing-types/action-tracker";
|
|
2315
2312
|
export { cartRequiresShipping, cartIsDigitalOnly, cartIsChatOnly, } from "./_internal/shared/listing-types/cart-shipping";
|
|
2316
2313
|
export { ACTIONS, action, act, canPerformAction, actionsForListingType, actionLabel, type ActionDef, type ActionKind, type ActionResource, type ActionTree, type ActionConfirmation, } from "./_internal/shared/actions/action-registry";
|
|
@@ -2747,7 +2744,6 @@ export { AdminSiteConfigGuideView } from "./features/admin/components/AdminSiteC
|
|
|
2747
2744
|
export { AdminTeamGuideView } from "./features/admin/components/AdminTeamGuideView";
|
|
2748
2745
|
export { AdminAnalyticsGuideView } from "./features/admin/components/AdminAnalyticsGuideView";
|
|
2749
2746
|
export { AdminTrustGuideView } from "./features/admin/components/AdminTrustGuideView";
|
|
2750
|
-
export { AdminWhatsAppGuideView } from "./features/admin/components/AdminWhatsAppGuideView";
|
|
2751
2747
|
export { AdminPaymentsGuideView } from "./features/admin/components/AdminPaymentsGuideView";
|
|
2752
2748
|
export { BuyerShoppingGuideView } from "./features/account/components/BuyerShoppingGuideView";
|
|
2753
2749
|
export { BuyerAuctionsGuideView } from "./features/account/components/BuyerAuctionsGuideView";
|
|
@@ -2765,8 +2761,6 @@ export { StoreCapabilitiesGuideView } from "./features/stores/components/StoreCa
|
|
|
2765
2761
|
export type { StoreCapabilitiesGuideViewProps } from "./features/stores/components/StoreCapabilitiesGuideView";
|
|
2766
2762
|
export { StoreSettingsGuideView } from "./features/stores/components/StoreSettingsGuideView";
|
|
2767
2763
|
export type { StoreSettingsGuideViewProps } from "./features/stores/components/StoreSettingsGuideView";
|
|
2768
|
-
export { StoreWhatsAppGuideView } from "./features/stores/components/StoreWhatsAppGuideView";
|
|
2769
|
-
export type { StoreWhatsAppGuideViewProps } from "./features/stores/components/StoreWhatsAppGuideView";
|
|
2770
2764
|
export { StorePreOrdersListing } from "./features/stores/components/StorePreOrdersListing";
|
|
2771
2765
|
export type { StorePreOrdersListingProps } from "./features/stores/components/StorePreOrdersListing";
|
|
2772
2766
|
export { buildStoreColumns } from "./features/stores/index";
|
|
@@ -2820,25 +2814,8 @@ export { updateStoreAddressForSeller } from "./features/stores/server";
|
|
|
2820
2814
|
export type { StoreContentParams } from "./features/stores/server";
|
|
2821
2815
|
export type { StoreQueryListParams } from "./features/stores/server";
|
|
2822
2816
|
export type { StoreReviewsResult } from "./features/stores/server";
|
|
2823
|
-
export {
|
|
2824
|
-
export {
|
|
2825
|
-
export type { SellerWhatsAppSettingsViewProps } from "./features/whatsapp-bot/index";
|
|
2826
|
-
export type { CheckoutMessageInput } from "./features/whatsapp-bot/index";
|
|
2827
|
-
export type { IncomingWebhookPayload } from "./features/whatsapp-bot/index";
|
|
2828
|
-
export type { OrderStatusKey } from "./features/whatsapp-bot/index";
|
|
2829
|
-
export type { SendWhatsAppInput } from "./features/whatsapp-bot/index";
|
|
2830
|
-
export type { StatusMessageInput } from "./features/whatsapp-bot/index";
|
|
2831
|
-
export type { StatusNotificationInput } from "./features/whatsapp-bot/index";
|
|
2832
|
-
export type { WebhookVerifyInput } from "./features/whatsapp-bot/index";
|
|
2833
|
-
export { buildCheckoutMessageURL } from "./features/whatsapp-bot/server";
|
|
2834
|
-
export { buildStatusMessage } from "./features/whatsapp-bot/server";
|
|
2835
|
-
export { buildStatusNotificationURL } from "./features/whatsapp-bot/server";
|
|
2836
|
-
export { buildPaymentProofReviewMessage } from "./features/whatsapp-bot/server";
|
|
2837
|
-
export { isAdminNumber } from "./features/whatsapp-bot/server";
|
|
2838
|
-
export { parseIncomingWebhookPayload } from "./features/whatsapp-bot/server";
|
|
2839
|
-
export { sendWhatsAppMessage } from "./features/whatsapp-bot/server";
|
|
2840
|
-
export { sendWhatsAppBusinessMessage, syncProductsToCatalog, buildPurchaseAnnouncementMessage, buildGroupShareLink } from "./features/whatsapp-bot/server";
|
|
2841
|
-
export type { WaBusinessSendInput, CatalogSyncProduct, CatalogSyncInput, CatalogSyncResult, PurchaseAnnouncementInput } from "./features/whatsapp-bot/index";
|
|
2817
|
+
export { buildPaymentProofReviewMessage } from "./features/orders/utils/payment-proof-message";
|
|
2818
|
+
export type { PaymentProofReviewMessageInput } from "./features/orders/utils/payment-proof-message";
|
|
2842
2819
|
export { WishlistCard } from "./features/wishlist/index";
|
|
2843
2820
|
export { WishlistPage } from "./features/wishlist/index";
|
|
2844
2821
|
export { WishlistHeartButton } from "./features/wishlist/index";
|
|
@@ -3082,6 +3059,8 @@ export type { UserProfileOgData } from "./_internal/server/features/profile/og";
|
|
|
3082
3059
|
export { LISTING_TYPE_CAPABILITIES, capabilityFor, canAddToCart, canBid, supportsShipping, requiresVendorVerified, requiresJurisdictionCheck, hasInstantFulfillment, assertNever, } from "./_internal/shared/listing-types/capabilities";
|
|
3083
3060
|
export type { ListingTypeCapability } from "./_internal/shared/listing-types/capabilities";
|
|
3084
3061
|
export { LISTING_TYPE_REGISTRY, pluginFor, detectListingTypeFromSlug } from "./_internal/shared/listing-types/_registry";
|
|
3062
|
+
export { OwnerQuickActions } from "./features/admin/components/OwnerQuickActions";
|
|
3063
|
+
export type { OwnerQuickActionsProps, OwnerQuickActionsResource } from "./features/admin/components/OwnerQuickActions";
|
|
3085
3064
|
export type { ListingTypePlugin } from "./_internal/shared/listing-types/_registry";
|
|
3086
3065
|
export { getListingRule, getCategoryRule, pickOrderType, getSplitKey, runSyncPreflight, CHECKOUT_RULES, CATEGORY_CHECKOUT_RULES, CHECKOUT_MAX_ORDERS_PER_TX, PRIZE_DRAW_MAX_REVEALS_PER_ORDER, BUNDLE_MAX_QTY_PER_TX, STANDARD_MAX_QTY_PER_LINE, } from "./_internal/shared/checkout/rules";
|
|
3087
3066
|
export type { ListingCheckoutRule, CategoryCheckoutRule, CartItemProductPair, OrderItemInput, RefundPolicy, } from "./_internal/shared/checkout/rules";
|
|
@@ -3184,3 +3163,5 @@ export type { CourierRatingPair, CourierRatingDisplay, CourierRatingVote, Courie
|
|
|
3184
3163
|
* server.ts.
|
|
3185
3164
|
*/
|
|
3186
3165
|
export type { ConversationDocument, ConversationStatus, ConversationLastMessage, ParticipantRole, MessageDocument, MessageProductRef, } from "./features/messages/schemas/firestore";
|
|
3166
|
+
export { configurePlatformSupplier, getPlatformSupplier, resetPlatformSupplier, } from "./_internal/shared/features/site-settings/supplier-of-record";
|
|
3167
|
+
export type { PlatformSupplierIdentity } from "./_internal/shared/features/site-settings/supplier-of-record";
|
package/dist/index.js
CHANGED
|
@@ -3915,8 +3915,6 @@ export { finalizeStagedMediaUrl } from "./features/media/server.js";
|
|
|
3915
3915
|
// DEFAULT_ORDER_DATA - Constant used across modules.
|
|
3916
3916
|
export { DEFAULT_ORDER_DATA } from "./features/orders/index.js";
|
|
3917
3917
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
3918
|
-
// MarketplaceOrderCard - Component for marketplace order card.
|
|
3919
|
-
export { MarketplaceOrderCard } from "./features/orders/index.js";
|
|
3920
3918
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
3921
3919
|
// ORDER_ADMIN_SORT_OPTIONS - Constant used across modules.
|
|
3922
3920
|
export { ORDER_ADMIN_SORT_OPTIONS } from "./features/orders/index.js";
|
|
@@ -4306,6 +4304,9 @@ export { normalizeListingType, isAuctionListing, isPreOrderListing, isStandardLi
|
|
|
4306
4304
|
export { isFinalSale, acceptsChangeOfMindReturns, } from "./features/products/constants/final-sale.js";
|
|
4307
4305
|
// SB-UNI-X4 2026-05-13 â€" per-type feature-flag helpers.
|
|
4308
4306
|
export { isListingTypeEnabled, isCategoryTypeEnabled, enabledListingTypes, enabledCategoryTypes, ALL_LISTING_TYPES, isListingType, } from "./_internal/shared/listing-types/feature-flags.js";
|
|
4307
|
+
// Basic/advanced listing-type split — which types a store may create.
|
|
4308
|
+
// Pure (no firebase-admin in its import chain), so it is safe in index.ts.
|
|
4309
|
+
export { ADVANCED_LISTING_TYPE_CAPABILITY, ADVANCED_LISTING_TYPES, BASIC_LISTING_TYPES, LISTING_TYPE_TIER, assertListingTypeAllowed, hasAdvancedListingTypes, isAdvancedListingType, isListingTypeAllowedFor, listingTypesAllowedFor, } from "./_internal/shared/listing-types/tiers.js";
|
|
4309
4310
|
// SB-UNI-X5 2026-05-13 â€" action telemetry sink.
|
|
4310
4311
|
export { actionTracker, setActionTrackerSink, resetActionTrackerSink, } from "./_internal/shared/listing-types/action-tracker.js";
|
|
4311
4312
|
// SB-UNI-S 2026-05-13 â€" cart-level shipping-requirement helpers.
|
|
@@ -5045,8 +5046,6 @@ export { AdminTeamGuideView } from "./features/admin/components/AdminTeamGuideVi
|
|
|
5045
5046
|
export { AdminAnalyticsGuideView } from "./features/admin/components/AdminAnalyticsGuideView.js";
|
|
5046
5047
|
// [CLIENT-SSR]-Admin trust & safety guide — static view, no firebase-admin.
|
|
5047
5048
|
export { AdminTrustGuideView } from "./features/admin/components/AdminTrustGuideView.js";
|
|
5048
|
-
// [CLIENT-SSR]-Admin WhatsApp integration guide — static view, no firebase-admin.
|
|
5049
|
-
export { AdminWhatsAppGuideView } from "./features/admin/components/AdminWhatsAppGuideView.js";
|
|
5050
5049
|
// [CLIENT-SSR]-Admin payments (Razorpay) guide — static view, no firebase-admin.
|
|
5051
5050
|
export { AdminPaymentsGuideView } from "./features/admin/components/AdminPaymentsGuideView.js";
|
|
5052
5051
|
// [CLIENT-SSR]-Buyer shopping guide — static view, no firebase-admin.
|
|
@@ -5069,8 +5068,6 @@ export { StoreFinanceGuideView } from "./features/stores/components/StoreFinance
|
|
|
5069
5068
|
export { StoreCapabilitiesGuideView } from "./features/stores/components/StoreCapabilitiesGuideView.js";
|
|
5070
5069
|
// [CLIENT-SSR]-Store settings guide — static view, no firebase-admin.
|
|
5071
5070
|
export { StoreSettingsGuideView } from "./features/stores/components/StoreSettingsGuideView.js";
|
|
5072
|
-
// [CLIENT-SSR]-Store WhatsApp catalog sync guide — static view, no firebase-admin.
|
|
5073
|
-
export { StoreWhatsAppGuideView } from "./features/stores/components/StoreWhatsAppGuideView.js";
|
|
5074
5071
|
export { StorePreOrdersListing } from "./features/stores/components/StorePreOrdersListing.js";
|
|
5075
5072
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
5076
5073
|
// buildStoreColumns - Helper for build store columns.
|
|
@@ -5146,35 +5143,11 @@ export { storeSlugGET } from "./features/stores/server.js";
|
|
|
5146
5143
|
// [SERVER-ONLY]-Server-only â€" uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
|
|
5147
5144
|
// updateStoreAddressForSeller - Helper for update store address for seller.
|
|
5148
5145
|
export { updateStoreAddressForSeller } from "./features/stores/server.js";
|
|
5149
|
-
// ./features/
|
|
5150
|
-
// [CLIENT-
|
|
5151
|
-
//
|
|
5152
|
-
|
|
5153
|
-
export {
|
|
5154
|
-
// ./features/whatsapp-bot/server
|
|
5155
|
-
// [SERVER-ONLY]-Server-only â€" uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
|
|
5156
|
-
// buildCheckoutMessageURL - Helper for build checkout message url.
|
|
5157
|
-
export { buildCheckoutMessageURL } from "./features/whatsapp-bot/server.js";
|
|
5158
|
-
// [SERVER-ONLY]-Server-only â€" uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
|
|
5159
|
-
// buildStatusMessage - Helper for build status message.
|
|
5160
|
-
export { buildStatusMessage } from "./features/whatsapp-bot/server.js";
|
|
5161
|
-
// [SERVER-ONLY]-Server-only â€" uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
|
|
5162
|
-
// buildStatusNotificationURL - Helper for build status notification url.
|
|
5163
|
-
export { buildStatusNotificationURL } from "./features/whatsapp-bot/server.js";
|
|
5164
|
-
// [SERVER-ONLY]-Server-only â€" uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
|
|
5165
|
-
// buildPaymentProofReviewMessage - Helper for build payment proof review message (Tier PP).
|
|
5166
|
-
export { buildPaymentProofReviewMessage } from "./features/whatsapp-bot/server.js";
|
|
5167
|
-
// [SERVER-ONLY]-Server-only â€" uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
|
|
5168
|
-
// isAdminNumber - Shared export for is admin number.
|
|
5169
|
-
export { isAdminNumber } from "./features/whatsapp-bot/server.js";
|
|
5170
|
-
// [SERVER-ONLY]-Server-only â€" uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
|
|
5171
|
-
// parseIncomingWebhookPayload - Helper for parse incoming webhook payload.
|
|
5172
|
-
export { parseIncomingWebhookPayload } from "./features/whatsapp-bot/server.js";
|
|
5173
|
-
// [SERVER-ONLY]-Server-only â€" uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
|
|
5174
|
-
// sendWhatsAppMessage - Shared export for send whats app message.
|
|
5175
|
-
export { sendWhatsAppMessage } from "./features/whatsapp-bot/server.js";
|
|
5176
|
-
// [SERVER-ONLY] Meta WhatsApp Business Cloud API helpers (WA1-WA8 integration)
|
|
5177
|
-
export { sendWhatsAppBusinessMessage, syncProductsToCatalog, buildPurchaseAnnouncementMessage, buildGroupShareLink } from "./features/whatsapp-bot/server.js";
|
|
5146
|
+
// ./features/orders/utils/payment-proof-message
|
|
5147
|
+
// [CLIENT-SAFE] Pure wa.me share-link message builder — no crypto, no network.
|
|
5148
|
+
// The WhatsApp Cloud API integration was removed 2026-10-20; this survived
|
|
5149
|
+
// because a wa.me deep link needs no token, number or Meta billing account.
|
|
5150
|
+
export { buildPaymentProofReviewMessage } from "./features/orders/utils/payment-proof-message.js";
|
|
5178
5151
|
// ./features/wishlist/index
|
|
5179
5152
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
5180
5153
|
// WishlistCard - Component for wishlist card.
|
|
@@ -5507,6 +5480,8 @@ export { renderPrivateProfileOgImage, renderUserProfileOgImage } from "./_intern
|
|
|
5507
5480
|
// Listing-type capability registry â€" SB-UNI X1.
|
|
5508
5481
|
export { LISTING_TYPE_CAPABILITIES, capabilityFor, canAddToCart, canBid, supportsShipping, requiresVendorVerified, requiresJurisdictionCheck, hasInstantFulfillment, assertNever, } from "./_internal/shared/listing-types/capabilities.js";
|
|
5509
5482
|
export { LISTING_TYPE_REGISTRY, pluginFor, detectListingTypeFromSlug } from "./_internal/shared/listing-types/_registry.js";
|
|
5483
|
+
// Pencil / clone / bin for whoever owns the record, on a PUBLIC surface.
|
|
5484
|
+
export { OwnerQuickActions } from "./features/admin/components/OwnerQuickActions.js";
|
|
5510
5485
|
// Checkout rule registry â€" pure TS, safe in both client and server bundles.
|
|
5511
5486
|
export { getListingRule, getCategoryRule, pickOrderType, getSplitKey, runSyncPreflight, CHECKOUT_RULES, CATEGORY_CHECKOUT_RULES, CHECKOUT_MAX_ORDERS_PER_TX, PRIZE_DRAW_MAX_REVEALS_PER_ORDER, BUNDLE_MAX_QTY_PER_TX, STANDARD_MAX_QTY_PER_LINE, } from "./_internal/shared/checkout/rules/index.js";
|
|
5512
5487
|
// Media upload limits â€" pure constants, safe in both client and server bundles.
|
|
@@ -5633,3 +5608,7 @@ export { RETURN_CUSTODY_STATES, RETURN_CUSTODY_COPY, isTerminalCustody, canAdvan
|
|
|
5633
5608
|
export { resolveReturnAddress, RTO_ENTRY_CUSTODY, rtoCostBearer, RETURN_ABUSE_SCAM_TYPES, RETURN_ABUSE_THRESHOLDS, returnAbuseSignals, enforcementFor, } from "./_internal/shared/features/returns/destination.js";
|
|
5634
5609
|
// C5f — courier ratings. Two numbers, never blended; see the module header.
|
|
5635
5610
|
export { COURIER_RATING_MIN_CONFIDENT_SAMPLES, courierRatingDisplay, isValidCourierVote, courierVoteId, rollUpCourierVotes, } from "./_internal/shared/features/shipping/courier-rating.js";
|
|
5611
|
+
// The platform's statutory identity, injected at boot from appkit.config.js's
|
|
5612
|
+
// `business` block via the consumer's providers.config.ts. See the module
|
|
5613
|
+
// header for why the invoice path must not read it from siteSettings.
|
|
5614
|
+
export { configurePlatformSupplier, getPlatformSupplier, resetPlatformSupplier, } from "./_internal/shared/features/site-settings/supplier-of-record.js";
|