@mohasinac/appkit 4.1.1 → 4.2.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/client/features/maintenance/index.d.ts +2 -0
- package/dist/_internal/client/features/maintenance/index.js +1 -0
- package/dist/_internal/client/features/maintenance/views/CloudLogsListView.d.ts +9 -0
- package/dist/_internal/client/features/maintenance/views/CloudLogsListView.js +55 -0
- package/dist/_internal/server/features/auctions/index.d.ts +1 -1
- package/dist/_internal/server/features/auctions/index.js +1 -1
- package/dist/_internal/server/features/auctions/service.js +2 -2
- package/dist/_internal/server/features/checkout/actions.d.ts +15 -0
- package/dist/_internal/server/features/checkout/actions.js +245 -182
- package/dist/_internal/server/features/maintenance/cloud-logs-data.d.ts +50 -0
- package/dist/_internal/server/features/maintenance/cloud-logs-data.js +152 -0
- package/dist/_internal/server/functions/scheduled.d.ts +2 -1
- package/dist/_internal/server/functions/scheduled.js +9 -1
- package/dist/_internal/server/jobs/core/jobRunners.js +10 -0
- package/dist/_internal/server/jobs/core/newsletterExport.d.ts +15 -0
- package/dist/_internal/server/jobs/core/newsletterExport.js +43 -0
- package/dist/_internal/server/jobs/core/onOrderCreate.d.ts +4 -12
- package/dist/_internal/server/jobs/core/onOrderCreate.js +3 -3
- package/dist/_internal/server/jobs/core/onOrderStatusChange.d.ts +2 -0
- package/dist/_internal/server/jobs/core/onOrderStatusChange.js +1 -0
- package/dist/_internal/server/jobs/core/onProductWrite.js +14 -2
- package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +1 -0
- package/dist/_internal/server/jobs/core/pendingOrderTimeout.js +1 -0
- package/dist/_internal/server/jobs/core/revenueRollup.d.ts +13 -0
- package/dist/_internal/server/jobs/core/revenueRollup.js +22 -0
- package/dist/_internal/server/jobs/core/whatsappNotify.d.ts +35 -0
- package/dist/_internal/server/jobs/core/whatsappNotify.js +82 -0
- package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
- package/dist/_internal/server/jobs/handlers/index.js +1 -0
- package/dist/_internal/server/jobs/handlers/revenueRollup.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/revenueRollup.js +2 -0
- package/dist/_internal/shared/features/auctions/config.d.ts +1 -1
- package/dist/_internal/shared/features/auctions/config.js +1 -1
- package/dist/_internal/shared/features/auctions/schema.js +1 -1
- package/dist/_internal/shared/features/cart/schema.js +2 -2
- package/dist/_internal/shared/features/checkout/config.d.ts +7 -0
- package/dist/_internal/shared/features/checkout/config.js +7 -0
- package/dist/_internal/shared/features/events/schema.js +1 -1
- package/dist/_internal/shared/features/orders/schema.js +1 -1
- package/dist/_internal/shared/features/products/schema.js +3 -3
- package/dist/_internal/shared/features/promotions/schema.js +3 -3
- package/dist/_internal/shared/fees/calculator.d.ts +32 -7
- package/dist/_internal/shared/fees/calculator.js +25 -0
- package/dist/client.d.ts +4 -4
- package/dist/client.js +4 -2
- package/dist/constants/api-endpoints.d.ts +9 -6
- package/dist/constants/api-endpoints.js +3 -2
- package/dist/contracts/client-payment-gateway.d.ts +1 -2
- package/dist/features/about/components/AboutView.d.ts +6 -16
- package/dist/features/about/components/AboutView.js +3 -3
- package/dist/features/about/components/FeesView.js +18 -0
- package/dist/features/about/index.d.ts +2 -1
- package/dist/features/about/schemas/firestore.d.ts +47 -0
- package/dist/features/about/schemas/firestore.js +6 -0
- package/dist/features/about/schemas/index.d.ts +210 -0
- package/dist/features/about/schemas/index.js +45 -0
- package/dist/features/account/hooks/useProfile.js +3 -0
- package/dist/features/admin/actions/notification-actions.d.ts +4 -1
- package/dist/features/admin/actions/notification-actions.js +56 -10
- package/dist/features/admin/components/AdminAdsView.js +1 -1
- package/dist/features/admin/components/AdminCarouselGroupEditorView.d.ts +6 -0
- package/dist/features/admin/components/AdminCarouselGroupEditorView.js +50 -0
- package/dist/features/admin/components/AdminCartsView.js +16 -3
- package/dist/features/admin/components/AdminCouponEditorView.js +2 -2
- package/dist/features/admin/components/AdminCouponsView.js +14 -4
- package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -42
- package/dist/features/admin/components/AdminMediaView.js +1 -1
- package/dist/features/admin/components/AdminNewsletterView.js +42 -11
- package/dist/features/admin/components/AdminNotificationsView.js +31 -19
- package/dist/features/admin/components/AdminOrdersView.js +7 -0
- package/dist/features/admin/components/AdminPayoutsView.js +18 -3
- package/dist/features/admin/components/AdminProductsView.js +17 -2
- package/dist/features/admin/components/AdminReviewsView.js +16 -2
- package/dist/features/admin/components/AdminScammersView.js +7 -0
- package/dist/features/admin/components/AdminSectionsView.js +4 -0
- package/dist/features/admin/components/AdminSiteConfigGuideView.js +1 -1
- package/dist/features/admin/components/AdminSiteSettingsView.js +127 -8
- package/dist/features/admin/components/AdminStoreEditorView.d.ts +2 -1
- package/dist/features/admin/components/AdminStoreEditorView.js +4 -4
- package/dist/features/admin/components/AdminStoresView.js +1 -1
- package/dist/features/admin/components/AdminSupportTicketDetailView.js +23 -5
- package/dist/features/admin/components/AdminSupportTicketsView.js +20 -2
- package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +4 -1
- package/dist/features/admin/components/AdminTesterChecklistView.js +8 -0
- package/dist/features/admin/components/index.d.ts +2 -0
- package/dist/features/admin/components/index.js +1 -0
- package/dist/features/admin/constants/filter-tabs.d.ts +55 -41
- package/dist/features/admin/constants/filter-tabs.js +55 -27
- package/dist/features/admin/repository/analytics-rollup.repository.d.ts +25 -0
- package/dist/features/admin/repository/analytics-rollup.repository.js +31 -0
- package/dist/features/admin/repository/site-settings.repository.js +8 -1
- package/dist/features/admin/schemas/firestore.d.ts +46 -0
- package/dist/features/admin/schemas/firestore.js +62 -24
- package/dist/features/auctions/actions/bid-actions.js +1 -1
- package/dist/features/auctions/components/AuctionDetailPageView.js +2 -2
- package/dist/features/auctions/components/AuctionsListView.js +8 -1
- package/dist/features/auth/components/LoginForm.js +2 -2
- package/dist/features/auth/components/RegisterForm.js +2 -2
- package/dist/features/auth/permissions/constants.d.ts +16 -0
- package/dist/features/auth/permissions/constants.js +53 -0
- package/dist/features/auth/schemas/firestore.js +1 -0
- package/dist/features/blog/components/BlogFilters.js +1 -1
- package/dist/features/cart/schemas/firestore.d.ts +1 -1
- package/dist/features/categories/schemas/firestore.d.ts +1 -1
- package/dist/features/consultation/components/ConsultationForm.js +1 -1
- package/dist/features/events/components/EventFilters.js +2 -0
- package/dist/features/homepage/components/WelcomeSection.js +2 -2
- package/dist/features/layout/BackToTop.d.ts +9 -5
- package/dist/features/layout/BackToTop.js +17 -21
- package/dist/features/layout/TitleBarLayout.d.ts +2 -2
- package/dist/features/layout/TitleBarLayout.js +4 -4
- package/dist/features/media/AvatarUpload.js +7 -3
- package/dist/features/media/MediaVideo.js +1 -1
- package/dist/features/media/finalize.d.ts +9 -13
- package/dist/features/media/finalize.js +23 -74
- package/dist/features/media/server.d.ts +1 -1
- package/dist/features/media/server.js +1 -1
- package/dist/features/orders/actions/refund-actions.js +1 -0
- package/dist/features/orders/hooks/useOrders.js +16 -4
- package/dist/features/orders/schemas/firestore.d.ts +19 -5
- package/dist/features/payments/schemas/firestore.d.ts +2 -2
- package/dist/features/pre-orders/components/PreOrdersListView.js +7 -0
- package/dist/features/products/components/ArtStickersListView.js +5 -0
- package/dist/features/products/components/ProductDetailPageView.d.ts +7 -1
- package/dist/features/products/components/ProductForm.js +14 -1
- package/dist/features/products/components/ProductsIndexPageView.js +7 -0
- package/dist/features/products/constants/action-defs.d.ts +29 -3
- package/dist/features/products/constants/action-defs.js +77 -1
- package/dist/features/products/schemas/firestore.d.ts +1 -1
- package/dist/features/products/schemas/product-templates.d.ts +1 -1
- package/dist/features/products/types/index.d.ts +4 -0
- package/dist/features/scams/schemas/index.js +2 -2
- package/dist/features/search/components/Search.js +3 -3
- package/dist/features/seller/components/SellerAuctionsView.js +27 -2
- package/dist/features/seller/components/SellerOrdersView.js +2 -2
- package/dist/features/seller/components/SellerPayoutsView.js +24 -10
- package/dist/features/seller/components/SellerPreOrdersView.js +12 -4
- package/dist/features/seller/components/SellerPrizeDrawsView.js +23 -5
- package/dist/features/seller/components/SellerProductShell.d.ts +2 -0
- package/dist/features/seller/components/SellerProductShell.js +1 -1
- package/dist/features/seller/components/SellerProductsView.js +8 -6
- package/dist/features/seller/components/SellerReviewsView.js +27 -6
- package/dist/features/seller/components/index.d.ts +0 -2
- package/dist/features/seller/components/index.js +0 -1
- package/dist/features/stores/components/StoreListingsGuideView.js +2 -1
- package/dist/features/stores/components/StoreProductsView.js +1 -1
- package/dist/features/stores/schemas/firestore.d.ts +11 -0
- package/dist/features/stores/schemas/firestore.js +5 -0
- package/dist/features/stores/schemas/index.d.ts +2 -2
- package/dist/features/tester/actions/checklist-item-actions.d.ts +6 -0
- package/dist/features/tester/actions/checklist-item-actions.js +2 -0
- package/dist/features/tester/components/AdminTesterFeedbackIssuesView.js +13 -2
- package/dist/features/tester/components/AdminTesterFeedbackListView.js +2 -1
- package/dist/features/tester/components/AdminTesterFeedbackReportView.js +9 -5
- package/dist/features/tester/components/TesterHubView.js +34 -21
- package/dist/features/tester/repository/tester-checklist-item.repository.js +1 -0
- package/dist/features/tester/repository/tester-checklist-response.repository.d.ts +18 -4
- package/dist/features/tester/repository/tester-checklist-response.repository.js +43 -8
- package/dist/features/tester/schemas/firestore.d.ts +8 -3
- package/dist/features/tester/schemas/firestore.js +6 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +21 -9
- package/dist/features/tester/utils/phases.d.ts +31 -0
- package/dist/features/tester/utils/phases.js +46 -0
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +1 -1
- package/dist/features/whatsapp-bot/helpers/whatsapp.d.ts +10 -1
- package/dist/features/whatsapp-bot/helpers/whatsapp.js +47 -0
- package/dist/features/whatsapp-bot/types/index.d.ts +20 -1
- package/dist/features/wishlist/types/index.d.ts +3 -0
- package/dist/index.d.ts +15 -6
- package/dist/index.js +19 -9
- package/dist/next/components/NotFoundView.js +2 -1
- package/dist/next/routing/route-map.d.ts +6 -12
- package/dist/next/routing/route-map.js +3 -4
- package/dist/providers/db-firebase/admin.d.ts +1 -0
- package/dist/providers/db-firebase/admin.js +1 -1
- package/dist/repositories/index.d.ts +2 -0
- package/dist/repositories/index.js +1 -0
- package/dist/schemas/registry.d.ts +2 -2
- package/dist/seed/addresses-seed-data.js +18 -18
- package/dist/seed/bids-seed-data.js +4 -4
- package/dist/seed/blog-posts-seed-data.js +82 -82
- package/dist/seed/carousel-slides-seed-data.js +14 -10
- package/dist/seed/carousels-seed-data.js +3 -3
- package/dist/seed/cart-seed-data.js +92 -92
- package/dist/seed/claimed-coupons-seed-data.js +10 -10
- package/dist/seed/conversations-seed-data.js +75 -75
- package/dist/seed/coupon-usage-seed-data.js +12 -12
- package/dist/seed/coupons-seed-data.js +41 -41
- package/dist/seed/events-seed-data.js +105 -105
- package/dist/seed/grouped-listings-seed-data.d.ts +2 -137
- package/dist/seed/grouped-listings-seed-data.js +79 -143
- package/dist/seed/history-seed-data.js +38 -38
- package/dist/seed/homepage-sections-seed-data.js +9 -9
- package/dist/seed/notifications-seed-data.js +56 -56
- package/dist/seed/offers-seed-data.js +91 -91
- package/dist/seed/orders-seed-data.js +121 -106
- package/dist/seed/payouts-seed-data.js +42 -42
- package/dist/seed/products-auctions-seed-data.js +10 -2
- package/dist/seed/products-standard-seed-data.js +40 -8
- package/dist/seed/reviews-seed-data.js +42 -23
- package/dist/seed/scammers-seed-data.js +22 -22
- package/dist/seed/sessions-seed-data.js +7 -7
- package/dist/seed/shipments-seed-data.js +10 -10
- package/dist/seed/site-settings-seed-data.js +89 -0
- package/dist/seed/store-addresses-seed-data.js +2 -2
- package/dist/seed/store-extensions-seed-data.js +93 -93
- package/dist/seed/stores-seed-data.js +2 -0
- package/dist/seed/support-tickets-seed-data.js +47 -47
- package/dist/seed/users-seed-data.js +55 -89
- package/dist/seed/wishlists-seed-data.js +22 -22
- package/dist/server.d.ts +4 -3
- package/dist/server.js +7 -7
- package/dist/styles.css +1 -1
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/PageLoader.js +8 -3
- package/dist/ui/components/Select.d.ts +8 -1
- package/dist/ui/components/Select.js +2 -2
- package/dist/ui/components/SiteMark.d.ts +23 -0
- package/dist/ui/components/SiteMark.js +76 -0
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +1 -0
- package/dist/validation/schemas.d.ts +0 -2
- package/dist/validation/schemas.js +0 -2
- package/package.json +1 -1
- package/scripts/seed-cli.mjs +17 -15
|
@@ -16,6 +16,7 @@ import type { Auth } from "firebase-admin/auth";
|
|
|
16
16
|
import type { Firestore } from "firebase-admin/firestore";
|
|
17
17
|
import type { Storage } from "firebase-admin/storage";
|
|
18
18
|
import type { Database } from "firebase-admin/database";
|
|
19
|
+
export declare function parsePrivateKey(raw: string): string;
|
|
19
20
|
declare global {
|
|
20
21
|
var __mohasinac_firebase_admin_app__: App | null | undefined;
|
|
21
22
|
var __mohasinac_firebase_admin_auth__: Auth | null | undefined;
|
|
@@ -35,7 +35,7 @@ function loadDatabase() {
|
|
|
35
35
|
// OpenSSL 3 (Node 18+) rejects malformed PEM — ensure the key is normalised
|
|
36
36
|
// before passing it to `cert()`.
|
|
37
37
|
//
|
|
38
|
-
function parsePrivateKey(raw) {
|
|
38
|
+
export function parsePrivateKey(raw) {
|
|
39
39
|
return raw
|
|
40
40
|
.replace(/^/, "") // strip UTF-8 BOM (PowerShell pipe artefact)
|
|
41
41
|
.replace(/^["']|["']$/g, "") // strip optional surrounding quotes
|
|
@@ -17,6 +17,8 @@ export { bidRepository } from "../features/auctions/repository/bid.repository";
|
|
|
17
17
|
export { CartRepository, cartRepository, } from "../features/cart/repository/cart.repository";
|
|
18
18
|
export { StoreRepository, storeRepository, } from "../features/stores/repository/store.repository";
|
|
19
19
|
export { siteSettingsRepository } from "../features/admin/repository/site-settings.repository";
|
|
20
|
+
export { analyticsRollupRepository } from "../features/admin/repository/analytics-rollup.repository";
|
|
21
|
+
export type { AnalyticsRollupDocument } from "../features/admin/repository/analytics-rollup.repository";
|
|
20
22
|
export { notificationRepository } from "../features/admin/repository/notification.repository";
|
|
21
23
|
export { chatRepository } from "../features/admin/repository/chat.repository";
|
|
22
24
|
export { carouselRepository } from "../features/homepage/repository/carousel.repository";
|
|
@@ -24,6 +24,7 @@ export { StoreRepository, storeRepository, } from "../features/stores/repository
|
|
|
24
24
|
// SB-UNI-A 2026-05-13 — storeAddressRepository deleted. Use addressesRepository
|
|
25
25
|
// with ownerType:"store" instead.
|
|
26
26
|
export { siteSettingsRepository } from "../features/admin/repository/site-settings.repository";
|
|
27
|
+
export { analyticsRollupRepository } from "../features/admin/repository/analytics-rollup.repository";
|
|
27
28
|
export { notificationRepository } from "../features/admin/repository/notification.repository";
|
|
28
29
|
export { chatRepository } from "../features/admin/repository/chat.repository";
|
|
29
30
|
export { carouselRepository } from "../features/homepage/repository/carousel.repository";
|
|
@@ -3947,10 +3947,10 @@ export declare const SCHEMAS: {
|
|
|
3947
3947
|
shippingPolicy?: string | undefined;
|
|
3948
3948
|
isVacationMode?: boolean | undefined;
|
|
3949
3949
|
vacationMessage?: string | undefined;
|
|
3950
|
+
capabilities?: string[] | undefined;
|
|
3950
3951
|
vacationReturnDate?: string | Date | import("zod").objectOutputType<{
|
|
3951
3952
|
toDate: import("zod").ZodFunction<import("zod").ZodTuple<[], import("zod").ZodUnknown>, import("zod").ZodDate>;
|
|
3952
3953
|
}, import("zod").ZodTypeAny, "passthrough"> | undefined;
|
|
3953
|
-
capabilities?: string[] | undefined;
|
|
3954
3954
|
customCommissionRate?: number | undefined;
|
|
3955
3955
|
googleReviews?: {
|
|
3956
3956
|
enabled: boolean;
|
|
@@ -4032,10 +4032,10 @@ export declare const SCHEMAS: {
|
|
|
4032
4032
|
shippingPolicy?: string | undefined;
|
|
4033
4033
|
isVacationMode?: boolean | undefined;
|
|
4034
4034
|
vacationMessage?: string | undefined;
|
|
4035
|
+
capabilities?: string[] | undefined;
|
|
4035
4036
|
vacationReturnDate?: string | Date | import("zod").objectInputType<{
|
|
4036
4037
|
toDate: import("zod").ZodFunction<import("zod").ZodTuple<[], import("zod").ZodUnknown>, import("zod").ZodDate>;
|
|
4037
4038
|
}, import("zod").ZodTypeAny, "passthrough"> | undefined;
|
|
4038
|
-
capabilities?: string[] | undefined;
|
|
4039
4039
|
customCommissionRate?: number | undefined;
|
|
4040
4040
|
googleReviews?: {
|
|
4041
4041
|
enabled: boolean;
|
|
@@ -20,38 +20,38 @@
|
|
|
20
20
|
const NOW = new Date();
|
|
21
21
|
const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
|
|
22
22
|
const _rawAddressesSeedData = [
|
|
23
|
-
//
|
|
23
|
+
// Mock User 3 — Home
|
|
24
24
|
{
|
|
25
25
|
id: "addr-yugi-home",
|
|
26
26
|
ownerType: "user",
|
|
27
27
|
ownerId: "user-yugi-muto",
|
|
28
28
|
label: "Home",
|
|
29
|
-
fullName: "
|
|
29
|
+
fullName: "Mock User 3",
|
|
30
30
|
phone: "+91-99999-10001",
|
|
31
|
-
addressLine1: "123
|
|
32
|
-
addressLine2: "
|
|
33
|
-
city: "
|
|
34
|
-
state: "
|
|
35
|
-
postalCode: "
|
|
36
|
-
country: "
|
|
31
|
+
addressLine1: "123 Stadium Lane",
|
|
32
|
+
addressLine2: "Vijay Nagar",
|
|
33
|
+
city: "Indore",
|
|
34
|
+
state: "Madhya Pradesh",
|
|
35
|
+
postalCode: "452010",
|
|
36
|
+
country: "India",
|
|
37
37
|
isDefault: true,
|
|
38
38
|
createdAt: daysAgo(180),
|
|
39
39
|
updatedAt: daysAgo(1),
|
|
40
40
|
},
|
|
41
|
-
//
|
|
41
|
+
// Mock User 2 — Home
|
|
42
42
|
{
|
|
43
43
|
id: "addr-kaiba-mansion",
|
|
44
44
|
ownerType: "user",
|
|
45
45
|
ownerId: "user-seto-kaiba",
|
|
46
|
-
label: "
|
|
47
|
-
fullName: "
|
|
46
|
+
label: "Home",
|
|
47
|
+
fullName: "Mock User 2",
|
|
48
48
|
phone: "+91-99999-20001",
|
|
49
|
-
addressLine1: "1000
|
|
50
|
-
addressLine2: "
|
|
51
|
-
city: "
|
|
52
|
-
state: "
|
|
53
|
-
postalCode: "
|
|
54
|
-
country: "
|
|
49
|
+
addressLine1: "1000 Civil Lines Drive",
|
|
50
|
+
addressLine2: "Sitabuldi",
|
|
51
|
+
city: "Nagpur",
|
|
52
|
+
state: "Maharashtra",
|
|
53
|
+
postalCode: "440012",
|
|
54
|
+
country: "India",
|
|
55
55
|
isDefault: true,
|
|
56
56
|
createdAt: daysAgo(200),
|
|
57
57
|
updatedAt: daysAgo(10),
|
|
@@ -62,7 +62,7 @@ const _rawAddressesSeedData = [
|
|
|
62
62
|
ownerType: "user",
|
|
63
63
|
ownerId: "user-admin-letitrip",
|
|
64
64
|
label: "LetItRip HQ",
|
|
65
|
-
fullName: "
|
|
65
|
+
fullName: "Mock User 1",
|
|
66
66
|
phone: "+91-99999-30001",
|
|
67
67
|
addressLine1: "100 Collectibles Plaza",
|
|
68
68
|
addressLine2: "Mumbai Central",
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* auction-beyblade-metal-lightning-l-drago) — bid counts and final amounts match
|
|
6
6
|
* each auction's `bidCount`/`currentBid` fields exactly, so the product card's
|
|
7
7
|
* "N bids" summary and the detail page's bid-history list agree. Bidders: 3 buyer
|
|
8
|
-
* personas (
|
|
8
|
+
* personas (Mock User 11, Mock User 14, Mock User 9), never the store's own seller
|
|
9
9
|
* (user-tyson-blader owns store-beyblade-arena). Status: newest bid per auction is
|
|
10
10
|
* "active", the rest "outbid". Bid IDs: bid-{productSlug}-{userName}-{YYYYMMDD}-{rand6}.
|
|
11
11
|
*
|
|
@@ -28,9 +28,9 @@ const BIDDER_EMAILS = {
|
|
|
28
28
|
"user-ananya-collector": "ananya.patel@gmail.com",
|
|
29
29
|
};
|
|
30
30
|
const BIDDER_NAMES = {
|
|
31
|
-
"user-meera-bey": "
|
|
32
|
-
"user-rohit-collector": "
|
|
33
|
-
"user-ananya-collector": "
|
|
31
|
+
"user-meera-bey": "Mock User 11",
|
|
32
|
+
"user-rohit-collector": "Mock User 14",
|
|
33
|
+
"user-ananya-collector": "Mock User 9",
|
|
34
34
|
};
|
|
35
35
|
function withBidDefaults(b) {
|
|
36
36
|
return {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* WHY: Seeds 20 blog posts for LetItRip collectibles marketplace — content/SEO testing across all categories.
|
|
3
|
-
* WHAT: 17 published + 2 draft + 1 archived. Mix of
|
|
4
|
-
*
|
|
3
|
+
* WHAT: 17 published + 2 draft + 1 archived. Mix of Beyblade-specific, broader collectibles (Pokémon, Hot Wheels,
|
|
4
|
+
* Gundam, Funko), marketplace guides, and community stories.
|
|
5
5
|
*
|
|
6
6
|
* EXPORTS:
|
|
7
7
|
* blogPostsSeedData — Array of Partial<BlogPostDocument> for seed runner
|
|
@@ -19,67 +19,67 @@ const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
|
|
|
19
19
|
export const blogPostsSeedData = [
|
|
20
20
|
// ── GUIDES (6) ────────────────────────────────────────────────────────────
|
|
21
21
|
{
|
|
22
|
-
id: "blog-
|
|
23
|
-
title: "How to
|
|
24
|
-
slug: "
|
|
25
|
-
excerpt: "Learn the telltale signs that distinguish a genuine
|
|
26
|
-
content: `<h2>The
|
|
27
|
-
coverImage: { type: "image", url: seedExtMedia("https://
|
|
22
|
+
id: "blog-spot-genuine-takara-tomy-beyblade",
|
|
23
|
+
title: "How to Spot a Genuine Takara-Tomy Beyblade (vs. Counterfeit Clones)",
|
|
24
|
+
slug: "spot-genuine-takara-tomy-beyblade",
|
|
25
|
+
excerpt: "Learn the telltale signs that distinguish a genuine Takara-Tomy Beyblade from a cheap clone — from the laser-etched logo to the weight of the metal driver.",
|
|
26
|
+
content: `<h2>The Laser-Etched Logo</h2><p>Genuine Takara-Tomy Beyblades have a crisp, laser-etched "TAKARA TOMY" logo on the underside of the layer or base. Clones use a shallow, blurry stamp that smudges under a fingernail scratch test.</p><img src="${seedExtMedia("https://picsum.photos/seed/blog-content-image-genuine-beyblade-logo-1-20260101/1000/600")}" alt="Close-up of the genuine Takara-Tomy laser-etched logo" /><h2>Weight and Balance</h2><p>A genuine metal-fusion driver has a consistent, dense weight — clones often use lighter zinc alloy that feels noticeably hollow. Spin the beyblade on a flat glass surface: a genuine driver spins true with almost no wobble.</p><img src="${seedExtMedia("https://picsum.photos/seed/blog-content-image-genuine-beyblade-weight-2-20260101/1000/600")}" alt="Weighing a genuine metal-fusion driver on a digital scale" /><h2>Sticker Print Quality</h2><p>Compare the face-bolt sticker under bright light. Genuine stickers have sharp gradient printing and a slightly raised clear-coat finish. Clone stickers are flat-printed and peel at the edges within weeks.</p>`,
|
|
27
|
+
coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/blog-cover-genuine-beyblade-20260101/1200/630"), alt: "Genuine Takara-Tomy Beyblade close-up" },
|
|
28
28
|
category: "guides",
|
|
29
|
-
tags: ["
|
|
29
|
+
tags: ["authentication", "takara-tomy", "beyblade", "counterfeit"],
|
|
30
30
|
isFeatured: true,
|
|
31
31
|
status: "published",
|
|
32
32
|
publishedAt: daysAgo(30),
|
|
33
33
|
authorId: "user-admin-letitrip",
|
|
34
|
-
authorName: "
|
|
35
|
-
authorAvatar: seedExtMedia("https://
|
|
34
|
+
authorName: "Mock User 1",
|
|
35
|
+
authorAvatar: seedExtMedia("https://picsum.photos/seed/user-avatar-letitrip-admin-20260101/400/400"),
|
|
36
36
|
readTimeMinutes: 5,
|
|
37
37
|
views: 4200,
|
|
38
|
-
metaTitle: "How to
|
|
39
|
-
metaDescription: "Learn how to spot genuine
|
|
38
|
+
metaTitle: "How to Spot a Genuine Takara-Tomy Beyblade | LetItRip",
|
|
39
|
+
metaDescription: "Learn how to spot genuine Takara-Tomy Beyblades — laser-etched logos, driver weight, sticker quality, and more.",
|
|
40
40
|
createdAt: daysAgo(35),
|
|
41
41
|
updatedAt: daysAgo(30),
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
|
-
id: "blog-
|
|
45
|
-
title: "
|
|
46
|
-
slug: "
|
|
47
|
-
excerpt: "A head-to-head
|
|
48
|
-
content: `<h2>
|
|
49
|
-
coverImage: { type: "image", url: seedExtMedia("https://
|
|
44
|
+
id: "blog-sealed-vs-opened-beyblade-value",
|
|
45
|
+
title: "Sealed vs. Opened — How Condition Affects Beyblade Resale Value",
|
|
46
|
+
slug: "sealed-vs-opened-beyblade-value",
|
|
47
|
+
excerpt: "A head-to-head look at what actually moves the needle on Beyblade resale price — sealed box premiums, tip wear, and launcher grip condition.",
|
|
48
|
+
content: `<h2>Sealed Box — The Investment Grade</h2><p>A factory-sealed box with an unbroken shrink-wrap seal commands the highest resale premiums, especially for discontinued original-series and Metal Fight releases. Collectors treat sealed stock the way trading-card collectors treat unopened booster boxes.</p><img src="${seedExtMedia("https://picsum.photos/seed/blog-content-image-sealed-beyblade-box-1-20260101/1000/600")}" alt="Factory-sealed Beyblade box with intact shrink wrap" /><h2>Tip Wear — The Sub-Grade That Matters</h2><p>For opened, battled beyblades, tip wear is the single biggest value factor. A sharp, unrounded tip with visible factory grooves grades far higher than a rounded, "sanded" tip from heavy stadium use.</p><h2>Launcher Grip Condition</h2><p>Ripcord launchers with clean, unfrayed grip tape and a tight ratchet mechanism add real value to a bundle. A stripped ratchet or fraying cord is an instant discount flag.</p><h2>Our Recommendation</h2><p>For investment: chase sealed, unopened stock. For a battle-ready collection: prioritize tip sharpness and launcher condition over cosmetic sticker wear.</p>`,
|
|
49
|
+
coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/blog-cover-sealed-vs-opened-beyblade-20260101/1200/630"), alt: "Sealed and opened Beyblade boxes side by side" },
|
|
50
50
|
category: "guides",
|
|
51
|
-
tags: ["
|
|
51
|
+
tags: ["condition", "sealed", "tip-wear", "beyblade", "investment"],
|
|
52
52
|
isFeatured: true,
|
|
53
53
|
status: "published",
|
|
54
54
|
publishedAt: daysAgo(25),
|
|
55
55
|
authorId: "user-admin-letitrip",
|
|
56
|
-
authorName: "
|
|
57
|
-
authorAvatar: seedExtMedia("https://
|
|
56
|
+
authorName: "Mock User 1",
|
|
57
|
+
authorAvatar: seedExtMedia("https://picsum.photos/seed/user-avatar-letitrip-admin-20260101/400/400"),
|
|
58
58
|
readTimeMinutes: 7,
|
|
59
59
|
views: 3800,
|
|
60
|
-
metaTitle: "
|
|
61
|
-
metaDescription: "
|
|
60
|
+
metaTitle: "Sealed vs. Opened — Beyblade Condition & Resale Value | LetItRip",
|
|
61
|
+
metaDescription: "What actually affects Beyblade resale value — sealed box premiums, tip wear grading, and launcher condition.",
|
|
62
62
|
createdAt: daysAgo(28),
|
|
63
63
|
updatedAt: daysAgo(25),
|
|
64
64
|
},
|
|
65
65
|
{
|
|
66
|
-
id: "blog-complete-
|
|
67
|
-
title: "Complete
|
|
68
|
-
slug: "complete-
|
|
69
|
-
excerpt: "Every
|
|
70
|
-
content: `<h2>The
|
|
71
|
-
coverImage: { type: "image", url: seedExtMedia("https://
|
|
66
|
+
id: "blog-complete-beyblade-x-series-guide",
|
|
67
|
+
title: "Complete Beyblade X Series Guide — Every Wave and Value",
|
|
68
|
+
slug: "complete-beyblade-x-series-guide",
|
|
69
|
+
excerpt: "Every Beyblade X wave released so far — from the BX-01 starter line to the latest BX-08 wave — with current market values.",
|
|
70
|
+
content: `<h2>The Starter Waves</h2><p>BX-01 through BX-04 introduced the core X-series parts — Blade, Ratchet, and Bit — replacing the old layer/disk/driver system entirely. Sealed starters from these early waves are already appreciating.</p><img src="${seedExtMedia("https://picsum.photos/seed/blog-content-image-beyblade-x-waves-1-20260101/1000/600")}" alt="Beyblade X starter wave lineup" /><h2>BX-05 through BX-08 (2025-2026)</h2><p>The current generation. Each piece in sealed condition ranges from ₹500-₹1,200. A complete wave set? Over ₹8,000.</p><h2>Later Waves</h2><p>Limited convention exclusives, gold-finish promos, and various starter-set reprints. Values range from ₹300 for common reprints to ₹5,000+ for rare promotional versions.</p>`,
|
|
71
|
+
coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/blog-cover-beyblade-x-guide-20260101/1200/630"), alt: "Beyblade X series wave lineup" },
|
|
72
72
|
category: "guides",
|
|
73
|
-
tags: ["
|
|
73
|
+
tags: ["beyblade-x", "guide", "waves", "values"],
|
|
74
74
|
isFeatured: false,
|
|
75
75
|
status: "draft",
|
|
76
76
|
authorId: "user-admin-letitrip",
|
|
77
|
-
authorName: "
|
|
78
|
-
authorAvatar: seedExtMedia("https://
|
|
77
|
+
authorName: "Mock User 1",
|
|
78
|
+
authorAvatar: seedExtMedia("https://picsum.photos/seed/user-avatar-letitrip-admin-20260101/400/400"),
|
|
79
79
|
readTimeMinutes: 10,
|
|
80
80
|
views: 0,
|
|
81
|
-
metaTitle: "Complete
|
|
82
|
-
metaDescription: "Every
|
|
81
|
+
metaTitle: "Complete Beyblade X Series Guide — Every Wave & Value | LetItRip",
|
|
82
|
+
metaDescription: "Every Beyblade X wave from BX-01 to the latest release — market values and collecting tips.",
|
|
83
83
|
createdAt: daysAgo(5),
|
|
84
84
|
updatedAt: daysAgo(2),
|
|
85
85
|
},
|
|
@@ -95,7 +95,7 @@ export const blogPostsSeedData = [
|
|
|
95
95
|
status: "published",
|
|
96
96
|
publishedAt: daysAgo(18),
|
|
97
97
|
authorId: "user-admin-letitrip",
|
|
98
|
-
authorName: "
|
|
98
|
+
authorName: "Mock User 1",
|
|
99
99
|
readTimeMinutes: 8,
|
|
100
100
|
views: 3100,
|
|
101
101
|
metaTitle: "Beginner's Guide to Hot Wheels Collecting | LetItRip",
|
|
@@ -116,7 +116,7 @@ export const blogPostsSeedData = [
|
|
|
116
116
|
status: "published",
|
|
117
117
|
publishedAt: daysAgo(12),
|
|
118
118
|
authorId: "user-admin-letitrip",
|
|
119
|
-
authorName: "
|
|
119
|
+
authorName: "Mock User 1",
|
|
120
120
|
readTimeMinutes: 7,
|
|
121
121
|
views: 2600,
|
|
122
122
|
metaTitle: "Gundam Model Kit Grades Explained | LetItRip",
|
|
@@ -136,7 +136,7 @@ export const blogPostsSeedData = [
|
|
|
136
136
|
status: "published",
|
|
137
137
|
publishedAt: daysAgo(8),
|
|
138
138
|
authorId: "user-admin-letitrip",
|
|
139
|
-
authorName: "
|
|
139
|
+
authorName: "Mock User 1",
|
|
140
140
|
readTimeMinutes: 6,
|
|
141
141
|
views: 1900,
|
|
142
142
|
metaTitle: "Beyblade X vs Burst Comparison | LetItRip",
|
|
@@ -146,24 +146,24 @@ export const blogPostsSeedData = [
|
|
|
146
146
|
},
|
|
147
147
|
// ── NEWS (4) ──────────────────────────────────────────────────────────────
|
|
148
148
|
{
|
|
149
|
-
id: "blog-top-10-
|
|
150
|
-
title: "Top 10 Most Valuable
|
|
151
|
-
slug: "top-10-
|
|
152
|
-
excerpt: "From the legendary
|
|
153
|
-
content: `<h2>1. Tournament
|
|
154
|
-
coverImage: { type: "image", url: seedExtMedia("https://
|
|
149
|
+
id: "blog-top-10-most-valuable-vintage-beyblades",
|
|
150
|
+
title: "Top 10 Most Valuable Vintage Beyblades",
|
|
151
|
+
slug: "top-10-most-valuable-vintage-beyblades",
|
|
152
|
+
excerpt: "From the legendary original-series Dragoon Storm to the elusive tournament-only L-Drago variants — these are the beyblades every collector dreams of.",
|
|
153
|
+
content: `<h2>1. Tournament-Exclusive Gold Dragoon (2000)</h2><p>The rarest original-series beyblade ever distributed. Only handed out at the Japan national finals. Estimated value: over ₹4 lakh.</p><img src="${seedExtMedia("https://picsum.photos/seed/blog-content-image-top10-tournament-gold-1-20260101/1000/600")}" alt="Tournament-exclusive gold Dragoon beyblade" /><h2>2. Beyblade Original Dragoon Storm, Sealed</h2><p>Tyson's signature spinner in sealed, factory condition. Sealed copies sell for ₹1.5-2.5 lakh.</p><h2>3. Beyblade Metal Lightning L-Drago, Sealed</h2><p>Kai's iconic rival spinner. A sealed Metal Lightning L-Drago commands ₹80,000-1.2 lakh.</p><h2>4. Complete Original-Series Starter Set (all 5 pieces, sealed)</h2><p>All five original-series starter beyblades still sealed — virtually impossible to assemble. Set value: over ₹6 lakh.</p><img src="${seedExtMedia("https://picsum.photos/seed/blog-content-image-top10-starter-set-2-20260101/1000/600")}" alt="Complete original-series Beyblade starter set" /><h2>5-10</h2><p>Metal Fusion Storm Pegasus (sealed), Metal Fight Flame Sagittario (sealed), Burst Valkyrie tournament promo, Burst Regalia Genesis limited run, original-series Dranzer S first-print, and Driger V arena-exclusive gold edition.</p>`,
|
|
154
|
+
coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/blog-cover-top10-vintage-beyblade-20260101/1200/630"), alt: "Vintage Beyblade collection" },
|
|
155
155
|
category: "news",
|
|
156
|
-
tags: ["top-10", "
|
|
156
|
+
tags: ["top-10", "vintage", "investment", "rare-beyblades"],
|
|
157
157
|
isFeatured: false,
|
|
158
158
|
status: "published",
|
|
159
159
|
publishedAt: daysAgo(20),
|
|
160
160
|
authorId: "user-admin-letitrip",
|
|
161
|
-
authorName: "
|
|
162
|
-
authorAvatar: seedExtMedia("https://
|
|
161
|
+
authorName: "Mock User 1",
|
|
162
|
+
authorAvatar: seedExtMedia("https://picsum.photos/seed/user-avatar-letitrip-admin-20260101/400/400"),
|
|
163
163
|
readTimeMinutes: 8,
|
|
164
164
|
views: 6100,
|
|
165
|
-
metaTitle: "Top 10 Most Valuable
|
|
166
|
-
metaDescription: "The 10 most expensive
|
|
165
|
+
metaTitle: "Top 10 Most Valuable Vintage Beyblades | LetItRip",
|
|
166
|
+
metaDescription: "The 10 most expensive vintage Beyblades from the original series to Metal Fight.",
|
|
167
167
|
createdAt: daysAgo(22),
|
|
168
168
|
updatedAt: daysAgo(20),
|
|
169
169
|
},
|
|
@@ -179,7 +179,7 @@ export const blogPostsSeedData = [
|
|
|
179
179
|
status: "published",
|
|
180
180
|
publishedAt: daysAgo(7),
|
|
181
181
|
authorId: "user-admin-letitrip",
|
|
182
|
-
authorName: "
|
|
182
|
+
authorName: "Mock User 1",
|
|
183
183
|
readTimeMinutes: 6,
|
|
184
184
|
views: 5200,
|
|
185
185
|
metaTitle: "Pokémon Prismatic Evolutions — Indian Collector Guide | LetItRip",
|
|
@@ -199,7 +199,7 @@ export const blogPostsSeedData = [
|
|
|
199
199
|
status: "published",
|
|
200
200
|
publishedAt: daysAgo(14),
|
|
201
201
|
authorId: "user-admin-letitrip",
|
|
202
|
-
authorName: "
|
|
202
|
+
authorName: "Mock User 1",
|
|
203
203
|
readTimeMinutes: 7,
|
|
204
204
|
views: 2400,
|
|
205
205
|
metaTitle: "Funko Pop Collecting in India 2026 | LetItRip",
|
|
@@ -219,7 +219,7 @@ export const blogPostsSeedData = [
|
|
|
219
219
|
status: "published",
|
|
220
220
|
publishedAt: daysAgo(22),
|
|
221
221
|
authorId: "user-admin-letitrip",
|
|
222
|
-
authorName: "
|
|
222
|
+
authorName: "Mock User 1",
|
|
223
223
|
readTimeMinutes: 6,
|
|
224
224
|
views: 1800,
|
|
225
225
|
metaTitle: "Tomica vs Hot Wheels — Diecast Battle in India | LetItRip",
|
|
@@ -229,24 +229,24 @@ export const blogPostsSeedData = [
|
|
|
229
229
|
},
|
|
230
230
|
// ── TIPS (4) ──────────────────────────────────────────────────────────────
|
|
231
231
|
{
|
|
232
|
-
id: "blog-
|
|
233
|
-
title: "
|
|
234
|
-
slug: "
|
|
235
|
-
excerpt: "The
|
|
236
|
-
content: `<h2>Why
|
|
237
|
-
coverImage: { type: "image", url: seedExtMedia("https://
|
|
232
|
+
id: "blog-metal-fight-hidden-gems",
|
|
233
|
+
title: "Metal Fight Hidden Gems: Undervalued Beyblades from the 2009-2012 Era",
|
|
234
|
+
slug: "metal-fight-hidden-gems",
|
|
235
|
+
excerpt: "The Metal Fight era produced some of the most undervalued beyblades in collecting history. Here are the picks smart collectors are buying now.",
|
|
236
|
+
content: `<h2>Why Metal Fight Beyblades Are Undervalued</h2><p>The Metal Fight era (2009-2012) coincided with peak Beyblade anime popularity but many collectors focus exclusively on the original 1999-2003 series. This creates a pricing gap.</p><img src="${seedExtMedia("https://picsum.photos/seed/blog-content-image-metal-fight-gems-1-20260101/1000/600")}" alt="Metal Fight era Beyblade lineup" /><h2>Metal Fight Picks</h2><p><strong>Metal Storm Pegasus</strong> — the fan-favorite protagonist spinner. Sealed copies are still affordable at ₹1,500-₹2,500.</p><p><strong>Metal Flame Sagittario</strong> — one of the most competitively impactful attack types ever. Sealed condition commands ₹3,500-₹5,000.</p><p><strong>Rare 4D System variants</strong> — low print run makes these a sleeper investment.</p>`,
|
|
237
|
+
coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/blog-cover-metal-fight-gems-20260101/1200/630"), alt: "Metal Fight Beyblade collection" },
|
|
238
238
|
category: "tips",
|
|
239
|
-
tags: ["
|
|
239
|
+
tags: ["metal-fight", "hidden-gems", "investment", "beyblade"],
|
|
240
240
|
isFeatured: false,
|
|
241
241
|
status: "published",
|
|
242
242
|
publishedAt: daysAgo(15),
|
|
243
243
|
authorId: "user-admin-letitrip",
|
|
244
|
-
authorName: "
|
|
245
|
-
authorAvatar: seedExtMedia("https://
|
|
244
|
+
authorName: "Mock User 1",
|
|
245
|
+
authorAvatar: seedExtMedia("https://picsum.photos/seed/user-avatar-letitrip-admin-20260101/400/400"),
|
|
246
246
|
readTimeMinutes: 6,
|
|
247
247
|
views: 2900,
|
|
248
|
-
metaTitle: "
|
|
249
|
-
metaDescription: "Discover undervalued
|
|
248
|
+
metaTitle: "Metal Fight Hidden Gems — Undervalued Beyblades | LetItRip",
|
|
249
|
+
metaDescription: "Discover undervalued Metal Fight era Beyblades that smart collectors are buying now.",
|
|
250
250
|
createdAt: daysAgo(18),
|
|
251
251
|
updatedAt: daysAgo(15),
|
|
252
252
|
},
|
|
@@ -262,7 +262,7 @@ export const blogPostsSeedData = [
|
|
|
262
262
|
status: "published",
|
|
263
263
|
publishedAt: daysAgo(10),
|
|
264
264
|
authorId: "user-admin-letitrip",
|
|
265
|
-
authorName: "
|
|
265
|
+
authorName: "Mock User 1",
|
|
266
266
|
readTimeMinutes: 7,
|
|
267
267
|
views: 3500,
|
|
268
268
|
metaTitle: "Protect Collectibles in India's Climate | LetItRip",
|
|
@@ -282,7 +282,7 @@ export const blogPostsSeedData = [
|
|
|
282
282
|
status: "published",
|
|
283
283
|
publishedAt: daysAgo(5),
|
|
284
284
|
authorId: "user-admin-letitrip",
|
|
285
|
-
authorName: "
|
|
285
|
+
authorName: "Mock User 1",
|
|
286
286
|
readTimeMinutes: 5,
|
|
287
287
|
views: 1600,
|
|
288
288
|
metaTitle: "10 Tips to Sell Faster on LetItRip",
|
|
@@ -301,7 +301,7 @@ export const blogPostsSeedData = [
|
|
|
301
301
|
isFeatured: false,
|
|
302
302
|
status: "draft",
|
|
303
303
|
authorId: "user-admin-letitrip",
|
|
304
|
-
authorName: "
|
|
304
|
+
authorName: "Mock User 1",
|
|
305
305
|
readTimeMinutes: 8,
|
|
306
306
|
views: 0,
|
|
307
307
|
metaTitle: "One Piece TCG in India — Complete Primer | LetItRip",
|
|
@@ -311,23 +311,23 @@ export const blogPostsSeedData = [
|
|
|
311
311
|
},
|
|
312
312
|
// ── COMMUNITY (3) ─────────────────────────────────────────────────────────
|
|
313
313
|
{
|
|
314
|
-
id: "blog-authenticating-
|
|
315
|
-
title: "How a Verified Store Authenticates Every
|
|
316
|
-
slug: "authenticating-
|
|
317
|
-
excerpt: "A behind-the-scenes look at how verified sellers on LetItRip check every
|
|
318
|
-
content: `<h2>The 5-Point Authentication Process</h2><p>Every
|
|
319
|
-
coverImage: { type: "image", url: seedExtMedia("https://
|
|
314
|
+
id: "blog-authenticating-beyblades",
|
|
315
|
+
title: "How a Verified Store Authenticates Every Beyblade",
|
|
316
|
+
slug: "authenticating-beyblades",
|
|
317
|
+
excerpt: "A behind-the-scenes look at how verified sellers on LetItRip check every beyblade before listing — logo tests, weight checks, and spin-balance inspection.",
|
|
318
|
+
content: `<h2>The 5-Point Authentication Process</h2><p>Every beyblade listed by top verified stores goes through a rigorous 5-point check:</p><ol><li><strong>Logo Test</strong> — Genuine Takara-Tomy pieces have a specific laser-etched depth and clarity when checked under raking light.</li><li><strong>Weight Check</strong> — A genuine metal-fusion driver weighs within a tight factory tolerance verified on a digital scale.</li><li><strong>Spin-Balance Test</strong> — Each layer/driver combo is spin-tested on a flat glass surface; genuine parts spin true with minimal wobble.</li><li><strong>Sticker Print Inspection</strong> — Under 10x magnification, genuine face-bolt stickers show sharp gradient printing and a raised clear-coat.</li><li><strong>Ratchet & Grip Inspection</strong> — Check the launcher for a tight ratchet mechanism and unfrayed grip tape.</li></ol>`,
|
|
319
|
+
coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/blog-cover-authenticating-beyblades-20260101/1200/630"), alt: "Beyblade authentication process" },
|
|
320
320
|
category: "community",
|
|
321
|
-
tags: ["authentication", "verification", "counterfeit", "
|
|
321
|
+
tags: ["authentication", "verification", "counterfeit", "beyblade"],
|
|
322
322
|
isFeatured: false,
|
|
323
323
|
status: "published",
|
|
324
324
|
publishedAt: daysAgo(10),
|
|
325
325
|
authorId: "user-admin-letitrip",
|
|
326
|
-
authorName: "
|
|
326
|
+
authorName: "Mock User 1",
|
|
327
327
|
readTimeMinutes: 5,
|
|
328
328
|
views: 3400,
|
|
329
|
-
metaTitle: "How Verified Stores Authenticate
|
|
330
|
-
metaDescription: "The 5-point authentication process used by verified stores to check every
|
|
329
|
+
metaTitle: "How Verified Stores Authenticate Beyblades | LetItRip",
|
|
330
|
+
metaDescription: "The 5-point authentication process used by verified stores to check every beyblade on LetItRip.",
|
|
331
331
|
createdAt: daysAgo(12),
|
|
332
332
|
updatedAt: daysAgo(10),
|
|
333
333
|
},
|
|
@@ -343,7 +343,7 @@ export const blogPostsSeedData = [
|
|
|
343
343
|
status: "published",
|
|
344
344
|
publishedAt: daysAgo(3),
|
|
345
345
|
authorId: "user-admin-letitrip",
|
|
346
|
-
authorName: "
|
|
346
|
+
authorName: "Mock User 1",
|
|
347
347
|
readTimeMinutes: 6,
|
|
348
348
|
views: 1200,
|
|
349
349
|
metaTitle: "Collector Spotlight: Mumbai Gundam Collection | LetItRip",
|
|
@@ -356,14 +356,14 @@ export const blogPostsSeedData = [
|
|
|
356
356
|
title: "The Indian Collectibles Market in 2026: Where We Stand",
|
|
357
357
|
slug: "india-collectibles-market-overview",
|
|
358
358
|
excerpt: "From trading cards to action figures — a data-driven look at India's growing collectibles scene and what's driving the boom.",
|
|
359
|
-
content: `<h2>The Numbers</h2><p>India's organized collectibles market is estimated at ₹2,500 crore in 2026, up from ₹800 crore in 2022. Trading cards (Pokémon,
|
|
359
|
+
content: `<h2>The Numbers</h2><p>India's organized collectibles market is estimated at ₹2,500 crore in 2026, up from ₹800 crore in 2022. Trading cards (Pokémon, One Piece) account for ~40%, followed by action figures (~25%), diecast (~15%), and model kits/spinning tops (~10%).</p><h2>What's Driving Growth</h2><p><strong>Anime streaming</strong> — India is now the #3 market for anime streaming (Crunchyroll, Netflix anime). Fans who watch Dragon Ball, Naruto, and One Piece naturally become collectors. <strong>Social media</strong> — Instagram and YouTube unboxing/pull content drives awareness. <strong>Verified platforms</strong> — LetItRip and similar platforms have made it safe to buy collectibles online, reducing the counterfeit risk that previously kept buyers away.</p><h2>What's Hot in 2026</h2><p>Pokémon cards remain #1 by volume. Beyblade X is the fastest-growing category by transaction value. Gundam is niche but intensely loyal. Hot Wheels Super Treasure Hunts are the "gateway drug" for new collectors.</p><h2>What's Next</h2><p>Sports cards (cricket, specifically) are the next frontier. Digital collectibles (graded item NFTs backed by physical) are being explored. LetItRip is building infrastructure for both.</p>`,
|
|
360
360
|
category: "community",
|
|
361
361
|
tags: ["india", "market", "overview", "trends", "2026"],
|
|
362
362
|
isFeatured: false,
|
|
363
363
|
status: "published",
|
|
364
364
|
publishedAt: daysAgo(16),
|
|
365
365
|
authorId: "user-admin-letitrip",
|
|
366
|
-
authorName: "
|
|
366
|
+
authorName: "Mock User 1",
|
|
367
367
|
readTimeMinutes: 8,
|
|
368
368
|
views: 4100,
|
|
369
369
|
metaTitle: "Indian Collectibles Market 2026 | LetItRip",
|
|
@@ -384,7 +384,7 @@ export const blogPostsSeedData = [
|
|
|
384
384
|
status: "published",
|
|
385
385
|
publishedAt: daysAgo(45),
|
|
386
386
|
authorId: "user-admin-letitrip",
|
|
387
|
-
authorName: "
|
|
387
|
+
authorName: "Mock User 1",
|
|
388
388
|
readTimeMinutes: 4,
|
|
389
389
|
views: 7200,
|
|
390
390
|
metaTitle: "Escrow Protection Now Live on LetItRip",
|
|
@@ -404,7 +404,7 @@ export const blogPostsSeedData = [
|
|
|
404
404
|
status: "published",
|
|
405
405
|
publishedAt: daysAgo(35),
|
|
406
406
|
authorId: "user-admin-letitrip",
|
|
407
|
-
authorName: "
|
|
407
|
+
authorName: "Mock User 1",
|
|
408
408
|
readTimeMinutes: 5,
|
|
409
409
|
views: 4800,
|
|
410
410
|
metaTitle: "Verified Seller Program | LetItRip",
|
|
@@ -424,7 +424,7 @@ export const blogPostsSeedData = [
|
|
|
424
424
|
status: "archived",
|
|
425
425
|
publishedAt: daysAgo(60),
|
|
426
426
|
authorId: "user-admin-letitrip",
|
|
427
|
-
authorName: "
|
|
427
|
+
authorName: "Mock User 1",
|
|
428
428
|
readTimeMinutes: 4,
|
|
429
429
|
views: 5600,
|
|
430
430
|
metaTitle: "Live Auctions Now on LetItRip",
|