@qy_better_lib/core 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- (function(r,f){typeof exports=="object"&&typeof module<"u"?f(exports):typeof define=="function"&&define.amd?define(["exports"],f):(r=typeof globalThis<"u"?globalThis:r||self,f(r["@qy_better_lib/core"]={}))})(this,function(r){"use strict";function f(){return Math.floor(Math.random()*1e4)}function E(e){return Math.floor(Math.random()*Math.floor(e))}function v(){const e=p;return`${e()}${e()}-${e()}-${e()}-${e()}-${e()}${e()}${e()}`}function p(){return Math.floor((1+Math.random())*65536).toString(16).substring(1)}function $(e){return e===void 0}function y(e){return Object.prototype.toString.call(e)==="[object Array]"}function g(e){return typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"}function M(e){return Object.prototype.toString.call(e)==="[object Date]"}function N(e){return!e&&e!==0||y(e)&&e.length===0||g(e)&&!Object.keys(e).length}function h(e){return typeof Element>"u"?!1:e instanceof Element}const O=typeof window<"u",A=e=>typeof e=="number";function w(e,t="key",n="children"){const o={},i=(a,s)=>{for(let l=0;l<a.length;l++){const u=a[l],d=u[t];if(!o[d]){o[d]=u,s&&(o[d].parent=o[s]);const m=u[n];m&&m.length>0&&i(m,u[t])}}};return i(e),o}function F(e){return e?Object.prototype.toString.call(1)!=="[object Number]"?`${e}`:`${e}`.replace(/(\d{1,3})(?=(\d{3})+(?:$|\.))/g,"$1,"):"0"}function _(){const e=localStorage.getItem("token");if(!e)return;const t=JSON.parse(e);if(t!==null)if(t.expirse!=null&&t.expirse<new Date().getTime())localStorage.removeItem("token");else return t.value;return null}function B(e,t){!t&&(t=7*24*60*60*1e3)||(t=t*1e3);const n={value:e,expirse:new Date().getTime()+t};localStorage.setItem("token",JSON.stringify(n))}function H(){localStorage.removeItem("token")}function R(e,t,n="local"){const o=n=="local"?localStorage:sessionStorage;t!=null&&o.setItem(e,JSON.stringify(t))}function b(e,t="local"){let o=(t=="local"?localStorage:sessionStorage).getItem(e);return o&&JSON.parse(o||"")}function J(e,t="local"){(t=="local"?localStorage:sessionStorage).removeItem(e)}function L(e="local"){(e=="local"?localStorage:sessionStorage).clear()}function T(e){const t=Object.prototype.toString;if(!e||typeof e!="object")return e;if(e.nodeType&&"cloneNode"in e)return e.cloneNode(!0);if(t.call(e)==="[object Date]")return new Date(e.getTime());if(t.call(e)==="[object RegExp]"){const o=[];return e.global&&o.push("g"),e.multiline&&o.push("m"),e.ignoreCase&&o.push("i"),new RegExp(e.source,o.join(""))}if(t.call(e)==="[object FormData]"){const o=new FormData;for(const[i,a]of e.entries())o.append(i,a);return o}const n=Array.isArray(e)?[]:e.constructor?new e.constructor:{};for(const o in e)n[o]=T(e[o]);return n}function k(...e){let t=e.length,n=e[0];g(n)||(n={});for(let o=1;o<t;o++){let i=e[o];if(g(i))for(let a in i)a==="__proto__"||n===i[a]||(g(i[a])?n[a]=k(n[a],i[a]):n[a]=i[a])}return n}function D(e,t){return!e||e.tagName==="BODY"?null:e.classList.contains(t)?e:D(e.parentNode,t)}const c=new Map;let I;O&&(document.addEventListener("mousedown",e=>I=e),document.addEventListener("mouseup",e=>{for(const t of c.values())for(const{documentHandler:n}of t)n(e,I)}));function C(e,t){let n=[];return Array.isArray(t.arg)?n=t.arg:h(t.arg)&&n.push(t.arg),function(o,i){const a=t.instance.popperRef,s=o.target,l=i==null?void 0:i.target,u=!t||!t.instance,d=!s||!l,m=e.contains(s)||e.contains(l),U=e===s,j=n.length&&n.some(S=>S==null?void 0:S.contains(s))||n.length&&n.includes(l),q=a&&(a.contains(s)||a.contains(l));u||d||m||U||j||q||t.value(o,i)}}const P={beforeMount(e,t){var n;c.has(e)||c.set(e,[]),(n=c.get(e))==null||n.push({documentHandler:C(e,t),bindingFn:t.value})},updated(e,t){c.has(e)||c.set(e,[]);const n=c.get(e),o=n==null?void 0:n.findIndex(a=>a.bindingFn===t.oldValue),i={documentHandler:C(e,t),bindingFn:t.value};o&&o>=0?n==null||n.splice(o,1,i):n==null||n.push(i)},unmounted(e){c.delete(e)}};r.ClickOutside=P,r.clearStorage=L,r.deepAssign=k,r.deepClone=T,r.generateId=f,r.generateString=p,r.getParentByClass=D,r.getRandomInt=E,r.getStorage=b,r.getToken=_,r.guiID=v,r.isArray=y,r.isClient=O,r.isDate=M,r.isElement=h,r.isEmpty=N,r.isNumber=A,r.isObject=g,r.isUndefined=$,r.removeStorage=J,r.removeToken=H,r.setStorage=R,r.setToken=B,r.thousandSeparator=F,r.treeFlat=w,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})});
1
+ (function(r,f){typeof exports=="object"&&typeof module<"u"?f(exports):typeof define=="function"&&define.amd?define(["exports"],f):(r=typeof globalThis<"u"?globalThis:r||self,f(r["@qy_better_lib/core"]={}))})(this,function(r){"use strict";function f(){return Math.floor(Math.random()*1e4)}function C(e){return Math.floor(Math.random()*Math.floor(e))}function E(){const e=p;return`${e()}${e()}-${e()}-${e()}-${e()}-${e()}${e()}${e()}`}function p(){return Math.floor((1+Math.random())*65536).toString(16).substring(1)}function M(e){return e===void 0}function N(e){return Object.prototype.toString.call(e)==="[object Array]"}function g(e){return typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"}function v(e){return Object.prototype.toString.call(e)==="[object Date]"}function F(e){return!e&&e!==0||N(e)&&e.length===0||g(e)&&!Object.keys(e).length}function h(e){return typeof Element>"u"?!1:e instanceof Element}const b=typeof window<"u",S=e=>typeof e=="number",I=e=>typeof e=="string",A=e=>I(e)?!Number.isNaN(Number(e)):!1;function w(e){return/^1[3-9]\d{9}$/.test(e)}function _(e){return/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(e)}function B(e){return/^(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}|0)$/.test(e)}function H(e,t="key",n="children"){const o={},i=(c,s)=>{for(let u=0;u<c.length;u++){const l=c[u],d=l[t];if(!o[d]){o[d]=l,s&&(o[d].parent=o[s]);const m=l[n];m&&m.length>0&&i(m,l[t])}}};return i(e),o}function P(e){return e?Object.prototype.toString.call(1)!=="[object Number]"?`${e}`:`${e}`.replace(/(\d{1,3})(?=(\d{3})+(?:$|\.))/g,"$1,"):"0"}function R(e,t){return S(e)?Number(t?Number(e).toFixed(t):e):Number.NaN}function J(e,t){return S(e)?Number(e.toFixed(t)):Number.NaN}function L(){const e=localStorage.getItem("token");if(!e)return;const t=JSON.parse(e);if(t!==null)if(t.expirse!=null&&t.expirse<new Date().getTime())localStorage.removeItem("token");else return t.value;return null}function U(e,t){!t&&(t=7*24*60*60*1e3)||(t=t*1e3);const n={value:e,expirse:new Date().getTime()+t};localStorage.setItem("token",JSON.stringify(n))}function j(){localStorage.removeItem("token")}function q(e,t,n="local"){const o=n=="local"?localStorage:sessionStorage;t!=null&&o.setItem(e,JSON.stringify(t))}function V(e,t="local"){let o=(t=="local"?localStorage:sessionStorage).getItem(e);return o&&JSON.parse(o||"")}function Y(e,t="local"){(t=="local"?localStorage:sessionStorage).removeItem(e)}function z(e="local"){(e=="local"?localStorage:sessionStorage).clear()}function O(e){const t=Object.prototype.toString;if(!e||typeof e!="object")return e;if(e.nodeType&&"cloneNode"in e)return e.cloneNode(!0);if(t.call(e)==="[object Date]")return new Date(e.getTime());if(t.call(e)==="[object RegExp]"){const o=[];return e.global&&o.push("g"),e.multiline&&o.push("m"),e.ignoreCase&&o.push("i"),new RegExp(e.source,o.join(""))}if(t.call(e)==="[object FormData]"){const o=new FormData;for(const[i,c]of e.entries())o.append(i,c);return o}const n=Array.isArray(e)?[]:e.constructor?new e.constructor:{};for(const o in e)n[o]=O(e[o]);return n}function T(...e){let t=e.length,n=e[0];g(n)||(n={});for(let o=1;o<t;o++){let i=e[o];if(g(i))for(let c in i)c==="__proto__"||n===i[c]||(g(i[c])?n[c]=T(n[c],i[c]):n[c]=i[c])}return n}function k(e,t){return!e||e.tagName==="BODY"?null:e.classList.contains(t)?e:k(e.parentNode,t)}const a=new Map;let D;b&&(document.addEventListener("mousedown",e=>D=e),document.addEventListener("mouseup",e=>{for(const t of a.values())for(const{documentHandler:n}of t)n(e,D)}));function $(e,t){let n=[];return Array.isArray(t.arg)?n=t.arg:h(t.arg)&&n.push(t.arg),function(o,i){const c=t.instance.popperRef,s=o.target,u=i==null?void 0:i.target,l=!t||!t.instance,d=!s||!u,m=e.contains(s)||e.contains(u),K=e===s,Q=n.length&&n.some(y=>y==null?void 0:y.contains(s))||n.length&&n.includes(u),W=c&&(c.contains(s)||c.contains(u));l||d||m||K||Q||W||t.value(o,i)}}const G={beforeMount(e,t){var n;a.has(e)||a.set(e,[]),(n=a.get(e))==null||n.push({documentHandler:$(e,t),bindingFn:t.value})},updated(e,t){a.has(e)||a.set(e,[]);const n=a.get(e),o=n==null?void 0:n.findIndex(c=>c.bindingFn===t.oldValue),i={documentHandler:$(e,t),bindingFn:t.value};o&&o>=0?n==null||n.splice(o,1,i):n==null||n.push(i)},unmounted(e){a.delete(e)}};r.ClickOutside=G,r.clearStorage=z,r.deepAssign=T,r.deepClone=O,r.generateId=f,r.generateString=p,r.getParentByClass=k,r.getRandomInt=C,r.getStorage=V,r.getToken=L,r.guiID=E,r.isArray=N,r.isClient=b,r.isDate=v,r.isElement=h,r.isEmpty=F,r.isIp=_,r.isMobile=w,r.isNumber=S,r.isObject=g,r.isPort=B,r.isString=I,r.isStringNumber=A,r.isUndefined=M,r.removeStorage=Y,r.removeToken=j,r.setStorage=q,r.setToken=U,r.thousandSeparator=P,r.toFixed=J,r.toNumber=R,r.treeFlat=H,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})});
package/lib/index.js CHANGED
@@ -1,35 +1,42 @@
1
- import { generateId as r, generateString as o, getRandomInt as a, guiID as s } from "./utils/random.js";
2
- import { isArray as i, isClient as m, isDate as g, isElement as p, isEmpty as f, isNumber as d, isObject as l, isUndefined as x } from "./utils/is.js";
3
- import { treeFlat as u } from "./utils/tree.js";
4
- import { thousandSeparator as C } from "./utils/number.js";
5
- import { clearStorage as y, getStorage as I, getToken as T, removeStorage as b, removeToken as v, setStorage as A, setToken as D } from "./utils/storage.js";
6
- import { deepAssign as O, deepClone as h } from "./utils/object.js";
7
- import { getParentByClass as B } from "./utils/dom.js";
8
- import { default as N } from "./directives/click-outside.js";
1
+ import { generateId as r, generateString as o, getRandomInt as i, guiID as s } from "./utils/random.js";
2
+ import { isArray as n, isClient as m, isDate as g, isElement as p, isEmpty as d, isIp as f, isMobile as l, isNumber as x, isObject as S, isPort as u, isString as b, isStringNumber as k, isUndefined as C } from "./utils/is.js";
3
+ import { treeFlat as c } from "./utils/tree.js";
4
+ import { thousandSeparator as N, toFixed as T, toNumber as v } from "./utils/number.js";
5
+ import { clearStorage as D, getStorage as E, getToken as F, removeStorage as O, removeToken as P, setStorage as h, setToken as j } from "./utils/storage.js";
6
+ import { deepAssign as M, deepClone as R } from "./utils/object.js";
7
+ import { getParentByClass as q } from "./utils/dom.js";
8
+ import { default as z } from "./directives/click-outside.js";
9
9
  export {
10
- N as ClickOutside,
11
- y as clearStorage,
12
- O as deepAssign,
13
- h as deepClone,
10
+ z as ClickOutside,
11
+ D as clearStorage,
12
+ M as deepAssign,
13
+ R as deepClone,
14
14
  r as generateId,
15
15
  o as generateString,
16
- B as getParentByClass,
17
- a as getRandomInt,
18
- I as getStorage,
19
- T as getToken,
16
+ q as getParentByClass,
17
+ i as getRandomInt,
18
+ E as getStorage,
19
+ F as getToken,
20
20
  s as guiID,
21
- i as isArray,
21
+ n as isArray,
22
22
  m as isClient,
23
23
  g as isDate,
24
24
  p as isElement,
25
- f as isEmpty,
26
- d as isNumber,
27
- l as isObject,
28
- x as isUndefined,
29
- b as removeStorage,
30
- v as removeToken,
31
- A as setStorage,
32
- D as setToken,
33
- C as thousandSeparator,
34
- u as treeFlat
25
+ d as isEmpty,
26
+ f as isIp,
27
+ l as isMobile,
28
+ x as isNumber,
29
+ S as isObject,
30
+ u as isPort,
31
+ b as isString,
32
+ k as isStringNumber,
33
+ C as isUndefined,
34
+ O as removeStorage,
35
+ P as removeToken,
36
+ h as setStorage,
37
+ j as setToken,
38
+ N as thousandSeparator,
39
+ T as toFixed,
40
+ v as toNumber,
41
+ c as treeFlat
35
42
  };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * 下载文件
3
+ * @param filePath 文件路径
4
+ */
5
+ export declare function downLoadFile({ path, name }: {
6
+ path: string;
7
+ name?: string;
8
+ }): void;
9
+ /**批量下载文件 */
10
+ export declare function downLoadFiles(fileList: any[]): void;
11
+ /**
12
+ * 将file转换成base64
13
+ * @param file
14
+ * @param callback
15
+ * @returns
16
+ */
17
+ export declare function toBase64(file: Blob): Promise<string | undefined>;
package/lib/utils/is.d.ts CHANGED
@@ -40,3 +40,13 @@ export declare function isElement(e: unknown): e is Element;
40
40
  export declare const isClient: boolean;
41
41
  /**是否未数值 */
42
42
  export declare const isNumber: (val: any) => boolean;
43
+ /**是否为字符串 */
44
+ export declare const isString: (val: any) => boolean;
45
+ /**是否为字符串数值 */
46
+ export declare const isStringNumber: (val: string) => boolean;
47
+ /**是否为手机号(国内手机号) */
48
+ export declare function isMobile(str: string): boolean;
49
+ /**是否为有效IP地址 */
50
+ export declare function isIp(val: string): boolean;
51
+ /**是否为有效端口 */
52
+ export declare function isPort(val: string): boolean;
package/lib/utils/is.js CHANGED
@@ -7,23 +7,37 @@ function e(t) {
7
7
  function n(t) {
8
8
  return typeof t == "object" && Object.prototype.toString.call(t) === "[object Object]";
9
9
  }
10
- function r(t) {
10
+ function c(t) {
11
11
  return Object.prototype.toString.call(t) === "[object Date]";
12
12
  }
13
- function i(t) {
13
+ function u(t) {
14
14
  return !t && t !== 0 || e(t) && t.length === 0 || n(t) && !Object.keys(t).length;
15
15
  }
16
- function c(t) {
16
+ function s(t) {
17
17
  return typeof Element > "u" ? !1 : t instanceof Element;
18
18
  }
19
- const u = typeof window < "u", f = (t) => typeof t == "number";
19
+ const f = typeof window < "u", b = (t) => typeof t == "number", r = (t) => typeof t == "string", d = (t) => r(t) ? !Number.isNaN(Number(t)) : !1;
20
+ function p(t) {
21
+ return /^1[3-9]\d{9}$/.test(t);
22
+ }
23
+ function y(t) {
24
+ return /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(t);
25
+ }
26
+ function g(t) {
27
+ return /^(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}|0)$/.test(t);
28
+ }
20
29
  export {
21
30
  e as isArray,
22
- u as isClient,
23
- r as isDate,
24
- c as isElement,
25
- i as isEmpty,
26
- f as isNumber,
31
+ f as isClient,
32
+ c as isDate,
33
+ s as isElement,
34
+ u as isEmpty,
35
+ y as isIp,
36
+ p as isMobile,
37
+ b as isNumber,
27
38
  n as isObject,
39
+ g as isPort,
40
+ r as isString,
41
+ d as isStringNumber,
28
42
  o as isUndefined
29
43
  };
@@ -4,3 +4,15 @@
4
4
  * @returns
5
5
  */
6
6
  export declare function thousandSeparator(num: number | any): string;
7
+ /**
8
+ * 转换成数值
9
+ * @param num 源
10
+ * @param fixed 保留小数点,默认不设置
11
+ */
12
+ export declare function toNumber(num: string | undefined, fixed?: number): number | undefined;
13
+ /**
14
+ * 保留小数点
15
+ * @param num 数字
16
+ * @param fixed 小数点
17
+ */
18
+ export declare function toFixed(num: number, fixed: number): number;
@@ -1,6 +1,15 @@
1
- function t(r) {
1
+ import { isNumber as t } from "./is.js";
2
+ function u(r) {
2
3
  return r ? Object.prototype.toString.call(1) !== "[object Number]" ? `${r}` : `${r}`.replace(/(\d{1,3})(?=(\d{3})+(?:$|\.))/g, "$1,") : "0";
3
4
  }
5
+ function i(r, e) {
6
+ return t(r) ? Number(e ? Number(r).toFixed(e) : r) : Number.NaN;
7
+ }
8
+ function N(r, e) {
9
+ return t(r) ? Number(r.toFixed(e)) : Number.NaN;
10
+ }
4
11
  export {
5
- t as thousandSeparator
12
+ u as thousandSeparator,
13
+ N as toFixed,
14
+ i as toNumber
6
15
  };
package/package.json CHANGED
@@ -1,54 +1,50 @@
1
- {
2
- "name": "@qy_better_lib/core",
3
- "private": false,
4
- "version": "0.0.2",
5
- "description": "qy better lib core",
6
- "author": "luhuiming",
7
- "license": "ISC",
8
- "scripts": {
9
- "build:lib": "vite build --config vite.lib.config.ts",
10
- "build:dist-min": "vite build --config vite.dist.min.config.ts",
11
- "build": "yarn build:lib && yarn build:dist-min"
12
- },
13
- "main": "lib/index.js",
14
- "module": "lib/index.js",
15
- "types": "lib/index.d.ts",
16
- "typesVersions": {
17
- "*": {
18
- "lib/index.js": [
19
- "lib/index.d.ts"
20
- ],
21
- "@qy-better-lib/core": [
22
- "lib/index.d.ts"
23
- ],
24
- "*": [
25
- "*",
26
- "dist/*",
27
- "lib/*",
28
- "lib/*.d.ts",
29
- "lib/*/index.d.ts"
30
- ]
31
- }
32
- },
33
- "exports": {
34
- ".": {
35
- "import": "./lib/index.js"
36
- },
37
- "./directives": "./lib/directives/index.js",
38
- "./directives/*": "./lib/directives/*/*.js",
39
- "./utils": "./lib/utils/index.js",
40
- "./utils/*": "./lib/utils/*.js"
41
- },
42
- "publishConfig": {
43
- "access": "public",
44
- "registry": "https://registry.npmjs.org/"
45
- },
46
- "devDependencies": {
47
- "@types/node": "^20.14.9",
48
- "@vitejs/plugin-vue": "^5.0.5",
49
- "element-plus": "^2.7.6",
50
- "vite": "^5.3.2",
51
- "vite-plugin-dts": "^3.9.1",
52
- "vue": "^3.4.31"
53
- }
54
- }
1
+ {
2
+ "name": "@qy_better_lib/core",
3
+ "private": false,
4
+ "version": "0.0.4",
5
+ "description": "qy better lib core",
6
+ "author": "luhuiming",
7
+ "license": "ISC",
8
+ "scripts": {
9
+ "build:lib": "vite build --config vite.lib.config.ts",
10
+ "build:dist-min": "vite build --config vite.dist.min.config.ts",
11
+ "build": "yarn build:lib && yarn build:dist-min"
12
+ },
13
+ "main": "lib/index.js",
14
+ "module": "lib/index.js",
15
+ "types": "lib/index.d.ts",
16
+ "typesVersions": {
17
+ "*": {
18
+ "lib/index.js": [
19
+ "lib/index.d.ts"
20
+ ],
21
+ "@qy-better-lib/core": [
22
+ "lib/index.d.ts"
23
+ ],
24
+ "*": [
25
+ "*",
26
+ "dist/*",
27
+ "lib/*",
28
+ "lib/*.d.ts",
29
+ "lib/*/index.d.ts"
30
+ ]
31
+ }
32
+ },
33
+ "exports": {
34
+ ".": {
35
+ "import": "./lib/index.js"
36
+ },
37
+ "./directives": "./lib/directives/index.js",
38
+ "./directives/*": "./lib/directives/*/*.js",
39
+ "./utils": "./lib/utils/index.js",
40
+ "./utils/*": "./lib/utils/*.js"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^20.14.9",
44
+ "@vitejs/plugin-vue": "^5.0.5",
45
+ "element-plus": "^2.7.6",
46
+ "vite": "^5.3.2",
47
+ "vite-plugin-dts": "^3.9.1",
48
+ "vue": "^3.4.31"
49
+ }
50
+ }
@@ -1,115 +0,0 @@
1
- import { isElement, isClient } from "./../utils";
2
- import type {
3
- ComponentPublicInstance,
4
- DirectiveBinding,
5
- ObjectDirective,
6
- } from "vue";
7
-
8
- type DocumentHandler = <T extends MouseEvent>(mouseup: T, mousedown: T) => void;
9
-
10
- type FlushList = Map<
11
- HTMLElement,
12
- {
13
- documentHandler: DocumentHandler;
14
- bindingFn: (...args: unknown[]) => unknown;
15
- }[]
16
- >;
17
-
18
- const nodeList: FlushList = new Map();
19
-
20
- let startClick: MouseEvent;
21
-
22
- if (isClient) {
23
- document.addEventListener("mousedown", (e: MouseEvent) => (startClick = e));
24
- document.addEventListener("mouseup", (e: MouseEvent) => {
25
- for (const handlers of nodeList.values()) {
26
- for (const { documentHandler } of handlers) {
27
- documentHandler(e as MouseEvent, startClick);
28
- }
29
- }
30
- });
31
- }
32
-
33
- function createDocumentHandler(
34
- el: HTMLElement,
35
- binding: DirectiveBinding
36
- ): DocumentHandler {
37
- let excludes: HTMLElement[] = [];
38
- if (Array.isArray(binding.arg)) {
39
- excludes = binding.arg;
40
- } else if (isElement(binding.arg)) {
41
- excludes.push(binding.arg as unknown as HTMLElement);
42
- }
43
- return function (mouseup, mousedown) {
44
- const popperRef = (
45
- binding.instance as ComponentPublicInstance<{
46
- popperRef: HTMLElement | null;
47
- }>
48
- ).popperRef;
49
- const mouseUpTarget = mouseup.target as Node;
50
- const mouseDownTarget = mousedown?.target as Node;
51
- const isBound = !binding || !binding.instance;
52
- const isTargetExists = !mouseUpTarget || !mouseDownTarget;
53
- const isContainedByEl =
54
- el.contains(mouseUpTarget) || el.contains(mouseDownTarget);
55
- const isSelf = el === mouseUpTarget;
56
-
57
- const isTargetExcluded =
58
- (excludes.length &&
59
- excludes.some((item) => item?.contains(mouseUpTarget))) ||
60
- (excludes.length && excludes.includes(mouseDownTarget as HTMLElement));
61
- const isContainedByPopper =
62
- popperRef &&
63
- (popperRef.contains(mouseUpTarget) ||
64
- popperRef.contains(mouseDownTarget));
65
- if (
66
- isBound ||
67
- isTargetExists ||
68
- isContainedByEl ||
69
- isSelf ||
70
- isTargetExcluded ||
71
- isContainedByPopper
72
- ) {
73
- return;
74
- }
75
- binding.value(mouseup, mousedown);
76
- };
77
- }
78
-
79
- const ClickOutside: ObjectDirective = {
80
- beforeMount(el: HTMLElement, binding: DirectiveBinding) {
81
- if (!nodeList.has(el)) {
82
- nodeList.set(el, []);
83
- }
84
-
85
- nodeList.get(el)?.push({
86
- documentHandler: createDocumentHandler(el, binding),
87
- bindingFn: binding.value,
88
- });
89
- },
90
- updated(el: HTMLElement, binding: DirectiveBinding) {
91
- if (!nodeList.has(el)) {
92
- nodeList.set(el, []);
93
- }
94
-
95
- const handlers = nodeList.get(el);
96
- const oldHandlerIndex = handlers?.findIndex(
97
- (item) => item.bindingFn === binding.oldValue
98
- );
99
- const newHandler = {
100
- documentHandler: createDocumentHandler(el, binding),
101
- bindingFn: binding.value,
102
- };
103
-
104
- if (oldHandlerIndex && oldHandlerIndex >= 0) {
105
- handlers?.splice(oldHandlerIndex, 1, newHandler);
106
- } else {
107
- handlers?.push(newHandler);
108
- }
109
- },
110
- unmounted(el: HTMLElement) {
111
- nodeList.delete(el);
112
- },
113
- };
114
-
115
- export default ClickOutside;
@@ -1,3 +0,0 @@
1
- import ClickOutside from "./click-outside";
2
-
3
- export { ClickOutside };
package/src/index.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from "./utils/index";
2
- export * from "./directives/index";
package/src/utils/dom.ts DELETED
@@ -1,15 +0,0 @@
1
- /**
2
- * 根据类名获取父元素
3
- * @param dom dom元素
4
- * @param className css类名
5
- * @return dom | null
6
- */
7
- export function getParentByClass(dom: any, className: string): any {
8
- if (!dom || dom.tagName === "BODY") {
9
- return null;
10
- }
11
- if (dom.classList.contains(className)) {
12
- return dom;
13
- }
14
- return getParentByClass(dom.parentNode, className);
15
- }
@@ -1,7 +0,0 @@
1
- export * from "./random";
2
- export * from "./is";
3
- export * from "./tree";
4
- export * from "./number";
5
- export * from "./storage";
6
- export * from "./object";
7
- export * from "./dom";
package/src/utils/is.ts DELETED
@@ -1,67 +0,0 @@
1
- /**
2
- * 判断是否为undefined
3
- * @param val
4
- * @returns
5
- */
6
- export function isUndefined(val: any): boolean {
7
- return val === undefined;
8
- }
9
- /**
10
- * 是否为数组
11
- * @param val
12
- * @returns
13
- */
14
- export function isArray(val: any) {
15
- return Object.prototype.toString.call(val) === "[object Array]";
16
- }
17
- /**
18
- * 是否为对象
19
- * @param val
20
- * @returns
21
- */
22
- export function isObject(val: any) {
23
- return (
24
- typeof val === "object" &&
25
- Object.prototype.toString.call(val) === "[object Object]"
26
- );
27
- }
28
-
29
- /**
30
- * 是否为日期时间
31
- * @param val
32
- * @returns
33
- */
34
- export function isDate(val: any) {
35
- return Object.prototype.toString.call(val) === "[object Date]";
36
- }
37
-
38
- /**
39
- * 是否为空
40
- * @param val
41
- * @returns
42
- */
43
- export function isEmpty(val: unknown) {
44
- return (
45
- (!val && val !== 0) ||
46
- (isArray(val) && (<Array<unknown>>val).length === 0) ||
47
- (isObject(val) && !Object.keys(val as any).length)
48
- );
49
- }
50
-
51
- /**
52
- * 判断对象是否为DOM元素
53
- * @param e
54
- * @returns
55
- */
56
- export function isElement(e: unknown): e is Element {
57
- if (typeof Element === "undefined") return false;
58
- return e instanceof Element;
59
- }
60
-
61
- /**
62
- * 是否是客户端
63
- */
64
- export const isClient = typeof window !== "undefined";
65
-
66
- /**是否未数值 */
67
- export const isNumber = (val: any) => typeof val === "number";
@@ -1,14 +0,0 @@
1
- /**
2
- * 数字转成千分位
3
- * @param num
4
- * @returns
5
- */
6
- export function thousandSeparator(num: number | any): string {
7
- if (!num) {
8
- return "0";
9
- }
10
- if (Object.prototype.toString.call(1) !== "[object Number]") {
11
- return `${num}`;
12
- }
13
- return `${num}`.replace(/(\d{1,3})(?=(\d{3})+(?:$|\.))/g, "$1,");
14
- }
@@ -1,76 +0,0 @@
1
- import { isObject } from "./is";
2
-
3
- // 深拷贝对象
4
- export function deepClone(obj: any): any {
5
- const _toString: Function = Object.prototype.toString;
6
- // null, undefined, non-object, function
7
- if (!obj || typeof obj !== "object") {
8
- return obj;
9
- }
10
- // DOM Node
11
- if (obj.nodeType && "cloneNode" in obj) {
12
- return obj.cloneNode(true);
13
- }
14
- // Date
15
- if (_toString.call(obj) === "[object Date]") {
16
- return new Date(obj.getTime());
17
- }
18
- // RegExp
19
- if (_toString.call(obj) === "[object RegExp]") {
20
- const flags: Array<string> = [];
21
- if (obj.global) {
22
- flags.push("g");
23
- }
24
- if (obj.multiline) {
25
- flags.push("m");
26
- }
27
- if (obj.ignoreCase) {
28
- flags.push("i");
29
- }
30
- return new RegExp(obj.source, flags.join(""));
31
- }
32
- if (_toString.call(obj) === "[object FormData]") {
33
- const formData = new FormData();
34
- for (const [key, value] of obj.entries()) {
35
- formData.append(key, value);
36
- }
37
- return formData;
38
- }
39
- const result: any = Array.isArray(obj)
40
- ? []
41
- : obj.constructor
42
- ? new obj.constructor()
43
- : {};
44
-
45
- for (const key in obj) {
46
- result[key] = deepClone(obj[key]);
47
- }
48
- return result;
49
- }
50
-
51
- /**
52
- *深度合并多个对象的方法
53
- */
54
- export function deepAssign(...arg: any[]) {
55
- let len: number = arg.length,
56
- target: Record<string, any> = arg[0];
57
- if (!isObject(target)) {
58
- target = {};
59
- }
60
- for (let i = 1; i < len; i++) {
61
- let source = arg[i];
62
- if (isObject(source)) {
63
- for (let s in source) {
64
- if (s === "__proto__" || target === source[s]) {
65
- continue;
66
- }
67
- if (isObject(source[s])) {
68
- target[s] = deepAssign(target[s], source[s]);
69
- } else {
70
- target[s] = source[s];
71
- }
72
- }
73
- }
74
- }
75
- return target;
76
- }
@@ -1,40 +0,0 @@
1
- /**
2
- * ==============================================
3
- * 随机数
4
- * ==============================================
5
- */
6
-
7
- /**
8
- * 生成[0-10000]的随机数,针对数据小量使用
9
- * @returns 随机数
10
- */
11
- export function generateId(): number {
12
- return Math.floor(Math.random() * 10000);
13
- }
14
-
15
- /**
16
- * 生成[0-max]的随机数
17
- * @returns 随机数
18
- */
19
- export function getRandomInt(max: number) {
20
- return Math.floor(Math.random() * Math.floor(max));
21
- }
22
-
23
- /**
24
- * 生成GUID
25
- * @returns
26
- */
27
- export function guiID() {
28
- const gs = generateString;
29
- return `${gs()}${gs()}-${gs()}-${gs()}-${gs()}-${gs()}${gs()}${gs()}`;
30
- }
31
-
32
- /**
33
- * 随机字符串
34
- * @returns
35
- */
36
- export function generateString(): string {
37
- return Math.floor((1 + Math.random()) * 0x10000)
38
- .toString(16)
39
- .substring(1);
40
- }
@@ -1,86 +0,0 @@
1
- /**
2
- * 获取用户token,包含过期时间判断
3
- */
4
- export function getToken(): any | null {
5
- const session = localStorage.getItem("token");
6
- if (!session) {
7
- return undefined;
8
- }
9
- const data = JSON.parse(session);
10
- if (data !== null) {
11
- if (data.expirse != null && data.expirse < new Date().getTime()) {
12
- localStorage.removeItem("token");
13
- } else {
14
- return data.value;
15
- }
16
- }
17
- return null;
18
- }
19
-
20
- /**
21
- * 设置用户token,有效期默认七天
22
- * @param {*} value
23
- */
24
- export function setToken(value: any, expires?: number): void {
25
- (!expires && (expires = 7 * 24 * 60 * 60 * 1000)) ||
26
- (expires = expires * 1000);
27
- const data = { value: value, expirse: new Date().getTime() + expires };
28
- localStorage.setItem("token", JSON.stringify(data));
29
- }
30
-
31
- /**
32
- * 移除token
33
- */
34
- export function removeToken(): void {
35
- localStorage.removeItem("token");
36
- }
37
- /**
38
- * 设置缓存
39
- * @param key key
40
- * @param value 值
41
- */
42
- export function setStorage(
43
- key: string,
44
- value: any,
45
- tpye: "local" | "session" = "local"
46
- ): void {
47
- const storage = tpye == "local" ? localStorage : sessionStorage;
48
- value != undefined && storage.setItem(key, JSON.stringify(value));
49
- }
50
- /**
51
- * 获取缓存
52
- * @param key
53
- * @returns
54
- */
55
- export function getStorage(
56
- key: string,
57
- tpye: "local" | "session" = "local"
58
- ): any {
59
- const storage = tpye == "local" ? localStorage : sessionStorage;
60
- let session = storage.getItem(key);
61
- if (session) {
62
- return JSON.parse(session || "");
63
- }
64
- return session;
65
- }
66
-
67
- /**
68
- * 删除指定key的缓存
69
- * @param key
70
- */
71
- export function removeStorage(
72
- key: string,
73
- tpye: "local" | "session" = "local"
74
- ): void {
75
- const storage = tpye == "local" ? localStorage : sessionStorage;
76
- storage.removeItem(key);
77
- }
78
-
79
- /**
80
- * 清除所有缓存
81
- * @param tpye
82
- */
83
- export function clearStorage(tpye: "local" | "session" = "local") {
84
- const storage = tpye == "local" ? localStorage : sessionStorage;
85
- storage.clear();
86
- }
package/src/utils/tree.ts DELETED
@@ -1,30 +0,0 @@
1
- /**
2
- * 树形数据扁平化处理
3
- * @param data 数据
4
- * @param key key属性
5
- * @param children children属性
6
- */
7
- export function treeFlat(
8
- listData: any[],
9
- key: string = "key",
10
- children: string = "children"
11
- ): Record<string, any> {
12
- const map: Record<string, any> = {};
13
- const flat = (data: any[], parentKey?: string) => {
14
- for (let i = 0; i < data.length; i++) {
15
- const item = data[i];
16
- const mapKey = item[key];
17
- if (map[mapKey]) {
18
- } else {
19
- map[mapKey] = item;
20
- if (parentKey) map[mapKey].parent = map[parentKey];
21
- const itemChildren = item[children];
22
- if (itemChildren && itemChildren.length > 0) {
23
- flat(itemChildren, item[key]);
24
- }
25
- }
26
- }
27
- };
28
- flat(listData);
29
- return map;
30
- }
package/tsconfig.json DELETED
@@ -1,5 +0,0 @@
1
- {
2
- "compilerOptions": {},
3
- "extends": "../../tsconfig.json",
4
- "include": ["./src/**/*.ts"]
5
- }