├── .gitignore ├── .mocharc.json ├── README.md ├── build ├── array │ ├── arrayDiff.js │ ├── arrayGroup.js │ ├── arrayIndex.js │ ├── arrayIntersection.js │ ├── arrayPick.js │ └── arrayUnique.js ├── browser │ ├── copy.js │ ├── createLink.js │ ├── createScript.js │ ├── getScrollTop.js │ ├── scrollToTop.js │ ├── urlGet.js │ └── urlParams.js ├── cache │ └── cookie.js ├── data │ ├── base64.js │ ├── clone.js │ ├── compare.js │ ├── deepClone.js │ ├── json2FormData.js │ ├── pick.js │ ├── replace.js │ └── unPick.js ├── func │ ├── compose.js │ ├── curry.js │ └── pipe.js ├── index.js ├── is │ ├── isAndroid.js │ ├── isApple.js │ ├── isEmail.js │ ├── isEmpty.js │ ├── isIDCard.js │ ├── isIP.js │ ├── isIos.js │ ├── isMobile.js │ ├── isPhone.js │ ├── isPostCode.js │ ├── isQQNumber.js │ └── isURL.js ├── src │ ├── array │ │ ├── arrayDiff.js │ │ ├── arrayGroup.js │ │ ├── arrayIndex.js │ │ ├── arrayIntersection.js │ │ ├── arrayPick.js │ │ └── arrayUnique.js │ ├── browser │ │ ├── copy.js │ │ ├── createLink.js │ │ ├── createScript.js │ │ ├── getScrollTop.js │ │ ├── scrollToTop.js │ │ ├── urlGet.js │ │ └── urlParams.js │ ├── cache │ │ └── cookie.js │ ├── data │ │ ├── base64.js │ │ ├── clone.js │ │ ├── compare.js │ │ ├── deepClone.js │ │ ├── json2FormData.js │ │ ├── pick.js │ │ ├── replace.js │ │ └── unPick.js │ ├── func │ │ ├── compose.js │ │ ├── curry.js │ │ └── pipe.js │ ├── index.js │ ├── is │ │ ├── isAndroid.js │ │ ├── isApple.js │ │ ├── isEmail.js │ │ ├── isIDCard.js │ │ ├── isIP.js │ │ ├── isIos.js │ │ ├── isMobile.js │ │ ├── isPhone.js │ │ ├── isPostCode.js │ │ ├── isQQNumber.js │ │ └── isURL.js │ ├── time │ │ ├── getDay.js │ │ ├── getMonth.js │ │ ├── getYear.js │ │ ├── sleep.js │ │ ├── timeBeauty.js │ │ └── timestamp.js │ └── type │ │ ├── isEmpty.js │ │ ├── isJsonString.js │ │ └── type.js ├── test │ ├── array.test.js │ ├── cookie.test.js │ ├── is.test.js │ └── time.test.js ├── time │ ├── getDay.js │ ├── getMonth.js │ ├── getYear.js │ ├── sleep.js │ ├── timeBeauty.js │ └── timestamp.js └── type │ ├── isEmpty.js │ ├── isJsonString.js │ └── type.js ├── dist ├── projectLibs.js └── projectLibs.js.map ├── index.d.ts ├── package.json ├── src ├── array │ ├── arrayDiff.ts │ ├── arrayGroup.ts │ ├── arrayIndex.ts │ ├── arrayIntersection.ts │ ├── arrayPick.ts │ └── arrayUnique.ts ├── browser │ ├── copy.ts │ ├── createLink.ts │ ├── createScript.ts │ ├── getScrollTop.ts │ ├── scrollToTop.ts │ ├── urlGet.ts │ └── urlParams.ts ├── cache │ └── cookie.ts ├── data │ ├── base64.ts │ ├── clone.ts │ ├── compare.ts │ ├── deepClone.ts │ ├── json2FormData.ts │ ├── pick.ts │ ├── replace.ts │ └── unPick.ts ├── func │ ├── compose.ts │ ├── curry.ts │ └── pipe.ts ├── index.ts ├── is │ ├── isAndroid.ts │ ├── isApple.ts │ ├── isEmail.ts │ ├── isIDCard.ts │ ├── isIP.ts │ ├── isIos.ts │ ├── isMobile.ts │ ├── isPhone.ts │ ├── isPostCode.ts │ ├── isQQNumber.ts │ └── isURL.ts ├── time │ ├── getDay.ts │ ├── getMonth.ts │ ├── getYear.ts │ ├── sleep.ts │ ├── timeBeauty.ts │ └── timestamp.ts └── type │ ├── isEmpty.ts │ ├── isJsonString.ts │ └── type.ts ├── test ├── array.test.ts ├── cookie.html ├── cookie.test.ts ├── is.test.ts └── time.test.ts ├── tsconfig.json └── webpack.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | npm-debug.log* 3 | yarn-debug.log* 4 | yarn-error.log* 5 | package-lock.json 6 | yarn.lock 7 | node_modules/ 8 | docs/ 9 | 10 | # Editor directories and files 11 | .idea 12 | .vscode 13 | *.suo 14 | *.ntvs* 15 | *.njsproj 16 | *.sln -------------------------------------------------------------------------------- /.mocharc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extension": ["ts"], 3 | "spec": "test/*.test.ts", 4 | "require": "ts-node/register" 5 | } 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 介绍 2 | project-libs 是一个常用函数集锦的工具库,包括浏览器、函数式、常用验证、cookie、数组处理等函数。 3 | 4 | ## 文档地址:[https://cpagejs.github.io/project-libs/](https://cpagejs.github.io/project-libs/) 5 | 6 | ## 安装 7 | ```js 8 | // yarn 9 | yarn add project-libs 10 | 11 | // npm 12 | npm install project-libs 13 | 14 | ``` 15 | 备注:目前 project-libs 可以在浏览器端使用,暂不支持在 node 端使用。 16 | 17 | ## 使用 18 | 例如需要判断是否为安卓设备 19 | ```js 20 | // 直接引入 21 | import { isAndroid } from 'project-libs'; 22 | 23 | // 单独引入 24 | import isAndroid from 'project-libs/build/is/isAndroid'; 25 | 26 | // 使用 27 | if(isAndroid()){ 28 | // 29 | } 30 | ``` 31 | 32 | ## 目前支持的函数 33 | | 函数 | 作用 | 34 | | --- | --- | 35 | | type | 判断元素类型 | 36 | | cookie | 操作cookie,包括查询、修改、删除 | 37 | | copy | 复制到剪切板 | 38 | | createLink | 在 head 中创建 css 的 link 标签 | 39 | | createScript | 创建 script 标签 | 40 | | getScrollTop | 获取浏览器滚动条位置 | 41 | | createLink | 在 head 中创建 css 的 link 标签 | 42 | | getScrollTop | 获取浏览器滚动条位置 | 43 | | scrollToTop | 滚动到浏览器顶部 | 44 | | urlGet | 获得URL中GET请求的参数值 | 45 | | urlParams | 将键值对拼接成URL带参数 | 46 | | sleep | 睡眠函数,延迟执行 | 47 | | timestamp | 获取当前时间戳 | 48 | | timeBeauty | 时间美化函数 | 49 | | curry | 用来柯里化的函数 | 50 | | compose | 组合函数,从右向左依次执行 | 51 | | pipe | 管道函数,从左向右依次执行 | 52 | | replace | 可以根据指定的选项来替换内容 | 53 | | clone | 浅拷贝,才方法只针对普通对象{}和数组[] | 54 | | deepClone | 深层次克隆 | 55 | | compare | 判断两个变量是否相等, 此方法用于相同数据类型的变量比较 | 56 | | json2FormData | 对象转为 formdata | 57 | | pick | 从对象中根据特定的属性返回一个新的对象 | 58 | | base64 | base64 转码和解码操作 | 59 | | arrayUnique | 数组去重 | 60 | | arrayIndex | 获取某个元素下标,元素可以为对象 | 61 | | arrayGroup | 把数组均分成几等份,并返回一个新的数组 | 62 | | arrayIntersection | 获取两个数组的交集 | 63 | | arrayDiff | 获取两个数组的差集 | 64 | | isEmpty | 判断空对象,空数组,空字符串 | 65 | | isAndroid | 判断是否是安卓设备 | 66 | | isApple | 判断是否是苹果设备 | 67 | | isIos | 判断是否是 ios 设备 | 68 | | isPhone | 验证是否是电话号码,可以自定义第二个号码 | 69 | | isEmail | 判断邮箱是否正确,可以自定义邮箱后缀 | 70 | | isMobile | 判断是否为手机端 | 71 | | isIP | 校验是否为不含端口号的IP地址 | 72 | | isIDCard | 验证是否为第二代居民身份证 | 73 | | isPostCode | 验证是否为邮政编码 | 74 | | isQQNumber | 验证是否是 qq 号码 | -------------------------------------------------------------------------------- /build/array/arrayDiff.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.default = arrayDiff; 7 | var type_1 = __importDefault(require("../type/type")); 8 | /** 9 | * 获取两个数组的差集 10 | * @param a Array 11 | * @param b Array 12 | * @returns Array[] 13 | */ 14 | function arrayDiff(a, b) { 15 | if ((0, type_1.default)(a) !== "array" || (0, type_1.default)(b) !== "array") { 16 | console.error("project-libs(arrayDiff方法参数错误):参数必须为数组"); 17 | } 18 | return Array.from(new Set(a.concat(b).filter(function (v) { return !new Set(a).has(v) || !new Set(b).has(v); }))); 19 | } 20 | -------------------------------------------------------------------------------- /build/array/arrayGroup.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.default = arrayGroup; 7 | var type_1 = __importDefault(require("../type/type")); 8 | /** 9 | * 把数组均分成几等份,并返回一个新的数组 10 | * @param {Array} arr 数组 11 | * @param {number} num 几等份 12 | * @returns {Array} Array 13 | */ 14 | function arrayGroup(arr, num) { 15 | if (!arr || !arr.length) { 16 | return []; 17 | } 18 | if ((0, type_1.default)(num) != "number") { 19 | console.error('project-libs(arrayGroup方法参数错误):num的必须是数字'); 20 | } 21 | if (num < 0) { 22 | console.error('project-libs(arrayGroup方法参数错误):num必须大于0'); 23 | } 24 | var index = 0; 25 | var newArray = []; 26 | while (index < arr.length) { 27 | newArray.push(arr.slice(index, index += num)); 28 | } 29 | return newArray; 30 | } 31 | -------------------------------------------------------------------------------- /build/array/arrayIndex.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.default = arrayIndex; 7 | var type_1 = __importDefault(require("../type/type")); 8 | var compare_1 = __importDefault(require("../data/compare")); 9 | /** 10 | * 获取某个元素下标,元素可以为对象 11 | * @param arr {Array} 传入的数组 12 | * @param obj {any} 需要获取下标的元素 13 | * @returns {number} number 下标,匹配不到时候返回 -1 14 | */ 15 | function arrayIndex(arr, obj) { 16 | if ((0, type_1.default)(arr) !== "array") { 17 | console.error("project-libs(arrayIndex方法参数错误):arr必须为数组"); 18 | } 19 | var i = arr.length; 20 | while (i--) { 21 | if ((0, compare_1.default)(arr[i], obj)) { 22 | return i; 23 | } 24 | } 25 | return -1; 26 | } 27 | -------------------------------------------------------------------------------- /build/array/arrayIntersection.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.default = arrayIntersection; 7 | var type_1 = __importDefault(require("../type/type")); 8 | /** 9 | * 获取两个数组的交集 10 | * @param a Array 11 | * @param b Array 12 | * @returns Array[] 13 | */ 14 | function arrayIntersection(a, b) { 15 | if ((0, type_1.default)(a) !== "array" || (0, type_1.default)(b) !== "array") { 16 | console.error("project-libs(arrayIntersection方法参数错误):参数必须为数组"); 17 | } 18 | return Array.from(new Set(a.filter(function (v) { return new Set(b).has(v); }))); 19 | } 20 | -------------------------------------------------------------------------------- /build/array/arrayPick.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | -------------------------------------------------------------------------------- /build/array/arrayUnique.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __read = (this && this.__read) || function (o, n) { 3 | var m = typeof Symbol === "function" && o[Symbol.iterator]; 4 | if (!m) return o; 5 | var i = m.call(o), r, ar = [], e; 6 | try { 7 | while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); 8 | } 9 | catch (error) { e = { error: error }; } 10 | finally { 11 | try { 12 | if (r && !r.done && (m = i["return"])) m.call(i); 13 | } 14 | finally { if (e) throw e.error; } 15 | } 16 | return ar; 17 | }; 18 | var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { 19 | if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { 20 | if (ar || !(i in from)) { 21 | if (!ar) ar = Array.prototype.slice.call(from, 0, i); 22 | ar[i] = from[i]; 23 | } 24 | } 25 | return to.concat(ar || Array.prototype.slice.call(from)); 26 | }; 27 | Object.defineProperty(exports, "__esModule", { value: true }); 28 | exports.default = arrayUnique; 29 | /** 30 | * 数组去重 31 | * @param arr {array} 数组 32 | * @returns {array} array 33 | */ 34 | function arrayUnique(arr) { 35 | return __spreadArray([], __read(new Set(arr)), false); 36 | } 37 | -------------------------------------------------------------------------------- /build/browser/copy.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.default = copy; 7 | var type_1 = __importDefault(require("../type/type")); 8 | /** 9 | * 复制到剪切板 10 | * @param str {string} 需要复制到剪贴板的文本 11 | * @returns {Promise} 返回一个 promise 对象 12 | */ 13 | function copy(str) { 14 | if ((0, type_1.default)(str) !== "string") { 15 | console.error("project-libs(copy方法参数错误):str必须为字符串"); 16 | return Promise.reject(); 17 | } 18 | return new Promise(function (resolve, reject) { 19 | try { 20 | var id = "project-libs-copy-input"; 21 | var ele = document.getElementById(id); 22 | if (ele) { 23 | ele.value = str; 24 | ele.select(); 25 | document.execCommand("copy"); 26 | } 27 | else { 28 | var input = document.createElement("input"); 29 | input.setAttribute("id", id); 30 | input.style.display = "none"; 31 | input.style.position = "absolute"; 32 | input.style.left = "-9999px"; 33 | input.value = str; 34 | document.body.appendChild(input); 35 | input.select(); 36 | document.execCommand("copy"); 37 | } 38 | resolve({ 39 | stauts: 1, 40 | data: str, 41 | }); 42 | } 43 | catch (error) { 44 | reject({ 45 | status: 0, 46 | error: error, 47 | }); 48 | } 49 | }); 50 | } 51 | -------------------------------------------------------------------------------- /build/browser/createLink.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.default = createLink; 7 | var type_1 = __importDefault(require("../type/type")); 8 | /** 9 | * 在 head 中创建 css 的 link 标签 10 | * @param url {string} url 地址 11 | */ 12 | function createLink(url) { 13 | if ((0, type_1.default)(url) !== 'string') { 14 | console.error('project-libs(createLink方法参数错误):url必须为字符串'); 15 | return; 16 | } 17 | var cssLink = document.createElement("link"); 18 | cssLink.rel = "stylesheet"; 19 | cssLink.type = "text/css"; 20 | cssLink.href = url; 21 | var head = document.getElementsByTagName("head")[0]; 22 | head.appendChild(cssLink); 23 | } 24 | -------------------------------------------------------------------------------- /build/browser/createScript.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = createScript; 4 | /** 5 | * 创建 script 标签 6 | * @param url {string} src的地址 7 | */ 8 | function createScript(url) { 9 | var head = document.getElementsByTagName('head')[0]; 10 | var script = document.createElement("script"); 11 | script.type = 'text/javascript'; 12 | script.src = url; 13 | head.appendChild(script); 14 | } 15 | -------------------------------------------------------------------------------- /build/browser/getScrollTop.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = getScrollTop; 4 | /** 5 | * 获取浏览器滚动条位置 6 | */ 7 | function getScrollTop() { 8 | var scroll_top = 0; 9 | if (document.documentElement && document.documentElement.scrollTop) { 10 | scroll_top = document.documentElement.scrollTop; 11 | } 12 | else if (document.body) { 13 | scroll_top = document.body.scrollTop; 14 | } 15 | return scroll_top; 16 | } 17 | -------------------------------------------------------------------------------- /build/browser/scrollToTop.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = scrollToTop; 4 | /** 5 | * 基于 window.requestAnimationFrame() 滚动到浏览器顶部 6 | */ 7 | function scrollToTop() { 8 | var top = document.documentElement.scrollTop || document.body.scrollTop; 9 | if (top > 0) { 10 | window.requestAnimationFrame(scrollToTop); 11 | window.scrollTo(0, top - top / 8); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /build/browser/urlGet.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.default = urlGet; 7 | var type_1 = __importDefault(require("../type/type")); 8 | /** 9 | * 获得URL中GET请求的参数值 10 | * @param key {string} 参数,可选,如果没有则返回所有的键值对 11 | * @param href {string} 网址,如果没有则默认选取当前网址 12 | * @returns {string | null} 如果有值返回字符串,否则返回 null 13 | */ 14 | function urlGet(key, href) { 15 | if (key && (0, type_1.default)(key) !== "string") { 16 | console.error("project-libs(urlGet方法参数错误):key必须为字符串"); 17 | return null; 18 | } 19 | if (href && (0, type_1.default)(href) !== "string") { 20 | console.error("project-libs(urlGet方法参数错误):href必须为字符串"); 21 | return null; 22 | } 23 | var querystr = href ? href.split("?") : window.location.href.split("?"); 24 | if (querystr[1]) { 25 | var GETs = querystr[1].split("&"); 26 | var obj_1 = {}; 27 | GETs.forEach(function (item) { 28 | var _item = item.split("="); 29 | obj_1[_item[0]] = decodeURIComponent(_item[1]); 30 | }); 31 | return key ? obj_1[key] : obj_1; 32 | } 33 | return null; 34 | } 35 | -------------------------------------------------------------------------------- /build/browser/urlParams.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = urlParams; 4 | /** 5 | * 将键值对拼接成URL带参数 6 | * @param obj {object} 对象 7 | * @param encode {boolean} 是否进行encode,默认false 8 | * @returns {string} 字符串 9 | * @example 10 | * ``` 11 | * urlParams({id:10, addr: 'zz'}) 12 | * // "id=10&addr=zz" 13 | * 14 | * urlParams({id:10, addr: 'zz'}, true) 15 | * // "id%3D10%26addr%3Dzz" 16 | * ``` 17 | */ 18 | function urlParams(obj, encode) { 19 | if (encode === void 0) { encode = false; } 20 | var urls = []; 21 | var add = function (key, value) { 22 | return key + '=' + value; 23 | }; 24 | for (var k in obj) { 25 | urls.push(add(k, obj[k])); 26 | } 27 | var str = urls.join('&'); 28 | return encode ? encodeURIComponent(str) : str; 29 | } 30 | -------------------------------------------------------------------------------- /build/cache/cookie.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | var isJsonString_1 = __importDefault(require("../type/isJsonString")); 7 | /** 8 | * 操作 cookie 9 | */ 10 | var cookie = { 11 | /** 12 | * 判断cookie是否可用 13 | * @returns {boolean} boolean 14 | */ 15 | support: function () { 16 | if (!(document.cookie || navigator.cookieEnabled)) 17 | return false; 18 | return true; 19 | }, 20 | /** 21 | * 添加cookie 22 | * @param name {string} cookie 键 23 | * @param value {string | object} cookie 值 24 | * @param config {object} 可选配置项 25 | * ``` 26 | * { 27 | * hours: 过期时间,单位小时, 28 | * path: 路径, 29 | * domain: 域名, 30 | * secure: 安全策略, 31 | * httpOnly: 设置键值对是否可以被 js 访问, 32 | * sameSite: 用来限制第三方 Cookie 33 | * } 34 | * ``` 35 | */ 36 | set: function (name, value, config) { 37 | if (!this.support()) { 38 | console.error("project-libs(Cookie方法不可用):浏览器不支持Cookie,请检查相关设置"); 39 | return; 40 | } 41 | var data = name + "=" + encodeURIComponent(JSON.stringify(value)); 42 | if (config === null || config === void 0 ? void 0 : config.hours) { 43 | var d = new Date(); 44 | d.setHours(d.getHours() + (config === null || config === void 0 ? void 0 : config.hours)); 45 | data += "; expires=" + d.toUTCString(); 46 | } 47 | if (config === null || config === void 0 ? void 0 : config.path) { 48 | data += "; path=" + config.path; 49 | } 50 | if (config === null || config === void 0 ? void 0 : config.domain) { 51 | data += "; domain=" + config.domain; 52 | } 53 | if (config === null || config === void 0 ? void 0 : config.secure) { 54 | data += "; secure=" + config.secure; 55 | } 56 | if (config === null || config === void 0 ? void 0 : config.httpOnly) { 57 | data += "; httpOnly=" + config.httpOnly; 58 | } 59 | if (config === null || config === void 0 ? void 0 : config.sameSite) { 60 | data += "; sameSite=" + config.sameSite; 61 | } 62 | document.cookie = data; 63 | }, 64 | /** 65 | * 查询 cookie 66 | * @param name {string} Cookie 的键;如果参数为空则获取所有的cookie 67 | * @returns {string | object | null} 有参数获取cookie后返回字符串,没有参数获取cookie返回json;获取不到则返回 null 68 | */ 69 | get: function (name) { 70 | if (!this.support()) { 71 | console.error("project-libs(Cookie方法不可用):浏览器不支持Cookie,请检查相关设置"); 72 | return null; 73 | } 74 | var cs = document.cookie, arr = [], obj = {}; 75 | arr = cs.split(";"); 76 | if (cs !== "") { 77 | for (var i = 0; i < arr.length; i++) { 78 | var a = arr[i].split("="); 79 | var key = a[0].trim(); 80 | if (key !== "") { 81 | var val = decodeURIComponent(a[1]); 82 | obj[key] = (0, isJsonString_1.default)(val) ? JSON.parse(val) : val; 83 | } 84 | } 85 | return name ? obj[name] : obj; 86 | } 87 | else { 88 | return null; 89 | } 90 | }, 91 | /** 92 | * 删除 cookie 93 | * @param name Cookie 的键;如果参数为空,则清理所有的cookie 94 | * @param path 路径,默认为'' 95 | */ 96 | remove: function (name, path) { 97 | var _this = this; 98 | if (!this.support()) { 99 | console.error("project-libs(Cookie方法不可用):浏览器不支持Cookie,请检查相关设置"); 100 | return; 101 | } 102 | if (arguments.length === 0) { 103 | var all = this.get(); 104 | Object.keys(all).forEach(function (item) { 105 | _this.set(item, "", { hours: -1 }); 106 | }); 107 | } 108 | else { 109 | this.set(name, path || "", { hours: -1 }); 110 | } 111 | }, 112 | }; 113 | exports.default = cookie; 114 | -------------------------------------------------------------------------------- /build/data/base64.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var Base64 = /** @class */ (function () { 4 | function Base64() { 5 | } 6 | /** 7 | * 字符串转 base64 8 | * @param str {string} 字符串 9 | * @returns {string} 字符串 10 | * @summary btoa() 方法不支持 IE9 及更早的 IE 版本 11 | */ 12 | Base64.encode = function (str) { 13 | var code = encodeURI(str); 14 | return btoa(code); 15 | }; 16 | /** 17 | * base64 转字符串 18 | * @param str {string} 字符串 19 | * @returns {string} 字符串 20 | * @summary atob() 方法不支持 IE9 及更早的 IE 版本 21 | */ 22 | Base64.decode = function (str) { 23 | var code = atob(str); 24 | return decodeURI(code); 25 | }; 26 | return Base64; 27 | }()); 28 | var base64 = new Base64(); 29 | exports.default = base64; 30 | -------------------------------------------------------------------------------- /build/data/clone.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = clone; 4 | /** 5 | * 浅拷贝,才方法只针对普通对象{}和数组[] 6 | * @param source 7 | * @returns {any} any 8 | */ 9 | function clone(source) { 10 | return JSON.parse(JSON.stringify(source)); 11 | } 12 | -------------------------------------------------------------------------------- /build/data/compare.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = compare; 4 | /** 5 | * 判断两个变量是否相等, 此方法用于相同数据类型的变量比较 6 | * @param a {any} 7 | * @param b {any} 8 | * @returns {boolean} boolean 9 | */ 10 | function compare(a, b) { 11 | var pt = /undefined|number|string|boolean/, fn = /^(function\s*)(\w*\b)/, cr = "constructor", cn = "childNodes", pn = "parentNode"; 12 | if (pt.test(typeof a) || pt.test(typeof b) || a === null || b === null) { 13 | return a === b || (isNaN(a) && isNaN(b)); //为了方便,此处假定NaN == NaN 14 | } 15 | if (a[cr] !== b[cr]) { 16 | return false; 17 | } 18 | switch (a[cr]) { 19 | case Date: 20 | return a.valueOf() === b.valueOf(); 21 | case Function: 22 | return a.toString().replace(fn, '$1') === b.toString().replace(fn, '$1'); //硬编码中声明函数的方式会影响到toString的结果,因此用正则进行格式化 23 | case Array: 24 | if (a.length !== b.length) { 25 | return false; 26 | } 27 | for (var i = 0; i < a.length; i++) { 28 | if (a[i].toString() == b[i].toString()) { } 29 | } 30 | break; 31 | default: 32 | var alen = 0, blen = 0, d = void 0; 33 | if (a === b) { 34 | return true; 35 | } 36 | if (a[cn] || a[pn] || b[cn] || b[pn]) { 37 | return a === b; 38 | } 39 | for (d in a) { 40 | alen++; 41 | } 42 | for (d in b) { 43 | blen++; 44 | } 45 | if (alen !== blen) { 46 | return false; 47 | } 48 | for (d in a) { 49 | if (a[d].toString() != b[d].toString()) { 50 | return false; 51 | } 52 | } 53 | break; 54 | } 55 | return true; 56 | } 57 | -------------------------------------------------------------------------------- /build/data/deepClone.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.default = deepClone; 7 | var type_1 = __importDefault(require("../type/type")); 8 | /** 9 | * 深层次克隆 10 | * @param data {any} 数据源 11 | * @returns {any} any 12 | */ 13 | function deepClone(data) { 14 | var t = (0, type_1.default)(data), o, i, ni; 15 | if (t === 'array') { 16 | o = []; 17 | } 18 | else if (t === 'object') { 19 | o = {}; 20 | } 21 | else { 22 | return data; 23 | } 24 | if (t === 'array') { 25 | for (i = 0, ni = data.length; i < ni; i++) { 26 | o.push(deepClone(data[i])); 27 | } 28 | return o; 29 | } 30 | else if (t === 'object') { 31 | for (i in data) { 32 | o[i] = deepClone(data[i]); 33 | } 34 | return o; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /build/data/json2FormData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.default = json2FormData; 7 | var type_1 = __importDefault(require("../type/type")); 8 | /** 9 | * 对象转为 formdata 10 | * @param obj {object} 对象 11 | * @returns {FormData} FormData 12 | */ 13 | function json2FormData(obj) { 14 | if ((0, type_1.default)(obj) !== "object") { 15 | console.error("project-libs(json2FormData方法参数错误):obj必须为对象"); 16 | // return; 17 | } 18 | var formData = new FormData(); 19 | for (var i in obj) { 20 | parse(obj[i], i); 21 | } 22 | function parse(array, key) { 23 | if ((0, type_1.default)(array) === "undefined" || (0, type_1.default)(array) === "function") { 24 | return false; 25 | } 26 | switch ((0, type_1.default)(array)) { 27 | case "array": 28 | if (array.length === 0) { 29 | formData.append("".concat(key), ""); 30 | } 31 | else { 32 | for (var i in array) { 33 | for (var j in array[i]) { 34 | parse(array[i][j], "".concat(key, "[").concat(i, "].").concat(j)); 35 | } 36 | } 37 | } 38 | break; 39 | case "object": 40 | for (var j in array) { 41 | parse(array[j], "".concat(key, ".").concat(j)); 42 | } 43 | break; 44 | default: 45 | formData.append(key, array); 46 | break; 47 | } 48 | } 49 | return formData; 50 | } 51 | -------------------------------------------------------------------------------- /build/data/pick.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = pick; 4 | /** 5 | * 从对象中根据特定的属性返回一个新的对象 6 | * @param object 对象来源 7 | * @param props 要选取的属性 8 | */ 9 | function pick(object, props) { 10 | if (!Array.isArray(object) || !Array.isArray(props)) { 11 | console.error("对象来源和要选取的属性必须为数组!"); 12 | } 13 | else { 14 | var obj_1 = {}; 15 | props.forEach(function (item) { 16 | // @ts-ignore 17 | obj_1[item] = object[item]; 18 | }); 19 | return obj_1; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /build/data/replace.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = replace; 4 | ; 5 | /** 6 | * replace 函数,可以根据指定的选项来替换内容 7 | * @param source 需要替换的资源 8 | * @param option 选项,可以为对象或者对象数组,{target: '<', replace: ''} 或者 [{target: '<', replace: ''}] 9 | * @returns {string} string 10 | */ 11 | function replace(source, option) { 12 | if (Array.isArray(option)) { 13 | var _source_1 = source; 14 | option.forEach(function (item) { 15 | var reg = new RegExp(item.target, 'g'); 16 | _source_1 = _source_1.replace(reg, item.replace); 17 | }); 18 | return _source_1; 19 | } 20 | if (option.constructor === Object) { 21 | var reg = new RegExp(option.target, 'g'); 22 | return source.replace(reg, option.replace); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /build/data/unPick.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = unPick; 4 | /** 5 | * 从对象中排除特定的属性返回一个新的对象 6 | * @param object 对象来源 7 | * @param props 要排除的属性 8 | */ 9 | function unPick(object, props) { 10 | if (Array.isArray(props)) { 11 | var obj = {}; 12 | for (var i in object) { 13 | if (!props.includes(i)) { 14 | // @ts-ignore 15 | obj[i] = object[i]; 16 | } 17 | } 18 | return obj; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /build/func/compose.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __read = (this && this.__read) || function (o, n) { 3 | var m = typeof Symbol === "function" && o[Symbol.iterator]; 4 | if (!m) return o; 5 | var i = m.call(o), r, ar = [], e; 6 | try { 7 | while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); 8 | } 9 | catch (error) { e = { error: error }; } 10 | finally { 11 | try { 12 | if (r && !r.done && (m = i["return"])) m.call(i); 13 | } 14 | finally { if (e) throw e.error; } 15 | } 16 | return ar; 17 | }; 18 | var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { 19 | if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { 20 | if (ar || !(i in from)) { 21 | if (!ar) ar = Array.prototype.slice.call(from, 0, i); 22 | ar[i] = from[i]; 23 | } 24 | } 25 | return to.concat(ar || Array.prototype.slice.call(from)); 26 | }; 27 | Object.defineProperty(exports, "__esModule", { value: true }); 28 | exports.default = compose; 29 | /** 30 | * 组合函数,从右向左依次执行 31 | * @returns {any} any 32 | * @example 33 | * ``` 34 | * function a(name) { return 'test:' + name } 35 | function b(statement) { return statement.toUpperCase() + '!' } 36 | function c(str) { return str.replace(/[cC]/, 'CCCCC') } 37 | compose(a, b, c)('com') 38 | // test:CCCCCOM! 39 | * ``` 40 | */ 41 | function compose() { 42 | var fns = __spreadArray([], __read(arguments), false); 43 | return function (arg) { 44 | var res = arg; 45 | for (var i = fns.length - 1; i > -1; i--) { 46 | res = fns[i](res); 47 | } 48 | return res; 49 | }; 50 | } 51 | -------------------------------------------------------------------------------- /build/func/curry.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __read = (this && this.__read) || function (o, n) { 3 | var m = typeof Symbol === "function" && o[Symbol.iterator]; 4 | if (!m) return o; 5 | var i = m.call(o), r, ar = [], e; 6 | try { 7 | while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); 8 | } 9 | catch (error) { e = { error: error }; } 10 | finally { 11 | try { 12 | if (r && !r.done && (m = i["return"])) m.call(i); 13 | } 14 | finally { if (e) throw e.error; } 15 | } 16 | return ar; 17 | }; 18 | var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { 19 | if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { 20 | if (ar || !(i in from)) { 21 | if (!ar) ar = Array.prototype.slice.call(from, 0, i); 22 | ar[i] = from[i]; 23 | } 24 | } 25 | return to.concat(ar || Array.prototype.slice.call(from)); 26 | }; 27 | Object.defineProperty(exports, "__esModule", { value: true }); 28 | exports.default = curry; 29 | /** 30 | * 用来柯里化的函数 31 | * @param fn {Function} 32 | * @returns {any} any 33 | * @example 34 | * ``` 35 | * let abc = function(a, b, c) { 36 | return [a, b, c]; 37 | }; 38 | const curried = curry(abc); 39 | curried(1)(2)(3); 40 | // [1,2,3] 41 | * ``` 42 | */ 43 | function curry(fn) { 44 | return function aa() { 45 | var arg = []; 46 | for (var _i = 0; _i < arguments.length; _i++) { 47 | arg[_i] = arguments[_i]; 48 | } 49 | if (arg.length >= fn.length) { 50 | return fn.apply(void 0, __spreadArray([], __read(arg), false)); 51 | } 52 | else { 53 | return aa.bind.apply(aa, __spreadArray([null], __read(arg), false)); 54 | } 55 | }; 56 | } 57 | -------------------------------------------------------------------------------- /build/func/pipe.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __read = (this && this.__read) || function (o, n) { 3 | var m = typeof Symbol === "function" && o[Symbol.iterator]; 4 | if (!m) return o; 5 | var i = m.call(o), r, ar = [], e; 6 | try { 7 | while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); 8 | } 9 | catch (error) { e = { error: error }; } 10 | finally { 11 | try { 12 | if (r && !r.done && (m = i["return"])) m.call(i); 13 | } 14 | finally { if (e) throw e.error; } 15 | } 16 | return ar; 17 | }; 18 | var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { 19 | if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { 20 | if (ar || !(i in from)) { 21 | if (!ar) ar = Array.prototype.slice.call(from, 0, i); 22 | ar[i] = from[i]; 23 | } 24 | } 25 | return to.concat(ar || Array.prototype.slice.call(from)); 26 | }; 27 | Object.defineProperty(exports, "__esModule", { value: true }); 28 | exports.default = pipe; 29 | /** 30 | * 管道函数,从左向右依次执行 31 | * @returns {any} any 32 | * @example 33 | * ``` 34 | * function a(name) { return 'test:' + name } 35 | function b(statement) { return statement.toUpperCase() + '!' } 36 | function c(str) { return str.replace(/[cC]/, 'CCCCC') } 37 | pipe(a, b, c)('com') 38 | // TEST:CCCCCOM! 39 | * ``` 40 | */ 41 | function pipe() { 42 | var fns = __spreadArray([], __read(arguments), false); 43 | return function (arg) { 44 | var res = arg; 45 | for (var i = 0; i < fns.length; i++) { 46 | res = fns[i](res); 47 | } 48 | return res; 49 | }; 50 | } 51 | -------------------------------------------------------------------------------- /build/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.isQQNumber = exports.isPostCode = exports.isIDCard = exports.isIP = exports.isMobile = exports.isEmail = exports.isPhone = exports.isIos = exports.isApple = exports.isAndroid = exports.arrayIntersection = exports.arrayGroup = exports.arrayIndex = exports.arrayUnique = exports.pick = exports.base64 = exports.json2FormData = exports.compare = exports.deepClone = exports.clone = exports.replace = exports.pipe = exports.compose = exports.curry = exports.getYear = exports.getMonth = exports.getDay = exports.timeBeauty = exports.timestamp = exports.sleep = exports.urlParams = exports.urlGet = exports.scrollToTop = exports.getScrollTop = exports.createScript = exports.createLink = exports.copy = exports.cookie = exports.isJsonString = exports.isEmpty = exports.type = void 0; 7 | // 类型 8 | var type_1 = require("./type/type"); 9 | Object.defineProperty(exports, "type", { enumerable: true, get: function () { return __importDefault(type_1).default; } }); 10 | var isEmpty_1 = require("./type/isEmpty"); 11 | Object.defineProperty(exports, "isEmpty", { enumerable: true, get: function () { return __importDefault(isEmpty_1).default; } }); 12 | var isJsonString_1 = require("./type/isJsonString"); 13 | Object.defineProperty(exports, "isJsonString", { enumerable: true, get: function () { return __importDefault(isJsonString_1).default; } }); 14 | // 缓存 15 | var cookie_1 = require("./cache/cookie"); 16 | Object.defineProperty(exports, "cookie", { enumerable: true, get: function () { return __importDefault(cookie_1).default; } }); 17 | // 浏览器 18 | var copy_1 = require("./browser/copy"); 19 | Object.defineProperty(exports, "copy", { enumerable: true, get: function () { return __importDefault(copy_1).default; } }); 20 | var createLink_1 = require("./browser/createLink"); 21 | Object.defineProperty(exports, "createLink", { enumerable: true, get: function () { return __importDefault(createLink_1).default; } }); 22 | var createScript_1 = require("./browser/createScript"); 23 | Object.defineProperty(exports, "createScript", { enumerable: true, get: function () { return __importDefault(createScript_1).default; } }); 24 | var getScrollTop_1 = require("./browser/getScrollTop"); 25 | Object.defineProperty(exports, "getScrollTop", { enumerable: true, get: function () { return __importDefault(getScrollTop_1).default; } }); 26 | var scrollToTop_1 = require("./browser/scrollToTop"); 27 | Object.defineProperty(exports, "scrollToTop", { enumerable: true, get: function () { return __importDefault(scrollToTop_1).default; } }); 28 | var urlGet_1 = require("./browser/urlGet"); 29 | Object.defineProperty(exports, "urlGet", { enumerable: true, get: function () { return __importDefault(urlGet_1).default; } }); 30 | var urlParams_1 = require("./browser/urlParams"); 31 | Object.defineProperty(exports, "urlParams", { enumerable: true, get: function () { return __importDefault(urlParams_1).default; } }); 32 | // 时间 33 | var sleep_1 = require("./time/sleep"); 34 | Object.defineProperty(exports, "sleep", { enumerable: true, get: function () { return __importDefault(sleep_1).default; } }); 35 | var timestamp_1 = require("./time/timestamp"); 36 | Object.defineProperty(exports, "timestamp", { enumerable: true, get: function () { return __importDefault(timestamp_1).default; } }); 37 | var timeBeauty_1 = require("./time/timeBeauty"); 38 | Object.defineProperty(exports, "timeBeauty", { enumerable: true, get: function () { return __importDefault(timeBeauty_1).default; } }); 39 | var getDay_1 = require("./time/getDay"); 40 | Object.defineProperty(exports, "getDay", { enumerable: true, get: function () { return __importDefault(getDay_1).default; } }); 41 | var getMonth_1 = require("./time/getMonth"); 42 | Object.defineProperty(exports, "getMonth", { enumerable: true, get: function () { return __importDefault(getMonth_1).default; } }); 43 | var getYear_1 = require("./time/getYear"); 44 | Object.defineProperty(exports, "getYear", { enumerable: true, get: function () { return __importDefault(getYear_1).default; } }); 45 | // 函数式 46 | var curry_1 = require("./func/curry"); 47 | Object.defineProperty(exports, "curry", { enumerable: true, get: function () { return __importDefault(curry_1).default; } }); 48 | var compose_1 = require("./func/compose"); 49 | Object.defineProperty(exports, "compose", { enumerable: true, get: function () { return __importDefault(compose_1).default; } }); 50 | var pipe_1 = require("./func/pipe"); 51 | Object.defineProperty(exports, "pipe", { enumerable: true, get: function () { return __importDefault(pipe_1).default; } }); 52 | // 数据处理 53 | var replace_1 = require("./data/replace"); 54 | Object.defineProperty(exports, "replace", { enumerable: true, get: function () { return __importDefault(replace_1).default; } }); 55 | var clone_1 = require("./data/clone"); 56 | Object.defineProperty(exports, "clone", { enumerable: true, get: function () { return __importDefault(clone_1).default; } }); 57 | var deepClone_1 = require("./data/deepClone"); 58 | Object.defineProperty(exports, "deepClone", { enumerable: true, get: function () { return __importDefault(deepClone_1).default; } }); 59 | var compare_1 = require("./data/compare"); 60 | Object.defineProperty(exports, "compare", { enumerable: true, get: function () { return __importDefault(compare_1).default; } }); 61 | var json2FormData_1 = require("./data/json2FormData"); 62 | Object.defineProperty(exports, "json2FormData", { enumerable: true, get: function () { return __importDefault(json2FormData_1).default; } }); 63 | var base64_1 = require("./data/base64"); 64 | Object.defineProperty(exports, "base64", { enumerable: true, get: function () { return __importDefault(base64_1).default; } }); 65 | var pick_1 = require("./data/pick"); 66 | Object.defineProperty(exports, "pick", { enumerable: true, get: function () { return __importDefault(pick_1).default; } }); 67 | // 数组 68 | var arrayUnique_1 = require("./array/arrayUnique"); 69 | Object.defineProperty(exports, "arrayUnique", { enumerable: true, get: function () { return __importDefault(arrayUnique_1).default; } }); 70 | var arrayIndex_1 = require("./array/arrayIndex"); 71 | Object.defineProperty(exports, "arrayIndex", { enumerable: true, get: function () { return __importDefault(arrayIndex_1).default; } }); 72 | var arrayGroup_1 = require("./array/arrayGroup"); 73 | Object.defineProperty(exports, "arrayGroup", { enumerable: true, get: function () { return __importDefault(arrayGroup_1).default; } }); 74 | var arrayIntersection_1 = require("./array/arrayIntersection"); 75 | Object.defineProperty(exports, "arrayIntersection", { enumerable: true, get: function () { return __importDefault(arrayIntersection_1).default; } }); 76 | // 验证 77 | var isAndroid_1 = require("./is/isAndroid"); 78 | Object.defineProperty(exports, "isAndroid", { enumerable: true, get: function () { return __importDefault(isAndroid_1).default; } }); 79 | var isApple_1 = require("./is/isApple"); 80 | Object.defineProperty(exports, "isApple", { enumerable: true, get: function () { return __importDefault(isApple_1).default; } }); 81 | var isIos_1 = require("./is/isIos"); 82 | Object.defineProperty(exports, "isIos", { enumerable: true, get: function () { return __importDefault(isIos_1).default; } }); 83 | var isPhone_1 = require("./is/isPhone"); 84 | Object.defineProperty(exports, "isPhone", { enumerable: true, get: function () { return __importDefault(isPhone_1).default; } }); 85 | var isEmail_1 = require("./is/isEmail"); 86 | Object.defineProperty(exports, "isEmail", { enumerable: true, get: function () { return __importDefault(isEmail_1).default; } }); 87 | var isMobile_1 = require("./is/isMobile"); 88 | Object.defineProperty(exports, "isMobile", { enumerable: true, get: function () { return __importDefault(isMobile_1).default; } }); 89 | var isIP_1 = require("./is/isIP"); 90 | Object.defineProperty(exports, "isIP", { enumerable: true, get: function () { return __importDefault(isIP_1).default; } }); 91 | var isIDCard_1 = require("./is/isIDCard"); 92 | Object.defineProperty(exports, "isIDCard", { enumerable: true, get: function () { return __importDefault(isIDCard_1).default; } }); 93 | var isPostCode_1 = require("./is/isPostCode"); 94 | Object.defineProperty(exports, "isPostCode", { enumerable: true, get: function () { return __importDefault(isPostCode_1).default; } }); 95 | var isQQNumber_1 = require("./is/isQQNumber"); 96 | Object.defineProperty(exports, "isQQNumber", { enumerable: true, get: function () { return __importDefault(isQQNumber_1).default; } }); 97 | -------------------------------------------------------------------------------- /build/is/isAndroid.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isAndroid; 4 | /** 5 | * 判断是否是安卓设备 6 | * @returns {boolean} boolean 7 | */ 8 | function isAndroid() { 9 | return /android/i.test(navigator.userAgent.toLowerCase()); 10 | } 11 | -------------------------------------------------------------------------------- /build/is/isApple.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isApple; 4 | /** 5 | * 判断是否是苹果设备 6 | * @returns {boolean} boolean 7 | */ 8 | function isApple() { 9 | return /iphone|ipod|ipad|Macintosh/i.test(navigator.userAgent.toLowerCase()); 10 | } 11 | -------------------------------------------------------------------------------- /build/is/isEmail.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isEmail; 4 | var _domains = [ 5 | "qq.com", 6 | "163.com", 7 | "126.com", 8 | "vip.126.com", 9 | "yeah.net", 10 | "vip.163.com", 11 | "188.com", 12 | "sohu.com", 13 | "sina.cn", 14 | "sina.com", 15 | "gmail.com", 16 | "hotmail.com", 17 | "outlook.com" 18 | ]; 19 | /** 20 | * 判断邮箱是否正确,可以自定义邮箱后缀 21 | * @param email {string} 邮箱 22 | * @param domains {array[string]} 域名 ["163.com"] 23 | * @returns {boolean} boolean 24 | * 默认支持的邮箱:[ 25 | "qq.com", 26 | "163.com", 27 | "126.com", 28 | "vip.126.com", 29 | "yeah.net", 30 | "vip.163.com", 31 | "188.com", 32 | "sohu.com", 33 | "sina.cn", 34 | "sina.com", 35 | "gmail.com", 36 | "hotmail.com", 37 | "outlook.com" 38 | ] 39 | */ 40 | function isEmail(email, domains) { 41 | if (domains === void 0) { domains = _domains; } 42 | if (domains && !Array.isArray(domains)) { 43 | console.error('project-libs(isEmail参数错误):域名必须为数组'); 44 | } 45 | var reg = new RegExp("^([A-Za-z0-9._-])+@(".concat(domains.join("|"), ")$")); 46 | return reg.test(email); 47 | } 48 | -------------------------------------------------------------------------------- /build/is/isEmpty.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var type_1 = require("../type/type"); 4 | /** 5 | * 判断空对象,空数组,空字符串 6 | * @param obj 数组或者对象或者字符串 7 | * @returns boolean 8 | */ 9 | function isEmpty(obj) { 10 | if (!obj) { 11 | return true; 12 | } 13 | if (obj === '') { 14 | return true; 15 | } 16 | if (type_1.default(obj) === 'array') { 17 | // @ts-ignore 18 | if (!obj.length) { 19 | return true; 20 | } 21 | } 22 | if (type_1.default(obj) === 'object') { 23 | if (JSON.stringify(obj) === "{}") { 24 | return true; 25 | } 26 | } 27 | return false; 28 | } 29 | exports.default = isEmpty; 30 | -------------------------------------------------------------------------------- /build/is/isIDCard.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.default = isIDCard; 7 | var type_1 = __importDefault(require("../type/type")); 8 | /** 9 | * 验证是否为第二代居民身份证 10 | * 规则: 11 | * 共18位,最后一位可为X(大小写均可) 12 | * 不能以0开头 13 | * 出生年月日会进行校验:年份只能为18/19/2*开头,月份只能为01-12,日只能为01-31 14 | * @param card {string} 身份证号码 15 | * @returns {boolean} boolean 16 | */ 17 | function isIDCard(card) { 18 | if ((0, type_1.default)(card) !== "string") { 19 | console.error("project-libs(isIDCard方法参数错误):card必须为字符串"); 20 | return false; 21 | } 22 | return /^[1-9][0-9]{5}(18|19|(2[0-9]))[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{3}[0-9Xx]$/.test(card); 23 | } 24 | -------------------------------------------------------------------------------- /build/is/isIP.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.default = isIP; 7 | var type_1 = __importDefault(require("../type/type")); 8 | /** 9 | * 校验是否为不含端口号的IP地址 10 | * 规则: 11 | * IP格式为xxx.xxx.xxx.xxx,每一项数字取值范围为0-255 12 | * 除0以外其他数字不能以0开头,比如02 13 | * @param ip {string} ip地址,类型为字符串 14 | * @returns {boolean} boolean 15 | */ 16 | function isIP(ip) { 17 | if ((0, type_1.default)(ip) !== "string") { 18 | console.error("project-libs(isIP方法参数错误):ip必须为字符串"); 19 | return false; 20 | } 21 | return /^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$/.test(ip); 22 | } 23 | -------------------------------------------------------------------------------- /build/is/isIos.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isIos; 4 | /** 5 | * 判断是否是 ios 设备 6 | * @returns {boolean} boolean 7 | */ 8 | function isIos() { 9 | return /iphone|ipod|ipad/i.test(navigator.userAgent.toLowerCase()); 10 | } 11 | -------------------------------------------------------------------------------- /build/is/isMobile.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isMobile; 4 | /** 5 | * 判断是否为手机端 6 | * @returns {boolean} boolean 7 | */ 8 | function isMobile() { 9 | return /iphone|ipod|android.*mobile|windows.*phone|blackberry.*mobile/i.test(navigator.userAgent.toLowerCase()); 10 | } 11 | -------------------------------------------------------------------------------- /build/is/isPhone.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isPhone; 4 | /** 5 | * 验证是否是电话号码,可以自定义第二个号码 6 | * @param phone {string} 电话号码 7 | * @param second {array} 电话号码的第二个号码规则,可选,例如[3,4,5,7,8] 8 | * @returns {boolean} boolean 9 | */ 10 | function isPhone(phone, second) { 11 | if (second === void 0) { second = [3, 4, 5, 7, 8]; } 12 | var reg = new RegExp("^[1]".concat(JSON.stringify(second), "[0-9]{9}$")); 13 | return reg.test(phone); 14 | } 15 | -------------------------------------------------------------------------------- /build/is/isPostCode.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.default = isPostCode; 7 | var type_1 = __importDefault(require("../type/type")); 8 | /** 9 | * 验证是否为邮政编码 10 | * @param code {string} 邮政编码 11 | * @returns {boolean} boolean 12 | */ 13 | function isPostCode(code) { 14 | if ((0, type_1.default)(code) !== "string") { 15 | console.error("project-libs(isPostCode方法参数错误):code必须为字符串"); 16 | return false; 17 | } 18 | return /^[1-9][0-9]{5}$/.test(code.toString()); 19 | } 20 | -------------------------------------------------------------------------------- /build/is/isQQNumber.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.default = isQQNumber; 7 | var type_1 = __importDefault(require("../type/type")); 8 | /** 9 | * 验证是否是 qq 号码 10 | * 规则:非0开头的5位-13位整数 11 | * @param qq {string} qq号码,字符串 12 | * @returns {boolean} boolean 13 | */ 14 | function isQQNumber(qq) { 15 | if ((0, type_1.default)(qq) !== "string") { 16 | console.error("project-libs(isQQNumber方法参数错误):qq必须为字符串"); 17 | return false; 18 | } 19 | return /^[1-9][0-9]{4,12}$/.test(qq); 20 | } 21 | -------------------------------------------------------------------------------- /build/is/isURL.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isURL; 4 | /** 5 | * 验证是否为网址 6 | * @param url {string} 网址 7 | * @returns {boolean} boolean 8 | */ 9 | function isURL(url) { 10 | var regular = /^\b(((https?|ftp):\/\/)?[-a-z0-9]+(\.[-a-z0-9]+)*\.(?:com|edu|gov|int|mil|net|org|biz|info|name|museum|asia|coop|aero|[a-z][a-z]|((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]\d)|\d))\b(\/[-a-z0-9_:\@&?=+,.!\/~%\$]*)?)$/i; 11 | return regular.test(url); 12 | } 13 | -------------------------------------------------------------------------------- /build/src/array/arrayDiff.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = arrayDiff; 4 | var type_1 = require("../type/type"); 5 | /** 6 | * 获取两个数组的差集 7 | * @param a Array 8 | * @param b Array 9 | * @returns Array[] 10 | */ 11 | function arrayDiff(a, b) { 12 | if ((0, type_1.default)(a) !== 'array' || (0, type_1.default)(b) !== 'array') { 13 | console.error('project-libs(arrayDiff方法参数错误):参数必须为数组'); 14 | return; 15 | } 16 | return Array.from(new Set(a.concat(b).filter(function (v) { return !new Set(a).has(v) || !new Set(b).has(v); }))); 17 | } 18 | -------------------------------------------------------------------------------- /build/src/array/arrayGroup.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = arrayGroup; 4 | var type_1 = require("../type/type"); 5 | /** 6 | * 把数组均分成几等份,并返回一个新的数组 7 | * @param {Array} arr 数组 8 | * @param {number} num 几等份 9 | * @returns {Array} Array 10 | */ 11 | function arrayGroup(arr, num) { 12 | if (!arr || !arr.length) { 13 | return []; 14 | } 15 | if ((0, type_1.default)(num) != "number") { 16 | console.error('project-libs(arrayGroup方法参数错误):num的必须是数字'); 17 | } 18 | if (num < 0) { 19 | console.error('project-libs(arrayGroup方法参数错误):num必须大于0'); 20 | } 21 | var index = 0; 22 | var newArray = []; 23 | while (index < arr.length) { 24 | newArray.push(arr.slice(index, index += num)); 25 | } 26 | return newArray; 27 | } 28 | -------------------------------------------------------------------------------- /build/src/array/arrayIndex.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = arrayIndex; 4 | var type_1 = require("../type/type"); 5 | var compare_1 = require("../data/compare"); 6 | /** 7 | * 获取某个元素下标,元素可以为对象 8 | * @param arr {Array} 传入的数组 9 | * @param obj {any} 需要获取下标的元素 10 | * @returns {number} number 下标,匹配不到时候返回 -1 11 | */ 12 | function arrayIndex(arr, obj) { 13 | if ((0, type_1.default)(arr) !== 'array') { 14 | console.error('project-libs(arrayIndex方法参数错误):arr必须为数组'); 15 | return; 16 | } 17 | var i = arr.length; 18 | while (i--) { 19 | if ((0, compare_1.default)(arr[i], obj)) { 20 | return i; 21 | } 22 | } 23 | return -1; 24 | } 25 | -------------------------------------------------------------------------------- /build/src/array/arrayIntersection.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = arrayIntersection; 4 | var type_1 = require("../type/type"); 5 | /** 6 | * 获取两个数组的交集 7 | * @param a Array 8 | * @param b Array 9 | * @returns Array[] 10 | */ 11 | function arrayIntersection(a, b) { 12 | if ((0, type_1.default)(a) !== 'array' || (0, type_1.default)(b) !== 'array') { 13 | console.error('project-libs(arrayIntersection方法参数错误):参数必须为数组'); 14 | return; 15 | } 16 | return Array.from(new Set(a.filter(function (v) { return new Set(b).has(v); }))); 17 | } 18 | -------------------------------------------------------------------------------- /build/src/array/arrayPick.js: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /build/src/array/arrayUnique.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __read = (this && this.__read) || function (o, n) { 3 | var m = typeof Symbol === "function" && o[Symbol.iterator]; 4 | if (!m) return o; 5 | var i = m.call(o), r, ar = [], e; 6 | try { 7 | while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); 8 | } 9 | catch (error) { e = { error: error }; } 10 | finally { 11 | try { 12 | if (r && !r.done && (m = i["return"])) m.call(i); 13 | } 14 | finally { if (e) throw e.error; } 15 | } 16 | return ar; 17 | }; 18 | var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { 19 | if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { 20 | if (ar || !(i in from)) { 21 | if (!ar) ar = Array.prototype.slice.call(from, 0, i); 22 | ar[i] = from[i]; 23 | } 24 | } 25 | return to.concat(ar || Array.prototype.slice.call(from)); 26 | }; 27 | Object.defineProperty(exports, "__esModule", { value: true }); 28 | exports.default = arrayUnique; 29 | /** 30 | * 数组去重 31 | * @param arr {array} 数组 32 | * @returns {array} array 33 | */ 34 | function arrayUnique(arr) { 35 | return __spreadArray([], __read(new Set(arr)), false); 36 | } 37 | -------------------------------------------------------------------------------- /build/src/browser/copy.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = copy; 4 | var type_1 = require("../type/type"); 5 | /** 6 | * 复制到剪切板 7 | * @param str {string} 需要复制到剪贴板的文本 8 | * @returns {Promise} 返回一个 promise 对象 9 | */ 10 | function copy(str) { 11 | if ((0, type_1.default)(str) !== 'string') { 12 | console.error('project-libs(copy方法参数错误):str必须为字符串'); 13 | return; 14 | } 15 | return new Promise(function (resolve, reject) { 16 | try { 17 | var id = "project-libs-copy-input"; 18 | var ele = document.getElementById(id); 19 | if (ele) { 20 | ele.value = str; 21 | ele.select(); 22 | document.execCommand('copy'); 23 | } 24 | else { 25 | var input = document.createElement("input"); 26 | input.setAttribute("id", id); 27 | input.style.display = "none"; 28 | input.style.position = "absolute"; 29 | input.style.left = "-9999px"; 30 | input.value = str; 31 | document.body.appendChild(input); 32 | input.select(); 33 | document.execCommand('copy'); 34 | } 35 | resolve({ 36 | stauts: 1, 37 | data: str 38 | }); 39 | } 40 | catch (error) { 41 | reject({ 42 | status: 0, 43 | error: error 44 | }); 45 | } 46 | }); 47 | } 48 | -------------------------------------------------------------------------------- /build/src/browser/createLink.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = createLink; 4 | var type_1 = require("../type/type"); 5 | /** 6 | * 在 head 中创建 css 的 link 标签 7 | * @param url {string} url 地址 8 | */ 9 | function createLink(url) { 10 | if ((0, type_1.default)(url) !== 'string') { 11 | console.error('project-libs(createLink方法参数错误):url必须为字符串'); 12 | return; 13 | } 14 | var cssLink = document.createElement("link"); 15 | cssLink.rel = "stylesheet"; 16 | cssLink.type = "text/css"; 17 | cssLink.href = url; 18 | var head = document.getElementsByTagName("head")[0]; 19 | head.appendChild(cssLink); 20 | } 21 | -------------------------------------------------------------------------------- /build/src/browser/createScript.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = createScript; 4 | /** 5 | * 创建 script 标签 6 | * @param url {string} src的地址 7 | */ 8 | function createScript(url) { 9 | var head = document.getElementsByTagName('head')[0]; 10 | var script = document.createElement("script"); 11 | script.type = 'text/javascript'; 12 | script.src = url; 13 | head.appendChild(script); 14 | } 15 | -------------------------------------------------------------------------------- /build/src/browser/getScrollTop.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = getScrollTop; 4 | /** 5 | * 获取浏览器滚动条位置 6 | */ 7 | function getScrollTop() { 8 | var scroll_top = 0; 9 | if (document.documentElement && document.documentElement.scrollTop) { 10 | scroll_top = document.documentElement.scrollTop; 11 | } 12 | else if (document.body) { 13 | scroll_top = document.body.scrollTop; 14 | } 15 | return scroll_top; 16 | } 17 | -------------------------------------------------------------------------------- /build/src/browser/scrollToTop.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = scrollToTop; 4 | /** 5 | * 基于 window.requestAnimationFrame() 滚动到浏览器顶部 6 | */ 7 | function scrollToTop() { 8 | var top = document.documentElement.scrollTop || document.body.scrollTop; 9 | if (top > 0) { 10 | window.requestAnimationFrame(scrollToTop); 11 | window.scrollTo(0, top - top / 8); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /build/src/browser/urlGet.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = urlGet; 4 | var type_1 = require("../type/type"); 5 | /** 6 | * 获得URL中GET请求的参数值 7 | * @param key {string} 参数,可选,如果没有则返回所有的键值对 8 | * @param href {string} 网址,如果没有则默认选取当前网址 9 | * @returns {string | null} 如果有值返回字符串,否则返回 null 10 | */ 11 | function urlGet(key, href) { 12 | if (key && (0, type_1.default)(key) !== 'string') { 13 | console.error('project-libs(urlGet方法参数错误):key必须为字符串'); 14 | return; 15 | } 16 | if (href && (0, type_1.default)(href) !== 'string') { 17 | console.error('project-libs(urlGet方法参数错误):href必须为字符串'); 18 | return; 19 | } 20 | var querystr = href ? href.split("?") : window.location.href.split("?"); 21 | if (querystr[1]) { 22 | var GETs = querystr[1].split("&"); 23 | var obj_1 = {}; 24 | GETs.forEach(function (item) { 25 | var _item = item.split("="); 26 | obj_1[_item[0]] = decodeURIComponent(_item[1]); 27 | }); 28 | return key ? obj_1[key] : obj_1; 29 | } 30 | return null; 31 | } 32 | -------------------------------------------------------------------------------- /build/src/browser/urlParams.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = urlParams; 4 | /** 5 | * 将键值对拼接成URL带参数 6 | * @param obj {object} 对象 7 | * @param encode {boolean} 是否进行encode,默认false 8 | * @returns {string} 字符串 9 | * @example 10 | * ``` 11 | * urlParams({id:10, addr: 'zz'}) 12 | * // "id=10&addr=zz" 13 | * 14 | * urlParams({id:10, addr: 'zz'}, true) 15 | * // "id%3D10%26addr%3Dzz" 16 | * ``` 17 | */ 18 | function urlParams(obj, encode) { 19 | if (encode === void 0) { encode = false; } 20 | var urls = []; 21 | var add = function (key, value) { 22 | return key + '=' + value; 23 | }; 24 | for (var k in obj) { 25 | urls.push(add(k, obj[k])); 26 | } 27 | var str = urls.join('&'); 28 | return encode ? encodeURIComponent(str) : str; 29 | } 30 | -------------------------------------------------------------------------------- /build/src/cache/cookie.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var isJsonString_1 = require("../type/isJsonString"); 4 | ; 5 | /** 6 | * 操作 cookie 7 | */ 8 | var cookie = { 9 | /** 10 | * 判断cookie是否可用 11 | * @returns {boolean} boolean 12 | */ 13 | support: function () { 14 | if (!(document.cookie || navigator.cookieEnabled)) 15 | return false; 16 | return true; 17 | }, 18 | /** 19 | * 添加cookie 20 | * @param name {string} cookie 键 21 | * @param value {string | object} cookie 值 22 | * @param config {object} 可选配置项 23 | * ``` 24 | * { 25 | * hours: 过期时间,单位小时, 26 | * path: 路径, 27 | * domain: 域名, 28 | * secure: 安全策略, 29 | * httpOnly: 设置键值对是否可以被 js 访问, 30 | * sameSite: 用来限制第三方 Cookie 31 | * } 32 | * ``` 33 | */ 34 | set: function (name, value, config) { 35 | if (!this.support()) { 36 | console.error('project-libs(Cookie方法不可用):浏览器不支持Cookie,请检查相关设置'); 37 | return; 38 | } 39 | var data = name + "=" + encodeURIComponent(JSON.stringify(value)); 40 | if (config === null || config === void 0 ? void 0 : config.hours) { 41 | var d = new Date(); 42 | d.setHours(d.getHours() + (config === null || config === void 0 ? void 0 : config.hours)); 43 | data += "; expires=" + d.toUTCString(); 44 | } 45 | if (config === null || config === void 0 ? void 0 : config.path) { 46 | data += "; path=" + config.path; 47 | } 48 | if (config === null || config === void 0 ? void 0 : config.domain) { 49 | data += "; domain=" + config.domain; 50 | } 51 | if (config === null || config === void 0 ? void 0 : config.secure) { 52 | data += "; secure=" + config.secure; 53 | } 54 | if (config === null || config === void 0 ? void 0 : config.httpOnly) { 55 | data += "; httpOnly=" + config.httpOnly; 56 | } 57 | if (config === null || config === void 0 ? void 0 : config.sameSite) { 58 | data += "; sameSite=" + config.sameSite; 59 | } 60 | document.cookie = data; 61 | }, 62 | /** 63 | * 查询 cookie 64 | * @param name {string} Cookie 的键;如果参数为空则获取所有的cookie 65 | * @returns {string | object | null} 有参数获取cookie后返回字符串,没有参数获取cookie返回json;获取不到则返回 null 66 | */ 67 | get: function (name) { 68 | if (!this.support()) { 69 | console.error('project-libs(Cookie方法不可用):浏览器不支持Cookie,请检查相关设置'); 70 | return; 71 | } 72 | var cs = document.cookie, arr = [], obj = {}; 73 | arr = cs.split(';'); 74 | if (cs !== '') { 75 | for (var i = 0; i < arr.length; i++) { 76 | var a = arr[i].split('='); 77 | var key = a[0].trim(); 78 | if (key !== '') { 79 | var val = decodeURIComponent(a[1]); 80 | obj[key] = isJsonString_1.default ? JSON.parse(val) : val; 81 | } 82 | } 83 | return name ? obj[name] : obj; 84 | } 85 | else { 86 | return null; 87 | } 88 | }, 89 | /** 90 | * 删除 cookie 91 | * @param name Cookie 的键;如果参数为空,则清理所有的cookie 92 | * @param path 路径,默认为'' 93 | */ 94 | remove: function (name, path) { 95 | var _this = this; 96 | if (!this.support()) { 97 | console.error('project-libs(Cookie方法不可用):浏览器不支持Cookie,请检查相关设置'); 98 | return; 99 | } 100 | if (arguments.length === 0) { 101 | var all = this.get(); 102 | Object.keys(all).forEach(function (item) { 103 | _this.set(item, "", { hours: -1 }); 104 | }); 105 | } 106 | else { 107 | this.set(name, path || '', { "hours": -1 }); 108 | } 109 | } 110 | }; 111 | exports.default = cookie; 112 | -------------------------------------------------------------------------------- /build/src/data/base64.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var Base64 = /** @class */ (function () { 4 | function Base64() { 5 | } 6 | /** 7 | * 字符串转 base64 8 | * @param str {string} 字符串 9 | * @returns {string} 字符串 10 | * @summary btoa() 方法不支持 IE9 及更早的 IE 版本 11 | */ 12 | Base64.encode = function (str) { 13 | var code = encodeURI(str); 14 | return btoa(code); 15 | }; 16 | /** 17 | * base64 转字符串 18 | * @param str {string} 字符串 19 | * @returns {string} 字符串 20 | * @summary atob() 方法不支持 IE9 及更早的 IE 版本 21 | */ 22 | Base64.decode = function (str) { 23 | var code = atob(str); 24 | return decodeURI(code); 25 | }; 26 | return Base64; 27 | }()); 28 | var base64 = new Base64(); 29 | exports.default = base64; 30 | -------------------------------------------------------------------------------- /build/src/data/clone.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = clone; 4 | /** 5 | * 浅拷贝,才方法只针对普通对象{}和数组[] 6 | * @param source 7 | * @returns {any} any 8 | */ 9 | function clone(source) { 10 | return JSON.parse(JSON.stringify(source)); 11 | } 12 | -------------------------------------------------------------------------------- /build/src/data/compare.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = compare; 4 | /** 5 | * 判断两个变量是否相等, 此方法用于相同数据类型的变量比较 6 | * @param a {any} 7 | * @param b {any} 8 | * @returns {boolean} boolean 9 | */ 10 | function compare(a, b) { 11 | var pt = /undefined|number|string|boolean/, fn = /^(function\s*)(\w*\b)/, cr = "constructor", cn = "childNodes", pn = "parentNode"; 12 | if (pt.test(typeof a) || pt.test(typeof b) || a === null || b === null) { 13 | return a === b || (isNaN(a) && isNaN(b)); //为了方便,此处假定NaN == NaN 14 | } 15 | if (a[cr] !== b[cr]) { 16 | return false; 17 | } 18 | switch (a[cr]) { 19 | case Date: 20 | return a.valueOf() === b.valueOf(); 21 | case Function: 22 | return a.toString().replace(fn, '$1') === b.toString().replace(fn, '$1'); //硬编码中声明函数的方式会影响到toString的结果,因此用正则进行格式化 23 | case Array: 24 | if (a.length !== b.length) { 25 | return false; 26 | } 27 | for (var i = 0; i < a.length; i++) { 28 | if (a[i].toString() == b[i].toString()) { } 29 | } 30 | break; 31 | default: 32 | var alen = 0, blen = 0, d = void 0; 33 | if (a === b) { 34 | return true; 35 | } 36 | if (a[cn] || a[pn] || b[cn] || b[pn]) { 37 | return a === b; 38 | } 39 | for (d in a) { 40 | alen++; 41 | } 42 | for (d in b) { 43 | blen++; 44 | } 45 | if (alen !== blen) { 46 | return false; 47 | } 48 | for (d in a) { 49 | if (a[d].toString() != b[d].toString()) { 50 | return false; 51 | } 52 | } 53 | break; 54 | } 55 | return true; 56 | } 57 | -------------------------------------------------------------------------------- /build/src/data/deepClone.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = deepClone; 4 | var type_1 = require("../type/type"); 5 | /** 6 | * 深层次克隆 7 | * @param data {any} 数据源 8 | * @returns {any} any 9 | */ 10 | function deepClone(data) { 11 | var t = (0, type_1.default)(data), o, i, ni; 12 | if (t === 'array') { 13 | o = []; 14 | } 15 | else if (t === 'object') { 16 | o = {}; 17 | } 18 | else { 19 | return data; 20 | } 21 | if (t === 'array') { 22 | for (i = 0, ni = data.length; i < ni; i++) { 23 | o.push(deepClone(data[i])); 24 | } 25 | return o; 26 | } 27 | else if (t === 'object') { 28 | for (i in data) { 29 | o[i] = deepClone(data[i]); 30 | } 31 | return o; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /build/src/data/json2FormData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = json2FormData; 4 | var type_1 = require("../type/type"); 5 | /** 6 | * 对象转为 formdata 7 | * @param obj {object} 对象 8 | * @returns {FormData} FormData 9 | */ 10 | function json2FormData(obj) { 11 | if ((0, type_1.default)(obj) !== 'object') { 12 | console.error('project-libs(json2FormData方法参数错误):obj必须为对象'); 13 | return; 14 | } 15 | var formData = new FormData(); 16 | for (var i in obj) { 17 | parse(obj[i], i); 18 | } 19 | function parse(array, key) { 20 | if ((0, type_1.default)(array) === "undefined" || (0, type_1.default)(array) === "function") { 21 | return false; 22 | } 23 | switch ((0, type_1.default)(array)) { 24 | case "array": 25 | if (array.length === 0) { 26 | formData.append("".concat(key), ""); 27 | } 28 | else { 29 | for (var i in array) { 30 | for (var j in array[i]) { 31 | parse(array[i][j], "".concat(key, "[").concat(i, "].").concat(j)); 32 | } 33 | } 34 | } 35 | break; 36 | case "object": 37 | for (var j in array) { 38 | parse(array[j], "".concat(key, ".").concat(j)); 39 | } 40 | break; 41 | default: 42 | formData.append(key, array); 43 | break; 44 | } 45 | } 46 | return formData; 47 | } 48 | -------------------------------------------------------------------------------- /build/src/data/pick.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = pick; 4 | /** 5 | * 从对象中根据特定的属性返回一个新的对象 6 | * @param object 对象来源 7 | * @param props 要选取的属性 8 | */ 9 | function pick(object, props) { 10 | if (!Array.isArray(object) || !Array.isArray(props)) { 11 | console.error("对象来源和要选取的属性必须为数组!"); 12 | } 13 | else { 14 | var obj_1 = {}; 15 | props.forEach(function (item) { 16 | // @ts-ignore 17 | obj_1[item] = object[item]; 18 | }); 19 | return obj_1; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /build/src/data/replace.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = replace; 4 | ; 5 | /** 6 | * replace 函数,可以根据指定的选项来替换内容 7 | * @param source 需要替换的资源 8 | * @param option 选项,可以为对象或者对象数组,{target: '<', replace: ''} 或者 [{target: '<', replace: ''}] 9 | * @returns {string} string 10 | */ 11 | function replace(source, option) { 12 | if (Array.isArray(option)) { 13 | var _source_1 = source; 14 | option.forEach(function (item) { 15 | var reg = new RegExp(item.target, 'g'); 16 | _source_1 = _source_1.replace(reg, item.replace); 17 | }); 18 | return _source_1; 19 | } 20 | if (option.constructor === Object) { 21 | var reg = new RegExp(option.target, 'g'); 22 | return source.replace(reg, option.replace); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /build/src/data/unPick.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = unPick; 4 | /** 5 | * 从对象中排除特定的属性返回一个新的对象 6 | * @param object 对象来源 7 | * @param props 要排除的属性 8 | */ 9 | function unPick(object, props) { 10 | if (Array.isArray(props)) { 11 | var obj = {}; 12 | for (var i in object) { 13 | if (!props.includes(i)) { 14 | // @ts-ignore 15 | obj[i] = object[i]; 16 | } 17 | } 18 | return obj; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /build/src/func/compose.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __read = (this && this.__read) || function (o, n) { 3 | var m = typeof Symbol === "function" && o[Symbol.iterator]; 4 | if (!m) return o; 5 | var i = m.call(o), r, ar = [], e; 6 | try { 7 | while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); 8 | } 9 | catch (error) { e = { error: error }; } 10 | finally { 11 | try { 12 | if (r && !r.done && (m = i["return"])) m.call(i); 13 | } 14 | finally { if (e) throw e.error; } 15 | } 16 | return ar; 17 | }; 18 | var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { 19 | if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { 20 | if (ar || !(i in from)) { 21 | if (!ar) ar = Array.prototype.slice.call(from, 0, i); 22 | ar[i] = from[i]; 23 | } 24 | } 25 | return to.concat(ar || Array.prototype.slice.call(from)); 26 | }; 27 | Object.defineProperty(exports, "__esModule", { value: true }); 28 | exports.default = compose; 29 | /** 30 | * 组合函数,从右向左依次执行 31 | * @returns {any} any 32 | * @example 33 | * ``` 34 | * function a(name) { return 'test:' + name } 35 | function b(statement) { return statement.toUpperCase() + '!' } 36 | function c(str) { return str.replace(/[cC]/, 'CCCCC') } 37 | compose(a, b, c)('com') 38 | // test:CCCCCOM! 39 | * ``` 40 | */ 41 | function compose() { 42 | var fns = __spreadArray([], __read(arguments), false); 43 | return function (arg) { 44 | var res = arg; 45 | for (var i = fns.length - 1; i > -1; i--) { 46 | res = fns[i](res); 47 | } 48 | return res; 49 | }; 50 | } 51 | -------------------------------------------------------------------------------- /build/src/func/curry.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __read = (this && this.__read) || function (o, n) { 3 | var m = typeof Symbol === "function" && o[Symbol.iterator]; 4 | if (!m) return o; 5 | var i = m.call(o), r, ar = [], e; 6 | try { 7 | while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); 8 | } 9 | catch (error) { e = { error: error }; } 10 | finally { 11 | try { 12 | if (r && !r.done && (m = i["return"])) m.call(i); 13 | } 14 | finally { if (e) throw e.error; } 15 | } 16 | return ar; 17 | }; 18 | var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { 19 | if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { 20 | if (ar || !(i in from)) { 21 | if (!ar) ar = Array.prototype.slice.call(from, 0, i); 22 | ar[i] = from[i]; 23 | } 24 | } 25 | return to.concat(ar || Array.prototype.slice.call(from)); 26 | }; 27 | Object.defineProperty(exports, "__esModule", { value: true }); 28 | exports.default = curry; 29 | /** 30 | * 用来柯里化的函数 31 | * @param fn {Function} 32 | * @returns {any} any 33 | * @example 34 | * ``` 35 | * let abc = function(a, b, c) { 36 | return [a, b, c]; 37 | }; 38 | const curried = curry(abc); 39 | curried(1)(2)(3); 40 | // [1,2,3] 41 | * ``` 42 | */ 43 | function curry(fn) { 44 | return function aa() { 45 | var arg = []; 46 | for (var _i = 0; _i < arguments.length; _i++) { 47 | arg[_i] = arguments[_i]; 48 | } 49 | if (arg.length >= fn.length) { 50 | return fn.apply(void 0, __spreadArray([], __read(arg), false)); 51 | } 52 | else { 53 | return aa.bind.apply(aa, __spreadArray([null], __read(arg), false)); 54 | } 55 | }; 56 | } 57 | -------------------------------------------------------------------------------- /build/src/func/pipe.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __read = (this && this.__read) || function (o, n) { 3 | var m = typeof Symbol === "function" && o[Symbol.iterator]; 4 | if (!m) return o; 5 | var i = m.call(o), r, ar = [], e; 6 | try { 7 | while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); 8 | } 9 | catch (error) { e = { error: error }; } 10 | finally { 11 | try { 12 | if (r && !r.done && (m = i["return"])) m.call(i); 13 | } 14 | finally { if (e) throw e.error; } 15 | } 16 | return ar; 17 | }; 18 | var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { 19 | if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { 20 | if (ar || !(i in from)) { 21 | if (!ar) ar = Array.prototype.slice.call(from, 0, i); 22 | ar[i] = from[i]; 23 | } 24 | } 25 | return to.concat(ar || Array.prototype.slice.call(from)); 26 | }; 27 | Object.defineProperty(exports, "__esModule", { value: true }); 28 | exports.default = pipe; 29 | /** 30 | * 管道函数,从左向右依次执行 31 | * @returns {any} any 32 | * @example 33 | * ``` 34 | * function a(name) { return 'test:' + name } 35 | function b(statement) { return statement.toUpperCase() + '!' } 36 | function c(str) { return str.replace(/[cC]/, 'CCCCC') } 37 | pipe(a, b, c)('com') 38 | // TEST:CCCCCOM! 39 | * ``` 40 | */ 41 | function pipe() { 42 | var fns = __spreadArray([], __read(arguments), false); 43 | return function (arg) { 44 | var res = arg; 45 | for (var i = 0; i < fns.length; i++) { 46 | res = fns[i](res); 47 | } 48 | return res; 49 | }; 50 | } 51 | -------------------------------------------------------------------------------- /build/src/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.isQQNumber = exports.isPostCode = exports.isIDCard = exports.isIP = exports.isMobile = exports.isEmail = exports.isPhone = exports.isIos = exports.isApple = exports.isAndroid = exports.arrayIntersection = exports.arrayGroup = exports.arrayIndex = exports.arrayUnique = exports.pick = exports.base64 = exports.json2FormData = exports.compare = exports.deepClone = exports.clone = exports.replace = exports.pipe = exports.compose = exports.curry = exports.getYear = exports.getMonth = exports.getDay = exports.timeBeauty = exports.timestamp = exports.sleep = exports.urlParams = exports.urlGet = exports.scrollToTop = exports.getScrollTop = exports.createScript = exports.createLink = exports.copy = exports.cookie = exports.isJsonString = exports.isEmpty = exports.type = void 0; 4 | // 类型 5 | var type_1 = require("./type/type"); 6 | Object.defineProperty(exports, "type", { enumerable: true, get: function () { return type_1.default; } }); 7 | var isEmpty_1 = require("./type/isEmpty"); 8 | Object.defineProperty(exports, "isEmpty", { enumerable: true, get: function () { return isEmpty_1.default; } }); 9 | var isJsonString_1 = require("./type/isJsonString"); 10 | Object.defineProperty(exports, "isJsonString", { enumerable: true, get: function () { return isJsonString_1.default; } }); 11 | // 缓存 12 | var cookie_1 = require("./cache/cookie"); 13 | Object.defineProperty(exports, "cookie", { enumerable: true, get: function () { return cookie_1.default; } }); 14 | // 浏览器 15 | var copy_1 = require("./browser/copy"); 16 | Object.defineProperty(exports, "copy", { enumerable: true, get: function () { return copy_1.default; } }); 17 | var createLink_1 = require("./browser/createLink"); 18 | Object.defineProperty(exports, "createLink", { enumerable: true, get: function () { return createLink_1.default; } }); 19 | var createScript_1 = require("./browser/createScript"); 20 | Object.defineProperty(exports, "createScript", { enumerable: true, get: function () { return createScript_1.default; } }); 21 | var getScrollTop_1 = require("./browser/getScrollTop"); 22 | Object.defineProperty(exports, "getScrollTop", { enumerable: true, get: function () { return getScrollTop_1.default; } }); 23 | var scrollToTop_1 = require("./browser/scrollToTop"); 24 | Object.defineProperty(exports, "scrollToTop", { enumerable: true, get: function () { return scrollToTop_1.default; } }); 25 | var urlGet_1 = require("./browser/urlGet"); 26 | Object.defineProperty(exports, "urlGet", { enumerable: true, get: function () { return urlGet_1.default; } }); 27 | var urlParams_1 = require("./browser/urlParams"); 28 | Object.defineProperty(exports, "urlParams", { enumerable: true, get: function () { return urlParams_1.default; } }); 29 | // 时间 30 | var sleep_1 = require("./time/sleep"); 31 | Object.defineProperty(exports, "sleep", { enumerable: true, get: function () { return sleep_1.default; } }); 32 | var timestamp_1 = require("./time/timestamp"); 33 | Object.defineProperty(exports, "timestamp", { enumerable: true, get: function () { return timestamp_1.default; } }); 34 | var timeBeauty_1 = require("./time/timeBeauty"); 35 | Object.defineProperty(exports, "timeBeauty", { enumerable: true, get: function () { return timeBeauty_1.default; } }); 36 | var getDay_1 = require("./time/getDay"); 37 | Object.defineProperty(exports, "getDay", { enumerable: true, get: function () { return getDay_1.default; } }); 38 | var getMonth_1 = require("./time/getMonth"); 39 | Object.defineProperty(exports, "getMonth", { enumerable: true, get: function () { return getMonth_1.default; } }); 40 | var getYear_1 = require("./time/getYear"); 41 | Object.defineProperty(exports, "getYear", { enumerable: true, get: function () { return getYear_1.default; } }); 42 | // 函数式 43 | var curry_1 = require("./func/curry"); 44 | Object.defineProperty(exports, "curry", { enumerable: true, get: function () { return curry_1.default; } }); 45 | var compose_1 = require("./func/compose"); 46 | Object.defineProperty(exports, "compose", { enumerable: true, get: function () { return compose_1.default; } }); 47 | var pipe_1 = require("./func/pipe"); 48 | Object.defineProperty(exports, "pipe", { enumerable: true, get: function () { return pipe_1.default; } }); 49 | // 数据处理 50 | var replace_1 = require("./data/replace"); 51 | Object.defineProperty(exports, "replace", { enumerable: true, get: function () { return replace_1.default; } }); 52 | var clone_1 = require("./data/clone"); 53 | Object.defineProperty(exports, "clone", { enumerable: true, get: function () { return clone_1.default; } }); 54 | var deepClone_1 = require("./data/deepClone"); 55 | Object.defineProperty(exports, "deepClone", { enumerable: true, get: function () { return deepClone_1.default; } }); 56 | var compare_1 = require("./data/compare"); 57 | Object.defineProperty(exports, "compare", { enumerable: true, get: function () { return compare_1.default; } }); 58 | var json2FormData_1 = require("./data/json2FormData"); 59 | Object.defineProperty(exports, "json2FormData", { enumerable: true, get: function () { return json2FormData_1.default; } }); 60 | var base64_1 = require("./data/base64"); 61 | Object.defineProperty(exports, "base64", { enumerable: true, get: function () { return base64_1.default; } }); 62 | var pick_1 = require("./data/pick"); 63 | Object.defineProperty(exports, "pick", { enumerable: true, get: function () { return pick_1.default; } }); 64 | // 数组 65 | var arrayUnique_1 = require("./array/arrayUnique"); 66 | Object.defineProperty(exports, "arrayUnique", { enumerable: true, get: function () { return arrayUnique_1.default; } }); 67 | var arrayIndex_1 = require("./array/arrayIndex"); 68 | Object.defineProperty(exports, "arrayIndex", { enumerable: true, get: function () { return arrayIndex_1.default; } }); 69 | var arrayGroup_1 = require("./array/arrayGroup"); 70 | Object.defineProperty(exports, "arrayGroup", { enumerable: true, get: function () { return arrayGroup_1.default; } }); 71 | var arrayIntersection_1 = require("./array/arrayIntersection"); 72 | Object.defineProperty(exports, "arrayIntersection", { enumerable: true, get: function () { return arrayIntersection_1.default; } }); 73 | // 验证 74 | var isAndroid_1 = require("./is/isAndroid"); 75 | Object.defineProperty(exports, "isAndroid", { enumerable: true, get: function () { return isAndroid_1.default; } }); 76 | var isApple_1 = require("./is/isApple"); 77 | Object.defineProperty(exports, "isApple", { enumerable: true, get: function () { return isApple_1.default; } }); 78 | var isIos_1 = require("./is/isIos"); 79 | Object.defineProperty(exports, "isIos", { enumerable: true, get: function () { return isIos_1.default; } }); 80 | var isPhone_1 = require("./is/isPhone"); 81 | Object.defineProperty(exports, "isPhone", { enumerable: true, get: function () { return isPhone_1.default; } }); 82 | var isEmail_1 = require("./is/isEmail"); 83 | Object.defineProperty(exports, "isEmail", { enumerable: true, get: function () { return isEmail_1.default; } }); 84 | var isMobile_1 = require("./is/isMobile"); 85 | Object.defineProperty(exports, "isMobile", { enumerable: true, get: function () { return isMobile_1.default; } }); 86 | var isIP_1 = require("./is/isIP"); 87 | Object.defineProperty(exports, "isIP", { enumerable: true, get: function () { return isIP_1.default; } }); 88 | var isIDCard_1 = require("./is/isIDCard"); 89 | Object.defineProperty(exports, "isIDCard", { enumerable: true, get: function () { return isIDCard_1.default; } }); 90 | var isPostCode_1 = require("./is/isPostCode"); 91 | Object.defineProperty(exports, "isPostCode", { enumerable: true, get: function () { return isPostCode_1.default; } }); 92 | var isQQNumber_1 = require("./is/isQQNumber"); 93 | Object.defineProperty(exports, "isQQNumber", { enumerable: true, get: function () { return isQQNumber_1.default; } }); 94 | -------------------------------------------------------------------------------- /build/src/is/isAndroid.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isAndroid; 4 | /** 5 | * 判断是否是安卓设备 6 | * @returns {boolean} boolean 7 | */ 8 | function isAndroid() { 9 | return /android/i.test(navigator.userAgent.toLowerCase()); 10 | } 11 | -------------------------------------------------------------------------------- /build/src/is/isApple.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isApple; 4 | /** 5 | * 判断是否是苹果设备 6 | * @returns {boolean} boolean 7 | */ 8 | function isApple() { 9 | return /iphone|ipod|ipad|Macintosh/i.test(navigator.userAgent.toLowerCase()); 10 | } 11 | -------------------------------------------------------------------------------- /build/src/is/isEmail.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isEmail; 4 | var _domains = [ 5 | "qq.com", 6 | "163.com", 7 | "126.com", 8 | "vip.126.com", 9 | "yeah.net", 10 | "vip.163.com", 11 | "188.com", 12 | "sohu.com", 13 | "sina.cn", 14 | "sina.com", 15 | "gmail.com", 16 | "hotmail.com", 17 | "outlook.com" 18 | ]; 19 | /** 20 | * 判断邮箱是否正确,可以自定义邮箱后缀 21 | * @param email {string} 邮箱 22 | * @param domains {array[string]} 域名 ["163.com"] 23 | * @returns {boolean} boolean 24 | * 默认支持的邮箱:[ 25 | "qq.com", 26 | "163.com", 27 | "126.com", 28 | "vip.126.com", 29 | "yeah.net", 30 | "vip.163.com", 31 | "188.com", 32 | "sohu.com", 33 | "sina.cn", 34 | "sina.com", 35 | "gmail.com", 36 | "hotmail.com", 37 | "outlook.com" 38 | ] 39 | */ 40 | function isEmail(email, domains) { 41 | if (domains === void 0) { domains = _domains; } 42 | if (domains && !Array.isArray(domains)) { 43 | console.error('project-libs(isEmail参数错误):域名必须为数组'); 44 | } 45 | var reg = new RegExp("^([A-Za-z0-9._-])+@(".concat(domains.join("|"), ")$")); 46 | return reg.test(email); 47 | } 48 | -------------------------------------------------------------------------------- /build/src/is/isIDCard.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isIDCard; 4 | var type_1 = require("../type/type"); 5 | /** 6 | * 验证是否为第二代居民身份证 7 | * 规则: 8 | * 共18位,最后一位可为X(大小写均可) 9 | * 不能以0开头 10 | * 出生年月日会进行校验:年份只能为18/19/2*开头,月份只能为01-12,日只能为01-31 11 | * @param card {string} 身份证号码 12 | * @returns {boolean} boolean 13 | */ 14 | function isIDCard(card) { 15 | if ((0, type_1.default)(card) !== 'string') { 16 | console.error('project-libs(isIDCard方法参数错误):card必须为字符串'); 17 | return; 18 | } 19 | return /^[1-9][0-9]{5}(18|19|(2[0-9]))[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{3}[0-9Xx]$/.test(card); 20 | } 21 | -------------------------------------------------------------------------------- /build/src/is/isIP.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isIP; 4 | var type_1 = require("../type/type"); 5 | /** 6 | * 校验是否为不含端口号的IP地址 7 | * 规则: 8 | * IP格式为xxx.xxx.xxx.xxx,每一项数字取值范围为0-255 9 | * 除0以外其他数字不能以0开头,比如02 10 | * @param ip {string} ip地址,类型为字符串 11 | * @returns {boolean} boolean 12 | */ 13 | function isIP(ip) { 14 | if ((0, type_1.default)(ip) !== 'string') { 15 | console.error('project-libs(isIP方法参数错误):ip必须为字符串'); 16 | return; 17 | } 18 | return /^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$/.test(ip); 19 | } 20 | -------------------------------------------------------------------------------- /build/src/is/isIos.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isIos; 4 | /** 5 | * 判断是否是 ios 设备 6 | * @returns {boolean} boolean 7 | */ 8 | function isIos() { 9 | return /iphone|ipod|ipad/i.test(navigator.userAgent.toLowerCase()); 10 | } 11 | -------------------------------------------------------------------------------- /build/src/is/isMobile.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isMobile; 4 | /** 5 | * 判断是否为手机端 6 | * @returns {boolean} boolean 7 | */ 8 | function isMobile() { 9 | return /iphone|ipod|android.*mobile|windows.*phone|blackberry.*mobile/i.test(navigator.userAgent.toLowerCase()); 10 | } 11 | -------------------------------------------------------------------------------- /build/src/is/isPhone.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isPhone; 4 | /** 5 | * 验证是否是电话号码,可以自定义第二个号码 6 | * @param phone {string} 电话号码 7 | * @param second {array} 电话号码的第二个号码规则,可选,例如[3,4,5,7,8] 8 | * @returns {boolean} boolean 9 | */ 10 | function isPhone(phone, second) { 11 | if (second === void 0) { second = [3, 4, 5, 7, 8]; } 12 | var reg = new RegExp("^[1]".concat(JSON.stringify(second), "[0-9]{9}$")); 13 | return reg.test(phone); 14 | } 15 | -------------------------------------------------------------------------------- /build/src/is/isPostCode.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isPostCode; 4 | var type_1 = require("../type/type"); 5 | /** 6 | * 验证是否为邮政编码 7 | * @param code {string} 邮政编码 8 | * @returns {boolean} boolean 9 | */ 10 | function isPostCode(code) { 11 | if ((0, type_1.default)(code) !== 'string') { 12 | console.error('project-libs(isPostCode方法参数错误):code必须为字符串'); 13 | return; 14 | } 15 | return /^[1-9][0-9]{5}$/.test(code.toString()); 16 | } 17 | -------------------------------------------------------------------------------- /build/src/is/isQQNumber.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isQQNumber; 4 | var type_1 = require("../type/type"); 5 | /** 6 | * 验证是否是 qq 号码 7 | * 规则:非0开头的5位-13位整数 8 | * @param qq {string} qq号码,字符串 9 | * @returns {boolean} boolean 10 | */ 11 | function isQQNumber(qq) { 12 | if ((0, type_1.default)(qq) !== 'string') { 13 | console.error('project-libs(isQQNumber方法参数错误):qq必须为字符串'); 14 | return; 15 | } 16 | return /^[1-9][0-9]{4,12}$/.test(qq); 17 | } 18 | -------------------------------------------------------------------------------- /build/src/is/isURL.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isURL; 4 | /** 5 | * 验证是否为网址 6 | * @param url {string} 网址 7 | * @returns {boolean} boolean 8 | */ 9 | function isURL(url) { 10 | var regular = /^\b(((https?|ftp):\/\/)?[-a-z0-9]+(\.[-a-z0-9]+)*\.(?:com|edu|gov|int|mil|net|org|biz|info|name|museum|asia|coop|aero|[a-z][a-z]|((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]\d)|\d))\b(\/[-a-z0-9_:\@&?=+,.!\/~%\$]*)?)$/i; 11 | return regular.test(url); 12 | } 13 | -------------------------------------------------------------------------------- /build/src/time/getDay.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = getDay; 4 | /** 5 | * 获取某一天 6 | * @param fill {boolean} 布尔值,是否补 0,默认为 true 7 | * @returns {number | string} 返回哪一天 8 | */ 9 | function getDay(fill) { 10 | if (fill === void 0) { fill = true; } 11 | var day = new Date().getDate(); 12 | var _day = day; 13 | if (fill) { 14 | _day = day < 10 ? "0".concat(day) : day; 15 | } 16 | return _day; 17 | } 18 | -------------------------------------------------------------------------------- /build/src/time/getMonth.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = getMonth; 4 | /** 5 | * 获取当前月份 6 | * @param {Boolean} fill 布尔值,是否补 0,默认为 true 7 | */ 8 | function getMonth(fill) { 9 | if (fill === void 0) { fill = true; } 10 | var mon = new Date().getMonth() + 1; 11 | var monRe = mon; 12 | if (fill) 13 | mon < 10 ? "0".concat(mon) : mon; 14 | return monRe; 15 | } 16 | -------------------------------------------------------------------------------- /build/src/time/getYear.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = getYear; 4 | /** 5 | * 获取年份 6 | * @returns {number} 返回哪一年 7 | */ 8 | function getYear() { 9 | return new Date().getFullYear(); 10 | } 11 | -------------------------------------------------------------------------------- /build/src/time/sleep.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 4 | return new (P || (P = Promise))(function (resolve, reject) { 5 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 6 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 7 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 8 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 9 | }); 10 | }; 11 | var __generator = (this && this.__generator) || function (thisArg, body) { 12 | var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); 13 | return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; 14 | function verb(n) { return function (v) { return step([n, v]); }; } 15 | function step(op) { 16 | if (f) throw new TypeError("Generator is already executing."); 17 | while (g && (g = 0, op[0] && (_ = 0)), _) try { 18 | if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; 19 | if (y = 0, t) op = [op[0] & 2, t.value]; 20 | switch (op[0]) { 21 | case 0: case 1: t = op; break; 22 | case 4: _.label++; return { value: op[1], done: false }; 23 | case 5: _.label++; y = op[1]; op = [0]; continue; 24 | case 7: op = _.ops.pop(); _.trys.pop(); continue; 25 | default: 26 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } 27 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } 28 | if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } 29 | if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } 30 | if (t[2]) _.ops.pop(); 31 | _.trys.pop(); continue; 32 | } 33 | op = body.call(thisArg, _); 34 | } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } 35 | if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; 36 | } 37 | }; 38 | Object.defineProperty(exports, "__esModule", { value: true }); 39 | exports.default = sleep; 40 | /** 41 | * 睡眠函数 42 | * @param delay 睡眠时间(毫秒),默认为 0 43 | * @returns {promise} 返回一个 promise 对象 44 | */ 45 | function sleep() { 46 | return __awaiter(this, arguments, void 0, function (delay) { 47 | if (delay === void 0) { delay = 0; } 48 | return __generator(this, function (_a) { 49 | return [2 /*return*/, new Promise(function (resolve) { return setTimeout(resolve, delay); })]; 50 | }); 51 | }); 52 | } 53 | -------------------------------------------------------------------------------- /build/src/time/timeBeauty.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = timeBeauty; 4 | var type_1 = require("../type/type"); 5 | /** 6 | * 时间美化函数 7 | * @param timestamp {string | number} 字符串或者数字 8 | * @returns {string} 返回字符串 9 | * @summary 规则:时间戳与当前时间进行比较 10 | * ``` 11 | * 小于1分钟,显示 x分钟前 12 | * 小于1天,显示 x小时前 13 | * 大于1天,小于2天,显示昨天x(小时):x(分钟) 14 | * 大于2天,小于28天,显示x天前 15 | * 否则,显示年-月-日 16 | * ``` 17 | */ 18 | function timeBeauty(timestamp) { 19 | if (!timestamp) { 20 | console.error('project-libs(timeBeauty方法参数错误):参数为必填项'); 21 | return; 22 | } 23 | if (timestamp && !((0, type_1.default)(timestamp) === 'string' || (0, type_1.default)(timestamp) === 'number')) { 24 | console.error('project-libs(timeBeauty方法参数错误):参数为 string | number'); 25 | return; 26 | } 27 | var time = Number(timestamp); 28 | var now = new Date(); 29 | var date = new Date(time); 30 | var diffTime = now.getTime() - time; 31 | var minute = 60 * 1000; // 1分钟 32 | var hour = 60 * 60 * 1000; // 1小时 33 | var day = 24 * 60 * 60 * 1000; // 1天 34 | var diffHour = Math.floor(diffTime / hour); 35 | var diffMinute = Math.floor(diffTime / minute); 36 | var diffDay = Math.floor(diffTime / day); 37 | var result = ''; 38 | if (diffTime > 0) { 39 | if (diffTime <= minute) { 40 | result = '刚刚'; 41 | } 42 | else if (diffTime > minute && diffTime <= hour) { 43 | result = "".concat(diffMinute, "\u5206\u949F\u524D"); 44 | } 45 | else if (diffTime > hour && diffTime <= day) { 46 | result = "".concat(diffHour, "\u5C0F\u65F6\u524D"); 47 | } 48 | else if (diffTime > day && diffTime <= day * 2) { 49 | result = "\u6628\u5929".concat(date.getHours() < 10 ? "0".concat(date.getHours()) : date.getHours(), ":").concat(date.getMinutes() < 10 ? "0".concat(date.getMinutes()) : date.getMinutes()); 50 | } 51 | else if (diffTime > day * 2 && diffTime <= day * 28) { 52 | return "".concat(diffDay, "\u5929\u524D"); 53 | } 54 | else if (diffTime > day * 28) { 55 | result = fullTime(date); 56 | } 57 | } 58 | else { 59 | result = fullTime(date); 60 | } 61 | return result; 62 | } 63 | function fullTime(date) { 64 | return "".concat(date.getFullYear(), "-").concat(date.getMonth() + 1 < 10 ? "0".concat(date.getMonth() + 1) : date.getMonth() + 1, "-").concat(date.getDate() < 10 ? "0".concat(date.getDate()) : date.getDate()); 65 | } 66 | -------------------------------------------------------------------------------- /build/src/time/timestamp.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = timestamp; 4 | /** 5 | * 获取当前时间戳 6 | * @returns {string} 字符串 7 | */ 8 | function timestamp() { 9 | return Number((new Date())).toString(); 10 | } 11 | -------------------------------------------------------------------------------- /build/src/type/isEmpty.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isEmpty; 4 | var type_1 = require("./type"); 5 | /** 6 | * 判断空对象,空数组,空字符串 7 | * @param obj 数组或者对象或者字符串 8 | * @returns boolean 9 | */ 10 | function isEmpty(obj) { 11 | if (!obj) { 12 | return true; 13 | } 14 | if (obj === '') { 15 | return true; 16 | } 17 | if ((0, type_1.default)(obj) === 'array') { 18 | // @ts-ignore 19 | if (!obj.length) { 20 | return true; 21 | } 22 | } 23 | if ((0, type_1.default)(obj) === 'object') { 24 | if (JSON.stringify(obj) === "{}") { 25 | return true; 26 | } 27 | } 28 | return false; 29 | } 30 | -------------------------------------------------------------------------------- /build/src/type/isJsonString.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isJsonString; 4 | /** 5 | * 验证是否可以被JSON.parse 6 | * @param ele {any} 元素 7 | * @returns {boolean} boolean 8 | */ 9 | function isJsonString(ele) { 10 | try { 11 | JSON.parse(ele); 12 | } 13 | catch (e) { 14 | return false; 15 | } 16 | return true; 17 | } 18 | -------------------------------------------------------------------------------- /build/src/type/type.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = type; 4 | /** 5 | * 判断数据类型 6 | * @param ele {any} 元素 7 | * @returns {string} boolean/number/string/function/array/date/regExp/undefined/null/object/map/set/symbol 8 | */ 9 | function type(ele) { 10 | var toString = Object.prototype.toString, map = { 11 | "[object Boolean]": "boolean", 12 | '[object Number]': 'number', 13 | '[object String]': 'string', 14 | '[object Function]': 'function', 15 | '[object Array]': 'array', 16 | '[object Date]': 'date', 17 | '[object RegExp]': 'regExp', 18 | '[object Undefined]': 'undefined', 19 | '[object Null]': 'null', 20 | '[object Object]': 'object', 21 | '[object Map]': 'map', 22 | '[object Set]': 'set', 23 | '[object Symbol]': 'symbol' 24 | }; 25 | return map[toString.call(ele)]; 26 | } 27 | -------------------------------------------------------------------------------- /build/test/array.test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | require("mocha"); 4 | var chai_1 = require("chai"); 5 | var arrayDiff_1 = require("../src/array/arrayDiff"); 6 | var arrayIntersection_1 = require("../src/array/arrayIntersection"); 7 | describe("array数组处理", function () { 8 | it("arrayDiff", function () { 9 | var a = [1, 2]; 10 | var b = [1, 3]; 11 | (0, chai_1.expect)((0, arrayDiff_1.default)(a, b)).to.eql([2, 3]); 12 | var a2 = [1, { id: 1 }]; 13 | var b2 = [1, 3]; 14 | (0, chai_1.expect)((0, arrayDiff_1.default)(a2, b2)).to.eql([{ id: 1 }, 3]); 15 | (0, chai_1.expect)((0, arrayDiff_1.default)([{ id: 1 }, { id: 123 }], [{ id: 1 }, { id: 123456 }])).to.eql([{ id: 123456 }]); 16 | }); 17 | it("arrayIntersection", function () { 18 | var a = [1, 2]; 19 | var b = [1, 3]; 20 | (0, chai_1.expect)((0, arrayIntersection_1.default)(a, b)).to.eql([1]); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /build/test/cookie.test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var jsdom_1 = require("jsdom"); 4 | require("mocha"); 5 | var window = new jsdom_1.JSDOM("\n\n\n \n\n").window; 6 | describe('cookie方法', function () { 7 | it('set', function () { 8 | // console.log(window); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /build/test/is.test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | require("mocha"); 4 | var chai_1 = require("chai"); 5 | var isEmpty_1 = require("../src/type/isEmpty"); 6 | describe("is类型判断相关函数", function () { 7 | it("isEmpty", function () { 8 | (0, chai_1.expect)((0, isEmpty_1.default)("")).to.be.equal(true); 9 | // expect(isEmpty(undefined)).to.be.equal(true); 10 | (0, chai_1.expect)((0, isEmpty_1.default)([])).to.be.equal(true); 11 | (0, chai_1.expect)((0, isEmpty_1.default)({})).to.be.equal(true); 12 | (0, chai_1.expect)((0, isEmpty_1.default)([1])).to.be.equal(false); 13 | (0, chai_1.expect)((0, isEmpty_1.default)({ id: 1 })).to.be.equal(false); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /build/test/time.test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | require("mocha"); 4 | var chai_1 = require("chai"); 5 | var timeBeauty_1 = require("../src/time/timeBeauty"); 6 | describe("time时间函数", function () { 7 | it("timeBeauty", function () { 8 | (0, chai_1.expect)((0, timeBeauty_1.default)("1666351987000")).to.eql("12分钟前"); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /build/time/getDay.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = getDay; 4 | /** 5 | * 获取某一天 6 | * @param fill {boolean} 布尔值,是否补 0,默认为 true 7 | * @returns {number | string} 返回哪一天 8 | */ 9 | function getDay(fill) { 10 | if (fill === void 0) { fill = true; } 11 | var day = new Date().getDate(); 12 | var _day = day; 13 | if (fill) { 14 | _day = day < 10 ? "0".concat(day) : day; 15 | } 16 | return _day; 17 | } 18 | -------------------------------------------------------------------------------- /build/time/getMonth.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = getMonth; 4 | /** 5 | * 获取当前月份 6 | * @param {Boolean} fill 布尔值,是否补 0,默认为 true 7 | */ 8 | function getMonth(fill) { 9 | if (fill === void 0) { fill = true; } 10 | var mon = new Date().getMonth() + 1; 11 | var monRe = mon; 12 | if (fill) 13 | mon < 10 ? "0".concat(mon) : mon; 14 | return monRe; 15 | } 16 | -------------------------------------------------------------------------------- /build/time/getYear.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = getYear; 4 | /** 5 | * 获取年份 6 | * @returns {number} 返回哪一年 7 | */ 8 | function getYear() { 9 | return new Date().getFullYear(); 10 | } 11 | -------------------------------------------------------------------------------- /build/time/sleep.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 4 | return new (P || (P = Promise))(function (resolve, reject) { 5 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 6 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 7 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 8 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 9 | }); 10 | }; 11 | var __generator = (this && this.__generator) || function (thisArg, body) { 12 | var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); 13 | return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; 14 | function verb(n) { return function (v) { return step([n, v]); }; } 15 | function step(op) { 16 | if (f) throw new TypeError("Generator is already executing."); 17 | while (g && (g = 0, op[0] && (_ = 0)), _) try { 18 | if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; 19 | if (y = 0, t) op = [op[0] & 2, t.value]; 20 | switch (op[0]) { 21 | case 0: case 1: t = op; break; 22 | case 4: _.label++; return { value: op[1], done: false }; 23 | case 5: _.label++; y = op[1]; op = [0]; continue; 24 | case 7: op = _.ops.pop(); _.trys.pop(); continue; 25 | default: 26 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } 27 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } 28 | if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } 29 | if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } 30 | if (t[2]) _.ops.pop(); 31 | _.trys.pop(); continue; 32 | } 33 | op = body.call(thisArg, _); 34 | } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } 35 | if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; 36 | } 37 | }; 38 | Object.defineProperty(exports, "__esModule", { value: true }); 39 | exports.default = sleep; 40 | /** 41 | * 睡眠函数 42 | * @param delay 睡眠时间(毫秒),默认为 0 43 | * @returns {promise} 返回一个 promise 对象 44 | */ 45 | function sleep() { 46 | return __awaiter(this, arguments, void 0, function (delay) { 47 | if (delay === void 0) { delay = 0; } 48 | return __generator(this, function (_a) { 49 | return [2 /*return*/, new Promise(function (resolve) { return setTimeout(resolve, delay); })]; 50 | }); 51 | }); 52 | } 53 | -------------------------------------------------------------------------------- /build/time/timeBeauty.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.default = timeBeauty; 7 | var type_1 = __importDefault(require("../type/type")); 8 | /** 9 | * 时间美化函数 10 | * @param timestamp {string | number} 字符串或者数字 11 | * @returns {string} 返回字符串 12 | * @summary 规则:时间戳与当前时间进行比较 13 | * ``` 14 | * 小于1分钟,显示 x分钟前 15 | * 小于1天,显示 x小时前 16 | * 大于1天,小于2天,显示昨天x(小时):x(分钟) 17 | * 大于2天,小于28天,显示x天前 18 | * 否则,显示年-月-日 19 | * ``` 20 | */ 21 | function timeBeauty(timestamp) { 22 | if (!timestamp) { 23 | console.error("project-libs(timeBeauty方法参数错误):参数为必填项"); 24 | return; 25 | } 26 | if (timestamp && 27 | !((0, type_1.default)(timestamp) === "string" || (0, type_1.default)(timestamp) === "number")) { 28 | console.error("project-libs(timeBeauty方法参数错误):参数为 string | number"); 29 | return; 30 | } 31 | var time = Number(timestamp); 32 | var now = new Date(); 33 | var date = new Date(time); 34 | var diffTime = now.getTime() - time; 35 | var minute = 60 * 1000; // 1分钟 36 | var hour = 60 * 60 * 1000; // 1小时 37 | var day = 24 * 60 * 60 * 1000; // 1天 38 | var diffHour = Math.floor(diffTime / hour); 39 | var diffMinute = Math.floor(diffTime / minute); 40 | var diffDay = Math.floor(diffTime / day); 41 | var result = ""; 42 | if (diffTime > 0) { 43 | if (diffTime <= minute) { 44 | result = "刚刚"; 45 | } 46 | else if (diffTime > minute && diffTime <= hour) { 47 | result = "".concat(diffMinute, "\u5206\u949F\u524D"); 48 | } 49 | else if (diffTime > hour && diffTime <= day) { 50 | result = "".concat(diffHour, "\u5C0F\u65F6\u524D"); 51 | } 52 | else if (diffTime > day && diffTime <= day * 2) { 53 | result = "\u6628\u5929".concat(date.getHours() < 10 ? "0".concat(date.getHours()) : date.getHours(), ":").concat(date.getMinutes() < 10 ? "0".concat(date.getMinutes()) : date.getMinutes()); 54 | } 55 | else if (diffTime > day * 2 && diffTime <= day * 28) { 56 | return "".concat(diffDay, "\u5929\u524D"); 57 | } 58 | else if (diffTime > day * 28) { 59 | result = fullTime(date); 60 | } 61 | } 62 | else { 63 | result = fullTime(date); 64 | } 65 | return result; 66 | } 67 | function fullTime(date) { 68 | return "".concat(date.getFullYear(), "-").concat(date.getMonth() + 1 < 10 ? "0".concat(date.getMonth() + 1) : date.getMonth() + 1, "-").concat(date.getDate() < 10 ? "0".concat(date.getDate()) : date.getDate()); 69 | } 70 | -------------------------------------------------------------------------------- /build/time/timestamp.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = timestamp; 4 | /** 5 | * 获取当前时间戳 6 | * @returns {string} 字符串 7 | */ 8 | function timestamp() { 9 | return Number((new Date())).toString(); 10 | } 11 | -------------------------------------------------------------------------------- /build/type/isEmpty.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.default = isEmpty; 7 | var type_1 = __importDefault(require("./type")); 8 | /** 9 | * 判断空对象,空数组,空字符串 10 | * @param obj 数组或者对象或者字符串 11 | * @returns boolean 12 | */ 13 | function isEmpty(obj) { 14 | if (!obj) { 15 | return true; 16 | } 17 | if (obj === '') { 18 | return true; 19 | } 20 | if ((0, type_1.default)(obj) === 'array') { 21 | // @ts-ignore 22 | if (!obj.length) { 23 | return true; 24 | } 25 | } 26 | if ((0, type_1.default)(obj) === 'object') { 27 | if (JSON.stringify(obj) === "{}") { 28 | return true; 29 | } 30 | } 31 | return false; 32 | } 33 | -------------------------------------------------------------------------------- /build/type/isJsonString.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = isJsonString; 4 | /** 5 | * 验证是否可以被JSON.parse 6 | * @param ele {any} 元素 7 | * @returns {boolean} boolean 8 | */ 9 | function isJsonString(ele) { 10 | try { 11 | JSON.parse(ele); 12 | } 13 | catch (e) { 14 | return false; 15 | } 16 | return true; 17 | } 18 | -------------------------------------------------------------------------------- /build/type/type.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.default = type; 4 | /** 5 | * 判断数据类型 6 | * @param ele {any} 元素 7 | * @returns {string} boolean/number/string/function/array/date/regExp/undefined/null/object/map/set/symbol 8 | */ 9 | function type(ele) { 10 | var toString = Object.prototype.toString, map = { 11 | "[object Boolean]": "boolean", 12 | '[object Number]': 'number', 13 | '[object String]': 'string', 14 | '[object Function]': 'function', 15 | '[object Array]': 'array', 16 | '[object Date]': 'date', 17 | '[object RegExp]': 'regExp', 18 | '[object Undefined]': 'undefined', 19 | '[object Null]': 'null', 20 | '[object Object]': 'object', 21 | '[object Map]': 'map', 22 | '[object Set]': 'set', 23 | '[object Symbol]': 'symbol' 24 | }; 25 | return map[toString.call(ele)]; 26 | } 27 | -------------------------------------------------------------------------------- /dist/projectLibs.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.projectLibs=t():e.projectLibs=t()}(self,(()=>(()=>{"use strict";var e={775:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(!e||!e.length)return[];"number"!=(0,n.default)(t)&&console.error("project-libs(arrayGroup方法参数错误):num的必须是数字"),t<0&&console.error("project-libs(arrayGroup方法参数错误):num必须大于0");for(var r=0,o=[];r{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){"array"!==(0,n.default)(e)&&console.error("project-libs(arrayIndex方法参数错误):arr必须为数组");for(var r=e.length;r--;)if((0,o.default)(e[r],t))return r;return-1};var n=r(505),o=r(854)},654:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return"array"===(0,n.default)(e)&&"array"===(0,n.default)(t)||console.error("project-libs(arrayIntersection方法参数错误):参数必须为数组"),Array.from(new Set(e.filter((function(e){return new Set(t).has(e)}))))};var n=r(505)},911:function(e,t){var r=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,a=r.call(e),u=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)u.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(o)throw o.error}}return u},n=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,a=t.length;o{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return"string"!==(0,n.default)(e)?(console.error("project-libs(copy方法参数错误):str必须为字符串"),Promise.reject()):new Promise((function(t,r){try{var n="project-libs-copy-input",o=document.getElementById(n);if(o)o.value=e,o.select(),document.execCommand("copy");else{var a=document.createElement("input");a.setAttribute("id",n),a.style.display="none",a.style.position="absolute",a.style.left="-9999px",a.value=e,document.body.appendChild(a),a.select(),document.execCommand("copy")}t({stauts:1,data:e})}catch(e){r({status:0,error:e})}}))};var n=r(505)},499:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if("string"===(0,n.default)(e)){var t=document.createElement("link");t.rel="stylesheet",t.type="text/css",t.href=e,document.getElementsByTagName("head")[0].appendChild(t)}else console.error("project-libs(createLink方法参数错误):url必须为字符串")};var n=r(505)},592:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=document.getElementsByTagName("head")[0],r=document.createElement("script");r.type="text/javascript",r.src=e,t.appendChild(r)}},587:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){var e=0;return document.documentElement&&document.documentElement.scrollTop?e=document.documentElement.scrollTop:document.body&&(e=document.body.scrollTop),e}},292:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function e(){var t=document.documentElement.scrollTop||document.body.scrollTop;t>0&&(window.requestAnimationFrame(e),window.scrollTo(0,t-t/8))}},960:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(e&&"string"!==(0,n.default)(e))return console.error("project-libs(urlGet方法参数错误):key必须为字符串"),null;if(t&&"string"!==(0,n.default)(t))return console.error("project-libs(urlGet方法参数错误):href必须为字符串"),null;var r=t?t.split("?"):window.location.href.split("?");if(r[1]){var o=r[1].split("&"),a={};return o.forEach((function(e){var t=e.split("=");a[t[0]]=decodeURIComponent(t[1])})),e?a[e]:a}return null};var n=r(505)},516:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){void 0===t&&(t=!1);var r=[];for(var n in e)r.push(n+"="+e[n]);var o=r.join("&");return t?encodeURIComponent(o):o}},59:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0});var n=r(722),o={support:function(){return!(!document.cookie&&!navigator.cookieEnabled)},set:function(e,t,r){if(this.support()){var n=e+"="+encodeURIComponent(JSON.stringify(t));if(null==r?void 0:r.hours){var o=new Date;o.setHours(o.getHours()+(null==r?void 0:r.hours)),n+="; expires="+o.toUTCString()}(null==r?void 0:r.path)&&(n+="; path="+r.path),(null==r?void 0:r.domain)&&(n+="; domain="+r.domain),(null==r?void 0:r.secure)&&(n+="; secure="+r.secure),(null==r?void 0:r.httpOnly)&&(n+="; httpOnly="+r.httpOnly),(null==r?void 0:r.sameSite)&&(n+="; sameSite="+r.sameSite),document.cookie=n}else console.error("project-libs(Cookie方法不可用):浏览器不支持Cookie,请检查相关设置")},get:function(e){if(!this.support())return console.error("project-libs(Cookie方法不可用):浏览器不支持Cookie,请检查相关设置"),null;var t=document.cookie,r=[],o={};if(r=t.split(";"),""!==t){for(var a=0;a{Object.defineProperty(t,"__esModule",{value:!0});var r=new(function(){function e(){}return e.encode=function(e){var t=encodeURI(e);return btoa(t)},e.decode=function(e){var t=atob(e);return decodeURI(t)},e}());t.default=r},124:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return JSON.parse(JSON.stringify(e))}},854:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var r=/undefined|number|string|boolean/,n=/^(function\s*)(\w*\b)/,o="constructor",a="childNodes",u="parentNode";if(r.test(typeof e)||r.test(typeof t)||null===e||null===t)return e===t||isNaN(e)&&isNaN(t);if(e[o]!==t[o])return!1;switch(e[o]){case Date:return e.valueOf()===t.valueOf();case Function:return e.toString().replace(n,"$1")===t.toString().replace(n,"$1");case Array:if(e.length!==t.length)return!1;for(var i=0;i{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function e(t){var r,o,a,u=(0,n.default)(t);if("array"===u)r=[];else{if("object"!==u)return t;r={}}if("array"===u){for(o=0,a=t.length;o{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){"object"!==(0,n.default)(e)&&console.error("project-libs(json2FormData方法参数错误):obj必须为对象");var t=new FormData;for(var r in e)o(e[r],r);function o(e,r){if("undefined"===(0,n.default)(e)||"function"===(0,n.default)(e))return!1;switch((0,n.default)(e)){case"array":if(0===e.length)t.append("".concat(r),"");else for(var a in e)for(var u in e[a])o(e[a][u],"".concat(r,"[").concat(a,"].").concat(u));break;case"object":for(var u in e)o(e[u],"".concat(r,".").concat(u));break;default:t.append(r,e)}}return t};var n=r(505)},736:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(Array.isArray(e)&&Array.isArray(t)){var r={};return t.forEach((function(t){r[t]=e[t]})),r}console.error("对象来源和要选取的属性必须为数组!")}},969:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(Array.isArray(t)){var r=e;return t.forEach((function(e){var t=new RegExp(e.target,"g");r=r.replace(t,e.replace)})),r}if(t.constructor===Object){var n=new RegExp(t.target,"g");return e.replace(n,t.replace)}}},871:function(e,t){var r=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,a=r.call(e),u=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)u.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(o)throw o.error}}return u},n=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,a=t.length;o-1;n--)r=e[n](r);return r}}},904:function(e,t){var r=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,a=r.call(e),u=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)u.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(o)throw o.error}}return u},n=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,a=t.length;o=e.length?e.apply(void 0,n([],r(o),!1)):t.bind.apply(t,n([null],r(o),!1))}}},979:function(e,t){var r=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,a=r.call(e),u=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)u.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(o)throw o.error}}return u},n=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,a=t.length;o{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return/android/i.test(navigator.userAgent.toLowerCase())}},13:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return/iphone|ipod|ipad|Macintosh/i.test(navigator.userAgent.toLowerCase())}},229:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return void 0===t&&(t=r),t&&!Array.isArray(t)&&console.error("project-libs(isEmail参数错误):域名必须为数组"),new RegExp("^([A-Za-z0-9._-])+@(".concat(t.join("|"),")$")).test(e)};var r=["qq.com","163.com","126.com","vip.126.com","yeah.net","vip.163.com","188.com","sohu.com","sina.cn","sina.com","gmail.com","hotmail.com","outlook.com"]},402:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return"string"!==(0,n.default)(e)?(console.error("project-libs(isIDCard方法参数错误):card必须为字符串"),!1):/^[1-9][0-9]{5}(18|19|(2[0-9]))[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{3}[0-9Xx]$/.test(e)};var n=r(505)},332:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return"string"!==(0,n.default)(e)?(console.error("project-libs(isIP方法参数错误):ip必须为字符串"),!1):/^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$/.test(e)};var n=r(505)},984:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return/iphone|ipod|ipad/i.test(navigator.userAgent.toLowerCase())}},423:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return/iphone|ipod|android.*mobile|windows.*phone|blackberry.*mobile/i.test(navigator.userAgent.toLowerCase())}},305:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return void 0===t&&(t=[3,4,5,7,8]),new RegExp("^[1]".concat(JSON.stringify(t),"[0-9]{9}$")).test(e)}},762:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return"string"!==(0,n.default)(e)?(console.error("project-libs(isPostCode方法参数错误):code必须为字符串"),!1):/^[1-9][0-9]{5}$/.test(e.toString())};var n=r(505)},862:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return"string"!==(0,n.default)(e)?(console.error("project-libs(isQQNumber方法参数错误):qq必须为字符串"),!1):/^[1-9][0-9]{4,12}$/.test(e)};var n=r(505)},532:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){void 0===e&&(e=!0);var t=(new Date).getDate(),r=t;return e&&(r=t<10?"0".concat(t):t),r}},316:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){void 0===e&&(e=!0);var t=(new Date).getMonth()+1,r=t;return e&&t<10&&"0".concat(t),r}},861:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return(new Date).getFullYear()}},863:function(e,t){var r=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(o,a){function u(e){try{l(n.next(e))}catch(e){a(e)}}function i(e){try{l(n.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(u,i)}l((n=n.apply(e,t||[])).next())}))},n=this&&this.__generator||function(e,t){var r,n,o,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},u=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return u.next=i(0),u.throw=i(1),u.return=i(2),"function"==typeof Symbol&&(u[Symbol.iterator]=function(){return this}),u;function i(i){return function(l){return function(i){if(r)throw new TypeError("Generator is already executing.");for(;u&&(u=0,i[0]&&(a=0)),a;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,n=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!((o=(o=a.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if(e){if(!e||"string"===(0,n.default)(e)||"number"===(0,n.default)(e)){var t=Number(e),r=new Date,a=new Date(t),u=r.getTime()-t,i=6e4,l=36e5,c=864e5,f=Math.floor(u/l),d=Math.floor(u/i),s=Math.floor(u/c),p="";if(u>0)if(u<=i)p="刚刚";else if(u>i&&u<=l)p="".concat(d,"分钟前");else if(u>l&&u<=c)p="".concat(f,"小时前");else if(u>c&&u<=2*c)p="昨天".concat(a.getHours()<10?"0".concat(a.getHours()):a.getHours(),":").concat(a.getMinutes()<10?"0".concat(a.getMinutes()):a.getMinutes());else{if(u>2*c&&u<=28*c)return"".concat(s,"天前");u>28*c&&(p=o(a))}else p=o(a);return p}console.error("project-libs(timeBeauty方法参数错误):参数为 string | number")}else console.error("project-libs(timeBeauty方法参数错误):参数为必填项")};var n=r(505);function o(e){return"".concat(e.getFullYear(),"-").concat(e.getMonth()+1<10?"0".concat(e.getMonth()+1):e.getMonth()+1,"-").concat(e.getDate()<10?"0".concat(e.getDate()):e.getDate())}},504:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return Number(new Date).toString()}},8:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return!e||(""===e||("array"===(0,n.default)(e)&&!e.length||"object"===(0,n.default)(e)&&"{}"===JSON.stringify(e)))};var n=r(505)},722:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){try{JSON.parse(e)}catch(e){return!1}return!0}},505:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return{"[object Boolean]":"boolean","[object Number]":"number","[object String]":"string","[object Function]":"function","[object Array]":"array","[object Date]":"date","[object RegExp]":"regExp","[object Undefined]":"undefined","[object Null]":"null","[object Object]":"object","[object Map]":"map","[object Set]":"set","[object Symbol]":"symbol"}[Object.prototype.toString.call(e)]}}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var a=t[n]={exports:{}};return e[n].call(a.exports,a,a.exports,r),a.exports}var n={};return(()=>{var e=n;Object.defineProperty(e,"__esModule",{value:!0}),e.isQQNumber=e.isPostCode=e.isIDCard=e.isIP=e.isMobile=e.isEmail=e.isPhone=e.isIos=e.isApple=e.isAndroid=e.arrayIntersection=e.arrayGroup=e.arrayIndex=e.arrayUnique=e.pick=e.base64=e.json2FormData=e.compare=e.deepClone=e.clone=e.replace=e.pipe=e.compose=e.curry=e.getYear=e.getMonth=e.getDay=e.timeBeauty=e.timestamp=e.sleep=e.urlParams=e.urlGet=e.scrollToTop=e.getScrollTop=e.createScript=e.createLink=e.copy=e.cookie=e.isJsonString=e.isEmpty=e.type=void 0;var t=r(505);Object.defineProperty(e,"type",{enumerable:!0,get:function(){return t.default}});var o=r(8);Object.defineProperty(e,"isEmpty",{enumerable:!0,get:function(){return o.default}});var a=r(722);Object.defineProperty(e,"isJsonString",{enumerable:!0,get:function(){return a.default}});var u=r(59);Object.defineProperty(e,"cookie",{enumerable:!0,get:function(){return u.default}});var i=r(114);Object.defineProperty(e,"copy",{enumerable:!0,get:function(){return i.default}});var l=r(499);Object.defineProperty(e,"createLink",{enumerable:!0,get:function(){return l.default}});var c=r(592);Object.defineProperty(e,"createScript",{enumerable:!0,get:function(){return c.default}});var f=r(587);Object.defineProperty(e,"getScrollTop",{enumerable:!0,get:function(){return f.default}});var d=r(292);Object.defineProperty(e,"scrollToTop",{enumerable:!0,get:function(){return d.default}});var s=r(960);Object.defineProperty(e,"urlGet",{enumerable:!0,get:function(){return s.default}});var p=r(516);Object.defineProperty(e,"urlParams",{enumerable:!0,get:function(){return p.default}});var b=r(863);Object.defineProperty(e,"sleep",{enumerable:!0,get:function(){return b.default}});var y=r(504);Object.defineProperty(e,"timestamp",{enumerable:!0,get:function(){return y.default}});var v=r(583);Object.defineProperty(e,"timeBeauty",{enumerable:!0,get:function(){return v.default}});var m=r(532);Object.defineProperty(e,"getDay",{enumerable:!0,get:function(){return m.default}});var g=r(316);Object.defineProperty(e,"getMonth",{enumerable:!0,get:function(){return g.default}});var j=r(861);Object.defineProperty(e,"getYear",{enumerable:!0,get:function(){return j.default}});var h=r(904);Object.defineProperty(e,"curry",{enumerable:!0,get:function(){return h.default}});var _=r(871);Object.defineProperty(e,"compose",{enumerable:!0,get:function(){return _.default}});var O=r(979);Object.defineProperty(e,"pipe",{enumerable:!0,get:function(){return O.default}});var P=r(969);Object.defineProperty(e,"replace",{enumerable:!0,get:function(){return P.default}});var M=r(124);Object.defineProperty(e,"clone",{enumerable:!0,get:function(){return M.default}});var w=r(178);Object.defineProperty(e,"deepClone",{enumerable:!0,get:function(){return w.default}});var S=r(854);Object.defineProperty(e,"compare",{enumerable:!0,get:function(){return S.default}});var x=r(815);Object.defineProperty(e,"json2FormData",{enumerable:!0,get:function(){return x.default}});var A=r(254);Object.defineProperty(e,"base64",{enumerable:!0,get:function(){return A.default}});var k=r(736);Object.defineProperty(e,"pick",{enumerable:!0,get:function(){return k.default}});var C=r(911);Object.defineProperty(e,"arrayUnique",{enumerable:!0,get:function(){return C.default}});var E=r(647);Object.defineProperty(e,"arrayIndex",{enumerable:!0,get:function(){return E.default}});var I=r(775);Object.defineProperty(e,"arrayGroup",{enumerable:!0,get:function(){return I.default}});var D=r(654);Object.defineProperty(e,"arrayIntersection",{enumerable:!0,get:function(){return D.default}});var N=r(954);Object.defineProperty(e,"isAndroid",{enumerable:!0,get:function(){return N.default}});var T=r(13);Object.defineProperty(e,"isApple",{enumerable:!0,get:function(){return T.default}});var R=r(984);Object.defineProperty(e,"isIos",{enumerable:!0,get:function(){return R.default}});var U=r(305);Object.defineProperty(e,"isPhone",{enumerable:!0,get:function(){return U.default}});var F=r(229);Object.defineProperty(e,"isEmail",{enumerable:!0,get:function(){return F.default}});var G=r(423);Object.defineProperty(e,"isMobile",{enumerable:!0,get:function(){return G.default}});var J=r(332);Object.defineProperty(e,"isIP",{enumerable:!0,get:function(){return J.default}});var L=r(402);Object.defineProperty(e,"isIDCard",{enumerable:!0,get:function(){return L.default}});var B=r(762);Object.defineProperty(e,"isPostCode",{enumerable:!0,get:function(){return B.default}});var $=r(862);Object.defineProperty(e,"isQQNumber",{enumerable:!0,get:function(){return $.default}})})(),n})())); 2 | //# sourceMappingURL=projectLibs.js.map -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断数据类型 3 | * @param ele {any} 传入的数据 4 | * @returns {string} boolean/number/string/function/array/date/regExp/undefined/null/object/map/set/symbol 5 | */ 6 | export declare function type(ele: any): string; 7 | 8 | /** 9 | * 判断空对象,空数组,空字符串 10 | * @param obj 数组或者对象或者字符串 11 | * @returns boolean 12 | */ 13 | export declare function isEmpty(obj: Array | Object): boolean; 14 | 15 | /** 16 | * 验证是否可以被JSON.parse 17 | * @param ele {any} 元素 18 | * @returns {boolean} boolean 19 | */ 20 | export declare function isJsonString(ele: any): boolean; 21 | 22 | /** 23 | * 操作 Cookie 24 | */ 25 | declare namespace cookie { 26 | interface CONFIG { 27 | hours?: number; // 过期时间,单位小时 28 | path?: string; // 路径 29 | domain?: string; // 域名 30 | secure?: boolean; // 安全策略 31 | httpOnly?: boolean; // 设置键值对是否可以被 js 访问 32 | sameSite?: "strict" | "Strict" | "lax" | "Lax" | "none" | "None"; // 用来限制第三方 Cookie 33 | } 34 | 35 | interface CookieStatic { 36 | defaults: CONFIG; 37 | 38 | /** 39 | * 判断cookie是否可用 40 | * @returns {boolean} boolean 41 | */ 42 | support(): boolean; 43 | 44 | /** 45 | * 添加cookie 46 | * @param name {string} cookie 的键 47 | * @param value {string | object} cookie 值 48 | * @param config {object} 可选配置项 49 | * ``` 50 | * { 51 | * hours: 过期时间,单位小时, 52 | * path: 路径, 53 | * domain: 域名, 54 | * secure: 安全策略, 55 | * httpOnly: 设置键值对是否可以被 js 访问, 56 | * sameSite: 用来限制第三方 Cookie 57 | * } 58 | * ``` 59 | */ 60 | set(name: string, value: string | object, config?: CONFIG): void; 61 | 62 | /** 63 | * 查询 cookie 64 | * @param name {string} Cookie 的键;如果参数为空则获取所有的cookie 65 | * @returns {string | object | null} 有参数获取单独的cookie,没有参数获取所有cookie;获取不到则返回 null 66 | */ 67 | get(name?: string): string | object | null; 68 | 69 | /** 70 | * 删除 cookie 71 | * @param name Cookie 的键;如果参数为空,则清理所有的cookie 72 | * @param path 路径,默认为'' 73 | */ 74 | remove(name: string, path?: string): void; 75 | } 76 | } 77 | declare const cookie: cookie.CookieStatic; 78 | 79 | /** 80 | * base64转码和解码 81 | */ 82 | declare namespace base64 { 83 | interface base64Static { 84 | /** 85 | * 字符串转 base64 86 | * @param str {string} 字符串 87 | * @returns {string} 字符串 88 | * @summary btoa() 方法不支持 IE9 及更早的 IE 版本 89 | */ 90 | encode(str: string): string; 91 | 92 | /** 93 | * base64 转字符串 94 | * @param str {string} 字符串 95 | * @returns {string} 字符串 96 | * @summary atob() 方法不支持 IE9 及更早的 IE 版本 97 | */ 98 | decode(str: string): string; 99 | } 100 | } 101 | declare const base64: base64.base64Static; 102 | 103 | /** 104 | * replace 函数,可以根据指定的选项来替换内容 105 | * @param source {string} 需要替换的资源 106 | * @param option {object | object[]} 选项,可以为对象或者对象数组,{target: '<', replace: ''} 或者 [{target: '<', replace: ''}] 107 | * @returns {string} string 108 | */ 109 | export declare function replace(source: String, option: [] | {}): string; 110 | 111 | /** 112 | * 从对象中根据特定的属性返回一个新的对象 113 | * @param object 对象来源 114 | * @param props 要选取的属性 115 | */ 116 | export declare function pick(object: object, props: Array); 117 | 118 | /** 119 | * 从对象中排除特定的属性返回一个新的对象 120 | * @param object 对象来源 121 | * @param props 要排除的属性 122 | */ 123 | export declare function unPick(object: object, props: Array); 124 | 125 | /** 126 | * 浅拷贝,才方法只针对普通对象{}和数组[] 127 | * @param source {any} 需要拷贝的元素 128 | * @returns {any} any 129 | */ 130 | export declare function clone(source: any): any; 131 | 132 | /** 133 | * 深层次克隆 134 | * @param data {any} 数据源 135 | * @returns {any} any 136 | */ 137 | export declare function deepClone(data: any): any; 138 | 139 | /** 140 | * 判断两个变量是否相等, 此方法用于相同数据类型的变量比较 141 | * @param a {any} 142 | * @param b {any} 143 | * @returns {boolean} boolean 144 | */ 145 | export declare function compare(a: any, b: any): Boolean; 146 | 147 | /** 148 | * 数组去重 149 | * @param arr {array} 数组 150 | * @returns {array} array 151 | */ 152 | export declare function arrayUnique(arr: Array): Array; 153 | 154 | /** 155 | * 获取某个元素下标,元素可以为对象 156 | * @param arr {Array} 传入的数组 157 | * @param obj {any} 需要获取下标的元素 158 | * @returns {number} number 返回数组下标 159 | */ 160 | export declare function arrayIndex(arr: Array, obj: any): number; 161 | 162 | /** 163 | * 把数组均分成几等份,并返回一个新的数组 164 | * @param {*} arr 数组 165 | * @param {*} num 几等份 166 | * @returns {Array} Array 167 | */ 168 | export declare function arrayGroup(arr: Array, num: number): Array; 169 | 170 | /** 171 | * 获取两个数组的交集 172 | * @param a Array 173 | * @param b Array 174 | * @returns Array[] 175 | */ 176 | export declare function arrayIntersection(a: Array, b: Array): any[]; 177 | 178 | /** 179 | * 获取两个数组的差集 180 | * @param a Array 181 | * @param b Array 182 | * @returns Array[] 183 | */ 184 | export declare function arrayDiff(a: Array, b: Array): any[]; 185 | 186 | /** 187 | * 判断是否是安卓设备 188 | * @returns {boolean} boolean 189 | */ 190 | export declare function isAndroid(): boolean; 191 | 192 | /** 193 | * 判断是否是苹果设备 194 | * @returns {boolean} boolean 195 | */ 196 | export declare function isApple(): boolean; 197 | 198 | /** 199 | * 判断是否是 ios 设备 200 | * @returns {boolean} boolean 201 | */ 202 | export declare function isIos(): boolean; 203 | 204 | /** 205 | * 验证是否是电话号码,可以自定义第二个号码 206 | * @param phone {string} 电话号码 207 | * @param second {array} 电话号码的第二个号码规则,可选,例如[3,4,5,7,8] 208 | * @returns {boolean} boolean 209 | */ 210 | export declare function isPhone(phone: string, second: number[]): boolean; 211 | 212 | /** 213 | * 判断邮箱是否正确,可以自定义邮箱后缀 214 | * @param email {string} 邮箱 215 | * @param domains {array[string]} 域名 ["163.com"] 216 | * @returns {boolean} boolean 217 | * 默认支持的邮箱:[ 218 | "qq.com", 219 | "163.com", 220 | "126.com", 221 | "vip.126.com", 222 | "yeah.net", 223 | "vip.163.com", 224 | "188.com", 225 | "sohu.com", 226 | "sina.cn", 227 | "sina.com", 228 | "gmail.com", 229 | "hotmail.com", 230 | "outlook.com" 231 | ] 232 | */ 233 | export declare function isEmail(email: string, domains: string[]): boolean; 234 | 235 | /** 236 | * 判断是否为手机端 237 | * @returns {boolean} boolean 238 | */ 239 | export declare function isMobile(): boolean; 240 | 241 | /** 242 | * 校验是否为不含端口号的IP地址 243 | * 规则: 244 | * IP格式为xxx.xxx.xxx.xxx,每一项数字取值范围为0-255 245 | * 除0以外其他数字不能以0开头,比如02 246 | * @param ip {string} ip地址,类型为字符串 247 | * @returns {boolean} boolean 248 | */ 249 | export declare function isIP(ip: string): boolean; 250 | 251 | /** 252 | * 验证是否是 qq 号码 253 | * 规则:非0开头的5位-13位整数 254 | * @param qq {string} qq号码,字符串 255 | * @returns {boolean} boolean 256 | */ 257 | export declare function isQQNumber(qq: string): boolean; 258 | 259 | /** 260 | * 验证是否为第二代居民身份证 261 | * 规则: 262 | * 共18位,最后一位可为X(大小写均可) 263 | * 不能以0开头 264 | * 出生年月日会进行校验:年份只能为18/19/2*开头,月份只能为01-12,日只能为01-31 265 | * @param card {string} 身份证号码 266 | * @returns {boolean} boolean 267 | */ 268 | export declare function isIDCard(card: string): boolean; 269 | 270 | /** 271 | * 验证是否为邮政编码 272 | * @param code {string} 邮政编码 273 | * @returns {boolean} boolean 274 | */ 275 | export declare function isPostCode(code: string): boolean; 276 | 277 | /** 278 | * 复制到剪切板 279 | * @param str {string} 需要复制到剪贴板的文本 280 | * @returns {Promise} 返回一个 promise 对象 281 | */ 282 | export declare function copy(str: string): Promise; 283 | 284 | /** 285 | * 在 head 中创建 css 的 link 标签 286 | * @param url {string} url 地址 287 | */ 288 | export declare function createLink(url: string): void; 289 | 290 | /** 291 | * 创建 script 标签 292 | * @param url {string} src的地址 293 | */ 294 | export declare function createScript(url: string): void; 295 | 296 | /** 297 | * 基于 window.requestAnimationFrame() 滚动到浏览器顶部 298 | */ 299 | export declare function scrollToTop(): void; 300 | 301 | /** 302 | * 获取浏览器滚动条位置 303 | * @returns {string} 数字 304 | */ 305 | export declare function getScrollTop(): number; 306 | 307 | /** 308 | * 将键值对拼接成URL带参数 309 | * @param obj {object} 对象 310 | * @param encode {boolean} 是否进行encode,默认false 311 | * @returns {string} 字符串 312 | * @example 313 | * ``` 314 | * urlParams({id:10, addr: 'zz'}) 315 | * // "id=10&addr=zz" 316 | * 317 | * urlParams({id:10, addr: 'zz'}, true) 318 | * // "id%3D10%26addr%3Dzz" 319 | * ``` 320 | */ 321 | export declare function urlParams(obj: any, encode: boolean): string; 322 | 323 | /** 324 | * 获得URL中GET请求的参数值 325 | * @param key {string} 参数,可选,如果没有则返回所有的键值对 326 | * @param href {string} 网址,如果没有则默认选取当前网址 327 | * @returns {string | null} 如果有值返回字符串,否则返回 null 328 | */ 329 | export declare function urlGet(key: string, href?: string): string | null; 330 | 331 | /** 332 | * 睡眠函数 333 | * @param delay 睡眠时间(毫秒),默认为 0 334 | * @returns {promise} 返回一个 promise 对象 335 | */ 336 | export declare function sleep(delay: number): Promise; 337 | 338 | /** 339 | * 获取当前时间戳 340 | * @returns {string} 字符串 341 | */ 342 | export declare function timestamp(): string; 343 | 344 | /** 345 | * 时间美化函数 346 | * @param timestamp {string | number} 字符串或者数字 347 | * @returns {string} 返回字符串 348 | * @summary 规则:时间戳与当前时间进行比较 349 | * ``` 350 | * 小于1分钟,显示 x分钟前 351 | * 小于1天,显示 x小时前 352 | * 大于1天,小于2天,显示昨天x(小时):x(分钟) 353 | * 大于2天,小于28天,显示x天前 354 | * 否则,显示年-月-日 355 | * ``` 356 | */ 357 | export declare function timeBeauty(timestamp: string | number): string; 358 | 359 | /** 360 | * 获取某一天 361 | * @param fill {boolean} 布尔值,是否补 0,默认为 true 362 | * @returns {number | string} 返回哪一天 363 | */ 364 | export declare function getDay(fill: boolean): number | string; 365 | 366 | /** 367 | * 获取当前月份 368 | * @param {Boolean} fill 布尔值,是否补 0,默认为 true 369 | */ 370 | export declare function getMonth(fill: boolean); 371 | 372 | /** 373 | * 获取年份 374 | * @returns {number} 返回哪一年 375 | */ 376 | export declare function getYear(): number; 377 | 378 | /** 379 | * 对象转为 formdata 380 | * @param obj {object} 对象 381 | * @returns {FormData} FormData 382 | */ 383 | export declare function json2FormData(obj: any): FormData; 384 | 385 | /** 386 | * 用来柯里化的函数 387 | * @param fn {Function} 388 | * @returns {any} any 389 | * @example 390 | * ``` 391 | * let abc = function(a, b, c) { 392 | return [a, b, c]; 393 | }; 394 | const curried = curry(abc); 395 | curried(1)(2)(3); 396 | // [1,2,3] 397 | * ``` 398 | */ 399 | export declare function curry(fn: Function): Function; 400 | 401 | /** 402 | * 组合函数,从右向左依次执行 403 | * @returns {any} any 404 | * @example 405 | * ``` 406 | * function a(name) { return 'test:' + name } 407 | function b(statement) { return statement.toUpperCase() + '!' } 408 | function c(str) { return str.replace(/[cC]/, 'CCCCC') } 409 | compose(a, b, c)('com') 410 | // test:CCCCCOM! 411 | * ``` 412 | */ 413 | export declare function compose(): any; 414 | 415 | /** 416 | * 管道函数,从左向右依次执行 417 | * @returns {any} any 418 | * @example 419 | * ``` 420 | * function a(name) { return 'test:' + name } 421 | function b(statement) { return statement.toUpperCase() + '!' } 422 | function c(str) { return str.replace(/[cC]/, 'CCCCC') } 423 | pipe(a, b, c)('com') 424 | // TEST:CCCCCOM! 425 | * ``` 426 | */ 427 | export declare function pipe(): any; 428 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "project-libs", 3 | "version": "1.2.0", 4 | "description": "project-libs 是一个常用函数集锦的工具库,包括浏览器、函数式、常用验证、cookie、数组处理等函数。", 5 | "homepage": "https://github.com/cpagejs/project-libs#readme", 6 | "bugs": { 7 | "url": "https://github.com/cpagejs/project-libs/issues" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/cpagejs/project-libs.git" 12 | }, 13 | "license": "ISC", 14 | "author": "cpage.js", 15 | "main": "/dist/projectLibs.js", 16 | "directories": { 17 | "doc": "docs", 18 | "test": "test" 19 | }, 20 | "scripts": { 21 | "build": "webpack", 22 | "tsc": "tsc", 23 | "test-": "mocha --reporter spec --require ts-node/register ./test/*.test.ts", 24 | "test": "mocha", 25 | "docs:dev": "vuepress dev docs", 26 | "docs:build": "vuepress build docs" 27 | }, 28 | "keywords": [ 29 | "utils", 30 | "libs", 31 | "javascript", 32 | "cpage", 33 | "project-libs" 34 | ], 35 | "devDependencies": { 36 | "@types/chai": "^5.0.1", 37 | "@types/jsdom": "^21.1.7", 38 | "@types/mocha": "^10.0.10", 39 | "@types/node": "^22.13.0", 40 | "@types/webpack": "^5.28.5", 41 | "chai": "^5.1.2", 42 | "jsdom": "^26.0.0", 43 | "mocha": "^11.1.0", 44 | "ts-loader": "^9.5.2", 45 | "ts-node": "^10.9.2", 46 | "typescript": "^5.7.3", 47 | "vuepress": "^1.9.10", 48 | "webpack": "^5.97.1", 49 | "webpack-cli": "^6.0.1", 50 | "webpack-dev-server": "^5.2.0" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/array/arrayDiff.ts: -------------------------------------------------------------------------------- 1 | import type from "../type/type"; 2 | 3 | /** 4 | * 获取两个数组的差集 5 | * @param a Array 6 | * @param b Array 7 | * @returns Array[] 8 | */ 9 | export default function arrayDiff(a: Array, b: Array): any[] { 10 | if (type(a) !== "array" || type(b) !== "array") { 11 | console.error("project-libs(arrayDiff方法参数错误):参数必须为数组"); 12 | } 13 | 14 | return Array.from( 15 | new Set(a.concat(b).filter((v) => !new Set(a).has(v) || !new Set(b).has(v))) 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /src/array/arrayGroup.ts: -------------------------------------------------------------------------------- 1 | import type from "../type/type"; 2 | 3 | /** 4 | * 把数组均分成几等份,并返回一个新的数组 5 | * @param {Array} arr 数组 6 | * @param {number} num 几等份 7 | * @returns {Array} Array 8 | */ 9 | export default function arrayGroup(arr: Array, num: number): Array { 10 | if(!arr || !arr.length){ 11 | return []; 12 | } 13 | 14 | if(type(num) != "number") { 15 | console.error('project-libs(arrayGroup方法参数错误):num的必须是数字'); 16 | } 17 | 18 | if(num < 0) { 19 | console.error('project-libs(arrayGroup方法参数错误):num必须大于0'); 20 | } 21 | 22 | let index = 0; 23 | let newArray = []; 24 | while(index < arr.length) { 25 | newArray.push(arr.slice(index, index += num)); 26 | } 27 | return newArray; 28 | } -------------------------------------------------------------------------------- /src/array/arrayIndex.ts: -------------------------------------------------------------------------------- 1 | import type from "../type/type"; 2 | import compare from "../data/compare"; 3 | 4 | /** 5 | * 获取某个元素下标,元素可以为对象 6 | * @param arr {Array} 传入的数组 7 | * @param obj {any} 需要获取下标的元素 8 | * @returns {number} number 下标,匹配不到时候返回 -1 9 | */ 10 | export default function arrayIndex(arr: Array, obj: any): number { 11 | if (type(arr) !== "array") { 12 | console.error("project-libs(arrayIndex方法参数错误):arr必须为数组"); 13 | } 14 | 15 | let i = arr.length; 16 | while (i--) { 17 | if (compare(arr[i], obj)) { 18 | return i; 19 | } 20 | } 21 | return -1; 22 | } 23 | -------------------------------------------------------------------------------- /src/array/arrayIntersection.ts: -------------------------------------------------------------------------------- 1 | import type from "../type/type"; 2 | 3 | /** 4 | * 获取两个数组的交集 5 | * @param a Array 6 | * @param b Array 7 | * @returns Array[] 8 | */ 9 | export default function arrayIntersection(a: Array, b: Array): any[] { 10 | if (type(a) !== "array" || type(b) !== "array") { 11 | console.error( 12 | "project-libs(arrayIntersection方法参数错误):参数必须为数组" 13 | ); 14 | } 15 | 16 | return Array.from(new Set(a.filter((v: any) => new Set(b).has(v)))); 17 | } 18 | -------------------------------------------------------------------------------- /src/array/arrayPick.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cpagejs/project-libs/5d7760ad15c33c9ddb4c12f56d0bf041aff16865/src/array/arrayPick.ts -------------------------------------------------------------------------------- /src/array/arrayUnique.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 数组去重 3 | * @param arr {array} 数组 4 | * @returns {array} array 5 | */ 6 | export default function arrayUnique(arr: Array): Array { 7 | return [...new Set(arr)]; 8 | } -------------------------------------------------------------------------------- /src/browser/copy.ts: -------------------------------------------------------------------------------- 1 | import type from "../type/type"; 2 | 3 | /** 4 | * 复制到剪切板 5 | * @param str {string} 需要复制到剪贴板的文本 6 | * @returns {Promise} 返回一个 promise 对象 7 | */ 8 | export default function copy(str: string): Promise { 9 | if (type(str) !== "string") { 10 | console.error("project-libs(copy方法参数错误):str必须为字符串"); 11 | return Promise.reject(); 12 | } 13 | 14 | return new Promise((resolve, reject) => { 15 | try { 16 | const id = "project-libs-copy-input"; 17 | const ele = document.getElementById(id); 18 | if (ele) { 19 | ele.value = str; 20 | ele.select(); 21 | document.execCommand("copy"); 22 | } else { 23 | const input = document.createElement("input"); 24 | input.setAttribute("id", id); 25 | input.style.display = "none"; 26 | input.style.position = "absolute"; 27 | input.style.left = "-9999px"; 28 | input.value = str; 29 | document.body.appendChild(input); 30 | input.select(); 31 | document.execCommand("copy"); 32 | } 33 | resolve({ 34 | stauts: 1, 35 | data: str, 36 | }); 37 | } catch (error) { 38 | reject({ 39 | status: 0, 40 | error, 41 | }); 42 | } 43 | }); 44 | } 45 | -------------------------------------------------------------------------------- /src/browser/createLink.ts: -------------------------------------------------------------------------------- 1 | import type from '../type/type'; 2 | 3 | /** 4 | * 在 head 中创建 css 的 link 标签 5 | * @param url {string} url 地址 6 | */ 7 | export default function createLink(url: string): void { 8 | if(type(url) !== 'string'){ 9 | console.error('project-libs(createLink方法参数错误):url必须为字符串'); 10 | return; 11 | } 12 | let cssLink = document.createElement("link"); 13 | cssLink.rel = "stylesheet"; 14 | cssLink.type = "text/css"; 15 | cssLink.href = url; 16 | const head = document.getElementsByTagName("head")[0]; 17 | head.appendChild(cssLink); 18 | } -------------------------------------------------------------------------------- /src/browser/createScript.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 创建 script 标签 3 | * @param url {string} src的地址 4 | */ 5 | export default function createScript(url: string): void { 6 | const head = document.getElementsByTagName('head')[0]; 7 | const script = document.createElement("script"); 8 | script.type = 'text/javascript'; 9 | script.src = url; 10 | head.appendChild(script); 11 | } -------------------------------------------------------------------------------- /src/browser/getScrollTop.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 获取浏览器滚动条位置 3 | */ 4 | export default function getScrollTop(): number { 5 | let scroll_top = 0; 6 | if (document.documentElement && document.documentElement.scrollTop) { 7 | scroll_top = document.documentElement.scrollTop; 8 | } 9 | else if (document.body) { 10 | scroll_top = document.body.scrollTop; 11 | } 12 | return scroll_top; 13 | } -------------------------------------------------------------------------------- /src/browser/scrollToTop.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 基于 window.requestAnimationFrame() 滚动到浏览器顶部 3 | */ 4 | export default function scrollToTop():void { 5 | let top = document.documentElement.scrollTop || document.body.scrollTop; 6 | 7 | if (top > 0) { 8 | window.requestAnimationFrame(scrollToTop); 9 | window.scrollTo(0, top - top / 8); 10 | } 11 | } -------------------------------------------------------------------------------- /src/browser/urlGet.ts: -------------------------------------------------------------------------------- 1 | import type from "../type/type"; 2 | 3 | /** 4 | * 获得URL中GET请求的参数值 5 | * @param key {string} 参数,可选,如果没有则返回所有的键值对 6 | * @param href {string} 网址,如果没有则默认选取当前网址 7 | * @returns {string | null} 如果有值返回字符串,否则返回 null 8 | */ 9 | export default function urlGet(key: string, href?: string): string | null { 10 | if (key && type(key) !== "string") { 11 | console.error("project-libs(urlGet方法参数错误):key必须为字符串"); 12 | return null; 13 | } 14 | if (href && type(href) !== "string") { 15 | console.error("project-libs(urlGet方法参数错误):href必须为字符串"); 16 | return null; 17 | } 18 | 19 | const querystr = href ? href.split("?") : window.location.href.split("?"); 20 | if (querystr[1]) { 21 | let GETs = querystr[1].split("&"); 22 | let obj: any = {}; 23 | GETs.forEach((item) => { 24 | const _item = item.split("="); 25 | obj[_item[0]] = decodeURIComponent(_item[1]); 26 | }); 27 | return key ? obj[key] : obj; 28 | } 29 | return null; 30 | } 31 | -------------------------------------------------------------------------------- /src/browser/urlParams.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 将键值对拼接成URL带参数 3 | * @param obj {object} 对象 4 | * @param encode {boolean} 是否进行encode,默认false 5 | * @returns {string} 字符串 6 | * @example 7 | * ``` 8 | * urlParams({id:10, addr: 'zz'}) 9 | * // "id=10&addr=zz" 10 | * 11 | * urlParams({id:10, addr: 'zz'}, true) 12 | * // "id%3D10%26addr%3Dzz" 13 | * ``` 14 | */ 15 | export default function urlParams(obj: any, encode: boolean = false): string { 16 | let urls = []; 17 | const add = function(key: string, value: string) { 18 | return key + '=' + value 19 | } 20 | for (let k in obj) { 21 | urls.push(add(k, obj[k])) 22 | } 23 | 24 | const str = urls.join('&'); 25 | return encode ? encodeURIComponent(str) : str; 26 | } -------------------------------------------------------------------------------- /src/cache/cookie.ts: -------------------------------------------------------------------------------- 1 | import isJsonString from "../type/isJsonString"; 2 | 3 | interface CONFIG { 4 | hours?: number; // 过期时间,单位小时 5 | path?: string; // 路径 6 | domain?: string; // 域名 7 | secure?: boolean; // 安全策略 8 | httpOnly?: boolean; // 设置键值对是否可以被 js 访问 9 | sameSite?: "strict" | "Strict" | "lax" | "Lax" | "none" | "None"; // 用来限制第三方 Cookie 10 | } 11 | 12 | /** 13 | * 操作 cookie 14 | */ 15 | const cookie = { 16 | /** 17 | * 判断cookie是否可用 18 | * @returns {boolean} boolean 19 | */ 20 | support(): boolean { 21 | if (!(document.cookie || navigator.cookieEnabled)) return false; 22 | return true; 23 | }, 24 | 25 | /** 26 | * 添加cookie 27 | * @param name {string} cookie 键 28 | * @param value {string | object} cookie 值 29 | * @param config {object} 可选配置项 30 | * ``` 31 | * { 32 | * hours: 过期时间,单位小时, 33 | * path: 路径, 34 | * domain: 域名, 35 | * secure: 安全策略, 36 | * httpOnly: 设置键值对是否可以被 js 访问, 37 | * sameSite: 用来限制第三方 Cookie 38 | * } 39 | * ``` 40 | */ 41 | set(name: string, value: string | object, config?: CONFIG): void { 42 | if (!this.support()) { 43 | console.error( 44 | "project-libs(Cookie方法不可用):浏览器不支持Cookie,请检查相关设置" 45 | ); 46 | return; 47 | } 48 | 49 | let data = name + "=" + encodeURIComponent(JSON.stringify(value)); 50 | 51 | if (config?.hours) { 52 | const d = new Date(); 53 | d.setHours(d.getHours() + config?.hours); 54 | data += "; expires=" + d.toUTCString(); 55 | } 56 | 57 | if (config?.path) { 58 | data += "; path=" + config.path; 59 | } 60 | 61 | if (config?.domain) { 62 | data += "; domain=" + config.domain; 63 | } 64 | 65 | if (config?.secure) { 66 | data += "; secure=" + config.secure; 67 | } 68 | 69 | if (config?.httpOnly) { 70 | data += "; httpOnly=" + config.httpOnly; 71 | } 72 | 73 | if (config?.sameSite) { 74 | data += "; sameSite=" + config.sameSite; 75 | } 76 | 77 | document.cookie = data; 78 | }, 79 | 80 | /** 81 | * 查询 cookie 82 | * @param name {string} Cookie 的键;如果参数为空则获取所有的cookie 83 | * @returns {string | object | null} 有参数获取cookie后返回字符串,没有参数获取cookie返回json;获取不到则返回 null 84 | */ 85 | get(name?: string): string | object | null { 86 | if (!this.support()) { 87 | console.error( 88 | "project-libs(Cookie方法不可用):浏览器不支持Cookie,请检查相关设置" 89 | ); 90 | return null; 91 | } 92 | 93 | let cs = document.cookie, 94 | arr = [], 95 | obj: any = {}; 96 | arr = cs.split(";"); 97 | 98 | if (cs !== "") { 99 | for (let i = 0; i < arr.length; i++) { 100 | const a = arr[i].split("="); 101 | const key = a[0].trim(); 102 | if (key !== "") { 103 | const val = decodeURIComponent(a[1]); 104 | obj[key] = isJsonString(val) ? JSON.parse(val) : val; 105 | } 106 | } 107 | 108 | return name ? obj[name] : obj; 109 | } else { 110 | return null; 111 | } 112 | }, 113 | 114 | /** 115 | * 删除 cookie 116 | * @param name Cookie 的键;如果参数为空,则清理所有的cookie 117 | * @param path 路径,默认为'' 118 | */ 119 | remove(name: string, path?: string): void { 120 | if (!this.support()) { 121 | console.error( 122 | "project-libs(Cookie方法不可用):浏览器不支持Cookie,请检查相关设置" 123 | ); 124 | return; 125 | } 126 | 127 | if (arguments.length === 0) { 128 | const all = this.get(); 129 | Object.keys(all as object).forEach((item) => { 130 | this.set(item, "", { hours: -1 }); 131 | }); 132 | } else { 133 | this.set(name, path || "", { hours: -1 }); 134 | } 135 | }, 136 | }; 137 | 138 | export default cookie; 139 | -------------------------------------------------------------------------------- /src/data/base64.ts: -------------------------------------------------------------------------------- 1 | class Base64 { 2 | /** 3 | * 字符串转 base64 4 | * @param str {string} 字符串 5 | * @returns {string} 字符串 6 | * @summary btoa() 方法不支持 IE9 及更早的 IE 版本 7 | */ 8 | static encode(str: string): string{ 9 | const code = encodeURI(str); 10 | return btoa(code); 11 | } 12 | 13 | /** 14 | * base64 转字符串 15 | * @param str {string} 字符串 16 | * @returns {string} 字符串 17 | * @summary atob() 方法不支持 IE9 及更早的 IE 版本 18 | */ 19 | static decode(str: string): string{ 20 | const code = atob(str); 21 | return decodeURI(code); 22 | } 23 | } 24 | 25 | const base64 = new Base64(); 26 | export default base64; -------------------------------------------------------------------------------- /src/data/clone.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 浅拷贝,才方法只针对普通对象{}和数组[] 3 | * @param source 4 | * @returns {any} any 5 | */ 6 | export default function clone(source: any): any{ 7 | return JSON.parse(JSON.stringify(source)); 8 | } -------------------------------------------------------------------------------- /src/data/compare.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断两个变量是否相等, 此方法用于相同数据类型的变量比较 3 | * @param a {any} 4 | * @param b {any} 5 | * @returns {boolean} boolean 6 | */ 7 | export default function compare(a: any, b: any): Boolean { 8 | const pt = /undefined|number|string|boolean/, 9 | fn = /^(function\s*)(\w*\b)/, 10 | cr = "constructor", 11 | cn = "childNodes", 12 | pn = "parentNode"; 13 | 14 | if (pt.test(typeof a) || pt.test(typeof b) || a === null || b === null) { 15 | return a === b || (isNaN(a) && isNaN(b)); //为了方便,此处假定NaN == NaN 16 | } 17 | 18 | if (a[cr] !== b[cr]) { 19 | return false; 20 | } 21 | 22 | switch (a[cr]) { 23 | case Date: 24 | return a.valueOf() === b.valueOf(); 25 | case Function: 26 | return a.toString().replace(fn, '$1') === b.toString().replace(fn, '$1'); //硬编码中声明函数的方式会影响到toString的结果,因此用正则进行格式化 27 | case Array: 28 | if (a.length !== b.length) { 29 | return false; 30 | } 31 | for (let i = 0; i < a.length; i++) { 32 | if (a[i].toString() == b[i].toString()) { } 33 | } 34 | break; 35 | default: 36 | let alen = 0, blen = 0, d; 37 | if (a === b) { 38 | return true; 39 | } 40 | if (a[cn] || a[pn] || b[cn] || b[pn]) { 41 | return a === b; 42 | } 43 | for (d in a) { 44 | alen++; 45 | } 46 | for (d in b) { 47 | blen++; 48 | } 49 | if (alen !== blen) { 50 | return false; 51 | } 52 | for (d in a) { 53 | if (a[d].toString() != b[d].toString()) { 54 | return false; 55 | } 56 | } 57 | break; 58 | } 59 | return true; 60 | } -------------------------------------------------------------------------------- /src/data/deepClone.ts: -------------------------------------------------------------------------------- 1 | import type from '../type/type'; 2 | 3 | /** 4 | * 深层次克隆 5 | * @param data {any} 数据源 6 | * @returns {any} any 7 | */ 8 | export default function deepClone(data: any): any{ 9 | let t = type(data), o: any, i, ni; 10 | 11 | if(t === 'array') { 12 | o = []; 13 | }else if( t === 'object') { 14 | o = {}; 15 | }else { 16 | return data; 17 | } 18 | 19 | if(t === 'array') { 20 | for (i = 0, ni = data.length; i < ni; i++) { 21 | o.push(deepClone(data[i])); 22 | } 23 | return o; 24 | }else if( t === 'object') { 25 | for( i in data) { 26 | o[i] = deepClone(data[i]); 27 | } 28 | return o; 29 | } 30 | } -------------------------------------------------------------------------------- /src/data/json2FormData.ts: -------------------------------------------------------------------------------- 1 | import type from "../type/type"; 2 | 3 | /** 4 | * 对象转为 formdata 5 | * @param obj {object} 对象 6 | * @returns {FormData} FormData 7 | */ 8 | export default function json2FormData(obj: any): FormData { 9 | if (type(obj) !== "object") { 10 | console.error("project-libs(json2FormData方法参数错误):obj必须为对象"); 11 | // return; 12 | } 13 | 14 | let formData = new FormData(); 15 | for (let i in obj) { 16 | parse(obj[i], i); 17 | } 18 | function parse(array: any, key: string) { 19 | if (type(array) === "undefined" || type(array) === "function") { 20 | return false; 21 | } 22 | 23 | switch (type(array)) { 24 | case "array": 25 | if (array.length === 0) { 26 | formData.append(`${key}`, ""); 27 | } else { 28 | for (let i in array) { 29 | for (let j in array[i]) { 30 | parse(array[i][j], `${key}[${i}].${j}`); 31 | } 32 | } 33 | } 34 | break; 35 | case "object": 36 | for (let j in array) { 37 | parse(array[j], `${key}.${j}`); 38 | } 39 | break; 40 | default: 41 | formData.append(key, array); 42 | break; 43 | } 44 | } 45 | return formData; 46 | } 47 | -------------------------------------------------------------------------------- /src/data/pick.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 从对象中根据特定的属性返回一个新的对象 3 | * @param object 对象来源 4 | * @param props 要选取的属性 5 | */ 6 | export default function pick(object: object, props: Array) { 7 | if (!Array.isArray(object) || !Array.isArray(props)) { 8 | console.error("对象来源和要选取的属性必须为数组!"); 9 | } else { 10 | let obj: any = {}; 11 | props.forEach((item) => { 12 | // @ts-ignore 13 | obj[item] = object[item]; 14 | }); 15 | return obj; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/data/replace.ts: -------------------------------------------------------------------------------- 1 | interface Option { 2 | target: string, 3 | replace: string 4 | }; 5 | 6 | /** 7 | * replace 函数,可以根据指定的选项来替换内容 8 | * @param source 需要替换的资源 9 | * @param option 选项,可以为对象或者对象数组,{target: '<', replace: ''} 或者 [{target: '<', replace: ''}] 10 | * @returns {string} string 11 | */ 12 | export default function replace(source: String, option: Option[] | Option){ 13 | if(Array.isArray(option)){ 14 | let _source = source; 15 | option.forEach(item => { 16 | const reg = new RegExp(item.target, 'g'); 17 | _source = _source.replace(reg, item.replace); 18 | }); 19 | return _source; 20 | } 21 | 22 | if(option.constructor === Object){ 23 | const reg = new RegExp(option.target, 'g'); 24 | return source.replace(reg, option.replace); 25 | } 26 | } -------------------------------------------------------------------------------- /src/data/unPick.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 从对象中排除特定的属性返回一个新的对象 3 | * @param object 对象来源 4 | * @param props 要排除的属性 5 | */ 6 | export default function unPick(object: object, props: Array) { 7 | if (Array.isArray(props)) { 8 | let obj: any = {}; 9 | for(let i in object){ 10 | if(!props.includes(i)){ 11 | // @ts-ignore 12 | obj[i] = object[i]; 13 | } 14 | } 15 | return obj; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/func/compose.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 组合函数,从右向左依次执行 3 | * @returns {any} any 4 | * @example 5 | * ``` 6 | * function a(name) { return 'test:' + name } 7 | function b(statement) { return statement.toUpperCase() + '!' } 8 | function c(str) { return str.replace(/[cC]/, 'CCCCC') } 9 | compose(a, b, c)('com') 10 | // test:CCCCCOM! 11 | * ``` 12 | */ 13 | export default function compose(): any { 14 | const fns = [...arguments]; 15 | return function (arg: any) { 16 | let res = arg; 17 | for (let i = fns.length - 1; i > -1; i--) { 18 | res = fns[i](res) 19 | } 20 | return res; 21 | } 22 | } -------------------------------------------------------------------------------- /src/func/curry.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 用来柯里化的函数 3 | * @param fn {Function} 4 | * @returns {any} any 5 | * @example 6 | * ``` 7 | * let abc = function(a, b, c) { 8 | return [a, b, c]; 9 | }; 10 | const curried = curry(abc); 11 | curried(1)(2)(3); 12 | // [1,2,3] 13 | * ``` 14 | */ 15 | export default function curry(fn: Function): any { 16 | return function aa(...arg: any): any { 17 | if (arg.length >= fn.length) { 18 | return fn(...arg); 19 | } else { 20 | return aa.bind(null, ...arg); 21 | } 22 | }; 23 | } 24 | -------------------------------------------------------------------------------- /src/func/pipe.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 管道函数,从左向右依次执行 3 | * @returns {any} any 4 | * @example 5 | * ``` 6 | * function a(name) { return 'test:' + name } 7 | function b(statement) { return statement.toUpperCase() + '!' } 8 | function c(str) { return str.replace(/[cC]/, 'CCCCC') } 9 | pipe(a, b, c)('com') 10 | // TEST:CCCCCOM! 11 | * ``` 12 | */ 13 | export default function pipe(): any { 14 | const fns = [...arguments]; 15 | return function (arg: any) { 16 | let res = arg; 17 | for (let i = 0; i < fns.length; i++) { 18 | res = fns[i](res); 19 | } 20 | return res; 21 | } 22 | } -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | // 类型 2 | export { default as type } from './type/type'; 3 | export { default as isEmpty } from './type/isEmpty'; 4 | export { default as isJsonString } from './type/isJsonString'; 5 | 6 | // 缓存 7 | export { default as cookie } from './cache/cookie'; 8 | 9 | // 浏览器 10 | export { default as copy } from './browser/copy'; 11 | export { default as createLink } from './browser/createLink'; 12 | export { default as createScript } from './browser/createScript'; 13 | export { default as getScrollTop } from './browser/getScrollTop'; 14 | export { default as scrollToTop } from './browser/scrollToTop'; 15 | export { default as urlGet } from './browser/urlGet'; 16 | export { default as urlParams } from './browser/urlParams'; 17 | 18 | // 时间 19 | export { default as sleep } from './time/sleep'; 20 | export { default as timestamp } from './time/timestamp'; 21 | export { default as timeBeauty } from './time/timeBeauty'; 22 | export { default as getDay } from './time/getDay'; 23 | export { default as getMonth } from './time/getMonth'; 24 | export { default as getYear } from './time/getYear'; 25 | 26 | // 函数式 27 | export { default as curry } from './func/curry'; 28 | export { default as compose } from './func/compose'; 29 | export { default as pipe } from './func/pipe'; 30 | 31 | // 数据处理 32 | export { default as replace } from './data/replace'; 33 | export { default as clone } from './data/clone'; 34 | export { default as deepClone } from './data/deepClone'; 35 | export { default as compare } from './data/compare'; 36 | export { default as json2FormData } from './data/json2FormData'; 37 | export { default as base64 } from './data/base64'; 38 | export { default as pick } from './data/pick'; 39 | 40 | // 数组 41 | export { default as arrayUnique } from './array/arrayUnique'; 42 | export { default as arrayIndex } from './array/arrayIndex'; 43 | export { default as arrayGroup } from './array/arrayGroup'; 44 | export { default as arrayIntersection } from './array/arrayIntersection'; 45 | 46 | // 验证 47 | export { default as isAndroid } from './is/isAndroid'; 48 | export { default as isApple } from './is/isApple'; 49 | export { default as isIos } from './is/isIos'; 50 | export { default as isPhone } from './is/isPhone'; 51 | export { default as isEmail } from './is/isEmail'; 52 | export { default as isMobile } from './is/isMobile'; 53 | export { default as isIP } from './is/isIP'; 54 | export { default as isIDCard } from './is/isIDCard'; 55 | export { default as isPostCode } from './is/isPostCode'; 56 | export { default as isQQNumber } from './is/isQQNumber'; 57 | -------------------------------------------------------------------------------- /src/is/isAndroid.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断是否是安卓设备 3 | * @returns {boolean} boolean 4 | */ 5 | export default function isAndroid(): boolean { 6 | return /android/i.test(navigator.userAgent.toLowerCase()); 7 | } -------------------------------------------------------------------------------- /src/is/isApple.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断是否是苹果设备 3 | * @returns {boolean} boolean 4 | */ 5 | export default function isApple(): boolean { 6 | return /iphone|ipod|ipad|Macintosh/i.test(navigator.userAgent.toLowerCase()); 7 | } -------------------------------------------------------------------------------- /src/is/isEmail.ts: -------------------------------------------------------------------------------- 1 | const _domains = [ 2 | "qq.com", 3 | "163.com", 4 | "126.com", 5 | "vip.126.com", 6 | "yeah.net", 7 | "vip.163.com", 8 | "188.com", 9 | "sohu.com", 10 | "sina.cn", 11 | "sina.com", 12 | "gmail.com", 13 | "hotmail.com", 14 | "outlook.com" 15 | ]; 16 | 17 | /** 18 | * 判断邮箱是否正确,可以自定义邮箱后缀 19 | * @param email {string} 邮箱 20 | * @param domains {array[string]} 域名 ["163.com"] 21 | * @returns {boolean} boolean 22 | * 默认支持的邮箱:[ 23 | "qq.com", 24 | "163.com", 25 | "126.com", 26 | "vip.126.com", 27 | "yeah.net", 28 | "vip.163.com", 29 | "188.com", 30 | "sohu.com", 31 | "sina.cn", 32 | "sina.com", 33 | "gmail.com", 34 | "hotmail.com", 35 | "outlook.com" 36 | ] 37 | */ 38 | export default function isEmail(email: string, domains: string[] = _domains): boolean { 39 | if (domains && !Array.isArray(domains)) { 40 | console.error('project-libs(isEmail参数错误):域名必须为数组'); 41 | } 42 | const reg = new RegExp(`^([A-Za-z0-9\.\_\-])+\@(${domains.join("|")})$`); 43 | return reg.test(email); 44 | } -------------------------------------------------------------------------------- /src/is/isIDCard.ts: -------------------------------------------------------------------------------- 1 | import type from "../type/type"; 2 | 3 | /** 4 | * 验证是否为第二代居民身份证 5 | * 规则: 6 | * 共18位,最后一位可为X(大小写均可) 7 | * 不能以0开头 8 | * 出生年月日会进行校验:年份只能为18/19/2*开头,月份只能为01-12,日只能为01-31 9 | * @param card {string} 身份证号码 10 | * @returns {boolean} boolean 11 | */ 12 | export default function isIDCard(card: string): boolean { 13 | if (type(card) !== "string") { 14 | console.error("project-libs(isIDCard方法参数错误):card必须为字符串"); 15 | return false; 16 | } 17 | 18 | return /^[1-9][0-9]{5}(18|19|(2[0-9]))[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{3}[0-9Xx]$/.test( 19 | card 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /src/is/isIP.ts: -------------------------------------------------------------------------------- 1 | import type from "../type/type"; 2 | 3 | /** 4 | * 校验是否为不含端口号的IP地址 5 | * 规则: 6 | * IP格式为xxx.xxx.xxx.xxx,每一项数字取值范围为0-255 7 | * 除0以外其他数字不能以0开头,比如02 8 | * @param ip {string} ip地址,类型为字符串 9 | * @returns {boolean} boolean 10 | */ 11 | export default function isIP(ip: string): boolean { 12 | if (type(ip) !== "string") { 13 | console.error("project-libs(isIP方法参数错误):ip必须为字符串"); 14 | return false; 15 | } 16 | 17 | return /^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$/.test( 18 | ip 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/is/isIos.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断是否是 ios 设备 3 | * @returns {boolean} boolean 4 | */ 5 | export default function isIos(): boolean { 6 | return /iphone|ipod|ipad/i.test(navigator.userAgent.toLowerCase()); 7 | } -------------------------------------------------------------------------------- /src/is/isMobile.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断是否为手机端 3 | * @returns {boolean} boolean 4 | */ 5 | export default function isMobile(): boolean { 6 | return /iphone|ipod|android.*mobile|windows.*phone|blackberry.*mobile/i.test( 7 | navigator.userAgent.toLowerCase() 8 | ); 9 | } -------------------------------------------------------------------------------- /src/is/isPhone.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 验证是否是电话号码,可以自定义第二个号码 3 | * @param phone {string} 电话号码 4 | * @param second {array} 电话号码的第二个号码规则,可选,例如[3,4,5,7,8] 5 | * @returns {boolean} boolean 6 | */ 7 | export default function isPhone(phone: string, second: number[] = [3,4,5,7,8]): boolean { 8 | const reg = new RegExp(`^[1]${JSON.stringify(second)}[0-9]{9}$`); 9 | return reg.test(phone); 10 | } -------------------------------------------------------------------------------- /src/is/isPostCode.ts: -------------------------------------------------------------------------------- 1 | import type from "../type/type"; 2 | 3 | /** 4 | * 验证是否为邮政编码 5 | * @param code {string} 邮政编码 6 | * @returns {boolean} boolean 7 | */ 8 | export default function isPostCode(code: string): boolean { 9 | if (type(code) !== "string") { 10 | console.error("project-libs(isPostCode方法参数错误):code必须为字符串"); 11 | return false; 12 | } 13 | 14 | return /^[1-9][0-9]{5}$/.test(code.toString()); 15 | } 16 | -------------------------------------------------------------------------------- /src/is/isQQNumber.ts: -------------------------------------------------------------------------------- 1 | import type from "../type/type"; 2 | 3 | /** 4 | * 验证是否是 qq 号码 5 | * 规则:非0开头的5位-13位整数 6 | * @param qq {string} qq号码,字符串 7 | * @returns {boolean} boolean 8 | */ 9 | export default function isQQNumber(qq: string): boolean { 10 | if (type(qq) !== "string") { 11 | console.error("project-libs(isQQNumber方法参数错误):qq必须为字符串"); 12 | return false; 13 | } 14 | 15 | return /^[1-9][0-9]{4,12}$/.test(qq); 16 | } 17 | -------------------------------------------------------------------------------- /src/is/isURL.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 验证是否为网址 3 | * @param url {string} 网址 4 | * @returns {boolean} boolean 5 | */ 6 | export default function isURL(url: string): boolean { 7 | var regular = /^\b(((https?|ftp):\/\/)?[-a-z0-9]+(\.[-a-z0-9]+)*\.(?:com|edu|gov|int|mil|net|org|biz|info|name|museum|asia|coop|aero|[a-z][a-z]|((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]\d)|\d))\b(\/[-a-z0-9_:\@&?=+,.!\/~%\$]*)?)$/i; 8 | return regular.test(url); 9 | } -------------------------------------------------------------------------------- /src/time/getDay.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 获取某一天 3 | * @param fill {boolean} 布尔值,是否补 0,默认为 true 4 | * @returns {number | string} 返回哪一天 5 | */ 6 | export default function getDay(fill = true): number | string { 7 | const day = new Date().getDate(); 8 | let _day: number | string = day; 9 | if (fill) { 10 | _day = day < 10 ? `0${day}` : day 11 | } 12 | return _day; 13 | } -------------------------------------------------------------------------------- /src/time/getMonth.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 获取当前月份 3 | * @param {Boolean} fill 布尔值,是否补 0,默认为 true 4 | */ 5 | export default function getMonth(fill = true) { 6 | const mon = new Date().getMonth() + 1 7 | const monRe = mon 8 | if (fill) mon < 10 ? `0${mon}` : mon 9 | return monRe 10 | } -------------------------------------------------------------------------------- /src/time/getYear.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 获取年份 3 | * @returns {number} 返回哪一年 4 | */ 5 | export default function getYear(): number { 6 | return new Date().getFullYear(); 7 | } -------------------------------------------------------------------------------- /src/time/sleep.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 睡眠函数 3 | * @param delay 睡眠时间(毫秒),默认为 0 4 | * @returns {promise} 返回一个 promise 对象 5 | */ 6 | export default async function sleep(delay: number = 0): Promise { 7 | return new Promise(resolve => setTimeout(resolve, delay)); 8 | } -------------------------------------------------------------------------------- /src/time/timeBeauty.ts: -------------------------------------------------------------------------------- 1 | import type from "../type/type"; 2 | 3 | /** 4 | * 时间美化函数 5 | * @param timestamp {string | number} 字符串或者数字 6 | * @returns {string} 返回字符串 7 | * @summary 规则:时间戳与当前时间进行比较 8 | * ``` 9 | * 小于1分钟,显示 x分钟前 10 | * 小于1天,显示 x小时前 11 | * 大于1天,小于2天,显示昨天x(小时):x(分钟) 12 | * 大于2天,小于28天,显示x天前 13 | * 否则,显示年-月-日 14 | * ``` 15 | */ 16 | export default function timeBeauty( 17 | timestamp: string | number 18 | ): string | undefined { 19 | if (!timestamp) { 20 | console.error("project-libs(timeBeauty方法参数错误):参数为必填项"); 21 | return; 22 | } 23 | if ( 24 | timestamp && 25 | !(type(timestamp) === "string" || type(timestamp) === "number") 26 | ) { 27 | console.error( 28 | "project-libs(timeBeauty方法参数错误):参数为 string | number" 29 | ); 30 | return; 31 | } 32 | 33 | const time = Number(timestamp); 34 | const now = new Date(); 35 | const date = new Date(time); 36 | const diffTime = now.getTime() - time; 37 | const minute = 60 * 1000; // 1分钟 38 | const hour = 60 * 60 * 1000; // 1小时 39 | const day = 24 * 60 * 60 * 1000; // 1天 40 | const diffHour = Math.floor(diffTime / hour); 41 | const diffMinute = Math.floor(diffTime / minute); 42 | const diffDay = Math.floor(diffTime / day); 43 | let result = ""; 44 | 45 | if (diffTime > 0) { 46 | if (diffTime <= minute) { 47 | result = "刚刚"; 48 | } else if (diffTime > minute && diffTime <= hour) { 49 | result = `${diffMinute}分钟前`; 50 | } else if (diffTime > hour && diffTime <= day) { 51 | result = `${diffHour}小时前`; 52 | } else if (diffTime > day && diffTime <= day * 2) { 53 | result = `昨天${ 54 | date.getHours() < 10 ? `0${date.getHours()}` : date.getHours() 55 | }:${ 56 | date.getMinutes() < 10 ? `0${date.getMinutes()}` : date.getMinutes() 57 | }`; 58 | } else if (diffTime > day * 2 && diffTime <= day * 28) { 59 | return `${diffDay}天前`; 60 | } else if (diffTime > day * 28) { 61 | result = fullTime(date); 62 | } 63 | } else { 64 | result = fullTime(date); 65 | } 66 | 67 | return result; 68 | } 69 | 70 | function fullTime(date: Date) { 71 | return `${date.getFullYear()}-${ 72 | date.getMonth() + 1 < 10 ? `0${date.getMonth() + 1}` : date.getMonth() + 1 73 | }-${date.getDate() < 10 ? `0${date.getDate()}` : date.getDate()}`; 74 | } 75 | -------------------------------------------------------------------------------- /src/time/timestamp.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 获取当前时间戳 3 | * @returns {string} 字符串 4 | */ 5 | export default function timestamp(): string { 6 | return Number((new Date())).toString(); 7 | } -------------------------------------------------------------------------------- /src/type/isEmpty.ts: -------------------------------------------------------------------------------- 1 | import type from './type'; 2 | 3 | /** 4 | * 判断空对象,空数组,空字符串 5 | * @param obj 数组或者对象或者字符串 6 | * @returns boolean 7 | */ 8 | export default function isEmpty(obj: Array | Object | string): boolean { 9 | if (!obj) { 10 | return true; 11 | } 12 | if(obj === ''){ 13 | return true; 14 | } 15 | if (type(obj) === 'array') { 16 | // @ts-ignore 17 | if (!obj.length) { 18 | return true; 19 | } 20 | } 21 | if (type(obj) === 'object') { 22 | if (JSON.stringify(obj) === "{}") { 23 | return true; 24 | } 25 | } 26 | return false; 27 | } 28 | -------------------------------------------------------------------------------- /src/type/isJsonString.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 验证是否可以被JSON.parse 3 | * @param ele {any} 元素 4 | * @returns {boolean} boolean 5 | */ 6 | export default function isJsonString(ele: any): boolean { 7 | try { 8 | JSON.parse(ele); 9 | } catch (e) { 10 | return false; 11 | } 12 | return true; 13 | } -------------------------------------------------------------------------------- /src/type/type.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断数据类型 3 | * @param ele {any} 元素 4 | * @returns {string} boolean/number/string/function/array/date/regExp/undefined/null/object/map/set/symbol 5 | */ 6 | export default function type(ele: any): string { 7 | const toString = Object.prototype.toString, 8 | map: any = { 9 | "[object Boolean]": "boolean", 10 | '[object Number]': 'number', 11 | '[object String]': 'string', 12 | '[object Function]': 'function', 13 | '[object Array]': 'array', 14 | '[object Date]': 'date', 15 | '[object RegExp]': 'regExp', 16 | '[object Undefined]': 'undefined', 17 | '[object Null]': 'null', 18 | '[object Object]': 'object', 19 | '[object Map]': 'map', 20 | '[object Set]': 'set', 21 | '[object Symbol]': 'symbol' 22 | }; 23 | return map[toString.call(ele)]; 24 | } -------------------------------------------------------------------------------- /test/array.test.ts: -------------------------------------------------------------------------------- 1 | import "mocha"; 2 | import { expect } from "chai"; 3 | import arrayDiff from "../src/array/arrayDiff"; 4 | import arrayIntersection from "../src/array/arrayIntersection"; 5 | 6 | describe("array数组处理", function() { 7 | it("arrayDiff", function() { 8 | const a = [1, 2]; 9 | const b = [1, 3]; 10 | expect(arrayDiff(a, b)).to.eql([2, 3]); 11 | const a2 = [1, { id: 1 }]; 12 | const b2 = [1, 3]; 13 | expect(arrayDiff(a2, b2)).to.eql([{ id: 1 }, 3]); 14 | expect( 15 | arrayDiff([{ id: 1 }, { id: 123 }], [{ id: 1 }, { id: 123456 }]) 16 | ).to.eql([{ id: 123456 }]); 17 | }); 18 | 19 | it("arrayIntersection", function() { 20 | const a = [1, 2]; 21 | const b = [1, 3]; 22 | expect(arrayIntersection(a, b)).to.eql([1]); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /test/cookie.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 | 10 | 17 | 18 | -------------------------------------------------------------------------------- /test/cookie.test.ts: -------------------------------------------------------------------------------- 1 | import { JSDOM } from 'jsdom'; 2 | import 'mocha'; 3 | import { expect } from 'chai'; 4 | 5 | const { window } = new JSDOM(` 6 | 7 | 8 | 9 | 10 | `); 11 | 12 | describe('cookie方法', () => { 13 | it('set', () => { 14 | // console.log(window); 15 | 16 | }); 17 | }); 18 | 19 | -------------------------------------------------------------------------------- /test/is.test.ts: -------------------------------------------------------------------------------- 1 | import "mocha"; 2 | import { expect } from "chai"; 3 | import isEmpty from "../src/type/isEmpty"; 4 | 5 | describe("is类型判断相关函数", function() { 6 | it("isEmpty", function() { 7 | expect(isEmpty("")).to.be.equal(true); 8 | // expect(isEmpty(undefined)).to.be.equal(true); 9 | expect(isEmpty([])).to.be.equal(true); 10 | expect(isEmpty({})).to.be.equal(true); 11 | expect(isEmpty([1])).to.be.equal(false); 12 | expect(isEmpty({ id: 1 })).to.be.equal(false); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /test/time.test.ts: -------------------------------------------------------------------------------- 1 | import "mocha"; 2 | import { expect } from "chai"; 3 | import timeBeauty from "../src/time/timeBeauty"; 4 | 5 | describe("time时间函数", function() { 6 | it("timeBeauty", function() { 7 | expect(timeBeauty("1666351987000")).to.eql("12分钟前"); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./build", 4 | "noImplicitAny": true, 5 | "allowJs": true, 6 | "target": "es5", 7 | "lib": [ 8 | "es5", 9 | "dom", 10 | "dom.iterable", 11 | "es2015", 12 | "es2016", 13 | "es2017", 14 | "es2020", 15 | "scripthost" 16 | ], 17 | "downlevelIteration": true, 18 | "emitBOM": true, 19 | "experimentalDecorators": true 20 | }, 21 | "include": ["src/**/*", "test/*"], 22 | "exclude": ["node_modules"] 23 | } 24 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | 3 | module.exports = { 4 | mode: "production", 5 | entry: "./src/index.ts", 6 | output: { 7 | path: path.resolve(__dirname, "dist"), 8 | filename: "projectLibs.js", 9 | library: "projectLibs", 10 | libraryTarget: "umd", 11 | }, 12 | devtool: "source-map", 13 | module: { 14 | rules: [ 15 | { 16 | test: /\.(tsx|ts)?$/, 17 | use: "ts-loader", 18 | exclude: /node_modules/, 19 | }, 20 | ], 21 | }, 22 | resolve: { 23 | extensions: [".tsx", ".ts", ".js"], 24 | }, 25 | }; 26 | --------------------------------------------------------------------------------