@mohasinac/appkit 4.14.0 → 4.16.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/_internal/server/features/auctions/actions.js +2 -2
- package/dist/_internal/server/features/cart/service.d.ts +3 -3
- package/dist/_internal/server/features/checkout/actions.js +19 -0
- package/dist/_internal/server/features/checkout/source-context.d.ts +5 -0
- package/dist/_internal/server/features/checkout/source-context.js +157 -0
- package/dist/_internal/server/features/offers/adapters.d.ts +103 -0
- package/dist/_internal/server/features/offers/adapters.js +88 -0
- package/dist/_internal/server/features/offers/index.d.ts +2 -0
- package/dist/_internal/server/features/offers/index.js +1 -0
- package/dist/_internal/server/features/orders/adapters.js +24 -0
- package/dist/_internal/server/jobs/core/offerExpiry.js +10 -10
- package/dist/_internal/shared/actions/action-registry.d.ts +9 -2
- package/dist/_internal/shared/actions/action-registry.js +458 -7
- package/dist/_internal/shared/features/auctions/schema.d.ts +14 -2
- package/dist/_internal/shared/features/auctions/schema.js +13 -1
- package/dist/_internal/shared/features/blog/schema.d.ts +4 -4
- package/dist/_internal/shared/features/cart/schema.d.ts +25 -20
- package/dist/_internal/shared/features/cart/schema.js +15 -0
- package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +22 -22
- package/dist/_internal/shared/features/orders/schema.d.ts +4 -4
- package/dist/_internal/shared/features/products/schema.d.ts +27 -27
- package/dist/_internal/shared/features/promotions/schema.d.ts +4 -4
- package/dist/_internal/shared/features/reviews/schema.d.ts +2 -2
- package/dist/_internal/shared/history/history.d.ts +22 -0
- package/dist/_internal/shared/history/history.js +41 -1
- package/dist/client.d.ts +13 -2
- package/dist/client.js +20 -2
- package/dist/constants/field-names.d.ts +8 -6
- package/dist/constants/field-names.js +48 -6
- package/dist/contracts/extend.d.ts +29 -0
- package/dist/contracts/extend.js +20 -0
- package/dist/contracts/index.d.ts +2 -1
- package/dist/contracts/index.js +2 -0
- package/dist/features/account/components/UserBidsView.js +12 -4
- package/dist/features/account/components/UserReturnsView.d.ts +3 -0
- package/dist/features/account/components/UserReturnsView.js +17 -1
- package/dist/features/admin/components/AdminAuditLogView.js +1 -0
- package/dist/features/admin/components/AdminBidsView.js +15 -2
- package/dist/features/admin/components/AdminBlogEditorView.js +65 -33
- package/dist/features/admin/components/AdminFeatureEditorView.js +35 -6
- package/dist/features/admin/components/AdminNavEditorView.js +15 -5
- package/dist/features/admin/components/AdminNewsletterView.js +18 -2
- package/dist/features/admin/components/AdminOffersView.js +62 -18
- package/dist/features/admin/components/AdminPaymentMethodsView.js +24 -4
- package/dist/features/admin/components/AdminScammerEditorView.d.ts +2 -1
- package/dist/features/admin/components/AdminScammerEditorView.js +3 -13
- package/dist/features/admin/components/AdminScammersView.js +3 -8
- package/dist/features/admin/components/AdminSectionsView.js +32 -23
- package/dist/features/admin/components/AdminSessionsView.js +17 -2
- package/dist/features/admin/components/AdminViewCards.js +24 -17
- package/dist/features/admin/components/DataListingView.js +15 -1
- package/dist/features/admin/components/DataTable.js +7 -17
- package/dist/features/admin/components/ViewAuditLogEntryModal.js +1 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +4 -2
- package/dist/features/admin/components/sections/adminSectionsTypes.js +45 -27
- package/dist/features/admin/constants/filter-tabs.d.ts +3 -0
- package/dist/features/admin/constants/filter-tabs.js +1 -0
- package/dist/features/admin/schemas/homepage-section-form.d.ts +22 -0
- package/dist/features/admin/schemas/homepage-section-form.js +68 -0
- package/dist/features/admin/schemas/nav-item-form.d.ts +74 -0
- package/dist/features/admin/schemas/nav-item-form.js +72 -0
- package/dist/features/auctions/components/AuctionBidsTable.d.ts +10 -1
- package/dist/features/auctions/components/AuctionBidsTable.js +22 -4
- package/dist/features/auctions/components/bid-detail-fields.d.ts +29 -0
- package/dist/features/auctions/components/bid-detail-fields.js +103 -0
- package/dist/features/auctions/schemas/index.d.ts +14 -14
- package/dist/features/audit-log/schemas/firestore.d.ts +14 -0
- package/dist/features/audit-log/schemas/firestore.js +7 -0
- package/dist/features/auth/schemas/index.d.ts +2 -2
- package/dist/features/blog/actions/blog-actions.d.ts +7 -7
- package/dist/features/blog/schemas/blog-form.d.ts +80 -0
- package/dist/features/blog/schemas/blog-form.js +100 -0
- package/dist/features/blog/schemas/index.d.ts +10 -10
- package/dist/features/cart/schemas/index.d.ts +3 -3
- package/dist/features/catalogue/schemas/validation.d.ts +12 -12
- package/dist/features/categories/schemas/index.d.ts +16 -16
- package/dist/features/collections/schemas/index.d.ts +8 -8
- package/dist/features/events/components/AdminEventEditorView.js +32 -54
- package/dist/features/events/components/AdminEventEntriesView.js +22 -3
- package/dist/features/events/schemas/event-form.d.ts +113 -0
- package/dist/features/events/schemas/event-form.js +82 -0
- package/dist/features/events/schemas/index.d.ts +2 -2
- package/dist/features/faq/actions/faq-actions.d.ts +6 -6
- package/dist/features/faq/schemas/index.d.ts +6 -6
- package/dist/features/grouped/schemas/grouped-listing-form.d.ts +101 -0
- package/dist/features/grouped/schemas/grouped-listing-form.js +89 -0
- package/dist/features/grouped/schemas/index.d.ts +4 -4
- package/dist/features/homepage/actions/homepage-section-actions.d.ts +11 -3
- package/dist/features/homepage/actions/homepage-section-actions.js +33 -1
- package/dist/features/homepage/schemas/index.d.ts +71 -40
- package/dist/features/homepage/schemas/index.js +24 -0
- package/dist/features/messages/schemas/index.d.ts +2 -2
- package/dist/features/orders/components/OrderStatusTimeline.d.ts +5 -1
- package/dist/features/orders/components/OrderStatusTimeline.js +39 -20
- package/dist/features/orders/repository/orders.repository.js +5 -0
- package/dist/features/orders/schemas/firestore.d.ts +36 -1
- package/dist/features/orders/schemas/index.d.ts +24 -24
- package/dist/features/orders/types/index.d.ts +35 -7
- package/dist/features/pre-orders/schemas/index.d.ts +4 -4
- package/dist/features/products/components/GroupSettingsPanel.js +5 -1
- package/dist/features/products/schemas/index.d.ts +38 -38
- package/dist/features/products/schemas/product-features.validators.d.ts +75 -2
- package/dist/features/products/schemas/product-features.validators.js +63 -0
- package/dist/features/promotions/schemas/index.d.ts +14 -14
- package/dist/features/reviews/schemas/index.d.ts +14 -14
- package/dist/features/scams/constants/scammer-status-display.d.ts +28 -0
- package/dist/features/scams/constants/scammer-status-display.js +79 -0
- package/dist/features/scams/schemas/index.d.ts +2 -2
- package/dist/features/search/schemas/index.d.ts +2 -2
- package/dist/features/seller/actions/offer-actions.js +32 -2
- package/dist/features/seller/components/OfferPhaseTimeline.d.ts +59 -0
- package/dist/features/seller/components/OfferPhaseTimeline.js +107 -0
- package/dist/features/seller/components/SellerBidsView.js +11 -4
- package/dist/features/seller/components/SellerCouponEditorView.js +17 -17
- package/dist/features/seller/components/SellerOffersView.js +2 -1
- package/dist/features/seller/components/SellerPayoutSettingsView.js +38 -14
- package/dist/features/seller/repository/offer.repository.d.ts +69 -8
- package/dist/features/seller/repository/offer.repository.js +127 -23
- package/dist/features/seller/schemas/coupon-form.d.ts +72 -0
- package/dist/features/seller/schemas/coupon-form.js +116 -0
- package/dist/features/seller/schemas/firestore.d.ts +56 -2
- package/dist/features/seller/schemas/firestore.js +27 -0
- package/dist/features/seller/schemas/index.d.ts +2 -2
- package/dist/features/seller/schemas/offer-forms.d.ts +21 -0
- package/dist/features/seller/schemas/offer-forms.js +21 -0
- package/dist/features/shell/build-sections.d.ts +63 -0
- package/dist/features/shell/build-sections.js +207 -0
- package/dist/features/shell/field-ui-meta.d.ts +115 -0
- package/dist/features/shell/field-ui-meta.js +324 -0
- package/dist/features/shell/index.d.ts +4 -0
- package/dist/features/shell/index.js +2 -0
- package/dist/features/shipments/schemas/validation.d.ts +22 -22
- package/dist/features/status-history/components/StatusTimeline.d.ts +74 -0
- package/dist/features/status-history/components/StatusTimeline.js +46 -0
- package/dist/features/status-history/index.d.ts +11 -0
- package/dist/features/status-history/index.js +10 -0
- package/dist/features/store-extensions/components/ReviewDecisionModal.d.ts +27 -0
- package/dist/features/store-extensions/components/ReviewDecisionModal.js +82 -0
- package/dist/features/store-extensions/index.d.ts +12 -0
- package/dist/features/store-extensions/index.js +12 -0
- package/dist/features/store-extensions/schemas/admin-notification-form.d.ts +36 -0
- package/dist/features/store-extensions/schemas/admin-notification-form.js +114 -0
- package/dist/features/store-extensions/schemas/analytics-forms.d.ts +57 -0
- package/dist/features/store-extensions/schemas/analytics-forms.js +158 -0
- package/dist/features/store-extensions/schemas/custom-role-form.d.ts +85 -0
- package/dist/features/store-extensions/schemas/custom-role-form.js +118 -0
- package/dist/features/store-extensions/schemas/firestore.d.ts +21 -1
- package/dist/features/store-extensions/schemas/firestore.js +60 -0
- package/dist/features/store-extensions/schemas/google-config-form.d.ts +53 -0
- package/dist/features/store-extensions/schemas/google-config-form.js +105 -0
- package/dist/features/store-extensions/schemas/item-request-create-form.d.ts +28 -0
- package/dist/features/store-extensions/schemas/item-request-create-form.js +80 -0
- package/dist/features/store-extensions/schemas/listing-template-form.d.ts +78 -0
- package/dist/features/store-extensions/schemas/listing-template-form.js +87 -0
- package/dist/features/store-extensions/schemas/moderation-review-form.d.ts +49 -0
- package/dist/features/store-extensions/schemas/moderation-review-form.js +101 -0
- package/dist/features/store-extensions/schemas/payout-method-form.d.ts +153 -0
- package/dist/features/store-extensions/schemas/payout-method-form.js +155 -0
- package/dist/features/store-extensions/schemas/report-create-form.d.ts +25 -0
- package/dist/features/store-extensions/schemas/report-create-form.js +79 -0
- package/dist/features/store-extensions/schemas/report-review-form.d.ts +47 -0
- package/dist/features/store-extensions/schemas/report-review-form.js +111 -0
- package/dist/features/store-extensions/schemas/shipping-config-form.d.ts +148 -0
- package/dist/features/store-extensions/schemas/shipping-config-form.js +104 -0
- package/dist/features/store-extensions/schemas/store-category-form.d.ts +54 -0
- package/dist/features/store-extensions/schemas/store-category-form.js +73 -0
- package/dist/features/stores/schemas/index.d.ts +4 -4
- package/dist/features/support/schemas/index.d.ts +4 -4
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +350 -0
- package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +1 -1
- package/dist/index.d.ts +12 -2
- package/dist/index.js +12 -2
- package/dist/next/routing/route-map.d.ts +16 -2
- package/dist/next/routing/route-map.js +9 -2
- package/dist/schemas/firestore-value.d.ts +8 -0
- package/dist/schemas/firestore-value.js +44 -0
- package/dist/schemas/index.d.ts +1 -1
- package/dist/schemas/index.js +1 -1
- package/dist/schemas/registry.d.ts +734 -101
- package/dist/schemas/registry.js +64 -1
- package/dist/seed/bids-seed-data.js +30 -0
- package/dist/seed/offers-seed-data.js +212 -7
- package/dist/seed/orders-seed-data.js +336 -1
- package/dist/seed/products-auctions-seed-data.js +41 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +5 -0
- package/dist/styles.css +1 -1
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/DataTable.js +4 -2
- package/dist/ui/columns/build-columns.d.ts +6 -1
- package/dist/ui/columns/build-columns.js +53 -0
- package/dist/ui/columns/cell-renderers.d.ts +68 -0
- package/dist/ui/columns/cell-renderers.js +111 -0
- package/dist/ui/columns/column-renderers.d.ts +6 -1
- package/dist/ui/columns/column-renderers.js +6 -1
- package/dist/ui/columns/index.d.ts +2 -1
- package/dist/ui/columns/index.js +5 -1
- package/dist/ui/components/Button.js +27 -2
- package/dist/ui/components/RecordDetailModal.d.ts +10 -1
- package/dist/ui/components/RecordDetailModal.js +2 -2
- package/dist/ui/icons/icon-registry.d.ts +65 -0
- package/dist/ui/icons/icon-registry.js +115 -0
- package/package.json +2 -1
- package/scripts/node-esm-loader.mjs +65 -0
- package/scripts/seed-cli-loader.mjs +6 -49
- package/scripts/seed-cli.mjs +1 -1
|
@@ -1116,6 +1116,236 @@ const rawTesterChecklistItems = [
|
|
|
1116
1116
|
label: "An accepted offer past its 48-hour checkout window can no longer be checked out, and is cleared from the cart with a notification to the buyer",
|
|
1117
1117
|
description: "Background/low-priority — requires waiting out the window or adjusting the fixture's checkoutDeadline.",
|
|
1118
1118
|
},
|
|
1119
|
+
{
|
|
1120
|
+
key: "nav-item-invalid-href-inline",
|
|
1121
|
+
label: "A nav item with a bad destination is refused on the FIELD, not by a banner",
|
|
1122
|
+
description: "The routes always validated nav items; the form did not, so an invalid href came back as a 400 after a round-trip. Enter \"products\" (no leading slash) and confirm the error appears under the Destination field.",
|
|
1123
|
+
href: "/admin/navigation",
|
|
1124
|
+
},
|
|
1125
|
+
{
|
|
1126
|
+
key: "homepage-section-invalid-config-inline",
|
|
1127
|
+
label: "A homepage section with malformed config JSON, or a negative order, is refused inline",
|
|
1128
|
+
description: "Same shape: the route validated, the form did not. Paste broken JSON into Config, and separately set Order to -1 — each should report on its own field.",
|
|
1129
|
+
href: "/admin/sections",
|
|
1130
|
+
},
|
|
1131
|
+
{
|
|
1132
|
+
key: "classified-keeps-meetup-city",
|
|
1133
|
+
label: "A classified listing still has its meetup city after saving",
|
|
1134
|
+
description: "Regression test for CONFIRMED silent data loss found 2026-08-24: the product create schema stripped every key it did not name, and it named NONE of the classified / digital-code / live-item / prize-draw fields. A seller filled them in, pressed Publish, saw a success — and the fields were dropped before the write. Create a classified with a meetup city and contact method, save, then reopen it: both must still be there.",
|
|
1135
|
+
href: "/store/classified/new",
|
|
1136
|
+
},
|
|
1137
|
+
{
|
|
1138
|
+
key: "live-item-keeps-species-and-cites",
|
|
1139
|
+
label: "A live-item listing keeps its species, transport method, permitted jurisdictions and CITES reference",
|
|
1140
|
+
description: "Same bug. Jurisdiction is the one that matters most — shipping a live animal into a territory that forbids it is exactly what that field exists to prevent, and it was being discarded.",
|
|
1141
|
+
href: "/store/live/new",
|
|
1142
|
+
},
|
|
1143
|
+
{
|
|
1144
|
+
key: "digital-code-keeps-delivery-method",
|
|
1145
|
+
label: "A digital-code listing keeps its delivery method and pool size",
|
|
1146
|
+
href: "/store/digital-codes/new",
|
|
1147
|
+
},
|
|
1148
|
+
{
|
|
1149
|
+
key: "prize-draw-keeps-entry-price",
|
|
1150
|
+
label: "A prize draw keeps its price per entry and maximum entries",
|
|
1151
|
+
href: "/store/prize-draws/new",
|
|
1152
|
+
},
|
|
1153
|
+
{
|
|
1154
|
+
key: "per-type-fields-survive-EDIT-too",
|
|
1155
|
+
label: "Editing a classified's TITLE does not wipe its meetup city",
|
|
1156
|
+
description: "The fix had to cover the update path as well as create — a create-only fix would mean the listing saved correctly and then lost its per-type block the first time anyone edited anything else (Root Cause #39).",
|
|
1157
|
+
href: "/store/classified",
|
|
1158
|
+
},
|
|
1159
|
+
{
|
|
1160
|
+
key: "address-routes-normalised",
|
|
1161
|
+
label: "Adding and editing an address works, and the OLD urls still resolve",
|
|
1162
|
+
description: "/user/addresses/add and /user/addresses/edit/[id] were the only two non-standard route shapes in the app; every other entity uses /new and /[id]/edit. Both old paths are kept as redirects, so a bookmark still works. Check the buttons on the addresses page, then visit /user/addresses/add directly and confirm it lands on /user/addresses/new.",
|
|
1163
|
+
href: "/user/addresses",
|
|
1164
|
+
},
|
|
1165
|
+
{
|
|
1166
|
+
key: "custom-role-rejects-fake-permissions",
|
|
1167
|
+
label: "A custom role cannot be saved with a permission this system does not define",
|
|
1168
|
+
description: "Regression test for a real gap found 2026-08-24: both the create and update routes spread the raw request body into Firestore with NO validation, and neither page had a schema. Enter \"admin:widgets:frobnicate\" in the permissions box — it should be refused and NAMED. A permission outside the catalogue never matches anything, so the role would have read as configured and granted nothing.",
|
|
1169
|
+
href: "/admin/roles/new",
|
|
1170
|
+
},
|
|
1171
|
+
{
|
|
1172
|
+
key: "custom-role-edit-does-not-rewrite-creator",
|
|
1173
|
+
label: "Editing a role does not change who created it",
|
|
1174
|
+
description: "The edit page used to PATCH the whole loaded document — id, createdAt, createdBy and slug included — so any save re-attributed the privilege grant and could change the role's stable identifier. Edit a role, save, and confirm its creator and slug are unchanged.",
|
|
1175
|
+
href: "/admin/roles",
|
|
1176
|
+
},
|
|
1177
|
+
{
|
|
1178
|
+
key: "custom-role-rejects-empty",
|
|
1179
|
+
label: "A role with no name cannot be created",
|
|
1180
|
+
href: "/admin/roles/new",
|
|
1181
|
+
},
|
|
1182
|
+
{
|
|
1183
|
+
key: "bid-row-opens-in-all-three-portals",
|
|
1184
|
+
label: "A bid can be OPENED, not just seen — as a buyer, as a seller, and as an admin",
|
|
1185
|
+
description: "All three bid listings were dead ends: a row could be seen and never opened, so the amount, auction, timing and outcome existed only as a table row. Open one from /user/bids, /store/bids and /admin/bids and confirm each shows the auction, amount, when it was placed and its status.",
|
|
1186
|
+
href: "/user/bids",
|
|
1187
|
+
},
|
|
1188
|
+
{
|
|
1189
|
+
key: "bid-detail-hides-bidder-from-buyer",
|
|
1190
|
+
label: "A buyer's own bid detail does NOT show a bidder name; the seller and admin views DO",
|
|
1191
|
+
description: "One shared field builder serves all three portals, gated on the viewer's role — so a copy-paste cannot start showing one buyer another's identity.",
|
|
1192
|
+
href: "/user/bids",
|
|
1193
|
+
},
|
|
1194
|
+
{
|
|
1195
|
+
key: "admin-bid-view-before-cancel",
|
|
1196
|
+
label: "The admin bid row menu offers View before Cancel",
|
|
1197
|
+
description: "It previously offered ONLY Cancel — a destructive action on a record the admin had never been able to read. A menu of pure mutations is not a detail affordance (Root Cause #56).",
|
|
1198
|
+
href: "/admin/bids",
|
|
1199
|
+
},
|
|
1200
|
+
{
|
|
1201
|
+
key: "bid-row-keyboard-reachable",
|
|
1202
|
+
label: "A bid row can be opened with the keyboard, and public bid history rows still cannot",
|
|
1203
|
+
description: "Rows are only focusable when they are actually interactive. On an auction's PUBLIC bid history the same table renders with no row handler, so those rows must not be tab stops.",
|
|
1204
|
+
href: "/user/bids",
|
|
1205
|
+
},
|
|
1206
|
+
{
|
|
1207
|
+
key: "listing-template-edit-page-works",
|
|
1208
|
+
label: "Editing a listing template loads, saves and deletes — the page is not a 404",
|
|
1209
|
+
description: "Regression test for a real bug found 2026-08-24: /api/store/listing-templates/[id] did not exist, while the constant, the edit page's three calls (GET on load, PATCH on save, DELETE) and the list page's Edit button all did. Clicking Edit gave a page that 404'd on load, on save and on delete. Open a template from the list, change its name, save, reopen.",
|
|
1210
|
+
href: "/store/listing-templates",
|
|
1211
|
+
},
|
|
1212
|
+
{
|
|
1213
|
+
key: "listing-template-not-editable-across-stores",
|
|
1214
|
+
label: "One seller cannot open another seller's listing template by URL",
|
|
1215
|
+
description: "The new route checks the template's storeId against the caller's own store and returns \"not found\" (deliberately not \"forbidden\", which would confirm the id exists).",
|
|
1216
|
+
href: "/store/listing-templates",
|
|
1217
|
+
},
|
|
1218
|
+
{
|
|
1219
|
+
key: "payout-method-rejects-blank-bank-details",
|
|
1220
|
+
label: "A BANK payout method cannot be saved with a blank account number, IFSC or holder name",
|
|
1221
|
+
description: "This was validated at ZERO layers: the fields were bare inputs with no `required` and no pattern, the page's onSave checked nothing, and both the POST and PATCH routes wrote the raw request body straight into Firestore. An empty bank payout method saved cleanly and only failed at payout time. Select Bank account, leave the fields blank, save — each should be refused on the field itself.",
|
|
1222
|
+
href: "/store/payout-methods/new",
|
|
1223
|
+
},
|
|
1224
|
+
{
|
|
1225
|
+
key: "payout-method-rejects-bad-ifsc",
|
|
1226
|
+
label: "An IFSC code of the wrong shape is refused",
|
|
1227
|
+
description: "Enter \"ABC123\" as the IFSC. It should be refused inline with the expected format, matching the rule Payout Settings already enforces. Then check a UPI method rejects a VPA with no @.",
|
|
1228
|
+
href: "/store/payout-methods/new",
|
|
1229
|
+
},
|
|
1230
|
+
{
|
|
1231
|
+
key: "shipping-config-rejects-rateless-rule",
|
|
1232
|
+
label: "A \"flat\" shipping rule with no flat rate is refused, and a negative rate is refused",
|
|
1233
|
+
description: "Both the page and the route used to accept anything — the route spread the raw body into Firestore, so a rate of \"abc\" or a negative free-above threshold was persisted verbatim.",
|
|
1234
|
+
href: "/store/shipping-configs/new",
|
|
1235
|
+
},
|
|
1236
|
+
{
|
|
1237
|
+
key: "grouped-listing-count-not-caller-settable",
|
|
1238
|
+
label: "A grouped listing's member count always matches its member list",
|
|
1239
|
+
description: "activeMemberCount is derived from productIds.length by the route and is no longer accepted from the request body — it is what the public visibility check reads, so a caller-supplied count could have hidden or shown a group incorrectly.",
|
|
1240
|
+
href: "/store/grouped-listings",
|
|
1241
|
+
},
|
|
1242
|
+
{
|
|
1243
|
+
key: "store-feature-new-actually-creates",
|
|
1244
|
+
label: "Creating a store feature badge from /store/features/new actually creates it",
|
|
1245
|
+
description: "Regression test for a real bug found 2026-08-24: that page collected a single Label, validated it was non-empty, then navigated back to the list WITHOUT calling any API — the badge was silently discarded and the seller saw a normal success flow. It now renders the real editor, so all ten fields are present and the badge appears in the list afterwards.",
|
|
1246
|
+
href: "/store/features/new",
|
|
1247
|
+
},
|
|
1248
|
+
{
|
|
1249
|
+
key: "store-feature-edit-page-exists",
|
|
1250
|
+
label: "A store feature badge can be edited on its own page, not only in a drawer",
|
|
1251
|
+
description: "ROUTES.STORE.FEATURES_EDIT pointed at /store/features/[id]/edit with no page behind it and no caller anywhere — a dead route key. Open a badge's edit page directly by URL and confirm it loads with the badge's current values.",
|
|
1252
|
+
href: "/store/features",
|
|
1253
|
+
},
|
|
1254
|
+
{
|
|
1255
|
+
key: "feature-editor-validates",
|
|
1256
|
+
label: "The feature badge editor reports what is wrong instead of just disabling Save",
|
|
1257
|
+
description: "It had NO validation: ten fields, `required` on the inputs (an HTML attribute a programmatic submit bypasses), and nothing else — max lengths, display-order bounds and the product-types minimum were never checked. Submit with an over-long label, or a store-scoped badge with no store selected, and confirm the error appears on the field itself.",
|
|
1258
|
+
href: "/admin/features/new",
|
|
1259
|
+
},
|
|
1260
|
+
{
|
|
1261
|
+
key: "store-category-rejects-empty",
|
|
1262
|
+
label: "A storefront category with no label cannot be created",
|
|
1263
|
+
description: "Both the form AND the route used to accept anything — the page had raw inputs with no validation and the API spread the request body straight into Firestore, so a completely empty category could be saved. They now share one schema. Confirm an empty Label is refused inline, not by a generic \"Save failed\" toast.",
|
|
1264
|
+
href: "/store/categories/new",
|
|
1265
|
+
},
|
|
1266
|
+
{
|
|
1267
|
+
key: "blog-editor-sections-not-steps",
|
|
1268
|
+
label: "The blog editor shows every field at once in collapsible sections — not a 4-step wizard that blocks step 2",
|
|
1269
|
+
description: "Open any post. Content / Media / SEO & Tags / Publish should all be reachable immediately, with ONE Save button at the bottom. Previously a missing title blocked access to every later step, so a post could become uneditable because of a field on page 1.",
|
|
1270
|
+
href: "/admin/blog",
|
|
1271
|
+
},
|
|
1272
|
+
{
|
|
1273
|
+
key: "blog-existing-post-slug-is-valid",
|
|
1274
|
+
label: "Opening an EXISTING blog post shows no error on the Slug field",
|
|
1275
|
+
description: "Regression test for a real bug found 2026-08-24: the form required slugs to start with `blog-`, but all 20 stored posts hold the bare slug (the `blog-` prefix is on the document ID, not the slug field, and the public URL uses the bare form). Every existing post therefore opened with an invalid Slug, and correcting it to satisfy the rule would have changed the stored slug and 404'd the live URL.",
|
|
1276
|
+
href: "/admin/blog",
|
|
1277
|
+
},
|
|
1278
|
+
{
|
|
1279
|
+
key: "blog-new-post-url-matches-existing",
|
|
1280
|
+
label: "A newly created post's public URL has the same shape as an existing post's — no doubled `blog-` segment",
|
|
1281
|
+
description: "Create a post titled \"Test Slug Shape\", save, then open it publicly. The URL should read /blog/test-slug-shape, matching every seeded post.",
|
|
1282
|
+
href: "/admin/blog/new",
|
|
1283
|
+
},
|
|
1284
|
+
{
|
|
1285
|
+
key: "blog-readtime-updates-on-edit",
|
|
1286
|
+
label: "Editing a post's body updates its \"N min read\" estimate",
|
|
1287
|
+
description: "It used to be computed on create only, so the estimate froze at whatever the first draft was (Root Cause #39 — a CREATE transform with no UPDATE counterpart). Add several paragraphs to an existing post, save, and confirm the read time grows.",
|
|
1288
|
+
href: "/admin/blog",
|
|
1289
|
+
},
|
|
1290
|
+
{
|
|
1291
|
+
key: "blog-error-summary-jumps-to-section",
|
|
1292
|
+
label: "Clearing the title shows an error summary whose link OPENS the right section and focuses the field",
|
|
1293
|
+
description: "The jump was dead before this work — the section list was hardcoded empty in both context paths, so the summary's link resolved to nothing for every form in the app.",
|
|
1294
|
+
href: "/admin/blog",
|
|
1295
|
+
},
|
|
1296
|
+
{
|
|
1297
|
+
key: "blog-media-survives-collapse",
|
|
1298
|
+
label: "Collapsing the Media section mid-upload does NOT cancel the upload",
|
|
1299
|
+
description: "Collapsible panels unmount their children by default, which discards an in-flight transfer. The Media section is explicitly kept mounted.",
|
|
1300
|
+
href: "/admin/blog",
|
|
1301
|
+
},
|
|
1302
|
+
{
|
|
1303
|
+
key: "event-editor-sections-not-steps",
|
|
1304
|
+
label: "The event editor shows Details / Media / Settings / Raffle as sections, all reachable at once",
|
|
1305
|
+
description: "The old wizard gated Settings behind Details validating, so a missing end date made a poll's options unreachable. Also confirm the per-type rules still surface inline: an Offer event with no coupon, and a Poll with fewer than 2 options, should each show an error on the field itself rather than a step-blocking banner.",
|
|
1306
|
+
href: "/admin/events",
|
|
1307
|
+
},
|
|
1308
|
+
{
|
|
1309
|
+
key: "offer-history-timeline-renders",
|
|
1310
|
+
label: "An offer shows a timeline of every phase it went through, each stamped with who did it and when",
|
|
1311
|
+
description: "Open any offer on My Offers and expand its history. Offer made / countered / accepted / paid should each appear with a real timestamp and a Buyer or Store tag. Before this existed, an offer showed only its current status — the negotiation that produced it was not merely un-displayed, it was destroyed: each counter created a brand-new unlinked document.",
|
|
1312
|
+
href: "/user/offers",
|
|
1313
|
+
},
|
|
1314
|
+
{
|
|
1315
|
+
key: "offer-history-legacy-no-fabricated-date",
|
|
1316
|
+
label: "An offer with NO recorded history still renders a timeline, and its Expired step shows an em-dash rather than a made-up date",
|
|
1317
|
+
description: "Open the X Wizard Arrow expired offer — it is seeded deliberately without statusHistory, which is the exact shape of every offer written before this feature. Its timeline must still render, and the Expired step must show a dash, not a date. A date there would be fabricated: expireMany never wrote one, updatedAt means \"last write of any kind\", and expiresAt is a deadline rather than an event.",
|
|
1318
|
+
href: "/admin/offers",
|
|
1319
|
+
},
|
|
1320
|
+
{
|
|
1321
|
+
key: "offer-chain-walks-three-rounds",
|
|
1322
|
+
label: "A three-round negotiation reads as ONE story, oldest first, with rounds 1 and 2 labelled Superseded — never Withdrawn",
|
|
1323
|
+
description: "Open the Metal Storm Pegasus offer in the admin list. All three rounds should appear on one rail under Round 1 / Round 2 / Round 3 dividers, each with its own note. The first two rounds are stored as withdrawn but carry supersededByOfferId, and must read neutral: the buyer did not walk away, they countered. Contrast the Driger V offer, a genuine walk-away, which reads Withdrawn.",
|
|
1324
|
+
href: "/admin/offers",
|
|
1325
|
+
},
|
|
1326
|
+
{
|
|
1327
|
+
key: "offer-detail-opens-on-fresh-data",
|
|
1328
|
+
label: "Opening an offer row fetches that offer, rather than showing whatever the list last cached",
|
|
1329
|
+
description: "Open an offer, close it, have the seller respond in another session, then reopen the same row — the panel should show the new state without a full page reload, and the chain should be present.",
|
|
1330
|
+
href: "/admin/offers",
|
|
1331
|
+
},
|
|
1332
|
+
{
|
|
1333
|
+
key: "admin-offer-cancel-requires-reason",
|
|
1334
|
+
label: "Admin Cancel opens a form demanding a reason — a short one is rejected inline, and a valid one reaches the buyer, the audit log AND the offer's own timeline",
|
|
1335
|
+
description: "Cancel an offer as an admin. Type fewer than 10 characters: it must be refused before submitting. Then give a real reason and confirm four things: the offer is cancelled, the buyer's locked cart line is cleared (their whole cart is otherwise blocked by the offer lane), the buyer's notification quotes the reason, and the action appears in both /admin/audit-log and the offer's own timeline. Previously the route accepted a reason and never read it, so the buyer was told nothing.",
|
|
1336
|
+
href: "/admin/offers",
|
|
1337
|
+
},
|
|
1338
|
+
{
|
|
1339
|
+
key: "admin-cannot-accept-or-counter",
|
|
1340
|
+
label: "The admin row menu offers only View and Cancel — never Accept, Counter or Decline",
|
|
1341
|
+
description: "The store keeps sole authority over its own pricing; admin is a coordinator, and cancel is an escalation that is itself recorded. There should also be no bulk Cancel: one shared reason across a mixed selection is worse audit data than none.",
|
|
1342
|
+
href: "/admin/offers",
|
|
1343
|
+
},
|
|
1344
|
+
{
|
|
1345
|
+
key: "store-still-accepts",
|
|
1346
|
+
label: "The store can still Accept, Counter and Decline its own offers after the admin surface was added",
|
|
1347
|
+
href: "/store/offers",
|
|
1348
|
+
},
|
|
1119
1349
|
],
|
|
1120
1350
|
},
|
|
1121
1351
|
{
|
|
@@ -1243,6 +1473,42 @@ const rawTesterChecklistItems = [
|
|
|
1243
1473
|
{ key: "my-prize-draws", label: "\"My Prize Draw Entries\" shows accurate entries and outcomes", href: "/user/prize-draws" },
|
|
1244
1474
|
{ key: "my-digital-codes", label: "\"My Digital Codes\" shows purchased codes correctly", href: "/user/digital-codes" },
|
|
1245
1475
|
{ key: "my-offers", label: "\"My Offers\" list shows accurate offer history", href: "/user/offers" },
|
|
1476
|
+
{
|
|
1477
|
+
key: "order-timeline-shows-real-events",
|
|
1478
|
+
label: "An order's timeline shows the transitions that actually happened, each stamped with who made it",
|
|
1479
|
+
description: "Open a delivered order. Placed / confirmed / shipped with its tracking number / delivered should each carry a real timestamp and a Buyer, Store, Admin or System tag. This used to be synthesised from four scalar date fields, so any transition without a dedicated date column — a payment review, a re-upload request — was invisible.",
|
|
1480
|
+
href: "/user/orders",
|
|
1481
|
+
},
|
|
1482
|
+
{
|
|
1483
|
+
key: "order-partial-refund-in-timeline",
|
|
1484
|
+
label: "A PARTIAL refund appears on the order timeline with its amount and reason",
|
|
1485
|
+
description: "Open the X Knife Shinobi order. A partial refund changes no status field at all, so it can only reach the timeline as an explicit entry — if partial refunds are missing while full ones show, that is the bug.",
|
|
1486
|
+
href: "/user/orders",
|
|
1487
|
+
},
|
|
1488
|
+
{
|
|
1489
|
+
key: "order-auction-won-vs-bought-out",
|
|
1490
|
+
label: "A won auction and a bought-out auction are visibly DIFFERENT on the order, not both just \"auction\"",
|
|
1491
|
+
description: "Compare the Diablo Nemesis order (won at ₹6,200 against a real ladder) with the Spriggan Requiem order (bought out at ₹4,999 while the standing bid was ₹3,100). Both are orderType \"auction\" — only the provenance record separates them. Crucially the buyout must NOT report zero bids: a buyout is itself a real bid, and Buy Now is no longer gated on the auction having no bids.",
|
|
1492
|
+
href: "/user/orders",
|
|
1493
|
+
},
|
|
1494
|
+
{
|
|
1495
|
+
key: "order-offer-shows-what-was-saved",
|
|
1496
|
+
label: "An order placed from an accepted offer shows the offered amount against the asking price at the time",
|
|
1497
|
+
description: "The listing price can change afterwards, which is exactly why it is captured once at order time and never recomputed.",
|
|
1498
|
+
href: "/user/orders",
|
|
1499
|
+
},
|
|
1500
|
+
{
|
|
1501
|
+
key: "order-history-no-money-churn",
|
|
1502
|
+
label: "The order timeline shows status, payment and refund events only — NOT every coupon or add-on the buyer tried",
|
|
1503
|
+
description: "Deliberate: the final coupon and add-on state already lives on the order. Replaying pricing churn would bury the handful of transitions anyone actually reads.",
|
|
1504
|
+
href: "/user/orders",
|
|
1505
|
+
},
|
|
1506
|
+
{
|
|
1507
|
+
key: "order-history-carries-no-personal-data",
|
|
1508
|
+
label: "No timeline entry anywhere shows a buyer's name or email — only a role tag",
|
|
1509
|
+
description: "Security-relevant, not cosmetic. PII encryption does not descend into arrays, so a name written into an order or offer history would sit in the database in plain text and never be decrypted on the way out.",
|
|
1510
|
+
href: "/admin/orders",
|
|
1511
|
+
},
|
|
1246
1512
|
{
|
|
1247
1513
|
key: "my-returns",
|
|
1248
1514
|
label: "Requesting and viewing a return works",
|
|
@@ -2787,6 +3053,90 @@ const rawTesterChecklistItems = [
|
|
|
2787
3053
|
{ key: "support-tickets-triage-admin", label: "Admin can triage support tickets", href: "/admin/support-tickets" },
|
|
2788
3054
|
{ key: "item-requests-admin", label: "Admin can manage item requests", href: "/admin/item-requests" },
|
|
2789
3055
|
{ key: "reports-admin", label: "Admin reports queue works correctly", href: "/admin/reports" },
|
|
3056
|
+
{
|
|
3057
|
+
key: "moderation-reject-requires-reason",
|
|
3058
|
+
label: "Rejecting media in the moderation queue REFUSES an empty reason, with the error shown on the Reason field itself",
|
|
3059
|
+
description: "Fixed 2026-08-24 — all four review surfaces (the queue page's inline Reject and the detail page's Reject, on both moderation and reports) submitted an empty note happily, so media could be blocked with no record of why. Press Reject with the box empty: it must refuse inline, not toast, and not save. Check BOTH /admin/moderation and a single item's detail page — they used to be two separate copies of the same modal.",
|
|
3060
|
+
href: "/admin/moderation",
|
|
3061
|
+
},
|
|
3062
|
+
{
|
|
3063
|
+
key: "moderation-reject-keeps-note-on-failure",
|
|
3064
|
+
label: "If a reject fails to save, the modal STAYS OPEN with the typed reason intact",
|
|
3065
|
+
description: "The modal closed on any outcome before. A decision that did not save must not look like one that did — expect an error toast and the reason still in the box, not a closed modal.",
|
|
3066
|
+
href: "/admin/moderation",
|
|
3067
|
+
},
|
|
3068
|
+
{
|
|
3069
|
+
key: "report-dismiss-asks-why",
|
|
3070
|
+
label: "Dismissing a report ASKS for a reason instead of silently recording the word \"Dismissed\"",
|
|
3071
|
+
description: "Fixed 2026-08-24 — Dismiss used to send a hardcoded resolution of \"Dismissed\", which is the status restated rather than a reason, so a dismissed report carried no explanation for the reporter or the next admin. It now opens the same required-note modal that Action does.",
|
|
3072
|
+
href: "/admin/reports",
|
|
3073
|
+
},
|
|
3074
|
+
{
|
|
3075
|
+
key: "report-close-stores-a-real-date",
|
|
3076
|
+
label: "Actioning or dismissing a report records a resolved date that renders as a DATE, not as raw text",
|
|
3077
|
+
description: "Fixed 2026-08-24 — both report surfaces sent `resolvedAt: new Date()`, which JSON turns into a string, and the route spread it straight into a field the document declares as a Date. Seeded reports held real timestamps, so the collection carried two shapes for one field. The server stamps it now and the client cannot send it. Close a report, then confirm via the admin detail page that the resolved date is present and well-formed.",
|
|
3078
|
+
href: "/admin/reports",
|
|
3079
|
+
},
|
|
3080
|
+
{
|
|
3081
|
+
key: "report-status-rejects-unknown-values",
|
|
3082
|
+
label: "A report or moderation item cannot be moved to a status outside its real set",
|
|
3083
|
+
description: "Both PATCH routes previously spread the raw request body into Firestore with no schema, so any key and any status string could be written. Confirm the normal Take / Action / Dismiss and Approve / Reject flows still all work — that is what the tightening must not have broken.",
|
|
3084
|
+
href: "/admin/reports",
|
|
3085
|
+
},
|
|
3086
|
+
{
|
|
3087
|
+
key: "admin-tables-render-badges-not-text",
|
|
3088
|
+
label: "Admin list tables show a coloured STATUS BADGE, a thumbnail and formatted money — not raw text",
|
|
3089
|
+
description: "Fixed 2026-08-25 — `column-renderers.tsx` was promised by its own sibling's docstring and never written (it could not be: a .ts and .tsx of the same name both emit the same .js). Every column without a hand-written renderer fell back to String(value), so a price read `1499` and a date read as a raw ISO string. Check a few different admin lists.",
|
|
3090
|
+
href: "/admin/products",
|
|
3091
|
+
},
|
|
3092
|
+
{
|
|
3093
|
+
key: "admin-table-readable-on-phone",
|
|
3094
|
+
label: "An admin list is readable at phone width — it switches to the card/list view instead of squeezing a table",
|
|
3095
|
+
description: "Fixed 2026-08-25 — no column-level responsive behaviour existed at all (`TableColumn.hidden` was documented but no DataTable ever read it). Below md the table view is now suppressed entirely; from md up, low-priority columns (created/updated dates, ids, view counts) drop out progressively. Resize from 320px to 1400px and confirm columns reappear rather than the row wrapping.",
|
|
3096
|
+
href: "/admin/orders",
|
|
3097
|
+
},
|
|
3098
|
+
{
|
|
3099
|
+
key: "action-buttons-have-icons",
|
|
3100
|
+
label: "Buttons driven by the action registry show an icon beside their label",
|
|
3101
|
+
description: "Fixed 2026-08-25 — `ActionDef.iconKey` existed on the type, was set on 2 of 220 actions, and was rendered by nothing. All 220 now carry one and `<Button action={…}>` renders it. Spot-check a row action menu and a bulk action bar.",
|
|
3102
|
+
href: "/admin/products",
|
|
3103
|
+
},
|
|
3104
|
+
{
|
|
3105
|
+
key: "sold-flag-badge-readable",
|
|
3106
|
+
label: "The \"Sold\" flag chip on an admin product card is legible in BOTH light and dark themes",
|
|
3107
|
+
description: "Fixed 2026-08-25 — the flag list gave `isSold` two backgrounds and two inks on one element, so the painted colour was decided by stylesheet order rather than by the list. The identical bug was found on the scammer status badge the day before. Also check \"Promoted\", which was raw dual-theme purple.",
|
|
3108
|
+
href: "/admin/products",
|
|
3109
|
+
},
|
|
3110
|
+
{
|
|
3111
|
+
key: "homepage-section-all-types-creatable",
|
|
3112
|
+
label: "EVERY section type in the New Section dropdown can actually be created — especially Featured Bundles, Prize Draws, Event Raffles and Collection Cards",
|
|
3113
|
+
description: "Fixed 2026-08-24 — the create route validated `type` against a hand-written list of 21 values while the union (and the dropdown) had 25. Those four types could be chosen, configured in full through their own builders, and then failed with a 400 on Save. Walk the dropdown and create one of each of the four named types.",
|
|
3114
|
+
href: "/admin/sections",
|
|
3115
|
+
},
|
|
3116
|
+
{
|
|
3117
|
+
key: "analytics-alert-threshold-is-numeric",
|
|
3118
|
+
label: "An analytics alert refuses a non-numeric threshold and a zero/blank time window",
|
|
3119
|
+
description: "Fixed 2026-08-24 — the create route spread the raw body into Firestore, so a threshold typed as text was stored as text and the rule then compared strings (\"9\" > \"10\"). The alert saved, listed, and looked configured while never firing correctly. Confirm a normal numeric alert still saves.",
|
|
3120
|
+
href: "/store/analytics/alerts",
|
|
3121
|
+
},
|
|
3122
|
+
{
|
|
3123
|
+
key: "item-request-requires-title-and-description",
|
|
3124
|
+
label: "An item request cannot be submitted with an empty title or description",
|
|
3125
|
+
description: "Fixed 2026-08-24 — this route spread the raw body into Firestore, and its list GET is PUBLIC (unauthenticated), so an unvalidated write here was an unvalidated publish. Confirm a normal request still submits and appears in the open list.",
|
|
3126
|
+
href: "/item-requests",
|
|
3127
|
+
},
|
|
3128
|
+
{
|
|
3129
|
+
key: "report-submit-requires-detail",
|
|
3130
|
+
label: "Reporting a listing or store refuses an empty description and still files a normal report correctly",
|
|
3131
|
+
description: "Fixed 2026-08-24 — the submit route accepted any body, so a report naming nothing and describing nothing could reach the moderation queue, and a caller could set reviewer-owned fields (`assignedTo`, `resolution`, `resolvedAt`) on their own report.",
|
|
3132
|
+
href: "/admin/reports",
|
|
3133
|
+
},
|
|
3134
|
+
{
|
|
3135
|
+
key: "scammer-removed-badge-readable",
|
|
3136
|
+
label: "A scammer profile with status \"Removed\" shows a readable grey badge in BOTH the list and the detail drawer, in light and dark themes",
|
|
3137
|
+
description: "Fixed 2026-08-24 — two separate copies of the status-colour map both gave `removed` two backgrounds and two inks on the same element. Tailwind emits all four and stylesheet order decides the winner, so the painted colour was not what either map said. Both copies now come from one module. Check the badge reads \"Removed\" (not \"removed\") and is legible in both themes.",
|
|
3138
|
+
href: "/admin/scammers",
|
|
3139
|
+
},
|
|
2790
3140
|
{ key: "payment-methods-clusters-admin", label: "Admin can manage payment methods and payment-method clusters", href: "/admin/payment-methods" },
|
|
2791
3141
|
{ key: "catalogue-approvals-admin", label: "Admin can approve/reject personal catalogue submissions", href: "/admin/catalogue-approvals" },
|
|
2792
3142
|
{
|
|
@@ -29,7 +29,7 @@ export declare function useWishlistWithGuest(userId: string | null | undefined,
|
|
|
29
29
|
productPrice: number;
|
|
30
30
|
productSlug: string;
|
|
31
31
|
addedAt: string | undefined;
|
|
32
|
-
type: "
|
|
32
|
+
type: "category" | "store" | "classified" | "auction" | "digital-code" | "live" | "product" | "preorder";
|
|
33
33
|
}[];
|
|
34
34
|
total: number;
|
|
35
35
|
wishlistedIds: Set<string>;
|
package/dist/index.d.ts
CHANGED
|
@@ -493,7 +493,7 @@ export type { ResolvedUser } from "./security/index";
|
|
|
493
493
|
export type { RoleDefinition } from "./security/index";
|
|
494
494
|
export type { UserRole } from "./security/index";
|
|
495
495
|
export { AddressesRepository } from "./repositories/index";
|
|
496
|
-
export { type PayoutMethodType, type PayoutMethodDocument, PAYOUT_METHODS_COLLECTION, PAYOUT_METHOD_INDEXED_FIELDS, DEFAULT_PAYOUT_METHOD_DATA, type ShippingMethod as ShippingConfigMethod, type ShippingConfigDocument, SHIPPING_CONFIGS_COLLECTION, SHIPPING_CONFIG_INDEXED_FIELDS, DEFAULT_SHIPPING_CONFIG_DATA, type AnalyticsScope, type AnalyticsCardType, type AnalyticsCardDocument, ANALYTICS_CARDS_COLLECTION, ANALYTICS_CARD_INDEXED_FIELDS, DEFAULT_ANALYTICS_CARD_DATA, type AlertOperator, type AnalyticsAlertDocument, ANALYTICS_ALERTS_COLLECTION, ANALYTICS_ALERT_INDEXED_FIELDS, DEFAULT_ANALYTICS_ALERT_DATA, type StoreCategoryDocument, STORE_CATEGORIES_COLLECTION, STORE_CATEGORY_INDEXED_FIELDS, DEFAULT_STORE_CATEGORY_DATA, type ListingTemplateType, type ListingTemplateDocument, LISTING_TEMPLATES_COLLECTION, LISTING_TEMPLATE_INDEXED_FIELDS, DEFAULT_LISTING_TEMPLATE_DATA, type ModerationStatus, type ModerationMediaType, type ModerationQueueDocument, MODERATION_QUEUE_COLLECTION, MODERATION_QUEUE_INDEXED_FIELDS, DEFAULT_MODERATION_QUEUE_DATA, type ReportEntityType, type ReportStatus, type ReportReason, type ReportDocument, REPORTS_COLLECTION, REPORT_INDEXED_FIELDS, DEFAULT_REPORT_DATA, type AdminNotificationCategory, type AdminNotificationDocument, ADMIN_NOTIFICATIONS_COLLECTION, ADMIN_NOTIFICATION_INDEXED_FIELDS, DEFAULT_ADMIN_NOTIFICATION_DATA, type ItemRequestStatus, type ItemRequestReply, type ItemRequestDocument, ITEM_REQUESTS_COLLECTION, ITEM_REQUEST_INDEXED_FIELDS, DEFAULT_ITEM_REQUEST_DATA, type StoreGoogleConfigDocument, STORE_GOOGLE_CONFIG_COLLECTION, STORE_GOOGLE_CONFIG_INDEXED_FIELDS, DEFAULT_STORE_GOOGLE_CONFIG_DATA, type StoreWhatsAppConfigDocument, STORE_WHATSAPP_CONFIG_COLLECTION, STORE_WHATSAPP_CONFIG_INDEXED_FIELDS, DEFAULT_STORE_WHATSAPP_CONFIG_DATA, type CustomRoleDocument, CUSTOM_ROLES_COLLECTION, CUSTOM_ROLE_INDEXED_FIELDS, DEFAULT_CUSTOM_ROLE_DATA, type RoleOverrideDocument, ROLE_OVERRIDES_COLLECTION, ROLE_OVERRIDE_INDEXED_FIELDS, DEFAULT_ROLE_OVERRIDE_DATA, PayoutMethodsRepository, ShippingConfigsRepository, AnalyticsCardsRepository, AnalyticsAlertsRepository, StoreCategoriesRepository, ListingTemplatesRepository, ModerationQueueRepository, ReportsRepository, AdminNotificationsRepository, ItemRequestsRepository, StoreGoogleConfigRepository, StoreWhatsAppConfigRepository, CustomRolesRepository, RoleOverridesRepository, payoutMethodsRepository, shippingConfigsRepository, analyticsCardsRepository, analyticsAlertsRepository, storeCategoriesRepository, listingTemplatesRepository, moderationQueueRepository, reportsRepository, adminNotificationsRepository, itemRequestsRepository, storeGoogleConfigRepository, storeWhatsAppConfigRepository, customRolesRepository, roleOverridesRepository, } from "./features/store-extensions/index";
|
|
496
|
+
export { type PayoutMethodType, type PayoutMethodDocument, PAYOUT_METHODS_COLLECTION, PAYOUT_METHOD_INDEXED_FIELDS, DEFAULT_PAYOUT_METHOD_DATA, type ShippingMethod as ShippingConfigMethod, type ShippingConfigDocument, SHIPPING_CONFIGS_COLLECTION, SHIPPING_CONFIG_INDEXED_FIELDS, DEFAULT_SHIPPING_CONFIG_DATA, type AnalyticsScope, type AnalyticsCardType, type AnalyticsCardDocument, ANALYTICS_CARDS_COLLECTION, ANALYTICS_CARD_INDEXED_FIELDS, DEFAULT_ANALYTICS_CARD_DATA, type AlertOperator, type AnalyticsAlertDocument, ANALYTICS_ALERTS_COLLECTION, ANALYTICS_ALERT_INDEXED_FIELDS, DEFAULT_ANALYTICS_ALERT_DATA, type StoreCategoryDocument, storeCategoryFormSchema, storeCategoryCreateSchema, type StoreCategoryFormValues, listingTemplateFormSchema, listingTemplateCreateSchema, listingTemplateUpdateSchema, type ListingTemplateFormValues, LISTING_TEMPLATE_TYPES, payoutMethodFormSchema, payoutMethodCreateSchema, payoutMethodUpdateSchema, type PayoutMethodFormValues, shippingConfigFormSchema, shippingConfigCreateSchema, shippingConfigUpdateSchema, type ShippingConfigFormValues, customRoleFormSchema, customRoleCreateSchema, customRoleUpdateSchema, isKnownPermission, type CustomRoleFormValues, moderationReviewFormSchema, moderationReviewUpdateSchema, MODERATION_REVIEWER_STATUSES, type ModerationReviewFormValues, reportReviewFormSchema, reportReviewUpdateSchema, REPORT_REVIEWER_STATUSES, REPORT_TERMINAL_STATUSES, type ReportReviewFormValues, reportCreateSchema, type ReportCreateValues, itemRequestCreateSchema, type ItemRequestCreateValues, REPORT_ENTITY_TYPES, REPORT_REASONS, analyticsAlertCreateSchema, type AnalyticsAlertCreateValues, analyticsCardCreateSchema, type AnalyticsCardCreateValues, ANALYTICS_ALERT_OPERATORS, ANALYTICS_CARD_TYPES, storeGoogleConfigUpdateSchema, type StoreGoogleConfigFormValues, toSellerGoogleConfig, type SellerGoogleConfig, adminNotificationCreateSchema, type AdminNotificationCreateValues, ADMIN_NOTIFICATION_CATEGORIES, ADMIN_NOTIFICATION_SEVERITIES, STORE_CATEGORIES_COLLECTION, STORE_CATEGORY_INDEXED_FIELDS, DEFAULT_STORE_CATEGORY_DATA, type ListingTemplateType, type ListingTemplateDocument, LISTING_TEMPLATES_COLLECTION, LISTING_TEMPLATE_INDEXED_FIELDS, DEFAULT_LISTING_TEMPLATE_DATA, type ModerationStatus, type ModerationMediaType, type ModerationQueueDocument, MODERATION_QUEUE_COLLECTION, MODERATION_QUEUE_INDEXED_FIELDS, DEFAULT_MODERATION_QUEUE_DATA, type ReportEntityType, type ReportStatus, type ReportReason, type ReportDocument, REPORTS_COLLECTION, REPORT_INDEXED_FIELDS, DEFAULT_REPORT_DATA, type AdminNotificationCategory, type AdminNotificationDocument, ADMIN_NOTIFICATIONS_COLLECTION, ADMIN_NOTIFICATION_INDEXED_FIELDS, DEFAULT_ADMIN_NOTIFICATION_DATA, type ItemRequestStatus, type ItemRequestReply, type ItemRequestDocument, ITEM_REQUESTS_COLLECTION, ITEM_REQUEST_INDEXED_FIELDS, DEFAULT_ITEM_REQUEST_DATA, type StoreGoogleConfigDocument, STORE_GOOGLE_CONFIG_COLLECTION, STORE_GOOGLE_CONFIG_INDEXED_FIELDS, DEFAULT_STORE_GOOGLE_CONFIG_DATA, type StoreWhatsAppConfigDocument, STORE_WHATSAPP_CONFIG_COLLECTION, STORE_WHATSAPP_CONFIG_INDEXED_FIELDS, DEFAULT_STORE_WHATSAPP_CONFIG_DATA, type CustomRoleDocument, CUSTOM_ROLES_COLLECTION, CUSTOM_ROLE_INDEXED_FIELDS, DEFAULT_CUSTOM_ROLE_DATA, type RoleOverrideDocument, ROLE_OVERRIDES_COLLECTION, ROLE_OVERRIDE_INDEXED_FIELDS, DEFAULT_ROLE_OVERRIDE_DATA, PayoutMethodsRepository, ShippingConfigsRepository, AnalyticsCardsRepository, AnalyticsAlertsRepository, StoreCategoriesRepository, ListingTemplatesRepository, ModerationQueueRepository, ReportsRepository, AdminNotificationsRepository, ItemRequestsRepository, StoreGoogleConfigRepository, StoreWhatsAppConfigRepository, CustomRolesRepository, RoleOverridesRepository, payoutMethodsRepository, shippingConfigsRepository, analyticsCardsRepository, analyticsAlertsRepository, storeCategoriesRepository, listingTemplatesRepository, moderationQueueRepository, reportsRepository, adminNotificationsRepository, itemRequestsRepository, storeGoogleConfigRepository, storeWhatsAppConfigRepository, customRolesRepository, roleOverridesRepository, } from "./features/store-extensions/index";
|
|
497
497
|
export { BaseRepository } from "./repositories/index";
|
|
498
498
|
export { BlogRepository } from "./repositories/index";
|
|
499
499
|
export { CartRepository } from "./repositories/index";
|
|
@@ -2240,6 +2240,10 @@ export type { OrderSiblingPaymentsProps } from "./features/orders/index";
|
|
|
2240
2240
|
export { OrderPaymentSummary } from "./features/orders/index";
|
|
2241
2241
|
export type { OrderPaymentSummaryProps } from "./features/orders/index";
|
|
2242
2242
|
export { OrderStatusTimeline } from "./features/orders/index";
|
|
2243
|
+
export { StatusTimeline, stepsFromEntries } from "./features/status-history/index";
|
|
2244
|
+
export type { StatusTimelineProps, TimelineEntry, TimelineStep } from "./features/status-history/index";
|
|
2245
|
+
export { OfferPhaseTimeline } from "./features/seller/components/OfferPhaseTimeline";
|
|
2246
|
+
export type { OfferPhaseTimelineProps, OfferChainRound } from "./features/seller/components/OfferPhaseTimeline";
|
|
2243
2247
|
export type { OrderStatusTimelineProps } from "./features/orders/index";
|
|
2244
2248
|
export type { OrderPaymentRecord, OrderPaymentRecordMethod, OrderPaymentVerificationMethod, } from "./features/orders/index";
|
|
2245
2249
|
export { RefundHistoryTable } from "./features/orders/index";
|
|
@@ -3030,6 +3034,10 @@ export { getWishlistForUser } from "./features/wishlist/server";
|
|
|
3030
3034
|
export { removeFromWishlist } from "./features/wishlist/server";
|
|
3031
3035
|
export type { EnrichedWishlistItem } from "./features/wishlist/server";
|
|
3032
3036
|
export { BANNER_HEIGHTS } from "./features/homepage/schemas/index";
|
|
3037
|
+
export { homepageSectionTypeSchema } from "./features/homepage/schemas/index";
|
|
3038
|
+
export { homepageSectionCreateSchema } from "./features/homepage/schemas/index";
|
|
3039
|
+
export { resolveNextSectionOrder } from "./features/homepage/actions/homepage-section-actions";
|
|
3040
|
+
export type { HomepageSectionCreateValues } from "./features/homepage/schemas/index";
|
|
3033
3041
|
export { CAROUSEL_SLIDES_COLLECTION } from "./features/homepage/schemas/index";
|
|
3034
3042
|
export { CAROUSEL_SLIDES_INDEXED_FIELDS } from "./features/homepage/schemas/index";
|
|
3035
3043
|
export { CAROUSEL_SLIDES_PUBLIC_FIELDS } from "./features/homepage/schemas/index";
|
|
@@ -3153,6 +3161,8 @@ export { BUNDLE_COPY, BUNDLE_STOCK_VARIANT, } from "./_internal/shared/features/
|
|
|
3153
3161
|
export { REFUND_COPY } from "./_internal/shared/features/orders/refund-copy";
|
|
3154
3162
|
export { bundleCreateSchema, bundleUpdateSchema, bundleQueryRuleSchema, bundleDisplaySchema, type BundleCreateBody, type BundleUpdateBody, } from "./_internal/shared/features/categories/bundle-schemas";
|
|
3155
3163
|
export type { GroupedListingDocument, GroupTheme, GroupVisibility } from "./features/grouped/schemas/firestore";
|
|
3164
|
+
export { navItemFormSchema, navItemCreateSchema, navItemUpdateSchema, type NavItemFormValues, } from "./features/admin/schemas/nav-item-form";
|
|
3165
|
+
export { groupedListingFormSchema, groupedListingCreateSchema, groupedListingUpdateSchema, type GroupedListingFormValues, } from "./features/grouped/schemas/grouped-listing-form";
|
|
3156
3166
|
export { scammersSeedData } from "./seed/index";
|
|
3157
3167
|
export { productFeaturesSeedData } from "./seed/index";
|
|
3158
3168
|
export { SCAMMER_COLLECTION, SCAMMER_ID_PREFIX, SCAMMER_MATCH_FIELDS, SCAMMER_INDEXED_FIELDS, SCAMMER_FIELDS, SCAMMER_INCIDENTS_SUBCOLLECTION, SCAMMER_COMMENTS_SUBCOLLECTION, SCAMMER_CONTESTS_SUBCOLLECTION, MAX_COMMENT_BODY_LENGTH, MAX_PENDING_SCAMMER_REPORTS_PER_USER, ScammerStatusValues, ScamPlatformValues, SocialPlatformValues, ContestTypeValues, ContestStatusValues, SCAM_PLATFORM_LABELS, SOCIAL_PLATFORM_LABELS, SCAMMER_STATUS_LABELS, CONTEST_TYPE_LABELS, CONTEST_STATUS_LABELS, DEFAULT_SCAMMER_DATA, DEFAULT_SCAMMER_INCIDENT_DATA, DEFAULT_SCAMMER_COMMENT_DATA, DEFAULT_SCAMMER_CONTEST_DATA, } from "./features/scams/schemas/firestore";
|
|
@@ -3267,7 +3277,7 @@ export { SellerDigitalCodesView } from "./features/seller/components/SellerDigit
|
|
|
3267
3277
|
export type { SellerDigitalCodesViewProps } from "./features/seller/components/SellerDigitalCodesView";
|
|
3268
3278
|
export { SellerLiveView } from "./features/seller/components/SellerLiveView";
|
|
3269
3279
|
export type { SellerLiveViewProps } from "./features/seller/components/SellerLiveView";
|
|
3270
|
-
export { SCHEMAS, lookupApiSchema, lookupFirestoreSchema, } from "./schemas/index";
|
|
3280
|
+
export { SCHEMAS, lookupApiSchema, lookupFormSchema, lookupFirestoreSchema, } from "./schemas/index";
|
|
3271
3281
|
export type { ApiRouteKey, ApiRouteSchema, FirestoreDocument, FirestoreValue, FormFieldValue, FormValues, HttpVerb, JsonArray, JsonObject, JsonObjectWithUndefined, JsonPrimitive, JsonValue, JsonValueWithUndefined, RegisteredApiRouteKey, RegisteredFirestoreCollection, RegisteredFormId, RegisteredRtdbChannel, RegisteredSieveCollection, RegisteredStorageOp, RegisteredWebhookProvider, RegistryEntry, SchemaRegistry, SchemasShape, WebhookSchemaBucket, } from "./schemas/index";
|
|
3272
3282
|
export { safeFireAndForget } from "./utils/safe-fire-forget";
|
|
3273
3283
|
export { withRetry } from "./http/retry";
|
package/dist/index.js
CHANGED
|
@@ -910,7 +910,7 @@ export { resolvePermissions } from "./security/index";
|
|
|
910
910
|
// AddressesRepository - unified top-level addresses collection (SB-UNI-A 2026-05-13).
|
|
911
911
|
export { AddressesRepository } from "./repositories/index";
|
|
912
912
|
// S-STORE foundation — 14 schemas + 14 repositories + RBAC.
|
|
913
|
-
export { PAYOUT_METHODS_COLLECTION, PAYOUT_METHOD_INDEXED_FIELDS, DEFAULT_PAYOUT_METHOD_DATA, SHIPPING_CONFIGS_COLLECTION, SHIPPING_CONFIG_INDEXED_FIELDS, DEFAULT_SHIPPING_CONFIG_DATA, ANALYTICS_CARDS_COLLECTION, ANALYTICS_CARD_INDEXED_FIELDS, DEFAULT_ANALYTICS_CARD_DATA, ANALYTICS_ALERTS_COLLECTION, ANALYTICS_ALERT_INDEXED_FIELDS, DEFAULT_ANALYTICS_ALERT_DATA, STORE_CATEGORIES_COLLECTION, STORE_CATEGORY_INDEXED_FIELDS, DEFAULT_STORE_CATEGORY_DATA, LISTING_TEMPLATES_COLLECTION, LISTING_TEMPLATE_INDEXED_FIELDS, DEFAULT_LISTING_TEMPLATE_DATA, MODERATION_QUEUE_COLLECTION, MODERATION_QUEUE_INDEXED_FIELDS, DEFAULT_MODERATION_QUEUE_DATA, REPORTS_COLLECTION, REPORT_INDEXED_FIELDS, DEFAULT_REPORT_DATA, ADMIN_NOTIFICATIONS_COLLECTION, ADMIN_NOTIFICATION_INDEXED_FIELDS, DEFAULT_ADMIN_NOTIFICATION_DATA, ITEM_REQUESTS_COLLECTION, ITEM_REQUEST_INDEXED_FIELDS, DEFAULT_ITEM_REQUEST_DATA, STORE_GOOGLE_CONFIG_COLLECTION, STORE_GOOGLE_CONFIG_INDEXED_FIELDS, DEFAULT_STORE_GOOGLE_CONFIG_DATA, STORE_WHATSAPP_CONFIG_COLLECTION, STORE_WHATSAPP_CONFIG_INDEXED_FIELDS, DEFAULT_STORE_WHATSAPP_CONFIG_DATA, CUSTOM_ROLES_COLLECTION, CUSTOM_ROLE_INDEXED_FIELDS, DEFAULT_CUSTOM_ROLE_DATA, ROLE_OVERRIDES_COLLECTION, ROLE_OVERRIDE_INDEXED_FIELDS, DEFAULT_ROLE_OVERRIDE_DATA,
|
|
913
|
+
export { PAYOUT_METHODS_COLLECTION, PAYOUT_METHOD_INDEXED_FIELDS, DEFAULT_PAYOUT_METHOD_DATA, SHIPPING_CONFIGS_COLLECTION, SHIPPING_CONFIG_INDEXED_FIELDS, DEFAULT_SHIPPING_CONFIG_DATA, ANALYTICS_CARDS_COLLECTION, ANALYTICS_CARD_INDEXED_FIELDS, DEFAULT_ANALYTICS_CARD_DATA, ANALYTICS_ALERTS_COLLECTION, ANALYTICS_ALERT_INDEXED_FIELDS, DEFAULT_ANALYTICS_ALERT_DATA, storeCategoryFormSchema, storeCategoryCreateSchema, listingTemplateFormSchema, listingTemplateCreateSchema, listingTemplateUpdateSchema, LISTING_TEMPLATE_TYPES, payoutMethodFormSchema, payoutMethodCreateSchema, payoutMethodUpdateSchema, shippingConfigFormSchema, shippingConfigCreateSchema, shippingConfigUpdateSchema, customRoleFormSchema, customRoleCreateSchema, customRoleUpdateSchema, isKnownPermission, moderationReviewFormSchema, moderationReviewUpdateSchema, MODERATION_REVIEWER_STATUSES, reportReviewFormSchema, reportReviewUpdateSchema, REPORT_REVIEWER_STATUSES, REPORT_TERMINAL_STATUSES, reportCreateSchema, itemRequestCreateSchema, REPORT_ENTITY_TYPES, REPORT_REASONS, analyticsAlertCreateSchema, analyticsCardCreateSchema, ANALYTICS_ALERT_OPERATORS, ANALYTICS_CARD_TYPES, storeGoogleConfigUpdateSchema, toSellerGoogleConfig, adminNotificationCreateSchema, ADMIN_NOTIFICATION_CATEGORIES, ADMIN_NOTIFICATION_SEVERITIES, STORE_CATEGORIES_COLLECTION, STORE_CATEGORY_INDEXED_FIELDS, DEFAULT_STORE_CATEGORY_DATA, LISTING_TEMPLATES_COLLECTION, LISTING_TEMPLATE_INDEXED_FIELDS, DEFAULT_LISTING_TEMPLATE_DATA, MODERATION_QUEUE_COLLECTION, MODERATION_QUEUE_INDEXED_FIELDS, DEFAULT_MODERATION_QUEUE_DATA, REPORTS_COLLECTION, REPORT_INDEXED_FIELDS, DEFAULT_REPORT_DATA, ADMIN_NOTIFICATIONS_COLLECTION, ADMIN_NOTIFICATION_INDEXED_FIELDS, DEFAULT_ADMIN_NOTIFICATION_DATA, ITEM_REQUESTS_COLLECTION, ITEM_REQUEST_INDEXED_FIELDS, DEFAULT_ITEM_REQUEST_DATA, STORE_GOOGLE_CONFIG_COLLECTION, STORE_GOOGLE_CONFIG_INDEXED_FIELDS, DEFAULT_STORE_GOOGLE_CONFIG_DATA, STORE_WHATSAPP_CONFIG_COLLECTION, STORE_WHATSAPP_CONFIG_INDEXED_FIELDS, DEFAULT_STORE_WHATSAPP_CONFIG_DATA, CUSTOM_ROLES_COLLECTION, CUSTOM_ROLE_INDEXED_FIELDS, DEFAULT_CUSTOM_ROLE_DATA, ROLE_OVERRIDES_COLLECTION, ROLE_OVERRIDE_INDEXED_FIELDS, DEFAULT_ROLE_OVERRIDE_DATA,
|
|
914
914
|
// Repositories — classes
|
|
915
915
|
PayoutMethodsRepository, ShippingConfigsRepository, AnalyticsCardsRepository, AnalyticsAlertsRepository, StoreCategoriesRepository, ListingTemplatesRepository, ModerationQueueRepository, ReportsRepository, AdminNotificationsRepository, ItemRequestsRepository, StoreGoogleConfigRepository, StoreWhatsAppConfigRepository, CustomRolesRepository, RoleOverridesRepository,
|
|
916
916
|
// Repositories — singletons
|
|
@@ -4104,6 +4104,11 @@ export { OrdersList } from "./features/orders/index";
|
|
|
4104
4104
|
export { OrderSiblingPayments } from "./features/orders/index";
|
|
4105
4105
|
export { OrderPaymentSummary } from "./features/orders/index";
|
|
4106
4106
|
export { OrderStatusTimeline } from "./features/orders/index";
|
|
4107
|
+
// [CLIENT] StatusTimeline — the ONE rail both orders and offers render.
|
|
4108
|
+
// Each feature supplies only its phase vocabulary; the never-fabricate-a-
|
|
4109
|
+
// timestamp rule and the dot/connector rail live in one place.
|
|
4110
|
+
export { StatusTimeline, stepsFromEntries } from "./features/status-history/index";
|
|
4111
|
+
export { OfferPhaseTimeline } from "./features/seller/components/OfferPhaseTimeline";
|
|
4107
4112
|
export { RefundHistoryTable } from "./features/orders/index";
|
|
4108
4113
|
export { RefundRequestView } from "./features/orders/index";
|
|
4109
4114
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
@@ -5411,6 +5416,9 @@ export { removeFromWishlist } from "./features/wishlist/server";
|
|
|
5411
5416
|
// [SCHEMA]-Schema / data-shape constant â€" Zod validator, default-value object, or Firestore collection/field name constant.
|
|
5412
5417
|
// BANNER_HEIGHTS - Constant used across modules.
|
|
5413
5418
|
export { BANNER_HEIGHTS } from "./features/homepage/schemas/index";
|
|
5419
|
+
export { homepageSectionTypeSchema } from "./features/homepage/schemas/index";
|
|
5420
|
+
export { homepageSectionCreateSchema } from "./features/homepage/schemas/index";
|
|
5421
|
+
export { resolveNextSectionOrder } from "./features/homepage/actions/homepage-section-actions";
|
|
5414
5422
|
// [SCHEMA]-Schema / data-shape constant â€" Zod validator, default-value object, or Firestore collection/field name constant.
|
|
5415
5423
|
// CAROUSEL_SLIDES_COLLECTION - Constant used across modules.
|
|
5416
5424
|
export { CAROUSEL_SLIDES_COLLECTION } from "./features/homepage/schemas/index";
|
|
@@ -5560,6 +5568,8 @@ export { BUNDLE_COPY, BUNDLE_STOCK_VARIANT, } from "./_internal/shared/features/
|
|
|
5560
5568
|
export { REFUND_COPY } from "./_internal/shared/features/orders/refund-copy";
|
|
5561
5569
|
// S-SBUNI-4 follow-up â€" shared admin bundle zod schemas.
|
|
5562
5570
|
export { bundleCreateSchema, bundleUpdateSchema, bundleQueryRuleSchema, bundleDisplaySchema, } from "./_internal/shared/features/categories/bundle-schemas";
|
|
5571
|
+
export { navItemFormSchema, navItemCreateSchema, navItemUpdateSchema, } from "./features/admin/schemas/nav-item-form";
|
|
5572
|
+
export { groupedListingFormSchema, groupedListingCreateSchema, groupedListingUpdateSchema, } from "./features/grouped/schemas/grouped-listing-form";
|
|
5563
5573
|
// Scam registry â€" seed data
|
|
5564
5574
|
export { scammersSeedData } from "./seed/index";
|
|
5565
5575
|
// Product features â€" seed data (FI2)
|
|
@@ -5669,7 +5679,7 @@ export { SellerLiveView } from "./features/seller/components/SellerLiveView";
|
|
|
5669
5679
|
// boundary (Firestore docs, API routes, forms, sieve, webhooks, RTDB, storage).
|
|
5670
5680
|
// Per-feature `schemas/index.ts` files register into the relevant bucket.
|
|
5671
5681
|
// Pure Zod, isomorphic — safe on both client and server.
|
|
5672
|
-
export { SCHEMAS, lookupApiSchema, lookupFirestoreSchema, } from "./schemas/index";
|
|
5682
|
+
export { SCHEMAS, lookupApiSchema, lookupFormSchema, lookupFirestoreSchema, } from "./schemas/index";
|
|
5673
5683
|
// ── Fire-and-forget safety wrapper ─────────────────────────────────────────
|
|
5674
5684
|
// Replaces .catch(console.error) for non-critical background operations.
|
|
5675
5685
|
export { safeFireAndForget } from "./utils/safe-fire-forget";
|
|
@@ -130,8 +130,15 @@ export declare const DEFAULT_ROUTE_MAP: {
|
|
|
130
130
|
readonly WISHLIST: "/wishlist";
|
|
131
131
|
readonly HISTORY: "/user/history";
|
|
132
132
|
readonly ADDRESSES: "/user/addresses";
|
|
133
|
-
|
|
133
|
+
/**
|
|
134
|
+
* Canonical shapes. `/add` and `/edit/[id]` were the only two
|
|
135
|
+
* non-standard route shapes in the codebase — every other entity uses
|
|
136
|
+
* `/new` and `/[id]/edit`. Both old paths still resolve, as redirects.
|
|
137
|
+
*/
|
|
138
|
+
readonly ADDRESSES_NEW: "/user/addresses/new";
|
|
134
139
|
readonly ADDRESSES_EDIT: (id: string) => string;
|
|
140
|
+
/** @deprecated Use ADDRESSES_NEW. Kept so existing links keep resolving. */
|
|
141
|
+
readonly ADDRESSES_ADD: "/user/addresses/new";
|
|
135
142
|
readonly ORDER_DETAIL: (id: string) => string;
|
|
136
143
|
readonly ORDER_CANCEL: (id: string) => string;
|
|
137
144
|
readonly ORDER_TRACK: (id: string) => string;
|
|
@@ -505,8 +512,15 @@ export declare const ROUTES: {
|
|
|
505
512
|
readonly WISHLIST: "/wishlist";
|
|
506
513
|
readonly HISTORY: "/user/history";
|
|
507
514
|
readonly ADDRESSES: "/user/addresses";
|
|
508
|
-
|
|
515
|
+
/**
|
|
516
|
+
* Canonical shapes. `/add` and `/edit/[id]` were the only two
|
|
517
|
+
* non-standard route shapes in the codebase — every other entity uses
|
|
518
|
+
* `/new` and `/[id]/edit`. Both old paths still resolve, as redirects.
|
|
519
|
+
*/
|
|
520
|
+
readonly ADDRESSES_NEW: "/user/addresses/new";
|
|
509
521
|
readonly ADDRESSES_EDIT: (id: string) => string;
|
|
522
|
+
/** @deprecated Use ADDRESSES_NEW. Kept so existing links keep resolving. */
|
|
523
|
+
readonly ADDRESSES_ADD: "/user/addresses/new";
|
|
510
524
|
readonly ORDER_DETAIL: (id: string) => string;
|
|
511
525
|
readonly ORDER_CANCEL: (id: string) => string;
|
|
512
526
|
readonly ORDER_TRACK: (id: string) => string;
|
|
@@ -134,8 +134,15 @@ export const DEFAULT_ROUTE_MAP = {
|
|
|
134
134
|
WISHLIST: "/wishlist",
|
|
135
135
|
HISTORY: "/user/history",
|
|
136
136
|
ADDRESSES: "/user/addresses",
|
|
137
|
-
|
|
138
|
-
|
|
137
|
+
/**
|
|
138
|
+
* Canonical shapes. `/add` and `/edit/[id]` were the only two
|
|
139
|
+
* non-standard route shapes in the codebase — every other entity uses
|
|
140
|
+
* `/new` and `/[id]/edit`. Both old paths still resolve, as redirects.
|
|
141
|
+
*/
|
|
142
|
+
ADDRESSES_NEW: "/user/addresses/new",
|
|
143
|
+
ADDRESSES_EDIT: (id) => `/user/addresses/${id}/edit`,
|
|
144
|
+
/** @deprecated Use ADDRESSES_NEW. Kept so existing links keep resolving. */
|
|
145
|
+
ADDRESSES_ADD: "/user/addresses/new",
|
|
139
146
|
ORDER_DETAIL: (id) => `/user/orders/view/${id}`,
|
|
140
147
|
ORDER_CANCEL: (id) => `/user/orders/${id}/cancel`,
|
|
141
148
|
ORDER_TRACK: (id) => `/user/orders/${id}/track`,
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { FirestoreValue } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Recursive, so `z.lazy` — the array and record arms reference the schema
|
|
5
|
+
* being defined. The explicit `z.ZodType<FirestoreValue>` annotation is
|
|
6
|
+
* required: TypeScript cannot infer the type of a self-referential const.
|
|
7
|
+
*/
|
|
8
|
+
export declare const firestoreValueSchema: z.ZodType<FirestoreValue>;
|