diff --git a/.commitlintrc b/.commitlintrc new file mode 100644 index 0000000..dbc9301 --- /dev/null +++ b/.commitlintrc @@ -0,0 +1,3 @@ +{ + extends: "@commitlint/config-conventional" +} \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..60d2159 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,25 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended" + ], + "overrides": [], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": ["@typescript-eslint", "prettier"], + "rules": { + "semi": "off", + "@typescript-eslint/no-explicit-any": "off", + "no-console": "error", + "@typescript-eslint/no-this-alias": "off" + }, + "ignorePatterns": ["**/*.test.js"] +} diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 0000000..42cdacd --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx --no-install commitlint -e diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..d24fdfc --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx lint-staged diff --git a/.prettierrc b/.prettierrc index 94beb14..0804d72 100644 --- a/.prettierrc +++ b/.prettierrc @@ -2,6 +2,10 @@ "singleQuote": true, "trailingComma": "all", "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "bracketSpacing": true, "overrides": [ { "files": ".prettierrc", diff --git a/package.json b/package.json index c6ba6ac..c77ee79 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,9 @@ "release": "npm run build && npm publish --access public", "prettier": "prettier --write \"**/*.{js,jsx,tsx,ts,less,md,json}\"", "test": "umi-test", - "test:coverage": "umi-test --coverage" + "test:coverage": "umi-test --coverage", + "lint": "eslint . --ext .ts --fix", + "prepare": "husky install" }, "main": "dist/index.js", "module": "dist/index.esm.js", @@ -35,30 +37,35 @@ "pre-commit": "yarn test" }, "lint-staged": { - "*.{js,jsx,less,md,json}": [ - "prettier --write" - ], - "*.ts?(x)": [ - "prettier --parser=typescript --write" + "*.{ts}": [ + "npm run lint" ] }, "dependencies": { + "@babel/runtime": "^7.18.9", "lodash.clonedeep": "^4.5.0", "lodash.difference": "^4.5.0", "nanoid": "^3.1.30", - "qs": "^6.10.1", - "@babel/runtime": "^7.18.9" + "qs": "^6.10.1" }, "devDependencies": { + "@commitlint/cli": "^17.6.1", + "@commitlint/config-conventional": "^17.6.1", "@types/lodash.clonedeep": "^4.5.6", "@types/lodash.difference": "^4.5.7", "@types/qs": "^6.9.7", + "@typescript-eslint/eslint-plugin": "^5.59.0", + "@typescript-eslint/parser": "^5.59.0", "@umijs/test": "^3.0.5", "dumi": "^1.0.17", + "eslint": "^8.39.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^4.2.1", "father-build": "^1.17.2", "gh-pages": "^3.0.0", - "lint-staged": "^10.0.7", - "prettier": "^2.2.1", + "husky": "^8.0.3", + "lint-staged": "^13.2.1", + "prettier": "^2.8.8", "yorkie": "^2.0.0" }, "publishConfig": { diff --git a/src/arrayToListNode/index.ts b/src/arrayToListNode/index.ts index d174517..ffc750f 100644 --- a/src/arrayToListNode/index.ts +++ b/src/arrayToListNode/index.ts @@ -10,13 +10,13 @@ interface ListNode { } const arrayToListNode = (arr: Array): ListNode | undefined => { - let len = arr.length; + const len = arr.length; if (!len) { return undefined; } let node: ListNode = { data: arr[len - 1], - } + }; for (let i = len - 2; i >= 0; i--) { node = { data: arr[i], @@ -24,5 +24,5 @@ const arrayToListNode = (arr: Array): ListNode | undefined => { }; } return node; -} +}; export default arrayToListNode; diff --git a/src/base64/index.ts b/src/base64/index.ts index a791f44..d27b01c 100644 --- a/src/base64/index.ts +++ b/src/base64/index.ts @@ -63,7 +63,7 @@ const base64 = { e = e.replace(/rn/g, 'n'); let t = ''; for (let n = 0; n < e.length; n++) { - let r = e.charCodeAt(n); + const r = e.charCodeAt(n); if (r < 128) { t += String.fromCharCode(r); } else if (r > 127 && r < 2048) { diff --git a/src/bubbleSort/index.ts b/src/bubbleSort/index.ts index 36b57e8..85468a6 100644 --- a/src/bubbleSort/index.ts +++ b/src/bubbleSort/index.ts @@ -1,45 +1,47 @@ -import isArray from '../isArray'; +import isArray from '../isArray'; /** * 对象数组、普通数组冒泡排序 - * @param obj - * @param arrKey + * @param obj + * @param arrKey * @param orderby - * @returns + * @returns * 对象数组使用 bubbleSort(arr,key,orderby) * 普通数组使用 bubbleSort(arr) bubbleSort(arr,'',orderby) */ -function bubbleSort(obj: (object | string | number) [], arrKey: string, orderby: 'asc' | 'desc' = 'asc') { - let result : any[] = obj; - let temp = null; - if (isArray(obj)) { - if (obj.length > 1) { - for (let i = 0; i < result.length; i++) { - for (let j = 0; j < i; j++) { - let resultfiled_i = result[i][arrKey] - ? result[i][arrKey] - : result[i], - resultfiled_j = result[j][arrKey] - ? result[j][arrKey] - : result[j]; - // 降序 - if (orderby === 'desc') { - if (parseInt(resultfiled_i) > parseInt(resultfiled_j)) { - temp = result[j]; - result[j] = result[i]; - result[i] = temp; - } - // 升序 - } else { - if (parseInt(resultfiled_i) < parseInt(resultfiled_j)) { - temp = result[j]; - result[j] = result[i]; - result[i] = temp; - } - } - } +function bubbleSort( + obj: (object | string | number)[], + arrKey: string, + orderby: 'asc' | 'desc' = 'asc', +) { + const result: any[] = obj; + let temp = null; + if (isArray(obj)) { + if (obj.length > 1) { + for (let i = 0; i < result.length; i++) { + for (let j = 0; j < i; j++) { + const resultfiled_i = result[i][arrKey] + ? result[i][arrKey] + : result[i], + resultfiled_j = result[j][arrKey] ? result[j][arrKey] : result[j]; + // 降序 + if (orderby === 'desc') { + if (parseInt(resultfiled_i) > parseInt(resultfiled_j)) { + temp = result[j]; + result[j] = result[i]; + result[i] = temp; } + // 升序 + } else { + if (parseInt(resultfiled_i) < parseInt(resultfiled_j)) { + temp = result[j]; + result[j] = result[i]; + result[i] = temp; + } + } } - return result; - }else throw Error('数据格式错误'); + } + } + return result; + } else throw Error('数据格式错误'); } export default bubbleSort; diff --git a/src/compressImg/index.ts b/src/compressImg/index.ts index 437a981..5dddf6b 100644 --- a/src/compressImg/index.ts +++ b/src/compressImg/index.ts @@ -11,9 +11,9 @@ function compressImg( type: string, mx: number, mh: number, - quality: number = 1, + quality = 1, ) { - return new Promise((resolve, reject) => { + return new Promise((resolve) => { const canvas = document.createElement('canvas'); const context = canvas.getContext('2d'); const { width: originWidth, height: originHeight } = img; diff --git a/src/coordinatesInCircle/index.ts b/src/coordinatesInCircle/index.ts index 32914c2..a7a25aa 100644 --- a/src/coordinatesInCircle/index.ts +++ b/src/coordinatesInCircle/index.ts @@ -6,7 +6,7 @@ function coordinatesInCircle( center: [number, number], - r: number = 1, + r = 1, ): [number, number] { if (center && Array.isArray(center) && center.length === 2) { const [xAxis, yAxis]: [number, number] = center, @@ -15,6 +15,7 @@ function coordinatesInCircle( let pointX: number, pointY: number; + // eslint-disable-next-line no-constant-condition while (true) { // 生成大于等于 xValueRange[0],小于等于 xValueRange[1] 的 x 坐标 pointX = diff --git a/src/dateCalculate/index.ts b/src/dateCalculate/index.ts index 9d31578..8e9a3c4 100644 --- a/src/dateCalculate/index.ts +++ b/src/dateCalculate/index.ts @@ -1,10 +1,17 @@ -import {formatDate} from "../index"; +import { formatDate } from '../index'; -type DateType = 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' | 'milliseconds'; +type DateType = + | 'year' + | 'month' + | 'day' + | 'hour' + | 'minute' + | 'second' + | 'milliseconds'; const dateTypeMap = { year: (date: Date, num: number) => { - return date.setFullYear(date.getFullYear() + num) + return date.setFullYear(date.getFullYear() + num); }, month: (date: Date, num: number) => { return date.setMonth(date.getMonth() + num); @@ -24,7 +31,7 @@ const dateTypeMap = { milliseconds: (date: Date, num: number) => { return date.setMilliseconds(date.getMilliseconds() + num); }, -} +}; /** * 对日期进行计算,比如计算前一天,前一个月,后一天,后一个月等等 @@ -33,14 +40,19 @@ const dateTypeMap = { * @param flag:对 年月日时分秒 那个进行计算 * @param format:对 计算后的日期进行格式化的格式,默认使用 YY-MM-DD hh:mm:ss。比如:2020-01-02 08:00:00 */ -const dateCalculate = (dateStr: string | Date, num: number, flag: DateType, format?: string): string => { +const dateCalculate = ( + dateStr: string | Date, + num: number, + flag: DateType, + format?: string, +): string => { if (dateTypeMap[flag]) { - let date = new Date(dateStr) - let result = dateTypeMap[flag](date, num); - return formatDate(result, format) + const date = new Date(dateStr); + const result = dateTypeMap[flag](date, num); + return formatDate(result, format); } else { - throw Error("请输入正确的计算参数(仅支持 年、月、日、时、分、秒、毫秒)"); + throw Error('请输入正确的计算参数(仅支持 年、月、日、时、分、秒、毫秒)'); } -} +}; export default dateCalculate; diff --git a/src/debounce/index.ts b/src/debounce/index.ts index cf81780..6d46a8c 100644 --- a/src/debounce/index.ts +++ b/src/debounce/index.ts @@ -1,20 +1,19 @@ +type Timeout = ReturnType | null; + /** * - * @param fn - * @param wait + * @param fn 回调函数 + * @param wait 延迟时间 * @returns */ -// @ts-nocheck -function debounce(fn: Function, wait: number) { - let timer: any = null; - return function () { - let context = this; - let args = arguments; - if (timer !== null) { - clearTimeout(timer); - } +function debounce(fn: (...args: any[]) => void, wait = 300) { + let timer: Timeout = null; + + return function (this: any, ...args: any[]) { + if (timer) clearTimeout(timer); + timer = setTimeout(() => { - fn.apply(context, args); + fn.apply(this, args); }, wait); }; } diff --git a/src/downloadFileWithUrl/index.ts b/src/downloadFileWithUrl/index.ts index b111cc5..691093e 100644 --- a/src/downloadFileWithUrl/index.ts +++ b/src/downloadFileWithUrl/index.ts @@ -3,7 +3,7 @@ * @param url 下载链接 * @param fileName 文件名 */ -function downloadFileWithUrl(url: string, fileName: string = '') { +function downloadFileWithUrl(url: string, fileName = '') { if (!fileName) { const urlArr: string[] = url.split('/'); fileName = urlArr[urlArr.length - 1]; diff --git a/src/fibonacci/index.ts b/src/fibonacci/index.ts index ee3a9b6..109cd8b 100644 --- a/src/fibonacci/index.ts +++ b/src/fibonacci/index.ts @@ -7,11 +7,11 @@ function fibonacci(n: number) { if (n === 0) return 0; if (n === 1) return 1; - let n2: number = 0, - n1: number = 1, - res: number = 0; + let n2 = 0, + n1 = 1, + res = 0; - for (let i: number = 2; i <= n; i++) { + for (let i = 2; i <= n; i++) { res = n1 + n2; n2 = n1; n1 = res; diff --git a/src/formatDate/index.ts b/src/formatDate/index.ts index 4d13df0..6301ed9 100644 --- a/src/formatDate/index.ts +++ b/src/formatDate/index.ts @@ -4,7 +4,7 @@ * @param format * @returns */ -function formatDate(time: number, format: string = 'YY-MM-DD hh:mm:ss') { +function formatDate(time: number, format = 'YY-MM-DD hh:mm:ss') { const date = new Date(time); const year = date.getFullYear(), @@ -13,7 +13,8 @@ function formatDate(time: number, format: string = 'YY-MM-DD hh:mm:ss') { hour = date.getHours(), min = date.getMinutes(), sec = date.getSeconds(); - const preArr = Array.apply(null, Array(10)).map(function (elem, index) { + + const preArr = [...Array(10)].map(function (elem, index) { return '0' + index; }); diff --git a/src/formatPercent/index.ts b/src/formatPercent/index.ts index 8c90443..33989e1 100644 --- a/src/formatPercent/index.ts +++ b/src/formatPercent/index.ts @@ -7,7 +7,7 @@ const judgeIsNumber = (value: any) => * @param value 任何值 * @param precision 小数位 */ -function formatPercent(value: any, precision: number = 2): string { +function formatPercent(value: any, precision = 2): string { let result = '0'; if (judgeIsNumber(value) && value !== 0) { result = diff --git a/src/genRandomColor/index.ts b/src/genRandomColor/index.ts index ae8c6b3..f60ea1f 100644 --- a/src/genRandomColor/index.ts +++ b/src/genRandomColor/index.ts @@ -7,21 +7,52 @@ * @Description:获取随机颜色'hsl'|'hsla'|'rgb'|'rgba'|16,默认是rgb格式。 */ export default genRandomColor; -function genRandomColor (type:'hsl'|'hsla'|'rgb'|'rgba'|16|'16'|undefined) { -const genColorObj={ - hsl:"hsl(" + Math.round(Math.random() * 360) + "," + Math.round(Math.random() * 100) + '%,' + Math.round(Math.random() * 100) + '%)', - hsla:"hsla(" + Math.round(Math.random() * 360) + "," + Math.round(Math.random() * 100) + '%,' + Math.round(Math.random() * 100) +'%,'+(Math.random()*10/10).toFixed(1)+')', - rgb:"rgb(" + Math.round(Math.random() * 255) + "," + Math.round(Math.random() * 255) +',' + Math.round(Math.random() * 255)+')' , - rgba:"rgba(" + Math.round(Math.random() * 255) + "," + Math.round(Math.random() * 255) +',' + Math.round(Math.random() * 255)+','+(Math.random()*10/10).toFixed(1)+')', - 16:'#'+Math.random().toString(16).substr(2, 6) +function genRandomColor( + type: 'hsl' | 'hsla' | 'rgb' | 'rgba' | 16 | '16' | undefined, +) { + const genColorObj = { + hsl: + 'hsl(' + + Math.round(Math.random() * 360) + + ',' + + Math.round(Math.random() * 100) + + '%,' + + Math.round(Math.random() * 100) + + '%)', + hsla: + 'hsla(' + + Math.round(Math.random() * 360) + + ',' + + Math.round(Math.random() * 100) + + '%,' + + Math.round(Math.random() * 100) + + '%,' + + ((Math.random() * 10) / 10).toFixed(1) + + ')', + rgb: + 'rgb(' + + Math.round(Math.random() * 255) + + ',' + + Math.round(Math.random() * 255) + + ',' + + Math.round(Math.random() * 255) + + ')', + rgba: + 'rgba(' + + Math.round(Math.random() * 255) + + ',' + + Math.round(Math.random() * 255) + + ',' + + Math.round(Math.random() * 255) + + ',' + + ((Math.random() * 10) / 10).toFixed(1) + + ')', + 16: '#' + Math.random().toString(16).substr(2, 6), + }; + if (!type) { + return genColorObj['rgb']; + } + if (['hsl', 'hsla', 'rgb', 'rgba', '16', 16].includes(type)) { + return genColorObj[type]; + } } -if(!type){ - return genColorObj['rgb'] -} -if(['hsl','hsla','rgb','rgba','16',16].includes(type)){ - return genColorObj[type] -} - -} - - diff --git a/src/getDom/index.ts b/src/getDom/index.ts index fab0548..ca867e5 100644 --- a/src/getDom/index.ts +++ b/src/getDom/index.ts @@ -7,15 +7,15 @@ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ -function $ (selector:string) { - const nodes= document.querySelectorAll(selector) - if(nodes.length===0){ +function $(selector: string) { + const nodes = document.querySelectorAll(selector); + if (nodes.length === 0) { return undefined; } - if(nodes.length===1){ - return nodes[0] + if (nodes.length === 1) { + return nodes[0]; } return nodes; -}; +} export default $; diff --git a/src/getDomPageXY/index.ts b/src/getDomPageXY/index.ts index b527838..8e41043 100644 --- a/src/getDomPageXY/index.ts +++ b/src/getDomPageXY/index.ts @@ -7,19 +7,18 @@ * @Description: 获取dom节点相对于文档定位。 */ -function getDomPageXY (selector:string) { -const element= document.querySelector(selector) -if(element){ - const {top,left}=element.getBoundingClientRect(); - //top和left加上滚动条 - // For scrollX -const scrollLeft = document.documentElement.scrollLeft; -// For scrollY -const scrollTop = document.documentElement.scrollTop; -return [left+scrollLeft,top+scrollTop] +function getDomPageXY(selector: string) { + const element = document.querySelector(selector); + if (element) { + const { top, left } = element.getBoundingClientRect(); + //top和left加上滚动条 + // For scrollX + const scrollLeft = document.documentElement.scrollLeft; + // For scrollY + const scrollTop = document.documentElement.scrollTop; + return [left + scrollLeft, top + scrollTop]; + } + return undefined; } -return undefined; -}; - -export default getDomPageXY +export default getDomPageXY; diff --git a/src/getDomScreenXY/index.ts b/src/getDomScreenXY/index.ts index b0b7122..df81469 100644 --- a/src/getDomScreenXY/index.ts +++ b/src/getDomScreenXY/index.ts @@ -7,16 +7,14 @@ * @Description: 获取dom节点相对于screen定位。 */ -function getDomScreenXY (selector:string) { - const element= document.querySelector(selector) - if(element){ - const {top,left}=element.getBoundingClientRect(); - - return [left,top] - } - return undefined; - - }; - - export default getDomScreenXY - +function getDomScreenXY(selector: string) { + const element = document.querySelector(selector); + if (element) { + const { top, left } = element.getBoundingClientRect(); + + return [left, top]; + } + return undefined; +} + +export default getDomScreenXY; diff --git a/src/getDomText/index.ts b/src/getDomText/index.ts index fbbea58..d6ee333 100644 --- a/src/getDomText/index.ts +++ b/src/getDomText/index.ts @@ -6,26 +6,24 @@ * @FilePath: \xijs\src\getDom\index.ts * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ -import $ from '../getDom' -function getDomText (selector:string) { -const doms= $(selector); -//1.是undefined -if(!doms){ - return '' -} -//1.是nodeList -if(doms.hasOwnProperty(length)){ - let res=''; - Array.from(doms as NodeListOf).forEach(item => { - - res+=item.textContent - }); - - return res -} -//3是element -return (doms as Element).textContent +import $ from '../getDom'; +function getDomText(selector: string) { + const doms = $(selector); + //1.是undefined + if (!doms) { + return ''; + } + //1.是nodeList + if (Reflect.has(doms, 'length')) { + let res = ''; + Array.from(doms as NodeListOf).forEach((item) => { + res += item.textContent; + }); -}; + return res; + } + //3是element + return (doms as Element).textContent; +} export default getDomText; diff --git a/src/getRuntimeEnv/index.ts b/src/getRuntimeEnv/index.ts index d11cfb2..ba17c09 100644 --- a/src/getRuntimeEnv/index.ts +++ b/src/getRuntimeEnv/index.ts @@ -1,22 +1,24 @@ -// @ts-nocheck /** * 获取当前运行环境,返回运行环境的集合判断 * @returns */ function getRuntimeEnv() { - let inBrowser = typeof window !== 'undefined'; - let inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform; - let weexPlatform = inWeex && WXEnvironment.platform.toLowerCase(); + const inBrowser = typeof window !== 'undefined'; + const inWeex = + typeof window.WXEnvironment !== 'undefined' && + !!window.WXEnvironment.platform; + const weexPlatform = inWeex && window.WXEnvironment.platform.toLowerCase(); //浏览器 UA 判断 - let UA = inBrowser && window.navigator.userAgent.toLowerCase(); - let isIE = UA && /msie|trident/.test(UA); - let isIE9 = UA && UA.indexOf('msie 9.0') > 0; - let isEdge = UA && UA.indexOf('edge/') > 0; - let isAndroid = + const UA = inBrowser && window.navigator.userAgent.toLowerCase(); + const isIE = UA && /msie|trident/.test(UA); + const isIE9 = UA && UA.indexOf('msie 9.0') > 0; + const isEdge = UA && UA.indexOf('edge/') > 0; + const isAndroid = (UA && UA.indexOf('android') > 0) || weexPlatform === 'android'; - let isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || weexPlatform === 'ios'; - let isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge; + const isIOS = + (UA && /iphone|ipad|ipod|ios/.test(UA)) || weexPlatform === 'ios'; + const isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge; return { isWeex: inWeex, isIE, diff --git a/src/hyCompact/index.ts b/src/hyCompact/index.ts index 8568d50..d1f84d6 100644 --- a/src/hyCompact/index.ts +++ b/src/hyCompact/index.ts @@ -3,7 +3,7 @@ * @param str * @returns */ -function hyCompact(str: string, flag: string = '-') { +function hyCompact(str: string, flag = '-') { let temp = str.replace(/[A-Z]{1,2}/g, function (match) { return flag + match.toLowerCase(); }); diff --git a/src/isEmpty/index.ts b/src/isEmpty/index.ts index c4c2f78..1ede9b2 100644 --- a/src/isEmpty/index.ts +++ b/src/isEmpty/index.ts @@ -3,7 +3,7 @@ * @param obj * @returns */ -const isEmpty = (obj: Object) => +const isEmpty = (obj: Record) => Reflect.ownKeys(obj).length === 0 && obj.constructor === Object; export default isEmpty; diff --git a/src/isPc/index.ts b/src/isPc/index.ts index 0c142c1..173354d 100644 --- a/src/isPc/index.ts +++ b/src/isPc/index.ts @@ -1,15 +1,15 @@ const IsPc = (): boolean => { - var userAgentInfo = navigator.userAgent; - var Agents = new Array( + const userAgentInfo = navigator.userAgent; + const Agents = [ 'Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod', - ); - var flag = true; - for (var v = 0; v < Agents.length; v++) { + ]; + let flag = true; + for (let v = 0; v < Agents.length; v++) { if (userAgentInfo.indexOf(Agents[v]) > 0) { flag = false; break; diff --git a/src/isPhone/index.ts b/src/isPhone/index.ts index 7b25d6b..3cad02a 100644 --- a/src/isPhone/index.ts +++ b/src/isPhone/index.ts @@ -1,5 +1,5 @@ function isPhone(phone: string) { - var myreg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/; + const myreg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/; if (!myreg.test(phone)) { return false; } else { diff --git a/src/linkListToArray/index.ts b/src/linkListToArray/index.ts index 01216b9..d9b9de8 100644 --- a/src/linkListToArray/index.ts +++ b/src/linkListToArray/index.ts @@ -1,20 +1,20 @@ interface ListNode { - value: number; - next?: ListNode; + value: number; + next?: ListNode; } /** - * - * @param linkList - * @returns + * + * @param linkList + * @returns */ const linkListToArray = (linkList: ListNode | undefined): Array => { - let arr = [] - let header = linkList - while (header) { - arr.push(header.value) - header = header.next - } - return arr -} + const arr = []; + let header = linkList; + while (header) { + arr.push(header.value); + header = header.next; + } + return arr; +}; export default linkListToArray; diff --git a/src/obj2url/index.ts b/src/obj2url/index.ts index f25cc74..a3ae8ae 100644 --- a/src/obj2url/index.ts +++ b/src/obj2url/index.ts @@ -5,11 +5,11 @@ */ export const obj2url = (data: any, isPrefix?: boolean) => { - let prefix = isPrefix ? '?' : ''; + const prefix = isPrefix ? '?' : ''; - let _result = []; - for (let key in data) { - let value = data[key]; + const _result = []; + for (const key in data) { + const value = data[key]; // 去掉为空的参数 if (['', undefined, null].includes(value)) { continue; diff --git a/src/parser/index.ts b/src/parser/index.ts index b17172e..b7b3c63 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -45,7 +45,7 @@ const parser = { if (this.isObj(obj)) { result = {}; - for (let key in obj) { + for (const key in obj) { const v = (obj as IObject)[key]; if (this.isFunc(v)) { result[key] = `${this.FUNC_PREFIX}${v}`; @@ -60,7 +60,10 @@ const parser = { return result; }, - parse: function (jsonStr: string, error?: (err: Error | unknown) => {}) { + parse: function ( + jsonStr: string, + error?: (err: Error | unknown) => Record, + ) { try { return JSON.parse(jsonStr, (key, value) => { if (value && typeof value === 'string') { @@ -82,7 +85,7 @@ const parser = { obj: any, replacer?: (key: string, value: any) => any, space?: number | string, - error?: (err: Error | unknown) => {}, + error?: (err: Error | unknown) => Record, ) { try { let _obj = obj; @@ -105,7 +108,7 @@ const parser = { fastStringify: function ( obj: any, space?: number | string, - error?: (err: Error | unknown) => {}, + error?: (err: Error | unknown) => Record, ) { try { return JSON.stringify( diff --git a/src/quickSort/index.ts b/src/quickSort/index.ts index bb105c4..39e467b 100644 --- a/src/quickSort/index.ts +++ b/src/quickSort/index.ts @@ -5,30 +5,37 @@ import isArray from '../isArray'; * @param arrKey * @returns */ -function quickSort(arr: (object | string | number) [],key?:string): (object | string | number)[] { - if (isArray(arr)) { - let result : any[] = arr; - if (result.length <= 1) { - return result; - } - const pivotIndex = Math.floor(result.length / 2); - const pivot = result[pivotIndex]; - const left = []; - const right = []; - - for (let i = 0; i < result.length; i++) { - if (i === pivotIndex) { - continue; - } - - if ( (key ? result[i][key] : result[i] )<= (key ? pivot[key] : pivot)) { - left.push(result[i]); - } else { - right.push(result[i]); - } - } - let resultArr = [...quickSort(left,key), pivot, ...quickSort(right,key)] - return resultArr; - }else throw Error('数据格式错误') - } +function quickSort( + arr: (object | string | number)[], + key?: string, +): (object | string | number)[] { + if (isArray(arr)) { + const result: any[] = arr; + if (result.length <= 1) { + return result; + } + const pivotIndex = Math.floor(result.length / 2); + const pivot = result[pivotIndex]; + const left = []; + const right = []; + + for (let i = 0; i < result.length; i++) { + if (i === pivotIndex) { + continue; + } + + if ((key ? result[i][key] : result[i]) <= (key ? pivot[key] : pivot)) { + left.push(result[i]); + } else { + right.push(result[i]); + } + } + const resultArr = [ + ...quickSort(left, key), + pivot, + ...quickSort(right, key), + ]; + return resultArr; + } else throw Error('数据格式错误'); +} export default quickSort; diff --git a/src/randomStr/index.ts b/src/randomStr/index.ts index d843fed..b9fdaec 100644 --- a/src/randomStr/index.ts +++ b/src/randomStr/index.ts @@ -6,10 +6,10 @@ */ function randomStr( n: number, - str: string = 'abcdefghigklmnopqrstuvexyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_-+%$', + str = 'abcdefghigklmnopqrstuvexyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_-+%$', ) { let res = ''; - let len = str.length; + const len = str.length; for (let i = 0; i < n; i++) { res += str[Math.floor(Math.random() * len)]; } diff --git a/src/regex/index.ts b/src/regex/index.ts index eaa2105..e11ddfd 100644 --- a/src/regex/index.ts +++ b/src/regex/index.ts @@ -7,16 +7,29 @@ const regex = (regexp: IRegType, text: string): boolean => { if (regexpMap[regexp]) { return regexpMap[regexp](text); } else { - throw Error("请输入正确的正则类型"); + throw Error('请输入正确的正则类型'); } }; // 正则表达式类型 -type IRegType = "emailRegexp" | "phoneRegexp" | "fixPhone" | "idRegexp" | "ipv4Regexp" | "chineseRegexp" | "qqRegexp" - | "chinesePostcodeRegexp" | "usPostcodeRegexp" | "ukPostcodeRegexp" | "carNumberRegexp" | "accountRegexp" - | "rgbRegexp" | "rgbaRegexp" | "numberRegexp" | "hslRegexp" | "hslaRegexp" - - ; +type IRegType = + | 'emailRegexp' + | 'phoneRegexp' + | 'fixPhone' + | 'idRegexp' + | 'ipv4Regexp' + | 'chineseRegexp' + | 'qqRegexp' + | 'chinesePostcodeRegexp' + | 'usPostcodeRegexp' + | 'ukPostcodeRegexp' + | 'carNumberRegexp' + | 'accountRegexp' + | 'rgbRegexp' + | 'rgbaRegexp' + | 'numberRegexp' + | 'hslRegexp' + | 'hslaRegexp'; /** * 正则表达式支持的列表 @@ -28,7 +41,9 @@ const regexpMap = { }, // 手机号码 的正则表达式 phoneRegexp: (text: string): boolean => { - return /^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/.test(text); + return /^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/.test( + text, + ); }, // 国内电话号码 的正则表达式 fixPhone: (text: string): boolean => { @@ -40,7 +55,9 @@ const regexpMap = { }, // IPv4 的正则表达式 ipv4Regexp: (text: string): boolean => { - return /((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}/.test(text); + return /((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}/.test( + text, + ); }, // 是否包含中文 的正则表达式 chineseRegexp: (text: string): boolean => { @@ -78,11 +95,15 @@ const regexpMap = { }, // rgb 颜色 正则表达式 rgbRegexp: (text: string): boolean => { - return /^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/.test(text); + return /^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/.test( + text, + ); }, // rgba 颜色 正则表达式 rgbaRegexp: (text: string): boolean => { - return /^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*([01](\.\d+)?)\s*\)$/.test(text); + return /^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*([01](\.\d+)?)\s*\)$/.test( + text, + ); }, // 十六进制颜色代码 正则表达式 numberRegexp: (text: string): boolean => { @@ -90,14 +111,16 @@ const regexpMap = { }, // 匹配 hsl 值 正则表达式 hslRegexp: (text: string): boolean => { - return /^hsl\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*\)$/.test(text); + return /^hsl\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*\)$/.test( + text, + ); }, // 匹配 hsla 值 正则表达式 hslaRegexp: (text: string): boolean => { - return /^hsla\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*,\s*([01](\.\d+)?)\s*\)$/.test(text); - } - - + return /^hsla\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*,\s*([01](\.\d+)?)\s*\)$/.test( + text, + ); + }, }; export default regex; diff --git a/src/rgba2obj/index.ts b/src/rgba2obj/index.ts index 675897e..a8daadb 100644 --- a/src/rgba2obj/index.ts +++ b/src/rgba2obj/index.ts @@ -8,7 +8,7 @@ export interface RGBColor { } export default function rgba2obj(rgba = '') { - let reg = /rgba\((\d+),(\d+),(\d+),(\d?\.?\d+)\)/g; + const reg = /rgba\((\d+),(\d+),(\d+),(\d?\.?\d+)\)/g; let rgbaObj: RGBColor = { r: 0, g: 0, b: 0, a: 0 }; rgba.replace(reg, (_m, r, g, b, a) => { diff --git a/src/store/index.ts b/src/store/index.ts index b576bca..3eb2502 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -21,8 +21,9 @@ const store = { cb?: (status: number, key: string, value: string | number) => void, ) { let _status = this.status.SUCCESS, - _key = this.getKey(key), _time; + + const _key = this.getKey(key); // 设置失效时间,未设置时间默认为一个月 try { _time = time @@ -42,11 +43,12 @@ const store = { key: string, cb?: (status: number, value: string | number | null) => void, ) { + const _key = this.getKey(key), + timeSignLen = this.timeSign.length, + that = this; + let status = this.status.SUCCESS, - _key = this.getKey(key), value = null, - timeSignLen = this.timeSign.length, - that = this, index, time, result; @@ -84,8 +86,9 @@ const store = { key: string, cb?: (status: number, value: string | number | null) => void, ) { + const _key = this.getKey(key); + let status = this.status.FAILURE, - _key = this.getKey(key), value; try { value = this.storage.getItem(_key); diff --git a/src/throttle/index.ts b/src/throttle/index.ts index b31df04..a7af3e0 100644 --- a/src/throttle/index.ts +++ b/src/throttle/index.ts @@ -4,7 +4,7 @@ * @param delay * @returns */ -function throttle(fn: Function, delay: number) { +function throttle(fn: () => void, delay: number) { let flag = true; return (...args: any) => { if (flag) { diff --git a/src/timeSub/index.ts b/src/timeSub/index.ts index 5d2c746..4672847 100644 --- a/src/timeSub/index.ts +++ b/src/timeSub/index.ts @@ -4,11 +4,11 @@ * @param end:结束时间 */ const timeSub = (start: string | Date, end: string | Date): number => { - let startDate = new Date(start) - let endDate = new Date(end) - let date = endDate.getTime() - startDate.getTime() - let misSecond = Math.floor(date); - return misSecond -} + const startDate = new Date(start); + const endDate = new Date(end); + const date = endDate.getTime() - startDate.getTime(); + const misSecond = Math.floor(date); + return misSecond; +}; export default timeSub; diff --git a/src/transformArray/index.ts b/src/transformArray/index.ts index bcf910b..5bfbfe1 100644 --- a/src/transformArray/index.ts +++ b/src/transformArray/index.ts @@ -4,7 +4,7 @@ * @returns 扁平数组 */ -function transformArray(tree: any[] = [], childField: string = 'children') { +function transformArray(tree: any[] = [], childField = 'children') { // 层序遍历 const treeNodes: any[] = []; const res: any[] = []; diff --git a/src/url2obj/index.ts b/src/url2obj/index.ts index a2c3e71..a68d5ed 100644 --- a/src/url2obj/index.ts +++ b/src/url2obj/index.ts @@ -1,6 +1,6 @@ import { parse } from 'qs'; -function url2obj(params: string = '?a=1&b=2&c=3') { +function url2obj(params = '?a=1&b=2&c=3') { if (params.indexOf('?') > -1) { params = params.slice(1); } diff --git a/src/xss/index.ts b/src/xss/index.ts index 0afdaf4..e6acdf3 100644 --- a/src/xss/index.ts +++ b/src/xss/index.ts @@ -1,14 +1,15 @@ // xss 注入,对标签进行转义 -const xss = (str: string):string => { +const xss = (str: string): string => { return str.replace( /[&<>'"]/g, - tag => ({ + (tag) => + ({ '&': '&', '<': '<', '>': '>', "'": ''', - '"': '"' - }[tag] || tag) + '"': '"', + }[tag] || tag), ); -} +}; export default xss; diff --git a/test/arraySort.test.js b/test/arraySort.test.js index 7488e15..2d04a62 100644 --- a/test/arraySort.test.js +++ b/test/arraySort.test.js @@ -8,28 +8,28 @@ describe('排序相关测试', () => { { name: '5', age: 15 }, { name: '2', age: 12 }, ]; - let arrAsc = [1, 2, 3, 4] - let arrDesc = [4, 3, 2, 1] + let arrAsc = [1, 2, 3, 4]; + let arrDesc = [4, 3, 2, 1]; let objArrAsc = [ { name: '2', age: 12 }, { name: '3', age: 13 }, { name: '5', age: 15 }, - { name: '8', age: 18 } + { name: '8', age: 18 }, ]; let objArrDesc = [ { name: '8', age: 18 }, { name: '5', age: 15 }, { name: '3', age: 13 }, - { name: '2', age: 12 } + { name: '2', age: 12 }, ]; test('冒泡排序', () => { expect(bubbleSort(arr)).toStrictEqual(arrAsc); - expect(bubbleSort(arr,'','desc')).toStrictEqual(arrDesc); + expect(bubbleSort(arr, '', 'desc')).toStrictEqual(arrDesc); expect(bubbleSort(objArr, 'age')).toStrictEqual(objArrAsc); expect(bubbleSort(objArr, 'age', 'desc')).toStrictEqual(objArrDesc); }); test('快速排序', () => { expect(quickSort(arr)).toStrictEqual(arrAsc); - expect(quickSort(objArr,'age')).toStrictEqual(objArrAsc); + expect(quickSort(objArr, 'age')).toStrictEqual(objArrAsc); }); }); diff --git a/test/browser.test.js b/test/browser.test.js index 38473f3..d3e1e26 100644 --- a/test/browser.test.js +++ b/test/browser.test.js @@ -7,17 +7,17 @@ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ import { store, sleep } from '../src/index'; -import {$,getDomText} from '../src/index' +import { $, getDomText } from '../src/index'; function renderHtml() { - const div = document.createElement("div"); - div.setAttribute('id','domId') - div.innerHTML = "this id domId

Hello World

this id div one
this id div two
"; + const div = document.createElement('div'); + div.setAttribute('id', 'domId'); + div.innerHTML = + "this id domId

Hello World

this id div one
this id div two
"; document.body.appendChild(div); } - describe('浏览器相关测试', () => { test('支持设置过期时间的 localstorage', async () => { store.set('name', 'jack', Date.now() + 1000); @@ -27,21 +27,19 @@ describe('浏览器相关测试', () => { expect(store.get('name')).toEqual({ status: 3, value: null }); }); renderHtml(); - test("获取dom,通过id,class等:", () => { - - expect($("#oneId").getAttribute('id')).toBe('oneId'); - expect($(".oneClass").getAttribute('id')).toBe('oneId'); - - expect($(".twoClass").length).toBe(2); - expect($("div").length).toBe(3); - }); + test('获取dom,通过id,class等:', () => { + expect($('#oneId').getAttribute('id')).toBe('oneId'); + expect($('.oneClass').getAttribute('id')).toBe('oneId'); - test("获取元素的文本内容:", () => { - expect(getDomText("#oneId")).toBe('this id div one'); - expect(getDomText(".twoClass")).toBe('this id div onethis id div two'); - expect(getDomText("#domId")).toBe('this id domIdHello Worldthis id div onethis id div two'); - + expect($('.twoClass').length).toBe(2); + expect($('div').length).toBe(3); }); - + test('获取元素的文本内容:', () => { + expect(getDomText('#oneId')).toBe('this id div one'); + expect(getDomText('.twoClass')).toBe('this id div onethis id div two'); + expect(getDomText('#domId')).toBe( + 'this id domIdHello Worldthis id div onethis id div two', + ); + }); }); diff --git a/test/dom.test.js b/test/dom.test.js index 7bd66ef..a222c60 100644 --- a/test/dom.test.js +++ b/test/dom.test.js @@ -2,9 +2,9 @@ import { xss } from '../src/index'; describe('Dom 操作相关测试', () => { test('xss - 转义html标签', () => { - let html = 'Me & you' - expect(xss(html)).toBe('<a href="#">Me & you</a>') + let html = 'Me & you'; + expect(xss(html)).toBe( + '<a href="#">Me & you</a>', + ); }); - - }); diff --git a/test/format.test.js b/test/format.test.js index db89b1d..b9df222 100644 --- a/test/format.test.js +++ b/test/format.test.js @@ -256,15 +256,12 @@ describe('数据结构相关测试', () => { test('计算时间差', () => { // 计算与当前时间的时间差 - const now = +new Date(); - const oneSecondAgo = now - 1000; - const oneSecondLater = now + 1000; // 格式化的时间字符串 - expect(timeCutStr(formatDate(now))).toEqual('刚刚'); + expect(timeCutStr(formatDate(Date.now()))).toEqual('刚刚'); // 时间戳字符串 - expect(timeCutStr(String(oneSecondAgo))).toEqual('1秒前'); + expect(timeCutStr(String(Date.now() - 1000))).toEqual('1秒前'); // 时间戳 - expect(timeCutStr(oneSecondLater)).toEqual('1秒后'); + expect(timeCutStr(Date.now() + 1000)).toEqual('1秒后'); }); }); diff --git a/test/imageTool.test.js b/test/imageTool.test.js index 783a789..ec84114 100644 --- a/test/imageTool.test.js +++ b/test/imageTool.test.js @@ -1,10 +1,13 @@ -import { hex2rgba, rgba2obj,genRandomColor } from '../src/index'; +import { hex2rgba, rgba2obj, genRandomColor } from '../src/index'; -const reg16 = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/ -const regRgb = /rgb\((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]),(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]),(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\)/; -const regRgba = /rgba\((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]),(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]),(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]),(0.\d+|0|1)|(1.0)\)/; -const regHsl = /hsl\(\s*(\d+)\s*,\s*(\d+(?:\.\d+)?%)\s*,\s*(\d+(?:\.\d+)?%)\)/; -const regHsla = /hsla\(\s*(\d+)\s*,\s*(\d+(?:\.\d+)?%)\s*,\s*(\d+(?:\.\d+)?%),(0.\d+|0|1)|(1.0)\)/; +const reg16 = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/; +const regRgb = + /rgb\((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]),(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]),(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\)/; +const regRgba = + /rgba\((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]),(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]),(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]),(0.\d+|0|1)|(1.0)\)/; +const regHsl = /hsl\(\s*(\d+)\s*,\s*(\d+(?:\.\d+)?%)\s*,\s*(\d+(?:\.\d+)?%)\)/; +const regHsla = + /hsla\(\s*(\d+)\s*,\s*(\d+(?:\.\d+)?%)\s*,\s*(\d+(?:\.\d+)?%),(0.\d+|0|1)|(1.0)\)/; describe('图片处理函数相关测试', () => { test('hex 色值转 rgba', async () => { const transformRgba = hex2rgba('#fff'), @@ -30,9 +33,9 @@ describe('图片处理函数相关测试', () => { test('随机生成颜色', async () => { expect(genRandomColor(16)).toMatch(reg16); expect(genRandomColor('16')).toMatch(reg16); - expect(genRandomColor("rgb")).toMatch(regRgb); - expect(genRandomColor("rgba")).toMatch(regRgba); - expect(genRandomColor("hsl")).toMatch(regHsl); - expect(genRandomColor("hsla")).toMatch(regHsla); + expect(genRandomColor('rgb')).toMatch(regRgb); + expect(genRandomColor('rgba')).toMatch(regRgba); + expect(genRandomColor('hsl')).toMatch(regHsl); + expect(genRandomColor('hsla')).toMatch(regHsla); }); }); diff --git a/test/judge.test.js b/test/judge.test.js index dc32d31..7fe21ca 100644 --- a/test/judge.test.js +++ b/test/judge.test.js @@ -1,4 +1,12 @@ -import { isArray, isEmpty, isPhone, isEmail, isIdCard, lang, regex} from '../src/index'; +import { + isArray, + isEmpty, + isPhone, + isEmail, + isIdCard, + lang, + regex, +} from '../src/index'; describe('常用判断函数相关测试', () => { test('判断数组类型', () => { diff --git a/test/linkListToArray.test.js b/test/linkListToArray.test.js index 8f2b16c..6011164 100644 --- a/test/linkListToArray.test.js +++ b/test/linkListToArray.test.js @@ -1,12 +1,12 @@ import { linkListToArray } from '../src/index'; describe('链表相关测试', () => { - test('链表结构转换为数组结构', () => { - const linkList = { - value: 100, - next: { value: 200, next: { value: 300, next: { value: 400 } } }, - }; - const arr = [100,200,300,400] - expect(linkListToArray(linkList)).toEqual(arr); - }); + test('链表结构转换为数组结构', () => { + const linkList = { + value: 100, + next: { value: 200, next: { value: 300, next: { value: 400 } } }, + }; + const arr = [100, 200, 300, 400]; + expect(linkListToArray(linkList)).toEqual(arr); + }); }); diff --git a/typings.d.ts b/typings.d.ts index 71e0e9f..1d99157 100644 --- a/typings.d.ts +++ b/typings.d.ts @@ -1,2 +1,5 @@ declare module '*.css'; declare module '*.less'; +declare interface Window { + [key: string]: any; +}