import MissingProductError from '../../errors/MissingProductError'; import MissingVariantError from '../../errors/MissingVariantError'; import { jsonApi } from '@spree/storefront-api-v2-sdk'; import type { ProductAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/Product'; import type { WishedItemAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/WishedItem'; import type { WishlistAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/Wishlist'; import type { ExplicitCommerceWishlist, SpreeSdkResponse, VariantAttr } from '../../types'; import normalizeProduct from './normalize-product'; const normalizeWishlist = ( spreeSuccessResponse: SpreeSdkResponse, spreeWishlist: WishlistAttr ): ExplicitCommerceWishlist => { const spreeWishedItems = jsonApi.findRelationshipDocuments( spreeSuccessResponse, spreeWishlist, 'wished_items' ); const items: ExplicitCommerceWishlist['items'] = spreeWishedItems.map((spreeWishedItem) => { const spreeWishedVariant = jsonApi.findSingleRelationshipDocument( spreeSuccessResponse, spreeWishedItem, 'variant' ); if (spreeWishedVariant === null) { throw new MissingVariantError( `Couldn't find variant for wished item with id ${spreeWishedItem.id}.` ); } const spreeWishedProduct = jsonApi.findSingleRelationshipDocument( spreeSuccessResponse, spreeWishedVariant, 'product' ); if (spreeWishedProduct === null) { throw new MissingProductError( `Couldn't find product for variant with id ${spreeWishedVariant.id}.` ); } return { id: spreeWishedItem.id, product_id: parseInt(spreeWishedProduct.id, 10), variant_id: parseInt(spreeWishedVariant.id, 10), product: normalizeProduct(spreeSuccessResponse, spreeWishedProduct) }; }); return { id: spreeWishlist.id, token: spreeWishlist.attributes.token, items }; }; export default normalizeWishlist;