/** * Fixture data for the mock Medusa Store API. * * Shapes mirror what `@medusajs/js-sdk` expects from a real Medusa v2 store * so the storefront can be developed and demoed without a running backend. */ const REGION = { id: "reg_01", name: "United States", currency_code: "usd", countries: [ { iso_2: "us", iso_3: "usa", display_name: "United States", name: "united states", num_code: 840, region_id: "reg_01", }, ], } const APPAREL_IMG = "/apparel_collection.png" const BAGS_IMG = "/bags_collection.png" // --- Categories ------------------------------------------------------------- // Declared flat, then linked into a parent/child tree below. const CATEGORY_DEFS = [ { id: "cat_ready_to_wear", name: "Ready-to-Wear", handle: "ready-to-wear", description: "Tailoring, knitwear and everyday pieces.", parent_id: null, }, { id: "cat_dresses", name: "Dresses", handle: "dresses", description: "Day and evening dresses.", parent_id: "cat_ready_to_wear", }, { id: "cat_knitwear", name: "Knitwear", handle: "knitwear", description: "Cashmere, wool and cotton knits.", parent_id: "cat_ready_to_wear", }, { id: "cat_outerwear", name: "Outerwear", handle: "outerwear", description: "Coats, jackets and tailoring.", parent_id: "cat_ready_to_wear", }, { id: "cat_bags", name: "Bags", handle: "bags", description: "Bags and leather goods.", parent_id: null, }, { id: "cat_totes", name: "Totes", handle: "totes", description: "Structured and soft totes.", parent_id: "cat_bags", }, { id: "cat_shoulder_bags", name: "Shoulder Bags", handle: "shoulder-bags", description: "Shoulder and crossbody bags.", parent_id: "cat_bags", }, { id: "cat_mini_bags", name: "Mini Bags", handle: "mini-bags", description: "Compact evening and day bags.", parent_id: "cat_bags", }, { id: "cat_accessories", name: "Accessories", handle: "accessories", description: "Small leather goods and finishing pieces.", parent_id: null, }, ] const CATEGORIES = CATEGORY_DEFS.map((def) => ({ id: def.id, name: def.name, handle: def.handle, description: def.description, category_children: [], parent_category: null, })) const CATEGORY_BY_ID = new Map(CATEGORIES.map((c) => [c.id, c])) CATEGORY_DEFS.forEach((def) => { if (!def.parent_id) { return } const child = CATEGORY_BY_ID.get(def.id) const parent = CATEGORY_BY_ID.get(def.parent_id) // Parent references are trimmed to avoid a circular structure that // JSON.stringify cannot serialise. child.parent_category = { id: parent.id, name: parent.name, handle: parent.handle, parent_category: null, } parent.category_children.push({ id: child.id, name: child.name, handle: child.handle, }) }) // --- Collections ------------------------------------------------------------ const COLLECTIONS = [ { id: "col_summer_edit", title: "The Summer Edit", handle: "summer-edit" }, { id: "col_signatures", title: "Signatures", handle: "signatures" }, { id: "col_leather_goods", title: "Leather Goods", handle: "leather-goods" }, ] // --- Products --------------------------------------------------------------- const SIZES = ["S", "M", "L"] const PRODUCT_OPTIONS = (colors) => [ { id: "opt_size", title: "Size", values: SIZES.map((value) => ({ value })), }, { id: "opt_color", title: "Color", values: colors.map((value) => ({ value })), }, ] function makeVariants(id, basePrice, colors) { const variants = [] SIZES.forEach((size) => { colors.forEach((color) => { variants.push({ id: `variant_${id}_${size}_${color}`.toLowerCase().replace(/\s+/g, "-"), title: `${size} / ${color}`, sku: `${id.toUpperCase()}-${size}-${color.slice(0, 3).toUpperCase()}`, manage_inventory: true, allow_backorder: false, inventory_quantity: 10, options: [ { option_id: "opt_size", value: size }, { option_id: "opt_color", value: color }, ], calculated_price: { calculated_amount: basePrice, original_amount: basePrice, currency_code: REGION.currency_code, calculated_price: { price_list_type: "default" }, }, images: [], }) }) }) return variants } function makeProduct({ id, title, handle, description, thumbnail, price, categoryId, collectionId, material, colors, }) { const category = CATEGORY_BY_ID.get(categoryId) return { id, title, handle, description, thumbnail, material, status: "published", created_at: "2026-01-01T00:00:00.000Z", updated_at: "2026-01-01T00:00:00.000Z", images: [ { id: `img_${id}_1`, url: thumbnail }, { id: `img_${id}_2`, url: thumbnail }, ], options: PRODUCT_OPTIONS(colors), variants: makeVariants(id, price, colors), categories: category ? [{ id: category.id, name: category.name, handle: category.handle }] : [], collection_id: collectionId, collection: COLLECTIONS.find((c) => c.id === collectionId) ?? null, tags: [], metadata: {}, } } const PRODUCTS = [ makeProduct({ id: "prod_1", title: "Wool Tailored Blazer", handle: "wool-tailored-blazer", description: "Structured wool blazer with a tailored silhouette.", thumbnail: APPAREL_IMG, price: 1890, categoryId: "cat_outerwear", collectionId: "col_signatures", material: "Wool", colors: ["Black", "Camel"], }), makeProduct({ id: "prod_2", title: "Silk Midi Dress", handle: "silk-midi-dress", description: "Fluid silk dress with a modern midi length.", thumbnail: APPAREL_IMG, price: 1290, categoryId: "cat_dresses", collectionId: "col_summer_edit", material: "Silk", colors: ["Ivory", "Black"], }), makeProduct({ id: "prod_3", title: "Cashmere Knit Sweater", handle: "cashmere-knit-sweater", description: "Soft cashmere knit in a relaxed fit.", thumbnail: APPAREL_IMG, price: 980, categoryId: "cat_knitwear", collectionId: "col_signatures", material: "Cashmere", colors: ["Grey", "Camel"], }), makeProduct({ id: "prod_4", title: "Quilted Leather Shoulder Bag", handle: "quilted-leather-shoulder-bag", description: "Quilted leather shoulder bag with a chain strap.", thumbnail: BAGS_IMG, price: 2590, categoryId: "cat_shoulder_bags", collectionId: "col_leather_goods", material: "Leather", colors: ["Black", "Cognac"], }), makeProduct({ id: "prod_5", title: "Leather Tote Bag", handle: "leather-tote-bag", description: "Spacious leather tote for everyday carry.", thumbnail: BAGS_IMG, price: 2190, categoryId: "cat_totes", collectionId: "col_leather_goods", material: "Leather", colors: ["Cognac", "Ivory"], }), makeProduct({ id: "prod_6", title: "Mini Crossbody Bag", handle: "mini-crossbody-bag", description: "Compact crossbody bag in smooth leather.", thumbnail: BAGS_IMG, price: 1490, categoryId: "cat_mini_bags", collectionId: "col_leather_goods", material: "Leather", colors: ["Black", "Ivory"], }), makeProduct({ id: "prod_7", title: "Raffia Summer Tote", handle: "raffia-summer-tote", description: "Hand-woven raffia tote with leather handles.", thumbnail: BAGS_IMG, price: 890, categoryId: "cat_totes", collectionId: "col_summer_edit", material: "Raffia", colors: ["Natural"], }), makeProduct({ id: "prod_8", title: "Leather Card Holder", handle: "leather-card-holder", description: "Slim card holder in grained leather.", thumbnail: BAGS_IMG, price: 290, categoryId: "cat_accessories", collectionId: "col_leather_goods", material: "Leather", colors: ["Black", "Cognac"], }), makeProduct({ id: "prod_9", title: "Linen Shirt Dress", handle: "linen-shirt-dress", description: "Relaxed linen shirt dress for warm days.", thumbnail: APPAREL_IMG, price: 740, categoryId: "cat_dresses", collectionId: "col_summer_edit", material: "Linen", colors: ["Ivory", "Sky"], }), ] module.exports = { REGION, CATEGORIES, COLLECTIONS, PRODUCTS }