import type { Product, CommercejsProduct, CommercejsVariant, } from '../types/product' function getOptionsFromVariantGroups( variantGroups: CommercejsProduct['variant_groups'] ): Product['options'] { const optionsFromVariantGroups = variantGroups.map( ({ id, name: variantName, options }) => ({ id, displayName: variantName, values: options.map(({ name: optionName }) => ({ label: optionName, })), }) ) return optionsFromVariantGroups } function normalizeVariants( variants: Array = [], variantGroups: CommercejsProduct['variant_groups'] ) { if (!Array.isArray(variants)) return [] return variants?.map((variant) => ({ id: variant.id, options: Object.entries(variant.options).map( ([variantGroupId, variantOptionId]) => { const variantGroupFromId = variantGroups.find( (group) => group.id === variantGroupId ) const valueLabel = variantGroupFromId?.options.find( (option) => option.id === variantOptionId )?.name return { id: variantOptionId, displayName: variantGroupFromId?.name || '', __typename: 'MultipleChoiceOption' as 'MultipleChoiceOption', values: [ { label: valueLabel || '', }, ], } } ), })) } export function normalizeProduct( commercejsProduct: CommercejsProduct, commercejsProductVariants: Array = [] ): Product { const { id, name, description, permalink, assets, price, variant_groups } = commercejsProduct return { id, name, description, descriptionHtml: description, slug: permalink, path: permalink, images: assets.map(({ url, description, filename }) => ({ url, alt: description || filename, })), price: { value: price.raw, currencyCode: 'USD', }, variants: normalizeVariants(commercejsProductVariants, variant_groups), options: getOptionsFromVariantGroups(variant_groups), } }