{"version":3,"file":"chunks-ae19944a7710571c/apps_common_bigcommerce-utils_index_js-_8ab41.4c782669f97f1ebb.js","mappings":"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","sources":["webpack://assemble/./apps/common/bigcommerce-utils/index.js","webpack://assemble/./apps/common/constants/index.js","webpack://assemble/./apps/common/utils/index.js"],"sourcesContent":["import * as utils from './Utils';\n\n\nexport function loadStorefrontProductData(callback) {\n if (!window.OnVoardData || !window.OnVoardData.product || !window.OnVoardData.storefront_api_token) return;\n\n if (!window.OnVoardData.storefront) window.OnVoardData.storefront = {};\n if (window.OnVoardData.storefront.product) {\n callback(window.OnVoardData.storefront.product);\n return;\n }\n\n let apiToken = window.OnVoardData.storefront_api_token;\n let variables = {};\n variables['productId'] = parseInt(window.OnVoardData.product.id);\n\n let query = `\n query productById($productId: Int!) {\n site {\n product(entityId: $productId) {\n entityId\n name\n sku\n upc\n type\n availabilityV2 {\n status\n }\n inventory {\n isInStock\n }\n brand {\n name\n }\n defaultImage {\n urlOriginal\n }\n prices {\n ...PricesFields\n }\n variants {\n edges {\n node {\n ...VariantFields\n }\n }\n }\n categories {\n edges {\n node {\n name\n }\n }\n }\n }\n }\n }\n\n fragment VariantFields on Variant {\n entityId\n sku\n upc\n defaultImage {\n urlOriginal\n }\n prices {\n ...PricesFields\n }\n inventory {\n isInStock\n }\n options {\n edges {\n node {\n ...ProductOptionFields\n }\n }\n }\n }\n\n fragment ProductOptionFields on ProductOption {\n entityId\n displayName\n isRequired\n values {\n edges {\n node {\n entityId\n label\n }\n }\n }\n }\n\n fragment PricesFields on Prices {\n price {\n ...MoneyFields\n }\n basePrice {\n ...MoneyFields\n }\n salePrice {\n ...MoneyFields\n }\n retailPrice {\n ...MoneyFields\n }\n saved {\n ...MoneyFields\n }\n priceRange {\n min {\n ...MoneyFields\n }\n max {\n ...MoneyFields\n }\n }\n }\n\n fragment MoneyFields on Money {\n value\n currencyCode\n }\n `;\n\n fetch('/graphql', {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiToken}`\n },\n body: JSON.stringify({\n query: query,\n variables: variables,\n }),\n })\n .then(res => res.json())\n .then(json => {\n let result = utils.cleanGraphQLResponse(json);\n window.OnVoardData.storefront.product = result.data.site.product;\n callback(window.OnVoardData.storefront.product);\n });\n}\n\nexport function convertDefaultRate(amount, amountCur='') {\n if (amountCur && amountCur === window.OnVoardData.currency_selector.default_currency_code) return amount;\n let exchange_rate = window.OnVoardData.exchange_rate;\n if (!exchange_rate) return amount;\n\n amount = parseFloat(amount)/parseFloat(exchange_rate);\n amount = Math.round(amount * 100) / 100; // round to 2 decimal float\n amount = Math.round(amount * 20) / 20; // round off to nearest 5 cents\n return amount;\n}\n\nexport function convertActiveRate(amount, amountCur='') {\n if (amountCur && amountCur === window.OnVoardData.currency_selector.active_currency_code) return amount;\n let exchange_rate = window.OnVoardData.exchange_rate;\n if (!exchange_rate) return amount;\n\n amount = parseFloat(amount)*parseFloat(exchange_rate);\n amount = Math.round(amount * 100) / 100; // round to 2 decimal float\n return amount;\n}\n\nexport function executeWithRates(callback) {\n let currency = window.OnVoardData.currency_selector;\n if (currency.default_currency_code === currency.active_currency_code || window.OnVoardData.exchange_rate) {\n callback();\n return;\n }\n\n // diff rates, need to load rates first\n fetch('/graphql', {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${window.OnVoardData.storefront_api_token}`\n },\n body: JSON.stringify({\n query: `\n query getCurrencyDetails($currencyCode: currencyCode!) {\n site {\n currency(currencyCode: $currencyCode) {\n entityId\n code\n name\n isActive\n exchangeRate\n isTransactional\n display {\n decimalToken\n thousandsToken\n decimalPlaces\n }\n }\n }\n }\n `,\n variables: {\n 'currencyCode': currency.active_currency_code\n },\n }),\n })\n .then(res => res.json())\n .then(json => {\n window.OnVoardData['exchange_rate'] = json.data.site.currency.exchangeRate;\n callback();\n });\n}\n\nexport function extractProductCurrency(product) {\n let withoutTax = product.price.without_tax;\n let withTax = product.price.with_tax;\n if (withoutTax && withoutTax.currency) return withoutTax.currency;\n if (withTax && withTax.currency) return withTax.currency;\n return '';\n}\n\nexport function extractProductPrice(product) {\n let withoutTax = product.price.without_tax;\n let withTax = product.price.with_tax;\n if (withoutTax) return withoutTax.value;\n if (withTax) return withTax.value;\n return 0;\n}\n\nexport function extractProductCompareAtPrice(product) {\n let withoutTax = product.price.non_sale_price_without_tax;\n let withTax = product.price.non_sale_price_with_tax;\n if (withoutTax) return withoutTax.value;\n if (withTax) return withTax.value;\n return 0;\n}\n","\nexport const API_VERSION = \"v2\";\nexport const ICON_SET_BOX= \"box\";\nexport const ICON_SET_BLUEPRINT = \"bp\";\nexport const ICON_SET_FONTAWESOME = \"fa\";\n\nexport const DESERIALIZE_TYPE_OBJECT = \"OBJECT\";\nexport const DESERIALIZE_TYPE_ARRAY_OBJECTS = \"ARRAY_OBJECTS\";\nexport const DESERIALIZE_TYPE_CUSTOM = \"CUSTOM\";\n\nexport const COOKIE_EXPIRES_DAYS = 365;\n\nexport const COOKIE_ID = \"ov_cookie_id\";\nexport const COOKIE_CONTACT_ID = \"ov_contact_id\";\n\nexport const COOKIE_REVIEWS_UPVOTED = \"ov_reviews_upvoted\";\nexport const COOKIE_BACKINSTOCK_VISITOR_ID = \"ov_backinstock_visitor_id\";\n\nexport const COOKIE_PROMPT_SESSION_NUM_VIEWED_PAGES = \"ov_prompt_session_num_viewed_pages\";\nexport const COOKIE_PROMPT_SESSION_VISITOR_TYPE = \"ov_prompt_session_visitor_type\";\nexport const COOKIE_PROMPT_SESSION_FIRST_SEEN = \"ov_prompt_session_first_seen\";\nexport const COOKIE_PROMPT_VISITOR_ID = \"ov_prompt_visitor_id\";\nexport const COOKIE_PROMPT_LAST_SEEN = \"ov_prompt_last_seen\";\n\n\n\n","import axios from 'axios';\nimport get from 'lodash/get';\nimport ldIsEmpty from 'lodash/isEmpty';\nimport queryString from 'query-string';\nimport { customAlphabet } from 'nanoid';\nimport dictionary from 'nanoid-dictionary';\nimport * as constants from 'common/constants';\n\n\nexport function isProduction() {\n if (process.env.NODE_ENV === 'production') {\n return true;\n } else {\n return false;\n }\n}\n\nexport function isPreview() {\n if (typeof IS_PREVIEW !== 'undefined' && IS_PREVIEW) return true;\n return false;\n}\n\nexport function isClientProduction() {\n if (isProduction() && !isPreview()) return true;\n return false;\n}\n\nexport function getEcommercePlatform() {\n let ovData = window.OnVoardData;\n if (!ovData) return;\n return ovData.ecommerce_platform;\n}\n\nexport function getPlatformIdentifierForEngagement() {\n let platform = getEcommercePlatform();\n if (platform === 'bigcommerce') return window.OnVoardData.store_hash;\n if (platform === 'easystore') return window.OnVoardData.shop.domain;\n if (platform === 'shopify' && window.OnVoardData) return window.OnVoardData.shop.myshopify_domain;\n if (platform === 'shopline') return window.Shopline.storeId;\n if (platform === 'shopware') return window.OnVoardData.app_shop_id;\n if (platform === 'wix') return window.OnVoardData.account_id;\n if (platform === 'woocommerce') return window.location.hostname;\n return;\n}\n\nexport function isBrowser() {\n return typeof window !== 'undefined';\n}\n\n// https://stackoverflow.com/a/26824304/1446284\nexport function isInt(val) {\n var expression = /^[0-9]+$/;\n return expression.test(val);\n}\n\n// https://stackoverflow.com/a/9716488/1446284\nexport function isNumeric(val) {\n return !isNaN(parseFloat(val)) && isFinite(val);\n}\n\nexport function isBoolean(value) {\n return typeof value === 'boolean';\n}\n\nexport function isString(val) {\n return typeof val === 'string';\n}\n\nexport function isFunction(val) {\n return typeof val === 'function';\n}\n\nexport function isArray(val) {\n return Array.isArray(val);\n}\n\nexport function isObject(val) {\n return (!!val) && (val.constructor === Object);\n}\n\nexport function isEmpty(val) {\n return ldIsEmpty(val);\n}\n\nexport function stringContains(string, subString) {\n return string.indexOf(subString) !== -1;\n}\n\n// Use jquery's `inArray` to check if value is in array.\n// Will return boolean instead of value index\nexport function inArray(item, arrayList) {\n if ($.inArray(item, arrayList) !== -1) return true;\n return false;\n}\n\nexport function loopObject(object, callback) {\n for (var k in object) {\n let v = object[k];\n callback(k, v);\n }\n}\n\nexport function getRandomInt(max) {\n return Math.floor(Math.random() * Math.floor(max));\n}\n\nexport function generateHash(length=16) {\n return [...Array(length)].map(() => Math.random().toString(36)[2]).join('');\n}\n\nexport function formatAmount(amount) {\n amount = amount.toString();\n amount = amount.replace(/[^0-9.-]/g, '');\n amount = parseFloat(amount);\n return amount;\n}\n\nexport function isMobileScreen() {\n if (!isBrowser()) return;\n var screenWidth = window.screen.width;\n var screenHeight = window.screen.height;\n return screenWidth >= 768 ? false : true;\n}\n\n// In seconds precision\nexport function getCurrentTimestamp() {\n return Math.floor(Date.now() / 1000);\n}\n\nexport function currentURL() {\n if (!isBrowser()) return;\n return window.location.href;\n}\n\nexport function currentURLWithoutParams() {\n if (!isBrowser()) return;\n return window.location.protocol + '//' + window.location.host + window.location.pathname;\n}\n\nexport function currentDomain() {\n if (!isBrowser()) return;\n return window.location.hostname;\n}\n\nexport function currentURLPath() {\n if (!isBrowser()) return;\n return window.location.pathname;\n}\n\nexport function getScrollPercent() {\n if (!isBrowser()) return;\n const h = document.documentElement;\n const b = document.body;\n const st = 'scrollTop';\n const sh = 'scrollHeight';\n return (h[st]||b[st]) / ((h[sh]||b[sh]) - h.clientHeight) * 100;\n}\n\n\nexport function appendQueryString(url, qs) {\n const parsed = queryString.parseUrl(url);\n qs = {...parsed.query, ...qs};\n\n Object.keys(qs).forEach((key) => (qs[key] === null || qs[key] === \"\") && delete qs[key]);\n let stringified = queryString.stringify(qs);\n if (!stringified) {\n return url;\n } else {\n return url + \"?\" + stringified;\n }\n}\n\n// {url: 'https://foo.bar', query: {foo: 'bar'}}\nexport function parseUrl(url) {\n return queryString.parseUrl(url);\n}\n\n// {foo: 'bar'}\nexport function parseQueryString(val) {\n return queryString.parse(val);\n}\n\nexport function removeQueryString(url) {\n return url.split(\"?\")[0];\n}\n\n// Scroll to top of element. Useful when you are using scrollable elements\nexport function scrollElementTop(el) {\n el.scrollTop = el.scrollHeight;\n\n setTimeout(() => {\n el.scrollTop = 0;\n }, 100);\n}\n\nexport function getCssValueForSelector(selector, propKey) {\n if (!isBrowser()) return;\n const el = document.querySelector(selector);\n if (!el) return;\n\n style = window.getComputedStyle(el);\n return style.getPropertyValue(propKey);\n}\n\nexport function attachUrlChangeEvent() {\n if (window.OV_ATTACHED_URL_CHANGE_EVENT) return null;\n\n let platform = getEcommercePlatform();\n\n // shopline need this to detect\n // https://phpcoder.tech/detect-url-change-in-javascript-without-refresh/\n if (platform === 'shopline') {\n let lastUrl = location.href;\n new MutationObserver(() => {\n const url = location.href;\n if (url !== lastUrl) {\n lastUrl = url;\n window.dispatchEvent(new Event('ovurlchange'));\n }\n }).observe(document, {subtree: true, childList: true});\n\n window.OV_ATTACHED_URL_CHANGE_EVENT = 1;\n return;\n }\n\n // See https://stackoverflow.com/a/52809105/1446284\n history.pushState = (f => function pushState(){\n var ret = f.apply(this, arguments);\n window.dispatchEvent(new Event('pushstate'));\n window.dispatchEvent(new Event('ovurlchange'));\n return ret;\n })(history.pushState);\n\n history.replaceState = (f => function replaceState(){\n var ret = f.apply(this, arguments);\n window.dispatchEvent(new Event('replacestate'));\n window.dispatchEvent(new Event('ovurlchange'));\n return ret;\n })(history.replaceState);\n\n window.addEventListener('popstate', () => {\n window.dispatchEvent(new Event('ovurlchange'))\n });\n\n window.OV_ATTACHED_URL_CHANGE_EVENT = 1;\n}\n\nexport function attachHashChangeEvent() {\n if (window.OV_ATTACHED_HASH_CHANGE_EVENT) return null;\n\n window.addEventListener('hashchange', () => {\n window.dispatchEvent(new Event('ovhashchange'))\n });\n\n window.OV_ATTACHED_HASH_CHANGE_EVENT = 1;\n}\n\n// See https://stackoverflow.com/a/43467144/1446284\nexport function isValidUrl(value) {\n if (!value) return false;\n if (value.startsWith(\"//\")) value = value.replace(\"//\", \"https://\");\n if (!value.startsWith(\"http://\") && !value.startsWith(\"https://\")) {\n value = `http://${value}`\n }\n\n let url;\n try {\n url = new URL(value);\n } catch (_) {\n return false;\n }\n\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n}\n\n// https://gist.github.com/ManUtopiK/469aec75b655d6a4d912aeb3b75af3c9\nexport function cleanGraphQLResponse(input) {\n if (!input) return null\n const output = {}\n const isObject = obj => {\n return obj !== null && typeof obj === 'object' && !Array.isArray(obj)\n }\n\n Object.keys(input).forEach(key => {\n if (input[key] && input[key].edges) {\n output[key] = input[key].edges.map(edge =>\n cleanGraphQLResponse(edge.node)\n )\n } else if (isObject(input[key])) {\n output[key] = cleanGraphQLResponse(input[key])\n } else if (key !== '__typename') {\n output[key] = input[key]\n }\n })\n\n return output\n}\n\n\nconst requestAnimFrame = (function() {\n if (window.requestAnimationFrame) return window.requestAnimationFrame;\n return (callback, element) => window.setTimeout(callback, 1000 / 60);\n})();\n\n// See https://gist.github.com/joelambert/1002116\nexport function requestInterval(fn, delay) {\n if(!window.requestAnimationFrame) return window.setInterval(fn, delay);\n\n let start = new Date().getTime();\n let handle = new Object();\n\n function loop() {\n var current = new Date().getTime(),\n delta = current - start;\n\n if(delta >= delay) {\n fn.call();\n start = new Date().getTime();\n }\n\n handle.value = requestAnimFrame(loop);\n };\n\n handle.value = requestAnimFrame(loop);\n return handle;\n}\n\n\n// See https://gist.github.com/joelambert/1002116\nexport function clearRequestInterval(handle) {\n if (window.cancelAnimationFrame) window.cancelAnimationFrame(handle.value);\n clearInterval(handle);\n}\n\nexport function stringifyError(error) {\n try {\n error = JSON.stringify(error);\n } catch {}\n return error;\n}\n\nexport function printErrors(errors) {\n if (isArray(errors)) {\n errors.forEach((error) => {\n console.log(error);\n });\n\n return;\n }\n\n if (isObject(errors)) {\n for (let [key, value] of Object.entries(errors)) {\n console.log(`${key}: ${value}`);\n }\n\n return;\n }\n\n console.log(errors);\n}\n\n\n//===================================================\n// interceptRequests\n//===================================================\n// https://gist.github.com/sergeimuller/a609a9df7d30e2625a177123797471e2\nfunction replaceXHROpen(interceptPaths, callback) {\n let oldXHROpen = window.XMLHttpRequest.prototype.open;\n window.XMLHttpRequest.prototype.open = function(method, url, async, user, password) {\n this.addEventListener('load', function() {\n if (!interceptPaths.some((path) => url.includes(path))) return;\n\n // Can't guarantee response is always json\n callback(this.response, url);\n });\n\n oldXHROpen.apply(this, arguments);\n }\n\n // required because some apps or themes mess jQuery up and causing unexpected issues\n try {\n if (window.jQuery) {\n jQuery(document).ajaxSuccess(function(event, xhr, settings) {\n if (!interceptPaths.some((path) => settings.url.includes(path))) return;\n\n // Can't guarantee response is always json\n callback(xhr.responseText, settings.url);\n });\n }\n } catch(e) {}\n}\n\n// https://stackoverflow.com/a/64961272/1446284\nfunction replaceFetch(interceptPaths, callback) {\n let oldFetch = window.fetch;\n window.fetch = async (...args) => {\n const reqUrl = args[0];\n const response = await oldFetch(...args);\n if (!reqUrl || !interceptPaths.some((path) => reqUrl.includes(path))) return response;\n\n // Can't guarantee response is always json\n response\n .clone()\n .text()\n .then((textResponse) => {\n callback(textResponse, reqUrl);\n })\n .catch((err) => {\n console.error(err);\n })\n\n return response;\n }\n}\n\n\nexport function interceptRequests(interceptPaths, callback) {\n if (getEcommercePlatform() === 'shopline' && window.__AJAX_INTERCEPTOR__) {\n window.__AJAX_INTERCEPTOR__((data) => {\n if (data.method !== 'GET') return;\n if (!interceptPaths.some((path) => data.url.includes(path))) return;\n\n // Can't guarantee response is always json\n callback(data.xhr.responseText, data.url);\n });\n }\n\n replaceXHROpen(interceptPaths, callback);\n replaceFetch(interceptPaths, callback);\n}\n\n\n//===================================================\n// API Utils\n//===================================================\nexport function handleErrorCallback(error, errorCallback) {\n if (error.response) {\n if (error.response.status === 500) {\n errorCallback(\"Server error 500. This error indicates that there are some issues on our end.\");\n return;\n }\n\n if (error.response.data) {\n if (error.response.data.errors && Array.isArray(error.response.data.errors)) {\n errorCallback(error.response.data.errors.join(\"\\n\"));\n return;\n }\n\n errorCallback(error.response.data);\n return;\n }\n }\n\n errorCallback(error.message);\n}\n\nexport function handleRqSuccess(response, successCallback) {\n successCallback(response.data);\n};\n\n\nexport function handleRqError(error, errorCallback) {\n handleErrorCallback(error, errorCallback);\n};\n\n\nexport function getRq(kwargs) {\n const config = {};\n config['method'] = 'get';\n config['url'] = kwargs.url;\n if (kwargs.headers) config['headers'] = kwargs.headers;\n\n axios(config)\n .then((response) => handleRqSuccess(response, kwargs.successCallback))\n .catch((error) => handleRqError(error, kwargs.errorCallback));\n};\n\nexport function postRq(kwargs) {\n const config = {};\n config['method'] = 'post';\n config['url'] = kwargs.url;\n config['data'] = kwargs.data || \"{}\";\n if (kwargs.headers) config['headers'] = kwargs.headers;\n\n axios(config)\n .then((response) => handleRqSuccess(response, kwargs.successCallback))\n .catch((error) => handleRqError(error, kwargs.errorCallback));\n};\n\nexport function buildUrl(path, qs={}) {\n return appendQueryString(`${BASE_API_URL}/${constants.API_VERSION}/${path}`, qs);\n}\n\nexport function uniqueId(prefix='', length=16) {\n const generator = customAlphabet(dictionary.alphanumeric, length);\n let id = generator();\n if (prefix) id = `${prefix}${id}`;\n return id;\n}\n\n// https://github.com/scopsy/await-to-js\nexport function to(promise) {\n return promise.then(data => {\n return [null, data];\n })\n .catch(err => [err]);\n}\n"],"names":["loadStorefrontProductData","callback","window","OnVoardData","product","storefront_api_token","storefront","apiToken","variables","parseInt","id","fetch","method","credentials","headers","body","JSON","stringify","query","then","res","json","result","utils","data","site","convertDefaultRate","amount","amountCur","currency_selector","default_currency_code","exchange_rate","parseFloat","Math","round","convertActiveRate","active_currency_code","executeWithRates","currency","exchangeRate","extractProductCurrency","withoutTax","price","without_tax","withTax","with_tax","extractProductPrice","value","extractProductCompareAtPrice","non_sale_price_without_tax","non_sale_price_with_tax","API_VERSION","ICON_SET_BOX","ICON_SET_BLUEPRINT","ICON_SET_FONTAWESOME","DESERIALIZE_TYPE_OBJECT","DESERIALIZE_TYPE_ARRAY_OBJECTS","DESERIALIZE_TYPE_CUSTOM","COOKIE_EXPIRES_DAYS","COOKIE_ID","COOKIE_CONTACT_ID","COOKIE_REVIEWS_UPVOTED","COOKIE_BACKINSTOCK_VISITOR_ID","COOKIE_PROMPT_SESSION_NUM_VIEWED_PAGES","COOKIE_PROMPT_SESSION_VISITOR_TYPE","COOKIE_PROMPT_SESSION_FIRST_SEEN","COOKIE_PROMPT_VISITOR_ID","COOKIE_PROMPT_LAST_SEEN","isProduction","isPreview","IS_PREVIEW","isClientProduction","getEcommercePlatform","ovData","ecommerce_platform","getPlatformIdentifierForEngagement","platform","store_hash","shop","domain","myshopify_domain","Shopline","storeId","app_shop_id","account_id","location","hostname","isBrowser","isInt","val","test","isNumeric","isNaN","isFinite","isBoolean","isString","isFunction","isArray","Array","isObject","constructor","Object","isEmpty","ldIsEmpty","stringContains","string","subString","indexOf","inArray","item","arrayList","$","loopObject","object","k","getRandomInt","max","floor","random","generateHash","length","map","toString","join","formatAmount","replace","isMobileScreen","screenWidth","screen","width","height","getCurrentTimestamp","Date","now","currentURL","href","currentURLWithoutParams","protocol","host","pathname","currentDomain","currentURLPath","getScrollPercent","h","document","documentElement","b","st","sh","clientHeight","appendQueryString","url","qs","parsed","queryString","keys","forEach","key","stringified","parseUrl","parseQueryString","removeQueryString","split","scrollElementTop","el","scrollTop","scrollHeight","setTimeout","getCssValueForSelector","selector","propKey","querySelector","style","getComputedStyle","getPropertyValue","attachUrlChangeEvent","OV_ATTACHED_URL_CHANGE_EVENT","f","lastUrl","MutationObserver","dispatchEvent","Event","observe","subtree","childList","history","pushState","ret","apply","this","arguments","replaceState","addEventListener","attachHashChangeEvent","OV_ATTACHED_HASH_CHANGE_EVENT","isValidUrl","startsWith","URL","_","cleanGraphQLResponse","input","output","obj","edges","edge","node","requestAnimFrame","requestAnimationFrame","element","requestInterval","fn","delay","setInterval","start","getTime","handle","loop","call","clearRequestInterval","cancelAnimationFrame","clearInterval","stringifyError","error","printErrors","errors","console","log","entries","interceptRequests","interceptPaths","__AJAX_INTERCEPTOR__","some","path","includes","xhr","responseText","oldXHROpen","XMLHttpRequest","prototype","open","async","user","password","response","jQuery","ajaxSuccess","event","settings","e","replaceXHROpen","oldFetch","reqUrl","clone","text","textResponse","err","replaceFetch","handleErrorCallback","errorCallback","status","message","handleRqSuccess","successCallback","handleRqError","getRq","kwargs","config","axios","postRq","buildUrl","BASE_API_URL","constants","uniqueId","prefix","generator","customAlphabet","dictionary","to","promise"],"sourceRoot":""}