{"version":3,"file":"static/js/b110b2d8dc1789efd8e9.bundle.js","mappings":"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","sources":["webpack://goodwill-loyalty/./lib/__local__/module-registration.js?8a42","webpack://goodwill-loyalty/./src/modules/msdyn365-pva-chat-connector/actions/getBotFrameworkToken.action.ts?0785","webpack://goodwill-loyalty/./src/actions/addToCart-telemetry.action.ts?4575","webpack://goodwill-loyalty/./src/actions/copyCart-checkOut-telemetry.action.ts?403f","webpack://goodwill-loyalty/./src/actions/getById-product-telemetry.action.ts?9e39","webpack://goodwill-loyalty/./src/actions/getByIds-product-telemetry.action.ts?1a7f","webpack://goodwill-loyalty/./src/actions/getVariantsByDimensionValues-telemetry.action.ts?b148","webpack://goodwill-loyalty/./src/actions/purchase-telemetry.action.ts?d6c7","webpack://goodwill-loyalty/./src/actions/readCart-telemetry.action.ts?ac14","webpack://goodwill-loyalty/./src/actions/removeFromCart-telemetry.action.ts?b268","webpack://goodwill-loyalty/./src/actions/telemetry.action.helper.ts?7f4a","webpack://goodwill-loyalty/./src/actions/updateCart-telemetry.action.ts?f56d","webpack://goodwill-loyalty/./src/modules/category-page-summary/category-page-summary.action.ts?c40c","webpack://goodwill-loyalty/./src/modules/default-page-summary/default-page-summary.action.ts?5b44","webpack://goodwill-loyalty/./src/modules/list-page-summary/list-page-summary.action.ts?a1a8","webpack://goodwill-loyalty/./src/modules/product-page-summary/product-page-summary.action.ts?9992","webpack://goodwill-loyalty/external var \"React\"?0d3b","webpack://goodwill-loyalty/external var \"ReactDOM\"?853b"],"sourcesContent":["const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n { \n const actionPath = '@msdyn365-commerce-modules/chat/dist/lib/modules/msdyn365-pva-chat-connector/actions/getBotFrameworkToken.action';\n binding.dataActions[actionPath] = require('@msdyn365-commerce-modules/chat/dist/lib/modules/msdyn365-pva-chat-connector/actions/getBotFrameworkToken.action');\n registerActionId(actionPath);\n }\n\n { \n const actionPath = '@msdyn365-commerce-modules/core-components/dist/lib/actions/addToCart-telemetry.action';\n binding.dataActions[actionPath] = require('@msdyn365-commerce-modules/core-components/dist/lib/actions/addToCart-telemetry.action');\n registerActionId(actionPath);\n }\n\n { \n const actionPath = '@msdyn365-commerce-modules/core-components/dist/lib/actions/copyCart-checkOut-telemetry.action';\n binding.dataActions[actionPath] = require('@msdyn365-commerce-modules/core-components/dist/lib/actions/copyCart-checkOut-telemetry.action');\n registerActionId(actionPath);\n }\n\n { \n const actionPath = '@msdyn365-commerce-modules/core-components/dist/lib/actions/getById-product-telemetry.action';\n binding.dataActions[actionPath] = require('@msdyn365-commerce-modules/core-components/dist/lib/actions/getById-product-telemetry.action');\n registerActionId(actionPath);\n }\n\n { \n const actionPath = '@msdyn365-commerce-modules/core-components/dist/lib/actions/getByIds-product-telemetry.action';\n binding.dataActions[actionPath] = require('@msdyn365-commerce-modules/core-components/dist/lib/actions/getByIds-product-telemetry.action');\n registerActionId(actionPath);\n }\n\n { \n const actionPath = '@msdyn365-commerce-modules/core-components/dist/lib/actions/getVariantsByDimensionValues-telemetry.action';\n binding.dataActions[actionPath] = require('@msdyn365-commerce-modules/core-components/dist/lib/actions/getVariantsByDimensionValues-telemetry.action');\n registerActionId(actionPath);\n }\n\n { \n const actionPath = '@msdyn365-commerce-modules/core-components/dist/lib/actions/purchase-telemetry.action';\n binding.dataActions[actionPath] = require('@msdyn365-commerce-modules/core-components/dist/lib/actions/purchase-telemetry.action');\n registerActionId(actionPath);\n }\n\n { \n const actionPath = '@msdyn365-commerce-modules/core-components/dist/lib/actions/readCart-telemetry.action';\n binding.dataActions[actionPath] = require('@msdyn365-commerce-modules/core-components/dist/lib/actions/readCart-telemetry.action');\n registerActionId(actionPath);\n }\n\n { \n const actionPath = '@msdyn365-commerce-modules/core-components/dist/lib/actions/removeFromCart-telemetry.action';\n binding.dataActions[actionPath] = require('@msdyn365-commerce-modules/core-components/dist/lib/actions/removeFromCart-telemetry.action');\n registerActionId(actionPath);\n }\n\n { \n const actionPath = '@msdyn365-commerce-modules/core-components/dist/lib/actions/updateCart-telemetry.action';\n binding.dataActions[actionPath] = require('@msdyn365-commerce-modules/core-components/dist/lib/actions/updateCart-telemetry.action');\n registerActionId(actionPath);\n }\n\n { \n const actionPath = '@msdyn365-commerce-modules/page-summary/dist/lib/modules/category-page-summary/category-page-summary.action';\n binding.dataActions[actionPath] = require('@msdyn365-commerce-modules/page-summary/dist/lib/modules/category-page-summary/category-page-summary.action');\n registerActionId(actionPath);\n }\n\n { \n const actionPath = '@msdyn365-commerce-modules/page-summary/dist/lib/modules/default-page-summary/default-page-summary.action';\n binding.dataActions[actionPath] = require('@msdyn365-commerce-modules/page-summary/dist/lib/modules/default-page-summary/default-page-summary.action');\n registerActionId(actionPath);\n }\n\n { \n const actionPath = '@msdyn365-commerce-modules/page-summary/dist/lib/modules/list-page-summary/list-page-summary.action';\n binding.dataActions[actionPath] = require('@msdyn365-commerce-modules/page-summary/dist/lib/modules/list-page-summary/list-page-summary.action');\n registerActionId(actionPath);\n }\n\n { \n const actionPath = '@msdyn365-commerce-modules/page-summary/dist/lib/modules/product-page-summary/product-page-summary.action';\n binding.dataActions[actionPath] = require('@msdyn365-commerce-modules/page-summary/dist/lib/modules/product-page-summary/product-page-summary.action');\n registerActionId(actionPath);\n }\n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.packageDataActions = {};\n window.__bindings__.packageDataActions['__local__'] = {\n ...binding.dataActions\n };","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce, * as Msdyn365 from '@msdyn365-commerce/core';\n\n/**\n * Bot Framework input. Used to retrieve existing active bot framework session token.\n */\nexport class GetBotFrameworkInput implements Msdyn365.IActionInput {\n public getCacheKey = () => `CURRENT-BOTFRAMEWORKTOKEN`;\n public getCacheObjectType = () => 'CURRENT-BOTFRAMEWORK-KEY1';\n public dataCacheType = (): Msdyn365.CacheType => 'application';\n}\n\nconst createInput = (args: Msdyn365.ICreateActionContext): Msdyn365.IActionInput => {\n return new GetBotFrameworkInput();\n};\n\nasync function action(input: GetBotFrameworkInput, ctx: Msdyn365.IActionContext): Promise {\n const ISecretValue = await msdyn365Commerce.secretManager?.getSecretValue(\n 'PVA-WEBCHANNELSECURITY-KEY',\n ctx.requestContext.apiSettings.baseUrl\n );\n const apiToken = ISecretValue?.value;\n return apiToken ?? '';\n}\n\nexport default Msdyn365.createObservableDataAction({\n action: >action,\n id: 'getBotFrameworkToken',\n input: createInput\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createDataActionHook, IActionContext, IActionInput } from '@msdyn365-commerce/core';\nimport { IMSDyn365Window } from '@msdyn365-commerce/core-internal';\nimport { Cart, CartLine, IAddCartLinesParam, IDataServiceRequest } from '@msdyn365-commerce/retail-proxy';\nimport { IProductInfo, TelemetryEvent } from '@msdyn365-commerce/telemetry-internal';\nimport { getProductInfoFromCartLinesAsync } from './telemetry.action.helper';\n\ndeclare let window: IMSDyn365Window;\n\n/**\n * Saves info on cart lines added before calling data action\n * @param inputs Data action inputs\n * @param actionContext Action context\n */\nconst beforeAddToCart = async (inputs: IActionInput | IActionInput[], actionContext: IActionContext) => {\n try {\n const actionInput = Array.isArray(inputs) ? inputs[0] : inputs;\n\n // If cart lines were added\n if (actionInput.queryParams && typeof actionInput.queryParams === 'function') {\n const addCartLinesParams = actionInput.queryParams();\n if (addCartLinesParams && addCartLinesParams.cartLines) {\n // Save info on added cart lines for post data action hook to pick up\n actionContext.requestContext.telemetryData.addedCartLines = addCartLinesParams.cartLines;\n return;\n }\n }\n actionContext.telemetry.debug('AddToCart pre-data action hook failed - No added cart lines found');\n } catch (e) {\n actionContext.telemetry.debug('AddToCart pre-data action hook failed.', e);\n }\n};\n\n/**\n * Fires an AddToCart event after AddCartLines data action completed\n * @param _inputs Data action inputs\n * @param cart New cart object after cart lines have been added\n * @param actionContext Action context\n */\nconst afterAddToCart = async (_inputs: IActionInput | IActionInput[], cart: Cart | Cart[], actionContext: IActionContext) => {\n if (window && window._msdyn365 && window._msdyn365.telemetry) {\n const cartObject = Array.isArray(cart) ? cart[0] : cart;\n const addedCartLines = actionContext.requestContext.telemetryData.addedCartLines;\n let addedProducts: IProductInfo[] = [];\n\n // Collect info on products added to cart\n if (addedCartLines) {\n try {\n addedProducts = await getProductInfoFromCartLinesAsync(addedCartLines, actionContext);\n } catch (error) {\n actionContext.telemetry.error('AddCartLines post-data action hook failed to process cart lines.', error);\n }\n }\n\n // Fire AddToCart event\n window._msdyn365.telemetry.logEvent(TelemetryEvent.AddToCart, {\n cartId: cartObject.Id,\n cartVersion: cartObject.Version ? cartObject.Version.toString() : '',\n products: addedProducts,\n orderId: cartObject.OrderNumber ? cartObject.OrderNumber.toString() : ''\n });\n }\n};\n\ncreateDataActionHook({\n actionId: '@msdyn365-commerce/retail-proxy/Carts/AddCartLines',\n postReaderHook: afterAddToCart,\n preReaderHook: beforeAddToCart\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createDataActionHook, IActionContext, IActionInput, IMSDyn365Window } from '@msdyn365-commerce/core';\nimport { Cart } from '@msdyn365-commerce/retail-proxy';\nimport { IProductInfo, TelemetryEvent } from '@msdyn365-commerce/telemetry-internal';\nimport { getProductInfoFromCartLinesAsync } from './telemetry.action.helper';\n\ndeclare let window: IMSDyn365Window;\n\n/**\n * CopyCart data action pre-hook\n * @param inputs Data action inputs\n */\nconst beforeCopyCart = async (inputs: IActionInput | IActionInput[]) => {\n // placeholder\n};\n\n/**\n * Fires an CheckOut event after CopyCart data action completed\n * @param _inputs Data action inputs\n * @param cart New checkout cart\n * @param actionContext Action context\n */\nconst afterCopyCart = async (_inputs: IActionInput | IActionInput[], cart: Cart | Cart[], actionContext: IActionContext) => {\n if (window && window._msdyn365 && window._msdyn365.telemetry) {\n const cartObject = Array.isArray(cart) ? cart[0] : cart;\n let cartLineProductUnits: IProductInfo[] = [];\n\n // Collect info on products in the cart\n if (cartObject && cartObject.CartLines && Array.isArray(cartObject.CartLines) && cartObject.CartLines.length > 0) {\n try {\n cartLineProductUnits = await getProductInfoFromCartLinesAsync(cartObject.CartLines, actionContext);\n } catch (error) {\n actionContext.telemetry.error('CopyCart post-data action hook failed to process cart lines.', error);\n }\n }\n\n // Fire Checkout event\n window._msdyn365.telemetry.logEvent(TelemetryEvent.CheckOut, {\n cartId: cartObject.Id,\n cartVersion: cartObject.Version ? cartObject.Version.toString() : '',\n products: cartLineProductUnits,\n orderId: cartObject.OrderNumber ? cartObject.OrderNumber.toString() : ''\n });\n }\n};\n\ncreateDataActionHook({\n actionId: '@msdyn365-commerce/retail-proxy/Carts/Copy',\n postReaderHook: afterCopyCart,\n preReaderHook: beforeCopyCart\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createDataActionHook, IActionContext, IActionInput } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { TelemetryEvent } from '@msdyn365-commerce/telemetry-internal';\nimport { getProductInfoFromSimpleProduct } from './telemetry.action.helper';\n\nconst beforeGetById = async (inputs: IActionInput | IActionInput[]) => {\n // placeholder\n};\n\nconst afterGetById = async (\n _inputs: IActionInput | IActionInput[],\n simpleProduct: SimpleProduct | SimpleProduct[],\n actionContext: IActionContext\n) => {\n simpleProduct = await Promise.resolve(Array.isArray(simpleProduct) ? simpleProduct[0] : simpleProduct);\n\n // If simple product result is defined run the post hook\n if (simpleProduct) {\n const productInfo = getProductInfoFromSimpleProduct(simpleProduct);\n actionContext.requestContext.telemetryData[productInfo.productSku] = productInfo;\n actionContext.requestContext.telemetryData[TelemetryEvent.ProductPageView] = productInfo ? [productInfo] : [];\n }\n};\n\ncreateDataActionHook({\n actionId: '@msdyn365-commerce/retail-proxy/Products/GetById',\n postReaderHook: afterGetById,\n preReaderHook: beforeGetById\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createDataActionHook, IActionContext, IActionInput } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getProductInfoFromSimpleProduct } from './telemetry.action.helper';\n\nconst beforeGetByIds = async (inputs: IActionInput | IActionInput[]) => {\n // placeholder\n};\n\nconst afterGetByIds = async (\n _inputs: IActionInput | IActionInput[],\n simpleProducts: SimpleProduct | SimpleProduct[],\n actionContext: IActionContext\n) => {\n if (!Array.isArray(simpleProducts)) {\n simpleProducts = [simpleProducts];\n }\n\n simpleProducts.forEach(async product => {\n if (product) {\n product = await Promise.resolve(product);\n const productInfo = getProductInfoFromSimpleProduct(product);\n actionContext.requestContext.telemetryData[productInfo.productSku] = productInfo;\n }\n });\n};\n\ncreateDataActionHook({\n actionId: '@msdyn365-commerce/retail-proxy/Products/GetByIds',\n postReaderHook: afterGetByIds,\n preReaderHook: beforeGetByIds\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createDataActionHook, IActionContext, IActionInput } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getProductInfoFromSimpleProduct } from './telemetry.action.helper';\n\nconst beforeGetVariantsByDimensionValues = async (inputs: IActionInput | IActionInput[]) => {\n // placeholder\n};\n\nconst afterGetVariantsByDimensionValues = async (\n _inputs: IActionInput | IActionInput[],\n simpleProducts: SimpleProduct | SimpleProduct[],\n actionContext: IActionContext\n) => {\n if (!Array.isArray(simpleProducts)) {\n simpleProducts = [simpleProducts];\n }\n\n simpleProducts.forEach(async product => {\n if (product) {\n product = await Promise.resolve(product);\n const productInfo = getProductInfoFromSimpleProduct(product);\n actionContext.requestContext.telemetryData[productInfo.productSku] = productInfo;\n }\n });\n};\n\ncreateDataActionHook({\n actionId: '@msdyn365-commerce/retail-proxy/Products/GetVariantsByDimensionValues',\n postReaderHook: afterGetVariantsByDimensionValues,\n preReaderHook: beforeGetVariantsByDimensionValues\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createDataActionHook, IActionContext, IActionInput, IMSDyn365Window } from '@msdyn365-commerce/core';\nimport { SalesOrder } from '@msdyn365-commerce/retail-proxy';\nimport { IProductInfo, IProductTransaction, TelemetryEvent } from '@msdyn365-commerce/telemetry-internal';\nimport { getProductInfoFromCartLinesAsync } from './telemetry.action.helper';\n\ndeclare let window: IMSDyn365Window;\n\n/**\n * Checkout data action pre-hook\n * @param inputs Data action inputs\n */\nconst beforePurchase = async (inputs: IActionInput | IActionInput[]) => {\n // placeholder\n};\n\n/**\n * Fires a Purchase event after Checkout data action completed\n * @param _inputs Data action inputs\n * @param salesOrder Sales order for transaction\n * @param actionContext Action context\n */\nconst afterPurchase = async (\n _inputs: IActionInput | IActionInput[],\n salesOrder: SalesOrder | SalesOrder[],\n actionContext: IActionContext\n) => {\n if (window && window._msdyn365 && window._msdyn365.telemetry) {\n const salesObject = Array.isArray(salesOrder) ? salesOrder[0] : salesOrder;\n let saleLineProductUnits: IProductInfo[] = [];\n\n // Collect info on products in the sales order\n if (salesObject && salesObject.SalesLines && Array.isArray(salesObject.SalesLines) && salesObject.SalesLines.length > 0) {\n try {\n saleLineProductUnits = await getProductInfoFromCartLinesAsync(salesObject.SalesLines, actionContext);\n } catch (error) {\n actionContext.telemetry.error('Checkout post-data action hook failed to process cart lines.', error);\n }\n }\n\n // Store the purchased product information so that we can avoid \"code triggered\" remove from cart telemetry event.\n actionContext.requestContext.telemetryData[TelemetryEvent.Purchase] = {\n id: salesObject.Id,\n affiliation: salesObject.ChannelId ? salesObject.ChannelId.toString() : '',\n revenue: salesObject.NetAmountWithoutTax,\n tax: salesObject.TaxAmount,\n // shippingCost?: // Confirm if it is delivery mode charge amount;\n products: saleLineProductUnits\n };\n\n // Fire Purchase event\n window._msdyn365.telemetry.logEvent(\n TelemetryEvent.Purchase,\n actionContext.requestContext.telemetryData[TelemetryEvent.Purchase]\n );\n }\n};\n\ncreateDataActionHook({\n actionId: '@msdyn365-commerce/retail-proxy/Carts/Checkout',\n postReaderHook: afterPurchase,\n preReaderHook: beforePurchase\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createDataActionHook, IActionContext, IActionInput } from '@msdyn365-commerce/core';\nimport { Cart } from '@msdyn365-commerce/retail-proxy';\n\nconst beforeRead = async (inputs: IActionInput | IActionInput[]) => {\n // placeholder\n};\n\nconst afterRead = async (_inputs: IActionInput | IActionInput[], cart: Cart | Cart[], actionContext: IActionContext) => {\n try {\n const activeCart = await Promise.resolve(Array.isArray(cart) ? cart[0] : cart);\n actionContext.requestContext.telemetryData.activeCart = activeCart;\n } catch (e) {\n actionContext.telemetry.debug('ReadCart post-data action hook failed.', e);\n }\n};\n\ncreateDataActionHook({\n actionId: '@msdyn365-commerce/retail-proxy/Carts/Read',\n postReaderHook: afterRead,\n preReaderHook: beforeRead\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createDataActionHook, IActionContext, IActionInput, IMSDyn365Window, TelemetryEvent } from '@msdyn365-commerce/core';\nimport { Cart, CartLine, IDataServiceRequest, IRemoveCartLinesParam } from '@msdyn365-commerce/retail-proxy';\nimport { IProductInfo, IProductTransaction } from '@msdyn365-commerce/telemetry-internal';\nimport { getProductInfoFromCartLinesAsync } from './telemetry.action.helper';\n\ndeclare let window: IMSDyn365Window;\n\n/**\n * Saves info on cart lines removed before calling data action\n * @param inputs Data action inputs\n * @param actionContext Action context\n */\nconst beforeRemoveFromCart = async (inputs: IActionInput | IActionInput[], actionContext: IActionContext) => {\n try {\n const actionInput = Array.isArray(inputs) ? inputs[0] : inputs;\n\n // If cart lines were removed\n if (actionInput.queryParams && typeof actionInput.queryParams === 'function') {\n const removeCartLinesParams = actionInput.queryParams();\n if (removeCartLinesParams && removeCartLinesParams.cartLineIds) {\n // Save info on removed cart lines for post data action hook to pick up\n actionContext.requestContext.telemetryData.removedCartLineIds = removeCartLinesParams.cartLineIds;\n return;\n }\n }\n actionContext.telemetry.debug('RemoveFromCart pre-data action hook failed - No removed cart lines found');\n } catch (e) {\n actionContext.telemetry.debug('RemoveFromCart pre-data action hook failed.', e);\n }\n};\n\n/**\n * Fires a RemoveFromCart event after RemoveCartLines data action completed\n * @param _inputs Data action inputs\n * @param cart New cart object after cart lines have been removed\n * @param actionContext Action context\n */\nconst afterRemoveFromCart = async (_inputs: IActionInput | IActionInput[], cart: Cart | Cart[], actionContext: IActionContext) => {\n if (window && window._msdyn365 && window._msdyn365.telemetry) {\n const cartObject = Array.isArray(cart) ? cart[0] : cart;\n const removeCartLineIds = actionContext.requestContext.telemetryData.removedCartLineIds;\n const activeCart = actionContext.requestContext.telemetryData.activeCart;\n const productTransaction = actionContext.requestContext.telemetryData[TelemetryEvent.Purchase];\n const removedCartLines: CartLine[] = [];\n let removedProducts: IProductInfo[] = [];\n\n // Collect info on products removed from cart\n if (removeCartLineIds && activeCart && activeCart.CartLines) {\n activeCart.CartLines.forEach((cartLine: CartLine) => {\n if (\n cartLine.ProductId &&\n removeCartLineIds.indexOf(cartLine.LineId ? cartLine.LineId : '') !== -1 &&\n !(\n productTransaction &&\n productTransaction.products &&\n productTransaction.products.some(product => +product.productSku === cartLine.ProductId)\n )\n ) {\n removedCartLines.push(cartLine);\n }\n });\n\n if (removedCartLines.length > 0) {\n try {\n removedProducts = await getProductInfoFromCartLinesAsync(removedCartLines, actionContext);\n } catch (error) {\n actionContext.telemetry.error('RemoveCartLines post-data action hook failed to process cart lines.', error);\n }\n }\n }\n\n // Fire RemoveFromCart event if cart lines were removed\n if (removedCartLines && removedCartLines.length > 0) {\n window._msdyn365.telemetry.logEvent(TelemetryEvent.RemoveFromCart, {\n cartId: cartObject.Id,\n cartVersion: cartObject.Version ? cartObject.Version.toString() : '',\n products: removedProducts,\n orderId: cartObject.OrderNumber ? cartObject.OrderNumber.toString() : ''\n });\n } else {\n actionContext.telemetry.debug('No RemoveFromCart event fired, no removed cart lines found');\n }\n }\n};\n\ncreateDataActionHook({\n actionId: '@msdyn365-commerce/retail-proxy/Carts/RemoveCartLines',\n postReaderHook: afterRemoveFromCart,\n preReaderHook: beforeRemoveFromCart\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core-internal';\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getByIdAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { IProductInfo } from '@msdyn365-commerce/telemetry-internal';\n\n/**\n * Converts cart line products into promise of array of product info\n * @param cartLines Cart Lines with product info to collect\n * @param actionContext Action context\n * @returns Array of product info\n */\nexport const getProductInfoFromCartLinesAsync = async (cartLines: CartLine[], actionContext: IActionContext): Promise => {\n if (actionContext.requestContext.channel === undefined) {\n throw new Error('Unable to make product call, channel ID not provided');\n }\n\n const productPromises: Promise[] = [];\n\n // Call GetById API for all products in cartLines\n for (let i = 0; i < cartLines.length; i++) {\n const cartLine: CartLine = cartLines[i];\n\n if (cartLine.ProductId) {\n // The product id in cartLine actually contains recordId and not master product id so we can use it up here to lookup product.\n productPromises.push(\n getByIdAsync({ callerContext: actionContext }, cartLine.ProductId, actionContext.requestContext.channel.RecordId).then(\n result => {\n // Construct basic IProductInfo object for product\n const productInfo = getProductInfoFromSimpleProduct(result);\n\n // Attach fields from the CartLine\n productInfo.productPrice = cartLine.Price ? cartLine.Price.toString() : '';\n productInfo.productQuantity = cartLine.Quantity ? cartLine.Quantity.toString() : '';\n\n return productInfo;\n },\n reason => {\n throw new Error(`Failed to get product details for product ${cartLine.ProductId}.\\n${reason}`);\n }\n )\n );\n }\n }\n\n // Return promise for array of product results\n return Promise.all(productPromises);\n};\n\n/**\n * Converts a SimpleProduct object into an IProductInfo object\n * @param simpleProduct Simple Product object\n * @returns Populated IProductInfo\n */\nexport const getProductInfoFromSimpleProduct = (simpleProduct: SimpleProduct): IProductInfo => {\n const recordId = simpleProduct.RecordId || '';\n\n return {\n // If master product id is not available then product record id is master product id\n productId: simpleProduct.MasterProductId ? simpleProduct.MasterProductId.toString() : recordId.toString(),\n productSku: recordId ? recordId.toString() : '',\n productName: simpleProduct.Name || simpleProduct.Description || '',\n productPrice: simpleProduct.Price ? simpleProduct.Price.toString() : '',\n productChannelId: '', // Not needed for each product, sent as part of all events\n productChannelName: '',\n productCategoryId: '',\n productCategoryName: '',\n productQuantity: '', // Cannot be deteremined from SimpleProduct, will be added from CartLine later\n productCurrency: '' // Not needed for each product, sent as part of all events with product data\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createDataActionHook, IActionContext, IActionInput, TelemetryEvent } from '@msdyn365-commerce/core';\nimport { IMSDyn365Window } from '@msdyn365-commerce/core-internal';\nimport { Cart, CartLine, IDataServiceRequest, IUpdateCartLinesParam } from '@msdyn365-commerce/retail-proxy';\nimport { IProductInfo } from '@msdyn365-commerce/telemetry-internal';\nimport { getProductInfoFromCartLinesAsync } from './telemetry.action.helper';\n\ndeclare let window: IMSDyn365Window;\n\n/**\n * Saves info on cart lines updated before calling data action\n * @param inputs Data action inputs\n * @param actionContext Action context\n */\nconst beforeUpdateCart = async (inputs: IActionInput | IActionInput[], actionContext: IActionContext) => {\n try {\n const actionInput = Array.isArray(inputs) ? inputs[0] : inputs;\n\n // If cart lines were updated\n if (actionInput.queryParams && typeof actionInput.queryParams === 'function') {\n const updateCartLinesParams = actionInput.queryParams();\n if (updateCartLinesParams && updateCartLinesParams.cartLines) {\n // Save info on updated cart lines for post data action hook to pick up\n actionContext.requestContext.telemetryData.updatedCartLines = updateCartLinesParams.cartLines;\n return;\n }\n }\n actionContext.telemetry.debug('UpdateCart pre-data action hook failed - No updated cart lines found');\n } catch (e) {\n actionContext.telemetry.debug('UpdateCart pre-data action hook failed.', e);\n }\n};\n\n/**\n * Fires an UpdateInCart event after UpdateCartLines data action completed\n * @param _inputs Data action inputs\n * @param cart New cart object after cart lines have been added\n * @param actionContext Action context\n */\nconst afterUpdateCart = async (_inputs: IActionInput | IActionInput[], cart: Cart | Cart[], actionContext: IActionContext) => {\n if (window && window._msdyn365 && window._msdyn365.telemetry) {\n const cartObject = Array.isArray(cart) ? cart[0] : cart;\n const updatedCartLines = actionContext.requestContext.telemetryData.updatedCartLines;\n let updatedProducts: IProductInfo[] = [];\n\n // Collect info on products updated in cart\n if (updatedCartLines) {\n try {\n updatedProducts = await getProductInfoFromCartLinesAsync(updatedCartLines, actionContext);\n } catch (error) {\n actionContext.telemetry.error('UpdateCartLines post-data action hook failed to process cart lines.', error);\n }\n }\n\n // Fire UpdateInCart event\n window._msdyn365.telemetry.logEvent(TelemetryEvent.UpdateInCart, {\n cartId: cartObject.Id,\n cartVersion: cartObject.Version ? cartObject.Version.toString() : '',\n products: updatedProducts,\n orderId: cartObject.OrderNumber ? cartObject.OrderNumber.toString() : ''\n });\n }\n};\n\ncreateDataActionHook({\n actionId: '@msdyn365-commerce/retail-proxy/Carts/UpdateCartLines',\n postReaderHook: afterUpdateCart,\n preReaderHook: beforeUpdateCart\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n getFriendlyName,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport {\n buildCacheKeyWithUrlTokens,\n CurrentCategoryInput,\n getCategoryUrl,\n getCurrentCategory,\n removeDomainQspFromUrl\n} from '@msdyn365-commerce-modules/retail-actions';\n\nimport { IDefaultPageSummaryConfig } from '../default-page-summary/default-page-summary.props.autogenerated';\nimport { IPageSummaryData } from '../IPageSummaryData';\n\n/**\n * Category Page Summary Input\n */\nexport class CategoryPageSummaryInput implements IActionInput {\n public requestContext: IRequestContext;\n\n public config: IDefaultPageSummaryConfig;\n\n constructor(config: IDefaultPageSummaryConfig, requestContext: IRequestContext) {\n this.config = config || {};\n this.requestContext = requestContext;\n }\n\n public getCacheObjectType = (): string => 'CategoryPageSummary';\n\n public getCacheKey = (): string => buildCacheKeyWithUrlTokens('CategoryPageSummary', this.requestContext);\n\n public dataCacheType = (): CacheType => 'request';\n}\n\nconst createGetCurrentCategoryInput = (inputData: IActionContext): CurrentCategoryInput => {\n if (inputData && inputData.requestContext) {\n return new CurrentCategoryInput(inputData.requestContext);\n }\n\n throw new Error('Please specify categoryId query string in request.');\n};\n/**\n * Get skip count.\n * @param inputData\n */\nfunction getSkipCount(inputData: ICreateActionContext, IGeneric>): string | undefined {\n return inputData && inputData.requestContext && inputData.requestContext.query && inputData.requestContext.query.skip;\n}\n\nconst action = async (input: CategoryPageSummaryInput, context: IActionContext): Promise => {\n const { config } = input;\n let currentCategoryResult;\n try {\n currentCategoryResult = await getCurrentCategory(createGetCurrentCategoryInput(context), context);\n } catch {\n // Do nothing, if the action fails fallback to values defined in data\n }\n if (currentCategoryResult) {\n const currentCategory = { ...currentCategoryResult };\n let categoryUrl: string | undefined;\n try {\n // Reset category's name neutralizedName\n const localName = getFriendlyName(context.requestContext.locale, currentCategory.NameTranslations);\n const neutralizedName = currentCategory.NeutralizedName || currentCategory.Name;\n currentCategory.Name = localName;\n currentCategory.NeutralizedName = neutralizedName;\n categoryUrl = getCategoryUrl(currentCategory);\n\n const canonicalDomain = context.requestContext.canonicalDomain;\n if (categoryUrl && canonicalDomain) {\n categoryUrl = `https://${canonicalDomain}${categoryUrl}`.toLocaleLowerCase();\n const skipCount = getSkipCount(context);\n const Url = new URL(categoryUrl);\n const urlParams: URLSearchParams = new URLSearchParams(Url.search);\n if (skipCount) {\n urlParams.set('skip', skipCount);\n }\n Url.search = urlParams.toString();\n categoryUrl = Url.toString();\n categoryUrl = removeDomainQspFromUrl(categoryUrl, context.requestContext);\n } else {\n categoryUrl = undefined;\n }\n } catch {\n categoryUrl = undefined;\n }\n return {\n title: currentCategory.Name,\n sharingImageUrl: currentCategory.OfflineImage,\n canonicalUrl: categoryUrl,\n faviconUrl: config && config.faviconUrl\n };\n\n // If the action fails fallback to values defined from data\n } else if (config) {\n return {\n title: config.title,\n sharingImageUrl: config.sharingImage && config.sharingImage.src,\n faviconUrl: config && config.faviconUrl\n };\n }\n return {};\n};\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/page-summary/category-page-summary',\n action: >action,\n input: (args: ICreateActionContext) => {\n return new CategoryPageSummaryInput(args.config, args.requestContext);\n }\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { buildCacheKeyWithUrlTokens, removeDomainQspFromUrl } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { IDefaultPageSummaryConfig } from './default-page-summary.props.autogenerated';\n\nexport interface IPageSummaryData {\n title?: string;\n description?: string;\n keywords?: string;\n sharingImageUrl?: string;\n canonicalUrl?: string;\n faviconUrl?: string;\n}\n\n/**\n * Page Summary Input\n */\nexport class PageSummaryInput implements IActionInput {\n public requestContext: IRequestContext;\n\n public config: IDefaultPageSummaryConfig;\n\n constructor(config: IDefaultPageSummaryConfig, requestContext: IRequestContext) {\n this.config = config || {};\n this.requestContext = requestContext;\n }\n\n public getCacheObjectType = (): string => 'PageSummary';\n\n public getCacheKey = (): string => `${buildCacheKeyWithUrlTokens('PageSummary', this.requestContext)}-${this.config.title}`;\n\n public dataCacheType = (): CacheType => 'request';\n}\n\nconst action = async (input: PageSummaryInput, context: IActionContext): Promise => {\n const { config } = input;\n return {\n title: config && config.title,\n description: config && config.description,\n keywords: config && config.keywords,\n sharingImageUrl: config && config.sharingImage && config.sharingImage.src,\n canonicalUrl:\n context.requestContext && context.requestContext.canonicalUrl\n ? removeDomainQspFromUrl(context.requestContext.canonicalUrl, context.requestContext)\n : undefined,\n faviconUrl: config && config.faviconUrl\n };\n};\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/page-summary/default-page-summary',\n action: >action,\n input: (args: ICreateActionContext) => {\n return new PageSummaryInput(args.config, args.requestContext);\n }\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { Image, ISubList } from '@msdyn365-commerce-modules/data-types';\nimport { buildCacheKeyWithUrlTokens, getList, ListInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { IProductItem } from '@msdyn365-commerce-modules/retail-actions/dist/types/get-list';\n\nimport { IDefaultPageSummaryConfig } from '../default-page-summary/default-page-summary.props.autogenerated';\nimport { IPageSummaryData } from '../IPageSummaryData';\n\n/**\n * List Page Summary Input\n */\nexport class ListPageSummaryInput implements IActionInput {\n public requestContext: IRequestContext;\n\n public config: IDefaultPageSummaryConfig;\n\n constructor(config: IDefaultPageSummaryConfig, requestContext: IRequestContext) {\n this.config = config || {};\n this.requestContext = requestContext;\n }\n\n public getCacheObjectType = (): string => 'ListPageSummary';\n\n public getCacheKey = (): string => buildCacheKeyWithUrlTokens('ListPageSummary', this.requestContext);\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * List item type enum.\n */\nenum ListItemType {\n list = 'list',\n product = 'product'\n}\n\n/**\n * Get the url of sub list.\n * @param listName\n * @param sitePath\n */\nfunction getSubListUrl(listName: string, sitePath: string): string {\n if (!listName) {\n return '';\n }\n\n if (!sitePath) {\n return `/${listName}.l`;\n }\n\n // SitePath has a leading '/'\n return `${sitePath}/${listName}.l`;\n}\n\n/**\n * Get sub list item.\n * @param item\n * @param sitePathOfRequest\n */\nfunction getSubListItem(item: IGeneric, sitePathOfRequest: string): ISubList {\n const imageList: Image[] = getImages(item.fields.content.images);\n\n const sublistHref = getSubListUrl(item.fields._name, sitePathOfRequest);\n return {\n Title: item.fields.content.title,\n Description: item.fields.content.description,\n ShortDescription: item.fields.content.shortDescription,\n BackgroundColor: item.fields.content.backgroundColor,\n ForegroundColor: item.fields.content.foregroundColor,\n Href: sublistHref,\n Images: imageList\n };\n}\n\n/**\n * Get site path.\n * @param inputData\n */\nfunction getSitePath(inputData: ICreateActionContext, IGeneric>): string {\n return inputData && inputData.requestContext && inputData.requestContext.sitePath ? inputData.requestContext.sitePath : '';\n}\n\n/**\n * Get items per page.\n * @param inputData\n */\nfunction getItemsPerPage(inputData: ICreateActionContext, IGeneric>): number {\n if (!inputData || !inputData.config || !inputData.config.itemsPerPage) {\n return 50;\n }\n\n const result = Number(inputData.config.itemsPerPage);\n if (isNaN(result)) {\n return 50;\n }\n\n return result;\n}\n\n/**\n * Get skip count.\n * @param inputData\n */\nfunction getSkipCount(inputData: ICreateActionContext, IGeneric>): number {\n return inputData && inputData.requestContext && inputData.requestContext.query && inputData.requestContext.query.skipCount\n ? Number(inputData.requestContext.query.skipCount)\n : 0;\n}\n\n/**\n * Get images.\n * @param images\n */\nfunction getImages(images: IGeneric[]): Image[] {\n const resultImageList: Image[] = [];\n\n if (!images) {\n return resultImageList;\n }\n\n images.forEach(item => {\n if (item && item.image && item.image.href) {\n // Add image item\n const imageItem: Image = {\n href: item.image.href,\n altText: item.image.altText,\n title: item.image.title,\n width: item.image.width,\n height: item.image.height\n };\n\n resultImageList.push(imageItem);\n }\n });\n\n return resultImageList;\n}\n\n/**\n * Get input list data.\n * @param inputData\n */\nfunction getInputListData(inputData: ICreateActionContext, IGeneric>): IGeneric {\n let listData =\n !inputData || !inputData.requestContext || !inputData.requestContext.pageData ? null : inputData.requestContext.pageData.list;\n if (\n !inputData ||\n !inputData.requestContext ||\n !inputData.requestContext.pageData ||\n !inputData.requestContext.pageData.list ||\n !inputData.requestContext.pageData.list.content ||\n !inputData.requestContext.pageData.list.content.items ||\n !inputData.requestContext.pageData.list.content.title ||\n !inputData.requestContext.pageData.list._id\n ) {\n if (\n !inputData ||\n !inputData.data ||\n !inputData.data.list ||\n !inputData.data.list.content ||\n !inputData.data.list.content.items ||\n !inputData.data.list.content.title ||\n !inputData.data.list._id\n ) {\n console.error('data is not well defined for list action input');\n throw new Error('data is not well defined for list action input');\n }\n\n listData = inputData.data.list;\n }\n return listData;\n}\n\nconst createGetListInput = (inputData: IActionContext): ListInput => {\n const listData: IGeneric = getInputListData(inputData);\n const listItems: (IProductItem[] | ISubList)[] = [];\n let productList: IProductItem[] = [];\n\n const parentImageList: Image[] = getImages(listData.content.images);\n\n const itemsPerPage = getItemsPerPage(inputData);\n const skipCount = getSkipCount(inputData);\n\n // This is the list contains all product and will be used to call getSimpleProducts data action.\n const productItems: IProductItem[] = [];\n const sum = skipCount + itemsPerPage;\n for (let index = skipCount; index < listData.content.items.length && index < sum; index++) {\n const item = listData.content.items[index];\n if (item.type === ListItemType.list) {\n if (!item.fields || !item.fields.content || !item.fields.content.title) {\n console.error(`sublist item fields, content or title missing in list ${listData._id}`);\n continue;\n }\n\n // If any elements in product list, then copy it and add to list items\n if (productList.length > 0) {\n const clonedList = [...productList];\n listItems.push(clonedList);\n productList = [];\n }\n\n // Build and add sublist item\n listItems.push(getSubListItem(item, getSitePath(inputData)));\n }\n\n if (item.type === ListItemType.product) {\n if (!item.fields || !item.fields.recordId) {\n console.error(`product item missing recordId in list ${listData._id}`);\n continue;\n }\n\n // Add product item\n const productItem: IProductItem = {\n RecordId: item.fields.recordId,\n CatalogId: item.fields.catalogId || '0'\n };\n\n productList.push(productItem);\n productItems.push(productItem);\n }\n }\n\n // Save the last portion of product items.\n if (productList.length > 0) {\n listItems.push(productList);\n }\n\n return new ListInput(\n listData._id,\n listData.content.title,\n listData.content.description,\n listData.content.shortDescription,\n listData.content.backgroundColor,\n listData.content.foregroundColor,\n parentImageList,\n listItems,\n productItems,\n listData.content.items.length,\n itemsPerPage,\n skipCount\n );\n};\n\nconst action = async (input: ListPageSummaryInput, context: IActionContext): Promise => {\n const { config } = input;\n let listData;\n try {\n listData = await getList(createGetListInput(context), context);\n } catch {\n // Do nothing, if there's an error running the action fall back to values defined from data\n }\n if (listData && listData.Title) {\n return {\n title: listData.Title,\n description: listData.Description\n };\n\n // If the action fails fallback to values defined from data\n } else if (config) {\n return {\n title: config.title,\n description: config.description\n };\n }\n return {};\n};\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/page-summary/list-page-summary',\n action: >action,\n input: (args: ICreateActionContext) => {\n return new ListPageSummaryInput(args.config, args.requestContext);\n }\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings,\n ICreateActionContext,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getAttributeValuesAsync, getByIdsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport {\n ArrayExtensions,\n buildCacheKey,\n generateImageUrl,\n getProductUrlSync,\n getSelectedProductIdFromActionInput,\n QueryResultSettingsProxy,\n removeDomainQspFromUrl\n} from '@msdyn365-commerce-modules/retail-actions';\n\nimport { IPageSummaryData } from '../IPageSummaryData';\nimport { IProductPageSummaryConfig } from './product-page-summary.props.autogenerated';\n\n/**\n * Product Page Summary Input.\n */\nexport class ProductPageSummaryInput implements IActionInput {\n public apiSettings: ICommerceApiSettings;\n\n public config: IProductPageSummaryConfig;\n\n public productId: number;\n\n public catalogId?: number;\n\n public constructor(\n config: IProductPageSummaryConfig,\n apiSettings: ICommerceApiSettings,\n productId: number,\n requestContext?: IRequestContext\n ) {\n this.config = config || {};\n this.apiSettings = apiSettings;\n this.productId = productId;\n\n if (requestContext) {\n this.catalogId = getCatalogId(requestContext);\n }\n }\n\n public getCacheObjectType = (): string => 'ProductPageSummary';\n\n public getCacheKey = (): string =>\n `${buildCacheKey('ProductPageSummary', this.apiSettings)}-${this.config.title}-${this.productId}-${this.catalogId ?? 0}`;\n\n public dataCacheType = (): CacheType => 'application';\n}\n\nexport interface IProductPageSummary extends IPageSummaryData {\n price?: number;\n productId?: number;\n productBrand?: string;\n}\n\nconst createInput = (args: ICreateActionContext) => {\n const productId = getSelectedProductIdFromActionInput(args);\n\n if (productId) {\n return new ProductPageSummaryInput(\n args.config,\n args.requestContext.apiSettings,\n +productId,\n args.requestContext\n );\n }\n throw new Error('Unable to create ProductPageSummaryAction input, no productId found on module config or query');\n};\n\n// Checks product attributes for the presence of brand attribute to extract the brand name for product metadata\nconst getProductBrand = async (\n context: IActionContext,\n recordId: number,\n channelId: number,\n catalogId: number\n): Promise => {\n const productAttributes = await getAttributeValuesAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\n },\n recordId,\n channelId,\n catalogId\n );\n for (const productAttribute of productAttributes) {\n if (productAttribute.Name === 'Brand') {\n return productAttribute.TextValue;\n }\n }\n return;\n};\n\nconst action = async (input: ProductPageSummaryInput, context: IActionContext): Promise => {\n const { config, productId, apiSettings } = input;\n let simpleProductsData: SimpleProduct[] | undefined;\n try {\n simpleProductsData = ArrayExtensions.validValues(\n await getByIdsAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\n },\n apiSettings.channelId,\n [productId],\n null,\n input.catalogId ?? 0\n )\n );\n } catch {\n // Do nothing, if there's an error we fall back to values defined from config\n }\n if (ArrayExtensions.hasElements(simpleProductsData)) {\n const simpleProductData = simpleProductsData[0];\n let productUrl: string | undefined;\n try {\n productUrl = getProductUrlSync(simpleProductData, context);\n const canonicalDomain = context.requestContext.canonicalDomain;\n if (productUrl && canonicalDomain) {\n productUrl = `https://${canonicalDomain}${productUrl}`.toLocaleLowerCase();\n productUrl = removeDomainQspFromUrl(productUrl, context.requestContext);\n } else {\n productUrl = undefined;\n }\n } catch {\n productUrl = undefined;\n }\n let productBrand: string | undefined;\n try {\n productBrand = await getProductBrand(context, productId, apiSettings.channelId, input.catalogId ?? 0);\n } catch {\n productBrand = undefined;\n }\n return {\n title: simpleProductData.Name,\n description: simpleProductData.Description,\n sharingImageUrl: generateImageUrl(simpleProductData.PrimaryImageUrl, apiSettings),\n canonicalUrl: productUrl,\n faviconUrl: config && config.faviconUrl,\n productId: simpleProductData.RecordId,\n price: simpleProductData.AdjustedPrice,\n productBrand\n };\n\n // If the action fails fallback to values defined from config\n } else if (config) {\n return {\n title: config.title,\n description: config.description,\n sharingImageUrl: config.sharingImage && config.sharingImage.src,\n faviconUrl: config && config.faviconUrl\n };\n }\n return {};\n};\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/page-summary/product-page-summary',\n action: >action,\n input: createInput\n});\n","module.exports = React;","module.exports = ReactDOM;"],"names":["binding","modules","dataActions","registerActionId","actionPath","default","prototype","id","Object","keys","forEach","exportName","Action","require","window","__bindings__","packageDataActions","GetBotFrameworkInput","constructor","getCacheKey","getCacheObjectType","dataCacheType","Msdyn365","action","async","input","ctx","ISecretValue","msdyn365Commerce","getSecretValue","requestContext","apiSettings","baseUrl","apiToken","value","args","createDataActionHook","actionId","postReaderHook","_inputs","cart","actionContext","_msdyn365","telemetry","cartObject","Array","isArray","addedCartLines","telemetryData","addedProducts","getProductInfoFromCartLinesAsync","error","logEvent","TelemetryEvent","cartId","Id","cartVersion","Version","toString","products","orderId","OrderNumber","preReaderHook","inputs","actionInput","queryParams","addCartLinesParams","cartLines","debug","e","cartLineProductUnits","CartLines","length","simpleProduct","Promise","resolve","productInfo","getProductInfoFromSimpleProduct","productSku","simpleProducts","product","salesOrder","salesObject","saleLineProductUnits","SalesLines","affiliation","ChannelId","revenue","NetAmountWithoutTax","tax","TaxAmount","activeCart","removeCartLineIds","removedCartLineIds","productTransaction","removedCartLines","removedProducts","cartLine","ProductId","indexOf","LineId","some","push","removeCartLinesParams","cartLineIds","undefined","channel","Error","productPromises","i","getByIdAsync","callerContext","RecordId","then","result","productPrice","Price","productQuantity","Quantity","reason","all","recordId","productId","MasterProductId","productName","Name","Description","productChannelId","productChannelName","productCategoryId","productCategoryName","productCurrency","updatedCartLines","updatedProducts","updateCartLinesParams","CategoryPageSummaryInput","config","buildCacheKeyWithUrlTokens","this","createObservableDataAction","context","currentCategoryResult","getCurrentCategory","inputData","CurrentCategoryInput","createGetCurrentCategoryInput","currentCategory","categoryUrl","localName","getFriendlyName","locale","NameTranslations","neutralizedName","NeutralizedName","getCategoryUrl","canonicalDomain","toLocaleLowerCase","skipCount","query","skip","Url","URL","urlParams","URLSearchParams","search","set","removeDomainQspFromUrl","title","sharingImageUrl","OfflineImage","canonicalUrl","faviconUrl","sharingImage","src","PageSummaryInput","description","keywords","ListItemType","ListPageSummaryInput","getSubListItem","item","sitePathOfRequest","imageList","getImages","fields","content","images","sublistHref","listName","_name","sitePath","Title","ShortDescription","shortDescription","BackgroundColor","backgroundColor","ForegroundColor","foregroundColor","Href","Images","getSitePath","resultImageList","image","href","imageItem","altText","width","height","createGetListInput","listData","pageData","list","items","_id","data","console","getInputListData","listItems","productList","parentImageList","itemsPerPage","Number","isNaN","getItemsPerPage","getSkipCount","productItems","sum","index","type","clonedList","productItem","CatalogId","catalogId","ListInput","getList","ProductPageSummaryInput","buildCacheKey","getCatalogId","simpleProductsData","ArrayExtensions","getByIdsAsync","queryResultSettings","QueryResultSettingsProxy","channelId","simpleProductData","productUrl","productBrand","getProductUrlSync","productAttributes","getAttributeValuesAsync","productAttribute","TextValue","getProductBrand","generateImageUrl","PrimaryImageUrl","price","AdjustedPrice","getSelectedProductIdFromActionInput","module","exports","React","ReactDOM"],"sourceRoot":""}