{"version":3,"file":"userfront-core.modern.mjs","sources":["../node_modules/axios/lib/helpers/bind.js","../node_modules/axios/lib/utils.js","../node_modules/axios/lib/helpers/buildURL.js","../node_modules/axios/lib/core/InterceptorManager.js","../node_modules/axios/lib/helpers/normalizeHeaderName.js","../node_modules/axios/lib/core/enhanceError.js","../node_modules/axios/lib/core/createError.js","../node_modules/axios/lib/helpers/cookies.js","../node_modules/axios/lib/helpers/parseHeaders.js","../node_modules/axios/lib/helpers/isURLSameOrigin.js","../node_modules/axios/lib/defaults.js","../node_modules/axios/lib/adapters/xhr.js","../node_modules/axios/lib/core/buildFullPath.js","../node_modules/axios/lib/helpers/isAbsoluteURL.js","../node_modules/axios/lib/helpers/combineURLs.js","../node_modules/axios/lib/core/settle.js","../node_modules/axios/lib/core/transformData.js","../node_modules/axios/lib/cancel/isCancel.js","../node_modules/axios/lib/core/dispatchRequest.js","../node_modules/axios/lib/core/mergeConfig.js","../node_modules/axios/lib/helpers/validator.js","../node_modules/axios/lib/core/Axios.js","../node_modules/axios/lib/cancel/Cancel.js","../node_modules/axios/lib/cancel/CancelToken.js","../node_modules/axios/lib/axios.js","../node_modules/axios/lib/helpers/spread.js","../node_modules/axios/lib/helpers/isAxiosError.js","../node_modules/axios/index.js","../node_modules/js-cookie/src/js.cookie.js","../src/cookies.js","../src/utils.js","../src/api.js","../src/refresh.js","../src/user.js","../src/tokens.js","../src/authentication.js","../src/session.js","../src/pkce.js","../src/url.js","../src/password.js","../src/totp.js","../src/store.utils.js","../src/store.js","../src/sso.js","../src/link.js","../src/verificationCode.js","../src/constants.js","../src/mode.js","../src/index.js","../src/logout.js","../src/login.js","../src/password.migrate.js","../src/saml.js","../src/signup.js"],"sourcesContent":["'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n  return function wrap() {\n    var args = new Array(arguments.length);\n    for (var i = 0; i < args.length; i++) {\n      args[i] = arguments[i];\n    }\n    return fn.apply(thisArg, args);\n  };\n};\n","'use strict';\n\nvar bind = require('./helpers/bind');\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n  return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n  return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n  return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n    && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n  return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n  return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n  var result;\n  if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n    result = ArrayBuffer.isView(val);\n  } else {\n    result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n  }\n  return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n  return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n  return typeof val === 'number';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n  return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {Object} val The value to test\n * @return {boolean} True if value is a plain Object, otherwise false\n */\nfunction isPlainObject(val) {\n  if (toString.call(val) !== '[object Object]') {\n    return false;\n  }\n\n  var prototype = Object.getPrototypeOf(val);\n  return prototype === null || prototype === Object.prototype;\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n  return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n  return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n  return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n  return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n  return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n  return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n  return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n *  typeof window -> undefined\n *  typeof document -> undefined\n *\n * react-native:\n *  navigator.product -> 'ReactNative'\n * nativescript\n *  navigator.product -> 'NativeScript' or 'NS'\n */\nfunction isStandardBrowserEnv() {\n  if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\n                                           navigator.product === 'NativeScript' ||\n                                           navigator.product === 'NS')) {\n    return false;\n  }\n  return (\n    typeof window !== 'undefined' &&\n    typeof document !== 'undefined'\n  );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n  // Don't bother if no value provided\n  if (obj === null || typeof obj === 'undefined') {\n    return;\n  }\n\n  // Force an array if not already something iterable\n  if (typeof obj !== 'object') {\n    /*eslint no-param-reassign:0*/\n    obj = [obj];\n  }\n\n  if (isArray(obj)) {\n    // Iterate over array values\n    for (var i = 0, l = obj.length; i < l; i++) {\n      fn.call(null, obj[i], i, obj);\n    }\n  } else {\n    // Iterate over object keys\n    for (var key in obj) {\n      if (Object.prototype.hasOwnProperty.call(obj, key)) {\n        fn.call(null, obj[key], key, obj);\n      }\n    }\n  }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n  var result = {};\n  function assignValue(val, key) {\n    if (isPlainObject(result[key]) && isPlainObject(val)) {\n      result[key] = merge(result[key], val);\n    } else if (isPlainObject(val)) {\n      result[key] = merge({}, val);\n    } else if (isArray(val)) {\n      result[key] = val.slice();\n    } else {\n      result[key] = val;\n    }\n  }\n\n  for (var i = 0, l = arguments.length; i < l; i++) {\n    forEach(arguments[i], assignValue);\n  }\n  return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n  forEach(b, function assignValue(val, key) {\n    if (thisArg && typeof val === 'function') {\n      a[key] = bind(val, thisArg);\n    } else {\n      a[key] = val;\n    }\n  });\n  return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n * @return {string} content value without BOM\n */\nfunction stripBOM(content) {\n  if (content.charCodeAt(0) === 0xFEFF) {\n    content = content.slice(1);\n  }\n  return content;\n}\n\nmodule.exports = {\n  isArray: isArray,\n  isArrayBuffer: isArrayBuffer,\n  isBuffer: isBuffer,\n  isFormData: isFormData,\n  isArrayBufferView: isArrayBufferView,\n  isString: isString,\n  isNumber: isNumber,\n  isObject: isObject,\n  isPlainObject: isPlainObject,\n  isUndefined: isUndefined,\n  isDate: isDate,\n  isFile: isFile,\n  isBlob: isBlob,\n  isFunction: isFunction,\n  isStream: isStream,\n  isURLSearchParams: isURLSearchParams,\n  isStandardBrowserEnv: isStandardBrowserEnv,\n  forEach: forEach,\n  merge: merge,\n  extend: extend,\n  trim: trim,\n  stripBOM: stripBOM\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction encode(val) {\n  return encodeURIComponent(val).\n    replace(/%3A/gi, ':').\n    replace(/%24/g, '$').\n    replace(/%2C/gi, ',').\n    replace(/%20/g, '+').\n    replace(/%5B/gi, '[').\n    replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n  /*eslint no-param-reassign:0*/\n  if (!params) {\n    return url;\n  }\n\n  var serializedParams;\n  if (paramsSerializer) {\n    serializedParams = paramsSerializer(params);\n  } else if (utils.isURLSearchParams(params)) {\n    serializedParams = params.toString();\n  } else {\n    var parts = [];\n\n    utils.forEach(params, function serialize(val, key) {\n      if (val === null || typeof val === 'undefined') {\n        return;\n      }\n\n      if (utils.isArray(val)) {\n        key = key + '[]';\n      } else {\n        val = [val];\n      }\n\n      utils.forEach(val, function parseValue(v) {\n        if (utils.isDate(v)) {\n          v = v.toISOString();\n        } else if (utils.isObject(v)) {\n          v = JSON.stringify(v);\n        }\n        parts.push(encode(key) + '=' + encode(v));\n      });\n    });\n\n    serializedParams = parts.join('&');\n  }\n\n  if (serializedParams) {\n    var hashmarkIndex = url.indexOf('#');\n    if (hashmarkIndex !== -1) {\n      url = url.slice(0, hashmarkIndex);\n    }\n\n    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n  }\n\n  return url;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction InterceptorManager() {\n  this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected, options) {\n  this.handlers.push({\n    fulfilled: fulfilled,\n    rejected: rejected,\n    synchronous: options ? options.synchronous : false,\n    runWhen: options ? options.runWhen : null\n  });\n  return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n  if (this.handlers[id]) {\n    this.handlers[id] = null;\n  }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n  utils.forEach(this.handlers, function forEachHandler(h) {\n    if (h !== null) {\n      fn(h);\n    }\n  });\n};\n\nmodule.exports = InterceptorManager;\n","'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n  utils.forEach(headers, function processHeader(value, name) {\n    if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n      headers[normalizedName] = value;\n      delete headers[name];\n    }\n  });\n};\n","'use strict';\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n  error.config = config;\n  if (code) {\n    error.code = code;\n  }\n\n  error.request = request;\n  error.response = response;\n  error.isAxiosError = true;\n\n  error.toJSON = function toJSON() {\n    return {\n      // Standard\n      message: this.message,\n      name: this.name,\n      // Microsoft\n      description: this.description,\n      number: this.number,\n      // Mozilla\n      fileName: this.fileName,\n      lineNumber: this.lineNumber,\n      columnNumber: this.columnNumber,\n      stack: this.stack,\n      // Axios\n      config: this.config,\n      code: this.code\n    };\n  };\n  return error;\n};\n","'use strict';\n\nvar enhanceError = require('./enhanceError');\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n  var error = new Error(message);\n  return enhanceError(error, config, code, request, response);\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n  utils.isStandardBrowserEnv() ?\n\n  // Standard browser envs support document.cookie\n    (function standardBrowserEnv() {\n      return {\n        write: function write(name, value, expires, path, domain, secure) {\n          var cookie = [];\n          cookie.push(name + '=' + encodeURIComponent(value));\n\n          if (utils.isNumber(expires)) {\n            cookie.push('expires=' + new Date(expires).toGMTString());\n          }\n\n          if (utils.isString(path)) {\n            cookie.push('path=' + path);\n          }\n\n          if (utils.isString(domain)) {\n            cookie.push('domain=' + domain);\n          }\n\n          if (secure === true) {\n            cookie.push('secure');\n          }\n\n          document.cookie = cookie.join('; ');\n        },\n\n        read: function read(name) {\n          var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n          return (match ? decodeURIComponent(match[3]) : null);\n        },\n\n        remove: function remove(name) {\n          this.write(name, '', Date.now() - 86400000);\n        }\n      };\n    })() :\n\n  // Non standard browser env (web workers, react-native) lack needed support.\n    (function nonStandardBrowserEnv() {\n      return {\n        write: function write() {},\n        read: function read() { return null; },\n        remove: function remove() {}\n      };\n    })()\n);\n","'use strict';\n\nvar utils = require('./../utils');\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n  'age', 'authorization', 'content-length', 'content-type', 'etag',\n  'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n  'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n  'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n  var parsed = {};\n  var key;\n  var val;\n  var i;\n\n  if (!headers) { return parsed; }\n\n  utils.forEach(headers.split('\\n'), function parser(line) {\n    i = line.indexOf(':');\n    key = utils.trim(line.substr(0, i)).toLowerCase();\n    val = utils.trim(line.substr(i + 1));\n\n    if (key) {\n      if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n        return;\n      }\n      if (key === 'set-cookie') {\n        parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n      } else {\n        parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n      }\n    }\n  });\n\n  return parsed;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n  utils.isStandardBrowserEnv() ?\n\n  // Standard browser envs have full support of the APIs needed to test\n  // whether the request URL is of the same origin as current location.\n    (function standardBrowserEnv() {\n      var msie = /(msie|trident)/i.test(navigator.userAgent);\n      var urlParsingNode = document.createElement('a');\n      var originURL;\n\n      /**\n    * Parse a URL to discover it's components\n    *\n    * @param {String} url The URL to be parsed\n    * @returns {Object}\n    */\n      function resolveURL(url) {\n        var href = url;\n\n        if (msie) {\n        // IE needs attribute set twice to normalize properties\n          urlParsingNode.setAttribute('href', href);\n          href = urlParsingNode.href;\n        }\n\n        urlParsingNode.setAttribute('href', href);\n\n        // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n        return {\n          href: urlParsingNode.href,\n          protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n          host: urlParsingNode.host,\n          search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n          hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n          hostname: urlParsingNode.hostname,\n          port: urlParsingNode.port,\n          pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n            urlParsingNode.pathname :\n            '/' + urlParsingNode.pathname\n        };\n      }\n\n      originURL = resolveURL(window.location.href);\n\n      /**\n    * Determine if a URL shares the same origin as the current location\n    *\n    * @param {String} requestURL The URL to test\n    * @returns {boolean} True if URL shares the same origin, otherwise false\n    */\n      return function isURLSameOrigin(requestURL) {\n        var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n        return (parsed.protocol === originURL.protocol &&\n            parsed.host === originURL.host);\n      };\n    })() :\n\n  // Non standard browser envs (web workers, react-native) lack needed support.\n    (function nonStandardBrowserEnv() {\n      return function isURLSameOrigin() {\n        return true;\n      };\n    })()\n);\n","'use strict';\n\nvar utils = require('./utils');\nvar normalizeHeaderName = require('./helpers/normalizeHeaderName');\nvar enhanceError = require('./core/enhanceError');\n\nvar DEFAULT_CONTENT_TYPE = {\n  'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n  if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n    headers['Content-Type'] = value;\n  }\n}\n\nfunction getDefaultAdapter() {\n  var adapter;\n  if (typeof XMLHttpRequest !== 'undefined') {\n    // For browsers use XHR adapter\n    adapter = require('./adapters/xhr');\n  } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\n    // For node use HTTP adapter\n    adapter = require('./adapters/http');\n  }\n  return adapter;\n}\n\nfunction stringifySafely(rawValue, parser, encoder) {\n  if (utils.isString(rawValue)) {\n    try {\n      (parser || JSON.parse)(rawValue);\n      return utils.trim(rawValue);\n    } catch (e) {\n      if (e.name !== 'SyntaxError') {\n        throw e;\n      }\n    }\n  }\n\n  return (encoder || JSON.stringify)(rawValue);\n}\n\nvar defaults = {\n\n  transitional: {\n    silentJSONParsing: true,\n    forcedJSONParsing: true,\n    clarifyTimeoutError: false\n  },\n\n  adapter: getDefaultAdapter(),\n\n  transformRequest: [function transformRequest(data, headers) {\n    normalizeHeaderName(headers, 'Accept');\n    normalizeHeaderName(headers, 'Content-Type');\n\n    if (utils.isFormData(data) ||\n      utils.isArrayBuffer(data) ||\n      utils.isBuffer(data) ||\n      utils.isStream(data) ||\n      utils.isFile(data) ||\n      utils.isBlob(data)\n    ) {\n      return data;\n    }\n    if (utils.isArrayBufferView(data)) {\n      return data.buffer;\n    }\n    if (utils.isURLSearchParams(data)) {\n      setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n      return data.toString();\n    }\n    if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) {\n      setContentTypeIfUnset(headers, 'application/json');\n      return stringifySafely(data);\n    }\n    return data;\n  }],\n\n  transformResponse: [function transformResponse(data) {\n    var transitional = this.transitional;\n    var silentJSONParsing = transitional && transitional.silentJSONParsing;\n    var forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n    var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';\n\n    if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {\n      try {\n        return JSON.parse(data);\n      } catch (e) {\n        if (strictJSONParsing) {\n          if (e.name === 'SyntaxError') {\n            throw enhanceError(e, this, 'E_JSON_PARSE');\n          }\n          throw e;\n        }\n      }\n    }\n\n    return data;\n  }],\n\n  /**\n   * A timeout in milliseconds to abort a request. If set to 0 (default) a\n   * timeout is not created.\n   */\n  timeout: 0,\n\n  xsrfCookieName: 'XSRF-TOKEN',\n  xsrfHeaderName: 'X-XSRF-TOKEN',\n\n  maxContentLength: -1,\n  maxBodyLength: -1,\n\n  validateStatus: function validateStatus(status) {\n    return status >= 200 && status < 300;\n  }\n};\n\ndefaults.headers = {\n  common: {\n    'Accept': 'application/json, text/plain, */*'\n  }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n  defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n  defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n","'use strict';\n\nvar utils = require('./../utils');\nvar settle = require('./../core/settle');\nvar cookies = require('./../helpers/cookies');\nvar buildURL = require('./../helpers/buildURL');\nvar buildFullPath = require('../core/buildFullPath');\nvar parseHeaders = require('./../helpers/parseHeaders');\nvar isURLSameOrigin = require('./../helpers/isURLSameOrigin');\nvar createError = require('../core/createError');\n\nmodule.exports = function xhrAdapter(config) {\n  return new Promise(function dispatchXhrRequest(resolve, reject) {\n    var requestData = config.data;\n    var requestHeaders = config.headers;\n    var responseType = config.responseType;\n\n    if (utils.isFormData(requestData)) {\n      delete requestHeaders['Content-Type']; // Let the browser set it\n    }\n\n    var request = new XMLHttpRequest();\n\n    // HTTP basic authentication\n    if (config.auth) {\n      var username = config.auth.username || '';\n      var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n      requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n    }\n\n    var fullPath = buildFullPath(config.baseURL, config.url);\n    request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n    // Set the request timeout in MS\n    request.timeout = config.timeout;\n\n    function onloadend() {\n      if (!request) {\n        return;\n      }\n      // Prepare the response\n      var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n      var responseData = !responseType || responseType === 'text' ||  responseType === 'json' ?\n        request.responseText : request.response;\n      var response = {\n        data: responseData,\n        status: request.status,\n        statusText: request.statusText,\n        headers: responseHeaders,\n        config: config,\n        request: request\n      };\n\n      settle(resolve, reject, response);\n\n      // Clean up request\n      request = null;\n    }\n\n    if ('onloadend' in request) {\n      // Use onloadend if available\n      request.onloadend = onloadend;\n    } else {\n      // Listen for ready state to emulate onloadend\n      request.onreadystatechange = function handleLoad() {\n        if (!request || request.readyState !== 4) {\n          return;\n        }\n\n        // The request errored out and we didn't get a response, this will be\n        // handled by onerror instead\n        // With one exception: request that using file: protocol, most browsers\n        // will return status as 0 even though it's a successful request\n        if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n          return;\n        }\n        // readystate handler is calling before onerror or ontimeout handlers,\n        // so we should call onloadend on the next 'tick'\n        setTimeout(onloadend);\n      };\n    }\n\n    // Handle browser request cancellation (as opposed to a manual cancellation)\n    request.onabort = function handleAbort() {\n      if (!request) {\n        return;\n      }\n\n      reject(createError('Request aborted', config, 'ECONNABORTED', request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Handle low level network errors\n    request.onerror = function handleError() {\n      // Real errors are hidden from us by the browser\n      // onerror should only fire if it's a network error\n      reject(createError('Network Error', config, null, request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Handle timeout\n    request.ontimeout = function handleTimeout() {\n      var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded';\n      if (config.timeoutErrorMessage) {\n        timeoutErrorMessage = config.timeoutErrorMessage;\n      }\n      reject(createError(\n        timeoutErrorMessage,\n        config,\n        config.transitional && config.transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED',\n        request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Add xsrf header\n    // This is only done if running in a standard browser environment.\n    // Specifically not if we're in a web worker, or react-native.\n    if (utils.isStandardBrowserEnv()) {\n      // Add xsrf header\n      var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?\n        cookies.read(config.xsrfCookieName) :\n        undefined;\n\n      if (xsrfValue) {\n        requestHeaders[config.xsrfHeaderName] = xsrfValue;\n      }\n    }\n\n    // Add headers to the request\n    if ('setRequestHeader' in request) {\n      utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n        if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n          // Remove Content-Type if data is undefined\n          delete requestHeaders[key];\n        } else {\n          // Otherwise add header to the request\n          request.setRequestHeader(key, val);\n        }\n      });\n    }\n\n    // Add withCredentials to request if needed\n    if (!utils.isUndefined(config.withCredentials)) {\n      request.withCredentials = !!config.withCredentials;\n    }\n\n    // Add responseType to request if needed\n    if (responseType && responseType !== 'json') {\n      request.responseType = config.responseType;\n    }\n\n    // Handle progress if needed\n    if (typeof config.onDownloadProgress === 'function') {\n      request.addEventListener('progress', config.onDownloadProgress);\n    }\n\n    // Not all browsers support upload events\n    if (typeof config.onUploadProgress === 'function' && request.upload) {\n      request.upload.addEventListener('progress', config.onUploadProgress);\n    }\n\n    if (config.cancelToken) {\n      // Handle cancellation\n      config.cancelToken.promise.then(function onCanceled(cancel) {\n        if (!request) {\n          return;\n        }\n\n        request.abort();\n        reject(cancel);\n        // Clean up request\n        request = null;\n      });\n    }\n\n    if (!requestData) {\n      requestData = null;\n    }\n\n    // Send the request\n    request.send(requestData);\n  });\n};\n","'use strict';\n\nvar isAbsoluteURL = require('../helpers/isAbsoluteURL');\nvar combineURLs = require('../helpers/combineURLs');\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n * @returns {string} The combined full path\n */\nmodule.exports = function buildFullPath(baseURL, requestedURL) {\n  if (baseURL && !isAbsoluteURL(requestedURL)) {\n    return combineURLs(baseURL, requestedURL);\n  }\n  return requestedURL;\n};\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n  // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n  // by any combination of letters, digits, plus, period, or hyphen.\n  return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n  return relativeURL\n    ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n    : baseURL;\n};\n","'use strict';\n\nvar createError = require('./createError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n  var validateStatus = response.config.validateStatus;\n  if (!response.status || !validateStatus || validateStatus(response.status)) {\n    resolve(response);\n  } else {\n    reject(createError(\n      'Request failed with status code ' + response.status,\n      response.config,\n      null,\n      response.request,\n      response\n    ));\n  }\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar defaults = require('./../defaults');\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n  var context = this || defaults;\n  /*eslint no-param-reassign:0*/\n  utils.forEach(fns, function transform(fn) {\n    data = fn.call(context, data, headers);\n  });\n\n  return data;\n};\n","'use strict';\n\nmodule.exports = function isCancel(value) {\n  return !!(value && value.__CANCEL__);\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar transformData = require('./transformData');\nvar isCancel = require('../cancel/isCancel');\nvar defaults = require('../defaults');\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n  if (config.cancelToken) {\n    config.cancelToken.throwIfRequested();\n  }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n  throwIfCancellationRequested(config);\n\n  // Ensure headers exist\n  config.headers = config.headers || {};\n\n  // Transform request data\n  config.data = transformData.call(\n    config,\n    config.data,\n    config.headers,\n    config.transformRequest\n  );\n\n  // Flatten headers\n  config.headers = utils.merge(\n    config.headers.common || {},\n    config.headers[config.method] || {},\n    config.headers\n  );\n\n  utils.forEach(\n    ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n    function cleanHeaderConfig(method) {\n      delete config.headers[method];\n    }\n  );\n\n  var adapter = config.adapter || defaults.adapter;\n\n  return adapter(config).then(function onAdapterResolution(response) {\n    throwIfCancellationRequested(config);\n\n    // Transform response data\n    response.data = transformData.call(\n      config,\n      response.data,\n      response.headers,\n      config.transformResponse\n    );\n\n    return response;\n  }, function onAdapterRejection(reason) {\n    if (!isCancel(reason)) {\n      throwIfCancellationRequested(config);\n\n      // Transform response data\n      if (reason && reason.response) {\n        reason.response.data = transformData.call(\n          config,\n          reason.response.data,\n          reason.response.headers,\n          config.transformResponse\n        );\n      }\n    }\n\n    return Promise.reject(reason);\n  });\n};\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n * @returns {Object} New object resulting from merging config2 to config1\n */\nmodule.exports = function mergeConfig(config1, config2) {\n  // eslint-disable-next-line no-param-reassign\n  config2 = config2 || {};\n  var config = {};\n\n  var valueFromConfig2Keys = ['url', 'method', 'data'];\n  var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy', 'params'];\n  var defaultToConfig2Keys = [\n    'baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer',\n    'timeout', 'timeoutMessage', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName',\n    'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'decompress',\n    'maxContentLength', 'maxBodyLength', 'maxRedirects', 'transport', 'httpAgent',\n    'httpsAgent', 'cancelToken', 'socketPath', 'responseEncoding'\n  ];\n  var directMergeKeys = ['validateStatus'];\n\n  function getMergedValue(target, source) {\n    if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n      return utils.merge(target, source);\n    } else if (utils.isPlainObject(source)) {\n      return utils.merge({}, source);\n    } else if (utils.isArray(source)) {\n      return source.slice();\n    }\n    return source;\n  }\n\n  function mergeDeepProperties(prop) {\n    if (!utils.isUndefined(config2[prop])) {\n      config[prop] = getMergedValue(config1[prop], config2[prop]);\n    } else if (!utils.isUndefined(config1[prop])) {\n      config[prop] = getMergedValue(undefined, config1[prop]);\n    }\n  }\n\n  utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) {\n    if (!utils.isUndefined(config2[prop])) {\n      config[prop] = getMergedValue(undefined, config2[prop]);\n    }\n  });\n\n  utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties);\n\n  utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) {\n    if (!utils.isUndefined(config2[prop])) {\n      config[prop] = getMergedValue(undefined, config2[prop]);\n    } else if (!utils.isUndefined(config1[prop])) {\n      config[prop] = getMergedValue(undefined, config1[prop]);\n    }\n  });\n\n  utils.forEach(directMergeKeys, function merge(prop) {\n    if (prop in config2) {\n      config[prop] = getMergedValue(config1[prop], config2[prop]);\n    } else if (prop in config1) {\n      config[prop] = getMergedValue(undefined, config1[prop]);\n    }\n  });\n\n  var axiosKeys = valueFromConfig2Keys\n    .concat(mergeDeepPropertiesKeys)\n    .concat(defaultToConfig2Keys)\n    .concat(directMergeKeys);\n\n  var otherKeys = Object\n    .keys(config1)\n    .concat(Object.keys(config2))\n    .filter(function filterAxiosKeys(key) {\n      return axiosKeys.indexOf(key) === -1;\n    });\n\n  utils.forEach(otherKeys, mergeDeepProperties);\n\n  return config;\n};\n","'use strict';\n\nvar pkg = require('./../../package.json');\n\nvar validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {\n  validators[type] = function validator(thing) {\n    return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n  };\n});\n\nvar deprecatedWarnings = {};\nvar currentVerArr = pkg.version.split('.');\n\n/**\n * Compare package versions\n * @param {string} version\n * @param {string?} thanVersion\n * @returns {boolean}\n */\nfunction isOlderVersion(version, thanVersion) {\n  var pkgVersionArr = thanVersion ? thanVersion.split('.') : currentVerArr;\n  var destVer = version.split('.');\n  for (var i = 0; i < 3; i++) {\n    if (pkgVersionArr[i] > destVer[i]) {\n      return true;\n    } else if (pkgVersionArr[i] < destVer[i]) {\n      return false;\n    }\n  }\n  return false;\n}\n\n/**\n * Transitional option validator\n * @param {function|boolean?} validator\n * @param {string?} version\n * @param {string} message\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n  var isDeprecated = version && isOlderVersion(version);\n\n  function formatMessage(opt, desc) {\n    return '[Axios v' + pkg.version + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n  }\n\n  // eslint-disable-next-line func-names\n  return function(value, opt, opts) {\n    if (validator === false) {\n      throw new Error(formatMessage(opt, ' has been removed in ' + version));\n    }\n\n    if (isDeprecated && !deprecatedWarnings[opt]) {\n      deprecatedWarnings[opt] = true;\n      // eslint-disable-next-line no-console\n      console.warn(\n        formatMessage(\n          opt,\n          ' has been deprecated since v' + version + ' and will be removed in the near future'\n        )\n      );\n    }\n\n    return validator ? validator(value, opt, opts) : true;\n  };\n};\n\n/**\n * Assert object's properties type\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n  if (typeof options !== 'object') {\n    throw new TypeError('options must be an object');\n  }\n  var keys = Object.keys(options);\n  var i = keys.length;\n  while (i-- > 0) {\n    var opt = keys[i];\n    var validator = schema[opt];\n    if (validator) {\n      var value = options[opt];\n      var result = value === undefined || validator(value, opt, options);\n      if (result !== true) {\n        throw new TypeError('option ' + opt + ' must be ' + result);\n      }\n      continue;\n    }\n    if (allowUnknown !== true) {\n      throw Error('Unknown option ' + opt);\n    }\n  }\n}\n\nmodule.exports = {\n  isOlderVersion: isOlderVersion,\n  assertOptions: assertOptions,\n  validators: validators\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar buildURL = require('../helpers/buildURL');\nvar InterceptorManager = require('./InterceptorManager');\nvar dispatchRequest = require('./dispatchRequest');\nvar mergeConfig = require('./mergeConfig');\nvar validator = require('../helpers/validator');\n\nvar validators = validator.validators;\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n  this.defaults = instanceConfig;\n  this.interceptors = {\n    request: new InterceptorManager(),\n    response: new InterceptorManager()\n  };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n  /*eslint no-param-reassign:0*/\n  // Allow for axios('example/url'[, config]) a la fetch API\n  if (typeof config === 'string') {\n    config = arguments[1] || {};\n    config.url = arguments[0];\n  } else {\n    config = config || {};\n  }\n\n  config = mergeConfig(this.defaults, config);\n\n  // Set config.method\n  if (config.method) {\n    config.method = config.method.toLowerCase();\n  } else if (this.defaults.method) {\n    config.method = this.defaults.method.toLowerCase();\n  } else {\n    config.method = 'get';\n  }\n\n  var transitional = config.transitional;\n\n  if (transitional !== undefined) {\n    validator.assertOptions(transitional, {\n      silentJSONParsing: validators.transitional(validators.boolean, '1.0.0'),\n      forcedJSONParsing: validators.transitional(validators.boolean, '1.0.0'),\n      clarifyTimeoutError: validators.transitional(validators.boolean, '1.0.0')\n    }, false);\n  }\n\n  // filter out skipped interceptors\n  var requestInterceptorChain = [];\n  var synchronousRequestInterceptors = true;\n  this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n    if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n      return;\n    }\n\n    synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n    requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n  });\n\n  var responseInterceptorChain = [];\n  this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n    responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n  });\n\n  var promise;\n\n  if (!synchronousRequestInterceptors) {\n    var chain = [dispatchRequest, undefined];\n\n    Array.prototype.unshift.apply(chain, requestInterceptorChain);\n    chain = chain.concat(responseInterceptorChain);\n\n    promise = Promise.resolve(config);\n    while (chain.length) {\n      promise = promise.then(chain.shift(), chain.shift());\n    }\n\n    return promise;\n  }\n\n\n  var newConfig = config;\n  while (requestInterceptorChain.length) {\n    var onFulfilled = requestInterceptorChain.shift();\n    var onRejected = requestInterceptorChain.shift();\n    try {\n      newConfig = onFulfilled(newConfig);\n    } catch (error) {\n      onRejected(error);\n      break;\n    }\n  }\n\n  try {\n    promise = dispatchRequest(newConfig);\n  } catch (error) {\n    return Promise.reject(error);\n  }\n\n  while (responseInterceptorChain.length) {\n    promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());\n  }\n\n  return promise;\n};\n\nAxios.prototype.getUri = function getUri(config) {\n  config = mergeConfig(this.defaults, config);\n  return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\\?/, '');\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n  /*eslint func-names:0*/\n  Axios.prototype[method] = function(url, config) {\n    return this.request(mergeConfig(config || {}, {\n      method: method,\n      url: url,\n      data: (config || {}).data\n    }));\n  };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n  /*eslint func-names:0*/\n  Axios.prototype[method] = function(url, data, config) {\n    return this.request(mergeConfig(config || {}, {\n      method: method,\n      url: url,\n      data: data\n    }));\n  };\n});\n\nmodule.exports = Axios;\n","'use strict';\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n  this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n  return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n","'use strict';\n\nvar Cancel = require('./Cancel');\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n  if (typeof executor !== 'function') {\n    throw new TypeError('executor must be a function.');\n  }\n\n  var resolvePromise;\n  this.promise = new Promise(function promiseExecutor(resolve) {\n    resolvePromise = resolve;\n  });\n\n  var token = this;\n  executor(function cancel(message) {\n    if (token.reason) {\n      // Cancellation has already been requested\n      return;\n    }\n\n    token.reason = new Cancel(message);\n    resolvePromise(token.reason);\n  });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n  if (this.reason) {\n    throw this.reason;\n  }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n  var cancel;\n  var token = new CancelToken(function executor(c) {\n    cancel = c;\n  });\n  return {\n    token: token,\n    cancel: cancel\n  };\n};\n\nmodule.exports = CancelToken;\n","'use strict';\n\nvar utils = require('./utils');\nvar bind = require('./helpers/bind');\nvar Axios = require('./core/Axios');\nvar mergeConfig = require('./core/mergeConfig');\nvar defaults = require('./defaults');\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n  var context = new Axios(defaultConfig);\n  var instance = bind(Axios.prototype.request, context);\n\n  // Copy axios.prototype to instance\n  utils.extend(instance, Axios.prototype, context);\n\n  // Copy context to instance\n  utils.extend(instance, context);\n\n  return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Factory for creating new instances\naxios.create = function create(instanceConfig) {\n  return createInstance(mergeConfig(axios.defaults, instanceConfig));\n};\n\n// Expose Cancel & CancelToken\naxios.Cancel = require('./cancel/Cancel');\naxios.CancelToken = require('./cancel/CancelToken');\naxios.isCancel = require('./cancel/isCancel');\n\n// Expose all/spread\naxios.all = function all(promises) {\n  return Promise.all(promises);\n};\naxios.spread = require('./helpers/spread');\n\n// Expose isAxiosError\naxios.isAxiosError = require('./helpers/isAxiosError');\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n *  ```js\n *  function f(x, y, z) {}\n *  var args = [1, 2, 3];\n *  f.apply(null, args);\n *  ```\n *\n * With `spread` this example can be re-written.\n *\n *  ```js\n *  spread(function(x, y, z) {})([1, 2, 3]);\n *  ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n  return function wrap(arr) {\n    return callback.apply(null, arr);\n  };\n};\n","'use strict';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nmodule.exports = function isAxiosError(payload) {\n  return (typeof payload === 'object') && (payload.isAxiosError === true);\n};\n","module.exports = require('./lib/axios');","/*!\n * JavaScript Cookie v2.2.1\n * https://github.com/js-cookie/js-cookie\n *\n * Copyright 2006, 2015 Klaus Hartl & Fagner Brack\n * Released under the MIT license\n */\n;(function (factory) {\n\tvar registeredInModuleLoader;\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (!registeredInModuleLoader) {\n\t\tvar OldCookies = window.Cookies;\n\t\tvar api = window.Cookies = factory();\n\t\tapi.noConflict = function () {\n\t\t\twindow.Cookies = OldCookies;\n\t\t\treturn api;\n\t\t};\n\t}\n}(function () {\n\tfunction extend () {\n\t\tvar i = 0;\n\t\tvar result = {};\n\t\tfor (; i < arguments.length; i++) {\n\t\t\tvar attributes = arguments[ i ];\n\t\t\tfor (var key in attributes) {\n\t\t\t\tresult[key] = attributes[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction decode (s) {\n\t\treturn s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);\n\t}\n\n\tfunction init (converter) {\n\t\tfunction api() {}\n\n\t\tfunction set (key, value, attributes) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattributes = extend({\n\t\t\t\tpath: '/'\n\t\t\t}, api.defaults, attributes);\n\n\t\t\tif (typeof attributes.expires === 'number') {\n\t\t\t\tattributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);\n\t\t\t}\n\n\t\t\t// We're using \"expires\" because \"max-age\" is not supported by IE\n\t\t\tattributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';\n\n\t\t\ttry {\n\t\t\t\tvar result = JSON.stringify(value);\n\t\t\t\tif (/^[\\{\\[]/.test(result)) {\n\t\t\t\t\tvalue = result;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\n\t\t\tvalue = converter.write ?\n\t\t\t\tconverter.write(value, key) :\n\t\t\t\tencodeURIComponent(String(value))\n\t\t\t\t\t.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);\n\n\t\t\tkey = encodeURIComponent(String(key))\n\t\t\t\t.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)\n\t\t\t\t.replace(/[\\(\\)]/g, escape);\n\n\t\t\tvar stringifiedAttributes = '';\n\t\t\tfor (var attributeName in attributes) {\n\t\t\t\tif (!attributes[attributeName]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstringifiedAttributes += '; ' + attributeName;\n\t\t\t\tif (attributes[attributeName] === true) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Considers RFC 6265 section 5.2:\n\t\t\t\t// ...\n\t\t\t\t// 3.  If the remaining unparsed-attributes contains a %x3B (\";\")\n\t\t\t\t//     character:\n\t\t\t\t// Consume the characters of the unparsed-attributes up to,\n\t\t\t\t// not including, the first %x3B (\";\") character.\n\t\t\t\t// ...\n\t\t\t\tstringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n\t\t\t}\n\n\t\t\treturn (document.cookie = key + '=' + value + stringifiedAttributes);\n\t\t}\n\n\t\tfunction get (key, json) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar jar = {};\n\t\t\t// To prevent the for loop in the first place assign an empty array\n\t\t\t// in case there are no cookies at all.\n\t\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < cookies.length; i++) {\n\t\t\t\tvar parts = cookies[i].split('=');\n\t\t\t\tvar cookie = parts.slice(1).join('=');\n\n\t\t\t\tif (!json && cookie.charAt(0) === '\"') {\n\t\t\t\t\tcookie = cookie.slice(1, -1);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tvar name = decode(parts[0]);\n\t\t\t\t\tcookie = (converter.read || converter)(cookie, name) ||\n\t\t\t\t\t\tdecode(cookie);\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcookie = JSON.parse(cookie);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tjar[name] = cookie;\n\n\t\t\t\t\tif (key === name) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\n\t\t\treturn key ? jar[key] : jar;\n\t\t}\n\n\t\tapi.set = set;\n\t\tapi.get = function (key) {\n\t\t\treturn get(key, false /* read as raw */);\n\t\t};\n\t\tapi.getJSON = function (key) {\n\t\t\treturn get(key, true /* read as json */);\n\t\t};\n\t\tapi.remove = function (key, attributes) {\n\t\t\tset(key, '', extend(attributes, {\n\t\t\t\texpires: -1\n\t\t\t}));\n\t\t};\n\n\t\tapi.defaults = {};\n\n\t\tapi.withConverter = init;\n\n\t\treturn api;\n\t}\n\n\treturn init(function () {});\n}));\n","import Cookies from \"js-cookie\";\nimport { store, setCookieOptionsByTokenType } from \"./store.js\";\n\n/**\n * Remove a cookie by name, regardless of its cookie setting(s).\n * @param {String} name\n */\nexport function removeCookie(name) {\n  // Define all possible path and domain combinations\n  let paths, domains;\n  try {\n    const path = window.location.pathname;\n    const hostname = window.location.hostname;\n    const hostnameParts = hostname.split(\".\");\n    const primaryDomain = hostnameParts.slice(-2).join(\".\");\n    paths = [undefined, path, \"/\"];\n    domains = [\n      undefined,\n      hostname,\n      `.${hostname}`,\n      primaryDomain,\n      `.${primaryDomain}`,\n    ];\n  } catch (err) {\n    paths = [undefined, \"/\"];\n    domains = [undefined];\n  }\n\n  // Iterate over paths and domains, and remove cookies if present\n  paths.map((path) => {\n    domains.map((domain) => {\n      const options = {};\n      if (domain) options.domain = domain;\n      if (path) options.path = path;\n      Cookies.remove(name, options);\n    });\n  });\n}\n\n/**\n * Remove all auth cookies (access, id, refresh).\n */\nexport function removeAllCookies() {\n  removeCookie(store.tokens.accessTokenName);\n  removeCookie(store.tokens.idTokenName);\n  removeCookie(store.tokens.refreshTokenName);\n}\n\n/**\n * Set the cookies from a tokens object, and add to the local store.\n * @param {Object} tokens\n */\nexport function setCookiesAndTokens(tokens) {\n  setCookieOptionsByTokenType(\"access\", tokens.access.cookieOptions);\n  store.tokens.accessToken = tokens.access.value;\n\n  setCookieOptionsByTokenType(\"id\", tokens.id.cookieOptions);\n  store.tokens.idToken = tokens.id.value;\n\n  if (tokens.refresh && tokens.refresh.value) {\n    setCookieOptionsByTokenType(\"refresh\", tokens.refresh.cookieOptions);\n    store.tokens.refreshToken = tokens.refresh.value;\n  }\n}\n","/**\n * This file is for zero-dependency utilities that can\n * be imported by any other file. Don't add any imports\n * to this file other than constants\n */\n\n/**\n * Get the unverified base64 decoded payload of a JWT\n *\n * @param {String} token - JSON Web Token\n * @returns {Object}\n */\nexport function getJwtPayload(token) {\n  try {\n    const encodedPayload = token\n      .split(\".\")[1]\n      .replace(\"-\", \"+\")\n      .replace(\"_\", \"/\");\n    return JSON.parse(atob(encodedPayload));\n  } catch (error) {\n    console.error(\"Problem decoding JWT payload\", error);\n  }\n}\n\n/**\n * Client-side check:\n * Determine whether the given JWT is present and unexpired\n *\n * @param {String} token JSON Web Token\n * @returns {Boolean}\n */\nexport function isJwtLocallyValid(token) {\n  try {\n    // Must be present\n    if (!token) {\n      return false;\n    }\n\n    // Must not be expired\n    const payload = getJwtPayload(token);\n    return new Date(payload.exp * 1000) > new Date();\n  } catch (error) {\n    return false;\n  }\n}\n\nexport function throwFormattedError(error) {\n  if (!error) return;\n  if (typeof error === \"string\") throw new Error(error);\n  if (error?.response?.data?.message) {\n    throw new Error(error.response.data.message);\n  }\n  throw error;\n}\n\nexport function isBrowser() {\n  return typeof window !== \"undefined\";\n}","import axios from \"axios\";\nimport { store } from \"./store.js\";\n\n// Replace multiple slashes // with single slash / (except in the protocol)\nfunction reduceSlashes(str) {\n  return str.replace(/([^:]\\/)\\/+/g, \"$1\");\n}\n\n/**\n * Perform a GET request\n * @param {String} path\n * @param {Object} options\n * @returns {Object} response body\n */\nexport async function get(path, options) {\n  const url = reduceSlashes(`${store.baseUrl}${path}`);\n  return axios.get(url, options);\n}\n\n/**\n * Perform a POST request\n * @param {String} path\n * @param {Object} payload\n * @param {Object} options\n * @returns {Object} response body\n */\nexport async function post(path, payload, options) {\n  const url = reduceSlashes(`${store.baseUrl}${path}`);\n  return axios.post(url, payload, options);\n}\n\n/**\n * Perform a PUT request\n * @param {String} path\n * @param {Object} payload\n * @param {Object} options\n * @returns {Object} response body\n */\nexport async function put(path, payload, options) {\n  const url = reduceSlashes(`${store.baseUrl}${path}`);\n  return axios.put(url, payload, options);\n}\n\nexport default {\n  get,\n  post,\n  put,\n};\n","import { get } from \"./api.js\";\nimport { setCookiesAndTokens } from \"./cookies.js\";\nimport { store } from \"./store.js\";\n// import { getIframe, postMessageAsPromise } from \"./iframe.js\";\nimport { throwFormattedError } from \"./utils.js\";\n\n/**\n * Refresh the access and ID tokens\n * - When in test mode, uses the basic refresh method\n * - For tenants without a custom SSL certificate, uses the basic refresh method\n * - For tenants with a custom SSL certificate and in live mode, uses the httpOnly refresh method\n * @returns {Promise}\n */\nexport async function refresh() {\n  try {\n    await basicRefresh();\n  } catch (error) {\n    console.warn(`Refresh failed: ${error.message}`);\n  }\n}\n\n/**\n * Use a regular (non-httpOnly) cookie to refresh the access and ID tokens.\n *\n * The basic refresh method is used automatically in test mode and in live\n * mode whenever an SSL certificate has not been set up.\n */\nasync function basicRefresh() {\n  const refreshToken = store.tokens.refreshToken;\n  try {\n    const { data, status } = await get(`/auth/refresh`, {\n      headers: {\n        authorization: `Bearer ${refreshToken}`,\n      },\n    });\n    if (status !== 200) {\n      throw new Error(data.message || \"Problem with request\");\n    }\n    if (data.tokens) {\n      setCookiesAndTokens(data.tokens);\n      return data;\n    } else {\n      throw new Error(\"Problem setting cookies\");\n    }\n  } catch (error) {\n    throwFormattedError(error);\n  }\n}\n\n// TODO re-enable httpOnly refresh method once new endpoints are stable [06/15/21]\n/**\n *\n * The httpOnly refresh method is only available for tenants with configured\n * SSL certificates while in live mode.\n */\n// async function httpOnlyRefresh() {\n//   const iframe = getIframe();\n//   if (!iframe) return;\n//   return postMessageAsPromise({\n//     type: \"refresh\",\n//     tenantId: store.tenantId,\n//   });\n// }\n\n/**\n * Use a sessionId and nonce to set the iframe refresh token\n * @param {String} sessionId\n * @param {String} nonce\n * @returns {Promise}\n */\nexport async function exchange({ sessionId, nonce }) {\n  return;\n\n  // TODO re-enable httpOnly exchange method once new endpoints are stable [06/15/21]\n  // --------------------------\n  // const iframe = getIframe();\n  // if (!iframe) return;\n  // return postMessageAsPromise({\n  //   type: \"exchange\",\n  //   tenantId: store.tenantId,\n  //   payload: {\n  //     sessionId,\n  //     nonce,\n  //   },\n  // });\n}\n","import { store } from \"./store.js\";\nimport { put } from \"./api.js\";\nimport { refresh } from \"./refresh.js\";\nimport { getJwtPayload } from \"./utils.js\";\n\n/**\n * Update the user record on Userfront\n * @param {Object} payload User properties to update e.g. { name: 'John Doe' }\n */\nexport async function update(payload) {\n  if (!payload || Object.keys(payload).length < 1) {\n    return console.warn(\"Missing user properties to update\");\n  }\n\n  // Make request to update the user\n  await put(`/self`, payload, {\n    headers: {\n      authorization: `Bearer ${store.tokens.accessToken}`,\n    },\n  });\n\n  // Refresh the access and ID tokens, and set the store.user object from the ID token\n  await refresh();\n\n  return store.user;\n}\n\n/**\n * Determine whether the access token has a given role\n * @param {String} roleName\n * @param {Object} options\n * @returns {Boolean}\n */\nexport function hasRole(roleName, { tenantId } = {}) {\n  try {\n    if (!store.tokens.accessToken || !store.tenantId) {\n      return false;\n    }\n    const { authorization } = getJwtPayload(store.tokens.accessToken);\n    if (!authorization) {\n      return false;\n    }\n    tenantId = tenantId || store.tenantId;\n    if (!authorization[tenantId] || !authorization[tenantId].roles) {\n      return false;\n    }\n    return authorization[tenantId].roles.indexOf(roleName) > -1;\n  } catch (error) {\n    return false;\n  }\n}\n","import { store } from \"./store.js\";\nimport { isJwtLocallyValid } from \"./utils.js\";\n\n/**\n * Get the access token's value\n */\nexport function accessToken() {\n  return store.tokens.accessToken;\n}\n\n/**\n * Get the id token's value\n */\nexport function idToken() {\n  return store.tokens.idToken;\n}\n\n/**\n * Client-side check:\n * Determine whether the access token is present and unexpired\n * @returns {Boolean}\n */\nexport function isAccessTokenLocallyValid() {\n  return isJwtLocallyValid(store.tokens.accessToken);\n}\n\n/**\n * Client-side check:\n * Determine whether the refresh token is present and unexpired\n * @returns {Boolean}\n */\nexport function isRefreshTokenLocallyValid() {\n  return isJwtLocallyValid(store.tokens.refreshToken);\n}\n","import { store } from \"./store.js\";\n\n// Data specific to the MFA service\nexport const authenticationData = {\n  firstFactors: [],\n  secondFactors: [],\n  firstFactorToken: null,\n};\n\n/**\n * Set authenticationData.firstFactors from the authentication object\n * @param {Object} authentication\n * {\n *   firstFactors,\n *   secondFactors\n * }\n * @returns\n */\nexport function setFirstFactors(authentication) {\n  // If we're not initialized, there are no first factors.\n  if (!store.tenantId) {\n    console.warn(\n      \"setFirstFactors: tried to set factors without a tenantId set.\"\n    );\n    return;\n  }\n  // If we're passed an invalid argument, keep the authentication data as is.\n  if (\n    !authentication ||\n    typeof authentication !== \"object\" ||\n    !Array.isArray(authentication.firstFactors)\n  ) {\n    console.warn(\"setFirstFactors: invalid factors passed.\");\n    return;\n  }\n  authenticationData.firstFactors = authentication.firstFactors;\n}\n\n/**\n * Check if MFA is required for the ongoing signup or login flow.\n * @returns {Boolean} true if MFA is currently required\n */\nexport function isMfaRequired() {\n  return !!authenticationData.firstFactorToken;\n}\n\n/**\n * Update the MFA service state given a response to a signup or login call.\n * Adds secondFactors and firstFactorToken if it is a MFA Required response,\n * removes them if it is a successful signup or login,\n * leaves the service unchanged otherwise.\n * @param {Object} response\n */\nexport function handleMfaRequired(response) {\n  if (!response.isMfaRequired) {\n    // If we've logged in or signed up successfully,\n    // clear the MFA service state.\n    if (response.message === \"OK\") {\n      clearMfa();\n    }\n    return;\n  }\n  authenticationData.secondFactors = response.authentication.secondFactors;\n  authenticationData.firstFactorToken = response.firstFactorToken;\n}\n\n/**\n * If MFA is required, returns a headers object with authorization set to the firstFactorToken.\n * Otherwise, returns an empty object.\n * @returns {Object} a headers object with MFA authorization header set, or empty if MFA is not required\n */\nexport function getMfaHeaders() {\n  if (authenticationData.firstFactorToken) {\n    return {\n      authorization: `Bearer ${authenticationData.firstFactorToken}`,\n    };\n  }\n  return {};\n}\n\n/**\n * Clears the current transient state of the MFA service,\n * leaving the tenant's persistent state in place.\n */\nexport function clearMfa() {\n  authenticationData.secondFactors = [];\n  authenticationData.firstFactorToken = null;\n}\n\n/**\n * Fully resets the MFA service, including the tenant's persistent state,\n * to it uninitialized state.\n */\nexport function resetMfa() {\n  clearMfa();\n  authenticationData.firstFactors = [];\n}\n","import {\n  isAccessTokenLocallyValid,\n  isRefreshTokenLocallyValid,\n} from \"./tokens.js\";\nimport {\n  authenticationData,\n  isMfaRequired,\n  clearMfa,\n} from \"./authentication.js\";\nimport { refresh } from \"./refresh.js\";\n\n/**\n * Determine whether a user is logged in by checking their\n * JWT access token and, if invalid, refreshing it and checking\n * again.\n * @returns {Promise<Boolean>}\n */\nasync function getIsLoggedIn() {\n  try {\n    // If the access token is locally valid, return true\n    if (isAccessTokenLocallyValid()) {\n      return true;\n    }\n\n    // If the refresh token is locally invalid, return false\n    if (!isRefreshTokenLocallyValid()) {\n      return false;\n    }\n\n    // Attempt to refresh the access token\n    await refresh();\n\n    // The access token should now be valid\n    return isAccessTokenLocallyValid();\n  } catch (error) {\n    return false;\n  }\n}\n\n/**\n * Return detailed information about the current session.\n * @returns {Promise<Object>}\n */\nexport async function getSession() {\n  const isLoggedIn = await getIsLoggedIn();\n  return {\n    isLoggedIn,\n    needsSecondFactor: isMfaRequired(),\n    firstFactors: authenticationData.firstFactors,\n    secondFactors: authenticationData.secondFactors,\n    resetMfaState: clearMfa,\n  };\n}\n","import { getQueryAttr } from \"./url.js\";\nimport { isBrowser } from \"./utils.js\";\n\nexport const store = {\n  codeChallenge: \"\",\n  get usePkce() {\n    return !!store.codeChallenge;\n  }\n}\n\n/**\n * Reads an unexpired challenge code from local storage\n * @returns {string?} the challenge code, if an unexpired one is in local storage\n */\nexport function readPkceDataFromLocalStorage() {\n  if (!isBrowser()) {\n    return;\n  }\n  const codeChallenge = window.localStorage.getItem(\"uf_pkce_code_challenge\");\n  if (codeChallenge) {\n    const expiresAt = window.localStorage.getItem(\"uf_pkce_code_challenge_expiresAt\");\n    if (expiresAt && (parseInt(expiresAt, 10) > Date.now())) {\n      return codeChallenge;\n    }\n  }\n}\n\n/**\n * Write a challenge code to local storage, expiring in 5 minutes\n * @param {string} codeChallenge \n * @returns \n */\nexport function writePkceDataToLocalStorage(codeChallenge) {\n  if (!isBrowser()) {\n    return;\n  }\n  if (!codeChallenge) {\n    return clearPkceDataFromLocalStorage();\n  }\n  store.codeChallenge = codeChallenge;\n  const expiresAt = (Date.now() + 1000 * 60 * 5); // 5 minutes from now\n  try {\n    window.localStorage.setItem(\"uf_pkce_code_challenge\", codeChallenge);\n    window.localStorage.setItem(\"uf_pkce_code_challenge_expiresAt\", expiresAt);\n  } catch (err) {\n    // Suppress exception from full local storage\n  }\n}\n\n/**\n * Clear the challenge code and expiration from local storage\n */\nexport function clearPkceDataFromLocalStorage() {\n  if (!isBrowser()) {\n    return;\n  }\n  window.localStorage.removeItem(\"uf_pkce_code_challenge\");\n  window.localStorage.removeItem(\"uf_pkce_code_challenge_expiresAt\");\n}\n\n/**\n * Set up the PKCE service: look for a PKCE challenge code in\n * query params or local storage. If both are present, the query\n * param is preferred.\n * @returns {Boolean} true if we should use PKCE in our auth requests\n */\nexport function setupPkce() {\n  if (!isBrowser()) {\n    return;\n  }\n  const codeChallengeFromQueryParams = getQueryAttr(\"code_challenge\");\n  if (codeChallengeFromQueryParams) {\n    store.codeChallenge = codeChallengeFromQueryParams;\n    writePkceDataToLocalStorage(codeChallengeFromQueryParams);\n    return true;\n  }\n  const codeChallengeFromLocalStorage = readPkceDataFromLocalStorage();\n  if (codeChallengeFromLocalStorage) {\n    store.codeChallenge = codeChallengeFromLocalStorage;\n    return true;\n  }\n  clearPkceDataFromLocalStorage();\n  return false;\n}\n\n/**\n * Get (possibly empty) PKCE query params to attach to an auth request\n * @returns {object} an object to be used for an Axios request's params field\n */\nexport function getPkceRequestQueryParams() {\n  if (!store.usePkce) {\n    return {};\n  }\n  return { \"code_challenge\": store.codeChallenge };\n}\n\n/**\n * Redirect to url with PKCE query params (authorization_code) set. Does not redirect\n * if url or authorizationCode are falsy.\n * \n * @param {string} url full URL to redirect to (may be a deep link for a mobile app)\n * @param {string} authorizationCode the authorization code received from the server\n * @returns \n */\nexport function redirectWithPkce(url, authorizationCode) {\n  if (!url || !authorizationCode) {\n    return;\n  }\n  if (!store.usePkce) {\n    console.warn(\"Redirecting with a PKCE authorization code, but no PKCE challenge code is present in the client. This is unexpected.\")\n  }\n  const _url = new URL(url);\n  _url.searchParams.set(\"authorization_code\", authorizationCode);\n  clearPkceDataFromLocalStorage();\n  window.location.assign(_url.href);\n}","import { get } from \"./api.js\";\nimport { store } from \"./store.js\";\nimport { removeAllCookies } from \"./cookies.js\";\nimport { getSession } from \"./session.js\";\nimport { store as pkceStore } from \"./pkce.js\";\n\n/**\n * Get the value of a query attribute, e.g. ?attr=value\n * @param {String} attrName\n */\nexport function getQueryAttr(attrName) {\n  if (\n    typeof window !== \"object\" ||\n    typeof window.location !== \"object\" ||\n    !window.location.href ||\n    window.location.href.indexOf(`${attrName}=`) < 0\n  ) {\n    return;\n  }\n  return decodeURIComponent(\n    window.location.href.split(`${attrName}=`)[1].split(\"&\")[0]\n  );\n}\n\n/**\n * Redirect the browser based on explicit redirect input path, or the API response\n * @property {String|Boolean} redirect A path to redirect to, or false to not redirect\n * @property {Object} data The response object from the API\n * @returns\n */\nexport const handleRedirect = ({ redirect, data }) => {\n  if (redirect === false) return;\n  // If redirect is the boolean true, redirect to the default redirect path, not to \"/true\"\n  if (redirect === true) {\n    const path = getQueryAttr(\"redirect\") || data.redirectTo || \"/\";\n    redirectToPath(path);\n    return;\n  }\n  const path = redirect || getQueryAttr(\"redirect\") || data.redirectTo || \"/\";\n  redirectToPath(path);\n};\n\n/**\n * If the access token is valid, redirect the browser to the\n * tenant's After-login path.\n */\nexport async function redirectIfLoggedIn({ redirect } = {}) {\n  const { isLoggedIn } = await getSession();\n  if (!isLoggedIn) {\n    return removeAllCookies();\n  }\n\n  // TODO see #130: can handle this more elegantly once we have an exchange tokens -> authorizationCode\n  // endpoint on the server.\n  // If this is a PKCE auth session, don't redirect with this function ever.\n  // The only way to get an authorizationCode currently is to go through an auth flow.\n  // The PKCE module handles redirect after a PKCE Required response is received.\n  if (pkceStore.usePkce) {\n    return;\n  }\n\n  // Redirect to a provided path (check options first, then url querystring)\n  if (redirect) {\n    return redirectToPath(redirect);\n  } else if (getQueryAttr(\"redirect\")) {\n    return redirectToPath(getQueryAttr(\"redirect\"));\n  }\n\n  // If no path was provided, look up the path and then redirect there\n  try {\n    const { data } = await get(`/self`, {\n      headers: {\n        authorization: `Bearer ${store.tokens.accessToken}`,\n      },\n    });\n    if (data.tenant && data.tenant.loginRedirectPath) {\n      redirectToPath(data.tenant.loginRedirectPath);\n    }\n  } catch (err) {\n    removeAllCookies();\n  }\n}\n\n/**\n * If the access token is invalid, redirect the browser to the\n * provided path.\n */\nexport async function redirectIfLoggedOut({ redirect } = {}) {\n  // If the user is logged in, return without doing anything\n  const { isLoggedIn } = await getSession();\n  if (isLoggedIn) {\n    return;\n  }\n\n  // Remove all cookies\n  removeAllCookies();\n\n  // Redirect to a provided path (check options first, then url querystring)\n  if (redirect) {\n    return redirectToPath(redirect);\n  } else if (getQueryAttr(\"redirect\")) {\n    return redirectToPath(getQueryAttr(\"redirect\"));\n  }\n\n  // If no redirect path was provided, do not redirect\n  return;\n}\n\n/**\n * Redirect to path portion of a URL.\n */\nexport function redirectToPath(pathOrUrl) {\n  // Return if no pathOrUrl, or if SSR or mobile\n  if (\n    !pathOrUrl ||\n    typeof document !== \"object\" ||\n    typeof window !== \"object\"\n  ) {\n    return;\n  }\n  try {\n    document && window;\n  } catch (error) {\n    return;\n  }\n\n  // Perform hard redirect\n  const el = document.createElement(\"a\");\n  el.href = pathOrUrl;\n  let path = `${el.pathname}${el.hash}${el.search}`;\n  if (el.pathname !== window.location.pathname) {\n    window.location.assign(path);\n  }\n}\n","import { post, put } from \"./api.js\";\nimport { setCookiesAndTokens } from \"./cookies.js\";\nimport { store } from \"./store.js\";\nimport { getQueryAttr, handleRedirect } from \"./url.js\";\nimport { throwFormattedError } from \"./utils.js\";\nimport { exchange } from \"./refresh.js\";\nimport {\n  getMfaHeaders,\n  handleMfaRequired,\n  clearMfa,\n} from \"./authentication.js\";\nimport { getPkceRequestQueryParams, redirectWithPkce } from \"./pkce.js\";\n\n/**\n * Register a new user with username, name, email, and password.\n * Redirect the browser after successful signup based on the redirectTo value returned.\n * @param {String} username\n * @param {String} name\n * @param {String} email\n * @param {String} password\n * @param {Object} userData - alias for the user.data object, since \"data\" is used in the response\n * @param {String} redirect - do not redirect if false, or redirect to a specific path\n */\nexport async function signupWithPassword({\n  username,\n  name,\n  email,\n  password,\n  userData,\n  redirect,\n} = {}) {\n  try {\n    const { data } = await post(\n      `/auth/create`,\n      {\n        tenantId: store.tenantId,\n        username,\n        name,\n        email,\n        password,\n        data: userData,\n      },\n      {\n        headers: getMfaHeaders(),\n        params: getPkceRequestQueryParams(),\n      }\n    );\n    if (data.tokens) {\n      clearMfa();\n      setCookiesAndTokens(data.tokens);\n      await exchange(data);\n      handleRedirect({ redirect, data });\n      return data;\n    } else if (data.firstFactorToken) {\n      handleMfaRequired(data);\n      return data;\n    } else if (data.authorizationCode) {\n      const url = redirect || data.redirectTo;\n      if (url) {\n        redirectWithPkce(url, data.authorizationCode);\n      } else {\n        // We can't exchange the authorizationCode for tokens, because we don't have the verifier code\n        // that matches our challenge code.\n        throw new Error(\"Received a PKCE (mobile auth) response from the server, but no redirect was provided. Please set the redirect to the app that initiated the request.\")\n      }\n    } else {\n      throw new Error(\"Please try again.\");\n    }\n  } catch (error) {\n    throwFormattedError(error);\n  }\n}\n\n/**\n * Log a user in with email/username and password.\n * Redirect the browser after successful login based on the redirectTo value returned.\n * @param {Object} params\n * @param {string} params.email The user's email. One of email/username/emailOrUsername should be present.\n * @param {string} params.username The user's username. One of email/username/emailOrUsername should be present.\n * @param {string} params.emailOrUsername Either the user's email or username. One of email/username/emailOrUsername should be present.\n * @param {string} params.password\n * @param {string | boolean} params.redirect \n *  URL to redirect to after login, or false to suppress redirect. Otherwise, redirects to the after-login path set on the server.\n * @param {object} params.options\n * @param {boolean} params.options.noResetEmail\n *  By default, Userfront sends a password reset email if a user without a password tries to log in with a password.\n *  Set options.noResetEmail = true to override this behavior and return an error instead.\n * \n */\nexport async function loginWithPassword({\n  email,\n  username,\n  emailOrUsername,\n  password,\n  redirect,\n  options\n}) {\n  try {\n    const body = {\n      tenantId: store.tenantId,\n      emailOrUsername: email || username || emailOrUsername,\n      password,\n    };\n    if (options && options.noResetEmail) {\n      body.options = {\n        noResetEmail: true\n      }\n    }\n    const { data } = await post(\n      `/auth/basic`,\n      body,\n      {\n        headers: getMfaHeaders(),\n        params: getPkceRequestQueryParams(),\n      }\n    );\n\n    if (data.hasOwnProperty(\"tokens\")) {\n      setCookiesAndTokens(data.tokens);\n      await exchange(data);\n      handleRedirect({ redirect, data });\n      return data;\n    }\n\n    if (data.hasOwnProperty(\"firstFactorToken\")) {\n      handleMfaRequired(data);\n      return data;\n    }\n\n    if (data.authorizationCode) {\n      const url = redirect || data.redirectTo;\n      if (url) {\n        redirectWithPkce(url, data.authorizationCode);\n        return;\n      } else {\n        // TODO this is neither valid nor invalid\n      }\n    }\n\n    throw new Error(\"Please try again.\");\n  } catch (error) {\n    throwFormattedError(error);\n  }\n}\n\n/**\n * Send a password reset link to the provided email.\n * @param {String} email\n */\nexport async function sendResetLink(email) {\n  try {\n    const { data } = await post(`/auth/reset/link`, {\n      email,\n      tenantId: store.tenantId,\n    });\n    return data;\n  } catch (error) {\n    throwFormattedError(error);\n  }\n}\n\n/**\n * Set a user's password with their link credentials or JWT access token.\n *\n * If no method is provided, the order is:\n * - Check for link credentials; then\n * - Check for a JWT access token first\n *\n * @property {String} method (optional) \"link\" or \"jwt\"\n * @property {String} password\n * @property {String} existingPassword\n * @property {String} uuid\n * @property {String} token\n * @property {String} redirect\n * @returns\n */\nexport async function updatePassword({\n  method,\n  password,\n  existingPassword,\n  uuid,\n  token,\n  redirect,\n}) {\n  switch (method) {\n    // Allow for explicit setting of method\n    case \"link\":\n      return updatePasswordWithLink({ uuid, token, password, redirect });\n    case \"jwt\":\n      return updatePasswordWithJwt({ password, existingPassword });\n    default:\n      // Default (no method provided) is to look for link credentials first, then JWT access token\n      token = token || getQueryAttr(\"token\");\n      uuid = uuid || getQueryAttr(\"uuid\");\n      if (uuid && token) {\n        return updatePasswordWithLink({ uuid, token, password, redirect });\n      } else if (store.tokens.accessToken) {\n        return updatePasswordWithJwt({ password, existingPassword });\n      } else {\n        throw new Error(\n          \"updatePassword() was called without link credentials (token & uuid) or a JWT access token.\"\n        );\n      }\n  }\n}\n\nexport const resetPassword = updatePassword;\n\nexport async function updatePasswordWithLink({\n  uuid,\n  token,\n  password,\n  redirect,\n}) {\n  try {\n    token = token || getQueryAttr(\"token\");\n    uuid = uuid || getQueryAttr(\"uuid\");\n    if (!token || !uuid) throw new Error(\"Missing token or uuid\");\n    const { data } = await put(`/auth/reset`, {\n      tenantId: store.tenantId,\n      uuid,\n      token,\n      password,\n    });\n    if (data.tokens) {\n      setCookiesAndTokens(data.tokens);\n      handleRedirect({ redirect, data });\n      return data;\n    } else {\n      throw new Error(\n        \"There was a problem resetting your password. Please try again.\"\n      );\n    }\n  } catch (error) {\n    throwFormattedError(error);\n  }\n}\n\nexport async function updatePasswordWithJwt({ password, existingPassword }) {\n  try {\n    if (!store.tokens.accessToken) {\n      throw new Error(\n        `updatePassword({ method: \"jwt\" }) was called without a JWT access token.`\n      );\n    }\n\n    const { data } = await put(\n      `/auth/basic`,\n      {\n        tenantId: store.tenantId,\n        password,\n        existingPassword,\n      },\n      {\n        headers: {\n          Authorization: `Bearer ${store.tokens.accessToken}`,\n        },\n      }\n    );\n\n    return data;\n  } catch (error) {\n    throwFormattedError(error);\n  }\n}\n","import { get, post } from \"./api.js\";\nimport { setCookiesAndTokens } from \"./cookies.js\";\nimport { store } from \"./store.js\";\nimport { handleRedirect } from \"./url.js\";\nimport { exchange } from \"./refresh.js\";\nimport { throwFormattedError } from \"./utils.js\";\nimport {\n  isMfaRequired,\n  getMfaHeaders,\n  handleMfaRequired,\n  clearMfa,\n} from \"./authentication.js\";\nimport { getPkceRequestQueryParams, redirectWithPkce } from \"./pkce.js\";\n\n/**\n * Log a user in with a TOTP authenticator code or a TOTP backup code,\n * plus an identifier for the user (e.g. userId, userUuid, or email)\n *\n * @property {String} totpCode \"123456\"\n * @property {String} backupCode \"aaaaa-bbbbb\"\n * @property {Integer} userId\n * @property {String} userUuid\n * @property {String} emailOrUsername\n * @property {String} email\n * @property {String} username\n * @property {String} phoneNumber\n * @property {String|Boolean} redirect - do not redirect if false, or redirect to given path\n */\nexport async function loginWithTotp({\n  totpCode,\n  backupCode,\n  userId,\n  userUuid,\n  emailOrUsername,\n  email,\n  username,\n  phoneNumber,\n  redirect,\n} = {}) {\n  try {\n\n    const { data } = await post(\n      `/auth/totp`,\n      {\n        totpCode,\n        backupCode,\n        userId,\n        userUuid,\n        emailOrUsername,\n        email,\n        username,\n        phoneNumber,\n        tenantId: store.tenantId,\n      },\n      {\n        headers: getMfaHeaders(),\n        params: getPkceRequestQueryParams(),\n      }\n    );\n\n    if (data.hasOwnProperty(\"tokens\")) {\n      clearMfa();\n      setCookiesAndTokens(data.tokens);\n      await exchange(data);\n      handleRedirect({ redirect, data });\n      return data;\n    }\n\n    if (data.hasOwnProperty(\"firstFactorToken\")) {\n      handleMfaRequired(data);\n      return data;\n    }\n\n    if (data.authorizationCode) {\n      const url = redirect || data.redirectTo;\n      if (url) {\n        redirectWithPkce(url, data.authorizationCode);\n        return;\n      } else {\n        // We can't exchange the authorizationCode for tokens, because we don't have the verifier code\n        // that matches our challenge code.\n        throw new Error(\"Received a PKCE (mobile auth) response from the server, but no redirect was provided. Please set the redirect to the app that initiated the request.\")\n      }\n    }\n\n    throw new Error(\"Problem logging in.\");\n  } catch (error) {\n    throwFormattedError(error);\n  }\n}\n\nexport async function getTotp() {\n  try {\n    if (isMfaRequired()) {\n      const { data } = await get(`/auth/totp`, {\n        headers: getMfaHeaders(),\n      });\n      return data;\n    }\n    if (!store.tokens.accessToken) {\n      throw new Error(`getTotp() was called without a JWT access token.`);\n    }\n\n    const { data } = await get(`/auth/totp`, {\n      headers: {\n        Authorization: `Bearer ${store.tokens.accessToken}`,\n      },\n    });\n\n    return data;\n  } catch (error) {\n    throwFormattedError(error);\n  }\n}\n","// Usage note: it's ok to add additional properties to the returned \"friendly store\" after creating it,\n// but not to add additional properties to the underlying store.\n// Good:\n//   const tokenStore = { accessToken: new TokenCookieStoredValue(\"access\") }\n//   const store = makeFriendlyStore(tokenStore)\n//   store.sayHi = () => console.log(\"hi\")\n//   store.sayHi() // console: hi\n//\n// Not good:\n//   const tokenStore = {\n//     accessToken: new TokenCookieStoredValue(\"access\"),\n//     sayHi: () => console.log(\"hi\")\n//   }\n//   const store = makeFriendlyStore(tokenStore)\n//   store.sayHi() // error: could not read property \"get\" of ...\n\n/**\n * Given a store where every value is an object with get(), set() and delete() methods,\n * create a \"friendly\" store where `x = store.key`, `store.key = x`, and `delete store.key`\n * are proxied through to those methods, respectively. Allows defining how to get/set/delete\n * a value without exposing that to store consumers.\n * \n * @param {object} store an object whose values are objects with get(), set() and delete() methods\n * @returns {object} an object where ordinary get, set and delete are proxied through to those methods\n */\nexport function makeFriendlyStore(store) {\n  // The store.tokens object is a Proxy over the underlying store,\n  // so it can overload the get, set etc. operations\n  const proxyConfig = {\n    // proxy.accessToken ->\n    // store.accessToken.get()\n    get(target, key) {\n      if (key in store) {\n        return store[key].get();\n      }\n      return Reflect.get(...arguments);\n    },\n\n    // proxy.accessToken = \"foo\" ->\n    // store.accessToken.set(\"foo\")\n    set(target, key, value) {\n      if (key in store) {\n        store[key].set(value);\n        return true;\n      }\n      return Reflect.set(...arguments);\n    },\n\n    // delete proxy.accessToken ->\n    // store.tokens.accessToken.delete()\n    deleteProperty(target, key) {\n      if (key in store) {\n        store[key].delete();\n        return true;\n      }\n      return Reflect.deleteProperty(...arguments);\n    },\n\n    // The last two proxy traps are to ensure the proxy has the expected\n    // behavior when a client examines or manipulates the object\n\n    // Object.getOwnPropertyDescriptor(store.tokens, \"accessToken\") ->\n    //   { configurable: true, enumerable: true, value: store.accessTokens.get() }\n    getOwnPropertyDescriptor(target, key) {\n      if (key in store) {\n        return {\n          configurable: true,\n          enumerable: true,\n          value: store[key].get()\n        };\n      }\n      return Reflect.getOwnPropertyDescriptor(...arguments);\n    },\n\n    // Include store fields in Object.keys(proxy.tokens) and methods that rely on it\n    ownKeys(target) {\n      return [\n        ...Reflect.ownKeys(target),\n        ...Object.keys(store)\n      ];\n    }\n  }\n  return new Proxy({}, proxyConfig);\n}\n","import Cookies from \"js-cookie\";\nimport { removeCookie } from \"./cookies.js\";\nimport { getJwtPayload } from \"./utils.js\";\nimport { update, hasRole } from \"./user.js\";\nimport { updatePassword } from \"./password.js\";\nimport { getTotp } from \"./totp.js\";\nimport { refresh } from \"./refresh.js\";\nimport { makeFriendlyStore } from \"./store.utils.js\";\n\n// The store object that will eventually be exported\nconst store = {\n  mode: \"live\",\n  tenantId: \"\"\n};\n\n\n/*\n * TOKEN COOKIE HELPERS\n * Helpers for cookie names and options\n */\n\n/**\n * Create a function that returns the name for a JWT cookie by type for the current tenant\n * @param {string} type \n * @returns {function}\n */\nconst getTokenCookieName = type => () => {\n  if (!store.tenantId) {\n    console.warn(\"@userfront/core getTokenCookieName: tried to get a token cookie's name without a tenant ID set.\");\n    return \"\";\n  }\n  return `${type}.${store.tenantId}`;\n}\n\n/*\n * Default cookie options (secure, sameSite, expiry) by type and name\n */\nconst defaultCookieOptions = Object.freeze({\n  secure: store.mode === \"live\",\n  sameSite: \"Lax\"\n});\nconst defaultRefreshTokenCookieOptions = Object.freeze({\n  sameSite: \"Strict\"\n});\nconst defaultCookieOptionsByTokenType = {\n  access: defaultCookieOptions,\n  id: defaultCookieOptions,\n  refresh: defaultRefreshTokenCookieOptions\n}\n\n/* Currently defined cookie options by cookie name\n * example:\n *   cookieOptions = {\n *     \"access.abcd1234\": {\n *       secure: \"true\",\n *       sameSite: \"Lax\",\n *       expiry: 14\n *     }\n *   }\n * \n * Usually we're only dealing with one set of tokens, so there\n * will only be entries for \"access.tenantId\", \"id.tenantId\", and \"refresh.tenantId\",\n * and it's more convenient to read/write with getCookieOptionsByTokenType()\n * and setCookieOptionsByTokenType().\n */ \nlet cookieOptions;\n\n/**\n * Clear all previously set cookie options. Primarily for testing.\n */\nexport function clearAllCookieOptions() {\n  cookieOptions = {};\n}\n\nclearAllCookieOptions();\n\n/**\n * Get cookie options for a particular cookie\n * @param {string} cookieName name of cookie\n * @param {string} tokenType if a JWT cookie, the type (access, id, refresh)\n * @returns \n */\nexport function getCookieOptionsByName(cookieName, tokenType = \"\") {\n  const storedOptions = cookieOptions[cookieName] || {};\n  const defaultOptions = Object.assign(\n    {},\n    defaultCookieOptions,\n    defaultCookieOptionsByTokenType[tokenType] || {}\n  );\n  return Object.assign({}, defaultOptions, storedOptions);\n}\n\n/**\n * Get cookie options for a JWT cookie for the current tenant\n * @param {string} tokenType JWT type (access, id, refresh)\n * @returns \n */\nexport function getCookieOptionsByTokenType(tokenType) {\n  return getCookieOptionsByName(getTokenCookieName(tokenType), tokenType);\n}\n\n/**\n * Set cookie options for a cookie by name\n * @param {string} cookieName \n * @param {object} options \n * @property {string} options.secure\n * @property {string} options.sameSite\n * @property {number} options.expires\n * @property {string} options.path\n * @property {string} options.domain\n * @returns \n */\nexport function setCookieOptionsByName(cookieName, options = {}) {\n  if (!cookieName) {\n    console.warn(\"@userfront/core setCookieOptionsByName: tried to set cookie options without a cookie name.\");\n    return;\n  }\n  cookieOptions[cookieName] = Object.freeze(options);\n}\n\n/**\n * Set cookie options for a JWT cookie by type, for the current tenant\n * @param {string} tokenType\n * @param {object} options \n * @property {string} options.secure\n * @property {string} options.sameSite\n * @property {number} options.expires\n * @property {string} options.path\n * @property {string} options.domain\n * @returns \n */\nexport function setCookieOptionsByTokenType(tokenType, options = {}) {\n  return setCookieOptionsByName(getTokenCookieName(tokenType), options);\n}\n\n\n\n/* NOTES ON STORE STRUCTURE AND GET/SET VALUE CLASSES\n *\n * Values in the store that are derived or computed, or where\n * additional work is needed to get/set/delete the value, are\n * tracked with \"get/set value classes\" below.\n * \n * These classes all implement the same interface:\n */\n\n/**\n * Interface for get/set value classes\n * @interface GetSetValue\n * \n * Get the current value\n * @function\n * @name GetSetValue#get\n * @returns {any} The current value, or undefined if it's not set\n * \n * Set the value.\n * For a read-only value, this is a no-op that will return undefined and log a warning.\n * @function\n * @name GetSetValue#set\n * @param {any} value Value to set\n * @returns {any} The value that was set\n * \n * Delete the value.\n * For a read-only value, this is a no-op.\n * Intended to be proxied to the delete operator, but does not necessarily implement\n * the delete operator's contract:\n *   delete store.someValue; // proxied to underlying.someValue.delete()\n *   console.log(\"someValue\" in store); // may still be true\n * This interface not designed for use cases where there's a distinction between\n * store.someValue === undefined and !(\"someValue\" in store)\n * @function\n * @name GetSetValue#delete\n */\n\n\n/*\n * TOKEN STORE IMPLEMENTATION\n * Interact with tokens, backed by cookies\n */\n\n/**\n * An interface for a value stored in cookies, with fallback to memory outside the browser\n * @implements {GetSetValue}\n */\nexport class TokenCookieStoredValue {\n  /**\n   * Define an interface for a JWT token, backed by cookies (or in-memory outside a browser context).\n   * Always refers to the current tenant's tokens (via store.tenantId).\n   * @param {string?} tokenType if a JWT token, its type: access, id, refresh\n   * @returns \n   */\n  constructor(tokenType) {\n    this._useMemory = false;\n    if (!tokenType) {\n      console.warn(\"@userfront/core TokenCookieStoredValue: tried to create a cookie-backed token value, but no token type was specified. Falling back to memory.\")\n      this._useMemory = true;\n    }\n    this.tokenType = tokenType.toString().trim();\n\n    // Fall back to memory store outside of browser\n    if (typeof window === \"undefined\") {\n      console.debug(\"@userfront/core TokenCookieStoredValue :: tried to create cookie-backed value outside a browser. Falling back to memory-only value.\")\n      this._useMemory = true;\n      this._val = undefined;\n      return;\n    }\n  }\n\n  // Get the backing cookie's name\n  _getName() {\n    // No name for a memory store\n    if (this._useMemory) {\n      return;\n    }\n    // No name if there's no tenant ID set\n    if (!store.tenantId) {\n      console.warn(\"@userfront/core TokenCookieStoredValue::_getName(): tried to interact with a cookie-backed token value, but store.tenantId is absent, so we don't know the cookie's name.\")\n      throw new Error(\"@userfront/core TokenCookieStoredValue::_getName(): a tenant ID is needed for this operation, but no tenant ID is set. Ensure Userfront.init(`my-tenant-id`) is called before using any other Userfront methods.\")\n    }\n\n    return `${this.tokenType}.${store.tenantId.trim()}`;\n  }\n\n  /**\n   * Get the current value\n   * @returns {string}\n   */\n  get() {\n    const name = this._getName();\n    if (this._useMemory || !name) {\n      return this._val;\n    }\n    const val = Cookies.get(name);\n    return val;\n  }\n\n  /**\n   * Set the value. Updates cookie options as needed.\n   * @param {string} val \n   * @returns {string} the new value\n   */\n  set(val) {\n    const name = this._getName();\n    if (this._useMemory || !name) {\n      this._val = val;\n      return val;\n    }\n    \n    if (val == null) {\n      removeCookie(name);\n      return;\n    }\n    const options = getCookieOptionsByName(this._getName(), this.tokenType);\n    Cookies.set(name, val, options);\n    return val;\n  }\n\n  /**\n   * Delete the current value, removing it from the browser's cookies.\n   */\n  delete() {\n    const name = this._getName();\n    if (this._useMemory || !name) {\n      return this._val = undefined;\n    }\n    \n    removeCookie(name);\n  }\n}\n\n/**\n * A simple interface for a computed value (matching the TokenCookieStoredValue interface)\n * @implements {GetSetValue}\n */\nexport class ComputedValue {\n  constructor(compute) {\n    this.compute = compute;\n  }\n\n  get() {\n    return this.compute();\n  }\n\n  set(val) {\n    return val;\n  }\n\n  delete() { }\n}\n\n/*\n * TOKEN STORE DEFINITION\n */\n\nlet tokenStore = {}\n\nconst createTokenStore = () => {\n  // The underlying token store, with tokens stored in cookies and the token names as computed values\n  tokenStore = {\n    accessToken: new TokenCookieStoredValue(\"access\"),\n    idToken: new TokenCookieStoredValue(\"id\"),\n    refreshToken: new TokenCookieStoredValue(\"refresh\"),\n    accessTokenName: new ComputedValue(getTokenCookieName(\"access\")),\n    idTokenName: new ComputedValue(getTokenCookieName(\"id\")),\n    refreshTokenName: new ComputedValue(getTokenCookieName(\"refresh\"))\n  }\n\n  /**\n   * Create store.tokens and add methods to it\n   * \n   * makeFriendlyStore() proxies operators to methods:\n   *   const x = store.tokens.accessToken -> tokenStore.accessToken.get()\n   *   store.tokens.accessToken = x -> tokenStore.accessToken.set(x)\n   *   delete store.tokens.accessToken -> tokenStore.accessToken.delete()\n   */\n  store.tokens = makeFriendlyStore(tokenStore);\n  store.tokens.refresh = refresh;\n}\n\ncreateTokenStore();\n\n/*\n * USER STORE IMPLEMENTATION\n * Interact with user data, backed by token store (which is backed by cookies)\n */\n\n/**\n * Interface for a read-only value derived from a token's TokenCookieStoredValue\n * @implements {GetSetValue}\n */\nexport class ReadonlyTokenDerivedValue {\n  constructor(tokenValue, valueKey) {\n    this.tokenValue = tokenValue;\n    this.valueKey = valueKey;\n  }\n\n  get() {\n    if (!this.tokenValue) {\n      console.error(`@userfront/core ReadonlyTokenDerivedValue: Tried to get value ${this.valueKey} from a token, but the token is empty.`);\n      return;\n    }\n    if (!this.tokenValue.get) {\n      console.error(`@userfront/core ReadonlyTokenDerivedValue: Tried to get value ${this.valueKey} from a token, but the token lacks a get() method. (Be sure to initialize this with an underlying get-set stored value, not its \"friendly\" proxied store.)`);\n    }\n    const token = this.tokenValue.get();\n    if (!token) {\n      return undefined;\n    }\n    const idTokenPayload = getJwtPayload(token);\n    return idTokenPayload[this.valueKey];\n  }\n\n  set(val) {\n    console.warn(`@userfront/core ReadonlyTokenDerivedValue: Tried to set readonly property ${this.valueKey} of a token.`)\n    return val;\n  }\n\n  delete() {\n    console.warn(`@userfront/core ReadonlyTokenDerivedValue: Tried to delete readonly property ${this.valueKey} of a token.`)\n  }\n}\n\n/*\n * USER STORE DEFINITION\n */\n\nconst createUserStore = () => {\n  // The underlying user store, with fields computed from the id token at time of access\n  const userStore = {}\n  const userProps = [\n    \"email\",\n    \"phoneNumber\",\n    \"username\",\n    \"name\",\n    \"image\",\n    \"data\",\n    \"confirmedAt\",\n    \"createdAt\",\n    \"updatedAt\",\n    \"mode\",\n    \"userId\",\n    \"userUuid\",\n    \"tenantId\",\n    \"isConfirmed\",\n  ];\n  for (const prop of userProps) {\n    userStore[prop] = new ReadonlyTokenDerivedValue(tokenStore.idToken, prop)\n  }\n\n  /**\n   * Create store.user and add methods to it\n   * \n   * makeFriendlyStore() proxies operators to methods:\n   *   const x = store.user.email -> userStore.email.get()\n   *   store.user.email = x -> userStore.email.set(x)\n   *   delete store.user.email -> userStore.email.delete()\n   */\n  store.user = makeFriendlyStore(userStore);\n  store.user.update = update;\n  store.user.hasRole = hasRole;\n  store.user.updatePassword = updatePassword;\n  store.user.getTotp = getTotp;\n}\n\ncreateUserStore();\n\n/**\n * Reset the token and user stores by creating new store objects for them\n * and assigning them to store.tokens and store.user.\n * \n * Intended for testing use only.\n */\nexport const _resetStore = () => {\n  createTokenStore();\n  createUserStore();\n}\n\nexport { store };\n","import { store } from \"./store.js\";\nimport { getQueryAttr } from \"./url.js\";\n\nexport function getProviderLink({ provider, redirect }) {\n  if (!provider) throw new Error(\"Missing provider\");\n  if (!store.tenantId) throw new Error(\"Missing tenantId\");\n\n  let url = `${store.baseUrl}auth/${provider}/login?tenant_id=${store.tenantId}&origin=${window.location.origin}`;\n\n  let redirectTo = redirect || getQueryAttr(\"redirect\");\n  if (redirect === false) {\n    redirectTo = typeof document === \"object\" && document.location.pathname;\n  }\n  if (redirectTo) {\n    url += `&redirect=${encodeURIComponent(redirectTo)}`;\n  }\n\n  return url;\n}\n\n/**\n * Log in or register a user via SSO provider.\n * Redirect the browser after successful authentication and 302 redirect from server.\n * @param {String} provider Name of SSO provider\n * @param {String} redirect - do not redirect if false, or redirect to given path\n */\nexport function signonWithSso({ provider, redirect }) {\n  if (!provider) throw new Error(\"Missing provider\");\n  const url = getProviderLink({ provider, redirect });\n  window.location.assign(url);\n}\n","import { post, put } from \"./api.js\";\nimport { setCookiesAndTokens } from \"./cookies.js\";\nimport { store } from \"./store.js\";\nimport { getQueryAttr, handleRedirect } from \"./url.js\";\nimport { exchange } from \"./refresh.js\";\nimport { throwFormattedError } from \"./utils.js\";\nimport {\n  getMfaHeaders,\n  handleMfaRequired,\n  clearMfa,\n} from \"./authentication.js\";\nimport { getPkceRequestQueryParams, redirectWithPkce } from \"./pkce.js\";\n\n/**\n * Log a user in with a token/uuid combo passed into the function or\n * in the URL querystring. ?token=...&uuid=...\n * @param {String} token\n * @param {UUID} uuid\n * @param {String} redirect - do not redirect if false, or redirect to given path\n */\nexport async function loginWithLink({ token, uuid, redirect } = {}) {\n  try {\n    token = token || getQueryAttr(\"token\");\n    uuid = uuid || getQueryAttr(\"uuid\");\n    if (!token || !uuid) return;\n\n    const { data } = await put(\n      \"/auth/link\",\n      {\n        token,\n        uuid,\n        tenantId: store.tenantId,\n      },\n      {\n        headers: getMfaHeaders(),\n        params: getPkceRequestQueryParams()\n      }\n    );\n\n    if (data.hasOwnProperty(\"tokens\")) {\n      clearMfa();\n      setCookiesAndTokens(data.tokens);\n      await exchange(data);\n      handleRedirect({ redirect, data });\n      return data;\n    }\n\n    if (data.hasOwnProperty(\"firstFactorToken\")) {\n      handleMfaRequired(data);\n      return data;\n    }\n\n    if (data.authorizationCode) {\n      const url = redirect || data.redirectTo;\n      if (url) {\n        redirectWithPkce(url, data.authorizationCode);\n        return;\n      } else {\n        // We can't exchange the authorizationCode for tokens, because we don't have the verifier code\n        // that matches our challenge code.\n        throw new Error(\"Received a PKCE (mobile auth) response from the server, but no redirect was provided. Please set the redirect to the app that initiated the request.\")\n      }\n    }\n\n    throw new Error(\"Problem logging in.\");\n  } catch (error) {\n    throwFormattedError(error);\n  }\n}\n\n/**\n * Send a login link to the provided email.\n * @param {String} email\n */\nexport async function sendLoginLink(email) {\n  try {\n    const { data } = await post(`/auth/link`, {\n      email,\n      tenantId: store.tenantId,\n    });\n    return data;\n  } catch (error) {\n    throwFormattedError(error);\n  }\n}\n\n/**\n * Create or update a user and send them a link to log in.\n * @param {Object} inputs\n */\nexport async function sendPasswordlessLink({\n  email,\n  name,\n  username,\n  userData,\n  options,\n}) {\n  try {\n    const { data } = await post(`/auth/link`, {\n      email,\n      name,\n      username,\n      data: userData,\n      options,\n      tenantId: store.tenantId,\n    });\n    return data;\n  } catch (error) {\n    throwFormattedError(error);\n  }\n}\n","import { post, put } from \"./api.js\";\nimport { setCookiesAndTokens } from \"./cookies.js\";\nimport { store } from \"./store.js\";\nimport { handleRedirect } from \"./url.js\";\nimport { exchange } from \"./refresh.js\";\nimport { throwFormattedError } from \"./utils.js\";\nimport {\n  getMfaHeaders,\n  handleMfaRequired,\n  clearMfa,\n} from \"./authentication.js\";\nimport { getPkceRequestQueryParams, redirectWithPkce } from \"./pkce.js\";\n\n/**\n * Verify that proper identifier is available for the channel\n * @property {String} channel \"sms\" or \"email\"\n * @property {String} phoneNumber\n * @property {String} email\n */\nfunction enforceChannel({ channel, phoneNumber, email }) {\n  if (channel !== \"sms\" && channel !== \"email\") {\n    throw new Error(\"Invalid channel\");\n  }\n  if (channel === \"sms\" && !phoneNumber) {\n    throw new Error(`SMS verification code requires \"phoneNumber\"`);\n  } else if (channel === \"email\" && !email) {\n    throw new Error(`Email verification code requires \"email\"`);\n  }\n}\n\n/**\n * Send a verification code to the provided email address or phone number.\n * @property {String} channel \"sms\" (default) or \"email\"\n * @property {String} phoneNumber\n * @property {String} email\n * @property {String} name\n * @property {String} username\n * @property {Object} data\n */\nexport async function sendVerificationCode({\n  channel = \"sms\",\n  phoneNumber,\n  email,\n  name,\n  username,\n  data,\n}) {\n  try {\n    enforceChannel({\n      channel,\n      phoneNumber,\n      email,\n    });\n\n    const { data: res } = await post(`/auth/code`, {\n      channel,\n      email,\n      phoneNumber,\n      name,\n      username,\n      data,\n      tenantId: store.tenantId,\n    }, {\n      headers: getMfaHeaders()\n    });\n    return res;\n  } catch (error) {\n    throwFormattedError(error);\n  }\n}\n\n/**\n * Log a user in with a token/uuid combo passed into the function or\n * in the URL querystring. ?token=...&uuid=...\n * @param {String} token\n * @param {UUID} uuid\n * @param {String} redirect - do not redirect if false, or redirect to given path\n */\nexport async function loginWithVerificationCode({\n  channel,\n  verificationCode,\n  email,\n  phoneNumber,\n  redirect,\n} = {}) {\n  try {\n    enforceChannel({\n      channel,\n      phoneNumber,\n      email,\n    });\n\n    const { data } = await put(\n      `/auth/code`,\n      {\n        channel,\n        verificationCode,\n        email,\n        phoneNumber,\n        tenantId: store.tenantId,\n      },\n      {\n        headers: getMfaHeaders(),\n        params: getPkceRequestQueryParams(),\n      }\n    );\n\n    if (data.hasOwnProperty(\"tokens\")) {\n      clearMfa();\n      setCookiesAndTokens(data.tokens);\n      await exchange(data);\n      handleRedirect({ redirect, data });\n      return data;\n    }\n\n    if (data.hasOwnProperty(\"firstFactorToken\")) {\n      handleMfaRequired(data);\n      return data;\n    }\n\n    if (data.authorizationCode) {\n      const url = redirect || data.redirectTo;\n      if (url) {\n        redirectWithPkce(url, data.authorizationCode);\n        return;\n      } else {\n        // We can't exchange the authorizationCode for tokens, because we don't have the verifier code\n        // that matches our challenge code.\n        throw new Error(\"Received a PKCE (mobile auth) response from the server, but no redirect was provided. Please set the redirect to the app that initiated the request.\")\n      }\n    }\n\n    throw new Error(\"Problem logging in.\");\n  } catch (error) {\n    throwFormattedError(error);\n  }\n}\n","export const apiUrl = `https://api.userfront.com/v0/`;\n\nexport const privateIPRegex =\n  /((^127\\.)|(^10\\.)|(^172\\.1[6-9]\\.)|(^172\\.2[0-9]\\.)|(^172\\.3[0-1]\\.)|(^192\\.168\\.))\\d{1,3}\\.\\d{1,3}/g;\n","import { get } from \"./api.js\";\nimport { privateIPRegex } from \"./constants.js\";\nimport { store } from \"./store.js\";\nimport { setFirstFactors } from \"./authentication.js\";\n\n/**\n * Global mode object\n */\nexport const mode = {\n  value: \"live\",\n  reason: undefined,\n  setMode,\n};\n\nsetModeSync();\n\n/**\n * Determine whether a hostname is in test mode.\n * @param {String} hn\n */\nexport function isTestHostname(hn) {\n  try {\n    const hostname = hn || window.location.hostname;\n    return !!(hostname.match(/localhost/g) || hostname.match(privateIPRegex));\n  } catch (err) {\n    return true;\n  }\n}\n\nexport function isHttps() {\n  try {\n    return window.location.protocol === \"https:\";\n  } catch (error) {\n    return false;\n  }\n}\n\n/**\n * Define the mode of operation (live or test)\n * and the tenant's authentication factors\n */\nexport async function setMode() {\n  try {\n    const { data } = await get(`/tenants/${store.tenantId}/mode`);\n    mode.value = data.mode || \"test\";\n    mode.reason = getReason(mode.value);\n    store.mode = mode.value;\n    setFirstFactors(data.authentication);\n    return data;\n  } catch (err) {\n    mode.value = \"test\";\n    store.mode = mode.value;\n  }\n}\n\n/**\n * Estimate the mode without making an API call\n */\nexport function setModeSync() {\n  const modeValue = isTestHostname() || !isHttps() ? \"test\" : \"live\";\n  mode.value = modeValue;\n  mode.reason = getReason(modeValue);\n  store.mode = modeValue;\n}\n\n/**\n * Set the reason for the mode\n * - http\n * - domain\n */\nfunction getReason(mode) {\n  try {\n    if (mode === \"live\") {\n      return \"domain\";\n    }\n    if (window.location.protocol === \"http:\") {\n      return \"http\";\n    } else if (window.location.protocol !== \"https:\") {\n      return \"protocol\";\n    } else {\n      return \"domain\";\n    }\n  } catch (error) {}\n}\n","import axios from \"axios\";\nimport { store } from \"./store.js\";\nimport {\n  accessToken,\n  idToken,\n} from \"./tokens\";\nimport { getSession } from \"./session\";\nimport { redirectIfLoggedIn, redirectIfLoggedOut } from \"./url.js\";\nimport { signup } from \"./signup.js\";\nimport { login } from \"./login.js\";\nimport { updatePassword, resetPassword, sendResetLink } from \"./password.js\";\nimport { sendLoginLink } from \"./link.js\";\nimport { sendVerificationCode } from \"./verificationCode\";\nimport { logout } from \"./logout.js\";\nimport { mode, setMode, setModeSync } from \"./mode.js\";\n// import { setIframe } from \"./iframe.js\";\nimport { refresh } from \"./refresh.js\";\nimport { apiUrl } from \"./constants.js\";\nimport { resetMfa } from \"./authentication.js\";\n\nlet initCallbacks = [];\n\n/**\n * Initialize the Userfront library.\n * @param {String} tenantId\n */\nfunction init(tenantId, opts = {}) {\n  if (!tenantId) return console.warn(\"Userfront initialized without tenantId\");\n\n  store.tenantId = tenantId;\n\n  store.baseUrl = opts.baseUrl || apiUrl;\n  if (!store.baseUrl.endsWith(\"/\")) {\n    store.baseUrl += \"/\";\n  }\n\n  if (opts.domain) {\n    store.domain = opts.domain;\n    const url = `https://${store.domain}`;\n    axios.defaults.headers.common[\"x-application-id\"] = url;\n    axios.defaults.headers.common[\"x-origin\"] = url;\n  }\n\n  // Estimate the mode synchronously with local data.\n  // Clients that require the true mode or the default\n  // authenticationData should call and await setMode.\n  setModeSync();\n\n  resetMfa();\n\n  try {\n    if (initCallbacks.length > 0) {\n      initCallbacks.forEach((cb) => {\n        if (!cb || typeof cb !== \"function\") return;\n        cb({ tenantId });\n      });\n    }\n    initCallbacks = [];\n  } catch (error) {}\n}\n\n/**\n * Add a callback function to be called upon Userfront.init()\n * @param {Function} cb\n */\nfunction addInitCallback(cb) {\n  if (!cb || typeof cb !== \"function\") return;\n  initCallbacks.push(cb);\n}\n\n/**\n\n * Register a window-level event called \"urlchanged\" that will fire\n * whenever the browser URL changes.\n */\nlet isRegistered = false;\nfunction registerUrlChangedEventListener() {\n  if (isRegistered) return;\n  isRegistered = true;\n  try {\n    history.pushState = ((f) =>\n      function pushState() {\n        var ret = f.apply(this, arguments);\n        window.dispatchEvent(new Event(\"pushstate\"));\n        window.dispatchEvent(new Event(\"urlchanged\"));\n        return ret;\n      })(history.pushState);\n\n    history.replaceState = ((f) =>\n      function replaceState() {\n        var ret = f.apply(this, arguments);\n        window.dispatchEvent(new Event(\"replacestate\"));\n        window.dispatchEvent(new Event(\"urlchanged\"));\n        return ret;\n      })(history.replaceState);\n\n    window.addEventListener(\"popstate\", () => {\n      window.dispatchEvent(new Event(\"urlchanged\"));\n    });\n  } catch (error) {}\n}\n\n/**\n * EXPORTS\n */\n\nexport default {\n  // index\n  addInitCallback,\n  init,\n  registerUrlChangedEventListener,\n\n  //logout\n  logout,\n\n  // mode\n  mode,\n  setMode,\n\n  // refresh\n  refresh: (a, b, c) => {\n    try {\n      console.warn(\n        \"Userfront.refresh() is deprecated and will be removed. Please use Userfront.tokens.refresh() instead.\"\n      );\n    } catch (error) {}\n    return refresh(a, b, c);\n  },\n\n  // signon\n  login,\n  resetPassword,\n  updatePassword,\n  sendLoginLink,\n  sendResetLink,\n  sendVerificationCode,\n  signup,\n\n  // store\n  store,\n\n  // tokens\n  tokens: store.tokens,\n  accessToken,\n  idToken,\n\n  // session\n  getSession,\n\n  // url\n  redirectIfLoggedIn,\n  redirectIfLoggedOut,\n\n  // user\n  user: store.user,\n\n  // utils\n};\n","import { get } from \"./api.js\";\nimport { store } from \"./store.js\";\nimport { removeAllCookies } from \"./cookies.js\";\nimport { handleRedirect } from \"./url\";\nimport { throwFormattedError } from \"./utils.js\";\n\n/**\n * Log a user out and redirect to the logout path.\n */\nexport async function logout({ method, redirect } = {}) {\n  if (method === \"saml\") {\n    return completeSamlLogout();\n  }\n  if (!store.tokens.accessToken) {\n    return removeAllCookies();\n  }\n\n  try {\n    const { data } = await get(`/auth/logout`, {\n      headers: {\n        authorization: `Bearer ${store.tokens.accessToken}`,\n      },\n    });\n    removeAllCookies();\n    handleRedirect({ redirect, data });\n  } catch (err) {\n    removeAllCookies();\n  }\n}\n\nasync function completeSamlLogout() {\n  if (!store.tokens.accessToken) {\n    throw new Error(\"Please log in to authorize your logout request.\");\n  }\n\n  try {\n    const { data } = await get(`/auth/saml/idp/token`, {\n      headers: {\n        authorization: `Bearer ${store.tokens.accessToken}`,\n      },\n    });\n\n    window.location.assign(\n      `${store.baseUrl}auth/saml/idp/logout?tenant_id=${store.tenantId}&token=${data.token}&uuid=${store.user.userUuid}`\n    );\n  } catch (error) {\n    throwFormattedError(error);\n  }\n}\n","import { loginWithPassword } from \"./password.js\";\nimport { loginWithPasswordMigrate } from \"./password.migrate.js\";\nimport { loginWithLink, sendPasswordlessLink } from \"./link.js\";\nimport { signonWithSso } from \"./sso.js\";\nimport { loginWithTotp } from \"./totp.js\";\nimport { loginWithVerificationCode } from \"./verificationCode.js\";\nimport { completeSamlLogin } from \"./saml.js\";\nimport { setupPkce } from \"./pkce.js\";\n\n/**\n * Log a user in via the provided method. This method serves to call other\n * methods, depending on the \"method\" parameter passed in.\n * @param {String} method\n * @param {Number} userId\n * @param {String} userUuid\n * @param {String} email\n * @param {String} username\n * @param {String} emailOrUsername\n * @param {String} phoneNumber\n * @param {String} password\n * @param {String} token\n * @param {String} uuid\n * @param {String} totpCode\n * @param {String} backupCode\n * @param {String} channel \"sms\" or \"email\"\n * @param {String} verificationCode\n * @param {String | Boolean} redirect - do not redirect if false, or redirect to given path\n * @param {Function} handleUpstreamResponse\n */\nexport async function login({\n  method,\n  // User identifiers\n  userId,\n  userUuid,\n  email,\n  username,\n  emailOrUsername,\n  phoneNumber,\n  // Password\n  password,\n  // Link\n  token,\n  uuid,\n  // Totp\n  totpCode,\n  backupCode,\n  // Verification code\n  channel,\n  verificationCode,\n  // Other\n  redirect,\n  handleUpstreamResponse,\n  options,\n} = {}) {\n  if (!method) {\n    throw new Error('Userfront.login called without \"method\" property.');\n  }\n  setupPkce();\n  switch (method) {\n    case \"apple\":\n    case \"azure\":\n    case \"facebook\":\n    case \"github\":\n    case \"google\":\n    case \"linkedin\":\n      return signonWithSso({ provider: method, redirect });\n    case \"password\":\n      return loginWithPassword({\n        email,\n        username,\n        emailOrUsername,\n        password,\n        redirect,\n        options,\n      });\n    case \"password-migrate\":\n      return loginWithPasswordMigrate({\n        email,\n        username,\n        emailOrUsername,\n        password,\n        redirect,\n        handleUpstreamResponse,\n        options,\n      });\n    case \"passwordless\":\n      return sendPasswordlessLink({ email });\n    case \"link\":\n      return loginWithLink({ token, uuid, redirect });\n    case \"totp\":\n      return loginWithTotp({\n        totpCode,\n        backupCode,\n        userId,\n        userUuid,\n        emailOrUsername,\n        email,\n        username,\n        phoneNumber,\n        redirect,\n      });\n    case \"verificationCode\":\n      return loginWithVerificationCode({\n        channel,\n        email,\n        phoneNumber,\n        verificationCode,\n        redirect,\n      });\n    case \"saml\":\n      return completeSamlLogin();\n    default:\n      throw new Error('Userfront.login called with invalid \"method\" property.');\n  }\n}\n","import { post } from \"./api.js\";\nimport { setCookiesAndTokens } from \"./cookies.js\";\nimport { store } from \"./store.js\";\nimport { handleRedirect } from \"./url.js\";\nimport { throwFormattedError } from \"./utils.js\";\nimport { exchange } from \"./refresh.js\";\nimport { getMfaHeaders, handleMfaRequired } from \"./authentication.js\";\nimport { getPkceRequestQueryParams, redirectWithPkce } from \"./pkce.js\";\n\n/**\n * Log a user in with email/username and password using the password/migrate endpoint.\n * Redirect the browser after successful login based on the redirectTo value returned.\n * @param {Object} params\n * @param {string} params.email The user's email. One of email/username/emailOrUsername should be present.\n * @param {string} params.username The user's username. One of email/username/emailOrUsername should be present.\n * @param {string} params.emailOrUsername Either the user's email or username. One of email/username/emailOrUsername should be present.\n * @param {string} params.password\n * @param {string | boolean} params.redirect\n *  URL to redirect to after login, or false to suppress redirect. Otherwise, redirects to the after-login path set on the server.\n * @param {function} params.handleUpstreamResponse Function to run after receiving response, but before redirection\n * @param {object} params.options\n * @param {boolean} params.options.noResetEmail\n *  By default, Userfront sends a password reset email if a user without a password tries to log in with a password.\n *  Set options.noResetEmail = true to override this behavior and return an error instead.\n *\n */\nexport async function loginWithPasswordMigrate({\n  email,\n  username,\n  emailOrUsername,\n  password,\n  redirect,\n  handleUpstreamResponse,\n  options,\n}) {\n  try {\n    const body = {\n      tenantId: store.tenantId,\n      emailOrUsername: email || username || emailOrUsername,\n      password,\n    };\n    if (options && options.noResetEmail) {\n      body.options = {\n        noResetEmail: true,\n      };\n    }\n\n    // Make the request to password/migrate\n    const { data } = await post(`/auth/password/migrate`, body, {\n      headers: getMfaHeaders(),\n      params: getPkceRequestQueryParams(),\n    });\n\n    if (typeof handleUpstreamResponse === \"function\") {\n      await handleUpstreamResponse(data.upstreamResponse);\n    }\n\n    if (data.hasOwnProperty(\"tokens\")) {\n      setCookiesAndTokens(data.tokens);\n      await exchange(data);\n      handleRedirect({ redirect, data });\n      return data;\n    }\n\n    if (data.authorizationCode) {\n      const url = redirect || data.redirectTo;\n      if (url) {\n        redirectWithPkce(url, data.authorizationCode);\n        return;\n      } else {\n        // TODO this is neither valid nor invalid\n      }\n    }\n\n    throw new Error(\"Please try again.\");\n  } catch (error) {\n    throwFormattedError(error);\n  }\n}\n","import { get } from \"./api.js\";\nimport { store } from \"./store.js\";\nimport { throwFormattedError } from \"./utils.js\";\n\nexport async function completeSamlLogin() {\n  try {\n    if (!store.tokens.accessToken) {\n      return console.warn(\"Cannot complete SAML login without access token\");\n    }\n\n    const { data } = await get(`/auth/saml/idp/token`, {\n      headers: {\n        authorization: `Bearer ${store.tokens.accessToken}`,\n      },\n    });\n\n    window.location.assign(\n      `${store.baseUrl}auth/saml/idp/login?tenant_id=${store.tenantId}&token=${data.token}&uuid=${store.user.userUuid}`\n    );\n  } catch (error) {\n    throwFormattedError(error);\n  }\n}\n","import { signupWithPassword } from \"./password.js\";\nimport { signonWithSso } from \"./sso.js\";\nimport { sendPasswordlessLink } from \"./link.js\";\nimport { sendVerificationCode } from \"./verificationCode.js\";\nimport { setupPkce } from \"./pkce.js\";\n\n/**\n * Register a user via the provided method. This method serves to call other\n * methods, depending on the \"method\" parameter passed in.\n * @param {String} method\n * @param {String} email\n * @param {String} username\n * @param {String} phoneNumber\n * @param {String} name\n * @param {Object} data - Object for custom user fields\n * @param {String} password\n * @param {String} channel \"sms\" or \"email\"\n * @param {String} redirect - do not redirect if false, or redirect to given path\n */\nexport async function signup({\n  method,\n  email,\n  username,\n  phoneNumber,\n  name,\n  data,\n  password,\n  channel,\n  redirect,\n} = {}) {\n  setupPkce();\n  if (!method) {\n    throw new Error('Userfront.signup called without \"method\" property.');\n  }\n  switch (method) {\n    case \"apple\":\n    case \"azure\":\n    case \"facebook\":\n    case \"github\":\n    case \"google\":\n    case \"linkedin\":\n      return signonWithSso({ provider: method, redirect });\n    case \"password\":\n      return signupWithPassword({\n        username,\n        name,\n        email,\n        password,\n        userData: data,\n        redirect,\n      });\n    case \"passwordless\":\n      return sendPasswordlessLink({ email, name, username, userData: data });\n    case \"verificationCode\":\n      return sendVerificationCode({\n        channel,\n        email,\n        phoneNumber,\n        name,\n        username,\n        data,\n      });\n    default:\n      throw new Error(\n        'Userfront.signup called with invalid \"method\" property.'\n      );\n  }\n}\n"],"names":["bind","fn","thisArg","args","Array","arguments","length","i","apply","toString","Object","prototype","isArray","val","call","isUndefined","isObject","isPlainObject","getPrototypeOf","isFunction","forEach","obj","l","key","hasOwnProperty","utils","isArrayBuffer","isBuffer","constructor","isFormData","FormData","isArrayBufferView","ArrayBuffer","isView","buffer","isString","isNumber","isDate","isFile","isBlob","isStream","pipe","isURLSearchParams","URLSearchParams","isStandardBrowserEnv","navigator","product","window","document","merge","result","assignValue","slice","extend","a","b","trim","str","replace","stripBOM","content","charCodeAt","encode","encodeURIComponent","buildURL","url","params","paramsSerializer","serializedParams","parts","v","toISOString","JSON","stringify","push","join","hashmarkIndex","indexOf","InterceptorManager","this","handlers","use","fulfilled","rejected","options","synchronous","runWhen","eject","id","h","InterceptorManager_1","normalizeHeaderName","headers","normalizedName","value","name","toUpperCase","enhanceError","error","config","code","request","response","isAxiosError","toJSON","message","description","number","fileName","lineNumber","columnNumber","stack","createError","Error","cookies","write","expires","path","domain","secure","cookie","Date","toGMTString","read","match","RegExp","decodeURIComponent","remove","now","ignoreDuplicateOf","isURLSameOrigin","originURL","msie","test","userAgent","urlParsingNode","createElement","resolveURL","href","setAttribute","protocol","host","search","hash","hostname","port","pathname","charAt","location","requestURL","parsed","DEFAULT_CONTENT_TYPE","setContentTypeIfUnset","adapter","defaults","transitional","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","XMLHttpRequest","process","Promise","resolve","reject","requestData","data","requestHeaders","responseType","auth","username","password","unescape","Authorization","btoa","baseURL","requestedURL","fullPath","relativeURL","combineURLs","onloadend","responseHeaders","getAllResponseHeaders","split","line","substr","toLowerCase","concat","validateStatus","status","settle","responseText","statusText","open","method","timeout","onreadystatechange","readyState","responseURL","setTimeout","onabort","onerror","ontimeout","timeoutErrorMessage","xsrfValue","withCredentials","xsrfCookieName","undefined","xsrfHeaderName","setRequestHeader","onDownloadProgress","addEventListener","onUploadProgress","upload","cancelToken","promise","then","cancel","abort","send","transformRequest","rawValue","parser","encoder","parse","e","stringifySafely","transformResponse","strictJSONParsing","maxContentLength","maxBodyLength","common","Accept","defaults_1","transformData","fns","context","isCancel","__CANCEL__","throwIfCancellationRequested","throwIfRequested","dispatchRequest","reason","mergeConfig","config1","config2","valueFromConfig2Keys","mergeDeepPropertiesKeys","defaultToConfig2Keys","directMergeKeys","getMergedValue","target","source","mergeDeepProperties","prop","axiosKeys","otherKeys","keys","filter","validators","type","thing","deprecatedWarnings","currentVerArr","pkg","version","isOlderVersion","thanVersion","pkgVersionArr","destVer","validator","isDeprecated","formatMessage","opt","desc","opts","console","warn","assertOptions","schema","allowUnknown","TypeError","Axios","instanceConfig","interceptors","boolean","requestInterceptorChain","synchronousRequestInterceptors","interceptor","unshift","responseInterceptorChain","chain","shift","newConfig","onFulfilled","onRejected","getUri","Axios_1","Cancel","Cancel_1","CancelToken","executor","resolvePromise","token","c","CancelToken_1","createInstance","defaultConfig","instance","axios","create","require$$0","require$$1","require$$2","all","promises","spread","callback","arr","payload","axios_1","factory","attributes","decode","s","init","converter","api","set","toUTCString","String","escape","stringifiedAttributes","attributeName","get","json","jar","getJSON","withConverter","module","exports","removeCookie","paths","domains","primaryDomain","err","map","Cookies","removeAllCookies","store","tokens","accessTokenName","idTokenName","refreshTokenName","setCookiesAndTokens","setCookieOptionsByTokenType","access","cookieOptions","accessToken","idToken","refresh","refreshToken","getJwtPayload","encodedPayload","atob","isJwtLocallyValid","exp","throwFormattedError","_error$response","_error$response$data","reduceSlashes","baseUrl","async","post","put","authorization","basicRefresh","exchange","update","user","hasRole","roleName","tenantId","roles","isAccessTokenLocallyValid","authenticationData","firstFactors","secondFactors","firstFactorToken","handleMfaRequired","isMfaRequired","authentication","clearMfa","getMfaHeaders","getIsLoggedIn","getSession","isLoggedIn","needsSecondFactor","resetMfaState","codeChallenge","usePkce","clearPkceDataFromLocalStorage","isBrowser","localStorage","removeItem","setupPkce","getQueryAttr","codeChallengeFromQueryParams","writePkceDataToLocalStorage","setItem","expiresAt","codeChallengeFromLocalStorage","getItem","parseInt","readPkceDataFromLocalStorage","getPkceRequestQueryParams","code_challenge","redirectWithPkce","authorizationCode","_url","searchParams","assign","attrName","handleRedirect","redirect","redirectToPath","redirectTo","pathOrUrl","el","updatePassword","existingPassword","uuid","updatePasswordWithLink","updatePasswordWithJwt","resetPassword","Reflect","deleteProperty","delete","getOwnPropertyDescriptor","configurable","enumerable","ownKeys","proxyConfig","mode","getTokenCookieName","defaultCookieOptions","freeze","sameSite","defaultRefreshTokenCookieOptions","tokenType","setCookieOptionsByName","cookieName","TokenCookieStoredValue","_useMemory","debug","_val","_getName","getCookieOptionsByName","defaultOptions","defaultCookieOptionsByTokenType","storedOptions","ComputedValue","compute","tokenStore","makeFriendlyStore","ReadonlyTokenDerivedValue","tokenValue","valueKey","signonWithSso","provider","getProviderLink","origin","email","userData","enforceChannel","channel","phoneNumber","res","userStore","userProps","getTotp","createUserStore","privateIPRegex","setMode","getReason","setFirstFactors","setModeSync","modeValue","hn","isTestHostname","isHttps","initCallbacks","isRegistered","index","addInitCallback","cb","endsWith","registerUrlChangedEventListener","history","pushState","f","ret","dispatchEvent","Event","replaceState","logout","userUuid","login","userId","emailOrUsername","totpCode","backupCode","verificationCode","handleUpstreamResponse","noResetEmail","body","loginWithPassword","upstreamResponse","loginWithPasswordMigrate","sendPasswordlessLink","loginWithLink","loginWithTotp","loginWithVerificationCode","completeSamlLogin","sendLoginLink","sendResetLink","sendVerificationCode","signup","signupWithPassword","redirectIfLoggedIn","pkceStore","tenant","loginRedirectPath","redirectIfLoggedOut"],"mappings":"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"}