{"version":3,"file":"static/js/833f606ca515c1a70de5.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/../../src/get-categories-hierarchy.ts?acde","webpack://Msdyn365.Commerce.Online/../../src/get-categories.ts?8dc6","webpack://Msdyn365.Commerce.Online/../../../src/utilities/QueryResultSettingsProxy.ts?5e44","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/Url-builder/parameterize.ts?f5a5","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/Url-builder/category-url-builder.ts?e564","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/Url-builder/invoice-url-builder.ts?d542","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/Url-builder/product-url-builder.ts?baf1","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/extensions/array-extensions.ts?1a2a","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/extensions/enum-extensions.ts?cf51","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/extensions/string-extensions.ts?ab9f","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/extensions/object-extensions.ts?6388","webpack://Msdyn365.Commerce.Online/../../../src/utilities/input-data-parser.ts?027a","webpack://Msdyn365.Commerce.Online/../../../src/utilities/utils.ts?fbc0"],"sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { Category, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\n\nimport getCategoryAction, { CategoriesInput as RawCategoriesInput } from './get-categories';\nimport { getCategoryUrl } from './utilities/Url-builder';\nimport { buildCacheKey } from './utilities/utils';\n\n/**\n * Input for get-categories data action.\n */\nexport class CategoriesInput implements IActionInput {\n public readonly maxItems: number;\n\n public readonly channelId: number;\n\n private readonly catalogId: number;\n\n private readonly sitePath: string;\n\n private readonly _mappedToHierarchy: boolean;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n private readonly locale?: string;\n\n public constructor(context: IRequestContext, mappedToHierarchy: boolean, maxItems?: number) {\n this._mappedToHierarchy = mappedToHierarchy;\n this.maxItems = maxItems || 250;\n this.channelId = context && context.apiSettings && context.apiSettings.channelId ? +context.apiSettings.channelId : 0;\n this.sitePath = (context && context.sitePath) || '';\n this.apiSettings = context.apiSettings;\n this.locale = context.locale || '';\n this.catalogId = getCatalogId(context);\n }\n\n public getCacheKey = () =>\n buildCacheKey(`${this.channelId}|${this.sitePath}|top-${this.maxItems || 250} | ${this.catalogId}`, this.apiSettings, this.locale);\n\n public getCacheObjectType = () => (this._mappedToHierarchy ? 'CategoryHierarchy' : 'Category');\n\n public dataCacheType = (): CacheType => 'request';\n\n public getLocale = (): string => this.locale || '';\n}\n\nconst getFriendlyName = (locale?: string, nameTranslations?: TextValueTranslation[]): string | undefined => {\n let nameTranslation: TextValueTranslation | undefined;\n if (locale && nameTranslations && nameTranslations.length > 0) {\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\n }\n\n return nameTranslation && nameTranslation.Text;\n};\n\nexport interface ICategoryMap {\n [RecordId: number]: CategoryHierarchy;\n}\n\n/**\n * Creates a hierarchy of categories based on the ParentCategory property.\n * @param categoryList Categories that will be converted into a hierarchy.\n * @param ctx\n * @param locale\n * @returns Hierarchy of categories in array.\n */\nexport const mapCategoryToHierarchy = (categoryList: Category[], ctx: IActionContext, locale?: string): CategoryHierarchy[] => {\n if (!categoryList || categoryList.length === 0) {\n return [];\n }\n\n const categoryMap: ICategoryMap = categoryList.reduce((memo: ICategoryMap, category: Category) => {\n const localName = getFriendlyName(locale, category.NameTranslations);\n const categoryHierarchy = { ...category };\n categoryHierarchy.NeutralizedName = category.Name;\n categoryHierarchy.Name = localName || categoryHierarchy.NeutralizedName;\n memo[category.RecordId] = categoryHierarchy;\n return memo;\n }, {});\n\n let zeroCategory = categoryMap[0];\n\n Object.keys(categoryMap).forEach((id: string) => {\n const element = categoryMap[+id];\n const parentId = element.ParentCategory;\n element.Url = getCategoryUrl(element, ctx, categoryMap);\n if (parentId === 0) {\n zeroCategory = element;\n return;\n }\n\n const parent = parentId && categoryMap[parentId];\n if (parent) {\n parent.Children = parent.Children || [];\n parent.Children.push(element);\n }\n });\n\n return (zeroCategory && zeroCategory.Children) || [];\n};\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData\n */\nexport const createCategoriesHierarchyInput = (inputData: ICreateActionContext>): IActionInput => {\n const topItems = inputData.config && inputData.config.topCategories && Number.parseInt(inputData.config.topCategories, 10);\n return new CategoriesInput(inputData.requestContext, true, topItems);\n};\n\n/**\n * Calls the Retail API and returns all the categories as a hierarchy.\n * @param input\n * @param ctx\n */\nexport async function getCategoryHierarchyAction(input: CategoriesInput, ctx: IActionContext): Promise {\n const categories = await getCategoryAction(new RawCategoriesInput(ctx.requestContext, false, input.maxItems), ctx);\n return mapCategoryToHierarchy(categories, ctx, input.getLocale());\n}\n\nexport const getCategoryHierarchyActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-categories-hierarchy',\n action: >getCategoryHierarchyAction,\n input: createCategoriesHierarchyInput\n});\n\nexport default getCategoryHierarchyActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { CategoriesDataActions } from '@msdyn365-commerce/retail-proxy';\n\n/**\n * Input for get-categories data action.\n */\nexport class CategoriesInput implements IActionInput {\n public readonly maxItems: number;\n\n public readonly channelId: number;\n\n public readonly catalogId?: number;\n\n private readonly _mappedToHierarchy: boolean;\n\n public constructor(context: IRequestContext, mappedToHierarchy: boolean, maxItems?: number) {\n this._mappedToHierarchy = mappedToHierarchy;\n this.maxItems = maxItems || 250;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required.\n this.channelId = context?.apiSettings?.channelId ? Number(context.apiSettings.channelId) : 0;\n this.catalogId = getCatalogId(context);\n }\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string => `${this.channelId}|top-${this.maxItems || 250}|${this.catalogId ?? 0}`;\n\n /**\n * Get Cache type Name.\n * @returns - Cache name string.\n */\n public getCacheObjectType = (): string => (this._mappedToHierarchy ? 'CategoryHierarchy' : 'Category');\n\n /**\n * Get Cache type.\n * @returns - CacheType enum.\n */\n public dataCacheType = (): CacheType => 'application';\n}\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData -- Input data.\n * @returns -- IActionInput.\n */\nexport const createCategoriesInput = (inputData: ICreateActionContext>): IActionInput => {\n const topItems = inputData.config?.topCategories && Number.parseInt(inputData.config.topCategories, 10);\n return new CategoriesInput(inputData.requestContext, false, topItems);\n};\n\n/**\n * Calls the Retail API and returns all the categories as a flat list.\n * @param input - Input.\n * @param ctx - Context.\n * @returns - CategoryHierarchy.\n */\nexport async function getCategoryAction(input: CategoriesInput, ctx: IActionContext): Promise {\n return ((await CategoriesDataActions.getCategoriesAsync(\n {\n callerContext: ctx\n },\n input.channelId,\n input.catalogId\n )) as unknown) as CategoryHierarchy[];\n}\n\n/**\n * The getCategory Data Action.\n */\nexport const getCategoryActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-categories',\n action: getCategoryAction as IAction,\n input: createCategoriesInput\n});\n\nexport default getCategoryActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IAny, ICreateActionContext, IGeneric, IRequestContext } from '@msdyn365-commerce/core';\nimport { QueryResultSettings, SortColumn } from '@msdyn365-commerce/retail-proxy';\n\nimport { IQueryResultSettingsModuleConfig } from './IQueryResultSettingsModuleConfig';\n\n/**\n * Wrapper for query result settings, which guarantees some properties that are optional in the real subject\n * and includes some common utilities for data actions.\n */\nexport class QueryResultSettingsProxy {\n // Real subject\n private readonly queryResultSettings: QueryResultSettings;\n\n /**\n * Factory method for data actions.\n * @param inputData - Input data.\n * @returns - Returns query result settings proxy.\n */\n public static fromInputData(inputData: ICreateActionContext>): QueryResultSettingsProxy {\n const { requestContext, config } = inputData;\n return QueryResultSettingsProxy.fromModuleData(requestContext, config as IQueryResultSettingsModuleConfig);\n }\n\n /**\n * Factory method for modules.\n * @param requestContext - RequestContext.\n * @param config - Module config from props.\n * @returns - Returns query result settings proxy.\n */\n public static fromModuleData(requestContext: IRequestContext, config: IQueryResultSettingsModuleConfig): QueryResultSettingsProxy {\n const sortingCriteria = (config && config.sortingCriteria) || undefined;\n const query = requestContext && requestContext.query;\n const top = (query && query.top) || undefined;\n const skip = (query && query.skip) || undefined;\n\n const queryResultSettings = {\n Paging: {\n Skip: (skip && Number(skip)) || 0,\n Top: (top && Number(top)) || config?.itemsPerPage || 50\n },\n Sorting: sortingCriteria || {}\n };\n\n return new QueryResultSettingsProxy(queryResultSettings);\n }\n\n /**\n * Return the query result settings with default paging or with the passed value.\n * @param inputData - Input Data.\n * @returns - Query Result settings.\n */\n public static getPagingFromInputDataOrDefaultValue(inputData: ICreateActionContext>): QueryResultSettings {\n const config: IQueryResultSettingsModuleConfig | undefined = inputData.config;\n const defaultPageSize: number = 100;\n const queryResultSettings: QueryResultSettings = {\n Paging: {\n // eslint-disable-next-line max-len -- Disable max length for next line.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unnecessary-condition -- Reading from config.\n Top:\n config?.itemsPerPage ??\n Number.parseInt(inputData.requestContext?.app?.platform?.defaultPageSizeForAPI ?? defaultPageSize, 10)\n }\n };\n return queryResultSettings;\n }\n\n /**\n * Factory method.\n * @returns - Returns query result settings proxy.\n */\n public static getDefault(): QueryResultSettingsProxy {\n return new QueryResultSettingsProxy({ Paging: {}, Sorting: {} });\n }\n\n /**\n * Private constructor, expect instances to be created with the factory method.\n * @param queryResultSettings - Query result setting.\n */\n private constructor(queryResultSettings: QueryResultSettings) {\n this.queryResultSettings = queryResultSettings;\n }\n\n public get QueryResultSettings(): QueryResultSettings {\n return this.queryResultSettings;\n }\n\n /**\n * Gets the hints for the cache key based on query result settings.\n * @returns - Returns cache key hint.\n */\n public get cacheKeyHint(): string {\n // The factory method guarantees values are defined\n const topHint = `top-${this.queryResultSettings.Paging!.Top!}`;\n const skipHint = `skip-${this.queryResultSettings.Paging!.Skip!}`;\n const sortingHintData =\n (this.queryResultSettings.Sorting!.Columns || [])\n .map((column: SortColumn) => {\n return `${column.ColumnName}--${(column.IsDescending && 'desc') || 'asc'}`;\n })\n .join(',') || undefined;\n const sortingHint = `sortBy-${sortingHintData}`;\n return `${topHint}|${skipHint}|${sortingHint}`;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce, { IParameterizeFeatureFlags } from '@msdyn365-commerce/core';\n\nexport function parameterize(\n name: string = '',\n sep = '-',\n parameterizeFeatureFlags: IParameterizeFeatureFlags = {},\n neutralizedName?: string\n) {\n // If neutralizedName flag enabled, we use neutralizedName to construct string\n const candidateName =\n (msdyn365Commerce.platformSettings && msdyn365Commerce.platformSettings.enableUrlLocalization) ||\n parameterizeFeatureFlags.enableUrlLocalization\n ? name\n : neutralizedName || name;\n\n /*\n 1\t‘ ‘ (space)\t-> (single dash)\n 3\tAny character disallowed in URLs -> URL-encode\n 5\t‘ & ‘ (space ampersand space) -> (single dash)\n 6\t‘ - ‘ (space dash space) -> (single dash)\n 7\t‘ ‘ (2+ spaces) -> (single dash)\n 10\t[A-Z] (capital letters) -> [a-z] (lower-case)\n 12\tAny non-ASCII character outside of the set of disallowed characters -> URL-encode\n */\n if (\n parameterizeFeatureFlags.enableUrlEncoding ||\n (msdyn365Commerce.platformSettings && msdyn365Commerce.platformSettings.enableUrlEncoding)\n ) {\n // Replace url reserved characters with dash, and remove front and end dash;\n // &*!() reserved characters that can not be encoded by encodeURIComponent()\n return encodeURIComponent(\n candidateName\n .toLowerCase()\n .replace(/[\\s!&'()*]+/g, '-')\n .trim()\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n );\n }\n return name\n .toLowerCase()\n .replace(/[^\\d_a-z\\-]+/g, ' ')\n .trim()\n .replace(/\\s+/g, sep);\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { getParameterizeFeatureFlags, getUrlSync, IActionContext, IParameterizeFeatureFlags } from '@msdyn365-commerce/core';\n\nimport { parameterize } from './parameterize';\n\ninterface ICategoryMap {\n [RecordId: number]: CategoryHierarchy;\n}\n\n/**\n * Builds slugs for category.\n * @param category\n * @param categoryMap\n * @param parameterizeFeatureFlags\n */\nexport function getCategorySlug(\n category: CategoryHierarchy,\n categoryMap: ICategoryMap,\n parameterizeFeatureFlags?: IParameterizeFeatureFlags\n): string {\n if (!category || !category.Name) {\n // Invalid category\n return '';\n }\n const categoryName = parameterize(category.Name, undefined, parameterizeFeatureFlags, category.NeutralizedName);\n if (!category.ParentCategory || category.ParentCategory === 0) {\n // Base case assign url\n category.Slug = category.Slug || `/${categoryName}`;\n } else if (category.ParentCategory) {\n category.Slug =\n category.Slug ||\n `${getCategorySlug(categoryMap[category.ParentCategory], categoryMap, parameterizeFeatureFlags)}/${categoryName}`;\n }\n\n return category.Slug || '';\n}\n\n/**\n * Gets Url for category hierarchy. Returns string and adds url to Url property of category hierarchy.\n * @param category Category to generate URL for.\n * @param ctx\n * @param categoryMap Dictionary of all categories.\n */\nexport function getCategoryUrl(category: CategoryHierarchy, ctx?: IActionContext, categoryMap?: ICategoryMap): string | undefined {\n if (!category.Url && ctx && categoryMap) {\n if (!category.Slug) {\n const parameterizeFeatureFlags: IParameterizeFeatureFlags = ctx.requestContext ? getParameterizeFeatureFlags(ctx) : {};\n category.Slug = getCategorySlug(category, categoryMap, parameterizeFeatureFlags);\n }\n category.Url = getUrlSync('category', ctx, { category });\n }\n return category.Url;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getUrlSync, IActionContext } from '@msdyn365-commerce/core';\n\n/**\n * Syncronously creates an invoice detail page url.\n * @param invoiceId Invoice Id.\n * @param ctx\n */\nexport function getInvoiceDetailsPageUrlSync(invoiceId: string, ctx: IActionContext): string {\n let url = getUrlSync('invoice-details', ctx) || '';\n url = url.includes('?') ? url.substr(0, url.indexOf('?')) : url;\n return `${url}?invoiceId=${invoiceId}`;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { getUrlSync, IActionContext } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\n\n/**\n * Syncronously creates a product url.\n * @param product Simple product to get url from.\n * @param ctx\n * @param category Category to add to product url.\n */\nexport function getProductUrlSync(product: SimpleProduct, ctx: IActionContext, category?: CategoryHierarchy): string {\n const selectedProduct = { ...product, RecordId: product.MasterProductId || product.RecordId };\n\n return getProductPageUrlSync(selectedProduct.Name || '', selectedProduct.RecordId, ctx, category)!;\n}\n\n/**\n * Syncronously creates a product detail page url.\n * @param name Simple product name.\n * @param recordId Record id of product.\n * @param ctx\n * @param category\n */\nexport function getProductPageUrlSync(name: string, recordId: number, ctx: IActionContext, category?: CategoryHierarchy): string {\n return getUrlSync('product', ctx, {\n product: { Name: name || '', RecordId: recordId },\n category\n })!;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ObjectExtensions } from './object-extensions';\n\n/**\n * Represents an array which is defined with at least one value.\n */\nexport type NonEmptyArray = [T, ...T[]];\n\n/**\n * Namespace which extends Array functionality.\n */\nexport namespace ArrayExtensions {\n /**\n * Verifies whether the object array has elements.\n * @param value - The array to examine.\n * @returns True if the object has at least one element in the array, false otherwise (if array is not defined or empty).\n */\n export function hasElements(value: NonEmptyArray | T[] | null | undefined): value is NonEmptyArray {\n const emptyArrayLength = 0;\n return !ObjectExtensions.isNullOrUndefined(value) && value.length > emptyArrayLength;\n }\n\n /**\n * Retrieves the first element in the array or default value if the array is empty.\n * @param values - The array with values.\n * @param defaultValue - Optional parameter to specify default value. If not specified, undefined will be used.\n * @returns First element or default value.\n */\n export function firstOrDefault(values: NonEmptyArray | T[] | null | undefined, defaultValue?: T): T | undefined {\n if (hasElements(values)) {\n return values[0];\n }\n return defaultValue;\n }\n\n /**\n * Remove duplicate elements in the array.\n * @param value - The array to examine.\n * @returns An array with only unique elements.\n */\n export function unique(value: T[]): T[] {\n if (!hasElements(value)) {\n return [];\n }\n\n return Array.from(new Set(value));\n }\n\n /**\n * Checks if all elements satisfy given condition.\n * @param value - The array to examine.\n * @param predicate - The function which checks an element.\n * @returns True if the array is empty or all the inner elements satisfy given condition,\n * false if at least one element does not pass the condition.\n */\n export function all(value: T[] | null | undefined, predicate: (value: T, index: number, array: T[]) => boolean): boolean {\n if (!hasElements(value)) {\n return true;\n }\n\n return value.filter(predicate).length === value.length;\n }\n\n /**\n * Filters out null and undefined values from the given array.\n * @param value - The array with possibly undefined/null items.\n * @returns All items which are not null or undefined.\n */\n export function validValues(value: (T | undefined | null)[] | undefined | null): T[] {\n if (!hasElements(value)) {\n return [];\n }\n\n return value.filter(item => !ObjectExtensions.isNullOrUndefined(item)) as T[];\n }\n\n /**\n * Merges items from 2-dimensional array into one array with all items.\n * @param value - The 2-dimensional array with the items.\n * @returns All items retrieved from all inner arrays.\n */\n export function flatten(value: ((T | undefined | null)[] | undefined | null)[]): T[] {\n let result: T[] = [];\n\n if (!hasElements(value)) {\n return result;\n }\n\n for (const arrayLine of value) {\n if (!ObjectExtensions.isNullOrUndefined(arrayLine)) {\n result = result.concat(validValues(arrayLine));\n }\n }\n\n return result;\n }\n\n /**\n * Check if two arrays are equal.\n * @param firstArray - The array with the items.\n * @param secondArray - Another array with the items.\n * @param comparator - The comparator which compares the values and returns true if two objects are equal, false otherwise.\n * @returns True if arrays have the same items, false otherwise.\n */\n export function equals(\n firstArray: T[],\n secondArray: T[],\n comparator?: (valueFromFirstArray: T, valueFromSecondArray: T) => boolean\n ): boolean {\n if (firstArray.length !== secondArray.length) {\n return false;\n }\n\n if (comparator === undefined) {\n return JSON.stringify(firstArray) === JSON.stringify(secondArray);\n }\n\n for (let index = 0; index < firstArray.length; ++index) {\n if (!comparator(firstArray[index], secondArray[index])) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Check if two arrays have the same elements irrespective of the order.\n * @param firstArray - The array with the items.\n * @param secondArray - Another array with the items.\n * @param comparator - The comparator which compares the values and returns true if two objects are equal, false otherwise.\n * @returns True if arrays have the same items, false otherwise.\n */\n export function haveSameItems(\n firstArray: T[],\n secondArray: T[],\n comparator: (valueFromFirstArray: T, valueFromSecondArray: T) => boolean = (valueFromFirstArray: T, valueFromSecondArray: T) =>\n valueFromFirstArray === valueFromSecondArray\n ): boolean {\n if (firstArray.length !== secondArray.length) {\n return false;\n }\n\n for (const item of firstArray) {\n if (!secondArray.some(otherItem => comparator(item, otherItem))) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Calculates a sum of elements in the given array.\n * @param data - List of items.\n * @returns Sum of elements.\n */\n export function calculateSum(data: NonEmptyArray): number {\n let result = data[0];\n for (let index = 1; index < data.length; ++index) {\n result += data[index];\n }\n\n return result;\n }\n\n /**\n * Reverses the elements in the array without modifying the original one.\n * @param array - The array with the items.\n * @returns A new array with reversed order.\n */\n export function reverse(array: T[]): T[] {\n const newArray: T[] = [];\n\n for (let index = array.length - 1; index >= 0; --index) {\n newArray.push(array[index]);\n }\n\n return newArray;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ObjectExtensions } from './object-extensions';\n\n/**\n * Namespace which extends enum functionality.\n */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport namespace EnumExtensions {\n /**\n * @description Returns a list of numeric values and enum names for the specified enum.\n * @param enumClass\n * @param {any} value The enum to examine.\n * @returns {(number | string)[]} An array of numeric values and enum names.\n */\n export function getValues(enumClass: any): (number | string)[] {\n if (ObjectExtensions.isNullOrUndefined(enumClass)) {\n return [];\n }\n\n return Object.keys(enumClass).map(item => enumClass[item]);\n }\n\n /**\n * @description Returns a list of enum names for the specified enum.\n * @param enumClass\n * @param {any} value The enum to examine.\n * @returns {(number | string)[]} An array of string values.\n */\n export function getNames(enumClass: any): string[] {\n return getValues(enumClass).filter(ObjectExtensions.isString);\n }\n\n /**\n * @description Returns a list of numeric values for the specified enum.\n * @param enumClass\n * @param {any} value The enum to examine.\n * @returns {number[]} An array of numeric values.\n */\n export function getNumericValues(enumClass: any): number[] {\n return getValues(enumClass).filter(ObjectExtensions.isNumber);\n }\n\n /**\n * @description Returns a list of enum values for the specified enum.\n * @param enumClass\n * @param {any} value The enum to examine.\n * @returns {number[]} An array of enum values.\n */\n export function getEnumValues(enumClass: any): T[] {\n return getNumericValues(enumClass).map(value => value);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ObjectExtensions } from './object-extensions';\n\n/**\n * Namespace which extends string functionality.\n */\nexport namespace StringExtensions {\n /**\n * Checks if string is null, undefined, empty, or whitespace.\n * @param {string | null | undefined} value The string to examine.\n * @returns {boolean} True if it's null, undefined, empty, or whitespace; false otherwise.\n */\n export function isNullOrWhitespace(value: string | null | undefined): boolean {\n return isNullOrEmpty(value) || value!.trim() === '';\n }\n\n /**\n * Checks if string is null, undefined, or empty.\n * @param {string | null | undefined} value The string to examine.\n * @returns {boolean} True if it's null, undefined, empty, or whitespace; false otherwise.\n */\n export function isNullOrEmpty(value: string | null | undefined): boolean {\n if (ObjectExtensions.isNullOrUndefined(value)) {\n return true;\n }\n\n if (!ObjectExtensions.isString(value)) {\n throw new Error('StringExtensions has received a non-string input.');\n }\n\n return value === '';\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * Namespace which extends Object functionality.\n */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport namespace ObjectExtensions {\n /**\n * @description Verifies whether the value is null or undefined.\n * @param {any} value The value to examine.\n * @returns {boolean} True if the value is null or undefined, false otherwise.\n */\n export function isNullOrUndefined(value: any): value is null | undefined {\n return value === null || value === undefined;\n }\n\n /**\n * @description Verifies whether the value is of type string.\n * @param {any} value The value to examine.\n * @returns {boolean} True if the value is a string, false otherwise.\n */\n export function isString(value: any): value is string {\n return typeof value === 'string';\n }\n\n /**\n * @description Verifies whether the value is of type number.\n * @param {any} value The value to examine.\n * @returns {boolean} True if the value is a number, false otherwise.\n */\n export function isNumber(value: any): value is number {\n return typeof value === 'number';\n }\n\n /**\n * Verifies whether the object is a function.\n * @param {any} object The object.\n * @param value\n * @returns {boolean} True if the object is a function, false otherwise.\n */\n export function isFunction(value: any): boolean {\n return typeof value === 'function';\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IAny, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\nimport { QueryResultSettings } from '@msdyn365-commerce/retail-proxy';\n\nimport { QueryResultSettingsProxy } from './QueryResultSettingsProxy';\n\nexport interface ISearchData {\n q: string;\n skip: number;\n top: number;\n itemsPerPage: string;\n maxItems: string;\n channelId: number;\n queryResultSettings: QueryResultSettings;\n}\n\nexport const parseSearchData = (inputData: ICreateActionContext>): ISearchData => {\n // Query is of type 'IDictionary | undefined', so that q and skip are not recognized by tsc\n const {\n requestContext: {\n // @ts-expect-error:2339\n query: { q, top, skip },\n apiSettings: { channelId }\n },\n // @ts-expect-error:2339\n config: { maxItems, itemsPerPage }\n } = inputData;\n const queryResultSettings = QueryResultSettingsProxy.fromInputData(inputData).QueryResultSettings;\n return {\n q,\n skip: (skip && Number(skip)) || 0,\n top: (top && Number(top)) || 50,\n itemsPerPage, // TODO BUGBUG 21667361\n maxItems, // TODO BUGBUG 21667361\n channelId,\n queryResultSettings\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce, {\n generateImageUrl as generateImageUrlFromSdk,\n IAny,\n ICommerceApiSettings,\n ICoreContext,\n ICreateActionContext,\n IGeneric,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport {\n AsyncResult,\n AttributeValue,\n CartLine,\n ChannelInventoryConfiguration,\n CommerceListLine,\n ProductDimension,\n ProductDimensionType,\n ProductSearchResult,\n QueryResultSettings,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { ProductDetailsCriteria } from '../get-full-products';\nimport { ArrayExtensions, StringExtensions } from './extensions';\nimport { parseSearchData } from './input-data-parser';\nimport { InventoryLevels } from './product-inventory-information';\n\nexport const wrapInResolvedAsyncResult = (input: T | null | undefined): AsyncResult => {\n return >{\n status: 'SUCCESS',\n result: input,\n metadata: {}\n };\n};\n\nexport const wrapInRejectedAsyncResult = (input: T | null | undefined): AsyncResult => {\n return >{\n status: 'FAILED',\n result: input,\n metadata: {}\n };\n};\n\nexport const buildQueryResultSettings = (inputData: ICreateActionContext, IGeneric>): QueryResultSettings => {\n try {\n const searchInputData = parseSearchData(inputData);\n const search = searchInputData.q;\n if (!search) {\n throw new Error('Query string ?q={searchText} is needed for search actions.');\n }\n const top = (searchInputData.maxItems && Number(searchInputData.maxItems)) || searchInputData.top;\n return { Paging: { Top: top, Skip: searchInputData.skip } };\n } catch {\n return {};\n }\n};\n\n/**\n * Utility function to extract the active productId in the following priority:\n * First query param (productId), then UrlToken (itemId), then module config.\n * @param inputData - The Action Input data.\n * @returns Productid or undefined.\n */\nexport const getSelectedProductIdFromActionInput = (inputData: ICreateActionContext>): string | undefined => {\n const context = inputData.requestContext;\n if (context.query?.productId) {\n return context.query.productId;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Exsiting code.\n } else if (\n context.urlTokens &&\n inputData.requestContext.urlTokens.itemId &&\n inputData.requestContext.urlTokens.pageType === 'Product'\n ) {\n return context.urlTokens.itemId;\n } else if (inputData && inputData.config && inputData.config.productId) {\n return inputData.config.productId;\n }\n return undefined;\n};\n\n/**\n * Generates a Image URL based on data return from retail server.\n * @param imageUrl The image url returned by Retail Server.\n * @param ctx The request context.\n * @param apiSettings\n */\nexport const generateImageUrl = (imageUrl: string | undefined, apiSettings: ICommerceApiSettings): string | undefined => {\n return generateImageUrlFromSdk(apiSettings, imageUrl);\n};\n\n/**\n * Represents app configuration for dimensions.\n */\nexport interface IDimensionsConfig {\n dimensionsAsSwatchType?: DimensionTypes[];\n dimensionsInProductCard?: DimensionTypes[];\n inventoryLevel?: InventoryLevels;\n dimensionToPreSelectInProductCard?: DimensionTypes;\n enableStockCheck?: boolean;\n warehouseAggregation?: string;\n}\n\n/**\n * Represents app configuration for dimensions.\n */\nexport interface IDimensionsApp {\n config: IDimensionsConfig;\n}\n\n/**\n * Represents product dimension types.\n */\nexport enum DimensionTypes {\n none = 'none',\n color = 'color',\n configuration = 'configuration',\n size = 'size',\n style = 'style'\n}\n\n/**\n * Defines display configuration types.\n */\nexport enum DimensionSwatchDisplayTypes {\n default = 'default',\n productCard = 'productCard'\n}\n\n/**\n * Checks if rendering the particular dimensions is allowed.\n * @param dimensionType - Dimension to be displayed.\n * @param context - Core application context.\n * @param displayType - The swatch location, the component from which it comes from.\n * @returns Updates the state with new product page url.\n */\nexport const checkIfShouldDisplayAsSwatch = (\n dimensionType: DimensionTypes,\n context: ICoreContext,\n displayType: DimensionSwatchDisplayTypes = DimensionSwatchDisplayTypes.default\n): boolean => {\n // Additional checks for the product card since it has a separate config setting.\n if (displayType === DimensionSwatchDisplayTypes.productCard) {\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n if (\n !ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) ||\n dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) ||\n !dimensionsToDisplayOnProductCard.includes(dimensionType)\n ) {\n return false;\n }\n }\n\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n return (\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\n dimensionsToDisplayAsSwatch.includes(dimensionType)\n );\n};\n\n/**\n * Generates an image URL for a swatch.\n * @param imageUrl - The image url returned by Retail Server.\n * @param apiSettings - The request context.\n * @returns Full image url.\n */\nexport const generateSwatchImageUrl = (imageUrl: string, apiSettings: ICommerceApiSettings): string => {\n if (imageUrl.startsWith('http')) {\n return imageUrl;\n }\n\n return apiSettings.baseImageUrl + encodeURIComponent(imageUrl);\n};\n\n/**\n * Generates a Image URL for a product based on data return from retail server.\n * @param product The Product returned by Retail Server.\n * @param ctx The request context.\n * @param apiSettings\n */\nexport const generateProductImageUrl = (\n product: SimpleProduct | ProductSearchResult,\n apiSettings: ICommerceApiSettings\n): string | undefined => {\n return generateImageUrl(product.PrimaryImageUrl, apiSettings);\n};\n\n/**\n * Creates a CartLine object from the passed data.\n * @param product The product.\n * @param quantity The quantity.\n * @param catalogId The catalog.\n */\nexport const buildCartLine = (product: SimpleProduct, quantity?: number, catalogId?: number): CartLine => {\n return {\n CatalogId: catalogId || 0,\n Description: product.Description,\n\n // TODO: Investigate this value and what it represents\n EntryMethodTypeValue: 3,\n ItemId: product.ItemId,\n ProductId: product.RecordId,\n Quantity: quantity || 1,\n TrackingId: '',\n UnitOfMeasureSymbol: product.DefaultUnitOfMeasure\n };\n};\n\n/**\n * Creates a CommerceListLine (also know as WishlistLine) object from the passed data.\n * @param productId The RecordId of the Product to be added.\n * @param customerId The account number of the customer.\n * @param wishlistId The Id of the commerce list.\n */\nexport const buildWishlistLine = (productId: number, customerId: string, wishlistId: number): CommerceListLine => {\n return {\n CommerceListId: wishlistId,\n ProductId: productId,\n CustomerId: customerId\n };\n};\n\n/**\n * Utility function to prepare the product details criteria before getting full product:\n * @param inputData The Action Input data\n */\nexport const getProductDetailsCriteriaFromActionInput = (inputData: ICreateActionContext>): ProductDetailsCriteria => {\n if (inputData && inputData.config) {\n return {\n getPrice: !inputData.config.hidePrice,\n getRating: !inputData.config.hideRating\n };\n }\n return {\n getPrice: true,\n getRating: true\n };\n};\n\n/**\n * Transforms search text into the expected 'search terms' format, expected by refiner APIs.\n * @param searchText Free-form text used for searching for products or categories of products.\n */\nexport const ensureSearchTextIsFormedProperly = (searchText: string): string => {\n const prefix = searchText.startsWith(\"'\") ? '' : \"'\";\n const suffix = searchText.endsWith(\"'\") ? '' : \"'\";\n return `${prefix}${searchText}${suffix}`;\n};\n\nexport const ensureSafeSearchText = (searchText: string): string => {\n return searchText.replace(/[^\\d\\sA-Za-z]+/g, '');\n};\n\nexport const buildCacheKey = (base: string, apiSettings: ICommerceApiSettings, locale?: string): string => {\n return `${base}-chanId:${apiSettings.channelId}-catId:${apiSettings.catalogId}${locale ? `-${locale}` : ''}`;\n};\n\nexport const buildCacheKeyWithUrlTokens = (base: string, requestContext: IRequestContext): string => {\n const urlTokens = requestContext.urlTokens;\n const defaultCacheKey = buildCacheKey(base, requestContext.apiSettings, requestContext.locale);\n return urlTokens ? `${defaultCacheKey}-${urlTokens.itemId}-${urlTokens.recordId}-${urlTokens.pageType}` : defaultCacheKey;\n};\n\n/**\n * Generates a key from set of arguments as inputs.\n *\n * @param args Argument list of pivots to generate key from.\n * @param handler Handler function for null/undefined values.\n */\n\ntype TKeyTypes = string | number | boolean | null | undefined;\ninterface IGenerateKeyOptions {\n separator?: string;\n handler?(input: null | undefined): string;\n}\nexport const generateKey = (args: TKeyTypes[], options?: IGenerateKeyOptions): string => {\n const { handler, separator }: IGenerateKeyOptions = { ...{ separator: '-', handler: undefined }, ...(options || {}) };\n return args\n .map(arg => {\n if (arg === null || arg === undefined) {\n if (handler) {\n return handler(arg);\n }\n }\n return arg;\n })\n .join(separator);\n};\n\n/**\n * Gets the fall back image url for a variant image.\n * @param itemId Item id of a product.\n * @param apiSettings Api setting from request context.\n */\nexport const getFallbackImageUrl = (itemId: string | undefined, apiSettings: ICommerceApiSettings): string | undefined => {\n if (!itemId) {\n return '';\n }\n\n const parsedItemId = itemId.trim().split(' ')[0];\n\n const productUrl = `Products/${parsedItemId}_000_001.png`;\n return generateImageUrl(productUrl, apiSettings);\n};\n\n/**\n * Converts retail proxy product dimension type to display dimension type.\n * @param productDimensionType - Product dimension type from retail proxy.\n * @returns Local dimension type.\n */\nexport const convertProductDimensionTypeToDimensionTypes = (productDimensionType: ProductDimensionType): DimensionTypes => {\n switch (productDimensionType) {\n case ProductDimensionType.Color:\n return DimensionTypes.color;\n case ProductDimensionType.Configuration:\n return DimensionTypes.configuration;\n case ProductDimensionType.Size:\n return DimensionTypes.size;\n case ProductDimensionType.Style:\n return DimensionTypes.style;\n default:\n return DimensionTypes.none;\n }\n};\n\n/**\n * Converts display dimension type to retail proxy product dimension type.\n * @param dimensionType - Local dimension type.\n * @returns Product dimension type from retail proxy.\n */\nexport const convertDimensionTypeToProductDimensionType = (dimensionType: DimensionTypes): ProductDimensionType => {\n switch (dimensionType) {\n case DimensionTypes.color:\n return ProductDimensionType.Color;\n case DimensionTypes.configuration:\n return ProductDimensionType.Configuration;\n case DimensionTypes.size:\n return ProductDimensionType.Size;\n case DimensionTypes.style:\n return ProductDimensionType.Style;\n default:\n return ProductDimensionType.None;\n }\n};\n\n/**\n * Sets dimensions to url.\n * @param inputUrl - Url to update.\n * @param productDimensions - Dimensions to set.\n */\nexport const setDimensionValuesToQuery = (inputUrl: URL, productDimensions: ProductDimension[]): void => {\n for (const dimension of productDimensions) {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n inputUrl.searchParams.set(convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue), dimensionValue!);\n }\n }\n\n if (msdyn365Commerce.isBrowser) {\n window.history.replaceState(window.history.state, '', inputUrl.toString().replace(inputUrl.host, window.location.host));\n }\n};\n\n/**\n * Retrieves dimension value stored in url.\n * @param urlParameters - Url parameters.\n * @param productDimensionType - The dimension type to retrieve.\n * @returns Product dimension item.\n */\nconst parseDimensionFromUrl = (\n urlParameters: URLSearchParams,\n productDimensionType: ProductDimensionType\n): ProductDimension | undefined => {\n const localDimensionType = convertProductDimensionTypeToDimensionTypes(productDimensionType);\n const value = urlParameters.get(localDimensionType);\n if (!value) {\n return undefined;\n }\n return {\n DimensionTypeValue: productDimensionType,\n DimensionValue: {\n RecordId: 0,\n Value: value\n }\n };\n};\n\n/**\n * Retrieves all dimensions from URL.\n * @param urlParameters - Url parameters.\n * @returns Product dimensions stored in url.\n */\nconst parseDimensionsFromUrl = (urlParameters: URLSearchParams): ProductDimension[] => {\n const dimensionsToParse: ProductDimensionType[] = [\n ProductDimensionType.Color,\n ProductDimensionType.Configuration,\n ProductDimensionType.Size,\n ProductDimensionType.Style\n ];\n const parsedDimensions = dimensionsToParse.map(dimension => parseDimensionFromUrl(urlParameters, dimension));\n return ArrayExtensions.validValues(parsedDimensions);\n};\n\n/**\n * Utility function to extract the dimension values from input url querystring.\n * @param inputUrl - The request url.\n * @returns The selected dimension values.\n */\nexport const getDimensionValuesFromQuery = (inputUrl: URL): ProductDimension[] => {\n const urlWithIgnoredCase = new URL(inputUrl.toString().toLocaleLowerCase());\n const urlParameters = urlWithIgnoredCase.searchParams;\n const dimensions: ProductDimension[] = parseDimensionsFromUrl(urlParameters);\n return dimensions;\n};\n\n/**\n * Get attribute values by channel inventory configuration.\n * @param attributeValues - The attributeValues.\n * @param channelInventoryConfiguration - The channelInventoryConfiguration.\n * @returns The attributeValues filter by channel inventory configuration.\n */\nexport const getAttributeValuesByConfiguration = (\n attributeValues: AttributeValue[] | null,\n channelInventoryConfiguration: ChannelInventoryConfiguration | null\n): AttributeValue[] => {\n if (!attributeValues) {\n return [];\n }\n if (!channelInventoryConfiguration) {\n return attributeValues;\n }\n\n return attributeValues.filter(\n attribute =>\n attribute.RecordId !== channelInventoryConfiguration.InventoryProductAttributeRecordId &&\n attribute.RecordId !== channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId\n );\n};\n\n/**\n * Utility function to remove domain querystring parameter from url.\n * @param inputUrl - The request url.\n * @returns The yrl after dropping domain querystring.\n */\nexport const removeDomainQspFromUrl = (inputUrl: string, requestContext: IRequestContext): string => {\n if (requestContext?.features && requestContext.features.remove_domain_qsp) {\n const Url = new URL(inputUrl);\n const urlParams: URLSearchParams = new URLSearchParams(Url.search);\n if (urlParams.has('domain')) {\n urlParams.delete('domain');\n }\n Url.search = urlParams.toString();\n return Url.toString();\n }\n return inputUrl;\n};\n"],"names":["CategoriesInput","constructor","context","mappedToHierarchy","maxItems","getCacheKey","buildCacheKey","this","channelId","sitePath","catalogId","apiSettings","locale","getCacheObjectType","_mappedToHierarchy","dataCacheType","getLocale","getCatalogId","mapCategoryToHierarchy","categoryList","ctx","length","categoryMap","reduce","memo","category","localName","getFriendlyName","nameTranslations","nameTranslation","find","item","Language","toLowerCase","Text","NameTranslations","categoryHierarchy","_objectSpread","NeutralizedName","Name","RecordId","zeroCategory","Object","keys","forEach","id","element","parentId","ParentCategory","Url","getCategoryUrl","parent","Children","push","createCategoriesHierarchyInput","inputData","topItems","config","topCategories","Number","parseInt","requestContext","async","getCategoryHierarchyAction","input","categories","getCategoryAction","RawCategoriesInput","getCategoryHierarchyActionDataAction","createObservableDataAction","action","_context$apiSettings","_this$catalogId","createCategoriesInput","_inputData$config","CategoriesDataActions","callerContext","getCategoryActionDataAction","QueryResultSettingsProxy","queryResultSettings","static","fromModuleData","sortingCriteria","undefined","query","top","skip","Paging","Skip","Top","itemsPerPage","Sorting","_config$itemsPerPage","_inputData$requestCon","_inputData$requestCon2","app","platform","defaultPageSizeForAPI","QueryResultSettings","cacheKeyHint","Columns","map","column","ColumnName","IsDescending","join","parameterize","name","arguments","sep","parameterizeFeatureFlags","neutralizedName","candidateName","msdyn365Commerce","platformSettings","enableUrlLocalization","enableUrlEncoding","encodeURIComponent","replace","trim","getCategorySlug","categoryName","Slug","getParameterizeFeatureFlags","getUrlSync","getInvoiceDetailsPageUrlSync","invoiceId","url","includes","substr","indexOf","getProductUrlSync","product","selectedProduct","MasterProductId","getProductPageUrlSync","recordId","ArrayExtensions","hasElements","value","ObjectExtensions","isNullOrUndefined","validValues","filter","firstOrDefault","values","defaultValue","unique","Array","from","Set","all","predicate","flatten","result","arrayLine","concat","equals","firstArray","secondArray","comparator","JSON","stringify","index","haveSameItems","valueFromFirstArray","valueFromSecondArray","some","otherItem","calculateSum","data","reverse","array","newArray","EnumExtensions","StringExtensions","getValues","enumClass","getNumericValues","isNumber","getNames","isString","getEnumValues","isNullOrEmpty","Error","isNullOrWhitespace","isFunction","parseSearchData","q","fromInputData","getSelectedProductIdFromActionInput","_context$query","productId","urlTokens","itemId","pageType","generateImageUrl","imageUrl","generateImageUrlFromSdk","DimensionTypes","DimensionSwatchDisplayTypes","checkIfShouldDisplayAsSwatch","dimensionType","displayType","default","productCard","dimensionsToDisplayOnProductCard","dimensionsInProductCard","none","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","generateSwatchImageUrl","startsWith","baseImageUrl","generateProductImageUrl","PrimaryImageUrl","buildWishlistLine","customerId","wishlistId","CommerceListId","ProductId","CustomerId","getProductDetailsCriteriaFromActionInput","getPrice","hidePrice","getRating","hideRating","base","buildCacheKeyWithUrlTokens","defaultCacheKey","generateKey","args","options","handler","separator","arg","getFallbackImageUrl","parsedItemId","split","convertProductDimensionTypeToDimensionTypes","productDimensionType","ProductDimensionType","Color","color","Configuration","configuration","Size","size","Style","style","convertDimensionTypeToProductDimensionType","None","setDimensionValuesToQuery","inputUrl","productDimensions","dimension","_dimension$DimensionV","dimensionValue","DimensionValue","Value","searchParams","set","DimensionTypeValue","isBrowser","window","history","replaceState","state","toString","host","location","parseDimensionsFromUrl","urlParameters","parsedDimensions","parseDimensionFromUrl","localDimensionType","get","getDimensionValuesFromQuery","URL","toLocaleLowerCase","getAttributeValuesByConfiguration","attributeValues","channelInventoryConfiguration","attribute","InventoryProductAttributeRecordId","ProductAvailabilitySortableAttributeRecordId","removeDomainQspFromUrl","features","remove_domain_qsp","urlParams","URLSearchParams","search","has","delete"],"sourceRoot":""}