{"version":3,"sources":["webpack://casperEventHub/./src/basket.ts","webpack://casperEventHub/./src/eCapi.ts","webpack://casperEventHub/./src/basketObserver.ts"],"names":["Basket","getState","then","body","result","Promise","isValid","products","BasketObserver","value","recover","args","i","arguments","f","getUserDetails","userDetails","window","JSON","status","hasCookie","getProductsDetails","napiCatalog","productsDetails","productsProperties","productProperties","fields","categories","technologies","cupSizes","range","isStandingOrders","category","indexOf","processCategories","getProductsProperties","basketProducts","basketProduct","unitPrice","merged","getStandingOrders","getSubscriptions","subs","sub","product","subsDetails","marketSub","invoiceProduct","console","name","e","off","this","Rule"],"mappings":"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","file":"Basket.js","sourcesContent":["import BasketObserver from './basketObserver'\nimport { getProductsDetails, IProduct } from './eCapi'\nimport { Possibilities } from './types'\n\nexport default class Basket extends BasketObserver {\n  public async getState(): Promise<BasketState> {\n    const products = await getProductsDetails()\n    return {\n      isValid: this.validate((products as unknown) as Possibilities), //TODO check is really necessary\n      products,\n    }\n  }\n}\n\ninterface BasketState {\n  isValid: boolean\n  products: IProduct[]\n}\n","import {\n  Catalog,\n  CartProducts,\n  ICategory,\n  ProductDetails,\n  CustomerDetails,\n} from './types'\nimport { IStandingOrder } from './standingOrders'\nimport { CustomerSubscription, MergedSubscriptions } from './subscriptions'\n\nlet userDetails: CustomerDetails | null\n\nexport function clearCustomerDetails(): void {\n  userDetails = null\n}\n\nexport async function getSubscriptions(): Promise<MergedSubscriptions[]> {\n  try {\n    const subs: CustomerSubscription[] = await window.napi\n      .subscription()\n      .getSubscriptions()\n    const subsDetails = await window.napi.market().getSubscriptions()\n    return (await Promise.all(\n      subs.map(async (sub) => {\n        let product\n        if (sub.promotionalProductId) {\n          product = await window.napi\n            .catalog()\n            .getProduct(sub.promotionalProductId)\n        }\n        const subDetails = subsDetails.subscriptionProfiles.find(\n          (marketSub) => marketSub.id === sub.profileId\n        )\n        return { ...subDetails, ...sub, invoiceProduct: product }\n      })\n    )) as MergedSubscriptions[]\n  } catch (e) {\n    console.log('error with experience', e)\n    return [] as MergedSubscriptions[]\n  }\n}\n\nexport async function getStandingOrders(): Promise<IStandingOrder[]> {\n  try {\n    return await window.napi.standingOrders().getOrders('Responsive')\n  } catch (e) {\n    return [] as IStandingOrder[]\n  }\n}\n\nfunction processCategories(categories: ICategory[]): IProductFields {\n  const technologies = []\n  const cupSizes = []\n  let range: IProductFields['range'] = null\n  let isStandingOrders = false\n  for (const category of categories) {\n    if (['original', 'vertuo'].indexOf(category.code) > -1) {\n      technologies.push(category.code)\n    } else if (\n      category.code.indexOf('capsule-range') > -1 &&\n      category.code.indexOf('-Mobile') === -1\n    ) {\n      range = category.code.replace('capsule-range-', '')\n    } else if (category.code.indexOf('capsule-cupSize') > -1) {\n      cupSizes.push(category.code.replace('capsule-cupSize-', ''))\n    } else if (category.code === 'standing-orders') {\n      isStandingOrders = true\n    }\n  }\n  return {\n    cupSizes,\n    isStandingOrders,\n    range,\n    technologies,\n  }\n}\n\nexport async function getProductsProperties(): Promise<IProductProps[]> {\n  const napiCatalog: Catalog = window.napi.catalog()\n  const basketProducts: CartProducts[] = await window.napi.cart().read()\n  const productsDetails: IProductProps[] = []\n  await Promise.all(\n    basketProducts.map(async (basketProduct) => {\n      try {\n        const productDetail = await napiCatalog.getProduct(\n          basketProduct.productId\n        )\n        const { unitPrice } = basketProduct\n        const merged = {\n          ...basketProduct,\n          ...productDetail,\n        }\n        if (unitPrice !== 0 && merged.price === 0) {\n          merged.price = unitPrice\n        }\n        productsDetails.push(merged)\n      } catch (e) {\n        return\n      }\n    })\n  )\n  return productsDetails\n}\n\nexport async function getProductsDetails(): Promise<IProduct[]> {\n  const napiCatalog: Catalog = window.napi.catalog()\n  const productsProperties: IProductProps[] = await getProductsProperties()\n  const productsDetails: IProduct[] = []\n  await Promise.all(\n    productsProperties.map(async (productProperties) => {\n      try {\n        const categories: ICategory[] = await Promise.all(\n          productProperties.supercategories.map(napiCatalog.getCategory)\n        )\n        const fields: IProductFields = processCategories(categories)\n        productsDetails.push({\n          ...productProperties,\n          ...fields,\n        })\n      } catch (e) {\n        return\n      }\n    })\n  )\n  return productsDetails\n}\n\nexport async function getUserDetails(): Promise<CustomerDetails> {\n  if (userDetails == null) {\n    try {\n      userDetails = JSON.parse(\n        JSON.stringify(await window.napi.customer().read())\n      ) as CustomerDetails\n      if (userDetails.preferredTechnology !== undefined) {\n        userDetails.preferredTechnology = userDetails.preferredTechnology.slice(\n          30\n        )\n      }\n    } catch (error) {\n      userDetails = {\n        status: 'anonymous',\n      }\n      if (\n        window.localStorage.getItem('loggedTimestamp') ||\n        window.sessionStorage.getItem('loggedTimestamp') ||\n        hasCookie('ecapiLoginToken') ||\n        hasCookie('autoLoginToken') ||\n        hasCookie('nesLoginToken')\n      ) {\n        userDetails.status = 'not-logged-in'\n      }\n    }\n  }\n  return userDetails\n}\n\nfunction hasCookie(name: string) {\n  return window.document.cookie.indexOf(name + '=') > -1\n}\n\nexport interface IProductProps extends ProductDetails, CartProducts {\n  quantity: number\n  price: number\n  sku?: string\n  unitPrice: number\n}\n\nexport interface IProduct extends IProductFields, ProductDetails, CartProducts {\n  quantity: number\n  price: number\n  sku?: string\n  unitPrice: number\n}\n\nexport interface IProductFields {\n  range: string | null\n  technologies: string[]\n  cupSizes: string[]\n  isStandingOrders: boolean\n}\n","import Rule from './rule'\nimport { ITargetingRulesEvaluationResult } from './experience'\nconst napiDataEvent = 'cart.update'\n\nexport default class BasketObserver extends Rule {\n  private eventHandler?: () => void\n  constructor(callback: () => Promise<ITargetingRulesEvaluationResult>) {\n    super()\n    try {\n      this.eventHandler = window.napi.data().on(napiDataEvent, callback)\n    } catch (e) {\n      // prevent error\n    }\n  }\n  public off(): void {\n    if (this.eventHandler) {\n      window.napi.data().off(napiDataEvent, this.eventHandler)\n    }\n  }\n}\n"],"sourceRoot":""}