UNPKG

lazy-js-utils

Version:

A collection of lazy-loaded JavaScript utilities for efficient development

1,097 lines (1,034 loc) 23 kB
"use strict"; const require_chunk = require('./chunk-BCwAaXi7.cjs'); const require_isBool = require('./isBool-B9jCuCG_.cjs'); const node_process = require_chunk.__toESM(require("node:process")); const node_fs = require_chunk.__toESM(require("node:fs")); //#region src/is/isUndef.ts /** * 判断是否是undefined */ function isUndef(o) { return typeof o === "undefined"; } //#endregion //#region src/is/isDef.ts /** * 判断元素不是undefined * @param v * @returns */ function isDef(v) { return typeof v !== "undefined"; } //#endregion //#region src/is/isFn.ts /** * 判读是否是函数 * @param o * @returns */ function isFn(o) { return typeof o === "function"; } //#endregion //#region src/utils/common.ts const _toString = Object.prototype.toString; const ESM_STATIC_IMPORT_RE = /(?<=\s|^|;)import\s*(["'\s]*(?<imports>[\w*${}\n\r\t, /]+)from\s*)?["']\s*(?<specifier>(?<=")[^"]*[^"\s](?=\s*")|(?<=')[^']*[^'\s](?=\s*'))\s*["'][\s;]*/gm; const DYNAMIC_IMPORT_RE = /import\s*\((?<expression>(?:[^)(]|\((?:[^)(]|\([^)(]*\))*\))*)\)/g; const EXPORT_DECAL_RE = /\bexport\s+(?<declaration>(async function|function|let|const|var|class))\s+(?<name>[\w$]+)/g; const EXPORT_NAMED_RE = /\bexport\s+\{(?<exports>[^}]+)\}(\s*from\s*["']\s*(?<specifier>(?<=")[^"]*[^"\s](?=\s*")|(?<=')[^']*[^'\s](?=\s*'))\s*["'][^\n]*)?/g; const EXPORT_STAR_RE = /\bexport\s*(\*)(\s*as\s+(?<name>[\w$]+)\s+)?\s*(\s*from\s*["']\s*(?<specifier>(?<=")[^"]*[^"\s](?=\s*")|(?<=')[^']*[^'\s](?=\s*'))\s*["'][^\n]*)?/g; const EXPORT_DEFAULT_RE = /\bexport\s+default\s+/g; //#endregion //#region src/is/isPlainObject.ts /** * 判断是否是{}类型 */ function isPlainObject(o) { return _toString.call(o) === "[object Object]"; } //#endregion //#region src/is/isSet.ts /** * 判断是否是Set */ function isSet(o) { return _toString.call(o) === "[object Set]"; } //#endregion //#region src/is/isMap.ts /** * 判断是否是Map */ function isMap(o) { return _toString.call(o) === "[object Map]"; } //#endregion //#region src/is/isReg.ts /** * 判断是否是正则 */ function isReg(o) { return typeof o === "object" && o.constructor === RegExp; } //#endregion //#region src/is/isNaN.ts /** * 判断是否是NaN */ function isNaN(o) { return Number.isNaN(o); } //#endregion //#region src/is/isSymbol.ts /** * 判断是否是symbol类型 */ function isSymbol(o) { return typeof o === "symbol"; } //#endregion //#region src/is/isNum.ts /** * 判断是否是number类型 */ function isNum(o) { return typeof o === "number"; } //#endregion //#region src/is/isPromise.ts /** * 判断是否是promise */ function isPromise(o) { return _toString.call(o) === "[object Promise]"; } //#endregion //#region src/is/isDate.ts /** * 判断是否是日期格式 * @param d * @returns */ function isDate(d) { return d instanceof Date; } //#endregion //#region src/is/isWeakMap.ts /** * 判断是否是WeakMap */ function isWeakMap(o) { return _toString.call(o) === "[object WeakMap]"; } //#endregion //#region src/is/isWeakSet.ts /** * 判断是否是WeakSet */ function isWeakSet(o) { return _toString.call(o) === "[object WeakSet]"; } //#endregion //#region src/is/isType.ts /** * 判断对象类型 */ function isType(s, type) { type = type.toLocaleLowerCase(); if (!type) throw new Error("type is required"); const types = { str: require_isBool.isStr, s: require_isBool.isStr, string: require_isBool.isStr, fn: isFn, f: isFn, function: isFn, object: isPlainObject, o: isPlainObject, array: require_isBool.isArray, a: require_isBool.isArray, set: isSet, map: isMap, m: isMap, reg: isReg, r: isReg, b: require_isBool.isBool, boolean: require_isBool.isBool, n: isNum, number: isNum, u: isUndef, undefined: isUndef, null: require_isBool.isNull, symbol: isSymbol, nan: isNaN, wm: isWeakMap, ws: isWeakSet, promise: isPromise, weakmap: isWeakMap, weakset: isWeakSet, date: isDate }; return type.split("|").some((item) => { var _types$item$trim; return (_types$item$trim = types[item.trim()]) === null || _types$item$trim === void 0 ? void 0 : _types$item$trim.call(types, s); }); } //#endregion //#region src/is/isVideo.ts const videoExtension = [ "3g2", "3gp", "aaf", "asf", "avchd", "avi", "drc", "flv", "m2v", "m3u8", "m4p", "m4v", "mkv", "mng", "mov", "mp2", "mp4", "mpe", "mpeg", "mpg", "mpv", "mxf", "nsv", "ogg", "ogv", "qt", "rm", "rmvb", "roq", "svi", "vob", "webm", "wmv", "yuv" ]; /** * 判断是否是video */ function isVideo(filepath) { const last = filepath.lastIndexOf(".") + 1; return videoExtension.includes(filepath.slice(last, filepath.length).toLowerCase()); } //#endregion //#region src/is/isAbsolute.ts /** * 判断是否是绝对路径 * @param url * @returns */ function isAbsolute(url) { return /^\/|^\\|^[a-z]:[/\\]/i.test(url); } //#endregion //#region src/is/isBlob.ts /** * 判断是否是blob * @param o * @returns */ function isBlob(o) { return _toString.call(o) === "[object Blob]"; } //#endregion //#region src/is/isBottom.ts /** * 判断滚动条到达窗口底部 * @param distance * @returns */ function isBottom(distance = 0) { try { return document.documentElement.clientHeight + window.scrollY + distance >= (document.documentElement.scrollHeight || document.documentElement.clientHeight); } catch (error) { throw new Error(error); } } //#endregion //#region src/is/isBrowser.ts var _globalThis; const isBrowser = isDef((_globalThis = globalThis) === null || _globalThis === void 0 ? void 0 : _globalThis.window); //#endregion //#region src/is/isContainCn.ts /** * 判断是否包含中文 * @param s * @returns */ function isContainCn(s) { return /[\u4E00-\u9FA5]/.test(s); } //#endregion //#region src/is/isElement.ts /** * 判断元素是HTMLElement * @param element * @returns */ function isElement(element) { return typeof element === "object" && element instanceof HTMLElement; } //#endregion //#region src/is/isEqual.ts /** * 判断2个对象是否相等 * @param { any } o1 对象1 * @param { any } o2 对象2 * @returns */ function isEqual(o1, o2) { if (o1 === o2) return true; if (isPlainObject(o1) && isPlainObject(o2)) { const keys1 = Object.keys(o1); const keys2 = Object.keys(o2); if (keys1.length !== keys2.length) return false; for (const key of keys1) { const res = isEqual(o1[key], o2[key]); if (!res) return false; } return true; } else if (require_isBool.isArray(o1) && require_isBool.isArray(o2)) { if (o1.length !== o2.length) return false; for (let i = 0; i < o1.length; i++) { const res = isEqual(o1[i], o2[i]); if (!res) return false; } return true; } return false; } //#endregion //#region src/is/isEsModule.ts /** * 判断对象是ESModule * @param obj * @returns */ function isESModule(obj) { return obj.__esModule || obj[Symbol.toStringTag] === "Module"; } //#endregion //#region src/is/isFalse.ts /** * 判断是否是false * @param v * @returns */ function isFalse(v) { return v === false; } //#endregion //#region src/is/isFileType.ts /** * 判断文件类型 * @param { string } file 文件路径 * @param { string } appendix 文件类型 * @returns */ function isFileType(file, appendix) { const reg = new RegExp(`\\.${appendix}(\\?[^.]+)?$`); return reg.test(file); } //#endregion //#region src/is/isIPv4.ts /** * 判断是否是ipv4 * @param ip * @returns */ function isIPv4(ip) { return /^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$/.test(ip); } //#endregion //#region src/is/isIPv6.ts /** * 判断是否是ipv6 */ function isIPv6(ip) { return /^([\da-f]{1,4}:){6}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^::([\da-f]{1,4}:){0,4}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-f]{1,4}:):([\da-f]{1,4}:){0,3}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-f]{1,4}:){2}:([\da-f]{1,4}:){0,2}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-f]{1,4}:){3}:([\da-f]{1,4}:)?((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-f]{1,4}:){4}:((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-f]{1,4}:){7}[\da-f]{1,4}$|^:((:[\da-f]{1,4}){1,6}|:)$|^[\da-f]{1,4}:((:[\da-f]{1,4}){1,5}|:)$|^([\da-f]{1,4}:){2}((:[\da-f]{1,4}){1,4}|:)$|^([\da-f]{1,4}:){3}((:[\da-f]{1,4}){1,3}|:)$|^([\da-f]{1,4}:){4}((:[\da-f]{1,4}){1,2}|:)$|^([\da-f]{1,4}:){5}:([\da-f]{1,4})?$|^([\da-f]{1,4}:){6}:$/i.test(ip); } //#endregion //#region src/is/isIdCard.ts /** * 判断是否是身份证 * @param s * @returns */ function isIdCard(s) { return /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|12]\d)|3[01])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|12]\d)|3[01])\d{3}([0-9X])$/.test(s); } //#endregion //#region src/is/isLeapYear.ts /** * 判断是否是闰年 */ function isLeapYear(year) { return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0; } //#endregion //#region src/is/isMobile.ts /** * 判断是否是手机号 */ function isMobile(s) { return /^((13\d)|(14[5-9])|(15([0-35-9]))|(16[67])|(17[1-8])|(18\d)|(19[1|3])|(19[5|6])|(19[8|9]))\d{8}$/.test(s); } //#endregion //#region src/is/isNil.ts /** * 判断是否是null或undefined */ function isNil(value) { return value === null || value === void 0; } //#endregion //#region src/is/isObject.ts /** * 判断是否是对象 */ function isObject(value) { return typeof value === "object"; } //#endregion //#region src/is/isPostCode.ts /** * 判断是否是邮编 */ function isPostCode(s) { return /^[1-9]\d{5}$/.test(s.toString()); } //#endregion //#region src/is/isRelative.ts /** * 判断是否是相对路径 */ function isRelative(str) { return /^(\.\.\/|\.\/)/.test(str); } //#endregion //#region src/is/isSameDay.ts /** * 判断是否是同一天 * @param { Date } dateLeft 日期一 * @param { Date } dateRight 日期二 */ function isSameDay(dateLeft, dateRight) { return dateLeft.getFullYear() === dateRight.getFullYear() && dateLeft.getMonth() === dateRight.getMonth() && dateLeft.getDate() === dateRight.getDate(); } //#endregion //#region src/is/isSupportCamera.ts /** * 判断是否支持调用摄像头 */ function isSupportCamera() { return !!(navigator && (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia)); } //#endregion //#region src/is/isSupportWebp.ts /** * 判断是否支持webp格式 */ function isSupportWebp() { try { return document.createElement("canvas").toDataURL("image/webp").indexOf("data:image/webp") === 0; } catch (error) { return false; } } //#endregion //#region src/is/isTrue.ts /** * 判断是否是true */ function isTrue(v) { return v === true; } //#endregion //#region src/is/isUrl.ts /** * 判断是否是url */ function isUrl(url) { return /^https?:\/\/.*/.test(url); } //#endregion //#region src/is/isWin.ts /** * 判断是windows电脑 */ function isWin() { return node_process.default.platform === "win32"; } //#endregion //#region src/is/isSocketUrl.ts /** * 判断是否是websocket地址 */ function isSocketUrl(url) { return url.startsWith("ws://") || url.startsWith("wss://"); } //#endregion //#region src/is/isBase64.ts /** * 判断是否是base64格式 * @param { string } base64 * @returns */ function isBase64(base64) { return /^\s*data:(?:[a-z]+\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([\w!$&',()*+;=\-.~:@/?%\s]*?)\s*/i.test(base64); } //#endregion //#region src/is/isTrainNumber.ts /** * 判断是否是火车号 */ const isTrainNumber = (s) => /^[GCDZTSPKXLY1-9]\d{1,4}$/.test(s); //#endregion //#region src/is/isNameCn.ts /** * 判断输入的是中文 */ const isNameCn = (s) => /^[\u4E00-\u9FA5·]{2,16}$/.test(s); //#endregion //#region src/is/isNameEn.ts /** * 判断输入的是否是英文 */ function isNameEn(s) { return /(^[a-z][a-z\s]{0,20}[a-z]$)/i.test(s); } //#endregion //#region src/is/isSoldierId.ts /** * 判断是否是军官证 */ function isSoldierId(s) { return /^[\u4E00-\u9FA5](字第)([0-9a-z]{4,8})(号?)$/i.test(s); } //#endregion //#region src/is/isVersion.ts const NUM = /^\d+$/; /** * 判断是否是版本号 */ function isVersion(version) { return version.split(".").every((v) => NUM.test(v)); } //#endregion //#region src/is/isDivElement.ts function isDivElement(target) { var _tagName; return (target === null || target === void 0 || (_tagName = target.tagName) === null || _tagName === void 0 ? void 0 : _tagName.toUpperCase()) === "DIV"; } //#endregion //#region src/is/isIFrameElement.ts function isIFrameElement(target) { var _tagName; return (target === null || target === void 0 || (_tagName = target.tagName) === null || _tagName === void 0 ? void 0 : _tagName.toUpperCase()) === "IFRAME"; } //#endregion //#region src/is/isImageElement.ts function isImageElement(target) { var _tagName; return (target === null || target === void 0 || (_tagName = target.tagName) === null || _tagName === void 0 ? void 0 : _tagName.toUpperCase()) === "IMG"; } //#endregion //#region src/is/isNode.ts function isNode(target) { return target instanceof Node || isNum(target === null || target === void 0 ? void 0 : target.nodeType); } //#endregion //#region src/is/isProxyDocument.ts function isProxyDocument(target) { return toString.call(target) === "[object ProxyDocument]"; } //#endregion //#region src/is/isScriptElement.ts function isScriptElement(target) { var _tagName; return (target === null || target === void 0 || (_tagName = target.tagName) === null || _tagName === void 0 ? void 0 : _tagName.toUpperCase()) === "SCRIPT"; } //#endregion //#region src/is/isShadowRoot.ts function isShadowRoot(target) { return typeof ShadowRoot !== "undefined" && target instanceof ShadowRoot; } //#endregion //#region src/is/isStyleElement.ts function isStyleElement(target) { var _tagName; return (target === null || target === void 0 || (_tagName = target.tagName) === null || _tagName === void 0 ? void 0 : _tagName.toUpperCase()) === "STYLE"; } //#endregion //#region src/is/isVue.ts /** * 判断文件是不是.vue * @param { string } src 文件路径 * @returns */ function isVue(src) { return src.endsWith(".vue"); } //#endregion //#region src/is/isComment.ts /** * 判断是否是<! -- xxx -->注释 * @param { string } s 字符串 * @returns */ function isComment(s) { return /<! -{2}.*?-{2}>/.test(s); } //#endregion //#region src/is/isActive.ts /** * 判断当前页面是否处于活跃状态 * @returns */ function isActive() { return !document.hidden; } //#endregion //#region src/is/isFile.ts /** * 判断是否是文件 * @param o * @returns */ function isFile(o) { if (require_isBool.isStr(o)) try { return node_fs.default.statSync(o).isFile(); } catch (error) { return false; } return _toString.call(o) === "[object File]"; } //#endregion //#region src/js/parallel.ts /** * 并行执行 * @param { any[] } tasks 数组 * @param { (...args: any[]) => any } fn 函数 * @returns */ function parallel(tasks, fn) { return Promise.all(tasks.map(fn)); } //#endregion Object.defineProperty(exports, 'DYNAMIC_IMPORT_RE', { enumerable: true, get: function () { return DYNAMIC_IMPORT_RE; } }); Object.defineProperty(exports, 'ESM_STATIC_IMPORT_RE', { enumerable: true, get: function () { return ESM_STATIC_IMPORT_RE; } }); Object.defineProperty(exports, 'EXPORT_DECAL_RE', { enumerable: true, get: function () { return EXPORT_DECAL_RE; } }); Object.defineProperty(exports, 'EXPORT_DEFAULT_RE', { enumerable: true, get: function () { return EXPORT_DEFAULT_RE; } }); Object.defineProperty(exports, 'EXPORT_NAMED_RE', { enumerable: true, get: function () { return EXPORT_NAMED_RE; } }); Object.defineProperty(exports, 'EXPORT_STAR_RE', { enumerable: true, get: function () { return EXPORT_STAR_RE; } }); Object.defineProperty(exports, '_toString', { enumerable: true, get: function () { return _toString; } }); Object.defineProperty(exports, 'isAbsolute', { enumerable: true, get: function () { return isAbsolute; } }); Object.defineProperty(exports, 'isActive', { enumerable: true, get: function () { return isActive; } }); Object.defineProperty(exports, 'isBase64', { enumerable: true, get: function () { return isBase64; } }); Object.defineProperty(exports, 'isBlob', { enumerable: true, get: function () { return isBlob; } }); Object.defineProperty(exports, 'isBottom', { enumerable: true, get: function () { return isBottom; } }); Object.defineProperty(exports, 'isBrowser', { enumerable: true, get: function () { return isBrowser; } }); Object.defineProperty(exports, 'isComment', { enumerable: true, get: function () { return isComment; } }); Object.defineProperty(exports, 'isContainCn', { enumerable: true, get: function () { return isContainCn; } }); Object.defineProperty(exports, 'isDate', { enumerable: true, get: function () { return isDate; } }); Object.defineProperty(exports, 'isDef', { enumerable: true, get: function () { return isDef; } }); Object.defineProperty(exports, 'isDivElement', { enumerable: true, get: function () { return isDivElement; } }); Object.defineProperty(exports, 'isESModule', { enumerable: true, get: function () { return isESModule; } }); Object.defineProperty(exports, 'isElement', { enumerable: true, get: function () { return isElement; } }); Object.defineProperty(exports, 'isEqual', { enumerable: true, get: function () { return isEqual; } }); Object.defineProperty(exports, 'isFalse', { enumerable: true, get: function () { return isFalse; } }); Object.defineProperty(exports, 'isFile', { enumerable: true, get: function () { return isFile; } }); Object.defineProperty(exports, 'isFileType', { enumerable: true, get: function () { return isFileType; } }); Object.defineProperty(exports, 'isFn', { enumerable: true, get: function () { return isFn; } }); Object.defineProperty(exports, 'isIFrameElement', { enumerable: true, get: function () { return isIFrameElement; } }); Object.defineProperty(exports, 'isIPv4', { enumerable: true, get: function () { return isIPv4; } }); Object.defineProperty(exports, 'isIPv6', { enumerable: true, get: function () { return isIPv6; } }); Object.defineProperty(exports, 'isIdCard', { enumerable: true, get: function () { return isIdCard; } }); Object.defineProperty(exports, 'isImageElement', { enumerable: true, get: function () { return isImageElement; } }); Object.defineProperty(exports, 'isLeapYear', { enumerable: true, get: function () { return isLeapYear; } }); Object.defineProperty(exports, 'isMap', { enumerable: true, get: function () { return isMap; } }); Object.defineProperty(exports, 'isMobile', { enumerable: true, get: function () { return isMobile; } }); Object.defineProperty(exports, 'isNaN', { enumerable: true, get: function () { return isNaN; } }); Object.defineProperty(exports, 'isNameCn', { enumerable: true, get: function () { return isNameCn; } }); Object.defineProperty(exports, 'isNameEn', { enumerable: true, get: function () { return isNameEn; } }); Object.defineProperty(exports, 'isNil', { enumerable: true, get: function () { return isNil; } }); Object.defineProperty(exports, 'isNode', { enumerable: true, get: function () { return isNode; } }); Object.defineProperty(exports, 'isNum', { enumerable: true, get: function () { return isNum; } }); Object.defineProperty(exports, 'isObject', { enumerable: true, get: function () { return isObject; } }); Object.defineProperty(exports, 'isPlainObject', { enumerable: true, get: function () { return isPlainObject; } }); Object.defineProperty(exports, 'isPostCode', { enumerable: true, get: function () { return isPostCode; } }); Object.defineProperty(exports, 'isPromise', { enumerable: true, get: function () { return isPromise; } }); Object.defineProperty(exports, 'isProxyDocument', { enumerable: true, get: function () { return isProxyDocument; } }); Object.defineProperty(exports, 'isReg', { enumerable: true, get: function () { return isReg; } }); Object.defineProperty(exports, 'isRelative', { enumerable: true, get: function () { return isRelative; } }); Object.defineProperty(exports, 'isSameDay', { enumerable: true, get: function () { return isSameDay; } }); Object.defineProperty(exports, 'isScriptElement', { enumerable: true, get: function () { return isScriptElement; } }); Object.defineProperty(exports, 'isSet', { enumerable: true, get: function () { return isSet; } }); Object.defineProperty(exports, 'isShadowRoot', { enumerable: true, get: function () { return isShadowRoot; } }); Object.defineProperty(exports, 'isSocketUrl', { enumerable: true, get: function () { return isSocketUrl; } }); Object.defineProperty(exports, 'isSoldierId', { enumerable: true, get: function () { return isSoldierId; } }); Object.defineProperty(exports, 'isStyleElement', { enumerable: true, get: function () { return isStyleElement; } }); Object.defineProperty(exports, 'isSupportCamera', { enumerable: true, get: function () { return isSupportCamera; } }); Object.defineProperty(exports, 'isSupportWebp', { enumerable: true, get: function () { return isSupportWebp; } }); Object.defineProperty(exports, 'isSymbol', { enumerable: true, get: function () { return isSymbol; } }); Object.defineProperty(exports, 'isTrainNumber', { enumerable: true, get: function () { return isTrainNumber; } }); Object.defineProperty(exports, 'isTrue', { enumerable: true, get: function () { return isTrue; } }); Object.defineProperty(exports, 'isType', { enumerable: true, get: function () { return isType; } }); Object.defineProperty(exports, 'isUndef', { enumerable: true, get: function () { return isUndef; } }); Object.defineProperty(exports, 'isUrl', { enumerable: true, get: function () { return isUrl; } }); Object.defineProperty(exports, 'isVersion', { enumerable: true, get: function () { return isVersion; } }); Object.defineProperty(exports, 'isVideo', { enumerable: true, get: function () { return isVideo; } }); Object.defineProperty(exports, 'isVue', { enumerable: true, get: function () { return isVue; } }); Object.defineProperty(exports, 'isWeakMap', { enumerable: true, get: function () { return isWeakMap; } }); Object.defineProperty(exports, 'isWeakSet', { enumerable: true, get: function () { return isWeakSet; } }); Object.defineProperty(exports, 'isWin', { enumerable: true, get: function () { return isWin; } }); Object.defineProperty(exports, 'parallel', { enumerable: true, get: function () { return parallel; } });