// Built by eustia. (function(root, factory) { if (typeof define === 'function' && define.amd) { define([], factory); } else if (typeof module === 'object' && module.exports) { module.exports = factory(); } else { root.util = factory(); } }(this, function () { /* eslint-disable */ var _ = {}; if (typeof window === 'object' && window.util) _ = window.util; /* ------------------------------ types ------------------------------ */ var types = _.types = (function (exports) { /* Used for typescript definitions only. */ /* typescript * export declare namespace types { * interface Collection {} * interface List extends Collection { * [index: number]: T; * length: number; * } * interface ListIterator { * (value: T, index: number, list: List): TResult; * } * interface Dictionary extends Collection { * [index: string]: T; * } * interface ObjectIterator { * (element: T, key: string, list: Dictionary): TResult; * } * interface MemoIterator { * (prev: TResult, curr: T, index: number, list: List): TResult; * } * interface MemoObjectIterator { * (prev: TResult, curr: T, key: string, list: Dictionary): TResult; * } * type Fn = (...args: any[]) => T; * type AnyFn = Fn; * type PlainObj = { [name: string]: T }; * } * export declare const types: {}; */ exports = {}; return exports; })({}); /* ------------------------------ noop ------------------------------ */ var noop = _.noop = (function (exports) { /* A no-operation function. */ /* example * noop(); // Does nothing */ /* typescript * export declare function noop(): void; */ exports = function() {}; return exports; })({}); /* ------------------------------ isObj ------------------------------ */ var isObj = _.isObj = (function (exports) { /* Check if value is the language type of Object. * * |Name |Desc | * |------|--------------------------| * |val |Value to check | * |return|True if value is an object| * * [Language Spec](http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types) */ /* example * isObj({}); // -> true * isObj([]); // -> true */ /* typescript * export declare function isObj(val: any): boolean; */ exports = function(val) { var type = typeof val; return !!val && (type === 'function' || type === 'object'); }; return exports; })({}); /* ------------------------------ has ------------------------------ */ var has = _.has = (function (exports) { /* Checks if key is a direct property. * * |Name |Desc | * |------|--------------------------------| * |obj |Object to query | * |key |Path to check | * |return|True if key is a direct property| */ /* example * has({ one: 1 }, 'one'); // -> true */ /* typescript * export declare function has(obj: {}, key: string): boolean; */ var hasOwnProp = Object.prototype.hasOwnProperty; exports = function(obj, key) { return hasOwnProp.call(obj, key); }; return exports; })({}); /* ------------------------------ keys ------------------------------ */ var keys = _.keys = (function (exports) { /* Create an array of the own enumerable property names of object. * * |Name |Desc | * |------|-----------------------| * |obj |Object to query | * |return|Array of property names| */ /* example * keys({ a: 1 }); // -> ['a'] */ /* typescript * export declare function keys(obj: any): string[]; */ /* dependencies * has */ if (Object.keys && !false) { exports = Object.keys; } else { exports = function(obj) { var ret = []; for (var key in obj) { if (has(obj, key)) ret.push(key); } return ret; }; } return exports; })({}); /* ------------------------------ chunk ------------------------------ */ var chunk = _.chunk = (function (exports) { /* Split array into groups the length of given size. * * |Name |Desc | * |------|--------------------| * |arr |Array to process | * |size=1|Length of each chunk| * |return|Chunks of given size| */ /* example * chunk([1, 2, 3, 4], 2); // -> [[1, 2], [3, 4]] * chunk([1, 2, 3, 4], 3); // -> [[1, 2, 3], [4]] * chunk([1, 2, 3, 4]); // -> [[1], [2], [3], [4]] */ /* typescript * export declare function chunk(arr: any[], size?: number): Array; */ exports = function(arr, size) { var ret = []; size = size || 1; for (var i = 0, len = Math.ceil(arr.length / size); i < len; i++) { var start = i * size; var end = start + size; ret.push(arr.slice(start, end)); } return ret; }; return exports; })({}); /* ------------------------------ idxOf ------------------------------ */ var idxOf = _.idxOf = (function (exports) { /* Get the index at which the first occurrence of value. * * |Name |Desc | * |---------|--------------------| * |arr |Array to search | * |val |Value to search for | * |fromIdx=0|Index to search from| * |return |Value index | */ /* example * idxOf([1, 2, 1, 2], 2, 2); // -> 3 */ /* typescript * export declare function idxOf(arr: any[], val: any, fromIdx?: number): number; */ exports = function(arr, val, fromIdx) { return Array.prototype.indexOf.call(arr, val, fromIdx); }; return exports; })({}); /* ------------------------------ isUndef ------------------------------ */ var isUndef = _.isUndef = (function (exports) { /* Check if value is undefined. * * |Name |Desc | * |------|--------------------------| * |val |Value to check | * |return|True if value is undefined| */ /* example * isUndef(void 0); // -> true * isUndef(null); // -> false */ /* typescript * export declare function isUndef(val: any): boolean; */ exports = function(val) { return val === void 0; }; return exports; })({}); /* ------------------------------ create ------------------------------ */ var create = _.create = (function (exports) { /* Create new object using given object as prototype. * * |Name |Desc | * |------|-----------------------| * |proto |Prototype of new object| * |return|Created object | */ /* example * const obj = create({ a: 1 }); * console.log(obj.a); // -> 1 */ /* typescript * export declare function create(proto?: object): any; */ /* dependencies * isObj */ exports = function(proto) { if (!isObj(proto)) return {}; if (objCreate && !false) return objCreate(proto); function noop() {} noop.prototype = proto; return new noop(); }; var objCreate = Object.create; return exports; })({}); /* ------------------------------ inherits ------------------------------ */ var inherits = _.inherits = (function (exports) { /* Inherit the prototype methods from one constructor into another. * * |Name |Desc | * |----------|-----------| * |Class |Child Class| * |SuperClass|Super Class| */ /* example * function People(name) { * this._name = name; * } * People.prototype = { * getName: function() { * return this._name; * } * }; * function Student(name) { * this._name = name; * } * inherits(Student, People); * const s = new Student('RedHood'); * s.getName(); // -> 'RedHood' */ /* typescript * export declare function inherits( * Class: types.AnyFn, * SuperClass: types.AnyFn * ): void; */ /* dependencies * create types */ exports = function(Class, SuperClass) { Class.prototype = create(SuperClass.prototype); }; return exports; })({}); /* ------------------------------ restArgs ------------------------------ */ var restArgs = _.restArgs = (function (exports) { /* This accumulates the arguments passed into an array, after a given index. * * |Name |Desc | * |----------|---------------------------------------| * |function |Function that needs rest parameters | * |startIndex|The start index to accumulates | * |return |Generated function with rest parameters| */ /* example * const paramArr = restArgs(function(rest) { * return rest; * }); * paramArr(1, 2, 3, 4); // -> [1, 2, 3, 4] */ /* typescript * export declare function restArgs( * fn: types.AnyFn, * startIndex?: number * ): types.AnyFn; */ /* dependencies * types */ exports = function(fn, startIdx) { startIdx = startIdx == null ? fn.length - 1 : +startIdx; return function() { var len = Math.max(arguments.length - startIdx, 0); var rest = new Array(len); var i; for (i = 0; i < len; i++) { rest[i] = arguments[i + startIdx]; } // Call runs faster than apply. switch (startIdx) { case 0: return fn.call(this, rest); case 1: return fn.call(this, arguments[0], rest); case 2: return fn.call(this, arguments[0], arguments[1], rest); } var args = new Array(startIdx + 1); for (i = 0; i < startIdx; i++) { args[i] = arguments[i]; } args[startIdx] = rest; return fn.apply(this, args); }; }; return exports; })({}); /* ------------------------------ optimizeCb ------------------------------ */ var optimizeCb = _.optimizeCb = (function (exports) { /* Used for function context binding. */ /* typescript * export declare function optimizeCb( * fn: types.AnyFn, * ctx: any, * argCount?: number * ): types.AnyFn; */ /* dependencies * isUndef types */ exports = function(fn, ctx, argCount) { if (isUndef(ctx)) return fn; switch (argCount == null ? 3 : argCount) { case 1: return function(val) { return fn.call(ctx, val); }; case 3: return function(val, idx, collection) { return fn.call(ctx, val, idx, collection); }; case 4: return function(accumulator, val, idx, collection) { return fn.call(ctx, accumulator, val, idx, collection); }; } return function() { return fn.apply(ctx, arguments); }; }; return exports; })({}); /* ------------------------------ endWith ------------------------------ */ var endWith = _.endWith = (function (exports) { /* Check if string ends with the given target string. * * |Name |Desc | * |------|-------------------------------| * |str |The string to search | * |suffix|String suffix | * |return|True if string ends with target| */ /* example * endWith('ab', 'b'); // -> true */ /* typescript * export declare function endWith(str: string, suffix: string): boolean; */ exports = function(str, suffix) { var idx = str.length - suffix.length; return idx >= 0 && str.indexOf(suffix, idx) === idx; }; return exports; })({}); /* ------------------------------ toStr ------------------------------ */ var toStr = _.toStr = (function (exports) { /* Convert value to a string. * * |Name |Desc | * |------|----------------| * |val |Value to convert| * |return|Result string | */ /* example * toStr(null); // -> '' * toStr(1); // -> '1' * toStr(false); // -> 'false' * toStr([1, 2, 3]); // -> '1,2,3' */ /* typescript * export declare function toStr(val: any): string; */ exports = function(val) { return val == null ? '' : val.toString(); }; return exports; })({}); /* ------------------------------ escapeJsStr ------------------------------ */ var escapeJsStr = _.escapeJsStr = (function (exports) { /* Escape string to be a valid JavaScript string literal between quotes. * * http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4 * * |Name |Desc | * |------|----------------| * |str |String to escape| * |return|Escaped string | */ /* example * escapeJsStr('"\n'); // -> '\\"\\\\n' */ /* typescript * export declare function escapeJsStr(str: string): string; */ /* dependencies * toStr */ exports = function(str) { return toStr(str).replace(regEscapeChars, function(char) { switch (char) { case '"': case "'": case '\\': return '\\' + char; case '\n': return '\\n'; case '\r': return '\\r'; // Line separator case '\u2028': return '\\u2028'; // Paragraph separator case '\u2029': return '\\u2029'; } }); }; var regEscapeChars = /["'\\\n\r\u2028\u2029]/g; return exports; })({}); /* ------------------------------ evalCss ------------------------------ */ _.evalCss = (function (exports) { /* Load css into page. * * |Name |Desc | * |------|-------------| * |css |Css code | * |return|Style element| */ /* example * evalCss('body{background:#08c}'); */ /* typescript * export declare function evalCss(css: string): HTMLStyleElement; */ exports = function(css) { var style = document.createElement('style'); style.textContent = css; style.type = 'text/css'; document.head.appendChild(style); return style; }; return exports; })({}); /* ------------------------------ identity ------------------------------ */ var identity = _.identity = (function (exports) { /* Return the first argument given. * * |Name |Desc | * |------|-----------| * |val |Any value | * |return|Given value| */ /* example * identity('a'); // -> 'a' */ /* typescript * export declare function identity(val: T): T; */ exports = function(val) { return val; }; return exports; })({}); /* ------------------------------ objToStr ------------------------------ */ var objToStr = _.objToStr = (function (exports) { /* Alias of Object.prototype.toString. * * |Name |Desc | * |------|------------------------------------| * |val |Source value | * |return|String representation of given value| */ /* example * objToStr(5); // -> '[object Number]' */ /* typescript * export declare function objToStr(val: any): string; */ var ObjToStr = Object.prototype.toString; exports = function(val) { return ObjToStr.call(val); }; return exports; })({}); /* ------------------------------ isArgs ------------------------------ */ var isArgs = _.isArgs = (function (exports) { /* Check if value is classified as an arguments object. * * |Name |Desc | * |------|------------------------------------| * |val |Value to check | * |return|True if value is an arguments object| */ /* example * isArgs( * (function() { * return arguments; * })() * ); // -> true */ /* typescript * export declare function isArgs(val: any): boolean; */ /* dependencies * objToStr */ exports = function(val) { return objToStr(val) === '[object Arguments]'; }; return exports; })({}); /* ------------------------------ isArr ------------------------------ */ var isArr = _.isArr = (function (exports) { /* Check if value is an `Array` object. * * |Name |Desc | * |------|----------------------------------| * |val |Value to check | * |return|True if value is an `Array` object| */ /* example * isArr([]); // -> true * isArr({}); // -> false */ /* typescript * export declare function isArr(val: any): boolean; */ /* dependencies * objToStr */ if (Array.isArray && !false) { exports = Array.isArray; } else { exports = function(val) { return objToStr(val) === '[object Array]'; }; } return exports; })({}); /* ------------------------------ castPath ------------------------------ */ var castPath = _.castPath = (function (exports) { /* Cast value into a property path array. * * |Name |Desc | * |------|-------------------| * |path |Value to inspect | * |obj |Object to query | * |return|Property path array| */ /* example * castPath('a.b.c'); // -> ['a', 'b', 'c'] * castPath(['a']); // -> ['a'] * castPath('a[0].b'); // -> ['a', '0', 'b'] * castPath('a.b.c', { 'a.b.c': true }); // -> ['a.b.c'] */ /* typescript * export declare function castPath(path: string | string[], obj?: any): string[]; */ /* dependencies * has isArr */ exports = function(str, obj) { if (isArr(str)) return str; if (obj && has(obj, str)) return [str]; var ret = []; str.replace(regPropName, function(match, number, quote, str) { ret.push(quote ? str.replace(regEscapeChar, '$1') : number || match); }); return ret; }; // Lodash _stringToPath var regPropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; var regEscapeChar = /\\(\\)?/g; return exports; })({}); /* ------------------------------ safeGet ------------------------------ */ var safeGet = _.safeGet = (function (exports) { /* Get object property, don't throw undefined error. * * |Name |Desc | * |------|-------------------------| * |obj |Object to query | * |path |Path of property to get | * |return|Target value or undefined| */ /* example * const obj = { a: { aa: { aaa: 1 } } }; * safeGet(obj, 'a.aa.aaa'); // -> 1 * safeGet(obj, ['a', 'aa']); // -> {aaa: 1} * safeGet(obj, 'a.b'); // -> undefined */ /* typescript * export declare function safeGet(obj: any, path: string | string[]): any; */ /* dependencies * isUndef castPath */ exports = function(obj, path) { path = castPath(path, obj); var prop; prop = path.shift(); while (!isUndef(prop)) { obj = obj[prop]; if (obj == null) return; prop = path.shift(); } return obj; }; return exports; })({}); /* ------------------------------ flatten ------------------------------ */ var flatten = _.flatten = (function (exports) { /* Recursively flatten an array. * * |Name |Desc | * |------|-------------------| * |arr |Array to flatten | * |return|New flattened array| */ /* example * flatten(['a', ['b', ['c']], 'd', ['e']]); // -> ['a', 'b', 'c', 'd', 'e'] */ /* typescript * export declare function flatten(arr: any[]): any[]; */ /* dependencies * isArr */ exports = function(arr) { return flat(arr, []); }; function flat(arr, res) { var len = arr.length, i = -1, cur; while (len--) { cur = arr[++i]; isArr(cur) ? flat(cur, res) : res.push(cur); } return res; } return exports; })({}); /* ------------------------------ isFn ------------------------------ */ var isFn = _.isFn = (function (exports) { /* Check if value is a function. * * |Name |Desc | * |------|---------------------------| * |val |Value to check | * |return|True if value is a function| * * Generator function is also classified as true. */ /* example * isFn(function() {}); // -> true * isFn(function*() {}); // -> true * isFn(async function() {}); // -> true */ /* typescript * export declare function isFn(val: any): boolean; */ /* dependencies * objToStr */ exports = function(val) { var objStr = objToStr(val); return ( objStr === '[object Function]' || objStr === '[object GeneratorFunction]' || objStr === '[object AsyncFunction]' ); }; return exports; })({}); /* ------------------------------ getProto ------------------------------ */ var getProto = _.getProto = (function (exports) { /* Get prototype of an object. * * |Name |Desc | * |------|---------------------------------------------| * |obj |Target object | * |return|Prototype of given object, null if not exists| */ /* example * const a = {}; * getProto(Object.create(a)); // -> a */ /* typescript * export declare function getProto(obj: any): any; */ /* dependencies * isObj isFn */ var getPrototypeOf = Object.getPrototypeOf; var ObjectCtr = {}.constructor; exports = function(obj) { if (!isObj(obj)) return; if (getPrototypeOf && !false) return getPrototypeOf(obj); var proto = obj.__proto__; if (proto || proto === null) return proto; if (isFn(obj.constructor)) return obj.constructor.prototype; if (obj instanceof ObjectCtr) return ObjectCtr.prototype; }; return exports; })({}); /* ------------------------------ isMiniProgram ------------------------------ */ var isMiniProgram = _.isMiniProgram = (function (exports) { /* Check if running in wechat mini program. */ /* example * console.log(isMiniProgram); // -> true if running in mini program. */ /* typescript * export declare const isMiniProgram: boolean; */ /* dependencies * isFn */ /* eslint-disable no-undef */ exports = typeof wx !== 'undefined' && isFn(wx.openLocation); return exports; })({}); /* ------------------------------ isNum ------------------------------ */ var isNum = _.isNum = (function (exports) { /* Check if value is classified as a Number primitive or object. * * |Name |Desc | * |------|-------------------------------------| * |val |Value to check | * |return|True if value is correctly classified| */ /* example * isNum(5); // -> true * isNum(5.1); // -> true * isNum({}); // -> false */ /* typescript * export declare function isNum(val: any): boolean; */ /* dependencies * objToStr */ exports = function(val) { return objToStr(val) === '[object Number]'; }; return exports; })({}); /* ------------------------------ isArrLike ------------------------------ */ var isArrLike = _.isArrLike = (function (exports) { /* Check if value is array-like. * * |Name |Desc | * |------|---------------------------| * |val |Value to check | * |return|True if value is array like| * * Function returns false. */ /* example * isArrLike('test'); // -> true * isArrLike(document.body.children); // -> true; * isArrLike([1, 2, 3]); // -> true */ /* typescript * export declare function isArrLike(val: any): boolean; */ /* dependencies * isNum isFn */ var MAX_ARR_IDX = Math.pow(2, 53) - 1; exports = function(val) { if (!val) return false; var len = val.length; return isNum(len) && len >= 0 && len <= MAX_ARR_IDX && !isFn(val); }; return exports; })({}); /* ------------------------------ each ------------------------------ */ var each = _.each = (function (exports) { /* Iterate over elements of collection and invokes iterator for each element. * * |Name |Desc | * |--------|------------------------------| * |obj |Collection to iterate over | * |iterator|Function invoked per iteration| * |ctx |Function context | */ /* example * each({ a: 1, b: 2 }, function(val, key) {}); */ /* typescript * export declare function each( * list: types.List, * iterator: types.ListIterator, * ctx?: any * ): types.List; * export declare function each( * object: types.Dictionary, * iterator: types.ObjectIterator, * ctx?: any * ): types.Collection; */ /* dependencies * isArrLike keys optimizeCb types */ exports = function(obj, iterator, ctx) { iterator = optimizeCb(iterator, ctx); var i, len; if (isArrLike(obj)) { for (i = 0, len = obj.length; i < len; i++) { iterator(obj[i], i, obj); } } else { var _keys = keys(obj); for (i = 0, len = _keys.length; i < len; i++) { iterator(obj[_keys[i]], _keys[i], obj); } } return obj; }; return exports; })({}); /* ------------------------------ createAssigner ------------------------------ */ var createAssigner = _.createAssigner = (function (exports) { /* Used to create extend, extendOwn and defaults. * * |Name |Desc | * |--------|------------------------------| * |keysFn |Function to get object keys | * |defaults|No override when set to true | * |return |Result function, extend... | */ /* typescript * export declare function createAssigner( * keysFn: types.AnyFn, * defaults: boolean * ): types.AnyFn; */ /* dependencies * isUndef each types */ exports = function(keysFn, defaults) { return function(obj) { each(arguments, function(src, idx) { if (idx === 0) return; var keys = keysFn(src); each(keys, function(key) { if (!defaults || isUndef(obj[key])) obj[key] = src[key]; }); }); return obj; }; }; return exports; })({}); /* ------------------------------ extendOwn ------------------------------ */ var extendOwn = _.extendOwn = (function (exports) { /* Like extend, but only copies own properties over to the destination object. * * |Name |Desc | * |-----------|------------------| * |destination|Destination object| * |...sources |Sources objects | * |return |Destination object| */ /* example * extendOwn({ name: 'RedHood' }, { age: 24 }); // -> {name: 'RedHood', age: 24} */ /* typescript * export declare function extendOwn(destination: any, ...sources: any[]): any; */ /* dependencies * keys createAssigner */ exports = createAssigner(keys); return exports; })({}); /* ------------------------------ values ------------------------------ */ var values = _.values = (function (exports) { /* Create an array of the own enumerable property values of object. * * |Name |Desc | * |------|------------------------| * |obj |Object to query | * |return|Array of property values| */ /* example * values({ one: 1, two: 2 }); // -> [1, 2] */ /* typescript * export declare function values(obj: any): any[]; */ /* dependencies * each */ exports = function(obj) { var ret = []; each(obj, function(val) { ret.push(val); }); return ret; }; return exports; })({}); /* ------------------------------ isStr ------------------------------ */ var isStr = _.isStr = (function (exports) { /* Check if value is a string primitive. * * |Name |Desc | * |------|-----------------------------------| * |val |Value to check | * |return|True if value is a string primitive| */ /* example * isStr('licia'); // -> true */ /* typescript * export declare function isStr(val: any): boolean; */ /* dependencies * objToStr */ exports = function(val) { return objToStr(val) === '[object String]'; }; return exports; })({}); /* ------------------------------ contain ------------------------------ */ var contain = _.contain = (function (exports) { /* Check if the value is present in the list. * * |Name |Desc | * |------|------------------------------------| * |target|Target object | * |val |Value to check | * |return|True if value is present in the list| */ /* example * contain([1, 2, 3], 1); // -> true * contain({ a: 1, b: 2 }, 1); // -> true * contain('abc', 'a'); // -> true */ /* typescript * export declare function contain(arr: any[] | {} | string, val: any): boolean; */ /* dependencies * idxOf isStr isArrLike values */ exports = function(arr, val) { if (isStr(arr)) return arr.indexOf(val) > -1; if (!isArrLike(arr)) arr = values(arr); return idxOf(arr, val) >= 0; }; return exports; })({}); /* ------------------------------ defineProp ------------------------------ */ var defineProp = _.defineProp = (function (exports) { /* Shortcut for Object.defineProperty(defineProperties). * * |Name |Desc | * |----------|-------------------| * |obj |Object to define | * |prop |Property path | * |descriptor|Property descriptor| * |return |Object itself | * * |Name |Desc | * |------|--------------------| * |obj |Object to define | * |prop |Property descriptors| * |return|Object itself | */ /* example * const obj = { b: { c: 3 }, d: 4, e: 5 }; * defineProp(obj, 'a', { * get: function() { * return this.e * 2; * } * }); * // obj.a is equal to 10 * defineProp(obj, 'b.c', { * set: function(val) { * // this is pointed to obj.b * this.e = val; * }.bind(obj) * }); * obj.b.c = 2; * // obj.a is equal to 4 * * const obj2 = { a: 1, b: 2, c: 3 }; * defineProp(obj2, { * a: { * get: function() { * return this.c; * } * }, * b: { * set: function(val) { * this.c = val / 2; * } * } * }); * // obj2.a is equal to 3 * obj2.b = 4; * // obj2.a is equal to 2 */ /* typescript * export declare function defineProp( * obj: T, * prop: string, * descriptor: PropertyDescriptor * ): T; * export declare function defineProp( * obj: T, * descriptor: PropertyDescriptorMap * ): T; */ /* dependencies * castPath isStr isObj each */ exports = function(obj, prop, descriptor) { if (isStr(prop)) { defineProp(obj, prop, descriptor); } else if (isObj(prop)) { each(prop, function(descriptor, prop) { defineProp(obj, prop, descriptor); }); } return obj; }; function defineProp(obj, prop, descriptor) { var path = castPath(prop, obj); var lastProp = path.pop(); /* eslint-disable no-cond-assign */ while ((prop = path.shift())) { if (!obj[prop]) obj[prop] = {}; obj = obj[prop]; } Object.defineProperty(obj, lastProp, descriptor); } return exports; })({}); /* ------------------------------ isBuffer ------------------------------ */ var isBuffer = _.isBuffer = (function (exports) { /* Check if value is a buffer. * * |Name |Desc | * |------|-------------------------| * |val |The value to check | * |return|True if value is a buffer| */ /* example * isBuffer(new Buffer(4)); // -> true */ /* typescript * export declare function isBuffer(val: any): boolean; */ /* dependencies * isFn */ exports = function(val) { if (val == null) return false; if (val._isBuffer) return true; return ( val.constructor && isFn(val.constructor.isBuffer) && val.constructor.isBuffer(val) ); }; return exports; })({}); /* ------------------------------ isEmpty ------------------------------ */ var isEmpty = _.isEmpty = (function (exports) { /* Check if value is an empty object or array. * * |Name |Desc | * |------|----------------------| * |val |Value to check | * |return|True if value is empty| */ /* example * isEmpty([]); // -> true * isEmpty({}); // -> true * isEmpty(''); // -> true */ /* typescript * export declare function isEmpty(val: any): boolean; */ /* dependencies * isArrLike isArr isStr isArgs keys */ exports = function(val) { if (val == null) return true; if (isArrLike(val) && (isArr(val) || isStr(val) || isArgs(val))) { return val.length === 0; } return keys(val).length === 0; }; return exports; })({}); /* ------------------------------ isMatch ------------------------------ */ var isMatch = _.isMatch = (function (exports) { /* Check if keys and values in src are contained in obj. * * |Name |Desc | * |------|----------------------------------| * |obj |Object to inspect | * |src |Object of property values to match| * |return|True if object is match | */ /* example * isMatch({ a: 1, b: 2 }, { a: 1 }); // -> true */ /* typescript * export declare function isMatch(obj: any, src: any): boolean; */ /* dependencies * keys */ exports = function(obj, src) { var _keys = keys(src); var len = _keys.length; if (obj == null) return !len; obj = Object(obj); for (var i = 0; i < len; i++) { var key = _keys[i]; if (src[key] !== obj[key] || !(key in obj)) return false; } return true; }; return exports; })({}); /* ------------------------------ isNaN ------------------------------ */ var isNaN = _.isNaN = (function (exports) { /* Check if value is an NaN. * * |Name |Desc | * |------|-----------------------| * |val |Value to check | * |return|True if value is an NaN| * * Undefined is not an NaN, different from global isNaN function. */ /* example * isNaN(0); // -> false * isNaN(NaN); // -> true */ /* typescript * export declare function isNaN(val: any): boolean; */ /* dependencies * isNum */ exports = function(val) { return isNum(val) && val !== +val; }; return exports; })({}); /* ------------------------------ isNil ------------------------------ */ var isNil = _.isNil = (function (exports) { /* Check if value is null or undefined, the same as value == null. * * |Name |Desc | * |------|----------------------------------| * |val |Value to check | * |return|True if value is null or undefined| */ /* example * isNil(null); // -> true * isNil(void 0); // -> true * isNil(undefined); // -> true * isNil(false); // -> false * isNil(0); // -> false * isNil([]); // -> false */ /* typescript * export declare function isNil(val: any): boolean; */ exports = function(val) { return val == null; }; return exports; })({}); /* ------------------------------ isPromise ------------------------------ */ var isPromise = _.isPromise = (function (exports) { /* Check if value looks like a promise. * * |Name |Desc | * |------|----------------------------------| * |val |Value to check | * |return|True if value looks like a promise| */ /* example * isPromise(new Promise(function() {})); // -> true * isPromise({}); // -> false */ /* typescript * export declare function isPromise(val: any): boolean; */ /* dependencies * isObj isFn */ exports = function(val) { return isObj(val) && isFn(val.then) && isFn(val.catch); }; return exports; })({}); /* ------------------------------ isSymbol ------------------------------ */ var isSymbol = _.isSymbol = (function (exports) { /* Check if value is a symbol. * * |Name |Desc | * |------|-------------------------| * |val |Value to check | * |return|True if value is a symbol| */ /* example * isSymbol(Symbol('test')); // -> true */ /* typescript * export declare function isSymbol(val: any): boolean; */ exports = function(val) { return typeof val === 'symbol'; }; return exports; })({}); /* ------------------------------ lowerCase ------------------------------ */ var lowerCase = _.lowerCase = (function (exports) { /* Convert string to lower case. * * |Name |Desc | * |------|------------------| * |str |String to convert | * |return|Lower cased string| */ /* example * lowerCase('TEST'); // -> 'test' */ /* typescript * export declare function lowerCase(str: string): string; */ /* dependencies * toStr */ exports = function(str) { return toStr(str).toLocaleLowerCase(); }; return exports; })({}); /* ------------------------------ ltrim ------------------------------ */ var ltrim = _.ltrim = (function (exports) { /* Remove chars or white-spaces from beginning of string. * * |Name |Desc | * |------|------------------| * |str |String to trim | * |chars |Characters to trim| * |return|Trimmed string | */ /* example * ltrim(' abc '); // -> 'abc ' * ltrim('_abc_', '_'); // -> 'abc_' * ltrim('_abc_', ['a', '_']); // -> 'bc_' */ /* typescript * export declare function ltrim(str: string, chars?: string | string[]): string; */ var regSpace = /^\s+/; exports = function(str, chars) { if (chars == null) { if (str.trimLeft) { return str.trimLeft(); } return str.replace(regSpace, ''); } var start = 0; var len = str.length; var charLen = chars.length; var found = true; var i; var c; while (found && start < len) { found = false; i = -1; c = str.charAt(start); while (++i < charLen) { if (c === chars[i]) { found = true; start++; break; } } } return start >= len ? '' : str.substr(start, len); }; return exports; })({}); /* ------------------------------ matcher ------------------------------ */ var matcher = _.matcher = (function (exports) { /* Return a predicate function that checks if attrs are contained in an object. * * |Name |Desc | * |------|----------------------------------| * |attrs |Object of property values to match| * |return|New predicate function | */ /* example * const filter = require('licia/filter'); * * const objects = [ * { a: 1, b: 2, c: 3 }, * { a: 4, b: 5, c: 6 } * ]; * filter(objects, matcher({ a: 4, c: 6 })); // -> [{a: 4, b: 5, c: 6}] */ /* typescript * export declare function matcher(attrs: any): types.AnyFn; */ /* dependencies * extendOwn isMatch types */ exports = function(attrs) { attrs = extendOwn({}, attrs); return function(obj) { return isMatch(obj, attrs); }; }; return exports; })({}); /* ------------------------------ now ------------------------------ */ var now = _.now = (function (exports) { /* Gets the number of milliseconds that have elapsed since the Unix epoch. */ /* example * now(); // -> 1468826678701 */ /* typescript * export declare function now(): number; */ if (Date.now && !false) { exports = Date.now; } else { exports = function() { return new Date().getTime(); }; } return exports; })({}); /* ------------------------------ pick ------------------------------ */ var pick = _.pick = (function (exports) { /* Return a filtered copy of an object. * * |Name |Desc | * |------|---------------| * |object|Source object | * |filter|Object filter | * |return|Filtered object| */ /* example * pick({ a: 1, b: 2 }, 'a'); // -> {a: 1} * pick({ a: 1, b: 2, c: 3 }, ['b', 'c']); // -> {b: 2, c: 3} * pick({ a: 1, b: 2, c: 3, d: 4 }, function(val, key) { * return val % 2; * }); // -> {a: 1, c: 3} */ /* typescript * export declare function pick( * object: any, * filter: string | string[] | Function * ): any; */ /* dependencies * isStr isArr contain each */ exports = function(obj, filter, omit) { if (isStr(filter)) filter = [filter]; if (isArr(filter)) { var keys = filter; filter = function(val, key) { return contain(keys, key); }; } var ret = {}; var iteratee = function(val, key) { if (filter(val, key)) ret[key] = val; }; if (omit) { iteratee = function(val, key) { if (!filter(val, key)) ret[key] = val; }; } each(obj, iteratee); return ret; }; return exports; })({}); /* ------------------------------ property ------------------------------ */ var property = _.property = (function (exports) { /* Return a function that will itself return the key property of any passed-in object. * * |Name |Desc | * |------|---------------------------| * |path |Path of the property to get| * |return|New accessor function | */ /* example * const obj = { a: { b: 1 } }; * property('a')(obj); // -> {b: 1} * property(['a', 'b'])(obj); // -> 1 */ /* typescript * export declare function property(path: string | string[]): types.AnyFn; */ /* dependencies * isArr safeGet types */ exports = function(path) { if (!isArr(path)) return shallowProperty(path); return function(obj) { return safeGet(obj, path); }; }; function shallowProperty(key) { return function(obj) { return obj == null ? void 0 : obj[key]; }; } return exports; })({}); /* ------------------------------ safeCb ------------------------------ */ var safeCb = _.safeCb = (function (exports) { /* Create callback based on input value. */ /* typescript * export declare function safeCb( * val?: any, * ctx?: any, * argCount?: number * ): types.AnyFn; */ /* dependencies * isFn isObj isArr optimizeCb matcher identity types property */ exports = function(val, ctx, argCount) { if (val == null) return identity; if (isFn(val)) return optimizeCb(val, ctx, argCount); if (isObj(val) && !isArr(val)) return matcher(val); return property(val); }; return exports; })({}); /* ------------------------------ filter ------------------------------ */ var filter = _.filter = (function (exports) { /* Iterates over elements of collection, returning an array of all the values that pass a truth test. * * |Name |Desc | * |---------|---------------------------------------| * |obj |Collection to iterate over | * |predicate|Function invoked per iteration | * |ctx |Predicate context | * |return |Array of all values that pass predicate| */ /* example * filter([1, 2, 3, 4, 5], function(val) { * return val % 2 === 0; * }); // -> [2, 4] */ /* typescript * export declare function filter( * list: types.List, * iterator: types.ListIterator, * context?: any * ): T[]; * export declare function filter( * object: types.Dictionary, * iterator: types.ObjectIterator, * context?: any * ): T[]; */ /* dependencies * safeCb each types */ exports = function(obj, predicate, ctx) { var ret = []; predicate = safeCb(predicate, ctx); each(obj, function(val, idx, list) { if (predicate(val, idx, list)) ret.push(val); }); return ret; }; return exports; })({}); /* ------------------------------ difference ------------------------------ */ var difference = _.difference = (function (exports) { /* Create an array of unique array values not included in the other given array. * * |Name |Desc | * |-------|----------------------------| * |arr |Array to inspect | * |...args|Values to exclude | * |return |New array of filtered values| */ /* example * difference([3, 2, 1], [4, 2]); // -> [3, 1] */ /* typescript * export declare function difference(arr: any[], ...args: any[]): any[]; */ /* dependencies * restArgs flatten filter contain */ exports = restArgs(function(arr, args) { args = flatten(args); return filter(arr, function(val) { return !contain(args, val); }); }); return exports; })({}); /* ------------------------------ unique ------------------------------ */ var unique = _.unique = (function (exports) { /* Create duplicate-free version of an array. * * |Name |Desc | * |------|-----------------------------| * |arr |Array to inspect | * |cmp |Function for comparing values| * |return|New duplicate free array | */ /* example * unique([1, 2, 3, 1]); // -> [1, 2, 3] */ /* typescript * export declare function unique( * arr: any[], * cmp?: (a: any, b: any) => boolean | number * ): any[]; */ /* dependencies * filter */ exports = function(arr, cmp) { cmp = cmp || isEqual; return filter(arr, function(item, idx, arr) { var len = arr.length; while (++idx < len) { if (cmp(item, arr[idx])) return false; } return true; }); }; function isEqual(a, b) { return a === b; } return exports; })({}); /* ------------------------------ allKeys ------------------------------ */ var allKeys = _.allKeys = (function (exports) { /* Retrieve all the names of object's own and inherited properties. * * |Name |Desc | * |-------|---------------------------| * |obj |Object to query | * |options|Options | * |return |Array of all property names| * * Available options: * * |Name |Desc | * |------------------|-------------------------| * |prototype=true |Include prototype keys | * |unenumerable=false|Include unenumerable keys| * |symbol=false |Include symbol keys | * * Members of Object's prototype won't be retrieved. */ /* example * const obj = Object.create({ zero: 0 }); * obj.one = 1; * allKeys(obj); // -> ['zero', 'one'] */ /* typescript * export declare namespace allKeys { * interface IOptions { * prototype?: boolean; * unenumerable?: boolean; * } * } * export declare function allKeys( * obj: any, * options: { symbol: true } & allKeys.IOptions * ): Array; * export declare function allKeys( * obj: any, * options?: ({ symbol: false } & allKeys.IOptions) | allKeys.IOptions * ): string[]; */ /* dependencies * keys getProto unique */ var getOwnPropertyNames = Object.getOwnPropertyNames; var getOwnPropertySymbols = Object.getOwnPropertySymbols; exports = function(obj) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$prototype = _ref.prototype, prototype = _ref$prototype === void 0 ? true : _ref$prototype, _ref$unenumerable = _ref.unenumerable, unenumerable = _ref$unenumerable === void 0 ? false : _ref$unenumerable, _ref$symbol = _ref.symbol, symbol = _ref$symbol === void 0 ? false : _ref$symbol; var ret = []; if ((unenumerable || symbol) && getOwnPropertyNames) { var getKeys = keys; if (unenumerable && getOwnPropertyNames) getKeys = getOwnPropertyNames; do { ret = ret.concat(getKeys(obj)); if (symbol && getOwnPropertySymbols) { ret = ret.concat(getOwnPropertySymbols(obj)); } } while ( prototype && (obj = getProto(obj)) && obj !== Object.prototype ); ret = unique(ret); } else { if (prototype) { for (var key in obj) { ret.push(key); } } else { ret = keys(obj); } } return ret; }; return exports; })({}); /* ------------------------------ defaults ------------------------------ */ var defaults = _.defaults = (function (exports) { /* Fill in undefined properties in object with the first value present in the following list of defaults objects. * * |Name |Desc | * |------|------------------| * |obj |Destination object| * |...src|Sources objects | * |return|Destination object| */ /* example * defaults({ name: 'RedHood' }, { name: 'Unknown', age: 24 }); // -> {name: 'RedHood', age: 24} */ /* typescript * export declare function defaults(obj: any, ...src: any[]): any; */ /* dependencies * createAssigner allKeys */ exports = createAssigner(allKeys, true); return exports; })({}); /* ------------------------------ extend ------------------------------ */ var extend = _.extend = (function (exports) { /* Copy all of the properties in the source objects over to the destination object. * * |Name |Desc | * |-----------|------------------| * |destination|Destination object| * |...sources |Sources objects | * |return |Destination object| */ /* example * extend({ name: 'RedHood' }, { age: 24 }); // -> {name: 'RedHood', age: 24} */ /* typescript * export declare function extend(destination: any, ...sources: any[]): any; */ /* dependencies * createAssigner allKeys */ exports = createAssigner(allKeys); return exports; })({}); /* ------------------------------ map ------------------------------ */ var map = _.map = (function (exports) { /* Create an array of values by running each element in collection through iteratee. * * |Name |Desc | * |--------|------------------------------| * |object |Collection to iterate over | * |iterator|Function invoked per iteration| * |context |Function context | * |return |New mapped array | */ /* example * map([4, 8], function(n) { * return n * n; * }); // -> [16, 64] */ /* typescript * export declare function map( * list: types.List, * iterator: types.ListIterator, * context?: any * ): TResult[]; * export declare function map( * object: types.Dictionary, * iterator: types.ObjectIterator, * context?: any * ): TResult[]; */ /* dependencies * safeCb keys isArrLike types */ exports = function(obj, iterator, ctx) { iterator = safeCb(iterator, ctx); var _keys = !isArrLike(obj) && keys(obj); var len = (_keys || obj).length; var results = Array(len); for (var i = 0; i < len; i++) { var curKey = _keys ? _keys[i] : i; results[i] = iterator(obj[curKey], curKey, obj); } return results; }; return exports; })({}); /* ------------------------------ toArr ------------------------------ */ var toArr = _.toArr = (function (exports) { /* Convert value to an array. * * |Name |Desc | * |------|----------------| * |val |Value to convert| * |return|Converted array | */ /* example * toArr({ a: 1, b: 2 }); // -> [{a: 1, b: 2}] * toArr('abc'); // -> ['abc'] * toArr(1); // -> [1] * toArr(null); // -> [] */ /* typescript * export declare function toArr(val: any): any[]; */ /* dependencies * isArrLike map isArr isStr */ exports = function(val) { if (!val) return []; if (isArr(val)) return val; if (isArrLike(val) && !isStr(val)) return map(val); return [val]; }; return exports; })({}); /* ------------------------------ Class ------------------------------ */ var Class = _.Class = (function (exports) { /* Create JavaScript class. * * |Name |Desc | * |-------|---------------------------------| * |methods|Public methods | * [statics|Static methods | * |return |Function used to create instances| */ /* example * const People = Class({ * initialize: function People(name, age) { * this.name = name; * this.age = age; * }, * introduce: function() { * return 'I am ' + this.name + ', ' + this.age + ' years old.'; * } * }); * * const Student = People.extend( * { * initialize: function Student(name, age, school) { * this.callSuper(People, 'initialize', arguments); * * this.school = school; * }, * introduce: function() { * return ( * this.callSuper(People, 'introduce') + * '\n I study at ' + * this.school + * '.' * ); * } * }, * { * is: function(obj) { * return obj instanceof Student; * } * } * ); * * const a = new Student('allen', 17, 'Hogwarts'); * a.introduce(); // -> 'I am allen, 17 years old. \n I study at Hogwarts.' * Student.is(a); // -> true */ /* typescript * export declare namespace Class { * class Base { * toString(): string; * } * class IConstructor extends Base { * constructor(...args: any[]); * static extend(methods: any, statics: any): IConstructor; * static inherits(Class: types.AnyFn): void; * static methods(methods: any): IConstructor; * static statics(statics: any): IConstructor; * [method: string]: any; * } * } * export declare function Class(methods: any, statics?: any): Class.IConstructor; */ /* dependencies * extend toArr inherits safeGet isMiniProgram types */ exports = function(methods, statics) { return Base.extend(methods, statics); }; function makeClass(parent, methods, statics) { statics = statics || {}; var className = methods.className || safeGet(methods, 'initialize.name') || ''; delete methods.className; var ctor = function() { var args = toArr(arguments); return this.initialize ? this.initialize.apply(this, args) || this : this; }; if (!isMiniProgram) { // unsafe-eval CSP violation try { ctor = new Function( 'toArr', 'return function ' + className + '()' + '{' + 'var args = toArr(arguments);' + 'return this.initialize ? this.initialize.apply(this, args) || this : this;' + '};' )(toArr); } catch (e) { /* eslint-disable no-empty */ } } inherits(ctor, parent); ctor.prototype.constructor = ctor; ctor.extend = function(methods, statics) { return makeClass(ctor, methods, statics); }; ctor.inherits = function(Class) { inherits(ctor, Class); }; ctor.methods = function(methods) { extend(ctor.prototype, methods); return ctor; }; ctor.statics = function(statics) { extend(ctor, statics); return ctor; }; ctor.methods(methods).statics(statics); return ctor; } var Base = (exports.Base = makeClass(Object, { className: 'Base', callSuper: function(parent, name, args) { var superMethod = parent.prototype[name]; return superMethod.apply(this, args); }, toString: function() { return this.constructor.name; } })); return exports; })({}); /* ------------------------------ ucs2 ------------------------------ */ var ucs2 = _.ucs2 = (function (exports) { /* UCS-2 encoding and decoding. * * ### encode * * Create a string using an array of code point values. * * |Name |Desc | * |------|--------------------| * |arr |Array of code points| * |return|Encoded string | * * ### decode * * Create an array of code point values using a string. * * |Name |Desc | * |------|--------------------| * |str |Input string | * |return|Array of code points| */ /* example * ucs2.encode([0x61, 0x62, 0x63]); // -> 'abc' * ucs2.decode('abc'); // -> [0x61, 0x62, 0x63] * '𝌆'.length; // -> 2 * ucs2.decode('𝌆').length; // -> 1 */ /* typescript * export declare const ucs2: { * encode(arr: number[]): string; * decode(str: string): number[]; * }; */ /* dependencies * chunk map */ // https://mathiasbynens.be/notes/javascript-encoding exports = { encode: function(arr) { // https://stackoverflow.com/questions/22747068/is-there-a-max-number-of-arguments-javascript-functions-can-accept if (arr.length < 32768) { return String.fromCodePoint.apply(String, arr); } return map(chunk(arr, 32767), function(nums) { return String.fromCodePoint.apply(String, nums); }).join(''); }, decode: function(str) { var ret = []; var i = 0; var len = str.length; while (i < len) { var c = str.charCodeAt(i++); // A high surrogate if (c >= 0xd800 && c <= 0xdbff && i < len) { var tail = str.charCodeAt(i++); // nextC >= 0xDC00 && nextC <= 0xDFFF if ((tail & 0xfc00) === 0xdc00) { // C = (H - 0xD800) * 0x400 + L - 0xDC00 + 0x10000 ret.push(((c & 0x3ff) << 10) + (tail & 0x3ff) + 0x10000); } else { ret.push(c); i--; } } else { ret.push(c); } } return ret; } }; return exports; })({}); /* ------------------------------ utf8 ------------------------------ */ var utf8 = _.utf8 = (function (exports) { /* UTF-8 encoding and decoding. * * ### encode * * Turn any UTF-8 decoded string into UTF-8 encoded string. * * |Name |Desc | * |------|----------------| * |str |String to encode| * |return|Encoded string | * * ### decode * * Turn any UTF-8 encoded string into UTF-8 decoded string. * * |Name |Desc | * |----------|----------------------| * |str |String to decode | * |safe=false|Suppress error if true| * |return |Decoded string | */ /* example * utf8.encode('\uD800\uDC00'); // -> '\xF0\x90\x80\x80' * utf8.decode('\xF0\x90\x80\x80'); // -> '\uD800\uDC00' */ /* typescript * export declare const utf8: { * encode(str: string): string; * decode(str: string, safe?: boolean): string; * }; */ /* dependencies * ucs2 */ // https://encoding.spec.whatwg.org/#utf-8 exports = { encode: function(str) { var codePoints = ucs2.decode(str); var byteArr = ''; for (var i = 0, len = codePoints.length; i < len; i++) { byteArr += encodeCodePoint(codePoints[i]); } return byteArr; }, decode: function(str, safe) { byteArr = ucs2.decode(str); byteIdx = 0; byteCount = byteArr.length; codePoint = 0; bytesSeen = 0; bytesNeeded = 0; lowerBoundary = 0x80; upperBoundary = 0xbf; var codePoints = []; var tmp; while ((tmp = decodeCodePoint(safe)) !== false) { codePoints.push(tmp); } return ucs2.encode(codePoints); } }; var fromCharCode = String.fromCharCode; function encodeCodePoint(codePoint) { // U+0000 to U+0080, ASCII code point if ((codePoint & 0xffffff80) === 0) { return fromCharCode(codePoint); } var ret = '', count, offset; // U+0080 to U+07FF, inclusive if ((codePoint & 0xfffff800) === 0) { count = 1; offset = 0xc0; } else if ((codePoint & 0xffff0000) === 0) { // U+0800 to U+FFFF, inclusive count = 2; offset = 0xe0; } else if ((codePoint & 0xffe00000) == 0) { // U+10000 to U+10FFFF, inclusive count = 3; offset = 0xf0; } ret += fromCharCode((codePoint >> (6 * count)) + offset); while (count > 0) { var tmp = codePoint >> (6 * (count - 1)); ret += fromCharCode(0x80 | (tmp & 0x3f)); count--; } return ret; } var byteArr, byteIdx, byteCount, codePoint, bytesSeen, bytesNeeded, lowerBoundary, upperBoundary; function decodeCodePoint(safe) { /* eslint-disable no-constant-condition */ while (true) { if (byteIdx >= byteCount && bytesNeeded) { if (safe) return goBack(); throw new Error('Invalid byte index'); } if (byteIdx === byteCount) return false; var byte = byteArr[byteIdx]; byteIdx++; if (!bytesNeeded) { // 0x00 to 0x7F if ((byte & 0x80) === 0) { return byte; } // 0xC2 to 0xDF if ((byte & 0xe0) === 0xc0) { bytesNeeded = 1; codePoint = byte & 0x1f; } else if ((byte & 0xf0) === 0xe0) { // 0xE0 to 0xEF if (byte === 0xe0) lowerBoundary = 0xa0; if (byte === 0xed) upperBoundary = 0x9f; bytesNeeded = 2; codePoint = byte & 0xf; } else if ((byte & 0xf8) === 0xf0) { // 0xF0 to 0xF4 if (byte === 0xf0) lowerBoundary = 0x90; if (byte === 0xf4) upperBoundary = 0x8f; bytesNeeded = 3; codePoint = byte & 0x7; } else { if (safe) return goBack(); throw new Error('Invalid UTF-8 detected'); } continue; } if (byte < lowerBoundary || byte > upperBoundary) { if (safe) { byteIdx--; return goBack(); } throw new Error('Invalid continuation byte'); } lowerBoundary = 0x80; upperBoundary = 0xbf; codePoint = (codePoint << 6) | (byte & 0x3f); bytesSeen++; if (bytesSeen !== bytesNeeded) continue; var tmp = codePoint; codePoint = 0; bytesNeeded = 0; bytesSeen = 0; return tmp; } } function goBack() { var start = byteIdx - bytesSeen - 1; byteIdx = start + 1; codePoint = 0; bytesNeeded = 0; bytesSeen = 0; lowerBoundary = 0x80; upperBoundary = 0xbf; return byteArr[start]; } return exports; })({}); /* ------------------------------ decodeUriComponent ------------------------------ */ var decodeUriComponent = _.decodeUriComponent = (function (exports) { /* Better decodeURIComponent that does not throw if input is invalid. * * |Name |Desc | * |------|----------------| * |str |String to decode| * |return|Decoded string | */ /* example * decodeUriComponent('%%25%'); // -> '%%%' * decodeUriComponent('%E0%A4%A'); // -> '\xE0\xA4%A' */ /* typescript * export declare function decodeUriComponent(str: string): string; */ /* dependencies * each ucs2 map utf8 */ exports = function(str) { try { return decodeURIComponent(str); } catch (e) { var matches = str.match(regMatcher); if (!matches) { return str; } each(matches, function(match) { str = str.replace(match, decode(match)); }); return str; } }; function decode(str) { str = str.split('%').slice(1); var bytes = map(str, hexToInt); str = ucs2.encode(bytes); str = utf8.decode(str, true); return str; } function hexToInt(numStr) { return +('0x' + numStr); } var regMatcher = /(%[a-f0-9]{2})+/gi; return exports; })({}); /* ------------------------------ cookie ------------------------------ */ _.cookie = (function (exports) { /* Simple api for handling browser cookies. * * ### get * * Get cookie value. * * |Name |Desc | * |------|--------------------------| * |key |Cookie key | * |return|Corresponding cookie value| * * ### set * * Set cookie value. * * |Name |Desc | * |-------|--------------| * |key |Cookie key | * |val |Cookie value | * |options|Cookie options| * |return |Module cookie | * * ### remove * * Remove cookie value. * * |Name |Desc | * |-------|--------------| * |key |Cookie key | * |options|Cookie options| * |return |Module cookie | */ /* example * cookie.set('a', '1', { path: '/' }); * cookie.get('a'); // -> '1' * cookie.remove('a'); */ /* typescript * export declare namespace cookie { * interface IOptions { * path?: string; * expires?: number; * domain?: string; * secure?: boolean; * } * interface ICookie { * get(key: string, options?: cookie.IOptions): string; * set(key: string, val: string, options?: cookie.IOptions): ICookie; * remove(key: string, options?: cookie.IOptions): ICookie; * } * } * export declare const cookie: cookie.ICookie; */ /* dependencies * defaults isNum isUndef decodeUriComponent */ var defOpts = { path: '/' }; function setCookie(key, val, options) { if (!isUndef(val)) { options = options || {}; options = defaults(options, defOpts); if (isNum(options.expires)) { var expires = new Date(); expires.setMilliseconds( expires.getMilliseconds() + options.expires * 864e5 ); options.expires = expires; } val = encodeURIComponent(val); key = encodeURIComponent(key); document.cookie = [ key, '=', val, options.expires && '; expires=' + options.expires.toUTCString(), options.path && '; path=' + options.path, options.domain && '; domain=' + options.domain, options.secure ? '; secure' : '' ].join(''); return exports; } var cookies = document.cookie ? document.cookie.split('; ') : []; var result = key ? undefined : {}; for (var i = 0, len = cookies.length; i < len; i++) { var c = cookies[i]; var parts = c.split('='); var name = decodeUriComponent(parts.shift()); c = parts.join('='); c = decodeUriComponent(c); if (key === name) { result = c; break; } if (!key) result[name] = c; } return result; } exports = { get: setCookie, set: setCookie, remove: function(key, options) { options = options || {}; options.expires = -1; return setCookie(key, '', options); } }; return exports; })({}); /* ------------------------------ rtrim ------------------------------ */ var rtrim = _.rtrim = (function (exports) { /* Remove chars or white-spaces from end of string. * * |Name |Desc | * |------|------------------| * |str |String to trim | * |chars |Characters to trim| * |return|Trimmed string | */ /* example * rtrim(' abc '); // -> ' abc' * rtrim('_abc_', '_'); // -> '_abc' * rtrim('_abc_', ['c', '_']); // -> '_ab' */ /* typescript * export declare function rtrim(str: string, chars?: string | string[]): string; */ exports = function(str, chars) { if (chars == null) { if (str.trimRight) { return str.trimRight(); } chars = ' \r\n\t\f\v'; } var end = str.length - 1; var charLen = chars.length; var found = true; var i; var c; while (found && end >= 0) { found = false; i = -1; c = str.charAt(end); while (++i < charLen) { if (c === chars[i]) { found = true; end--; break; } } } return end >= 0 ? str.substring(0, end + 1) : ''; }; return exports; })({}); /* ------------------------------ trim ------------------------------ */ var trim = _.trim = (function (exports) { /* Remove chars or white-spaces from beginning end of string. * * |Name |Desc | * |------|------------------| * |str |String to trim | * |chars |Characters to trim| * |return|Trimmed string | */ /* example * trim(' abc '); // -> 'abc' * trim('_abc_', '_'); // -> 'abc' * trim('_abc_', ['a', 'c', '_']); // -> 'b' */ /* typescript * export declare function trim(str: string, chars?: string | string[]): string; */ /* dependencies * ltrim rtrim */ exports = function(str, chars) { if (chars == null && str.trim) { return str.trim(); } return ltrim(rtrim(str, chars), chars); }; return exports; })({}); /* ------------------------------ query ------------------------------ */ var query = _.query = (function (exports) { /* Parse and stringify url query strings. * * ### parse * * Parse a query string into an object. * * |Name |Desc | * |------|------------| * |str |Query string| * |return|Query object| * * ### stringify * * Stringify an object into a query string. * * |Name |Desc | * |------|------------| * |obj |Query object| * |return|Query string| */ /* example * query.parse('foo=bar&eruda=true'); // -> {foo: 'bar', eruda: 'true'} * query.stringify({ foo: 'bar', eruda: 'true' }); // -> 'foo=bar&eruda=true' * query.parse('name=eruda&name=eustia'); // -> {name: ['eruda', 'eustia']} */ /* typescript * export declare const query: { * parse(str: string): any; * stringify(object: any): string; * }; */ /* dependencies * trim each isUndef isArr map isEmpty filter isObj */ exports = { parse: function(str) { var ret = {}; str = trim(str).replace(regIllegalChars, ''); each(str.split('&'), function(param) { var parts = param.split('='); var key = parts.shift(), val = parts.length > 0 ? parts.join('=') : null; key = decodeURIComponent(key); val = decodeURIComponent(val); if (isUndef(ret[key])) { ret[key] = val; } else if (isArr(ret[key])) { ret[key].push(val); } else { ret[key] = [ret[key], val]; } }); return ret; }, stringify: function(obj, arrKey) { return filter( map(obj, function(val, key) { if (isObj(val) && isEmpty(val)) return ''; if (isArr(val)) return exports.stringify(val, key); return ( (arrKey ? encodeURIComponent(arrKey) : encodeURIComponent(key)) + '=' + encodeURIComponent(val) ); }), function(str) { return str.length > 0; } ).join('&'); } }; var regIllegalChars = /^(\?|#|&)/g; return exports; })({}); /* ------------------------------ ajax ------------------------------ */ _.ajax = (function (exports) { /* Perform an asynchronous HTTP request. * * |Name |Desc | * |-------|------------| * |options|Ajax options| * * Available options: * * |Name |Desc | * |---------------------------------------------|---------------------------| * |type=get |Request type | * |url |Request url | * |data |Request data | * |dataType=json |Response type(json, xml) | * |contentType=application/x-www-form-urlencoded|Request header Content-Type| * |success |Success callback | * |error |Error callback | * |complete |Callback after request | * |timeout |Request timeout | * * ### get * * Shortcut for type = GET; * * ### post * * Shortcut for type = POST; * * |Name |Desc | * |--------|----------------| * |url |Request url | * |data |Request data | * |success |Success callback| * |dataType|Response type | */ /* example * ajax({ * url: 'http://example.com', * data: { test: 'true' }, * error() {}, * success(data) { * // ... * }, * dataType: 'json' * }); * * ajax.get('http://example.com', {}, function(data) { * // ... * }); */ /* typescript * export declare namespace ajax { * function get( * url: string, * data: string | {}, * success: types.AnyFn, * dataType?: string * ): XMLHttpRequest; * function get( * url: string, * success: types.AnyFn, * dataType?: string * ): XMLHttpRequest; * function post( * url: string, * data: string | {}, * success: types.AnyFn, * dataType?: string * ): XMLHttpRequest; * function post( * url: string, * success: types.AnyFn, * dataType?: string * ): XMLHttpRequest; * } * export declare function ajax(options: { * type?: string; * url: string; * data?: string | {}; * dataType?: string; * contentType?: string; * success?: types.AnyFn; * error?: types.AnyFn; * complete?: types.AnyFn; * timeout?: number; * }): XMLHttpRequest; */ /* dependencies * isFn noop defaults isObj query types */ exports = function(options) { defaults(options, exports.setting); var type = options.type; var url = options.url; var data = options.data; var dataType = options.dataType; var success = options.success; var error = options.error; var timeout = options.timeout; var complete = options.complete; var xhr = options.xhr(); var abortTimeout; xhr.onreadystatechange = function() { if (xhr.readyState !== 4) return; clearTimeout(abortTimeout); var result; var status = xhr.status; if ((status >= 200 && status < 300) || status === 304) { result = xhr.responseText; if (dataType === 'xml') result = xhr.responseXML; try { if (dataType === 'json') result = JSON.parse(result); /* eslint-disable no-empty */ } catch (e) {} success(result, xhr); } else { error(xhr); } complete(xhr); }; if (type === 'GET') { data = query.stringify(data); if (data) url += url.indexOf('?') > -1 ? '&' + data : '?' + data; } else if (options.contentType === 'application/x-www-form-urlencoded') { if (isObj(data)) data = query.stringify(data); } else if (options.contentType === 'application/json') { if (isObj(data)) data = JSON.stringify(data); } xhr.open(type, url, true); xhr.setRequestHeader('Content-Type', options.contentType); if (timeout > 0) { abortTimeout = setTimeout(function() { xhr.onreadystatechange = noop; xhr.abort(); error(xhr, 'timeout'); complete(xhr); }, timeout); } xhr.send(type === 'GET' ? null : data); return xhr; }; exports.setting = { type: 'GET', success: noop, error: noop, complete: noop, dataType: 'json', contentType: 'application/x-www-form-urlencoded', data: {}, xhr: function() { return new XMLHttpRequest(); }, timeout: 0 }; exports.get = function() { return exports(parseArgs.apply(null, arguments)); }; exports.post = function() { var options = parseArgs.apply(null, arguments); options.type = 'POST'; return exports(options); }; function parseArgs(url, data, success, dataType) { if (isFn(data)) { dataType = success; success = data; data = {}; } return { url: url, data: data, success: success, dataType: dataType }; } return exports; })({}); /* ------------------------------ safeSet ------------------------------ */ var safeSet = _.safeSet = (function (exports) { /* Set value at path of object. * * If a portion of path doesn't exist, it's created. * * |Name|Desc | * |----|-----------------------| * |obj |Object to modify | * |path|Path of property to set| * |val |Value to set | */ /* example * const obj = {}; * safeSet(obj, 'a.aa.aaa', 1); // obj = {a: {aa: {aaa: 1}}} * safeSet(obj, ['a', 'aa'], 2); // obj = {a: {aa: 2}} * safeSet(obj, 'a.b', 3); // obj = {a: {aa: 2, b: 3}} */ /* typescript * export declare function safeSet( * obj: any, * path: string | string[], * val: any * ): void; */ /* dependencies * castPath isUndef toStr isSymbol isStr */ exports = function(obj, path, val) { path = castPath(path, obj); var lastProp = path.pop(); var prop; prop = path.shift(); while (!isUndef(prop)) { // #25 if (!isStr(prop) && !isSymbol(prop)) { prop = toStr(prop); } if ( prop === '__proto__' || prop === 'constructor' || prop === 'prototype' ) { return; } if (!obj[prop]) obj[prop] = {}; obj = obj[prop]; prop = path.shift(); } obj[lastProp] = val; }; return exports; })({}); /* ------------------------------ startWith ------------------------------ */ var startWith = _.startWith = (function (exports) { /* Check if string starts with the given target string. * * |Name |Desc | * |------|---------------------------------| * |str |String to search | * |prefix|String prefix | * |return|True if string starts with prefix| */ /* example * startWith('ab', 'a'); // -> true */ /* typescript * export declare function startWith(str: string, prefix: string): boolean; */ exports = function(str, prefix) { return str.indexOf(prefix) === 0; }; return exports; })({}); /* ------------------------------ type ------------------------------ */ var type = _.type = (function (exports) { /* Determine the internal JavaScript [[Class]] of an object. * * |Name |Desc | * |--------------|-----------------| * |val |Value to get type| * |lowerCase=true|LowerCase result | * |return |Type of object | */ /* example * type(5); // -> 'number' * type({}); // -> 'object' * type(function() {}); // -> 'function' * type([]); // -> 'array' * type([], false); // -> 'Array' * type(async function() {}, false); // -> 'AsyncFunction' */ /* typescript * export declare function type(val: any, lowerCase?: boolean): string; */ /* dependencies * objToStr isNaN lowerCase isBuffer */ exports = function(val) { var lower = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var ret; if (val === null) ret = 'Null'; if (val === undefined) ret = 'Undefined'; if (isNaN(val)) ret = 'NaN'; if (isBuffer(val)) ret = 'Buffer'; if (!ret) { ret = objToStr(val).match(regObj); if (ret) ret = ret[1]; } if (!ret) return ''; return lower ? lowerCase(ret) : ret; }; var regObj = /^\[object\s+(.*?)]$/; return exports; })({}); /* ------------------------------ toSrc ------------------------------ */ var toSrc = _.toSrc = (function (exports) { /* Convert function to its source code. * * |Name |Desc | * |------|-------------------| * |fn |Function to convert| * |return|Source code | */ /* example * toSrc(Math.min); // -> 'function min() { [native code] }' * toSrc(function() {}); // -> 'function () { }' */ /* typescript * export declare function toSrc(fn: types.AnyFn): string; */ /* dependencies * isNil types */ exports = function(fn) { if (isNil(fn)) return ''; try { return fnToStr.call(fn); /* eslint-disable no-empty */ } catch (e) {} try { return fn + ''; /* eslint-disable no-empty */ } catch (e) {} return ''; }; var fnToStr = Function.prototype.toString; return exports; })({}); /* ------------------------------ stringifyAll ------------------------------ */ _.stringifyAll = (function (exports) { /* Stringify object into json with types. * * |Name |Desc | * |-------|-------------------| * |obj |Object to stringify| * |options|Stringify options | * |return |Stringified object | * * Available options: * * |Name |Desc | * |------------------|-------------------------| * |unenumerable=false|Include unenumerable keys| * |symbol=false |Include symbol keys | * |accessGetter=false|Access getter value | * |timeout=0 |Timeout of stringify | * |depth=0 |Max depth of recursion | * |ignore |Values to ignore | * * When time is out, all remaining values will all be "Timeout". * * ### parse * * Parse result string back to object. * * |Name |Type | * |------|---------------| * |obj |String to parse| * |return|Result object | */ /* example * stringifyAll(function test() {}); // -> '{"value":"function test() {}","type":"Function",...}' */ /* typescript * export declare namespace stringifyAll { * function parse(str: string): any; * } * export declare function stringifyAll( * obj: any, * options?: { * unenumerable?: boolean; * symbol?: boolean; * accessGetter?: boolean; * timeout?: number; * depth?: number; * ignore?: any[]; * } * ): string; */ /* dependencies * escapeJsStr type toStr endWith toSrc keys each Class getProto difference extend isPromise filter now allKeys contain isObj isMiniProgram create startWith safeSet defineProp pick isArrLike */ exports = function(obj) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, self = _ref.self, _ref$startTime = _ref.startTime, startTime = _ref$startTime === void 0 ? now() : _ref$startTime, _ref$timeout = _ref.timeout, timeout = _ref$timeout === void 0 ? 0 : _ref$timeout, _ref$depth = _ref.depth, depth = _ref$depth === void 0 ? 0 : _ref$depth, _ref$curDepth = _ref.curDepth, curDepth = _ref$curDepth === void 0 ? 1 : _ref$curDepth, _ref$visitor = _ref.visitor, visitor = _ref$visitor === void 0 ? new Visitor() : _ref$visitor, _ref$unenumerable = _ref.unenumerable, unenumerable = _ref$unenumerable === void 0 ? false : _ref$unenumerable, _ref$symbol = _ref.symbol, symbol = _ref$symbol === void 0 ? false : _ref$symbol, _ref$accessGetter = _ref.accessGetter, accessGetter = _ref$accessGetter === void 0 ? false : _ref$accessGetter, _ref$ignore = _ref.ignore, ignore = _ref$ignore === void 0 ? [] : _ref$ignore; var json = ''; var options = { visitor: visitor, unenumerable: unenumerable, symbol: symbol, accessGetter: accessGetter, depth: depth, curDepth: curDepth + 1, timeout: timeout, startTime: startTime, ignore: ignore }; var t = type(obj, false); if (t === 'String') { json = wrapStr(obj); } else if (t === 'Number') { json = toStr(obj); if (endWith(json, 'Infinity')) { json = '{"value":"'.concat(json, '","type":"Number"}'); } } else if (t === 'NaN') { json = '{"value":"NaN","type":"Number"}'; } else if (t === 'Boolean') { json = obj ? 'true' : 'false'; } else if (t === 'Null') { json = 'null'; } else if (t === 'Undefined') { json = '{"type":"Undefined"}'; } else if (t === 'Symbol') { var val = 'Symbol'; try { val = toStr(obj); /* eslint-disable no-empty */ } catch (e) {} json = '{"value":'.concat(wrapStr(val), ',"type":"Symbol"}'); } else { if (timeout && now() - startTime > timeout) { return wrapStr('Timeout'); } if (depth && curDepth > depth) { return wrapStr('{...}'); } json = '{'; var parts = []; var visitedObj = visitor.get(obj); var id; if (visitedObj) { id = visitedObj.id; parts.push('"reference":'.concat(id)); } else { id = visitor.set(obj); parts.push('"id":'.concat(id)); } parts.push('"type":"'.concat(t, '"')); if (endWith(t, 'Function')) { parts.push('"value":'.concat(wrapStr(toSrc(obj)))); } else if (t === 'RegExp') { parts.push('"value":'.concat(wrapStr(obj))); } if (!visitedObj) { var enumerableKeys = keys(obj); if (enumerableKeys.length) { parts.push( iterateObj( 'enumerable', enumerableKeys, self || obj, options ) ); } if (unenumerable) { var unenumerableKeys = difference( allKeys(obj, { prototype: false, unenumerable: true }), enumerableKeys ); if (unenumerableKeys.length) { parts.push( iterateObj( 'unenumerable', unenumerableKeys, self || obj, options ) ); } } if (symbol) { var symbolKeys = filter( allKeys(obj, { prototype: false, symbol: true }), function(key) { return typeof key === 'symbol'; } ); if (symbolKeys.length) { parts.push( iterateObj('symbol', symbolKeys, self || obj, options) ); } } var prototype = getProto(obj); if (prototype && !contain(ignore, prototype)) { var proto = '"proto":'.concat( exports( prototype, extend(options, { self: self || obj }) ) ); parts.push(proto); } } json += parts.join(',') + '}'; } return json; }; function iterateObj(name, keys, obj, options) { var parts = []; each(keys, function(key) { var val; var descriptor = Object.getOwnPropertyDescriptor(obj, key); var hasGetter = descriptor && descriptor.get; var hasSetter = descriptor && descriptor.set; if (!options.accessGetter && hasGetter) { val = '(...)'; } else { try { val = obj[key]; if (contain(options.ignore, val)) { return; } if (isPromise(val)) { val.catch(function() {}); } } catch (e) { val = e.message; } } parts.push(''.concat(wrapKey(key), ':').concat(exports(val, options))); if (hasGetter) { parts.push( '' .concat(wrapKey('get ' + toStr(key)), ':') .concat(exports(descriptor.get, options)) ); } if (hasSetter) { parts.push( '' .concat(wrapKey('set ' + toStr(key)), ':') .concat(exports(descriptor.set, options)) ); } }); return '"'.concat(name, '":{') + parts.join(',') + '}'; } function wrapKey(key) { return '"'.concat(escapeJsonStr(key), '"'); } function wrapStr(str) { return '"'.concat(escapeJsonStr(toStr(str)), '"'); } function escapeJsonStr(str) { return escapeJsStr(str) .replace(/\\'/g, "'") .replace(/\t/g, '\\t'); } var Visitor = Class({ initialize: function() { this.id = 1; this.visited = []; }, set: function(val) { var visited = this.visited, id = this.id; var obj = { id: id, val: val }; visited.push(obj); this.id++; return id; }, get: function(val) { var visited = this.visited; for (var i = 0, len = visited.length; i < len; i++) { var obj = visited[i]; if (val === obj.val) return obj; } return false; } }); exports.parse = function(str) { var map = {}; var obj = parse(JSON.parse(str), { map: map }); correctReference(map); return obj; }; function correctReference(map) { each(map, function(obj) { var enumerableKeys = keys(obj); for (var i = 0, len = enumerableKeys.length; i < len; i++) { var key = enumerableKeys[i]; if (isObj(obj[key])) { var reference = obj[key].reference; if (reference && map[reference]) { obj[key] = map[reference]; } } } var proto = getProto(obj); if (proto && proto.reference) { if (map[proto.reference]) { Object.setPrototypeOf(obj, map[proto.reference]); } } }); } function parse(obj, options) { var map = options.map; if (!isObj(obj)) { return obj; } var id = obj.id, type = obj.type, value = obj.value, proto = obj.proto, reference = obj.reference; var enumerable = obj.enumerable, unenumerable = obj.unenumerable; if (reference) { return obj; } if (type === 'Number') { if (value === 'Infinity') { return Number.POSITIVE_INFINITY; } else if (value === '-Infinity') { return Number.NEGATIVE_INFINITY; } return NaN; } else if (type === 'Undefined') { return undefined; } var newObj; if (type === 'Function') { newObj = function() {}; newObj.toString = function() { return value; }; if (proto) { Object.setPrototypeOf(newObj, parse(proto, options)); } } else if (type === 'RegExp') { newObj = strToRegExp(value); } else { if (type !== 'Object') { var Fn; if (!isMiniProgram) { Fn = new Function(type, ''); } else { Fn = function() {}; } if (proto) { Fn.prototype = parse(proto, options); } newObj = new Fn(); } else { if (proto) { newObj = create(parse(proto, options)); } else { newObj = create(null); } } } var defineProps = {}; if (enumerable) { var len; if (isArrLike(enumerable)) { len = enumerable.length; delete enumerable.length; } enumerable = pick(enumerable, function(value, key) { return !handleGetterSetter(enumerable, value, key); }); each(enumerable, function(value, key) { var defineProp = defineProps[key] || {}; if (!defineProp.get) { newObj[key] = parse(value, options); } }); if (len) { newObj.length = len; } } if (unenumerable) { unenumerable = pick(unenumerable, function(value, key) { return !handleGetterSetter(unenumerable, value, key); }); each(unenumerable, function(value, key) { var defineProp = defineProps[key] || {}; if (!defineProp.get) { value = parse(value, options); if (isObj(value) && value.reference) { var _reference = value.reference; value = function() { return map[_reference]; }; defineProp.get = value; } else { defineProp.value = value; } } defineProp.enumerable = false; defineProps[key] = defineProp; }); } defineProp(newObj, defineProps); function handleGetterSetter(obj, val, key) { key = toStr(key); var isGetterAndSetter = false; each(['get', 'set'], function(type) { if (startWith(key, type + ' ')) { var realKey = key.replace(type + ' ', ''); if (obj[realKey]) { val = parse(val, options); if (val === 'Timeout') { val = retTimeout; } safeSet(defineProps, [realKey, type], val); isGetterAndSetter = true; } } }); return isGetterAndSetter; } map[id] = newObj; return newObj; } function retTimeout() { return 'Timeout'; } function strToRegExp(str) { var lastSlash = str.lastIndexOf('/'); return new RegExp(str.slice(1, lastSlash), str.slice(lastSlash + 1)); } return exports; })({}); /* ------------------------------ toEl ------------------------------ */ _.toEl = (function (exports) { /* Convert html string to dom elements. * * There should be only one root element. * * |Name |Desc | * |------|------------| * |str |Html string | * |return|Html element| */ /* example * toEl('
test
'); */ /* typescript * export declare function toEl(str: string): Element; */ var doc = document; exports = function(str) { var fragment = doc.createElement('body'); fragment.innerHTML = str; return fragment.childNodes[0]; }; if (doc.createRange && doc.body) { var range = doc.createRange(); range.selectNode(doc.body); if (range.createContextualFragment) { exports = function(str) { return range.createContextualFragment(str).childNodes[0]; }; } } return exports; })({}); return _; }));