| 'use strict'; |
|
|
| import bind from './helpers/bind.js'; |
|
|
| |
|
|
| const {toString} = Object.prototype; |
| const {getPrototypeOf} = Object; |
|
|
| const kindOf = (cache => thing => { |
| const str = toString.call(thing); |
| return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase()); |
| })(Object.create(null)); |
|
|
| const kindOfTest = (type) => { |
| type = type.toLowerCase(); |
| return (thing) => kindOf(thing) === type |
| } |
|
|
| const typeOfTest = type => thing => typeof thing === type; |
|
|
| |
| |
| |
| |
| |
| |
| |
| const {isArray} = Array; |
|
|
| |
| |
| |
| |
| |
| |
| |
| const isUndefined = typeOfTest('undefined'); |
|
|
| |
| |
| |
| |
| |
| |
| |
| function isBuffer(val) { |
| return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) |
| && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| const isArrayBuffer = kindOfTest('ArrayBuffer'); |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| function isArrayBufferView(val) { |
| let result; |
| if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { |
| result = ArrayBuffer.isView(val); |
| } else { |
| result = (val) && (val.buffer) && (isArrayBuffer(val.buffer)); |
| } |
| return result; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| const isString = typeOfTest('string'); |
|
|
| |
| |
| |
| |
| |
| |
| const isFunction = typeOfTest('function'); |
|
|
| |
| |
| |
| |
| |
| |
| |
| const isNumber = typeOfTest('number'); |
|
|
| |
| |
| |
| |
| |
| |
| |
| const isObject = (thing) => thing !== null && typeof thing === 'object'; |
|
|
| |
| |
| |
| |
| |
| |
| const isBoolean = thing => thing === true || thing === false; |
|
|
| |
| |
| |
| |
| |
| |
| |
| const isPlainObject = (val) => { |
| if (kindOf(val) !== 'object') { |
| return false; |
| } |
|
|
| const prototype = getPrototypeOf(val); |
| return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| const isDate = kindOfTest('Date'); |
|
|
| |
| |
| |
| |
| |
| |
| |
| const isFile = kindOfTest('File'); |
|
|
| |
| |
| |
| |
| |
| |
| |
| const isBlob = kindOfTest('Blob'); |
|
|
| |
| |
| |
| |
| |
| |
| |
| const isFileList = kindOfTest('FileList'); |
|
|
| |
| |
| |
| |
| |
| |
| |
| const isStream = (val) => isObject(val) && isFunction(val.pipe); |
|
|
| |
| |
| |
| |
| |
| |
| |
| const isFormData = (thing) => { |
| let kind; |
| return thing && ( |
| (typeof FormData === 'function' && thing instanceof FormData) || ( |
| isFunction(thing.append) && ( |
| (kind = kindOf(thing)) === 'formdata' || |
| |
| (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]') |
| ) |
| ) |
| ) |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| const isURLSearchParams = kindOfTest('URLSearchParams'); |
|
|
| const [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest); |
|
|
| |
| |
| |
| |
| |
| |
| |
| const trim = (str) => str.trim ? |
| str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function forEach(obj, fn, {allOwnKeys = false} = {}) { |
| |
| if (obj === null || typeof obj === 'undefined') { |
| return; |
| } |
|
|
| let i; |
| let l; |
|
|
| |
| if (typeof obj !== 'object') { |
| |
| obj = [obj]; |
| } |
|
|
| if (isArray(obj)) { |
| |
| for (i = 0, l = obj.length; i < l; i++) { |
| fn.call(null, obj[i], i, obj); |
| } |
| } else { |
| |
| const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj); |
| const len = keys.length; |
| let key; |
|
|
| for (i = 0; i < len; i++) { |
| key = keys[i]; |
| fn.call(null, obj[key], key, obj); |
| } |
| } |
| } |
|
|
| function findKey(obj, key) { |
| key = key.toLowerCase(); |
| const keys = Object.keys(obj); |
| let i = keys.length; |
| let _key; |
| while (i-- > 0) { |
| _key = keys[i]; |
| if (key === _key.toLowerCase()) { |
| return _key; |
| } |
| } |
| return null; |
| } |
|
|
| const _global = (() => { |
| |
| if (typeof globalThis !== "undefined") return globalThis; |
| return typeof self !== "undefined" ? self : (typeof window !== 'undefined' ? window : global) |
| })(); |
|
|
| const isContextDefined = (context) => !isUndefined(context) && context !== _global; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function merge() { |
| const {caseless} = isContextDefined(this) && this || {}; |
| const result = {}; |
| const assignValue = (val, key) => { |
| const targetKey = caseless && findKey(result, key) || key; |
| if (isPlainObject(result[targetKey]) && isPlainObject(val)) { |
| result[targetKey] = merge(result[targetKey], val); |
| } else if (isPlainObject(val)) { |
| result[targetKey] = merge({}, val); |
| } else if (isArray(val)) { |
| result[targetKey] = val.slice(); |
| } else { |
| result[targetKey] = val; |
| } |
| } |
|
|
| for (let i = 0, l = arguments.length; i < l; i++) { |
| arguments[i] && forEach(arguments[i], assignValue); |
| } |
| return result; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const extend = (a, b, thisArg, {allOwnKeys}= {}) => { |
| forEach(b, (val, key) => { |
| if (thisArg && isFunction(val)) { |
| a[key] = bind(val, thisArg); |
| } else { |
| a[key] = val; |
| } |
| }, {allOwnKeys}); |
| return a; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| const stripBOM = (content) => { |
| if (content.charCodeAt(0) === 0xFEFF) { |
| content = content.slice(1); |
| } |
| return content; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const inherits = (constructor, superConstructor, props, descriptors) => { |
| constructor.prototype = Object.create(superConstructor.prototype, descriptors); |
| constructor.prototype.constructor = constructor; |
| Object.defineProperty(constructor, 'super', { |
| value: superConstructor.prototype |
| }); |
| props && Object.assign(constructor.prototype, props); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const toFlatObject = (sourceObj, destObj, filter, propFilter) => { |
| let props; |
| let i; |
| let prop; |
| const merged = {}; |
|
|
| destObj = destObj || {}; |
| |
| if (sourceObj == null) return destObj; |
|
|
| do { |
| props = Object.getOwnPropertyNames(sourceObj); |
| i = props.length; |
| while (i-- > 0) { |
| prop = props[i]; |
| if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) { |
| destObj[prop] = sourceObj[prop]; |
| merged[prop] = true; |
| } |
| } |
| sourceObj = filter !== false && getPrototypeOf(sourceObj); |
| } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype); |
|
|
| return destObj; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const endsWith = (str, searchString, position) => { |
| str = String(str); |
| if (position === undefined || position > str.length) { |
| position = str.length; |
| } |
| position -= searchString.length; |
| const lastIndex = str.indexOf(searchString, position); |
| return lastIndex !== -1 && lastIndex === position; |
| } |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| const toArray = (thing) => { |
| if (!thing) return null; |
| if (isArray(thing)) return thing; |
| let i = thing.length; |
| if (!isNumber(i)) return null; |
| const arr = new Array(i); |
| while (i-- > 0) { |
| arr[i] = thing[i]; |
| } |
| return arr; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const isTypedArray = (TypedArray => { |
| |
| return thing => { |
| return TypedArray && thing instanceof TypedArray; |
| }; |
| })(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array)); |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| const forEachEntry = (obj, fn) => { |
| const generator = obj && obj[Symbol.iterator]; |
|
|
| const iterator = generator.call(obj); |
|
|
| let result; |
|
|
| while ((result = iterator.next()) && !result.done) { |
| const pair = result.value; |
| fn.call(obj, pair[0], pair[1]); |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| const matchAll = (regExp, str) => { |
| let matches; |
| const arr = []; |
|
|
| while ((matches = regExp.exec(str)) !== null) { |
| arr.push(matches); |
| } |
|
|
| return arr; |
| } |
|
|
| |
| const isHTMLForm = kindOfTest('HTMLFormElement'); |
|
|
| const toCamelCase = str => { |
| return str.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g, |
| function replacer(m, p1, p2) { |
| return p1.toUpperCase() + p2; |
| } |
| ); |
| }; |
|
|
| |
| const hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype); |
|
|
| |
| |
| |
| |
| |
| |
| |
| const isRegExp = kindOfTest('RegExp'); |
|
|
| const reduceDescriptors = (obj, reducer) => { |
| const descriptors = Object.getOwnPropertyDescriptors(obj); |
| const reducedDescriptors = {}; |
|
|
| forEach(descriptors, (descriptor, name) => { |
| let ret; |
| if ((ret = reducer(descriptor, name, obj)) !== false) { |
| reducedDescriptors[name] = ret || descriptor; |
| } |
| }); |
|
|
| Object.defineProperties(obj, reducedDescriptors); |
| } |
|
|
| |
| |
| |
| |
|
|
| const freezeMethods = (obj) => { |
| reduceDescriptors(obj, (descriptor, name) => { |
| |
| if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) { |
| return false; |
| } |
|
|
| const value = obj[name]; |
|
|
| if (!isFunction(value)) return; |
|
|
| descriptor.enumerable = false; |
|
|
| if ('writable' in descriptor) { |
| descriptor.writable = false; |
| return; |
| } |
|
|
| if (!descriptor.set) { |
| descriptor.set = () => { |
| throw Error('Can not rewrite read-only method \'' + name + '\''); |
| }; |
| } |
| }); |
| } |
|
|
| const toObjectSet = (arrayOrString, delimiter) => { |
| const obj = {}; |
|
|
| const define = (arr) => { |
| arr.forEach(value => { |
| obj[value] = true; |
| }); |
| } |
|
|
| isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter)); |
|
|
| return obj; |
| } |
|
|
| const noop = () => {} |
|
|
| const toFiniteNumber = (value, defaultValue) => { |
| return value != null && Number.isFinite(value = +value) ? value : defaultValue; |
| } |
|
|
| const ALPHA = 'abcdefghijklmnopqrstuvwxyz' |
|
|
| const DIGIT = '0123456789'; |
|
|
| const ALPHABET = { |
| DIGIT, |
| ALPHA, |
| ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT |
| } |
|
|
| const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => { |
| let str = ''; |
| const {length} = alphabet; |
| while (size--) { |
| str += alphabet[Math.random() * length|0] |
| } |
|
|
| return str; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| function isSpecCompliantForm(thing) { |
| return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]); |
| } |
|
|
| const toJSONObject = (obj) => { |
| const stack = new Array(10); |
|
|
| const visit = (source, i) => { |
|
|
| if (isObject(source)) { |
| if (stack.indexOf(source) >= 0) { |
| return; |
| } |
|
|
| if(!('toJSON' in source)) { |
| stack[i] = source; |
| const target = isArray(source) ? [] : {}; |
|
|
| forEach(source, (value, key) => { |
| const reducedValue = visit(value, i + 1); |
| !isUndefined(reducedValue) && (target[key] = reducedValue); |
| }); |
|
|
| stack[i] = undefined; |
|
|
| return target; |
| } |
| } |
|
|
| return source; |
| } |
|
|
| return visit(obj, 0); |
| } |
|
|
| const isAsyncFn = kindOfTest('AsyncFunction'); |
|
|
| const isThenable = (thing) => |
| thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch); |
|
|
| |
| |
|
|
| const _setImmediate = ((setImmediateSupported, postMessageSupported) => { |
| if (setImmediateSupported) { |
| return setImmediate; |
| } |
|
|
| return postMessageSupported ? ((token, callbacks) => { |
| _global.addEventListener("message", ({source, data}) => { |
| if (source === _global && data === token) { |
| callbacks.length && callbacks.shift()(); |
| } |
| }, false); |
|
|
| return (cb) => { |
| callbacks.push(cb); |
| _global.postMessage(token, "*"); |
| } |
| })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb); |
| })( |
| typeof setImmediate === 'function', |
| isFunction(_global.postMessage) |
| ); |
|
|
| const asap = typeof queueMicrotask !== 'undefined' ? |
| queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate); |
|
|
| |
|
|
| export default { |
| isArray, |
| isArrayBuffer, |
| isBuffer, |
| isFormData, |
| isArrayBufferView, |
| isString, |
| isNumber, |
| isBoolean, |
| isObject, |
| isPlainObject, |
| isReadableStream, |
| isRequest, |
| isResponse, |
| isHeaders, |
| isUndefined, |
| isDate, |
| isFile, |
| isBlob, |
| isRegExp, |
| isFunction, |
| isStream, |
| isURLSearchParams, |
| isTypedArray, |
| isFileList, |
| forEach, |
| merge, |
| extend, |
| trim, |
| stripBOM, |
| inherits, |
| toFlatObject, |
| kindOf, |
| kindOfTest, |
| endsWith, |
| toArray, |
| forEachEntry, |
| matchAll, |
| isHTMLForm, |
| hasOwnProperty, |
| hasOwnProp: hasOwnProperty, |
| reduceDescriptors, |
| freezeMethods, |
| toObjectSet, |
| toCamelCase, |
| noop, |
| toFiniteNumber, |
| findKey, |
| global: _global, |
| isContextDefined, |
| ALPHABET, |
| generateString, |
| isSpecCompliantForm, |
| toJSONObject, |
| isAsyncFn, |
| isThenable, |
| setImmediate: _setImmediate, |
| asap |
| }; |
|
|