{"version":3,"file":"static/js/40945f301e422ea9594c.bundle.js","mappings":"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","sources":["webpack://Dobbies.Commerce/../../../src/utilities/QueryResultSettingsProxy.ts?5e44","webpack://Dobbies.Commerce/../../../../src/utilities/extensions/array-extensions.ts?1a2a","webpack://Dobbies.Commerce/../../../../src/utilities/extensions/enum-extensions.ts?cf51","webpack://Dobbies.Commerce/../../../../src/utilities/extensions/string-extensions.ts?ab9f","webpack://Dobbies.Commerce/../../../../src/utilities/extensions/object-extensions.ts?6388","webpack://Dobbies.Commerce/../../../src/utilities/input-data-parser.ts?027a","webpack://Dobbies.Commerce/../../../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 { 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<IGeneric<IAny>>): 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<IGeneric<IAny>>): 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 { ObjectExtensions } from './object-extensions';\n\n/**\n * Represents an array which is defined with at least one value.\n */\nexport type NonEmptyArray<T> = [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<T>(value: NonEmptyArray<T> | T[] | null | undefined): value is NonEmptyArray<T> {\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<T>(values: NonEmptyArray<T> | 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<T>(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<T>(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<T>(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<T>(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<T>(\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<T>(\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>): 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<T>(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<T extends number>(enumClass: any): T[] {\n        return getNumericValues(enumClass).map(value => <T>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<IGeneric<IAny>>): ISearchData => {\n    // Query is of type 'IDictionary<string> | 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    IAny,\n    ICommerceApiSettings,\n    ICoreContext,\n    ICreateActionContext,\n    IGeneric,\n    IRequestContext,\n    generateImageUrl as generateImageUrlFromSdk\n} from '@msdyn365-commerce/core';\nimport {\n    AsyncResult,\n    AttributeValue,\n    CartLine,\n    ChannelDeliveryOptionConfiguration,\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 { IKeyValuePair } from './data-structures';\nimport { ArrayExtensions, StringExtensions } from './extensions';\nimport { parseSearchData } from './input-data-parser';\nimport { InventoryLevels } from './product-inventory-information';\n\nexport const wrapInResolvedAsyncResult = <T = unknown>(input: T | null | undefined): AsyncResult<T> => {\n    return <AsyncResult<T>>{\n        status: 'SUCCESS',\n        result: input,\n        metadata: {}\n    };\n};\n\nexport const wrapInRejectedAsyncResult = <T = unknown>(input: T | null | undefined): AsyncResult<T> => {\n    return <AsyncResult<T>>{\n        status: 'FAILED',\n        result: input,\n        metadata: {}\n    };\n};\n\nexport const buildQueryResultSettings = (inputData: ICreateActionContext<IGeneric<IAny>, IGeneric<IAny>>): 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<IGeneric<IAny>>): 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    maxQuantityForCartLineItem?: number;\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<IDimensionsApp>,\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<IGeneric<IAny>>): 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\n/**\n * @deprecated Please use `generateCacheKey` instead.\n */\nexport const buildCacheKey = (base: string, apiSettings: ICommerceApiSettings, locale?: string): string => {\n    return `${base}-chanId:${apiSettings.channelId}-catId:${apiSettings.catalogId}${locale ? `-${locale}` : ''}`;\n};\n\n/**\n * Represents a list of keys for general parameters used in the cache key.\n */\nenum DefaultCacheKeyParameterKeys {\n    channelIdKey = 'CHANNELID',\n    appSettingsCatalogIdKey = 'APPSETTINGSCATALOGID'\n}\n\n/**\n * Generates a key from set of arguments\n * @param apiSettings - Request context API settings.\n * @param entries - Cache key parameters.\n * @returns String which represents the cache key.\n */\nexport const generateCacheKey = (\n    apiSettings?: ICommerceApiSettings,\n    ...entries: IKeyValuePair<string, TKeyTypes | TKeyTypes[]>[]\n): string => {\n    const parsedEntries: IKeyValuePair<string, TKeyTypes | TKeyTypes[]>[] = entries.map(pair => {\n        return { key: pair.key.toLocaleUpperCase(), value: pair.value };\n    });\n\n    const cacheKeyArgumentsKeys = parsedEntries.map(pair => pair.key);\n\n    if (apiSettings) {\n        if (!cacheKeyArgumentsKeys.includes(DefaultCacheKeyParameterKeys.channelIdKey)) {\n            parsedEntries.push({ key: DefaultCacheKeyParameterKeys.channelIdKey, value: apiSettings.channelId });\n        }\n\n        if (!cacheKeyArgumentsKeys.includes(DefaultCacheKeyParameterKeys.appSettingsCatalogIdKey) && apiSettings.catalogId) {\n            parsedEntries.push({ key: DefaultCacheKeyParameterKeys.appSettingsCatalogIdKey, value: apiSettings.catalogId });\n        }\n    }\n\n    return parsedEntries\n        .sort((a, b) => a.key.localeCompare(b.key))\n        .map(pair => `${pair.key}:{${pair.value}}`)\n        .join('-');\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 = (\n    itemId: string | undefined,\n    apiSettings: ICommerceApiSettings,\n    isOmniFeatureEnabled?: boolean\n): string | undefined => {\n    if (!itemId || isOmniFeatureEnabled) {\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\n/**\n * Utility function to validate catalog Id for B2B user .\n * @param catalogId -  The catalog.\n */\nexport const validateCatalogId = (catalogId?: number | undefined) => {\n    if (catalogId === -1) {\n        throw new Error(\n            'Catalog id is -1. It means no valid catalogs were found for the user. Make sure the user has some valid catalogs assigned.'\n        );\n    }\n};\n\n/**\n * Utility function to check deliveryMode .\n * @param cartline - CartLine item.\n * @param retailMulitplePickupFeatureState - pickUp feature state, default to false.\n * @param channelDeliveryOptionConfig - Channel Delivery Option Configuration.\n * @param pickupDeliveryModeCode -pickUp delivery mode code string.\n * @returns true id cartline item is pickUp item else false.\n */\nexport const getDeliveryMode = (\n    cartLine: CartLine,\n    featureSate: boolean = false,\n    channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n    pickupDeliveryMode?: string\n) => {\n    if (!featureSate) {\n        return cartLine.DeliveryMode === pickupDeliveryMode;\n    }\n    return (\n        cartLine.DeliveryMode ===\n        channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === cartLine.DeliveryMode)\n    );\n};\n\n/**\n * Utility function to check if cartline item is pickupitem .\n * @param cartline - CartLine item.\n * @param retailMulitplePickupFeatureState - pickUp feature state.\n * @param channelDeliveryOptionConfig - Channel Delivery Option Configuration.\n * @param pickupDeliveryModeCode -pickUp delivery mode code string.\n * @returns true id cartline item is pickUp item else false.\n */\nexport const isCartLineItemPickUpType = (\n    cartline: CartLine,\n    retailMulitplePickupFeatureState: boolean = false,\n    channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n    pickupDeliveryModeCode?: string\n): boolean => {\n    // check if cartlineitem is pickup item\n    if (\n        cartline.DeliveryMode &&\n        cartline.DeliveryMode !== '' &&\n        getDeliveryMode(cartline, retailMulitplePickupFeatureState, channelDeliveryOptionConfig, pickupDeliveryModeCode)\n    ) {\n        return true;\n    }\n    return false;\n};\n"],"names":["QueryResultSettingsProxy","constructor","queryResultSettings","this","inputData","requestContext","config","fromModuleData","sortingCriteria","undefined","query","top","skip","Paging","Skip","Number","Top","itemsPerPage","Sorting","_config$itemsPerPage","_inputData$requestCon","_inputData$requestCon2","parseInt","app","platform","defaultPageSizeForAPI","Columns","map","column","ColumnName","IsDescending","join","ArrayExtensions","hasElements","value","ObjectExtensions","isNullOrUndefined","length","validValues","filter","item","firstOrDefault","values","defaultValue","unique","Array","from","Set","all","predicate","flatten","result","arrayLine","concat","equals","firstArray","secondArray","comparator","JSON","stringify","index","haveSameItems","arguments","valueFromFirstArray","valueFromSecondArray","some","otherItem","calculateSum","data","reverse","array","newArray","push","EnumExtensions","StringExtensions","getValues","enumClass","Object","keys","getNumericValues","isNumber","getNames","isString","getEnumValues","isNullOrEmpty","Error","isNullOrWhitespace","trim","isFunction","parseSearchData","q","apiSettings","channelId","maxItems","fromInputData","QueryResultSettings","getSelectedProductIdFromActionInput","_context$query","context","productId","urlTokens","itemId","pageType","generateImageUrl","imageUrl","generateImageUrlFromSdk","DimensionTypes","DimensionSwatchDisplayTypes","checkIfShouldDisplayAsSwatch","dimensionType","displayType","default","productCard","dimensionsToDisplayOnProductCard","dimensionsInProductCard","includes","none","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","generateSwatchImageUrl","startsWith","baseImageUrl","encodeURIComponent","generateProductImageUrl","product","PrimaryImageUrl","buildWishlistLine","customerId","wishlistId","CommerceListId","ProductId","CustomerId","getProductDetailsCriteriaFromActionInput","getPrice","hidePrice","getRating","hideRating","buildCacheKey","base","locale","catalogId","DefaultCacheKeyParameterKeys","generateCacheKey","_len","entries","_key","parsedEntries","pair","key","toLocaleUpperCase","cacheKeyArgumentsKeys","channelIdKey","appSettingsCatalogIdKey","sort","a","b","localeCompare","buildCacheKeyWithUrlTokens","defaultCacheKey","recordId","getFallbackImageUrl","isOmniFeatureEnabled","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","msdyn365Commerce","isBrowser","window","history","replaceState","state","toString","replace","host","location","parseDimensionsFromUrl","urlParameters","parsedDimensions","parseDimensionFromUrl","localDimensionType","get","RecordId","getDimensionValuesFromQuery","URL","toLocaleLowerCase","getAttributeValuesByConfiguration","attributeValues","channelInventoryConfiguration","attribute","InventoryProductAttributeRecordId","ProductAvailabilitySortableAttributeRecordId","removeDomainQspFromUrl","features","remove_domain_qsp","Url","urlParams","URLSearchParams","search","has","delete","validateCatalogId","getDeliveryMode","cartLine","_channelDeliveryOptio","featureSate","channelDeliveryOptionConfig","pickupDeliveryMode","DeliveryMode","PickupDeliveryModeCodes","find","deliveryMode","isCartLineItemPickUpType","cartline","retailMulitplePickupFeatureState","pickupDeliveryModeCode"],"sourceRoot":""}