whoami7 - Manager
:
/
home
/
dataiclx
/
vielorbe.com
/
wp-content
/
plugins
/
surecart
/
dist
/
components
/
surecart
/
Upload File:
files >> //home/dataiclx/vielorbe.com/wp-content/plugins/surecart/dist/components/surecart/p-d9fa04f9.js.map
{"version":3,"names":["hasQueryArg","url","arg","getQueryArg","undefined","normalizePath","path","splitted","split","query","base","map","entry","pair","decodeURIComponent","sort","a","b","localeCompare","encodeURIComponent","join","createNonceMiddleware","nonce","middleware","options","next","headers","headerName","toLowerCase","namespaceAndEndpointMiddleware","namespaceTrimmed","endpointTrimmed","namespace","endpoint","replace","createRootURLMiddleware","rootURL","optionsWithPath","apiRoot","indexOf","createPreloadingMiddleware","preloadedData","cache","Object","fromEntries","entries","data","parse","rawPath","rest_route","pathFromQuery","queryArgs","getQueryArgs","addQueryArgs","method","cacheData","prepareResponse","responseData","Promise","resolve","body","window","Response","JSON","stringify","status","statusText","modifyQuery","parseResponse","response","json","reject","parseLinkHeader","linkHeader","match","getNextPageUrl","get","requestContainsUnboundedQuery","pathIsUnbounded","urlIsUnbounded","fetchAllMiddleware","async","apiFetch","per_page","results","Array","isArray","nextPage","mergedResults","concat","nextResponse","nextResults","OVERRIDE_METHODS","Set","DEFAULT_METHOD","httpV1Middleware","has","toUpperCase","userLocaleMiddleware","_locale","shouldParseResponse","parseJsonAndNormalizeError$1","invalidJsonError","code","message","wp","i18n","__","catch","res","parseAndThrowError","then","error","unknownError","isMediaUploadRequest","isCreateMethod","isMediaEndpoint","mediaUploadMiddleware","retries","maxRetries","postProcess","attachmentId","action","parseResponseAndNormalizeError","createThemePreviewMiddleware","themePath","wpThemePreview","wp_theme_preview","removeQueryArgs","DEFAULT_HEADERS","Accept","DEFAULT_OPTIONS","credentials","middlewares","registerMiddleware","unshift","checkStatus","defaultFetchHandler","nextOptions","remainingOptions","responsePromise","fetch","location","href","value","err","name","fetchHandler","setFetchHandler","newFetchHandler","enhancedHandler","reduceRight","workingOptions","nonceEndpoint","text","nonceMiddleware","use","_b","_a","parent","scData","root_url","_c","_d","_f","nonce_endpoint","sprintf","debugSettingsUrl"],"sources":["../../node_modules/@wordpress/url/build-module/has-query-arg.js","../../node_modules/@wordpress/url/build-module/normalize-path.js","../../node_modules/@wordpress/api-fetch/build-module/middlewares/nonce.js","../../node_modules/@wordpress/api-fetch/build-module/middlewares/namespace-endpoint.js","../../node_modules/@wordpress/api-fetch/build-module/middlewares/root-url.js","../../node_modules/@wordpress/api-fetch/build-module/middlewares/preloading.js","../../node_modules/@wordpress/api-fetch/build-module/middlewares/fetch-all-middleware.js","../../node_modules/@wordpress/api-fetch/build-module/middlewares/http-v1.js","../../node_modules/@wordpress/api-fetch/build-module/middlewares/user-locale.js","../../node_modules/@wordpress/api-fetch/build-module/utils/response.js","../../node_modules/@wordpress/api-fetch/build-module/middlewares/media-upload.js","../../node_modules/@wordpress/api-fetch/build-module/middlewares/theme-preview.js","../../node_modules/@wordpress/api-fetch/build-module/index.js","src/functions/fetch.ts"],"sourcesContent":["/**\n * Internal dependencies\n */\nimport { getQueryArg } from './get-query-arg';\n\n/**\n * Determines whether the URL contains a given query arg.\n *\n * @param {string} url URL.\n * @param {string} arg Query arg name.\n *\n * @example\n * ```js\n * const hasBar = hasQueryArg( 'https://wordpress.org?foo=bar&bar=baz', 'bar' ); // true\n * ```\n *\n * @return {boolean} Whether or not the URL contains the query arg.\n */\nexport function hasQueryArg(url, arg) {\n return getQueryArg(url, arg) !== undefined;\n}\n//# sourceMappingURL=has-query-arg.js.map","/**\n * Given a path, returns a normalized path where equal query parameter values\n * will be treated as identical, regardless of order they appear in the original\n * text.\n *\n * @param {string} path Original path.\n *\n * @return {string} Normalized path.\n */\nexport function normalizePath(path) {\n const splitted = path.split('?');\n const query = splitted[1];\n const base = splitted[0];\n if (!query) {\n return base;\n }\n\n // 'b=1%2C2&c=2&a=5'\n return base + '?' + query\n // [ 'b=1%2C2', 'c=2', 'a=5' ]\n .split('&')\n // [ [ 'b, '1%2C2' ], [ 'c', '2' ], [ 'a', '5' ] ]\n .map(entry => entry.split('='))\n // [ [ 'b', '1,2' ], [ 'c', '2' ], [ 'a', '5' ] ]\n .map(pair => pair.map(decodeURIComponent))\n // [ [ 'a', '5' ], [ 'b, '1,2' ], [ 'c', '2' ] ]\n .sort((a, b) => a[0].localeCompare(b[0]))\n // [ [ 'a', '5' ], [ 'b, '1%2C2' ], [ 'c', '2' ] ]\n .map(pair => pair.map(encodeURIComponent))\n // [ 'a=5', 'b=1%2C2', 'c=2' ]\n .map(pair => pair.join('='))\n // 'a=5&b=1%2C2&c=2'\n .join('&');\n}\n//# sourceMappingURL=normalize-path.js.map","/**\n * @param {string} nonce\n * @return {import('../types').APIFetchMiddleware & { nonce: string }} A middleware to enhance a request with a nonce.\n */\nfunction createNonceMiddleware(nonce) {\n /**\n * @type {import('../types').APIFetchMiddleware & { nonce: string }}\n */\n const middleware = (options, next) => {\n const {\n headers = {}\n } = options;\n\n // If an 'X-WP-Nonce' header (or any case-insensitive variation\n // thereof) was specified, no need to add a nonce header.\n for (const headerName in headers) {\n if (headerName.toLowerCase() === 'x-wp-nonce' && headers[headerName] === middleware.nonce) {\n return next(options);\n }\n }\n return next({\n ...options,\n headers: {\n ...headers,\n 'X-WP-Nonce': middleware.nonce\n }\n });\n };\n middleware.nonce = nonce;\n return middleware;\n}\nexport default createNonceMiddleware;\n//# sourceMappingURL=nonce.js.map","/**\n * @type {import('../types').APIFetchMiddleware}\n */\nconst namespaceAndEndpointMiddleware = (options, next) => {\n let path = options.path;\n let namespaceTrimmed, endpointTrimmed;\n if (typeof options.namespace === 'string' && typeof options.endpoint === 'string') {\n namespaceTrimmed = options.namespace.replace(/^\\/|\\/$/g, '');\n endpointTrimmed = options.endpoint.replace(/^\\//, '');\n if (endpointTrimmed) {\n path = namespaceTrimmed + '/' + endpointTrimmed;\n } else {\n path = namespaceTrimmed;\n }\n }\n delete options.namespace;\n delete options.endpoint;\n return next({\n ...options,\n path\n });\n};\nexport default namespaceAndEndpointMiddleware;\n//# sourceMappingURL=namespace-endpoint.js.map","/**\n * Internal dependencies\n */\nimport namespaceAndEndpointMiddleware from './namespace-endpoint';\n\n/**\n * @param {string} rootURL\n * @return {import('../types').APIFetchMiddleware} Root URL middleware.\n */\nconst createRootURLMiddleware = rootURL => (options, next) => {\n return namespaceAndEndpointMiddleware(options, optionsWithPath => {\n let url = optionsWithPath.url;\n let path = optionsWithPath.path;\n let apiRoot;\n if (typeof path === 'string') {\n apiRoot = rootURL;\n if (-1 !== rootURL.indexOf('?')) {\n path = path.replace('?', '&');\n }\n path = path.replace(/^\\//, '');\n\n // API root may already include query parameter prefix if site is\n // configured to use plain permalinks.\n if ('string' === typeof apiRoot && -1 !== apiRoot.indexOf('?')) {\n path = path.replace('?', '&');\n }\n url = apiRoot + path;\n }\n return next({\n ...optionsWithPath,\n url\n });\n });\n};\nexport default createRootURLMiddleware;\n//# sourceMappingURL=root-url.js.map","/**\n * WordPress dependencies\n */\nimport { addQueryArgs, getQueryArgs, normalizePath } from '@wordpress/url';\n\n/**\n * @param {Record<string, any>} preloadedData\n * @return {import('../types').APIFetchMiddleware} Preloading middleware.\n */\nfunction createPreloadingMiddleware(preloadedData) {\n const cache = Object.fromEntries(Object.entries(preloadedData).map(([path, data]) => [normalizePath(path), data]));\n return (options, next) => {\n const {\n parse = true\n } = options;\n /** @type {string | void} */\n let rawPath = options.path;\n if (!rawPath && options.url) {\n const {\n rest_route: pathFromQuery,\n ...queryArgs\n } = getQueryArgs(options.url);\n if (typeof pathFromQuery === 'string') {\n rawPath = addQueryArgs(pathFromQuery, queryArgs);\n }\n }\n if (typeof rawPath !== 'string') {\n return next(options);\n }\n const method = options.method || 'GET';\n const path = normalizePath(rawPath);\n if ('GET' === method && cache[path]) {\n const cacheData = cache[path];\n\n // Unsetting the cache key ensures that the data is only used a single time.\n delete cache[path];\n return prepareResponse(cacheData, !!parse);\n } else if ('OPTIONS' === method && cache[method] && cache[method][path]) {\n const cacheData = cache[method][path];\n\n // Unsetting the cache key ensures that the data is only used a single time.\n delete cache[method][path];\n return prepareResponse(cacheData, !!parse);\n }\n return next(options);\n };\n}\n\n/**\n * This is a helper function that sends a success response.\n *\n * @param {Record<string, any>} responseData\n * @param {boolean} parse\n * @return {Promise<any>} Promise with the response.\n */\nfunction prepareResponse(responseData, parse) {\n return Promise.resolve(parse ? responseData.body : new window.Response(JSON.stringify(responseData.body), {\n status: 200,\n statusText: 'OK',\n headers: responseData.headers\n }));\n}\nexport default createPreloadingMiddleware;\n//# sourceMappingURL=preloading.js.map","/**\n * WordPress dependencies\n */\nimport { addQueryArgs } from '@wordpress/url';\n\n/**\n * Internal dependencies\n */\nimport apiFetch from '..';\n\n/**\n * Apply query arguments to both URL and Path, whichever is present.\n *\n * @param {import('../types').APIFetchOptions} props\n * @param {Record<string, string | number>} queryArgs\n * @return {import('../types').APIFetchOptions} The request with the modified query args\n */\nconst modifyQuery = ({\n path,\n url,\n ...options\n}, queryArgs) => ({\n ...options,\n url: url && addQueryArgs(url, queryArgs),\n path: path && addQueryArgs(path, queryArgs)\n});\n\n/**\n * Duplicates parsing functionality from apiFetch.\n *\n * @param {Response} response\n * @return {Promise<any>} Parsed response json.\n */\nconst parseResponse = response => response.json ? response.json() : Promise.reject(response);\n\n/**\n * @param {string | null} linkHeader\n * @return {{ next?: string }} The parsed link header.\n */\nconst parseLinkHeader = linkHeader => {\n if (!linkHeader) {\n return {};\n }\n const match = linkHeader.match(/<([^>]+)>; rel=\"next\"/);\n return match ? {\n next: match[1]\n } : {};\n};\n\n/**\n * @param {Response} response\n * @return {string | undefined} The next page URL.\n */\nconst getNextPageUrl = response => {\n const {\n next\n } = parseLinkHeader(response.headers.get('link'));\n return next;\n};\n\n/**\n * @param {import('../types').APIFetchOptions} options\n * @return {boolean} True if the request contains an unbounded query.\n */\nconst requestContainsUnboundedQuery = options => {\n const pathIsUnbounded = !!options.path && options.path.indexOf('per_page=-1') !== -1;\n const urlIsUnbounded = !!options.url && options.url.indexOf('per_page=-1') !== -1;\n return pathIsUnbounded || urlIsUnbounded;\n};\n\n/**\n * The REST API enforces an upper limit on the per_page option. To handle large\n * collections, apiFetch consumers can pass `per_page=-1`; this middleware will\n * then recursively assemble a full response array from all available pages.\n *\n * @type {import('../types').APIFetchMiddleware}\n */\nconst fetchAllMiddleware = async (options, next) => {\n if (options.parse === false) {\n // If a consumer has opted out of parsing, do not apply middleware.\n return next(options);\n }\n if (!requestContainsUnboundedQuery(options)) {\n // If neither url nor path is requesting all items, do not apply middleware.\n return next(options);\n }\n\n // Retrieve requested page of results.\n const response = await apiFetch({\n ...modifyQuery(options, {\n per_page: 100\n }),\n // Ensure headers are returned for page 1.\n parse: false\n });\n const results = await parseResponse(response);\n if (!Array.isArray(results)) {\n // We have no reliable way of merging non-array results.\n return results;\n }\n let nextPage = getNextPageUrl(response);\n if (!nextPage) {\n // There are no further pages to request.\n return results;\n }\n\n // Iteratively fetch all remaining pages until no \"next\" header is found.\n let mergedResults = /** @type {any[]} */[].concat(results);\n while (nextPage) {\n const nextResponse = await apiFetch({\n ...options,\n // Ensure the URL for the next page is used instead of any provided path.\n path: undefined,\n url: nextPage,\n // Ensure we still get headers so we can identify the next page.\n parse: false\n });\n const nextResults = await parseResponse(nextResponse);\n mergedResults = mergedResults.concat(nextResults);\n nextPage = getNextPageUrl(nextResponse);\n }\n return mergedResults;\n};\nexport default fetchAllMiddleware;\n//# sourceMappingURL=fetch-all-middleware.js.map","/**\n * Set of HTTP methods which are eligible to be overridden.\n *\n * @type {Set<string>}\n */\nconst OVERRIDE_METHODS = new Set(['PATCH', 'PUT', 'DELETE']);\n\n/**\n * Default request method.\n *\n * \"A request has an associated method (a method). Unless stated otherwise it\n * is `GET`.\"\n *\n * @see https://fetch.spec.whatwg.org/#requests\n *\n * @type {string}\n */\nconst DEFAULT_METHOD = 'GET';\n\n/**\n * API Fetch middleware which overrides the request method for HTTP v1\n * compatibility leveraging the REST API X-HTTP-Method-Override header.\n *\n * @type {import('../types').APIFetchMiddleware}\n */\nconst httpV1Middleware = (options, next) => {\n const {\n method = DEFAULT_METHOD\n } = options;\n if (OVERRIDE_METHODS.has(method.toUpperCase())) {\n options = {\n ...options,\n headers: {\n ...options.headers,\n 'X-HTTP-Method-Override': method,\n 'Content-Type': 'application/json'\n },\n method: 'POST'\n };\n }\n return next(options);\n};\nexport default httpV1Middleware;\n//# sourceMappingURL=http-v1.js.map","/**\n * WordPress dependencies\n */\nimport { addQueryArgs, hasQueryArg } from '@wordpress/url';\n\n/**\n * @type {import('../types').APIFetchMiddleware}\n */\nconst userLocaleMiddleware = (options, next) => {\n if (typeof options.url === 'string' && !hasQueryArg(options.url, '_locale')) {\n options.url = addQueryArgs(options.url, {\n _locale: 'user'\n });\n }\n if (typeof options.path === 'string' && !hasQueryArg(options.path, '_locale')) {\n options.path = addQueryArgs(options.path, {\n _locale: 'user'\n });\n }\n return next(options);\n};\nexport default userLocaleMiddleware;\n//# sourceMappingURL=user-locale.js.map","/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Parses the apiFetch response.\n *\n * @param {Response} response\n * @param {boolean} shouldParseResponse\n *\n * @return {Promise<any> | null | Response} Parsed response.\n */\nconst parseResponse = (response, shouldParseResponse = true) => {\n if (shouldParseResponse) {\n if (response.status === 204) {\n return null;\n }\n return response.json ? response.json() : Promise.reject(response);\n }\n return response;\n};\n\n/**\n * Calls the `json` function on the Response, throwing an error if the response\n * doesn't have a json function or if parsing the json itself fails.\n *\n * @param {Response} response\n * @return {Promise<any>} Parsed response.\n */\nconst parseJsonAndNormalizeError = response => {\n const invalidJsonError = {\n code: 'invalid_json',\n message: __('The response is not a valid JSON response.')\n };\n if (!response || !response.json) {\n throw invalidJsonError;\n }\n return response.json().catch(() => {\n throw invalidJsonError;\n });\n};\n\n/**\n * Parses the apiFetch response properly and normalize response errors.\n *\n * @param {Response} response\n * @param {boolean} shouldParseResponse\n *\n * @return {Promise<any>} Parsed response.\n */\nexport const parseResponseAndNormalizeError = (response, shouldParseResponse = true) => {\n return Promise.resolve(parseResponse(response, shouldParseResponse)).catch(res => parseAndThrowError(res, shouldParseResponse));\n};\n\n/**\n * Parses a response, throwing an error if parsing the response fails.\n *\n * @param {Response} response\n * @param {boolean} shouldParseResponse\n * @return {Promise<any>} Parsed response.\n */\nexport function parseAndThrowError(response, shouldParseResponse = true) {\n if (!shouldParseResponse) {\n throw response;\n }\n return parseJsonAndNormalizeError(response).then(error => {\n const unknownError = {\n code: 'unknown_error',\n message: __('An unknown error occurred.')\n };\n throw error || unknownError;\n });\n}\n//# sourceMappingURL=response.js.map","/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport { parseAndThrowError, parseResponseAndNormalizeError } from '../utils/response';\n\n/**\n * @param {import('../types').APIFetchOptions} options\n * @return {boolean} True if the request is for media upload.\n */\nfunction isMediaUploadRequest(options) {\n const isCreateMethod = !!options.method && options.method === 'POST';\n const isMediaEndpoint = !!options.path && options.path.indexOf('/wp/v2/media') !== -1 || !!options.url && options.url.indexOf('/wp/v2/media') !== -1;\n return isMediaEndpoint && isCreateMethod;\n}\n\n/**\n * Middleware handling media upload failures and retries.\n *\n * @type {import('../types').APIFetchMiddleware}\n */\nconst mediaUploadMiddleware = (options, next) => {\n if (!isMediaUploadRequest(options)) {\n return next(options);\n }\n let retries = 0;\n const maxRetries = 5;\n\n /**\n * @param {string} attachmentId\n * @return {Promise<any>} Processed post response.\n */\n const postProcess = attachmentId => {\n retries++;\n return next({\n path: `/wp/v2/media/${attachmentId}/post-process`,\n method: 'POST',\n data: {\n action: 'create-image-subsizes'\n },\n parse: false\n }).catch(() => {\n if (retries < maxRetries) {\n return postProcess(attachmentId);\n }\n next({\n path: `/wp/v2/media/${attachmentId}?force=true`,\n method: 'DELETE'\n });\n return Promise.reject();\n });\n };\n return next({\n ...options,\n parse: false\n }).catch(response => {\n const attachmentId = response.headers.get('x-wp-upload-attachment-id');\n if (response.status >= 500 && response.status < 600 && attachmentId) {\n return postProcess(attachmentId).catch(() => {\n if (options.parse !== false) {\n return Promise.reject({\n code: 'post_process',\n message: __('Media upload failed. If this is a photo or a large image, please scale it down and try again.')\n });\n }\n return Promise.reject(response);\n });\n }\n return parseAndThrowError(response, options.parse);\n }).then(response => parseResponseAndNormalizeError(response, options.parse));\n};\nexport default mediaUploadMiddleware;\n//# sourceMappingURL=media-upload.js.map","/**\n * WordPress dependencies\n */\nimport { addQueryArgs, getQueryArg, removeQueryArgs } from '@wordpress/url';\n\n/**\n * This appends a `wp_theme_preview` parameter to the REST API request URL if\n * the admin URL contains a `theme` GET parameter.\n *\n * If the REST API request URL has contained the `wp_theme_preview` parameter as `''`,\n * then bypass this middleware.\n *\n * @param {Record<string, any>} themePath\n * @return {import('../types').APIFetchMiddleware} Preloading middleware.\n */\nconst createThemePreviewMiddleware = themePath => (options, next) => {\n if (typeof options.url === 'string') {\n const wpThemePreview = getQueryArg(options.url, 'wp_theme_preview');\n if (wpThemePreview === undefined) {\n options.url = addQueryArgs(options.url, {\n wp_theme_preview: themePath\n });\n } else if (wpThemePreview === '') {\n options.url = removeQueryArgs(options.url, 'wp_theme_preview');\n }\n }\n if (typeof options.path === 'string') {\n const wpThemePreview = getQueryArg(options.path, 'wp_theme_preview');\n if (wpThemePreview === undefined) {\n options.path = addQueryArgs(options.path, {\n wp_theme_preview: themePath\n });\n } else if (wpThemePreview === '') {\n options.path = removeQueryArgs(options.path, 'wp_theme_preview');\n }\n }\n return next(options);\n};\nexport default createThemePreviewMiddleware;\n//# sourceMappingURL=theme-preview.js.map","/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport createNonceMiddleware from './middlewares/nonce';\nimport createRootURLMiddleware from './middlewares/root-url';\nimport createPreloadingMiddleware from './middlewares/preloading';\nimport fetchAllMiddleware from './middlewares/fetch-all-middleware';\nimport namespaceEndpointMiddleware from './middlewares/namespace-endpoint';\nimport httpV1Middleware from './middlewares/http-v1';\nimport userLocaleMiddleware from './middlewares/user-locale';\nimport mediaUploadMiddleware from './middlewares/media-upload';\nimport createThemePreviewMiddleware from './middlewares/theme-preview';\nimport { parseResponseAndNormalizeError, parseAndThrowError } from './utils/response';\n\n/**\n * Default set of header values which should be sent with every request unless\n * explicitly provided through apiFetch options.\n *\n * @type {Record<string, string>}\n */\nconst DEFAULT_HEADERS = {\n // The backend uses the Accept header as a condition for considering an\n // incoming request as a REST request.\n //\n // See: https://core.trac.wordpress.org/ticket/44534\n Accept: 'application/json, */*;q=0.1'\n};\n\n/**\n * Default set of fetch option values which should be sent with every request\n * unless explicitly provided through apiFetch options.\n *\n * @type {Object}\n */\nconst DEFAULT_OPTIONS = {\n credentials: 'include'\n};\n\n/** @typedef {import('./types').APIFetchMiddleware} APIFetchMiddleware */\n/** @typedef {import('./types').APIFetchOptions} APIFetchOptions */\n\n/**\n * @type {import('./types').APIFetchMiddleware[]}\n */\nconst middlewares = [userLocaleMiddleware, namespaceEndpointMiddleware, httpV1Middleware, fetchAllMiddleware];\n\n/**\n * Register a middleware\n *\n * @param {import('./types').APIFetchMiddleware} middleware\n */\nfunction registerMiddleware(middleware) {\n middlewares.unshift(middleware);\n}\n\n/**\n * Checks the status of a response, throwing the Response as an error if\n * it is outside the 200 range.\n *\n * @param {Response} response\n * @return {Response} The response if the status is in the 200 range.\n */\nconst checkStatus = response => {\n if (response.status >= 200 && response.status < 300) {\n return response;\n }\n throw response;\n};\n\n/** @typedef {(options: import('./types').APIFetchOptions) => Promise<any>} FetchHandler*/\n\n/**\n * @type {FetchHandler}\n */\nconst defaultFetchHandler = nextOptions => {\n const {\n url,\n path,\n data,\n parse = true,\n ...remainingOptions\n } = nextOptions;\n let {\n body,\n headers\n } = nextOptions;\n\n // Merge explicitly-provided headers with default values.\n headers = {\n ...DEFAULT_HEADERS,\n ...headers\n };\n\n // The `data` property is a shorthand for sending a JSON body.\n if (data) {\n body = JSON.stringify(data);\n headers['Content-Type'] = 'application/json';\n }\n const responsePromise = window.fetch(\n // Fall back to explicitly passing `window.location` which is the behavior if `undefined` is passed.\n url || path || window.location.href, {\n ...DEFAULT_OPTIONS,\n ...remainingOptions,\n body,\n headers\n });\n return responsePromise.then(value => Promise.resolve(value).then(checkStatus).catch(response => parseAndThrowError(response, parse)).then(response => parseResponseAndNormalizeError(response, parse)), err => {\n // Re-throw AbortError for the users to handle it themselves.\n if (err && err.name === 'AbortError') {\n throw err;\n }\n\n // Otherwise, there is most likely no network connection.\n // Unfortunately the message might depend on the browser.\n throw {\n code: 'fetch_error',\n message: __('You are probably offline.')\n };\n });\n};\n\n/** @type {FetchHandler} */\nlet fetchHandler = defaultFetchHandler;\n\n/**\n * Defines a custom fetch handler for making the requests that will override\n * the default one using window.fetch\n *\n * @param {FetchHandler} newFetchHandler The new fetch handler\n */\nfunction setFetchHandler(newFetchHandler) {\n fetchHandler = newFetchHandler;\n}\n\n/**\n * @template T\n * @param {import('./types').APIFetchOptions} options\n * @return {Promise<T>} A promise representing the request processed via the registered middlewares.\n */\nfunction apiFetch(options) {\n // creates a nested function chain that calls all middlewares and finally the `fetchHandler`,\n // converting `middlewares = [ m1, m2, m3 ]` into:\n // ```\n // opts1 => m1( opts1, opts2 => m2( opts2, opts3 => m3( opts3, fetchHandler ) ) );\n // ```\n const enhancedHandler = middlewares.reduceRight(( /** @type {FetchHandler} */next, middleware) => {\n return workingOptions => middleware(workingOptions, next);\n }, fetchHandler);\n return enhancedHandler(options).catch(error => {\n if (error.code !== 'rest_cookie_invalid_nonce') {\n return Promise.reject(error);\n }\n\n // If the nonce is invalid, refresh it and try again.\n return window\n // @ts-ignore\n .fetch(apiFetch.nonceEndpoint).then(checkStatus).then(data => data.text()).then(text => {\n // @ts-ignore\n apiFetch.nonceMiddleware.nonce = text;\n return apiFetch(options);\n });\n });\n}\napiFetch.use = registerMiddleware;\napiFetch.setFetchHandler = setFetchHandler;\napiFetch.createNonceMiddleware = createNonceMiddleware;\napiFetch.createPreloadingMiddleware = createPreloadingMiddleware;\napiFetch.createRootURLMiddleware = createRootURLMiddleware;\napiFetch.fetchAllMiddleware = fetchAllMiddleware;\napiFetch.mediaUploadMiddleware = mediaUploadMiddleware;\napiFetch.createThemePreviewMiddleware = createThemePreviewMiddleware;\nexport default apiFetch;\n//# sourceMappingURL=index.js.map","import apiFetch from '@wordpress/api-fetch';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { addQueryArgs, getQueryArg } from '@wordpress/url';\n\napiFetch.fetchAllMiddleware = null;\n\napiFetch.use(apiFetch.createRootURLMiddleware(window?.parent?.scData?.root_url || window?.scData?.root_url));\n\nif (window?.scData?.nonce) {\n // @ts-ignore\n apiFetch.nonceMiddleware = apiFetch.createNonceMiddleware(window?.scData?.nonce);\n // @ts-ignore\n apiFetch.use(apiFetch.nonceMiddleware);\n}\n\nif (window?.scData?.nonce_endpoint) {\n // @ts-ignore\n apiFetch.nonceEndpoint = window?.scData?.nonce_endpoint;\n}\n\n// Add a timestamp so it can bypass cache rest api\napiFetch.use((options, next) => {\n options.path = addQueryArgs(options.path, { t: Date.now() });\n return next(options);\n});\n\n// Add selected currency to the request\napiFetch.use((options, next) => {\n options.path = addQueryArgs(options.path, {\n ...(!!getQueryArg(window.location.href, 'currency') && {\n currency: getQueryArg(window.location.href, 'currency'),\n }),\n });\n return next(options);\n});\n\napiFetch.use((options, next) => {\n const result = next(options);\n result.catch(response => {\n if (response.code === 'invalid_json') {\n response.message = __('The response is not a valid JSON response.', 'surecart');\n const debugSettingsUrl = 'https://surecart.com/docs/is-not-a-valid-json-response/';\n response.additional_errors = [\n {\n code: 'invalid_json',\n message: sprintf(\n /* translators: %s: URL to debug settings page */\n __('Please ensure that your site is not in debug mode as this may interfere with API responses. %s', 'surecart'),\n `<a href=\"${debugSettingsUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">${__('More Information', 'surecart')}</a>`,\n ),\n },\n ];\n }\n\n if (response.code === 'checkout.finalize_error') {\n response.additional_errors = [\n {\n code: 'checkout.finalize_error',\n message: response.message,\n },\n ];\n response.message = __('We were not able to process this order', 'surecart');\n }\n return Promise.reject(response);\n });\n\n return result;\n});\n\nexport default apiFetch;\n\n/**\n * Calls the `json` function on the Response, throwing an error if the response\n * doesn't have a json function or if parsing the json itself fails.\n *\n * @param {Response} response\n * @return {Promise<any>} Parsed response.\n */\nexport const parseJsonAndNormalizeError = response => {\n const invalidJsonError = {\n code: 'invalid_json',\n message: __('The response is not a valid JSON response.', 'surecart'),\n };\n\n if (response?.code && response?.message) {\n throw response;\n }\n\n if (!response || !response.json) {\n throw invalidJsonError;\n }\n\n return response.json().catch(() => {\n throw invalidJsonError;\n });\n};\n\nexport const handleNonceError = async response => {\n // need to parse the error response since we are bypassing the apiFetch middleware.\n const error = await parseJsonAndNormalizeError(response);\n\n if (error.code !== 'rest_cookie_invalid_nonce') {\n // console.error(error);\n throw error;\n }\n\n // If the nonce is invalid, refresh it and try again.\n return (\n window\n // @ts-ignore\n .fetch(apiFetch.nonceEndpoint)\n .then(response => {\n if (response.status >= 200 && response.status < 300) {\n return response;\n }\n throw response;\n })\n .then(data => data.text())\n .then(text => {\n // @ts-ignore\n apiFetch.nonceMiddleware.nonce = text;\n })\n );\n};\n"],"mappings":"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","ignoreList":[]}
Copyright ©2021 || Defacer Indonesia