| | '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 |
| | }; |
| |
|