import type { BagItem, Brand, Category, Product as OriginalProduct, Outfit, ProductAttribute, ProductFitting, ProductGroup, ProductGroupEntry, ProductGrouping, ProductGroupingEntry, ProductGroupingProperties, ProductGroupingPropertiesValue, ProductGroupingProperty, ProductSizeGuide, ProductSummaryPrice, ProductVariant, ProductVariantMerchantLocation, WishlistItem } from '@farfetch/blackout-client'; import type { BrandEntity } from './brand.types.js'; import type { CategoryEntity } from './category.types.js'; import type { CustomAttributesAdapted, PriceAdapted, ProductImagesAdapted, SizesAdapted } from '../../helpers/adapters/index.js'; import type { MerchantEntity } from './merchant.types.js'; export type GroupingAdapted = (Omit & { entries: Array & { digitalAssets: ProductImagesAdapted; }>; }) | undefined; export type AdaptGrouping = (grouping: ProductGrouping) => GroupingAdapted; export type GroupingPropertiesAdapted = Array & { values: Array & { digitalAssets: ProductImagesAdapted; }>; }> | undefined; export type AdaptGroupingProperties = (groupingProperties: ProductGroupingProperties) => GroupingPropertiesAdapted; export type GroupedEntriesAdapted = (Omit & { entries: Array & { images: ProductImagesAdapted; }>; }) | undefined | null; export type AdaptGroupedEntries = (groupedEntries: ProductGroup) => GroupedEntriesAdapted; export type PricesAdapted = (PriceAdapted | undefined)[] | undefined; export type AdaptPrices = (prices: ProductSummaryPrice[]) => PricesAdapted; export type VariantAdapted = Omit & { price: PriceAdapted | undefined; merchantsLocations?: ProductVariantMerchantLocation[]; }; export type VariantsAdapted = VariantAdapted[] | undefined; export type AdaptVariants = (variants: Array) => VariantsAdapted; export type ProductEntity = { brand: Brand['id']; categories: Category['id'][]; merchant: MerchantEntity['id']; associations: OriginalProduct['result']['associations']; associationsInformation: OriginalProduct['result']['associationsInformation']; attributes: ProductAttribute[]; brandStyleId: OriginalProduct['result']['brandStyleId']; breadCrumbs: OriginalProduct['breadCrumbs']; care: OriginalProduct['result']['care']; colors: OriginalProduct['result']['colors']; colorSet: OriginalProduct['colorSet']; colorSwatch: OriginalProduct['colorSwatch']; complementaryInformation: OriginalProduct['complementaryInformation']; compositions: OriginalProduct['result']['compositions']; currencyIsoCode: OriginalProduct['currencyIsoCode']; description: OriginalProduct['result']['description']; digitalAssets: OriginalProduct['result']['digitalAssets']; fittings: ProductFitting[]; outfits: Outfit[]; fulfillmentDate: OriginalProduct['result']['fulfillmentDate']; gender: OriginalProduct['result']['gender']; genderName: string; hasParentProduct: OriginalProduct['result']['hasParentProduct']; id: OriginalProduct['result']['id']; isCustomizable: OriginalProduct['result']['isCustomizable']; isDuplicated: boolean; isExclusive: OriginalProduct['result']['isExclusive']; isInWishlist: boolean; isOnline: OriginalProduct['result']['isOnline']; labels: OriginalProduct['result']['labels']; liveModel: OriginalProduct['liveModel']; madeIn: OriginalProduct['result']['madeIn']; measurements: OriginalProduct['result']['measurements']; parentProductId: OriginalProduct['result']['parentProductId']; preferedMerchant: OriginalProduct['result']['preferedMerchant']; productRef: OriginalProduct['productRef']; productSize: OriginalProduct['productSize']; promotions: OriginalProduct['result']['promotions']; quantity: number; recommendedSet: number; redirectInfo: OriginalProduct['redirectInfo']; relatedSets: OriginalProduct['relatedSets']; scaleId: OriginalProduct['result']['scaleId']; season: OriginalProduct['result']['season']; selectedSize: OriginalProduct['selectedSize']; shortDescription: OriginalProduct['result']['shortDescription']; sizeGuides?: ProductSizeGuide[]; sizeSet: OriginalProduct['sizeSet']; sku: OriginalProduct['result']['sku']; slug: OriginalProduct['slug']; styleId: OriginalProduct['result']['styleId']; tag: { name: OriginalProduct['result']['tagDescription']; id: OriginalProduct['result']['tag']; }; translatedAttributes: OriginalProduct['result']['translatedAttributes']; type: OriginalProduct['result']['type']; variations: OriginalProduct['result']['variations']; videos: OriginalProduct['result']['videos']; customAttributes: CustomAttributesAdapted; groupedEntries: GroupedEntriesAdapted; images: ProductImagesAdapted; price: PriceAdapted; prices: PricesAdapted; sizes: SizesAdapted; variants: VariantsAdapted; name?: BagItem['productName'] | WishlistItem['productName']; }; export type ProductEntityDenormalized = Omit & { brand?: BrandEntity; categories?: CategoryEntity[]; };