{"version":3,"file":"js/AskFetch-b986b5012b77b3d53c6f.js","mappings":"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","sources":["webpack://slaask/./app/packs/entrypoints/AskFetch.ts","webpack://slaask/./app/packs/src/shared/AskFetch.ts"],"sourcesContent":["import { AskFetch } from '@/shared/AskFetch'\n\nexport default AskFetch\n","type Body = string |\n Parameters[0] |\n NonNullable[1]>['body']\n\n/**\n * AskFetch uses the `fetch` interface instead of XMLHttpRequest.\n * All functions return a promise for callback resolving or rejection.\n *\n * Usage\n * =====\n *\n * ```\n * // Send request and receive response\n * AskFetch.get(url).then(async response => {\n * const data = await response.json()\n * })\n * // or\n * const response = await AskFetch.get(url)\n * const data = await response.json()\n * ```\n * ```\n * // Use post\n * AskFetch.post(url, {\n * param1: true\n * }).then(async response => {})\n * ```\n * ```\n * // Query string shorthand\n * AskFetch.get(url, {\n * query_param: 'yes'\n * })\n * ```\n *\n * Note\n * ====\n *\n * `AskFetch.postAsForm` is used for backward compatibility.\n *\n * Some endpoints are listening for x-www-form-urlencoded body from jQuery ajax\n * requests. `xxxAsForm` functions ensure a compatible behavior.\n */\nexport const AskFetch = new (class AskFetch {\n get (\n resource: Parameters[0],\n parameters: Record = {},\n options: Parameters[1] = {}\n ): ReturnType {\n this._applyDefaultHeaders(options)\n\n const url = new URL(resource instanceof Request\n ? resource.url\n : resource, document.location.href)\n url.search = new URLSearchParams([\n ...url.searchParams,\n ...this._toFlatObject(parameters)\n ]).toString()\n\n return fetch(url.toString(), options)\n }\n\n post (\n url: Parameters[0],\n body?: Body,\n options: Parameters[1] = {}\n ): ReturnType {\n options.method = 'post'\n return this._jsonRequest(url, body, options)\n }\n\n put (\n url: Parameters[0],\n body?: Body,\n options: Parameters[1] = {}\n ): ReturnType {\n options.method = 'put'\n return this._jsonRequest(url, body, options)\n }\n\n delete (\n url: Parameters[0],\n body?: Body,\n options: Parameters[1] = {}\n ): ReturnType {\n options.method = 'delete'\n return this._jsonRequest(url, body, options)\n }\n\n /**\n * Sends as x-www-form-urlencoded\n */\n postAsForm (\n url: Parameters[0],\n body: Body,\n options: Parameters[1] = {}\n ): ReturnType {\n options.method = 'post'\n return this._formRequest(url, body, options)\n }\n\n /**\n * Sends as x-www-form-urlencoded\n */\n putAsForm (\n url: Parameters[0],\n body: Body,\n options: Parameters[1] = {}\n ): ReturnType {\n options.method = 'put'\n return this._formRequest(url, body, options)\n }\n\n /**\n * Sends as x-www-form-urlencoded\n */\n deleteAsForm (\n url: Parameters[0],\n body: Body,\n options: Parameters[1] = {}\n ): ReturnType {\n options.method = 'delete'\n return this._formRequest(url, body, options)\n }\n\n private _applyDefaultHeaders (\n options: NonNullable[1]>\n ): void {\n if (!options.headers) options.headers = {}\n const metaToken = document.querySelector(\n 'meta[name=\"csrf-token\"]'\n )\n const token = metaToken?.getAttribute('content')\n if (token) options.headers['X-CSRF-TOKEN'] = token\n options.credentials = 'same-origin'\n }\n\n private _jsonRequest (\n url: Parameters[0],\n body?: Body,\n options: Parameters[1] = {}\n ): ReturnType {\n if (!options.headers) options.headers = {}\n this._applyDefaultHeaders(options)\n if (body) {\n options.headers['Content-Type'] = 'application/json'\n options.body = typeof body == 'string' ? body : JSON.stringify(body)\n }\n return fetch(url, options)\n }\n\n private _formRequest (\n url: Parameters[0],\n body: Body,\n options: Parameters[1] = {}\n ): ReturnType {\n if (!options.headers) options.headers = {}\n this._applyDefaultHeaders(options)\n options.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'\n options.body = typeof body == 'string' ? body : new URLSearchParams(this._toFlatObject(body)).toString()\n return fetch(url, options)\n }\n\n /**\n * Transforms\n * ```\n * { query_object: { array: [1, 2, 3], foo: 'bar' } }\n * ```\n * into\n * ```\n * [\n * [\"query_object[array][]\",\"1\"],\n * [\"query_object[array][]\",\"2\"],\n * [\"query_object[array][]\",\"3\"],\n * [\"query_object[foo]\",\"bar\"]\n * ]\n * ```\n */\n private _toFlatObject (\n parameters: Record,\n initialDepth = true\n ): [string, string][] {\n const flatObject: [string, string][] = []\n Object.keys(parameters).forEach(key => {\n const value = parameters[key]\n const flatParams = this._flattenKeyValue(value)\n flatParams.forEach(flatParamPair => {\n const fullKey = initialDepth\n ? `${key}${flatParamPair[0]}`\n : `[${key}]${flatParamPair[0]}`\n flatObject.push([fullKey, flatParamPair[1]])\n })\n })\n return flatObject\n }\n\n private _flattenKeyValue (\n value: unknown\n ): [string, string][] {\n const flatObject: [string, string][] = []\n if (typeof value === 'number') {\n flatObject.push(['', value.toString()])\n } else if (typeof value === 'string') {\n flatObject.push(['', value])\n } else if (value === null || value === undefined) {\n flatObject.push(['', ''])\n } else if (Array.isArray(value)) {\n value.forEach(arrayItem => {\n const flatParams = this._flattenKeyValue(arrayItem)\n flatParams.forEach(flatParam => {\n flatObject.push(['[]' + flatParam[0], flatParam[1]])\n })\n })\n } else if (this._isRecord(value)) {\n const flatParams = this._toFlatObject(value, false)\n flatParams.forEach(flatParam => {\n flatObject.push([flatParam[0], flatParam[1]])\n })\n } else {\n flatObject.push(['', `${value}`])\n }\n return flatObject\n }\n\n private _isRecord (obj: unknown): obj is Record {\n return !!obj && typeof obj === 'object'\n }\n})()\n"],"names":["AskFetch","_classCallCheck","key","value","resource","parameters","arguments","length","undefined","options","this","_applyDefaultHeaders","url","URL","Request","document","location","href","search","URLSearchParams","concat","_toConsumableArray","searchParams","_toFlatObject","toString","fetch","body","method","_jsonRequest","_formRequest","headers","metaToken","querySelector","token","getAttribute","credentials","JSON","stringify","_this","initialDepth","flatObject","Object","keys","forEach","_flattenKeyValue","flatParamPair","fullKey","push","_this2","Array","isArray","arrayItem","flatParam","_isRecord","obj"],"sourceRoot":""}