{"version":3,"file":"cart-sidebar.d81a8b3db91bf8994662.bundle.js","mappings":"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","sources":["webpack://pg-service-cart/./node_modules/@estee/elc-service/node_modules/@estee/elc-telemetry/src/PerformanceMarker.ts","webpack://pg-service-cart/./node_modules/@estee/elc-service/node_modules/@estee/elc-telemetry/src/ErrorBoundary.tsx","webpack://pg-service-cart/./node_modules/@estee/elc-service/src/Service/ServiceManager/ViewsManager.ts","webpack://pg-service-cart/./src/exported/CartSidebar/index.ts","webpack://pg-service-cart/./node_modules/@estee/elc-service/src/Service/ServiceManager/BaseComponent.tsx","webpack://pg-service-cart/./node_modules/odiff/odiff.js"],"sourcesContent":["import { ELCLogger, TriggerType } from '@estee/elc-logging';\nexport class PerformanceMarker {\n private readonly logger: ELCLogger;\n private readonly serviceViewName: string;\n\n constructor(logger: ELCLogger, name: string) {\n this.logger = logger;\n this.serviceViewName = name;\n }\n\n startMark = (name: string) => {\n try {\n performance.mark(`${this.serviceViewName}_${name}`);\n } catch (error) {\n this.logger.error({\n message: `[${this.serviceViewName}]: ${error}`,\n triggerType: TriggerType.other,\n payload: {\n error\n }\n });\n }\n };\n\n endMark = (name: string) => {\n try {\n if (performance.getEntriesByName(name)) {\n const markName = `${this.serviceViewName}_${name}`;\n performance.mark(`${markName}_end`);\n performance.measure(\n `${this.serviceViewName}_measure_${name}`,\n `${markName}`,\n `${markName}_end`\n );\n this.clearMark(markName);\n }\n } catch (error) {\n this.logger.error({\n message: `[${this.serviceViewName}]: ${error}`,\n triggerType: TriggerType.other,\n payload: {\n error\n }\n });\n }\n };\n\n // Chrome has a limit of markers that it can support at the same time\n // In order to limit the amount of markers we'll clean everything except the mesure one after we take the mesurements\n clearMark = (name: string) => {\n performance.clearMarks(name);\n performance.clearMarks(`${name}_end`);\n };\n}\n","import * as React from 'react';\nimport { ELCLogger, TriggerType } from '@estee/elc-logging';\nimport { root, getServiceVersion } from '@estee/elc-universal-utils';\n\ninterface IProps {\n children: JSX.Element | null;\n serviceName: string;\n name: string;\n}\n\ninterface IState {\n error?: Error;\n}\n\nexport class ErrorBoundary extends React.Component {\n private logger: ELCLogger;\n\n constructor(props: IProps) {\n super(props);\n this.state = { error: undefined };\n this.logger = new ELCLogger({\n serviceName: props.serviceName,\n buid: root.buid || '',\n environment: root.env || '',\n serviceVersion: getServiceVersion(props.serviceName) || ''\n });\n }\n\n static getDerivedStateFromError(error?: Error) {\n return { error };\n }\n\n public componentDidCatch(error?: Error) {\n this.logger.error({\n triggerType: TriggerType.render,\n message: `Error caught in external view ${this.props.name}`,\n payload: {\n error: error,\n context: { serviceRegistry: root.ServiceRegistry }\n }\n });\n }\n\n public render() {\n return this.state.error ? null : this.props.children;\n }\n}\n","export type ImportStatement = () => Promise<{\n default: React.ComponentClass;\n}>;\n\nexport class ViewsManager {\n private views: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: React.ComponentClass | undefined;\n } = {};\n\n public async loadAndSaveModule(viewName: string, importMethod: ImportStatement) {\n try {\n if (!this.views[viewName]) {\n const module = await importMethod();\n\n this.views[viewName] = module.default;\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n public getView(viewName: string) {\n return this.views[viewName];\n }\n}\n\nexport default new ViewsManager();\n","import { convertToExportedView } from '@estee/elc-service';\nimport { CART_SIDEBAR } from '@estee/elc-service-view-names';\nimport serviceNames from '~setup/CartService';\nimport ICartSidebar from './ICartSidebar';\n\n/*eslint no-restricted-syntax: [\"off\"]*/\nexport default convertToExportedView(\n () => import('./CartSidebar'),\n CART_SIDEBAR,\n serviceNames.cartSidebarViewController\n);\n","import * as React from 'react';\nimport { ServiceManager } from './ServiceManager';\nimport { ViewController } from '../../ViewController';\nimport ViewsManager, { ImportStatement } from './ViewsManager';\nimport { ErrorBoundary } from '@estee/elc-telemetry';\n\ntype ExportedViewState = {\n viewController?: ViewController;\n component: React.ComponentClass | undefined;\n};\n\ntype RemoveViewController = Omit;\ntype ExportedViewProps = {\n config?: object;\n translations?: object;\n viewController?: ViewController;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n} & { [key: string]: any };\n\nexport function convertToExportedView(\n WrappedComponentImport: ImportStatement,\n viewName: string,\n controllerKey?: string\n) {\n return class extends React.Component, ExportedViewState> {\n static controllerName = controllerKey;\n\n constructor(props: RemoveViewController) {\n super(props);\n\n const controller = ServiceManager.serviceHasStarted\n ? ServiceManager.getController(controllerKey)\n : undefined;\n\n this.state = {\n viewController: controller,\n component: ViewsManager.getView(viewName)\n };\n }\n\n public async componentDidMount() {\n try {\n if (!ServiceManager.serviceHasStarted) {\n await ServiceManager.startService();\n }\n await ViewsManager.loadAndSaveModule(viewName, WrappedComponentImport);\n\n this.setState({\n viewController: ServiceManager.getController(controllerKey),\n component: ViewsManager.getView(viewName)\n });\n } catch (error) {\n console.error(error);\n }\n }\n\n render() {\n const Component = this.state.component as React.ComponentClass;\n\n if (!ServiceManager.serviceHasStarted || !Component) {\n return null;\n }\n\n return (\n \n \n \n );\n }\n };\n}\n","\"use strict\";\n\n/* Copyright (c) 2013 Billy Tetrud - Free to use for any purpose: MIT License*/\n// gets the changes that need to happen to a to change it into b\n// returns an object with the members\n // type\n // property\n // value\n // values\n // count\nmodule.exports = function(a,b) {\n var results = []\n diffInternal(a,b,results,[])\n return results\n}\n\nvar diffInternal = function(a,b,acc,base) {\n if(a === b || Number.isNaN(a)&&Number.isNaN(b)) {\n return;\n } else if(a instanceof Array && b instanceof Array) {\n var an=a.length-1,bn=b.length-1\n while(an >= 0 && bn >= 0) { // Loop backwards (so that making changes in order will work correctly).\n if(equal(a[an], b[bn])) {\n an--; bn--;\n } else {\n var indexes = findMatchIndexes(equal, a,b, an,bn, 0, 0)\n\n // Loop backwards from the point at which the lists are not equal and find which elements can be matched\n // as similar or can be expressed as additions, changes, or removals.\n var anInner=an,bnInner=bn\n while(anInner > indexes.a && bnInner > indexes.b) {\n if(similar(a[anInner], b[bnInner])) {\n // get change for that element\n diffInternal(a[anInner],b[bnInner],acc, base.concat([anInner]))\n anInner--; bnInner--;\n } else {\n var indexesInner = findMatchIndexes(similar, a,b, anInner,bnInner, indexes.a+1, indexes.b+1)\n\n var numberPulled = anInner-indexesInner.a\n var numberPushed = bnInner-indexesInner.b\n\n if(numberPulled === 1 && numberPushed === 1) {\n set(acc, base.concat(indexesInner.a+1), b[indexesInner.b+1]) // set the one\n } else if(numberPulled === 1 && numberPushed === 2) {\n // set one, push the other\n add(acc, base,indexesInner.a+2, b.slice(indexesInner.b+2, bnInner+1))\n set(acc, base.concat(indexesInner.a+1), b[indexesInner.b+1])\n } else if(numberPulled === 2 && numberPushed === 1) {\n // set one, pull the other\n rm(acc, base, indexesInner.a+2, 1, a)\n set(acc, base.concat(indexesInner.a+1), b[indexesInner.b+1])\n } else if(numberPulled === 2 && numberPushed === 2) {\n set(acc, base.concat(indexesInner.a+2), b[indexesInner.b+2])\n set(acc, base.concat(indexesInner.a+1), b[indexesInner.b+1])\n } else {\n if(numberPulled > 0) { // if there were some elements pulled\n rm(acc, base, indexesInner.a+1, numberPulled, a)\n }\n if(numberPushed > 0) { // if there were some elements pushed\n add(acc, base,indexesInner.a+1, b.slice(indexesInner.b+1, bnInner+1))\n }\n }\n\n anInner = indexesInner.a\n bnInner = indexesInner.b\n }\n }\n if(anInner > indexes.a) { // more to pull\n rm(acc, base, indexes.a+1, anInner-indexes.a, a)\n } else if(bnInner > indexes.b) { // more to push\n add(acc, base, anInner+1, b.slice(indexes.b+1, bnInner+1))\n }\n\n an = indexes.a\n bn = indexes.b\n }\n }\n\n if(an >= 0) { // more to pull\n rm(acc, base, 0, an+1, a)\n } else if(bn >= 0) { // more to push\n add(acc, base,0, b.slice(0, bn+1))\n }\n\n } else if(a instanceof Date && b instanceof Date) {\n if(a.getTime() !== b.getTime()) {\n set(acc, base, b)\n }\n } else if(a instanceof Object && b instanceof Object) {\n var keyMap = merge(arrayToMap(Object.keys(a)), arrayToMap(Object.keys(b)))\n for(var key in keyMap) {\n var path = base.concat([key])\n if(key in a && !(key in b)) {\n unset(acc, path)\n } else {\n diffInternal(a[key],b[key],acc, path)\n }\n }\n } else {\n set(acc, base, b)\n }\n\n // adds a 'set' type to the changeList\n function set(changeList, property, value) {\n changeList.push({\n type:'set',\n path: property,\n val: value\n })\n }\n\n // adds an 'unset' type to the changeList\n function unset(changeList, property) {\n changeList.push({\n type:'unset',\n path: property\n })\n }\n\n // Adds an 'rm' type to the changeList.\n // index - The index to remove at.\n // count - The number of items to remove from that index. The indexes to remove count up from the index.\n function rm(changeList, property, index, count, a) {\n var finalIndex =\n changeList.push({\n type:'rm',\n path: property,\n index: index,\n num: count,\n vals: a.slice(index, index + count)\n })\n }\n\n // adds an 'add' type to the changeList\n function add(changeList, property, index, values) {\n changeList.push({\n type:'add',\n path: property,\n index: index,\n vals: values\n })\n }\n}\n\nmodule.exports.similar = similar\nmodule.exports.equal = equal\n\n\n// Finds and returns the closest indexes in a and b that match starting with divergenceIndex\n// Note: loops backwards like the rest of this stuff\n// Returns the index beyond the first element (aSubMin-1 or bSubMin-1) for each if there is no match\n// Parameters:\n // compareFn - determines what matches (returns true if the arguments match)\n // a,b - two arrays to compare\n // divergenceIndexA,divergenceIndexB - the two positions of a and b to start comparing from\n // aSubMin,bSubMin - the two positions to compare until\nfunction findMatchIndexes(compareFn, a,b, divergenceIndexA,divergenceIndexB, aSubMin, bSubMin) {\n var maxNForA = divergenceIndexA-aSubMin\n var maxNForB = divergenceIndexB-bSubMin\n var maxN = Math.max(maxNForA, maxNForB)\n for(var n=1; n<=maxN; n++) {\n var newestA = a[divergenceIndexA-n] // the current item farthest from the divergence index being compared\n var newestB = b[divergenceIndexB-n]\n\n if(n<=maxNForB && n<=maxNForA && compareFn(newestA, newestB)) {\n return {a:divergenceIndexA-n, b:divergenceIndexB-n}\n }\n\n for(var j=0; j= 2 && notEqual > tenPercent || notEqual === a.length) {\n return false\n }\n\n notEqual++\n }\n }\n // else\n return true\n\n } else if(a instanceof Object) {\n if(!(b instanceof Object))\n return false\n\n var keyMap = merge(arrayToMap(Object.keys(a)), arrayToMap(Object.keys(b)))\n var keyLength = Object.keys(keyMap).length\n var tenPercent = keyLength / 10\n var notEqual = 0\n for(var key in keyMap) {\n var aVal = a[key]\n var bVal = b[key]\n\n if(!equal(aVal,bVal)) {\n if(notEqual >= 2 && notEqual > tenPercent || notEqual+1 === keyLength) {\n return false\n }\n\n notEqual++\n }\n }\n // else\n return true\n\n } else {\n return a===b || Number.isNaN(a) && Number.isNaN(b)\n }\n}\n\n// compares arrays and objects for value equality (all elements and members must match)\nfunction equal(a,b) {\n if(a instanceof Array) {\n if(!(b instanceof Array))\n return false\n if(a.length !== b.length) {\n return false\n } else {\n for(var n=0; n