UNPKG

cube-ui

Version:

A fantastic mobile ui lib implement by Vue

223 lines (204 loc) 4.63 kB
import { camelize } from '../lang/string' function findIndex(ary, fn) { if (ary.findIndex) { return ary.findIndex(fn) } /* istanbul ignore next */ let index = -1 /* istanbul ignore next */ ary.some(function (item, i, ary) { const ret = fn.call(this, item, i, ary) if (ret) { index = i return ret } }) /* istanbul ignore next */ return index } function deepAssign(to, from) { for (let key in from) { if (!to[key] || typeof to[key] !== 'object') { to[key] = from[key] } else { deepAssign(to[key], from[key]) } } } function createAddAPI(baseObj) { return function add(...args) { if (typeof args[0] === 'string') { args[0] = { [args[0]]: args[1] } } deepAssign(baseObj, args[0]) } } function judgeTypeFnCreator (type) { const toString = Object.prototype.toString return function isType (o) { return toString.call(o) === `[object ${type}]` } } const typesReset = { _set(obj, key, value) { obj[key] = value }, string(obj, key) { typesReset._set(obj, key, '') }, number(obj, key) { typesReset._set(obj, key, 0) }, boolean(obj, key) { typesReset._set(obj, key, false) }, object(obj, key, value) { if (Array.isArray(value)) { typesReset._set(obj, key, []) } else { typesReset._set(obj, key, {}) } } } function resetTypeValue(obj, key, defVal) { if (defVal !== undefined) { return typesReset._set(obj, key, defVal) } if (key) { const value = obj[key] const resetHandler = typesReset[typeof value] resetHandler && resetHandler(obj, key, value) } else { Object.keys(obj).forEach((key) => { resetTypeValue(obj, key) }) } } function parallel(tasks, cb) { let doneCount = 0 let results = [] const tasksLen = tasks.length if (!tasksLen) { return cb(results) } tasks.forEach((task, i) => { task((ret) => { doneCount += 1 results[i] = ret if (doneCount === tasksLen) { // all tasks done cb(results) } }) }) } function cb2PromiseWithResolve(cb) { let promise if (typeof window.Promise !== 'undefined') { const _cb = cb promise = new window.Promise((resolve) => { cb = (data) => { _cb && _cb(data) resolve(data) } }) promise.resolve = cb } return promise } function debounce(func, wait, immediate, initValue) { let timeout let result = initValue const later = function (context, args) { timeout = null if (args) { result = func.apply(context, args) } } const debounced = function (...args) { if (timeout) { clearTimeout(timeout) } if (immediate) { const callNow = !timeout timeout = setTimeout(later, wait) if (callNow) { result = func.apply(this, args) } } else { timeout = setTimeout(() => { later(this, args) }, wait) } return result } debounced.cancel = function () { clearTimeout(timeout) timeout = null } return debounced } function processComponentName(Component, { prefix = '', firstUpperCase = false } = {}) { const name = Component.name const pureName = name.replace(/^cube-/i, '') let camelizeName = `${camelize(`${prefix}${pureName}`)}` /* istanbul ignore if */ if (firstUpperCase) { camelizeName = camelizeName.charAt(0).toUpperCase() + camelizeName.slice(1) } return camelizeName } function parsePath (obj, path = '') { const segments = path.split('.') let result = obj for (let i = 0; i < segments.length; i++) { const key = segments[i] /* istanbul ignore if */ if (isUndef(result[key])) { result = '' break } else { result = result[key] } } return result } function getIOSVersion(ua) { const regex = /os (\d\d?_\d(_\d)?)/ const matches = regex.exec(ua) if (!matches) return null const parts = matches[1].split('_').map(function(item) { return parseInt(item, 10) }) return { major: parts[0], minor: parts[1], patch: parts[2] || 0 } } const isFunc = judgeTypeFnCreator('Function') const isUndef = judgeTypeFnCreator('Undefined') const isArray = judgeTypeFnCreator('Array') const isString = judgeTypeFnCreator('String') const isObject = judgeTypeFnCreator('Object') const isNumber = judgeTypeFnCreator('Number') export { findIndex, deepAssign, createAddAPI, resetTypeValue, parallel, cb2PromiseWithResolve, debounce, processComponentName, parsePath, isUndef, isFunc, isArray, isString, isObject, isNumber, getIOSVersion }