util-helpers 4.19.4 → 4.20.1

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "util-helpers",
3
- "version": "4.19.4",
3
+ "version": "4.20.1",
4
4
  "description": "一个基于业务场景的工具方法库",
5
5
  "main": "lib/index.js",
6
6
  "module": "esm/index.js",
@@ -50,32 +50,33 @@
50
50
  },
51
51
  "homepage": "https://doly-dev.github.io/util-helpers/index.html",
52
52
  "devDependencies": {
53
- "@babel/core": "^7.22.5",
54
- "@babel/preset-env": "^7.22.5",
55
- "@babel/preset-typescript": "^7.22.5",
56
- "@commitlint/cli": "^17.6.6",
57
- "@commitlint/config-conventional": "^17.6.6",
58
- "@rollup/plugin-commonjs": "^25.0.3",
59
- "@rollup/plugin-node-resolve": "^15.1.0",
53
+ "@babel/core": "^7.22.11",
54
+ "@babel/preset-env": "^7.22.14",
55
+ "@babel/preset-typescript": "^7.22.11",
56
+ "@commitlint/cli": "^17.7.1",
57
+ "@commitlint/config-conventional": "^17.7.0",
58
+ "@rollup/plugin-commonjs": "^25.0.4",
59
+ "@rollup/plugin-node-resolve": "^15.2.1",
60
60
  "@rollup/plugin-replace": "^5.0.2",
61
61
  "@rollup/plugin-terser": "^0.4.3",
62
- "@rollup/plugin-typescript": "^11.1.2",
63
- "@types/jest": "^29.5.2",
64
- "@typescript-eslint/eslint-plugin": "^5.60.1",
65
- "@typescript-eslint/parser": "^5.60.1",
66
- "babel-jest": "^29.5.0",
62
+ "@rollup/plugin-typescript": "^11.1.3",
63
+ "@types/jest": "^29.5.4",
64
+ "@typescript-eslint/eslint-plugin": "^5.62.0",
65
+ "@typescript-eslint/parser": "^5.62.0",
66
+ "babel-jest": "^29.6.4",
67
67
  "babel-plugin-minify-replace": "^0.5.0",
68
68
  "cross-env": "^7.0.3",
69
69
  "cz-conventional-changelog": "^3.3.0",
70
- "docdash": "^2.0.1",
71
- "eslint": "^8.44.0",
72
- "jest": "^29.5.0",
73
- "jest-environment-jsdom": "^29.5.0",
70
+ "docdash": "^2.0.2",
71
+ "eslint": "^8.48.0",
72
+ "jest": "^29.6.4",
73
+ "jest-canvas-mock": "^2.5.2",
74
+ "jest-environment-jsdom": "^29.6.4",
74
75
  "jsdoc": "^4.0.2",
75
- "lint-staged": "^13.2.3",
76
+ "lint-staged": "^13.3.0",
76
77
  "prettier": "^2.8.8",
77
- "rollup": "^3.26.3",
78
- "typescript": "^5.1.6",
78
+ "rollup": "^3.28.1",
79
+ "typescript": "^5.2.2",
79
80
  "yorkie": "^2.0.0"
80
81
  },
81
82
  "lint-staged": {
@@ -92,7 +93,7 @@
92
93
  }
93
94
  },
94
95
  "dependencies": {
95
- "tslib": "^2.6.0",
96
- "ut2": "^1.3.2"
96
+ "tslib": "^2.6.2",
97
+ "ut2": "^1.4.6"
97
98
  }
98
99
  }
@@ -0,0 +1,27 @@
1
+ type Info = {
2
+ image: HTMLImageElement;
3
+ blob: Blob;
4
+ canvas: HTMLCanvasElement;
5
+ context: CanvasRenderingContext2D;
6
+ };
7
+ type Options = {
8
+ width?: number;
9
+ height?: number;
10
+ rotate?: number;
11
+ offset?: [number, number] | ((info: Info, options: Options) => [number, number]);
12
+ cacheImage?: boolean;
13
+ background?: string;
14
+ canvasWidth?: number | ((info: Info, options: Options) => number);
15
+ canvasHeight?: number | ((info: Info, options: Options) => number);
16
+ format?: 'blob' | 'dataURL';
17
+ type?: string;
18
+ quality?: number;
19
+ beforeCompress?: (imageWithBlob: Pick<Info, 'image' | 'blob'>, options: Options) => void;
20
+ beforeDraw?: (info: Info, options: Options) => void;
21
+ afterDraw?: (info: Info, options: Options) => void;
22
+ };
23
+ declare function compressImage(img: string | Blob, options: Omit<Options, 'format'> & {
24
+ format: 'dataURL';
25
+ }): Promise<string>;
26
+ declare function compressImage(img: string | Blob, options?: Options): Promise<Blob>;
27
+ export default compressImage;
package/types/divide.d.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  * @static
5
5
  * @alias module:Math.divide
6
6
  * @since 3.1.0
7
- * @param {...number|string} nums 被除数和除数
7
+ * @param {...(number|string)} nums 被除数和除数
8
8
  * @returns {number} 商数
9
9
  * @example
10
10
  *
@@ -33,6 +33,8 @@ type DownloadOptions = {
33
33
  *
34
34
  * <em style="font-weight: bold;">注意:该方法仅适用于浏览器端,兼容 IE10+ 和现代浏览器。</em>
35
35
  *
36
+ * <em style="font-weight: bold;">注意:微信浏览器不支持H5下载文件。</em>
37
+ *
36
38
  * @static
37
39
  * @alias module:Other.download
38
40
  * @since 4.16.0
@@ -8,15 +8,16 @@ type NodeAssign = 'spread' | 'self';
8
8
  * @alias module:Tree.filterTree
9
9
  * @since 4.15.0
10
10
  * @param {object[]} tree 树结构数据
11
- * @param {function} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy ,结果将包含该节点
11
+ * @param {function} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 `Truthy` ,结果将包含该节点
12
12
  * @param {string} [childrenField='children'] 子级字段名
13
13
  * @param {'spread'|'self'} [nodeAssign='spread'] 节点赋值方式。spread表示使用展开运算符创建新值,self表示使用自身对象。
14
14
  * @returns {object[]}
15
15
  * @example
16
- * const menus = [{ "id": "1", "name": "首页", "code": "trade", "pid": null }, { "id": "2", "name": "交易管理", "code": "trade", "pid": null, "children": [{ "id": "3", "name": "交易查询", "code": "trade-1", "pid": "2", "children": [{ "id": "4", "name": "交易查询-查询操作", "code": "trade-1-1", "pid": "3" }] }] }, { "id": "5", "name": "权限管理", "code": "authorization", "pid": null, "children": [{ "id": "6", "name": "角色管理", "code": "authorization-1", "pid": "5" }, { "id": "7", "name": "用户管理", "code": "authorization-2", "pid": "5" }] }];
16
+ * const menus = [{ id: '1', name: '首页', code: 'trade', pid: null }, { id: '2', name: '交易管理', code: 'trade', pid: null, children: [{ id: '3', name: '交易查询', code: 'trade-1', pid: '2', children: [{ id: '4', name: '交易查询-查询操作', code: 'trade-1-1', pid: '3' }]}]}, { id: '5', name: '权限管理', code: 'authorization', pid: null, children: [{ id: '6', name: '角色管理', code: 'authorization-1', pid: '5' }, { id: '7', name: '用户管理', code: 'authorization-2', pid: '5' }]}];
17
17
  *
18
18
  * filterTree(menus, item=>item.name.indexOf('管理') > -1);
19
- * // [{"id":"2","name":"交易管理","code":"trade","pid":null,"children":[]},{"id":"5","name":"权限管理","code":"authorization","pid":null,"children":[{"id":"6","name":"角色管理","code":"authorization-1","pid":"5"},{"id":"7","name":"用户管理","code":"authorization-2","pid":"5"}]}]
19
+ * // [{ id: '2', name: '交易管理', code: 'trade', pid: null, children: [] }, { id: '5', name: '权限管理', code: 'authorization', pid: null, children: [{ id: '6', name: '角色管理', code: 'authorization-1', pid: '5' }, { id: '7', name: '用户管理', code: 'authorization-2', pid: '5' }]}]
20
+
20
21
  *
21
22
  * // 如果某节点被过滤掉,它的子节点也一并抛弃
22
23
  * filterTree(menus, item=>item.id === '7');
@@ -5,17 +5,17 @@
5
5
  * @alias module:Tree.findTreeNode
6
6
  * @since 4.14.0
7
7
  * @param {object[]} tree 树结构数据
8
- * @param {function} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 Truthy ,将返回该节点
8
+ * @param {function} predicate 遍历每一项执行的函数,参数是当前遍历到的节点数据,如果返回 `Truthy` ,将返回该节点
9
9
  * @param {string} [childrenField='children'] 子级字段名
10
10
  * @returns {object|undefined}
11
11
  * @example
12
- * const menus = [{ "id": "1", "name": "首页", "code": "trade", "pid": null }, { "id": "2", "name": "交易管理", "code": "trade", "pid": null, "children": [{ "id": "3", "name": "交易查询", "code": "trade-1", "pid": "2", "children": [{ "id": "4", "name": "交易查询-查询操作", "code": "trade-1-1", "pid": "3" }] }] }, { "id": "5", "name": "权限管理", "code": "authorization", "pid": null, "children": [{ "id": "6", "name": "角色管理", "code": "authorization-1", "pid": "5" }, { "id": "7", "name": "用户管理", "code": "authorization-2", "pid": "5" }] }];
12
+ * const menus = [{ id: '1', name: '首页', code: 'trade', pid: null }, { id: '2', name: '交易管理', code: 'trade', pid: null, children: [{ id: '3', name: '交易查询', code: 'trade-1', pid: '2', children: [{ id: '4', name: '交易查询-查询操作', code: 'trade-1-1', pid: '3' }]}]}, { id: '5', name: '权限管理', code: 'authorization', pid: null, children: [{ id: '6', name: '角色管理', code: 'authorization-1', pid: '5' }, { id: '7', name: '用户管理', code: 'authorization-2', pid: '5' }]}];
13
13
  *
14
14
  * findTreeNode(menus, item=>item.id === '2');
15
- * // {"id":"2","name":"交易管理","code":"trade","pid":null,"children":[{"id":"3","name":"交易查询","code":"trade-1","pid":"2","children":[{"id":"4","name":"交易查询-查询操作","code":"trade-1-1","pid":"3"}]}]}
15
+ * // {id: '2', name: '交易管理', code: 'trade', pid: null, children: [ { id: '3', name: '交易查询', code: 'trade-1', pid: '2', children: [{ id: '4', name: '交易查询-查询操作', code: 'trade-1-1', pid: '3' }]}]}
16
16
  *
17
17
  * findTreeNode(menus, item=>item.id === '7');
18
- * // {"id":"7","name":"用户管理","code":"authorization-2","pid":"5"}
18
+ * // { id: '7', name: '用户管理', code: 'authorization-2', pid: '5' }
19
19
  *
20
20
  * findTreeNode(menus, item=>item.id === 'not found');
21
21
  * // undefined
@@ -9,16 +9,16 @@
9
9
  * @param {string} [childrenField='children'] 子级字段名
10
10
  * @returns {object[]}
11
11
  * @example
12
- * const menus = [{ "id": "1", "name": "首页", "code": "trade", "pid": null }, { "id": "2", "name": "交易管理", "code": "trade", "pid": null, "children": [{ "id": "3", "name": "交易查询", "code": "trade-1", "pid": "2", "children": [{ "id": "4", "name": "交易查询-查询操作", "code": "trade-1-1", "pid": "3" }] }] }, { "id": "5", "name": "权限管理", "code": "authorization", "pid": null, "children": [{ "id": "6", "name": "角色管理", "code": "authorization-1", "pid": "5" }, { "id": "7", "name": "用户管理", "code": "authorization-2", "pid": "5" }] }];
12
+ * const menus = [{ id: '1', name: '首页', code: 'trade', pid: null }, { id: '2', name: '交易管理', code: 'trade', pid: null, children: [{ id: '3', name: '交易查询', code: 'trade-1', pid: '2', children: [{ id: '4', name: '交易查询-查询操作', code: 'trade-1-1', pid: '3' }]}]}, { id: '5', name: '权限管理', code: 'authorization', pid: null, children: [{ id: '6', name: '角色管理', code: 'authorization-1', pid: '5' }, { id: '7', name: '用户管理', code: 'authorization-2', pid: '5' }]}];
13
13
  *
14
14
  * findTreeNodes(menus, item=>item.id === '2');
15
- * // [{"id":"2","name":"交易管理","code":"trade","pid":null,"children":[{"id":"3","name":"交易查询","code":"trade-1","pid":"2","children":[{"id":"4","name":"交易查询-查询操作","code":"trade-1-1","pid":"3"}]}]}]
15
+ * // [{id:'2',name:'交易管理',code:'trade',pid:null,children:[{id:'3',name:'交易查询',code:'trade-1',pid:'2',children:[{id:'4',name:'交易查询-查询操作',code:'trade-1-1',pid:'3'}]}]}]
16
16
  *
17
17
  * findTreeNodes(menus, item=>item.name.indexOf('管理') > -1);
18
- * // [{"id":"2","name":"交易管理","code":"trade","pid":null,"children":[{"id":"3","name":"交易查询","code":"trade-1","pid":"2","children":[{"id":"4","name":"交易查询-查询操作","code":"trade-1-1","pid":"3"}]}]},{"id":"5","name":"权限管理","code":"authorization","pid":null,"children":[{"id":"6","name":"角色管理","code":"authorization-1","pid":"5"},{"id":"7","name":"用户管理","code":"authorization-2","pid":"5"}]},{"id":"7","name":"用户管理","code":"authorization-2","pid":"5"},{"id":"6","name":"角色管理","code":"authorization-1","pid":"5"}]
18
+ * // [{id:'2',name:'交易管理',code:'trade',pid:null,children:[{id:'3',name:'交易查询',code:'trade-1',pid:'2',children:[{id:'4',name:'交易查询-查询操作',code:'trade-1-1',pid:'3'}]}]},{id:'5',name:'权限管理',code:'authorization',pid:null,children:[{id:'6',name:'角色管理',code:'authorization-1',pid:'5'},{id:'7',name:'用户管理',code:'authorization-2',pid:'5'}]},{id:'7',name:'用户管理',code:'authorization-2',pid:'5'},{id:'6',name:'角色管理',code:'authorization-1',pid:'5'}]
19
19
  *
20
20
  * findTreeNodes(menus, item=>item.id === '1' || item.id === '7');
21
- * // [{"id":"1","name":"首页","code":"trade","pid":null},{"id":"7","name":"用户管理","code":"authorization-2","pid":"5"}]
21
+ * // [{id:'1',name:'首页',code:'trade',pid:null},{id:'7',name:'用户管理',code:'authorization-2',pid:'5'}]
22
22
  *
23
23
  * findTreeNodes(menus, item=>item.id === 'not found');
24
24
  * // []
@@ -9,13 +9,13 @@
9
9
  * @param {string} [childrenField='children'] 子级字段名
10
10
  * @returns {object[]}
11
11
  * @example
12
- * const menus = [{ "id": "1", "name": "首页", "code": "trade", "pid": null }, { "id": "2", "name": "交易管理", "code": "trade", "pid": null, "children": [{ "id": "3", "name": "交易查询", "code": "trade-1", "pid": "2", "children": [{ "id": "4", "name": "交易查询-查询操作", "code": "trade-1-1", "pid": "3" }] }] }, { "id": "5", "name": "权限管理", "code": "authorization", "pid": null, "children": [{ "id": "6", "name": "角色管理", "code": "authorization-1", "pid": "5" }, { "id": "7", "name": "用户管理", "code": "authorization-2", "pid": "5" }] }];
12
+ * const menus = [{ id: '1', name: '首页', code: 'trade', pid: null }, { id: '2', name: '交易管理', code: 'trade', pid: null, children: [{ id: '3', name: '交易查询', code: 'trade-1', pid: '2', children: [{ id: '4', name: '交易查询-查询操作', code: 'trade-1-1', pid: '3' }]}]}, { id: '5', name: '权限管理', code: 'authorization', pid: null, children: [{ id: '6', name: '角色管理', code: 'authorization-1', pid: '5' }, { id: '7', name: '用户管理', code: 'authorization-2', pid: '5' }]}];
13
13
  *
14
14
  * findTreeSelect(menus, item => item.id === '2');
15
- * // [{"id":"2","name":"交易管理","code":"trade","pid":null,"children":[{"id":"3","name":"交易查询","code":"trade-1","pid":"2","children":[{"id":"4","name":"交易查询-查询操作","code":"trade-1-1","pid":"3"}]}]}]
15
+ * // [{id:'2',name:'交易管理',code:'trade',pid:null,children:[{id:'3',name:'交易查询',code:'trade-1',pid:'2',children:[{id:'4',name:'交易查询-查询操作',code:'trade-1-1',pid:'3'}]}]}]
16
16
  *
17
17
  * findTreeSelect(menus, item => item.id === '7');
18
- * // [{"id":"5","name":"权限管理","code":"authorization","pid":null,"children":[{"id":"6","name":"角色管理","code":"authorization-1","pid":"5"},{"id":"7","name":"用户管理","code":"authorization-2","pid":"5"}]},{"id":"7","name":"用户管理","code":"authorization-2","pid":"5"}]
18
+ * // [{id:'5',name:'权限管理',code:'authorization',pid:null,children:[{id:'6',name:'角色管理',code:'authorization-1',pid:'5'},{id:'7',name:'用户管理',code:'authorization-2',pid:'5'}]},{id:'7',name:'用户管理',code:'authorization-2',pid:'5'}]
19
19
  *
20
20
  * findTreeSelect(menus, item => item.id === 'not found');
21
21
  * // []
package/types/gcd.d.ts ADDED
@@ -0,0 +1,29 @@
1
+ /**
2
+ * 最大公约数,使用辗转相除法。
3
+ *
4
+ * 遵循以下约定:
5
+ *
6
+ * 1. 如果参数中包含无效数值,返回 `NaN` 。
7
+ * 2. 如果全部参数都为 `0` ,返回 `0` 。
8
+ * 3. 如果参数包含 `0` ,仅计算非零的数。
9
+ * 4. 如果参数为负数,将转为绝对值的正数。
10
+ * 5. 如果参数包含小数点,将转为四舍五入的整数。
11
+ *
12
+ * @static
13
+ * @alias module:Math.gcd
14
+ * @since 4.20.0
15
+ * @see {@link https://baike.baidu.com/item/最大公约数 | 最大公约数}
16
+ * @param {...(number|string)} nums 两个或多个整数。
17
+ * @returns {number} 最大公约数。
18
+ * @example
19
+ *
20
+ * gcd(8, 14); // 2
21
+ * gcd(57, 48); // 3
22
+ * gcd(140, 21, 42); // 7
23
+ * gcd('foo', 'bar'); // NaN
24
+ * gcd(0, 10); // 10
25
+ * gcd(2.3, 3.8, 8, -10); // 2
26
+ *
27
+ */
28
+ declare function gcd(...nums: (string | number)[]): number;
29
+ export default gcd;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 获取图片信息。
3
+ *
4
+ * <em style="font-weight: bold;">注意:该方法仅适用于浏览器端。</em>
5
+ *
6
+ * @static
7
+ * @alias module:Other.getImageInfo
8
+ * @since 4.20.0
9
+ * @param {string | Blob} img 图片地址或 blob 对象
10
+ * @param {boolean} [useCache=true] 缓存最近一次成功结果,当图片地址或 blob 对象一致时,直接返回该缓存。避免连续请求同一个图片资源,重复加载问题。
11
+ * @returns {Promise<ImageInfo>} 图片信息
12
+ * @example
13
+ *
14
+ * getImageInfo(file).then(imageInfo=>{
15
+ * // do something
16
+ * });
17
+ *
18
+ * getImageInfo('https://dummyimage.com/200x300').then(imageInfo=>{
19
+ * // do something
20
+ * });
21
+ *
22
+ * getImageInfo('data:image/png;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=').then(imageInfo=>{
23
+ * // do something
24
+ * });
25
+ *
26
+ */
27
+ declare function getImageInfo(img: string | Blob, useCache?: boolean): Promise<{
28
+ width: number;
29
+ height: number;
30
+ contrast: string;
31
+ measure: string;
32
+ size: string;
33
+ bytes: number;
34
+ image: HTMLImageElement;
35
+ blob: Blob;
36
+ }>;
37
+ export default getImageInfo;
package/types/index.d.ts CHANGED
@@ -91,6 +91,8 @@ export { default as minus } from './minus';
91
91
  export { default as times } from './times';
92
92
  export { default as divide } from './divide';
93
93
  export { default as round } from './round';
94
+ export { default as gcd } from './gcd';
95
+ export { default as lcm } from './lcm';
94
96
  /**
95
97
  * 其他
96
98
  *
@@ -99,7 +101,11 @@ export { default as round } from './round';
99
101
  */
100
102
  export { default as ajax } from './ajax';
101
103
  export { default as calculateCursorPosition } from './calculateCursorPosition';
104
+ export { default as compressImage } from './compressImage';
102
105
  export { default as download } from './download';
106
+ export { default as getImageInfo } from './getImageInfo';
107
+ export { default as loadImage } from './loadImage';
108
+ export { default as loadImageWithBlob } from './loadImageWithBlob';
103
109
  export { default as loadScript } from './loadScript';
104
110
  export { default as randomString } from './randomString';
105
111
  export { default as strlen } from './strlen';
package/types/lcm.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ /**
2
+ * 最小公倍数。
3
+ *
4
+ * 遵循以下约定:
5
+ *
6
+ * 1. 如果参数中包含无效数值,返回 `NaN` 。
7
+ * 2. 如果只有一个参数,另一个参数默认为 `1` 。
8
+ * 3. 如果全部参数都为 `0` ,返回 `NaN` 。因为作为除数的最大公约数为 `0` ,结果为 `NaN` 。
9
+ * 4. 如果全部参数都为 `Infinity` ,返回 `NaN` 。因为除数和被除数都是 `Infinity` ,结果为 `NaN` 。
10
+ * 5. 如果参数包含 `0` ,返回 `0` 。
11
+ * 6. 如果参数为负数,将转为绝对值的正数。
12
+ * 7. 如果参数包含小数点,将转为四舍五入的整数。
13
+ *
14
+ * @static
15
+ * @alias module:Math.lcm
16
+ * @since 4.20.0
17
+ * @see {@link https://baike.baidu.com/item/最小公倍数 | 最小公倍数}
18
+ * @param {...(number|string)} nums 两个或多个整数。
19
+ * @returns {number} 最小公倍数。
20
+ * @example
21
+ *
22
+ * lcm(3, 4); // 12
23
+ * lcm(8, 4); // 8
24
+ * lcm(2, 4, 8); // 32
25
+ * lcm('foo', 'bar'); // NaN
26
+ * lcm(0, 10); // 0
27
+ * lcm(2.3, 3.8, 8, -10); // 320
28
+ *
29
+ */
30
+ declare function lcm(...nums: (string | number)[]): number;
31
+ export default lcm;
@@ -32,11 +32,11 @@ type Options = {
32
32
  * { id: '7', name: '用户管理', code: 'authorization-2', pid: '5' }
33
33
  * ];
34
34
  * listToTree(menus);
35
- * // [{"id":"1","name":"首页","code":"trade","pid":null},{"id":"2","name":"交易管理","code":"trade","pid":null,"children":[{"id":"3","name":"交易查询","code":"trade-1","pid":"2","children":[{"id":"4","name":"交易查询-查询操作","code":"trade-1-1","pid":"3"}]}]},{"id":"5","name":"权限管理","code":"authorization","pid":null,"children":[{"id":"6","name":"角色管理","code":"authorization-1","pid":"5"},{"id":"7","name":"用户管理","code":"authorization-2","pid":"5"}]}]
35
+ * // [{id:'1',name:'首页',code:'trade',pid:null},{id:'2',name:'交易管理',code:'trade',pid:null,children:[{id:'3',name:'交易查询',code:'trade-1',pid:'2',children:[{id:'4',name:'交易查询-查询操作',code:'trade-1-1',pid:'3'}]}]},{id:'5',name:'权限管理',code:'authorization',pid:null,children:[{id:'6',name:'角色管理',code:'authorization-1',pid:'5'},{id:'7',name:'用户管理',code:'authorization-2',pid:'5'}]}]
36
36
  *
37
37
  * // 自定义子级字段名
38
38
  * listToTree(basicMenus, { childrenField: 'childs' });
39
- * // [{"id":"1","name":"首页","code":"trade","pid":null},{"id":"2","name":"交易管理","code":"trade","pid":null,"childs":[{"id":"3","name":"交易查询","code":"trade-1","pid":"2","childs":[{"id":"4","name":"交易查询-查询操作","code":"trade-1-1","pid":"3"}]}]},{"id":"5","name":"权限管理","code":"authorization","pid":null,"childs":[{"id":"6","name":"角色管理","code":"authorization-1","pid":"5"},{"id":"7","name":"用户管理","code":"authorization-2","pid":"5"}]}]
39
+ * // [{id:'1',name:'首页',code:'trade',pid:null},{id:'2',name:'交易管理',code:'trade',pid:null,childs:[{id:'3',name:'交易查询',code:'trade-1',pid:'2',childs:[{id:'4',name:'交易查询-查询操作',code:'trade-1-1',pid:'3'}]}]},{id:'5',name:'权限管理',code:'authorization',pid:null,childs:[{id:'6',name:'角色管理',code:'authorization-1',pid:'5'},{id:'7',name:'用户管理',code:'authorization-2',pid:'5'}]}]
40
40
  *
41
41
  */
42
42
  declare function listToTree<T extends Record<string, any> = Record<string, any>, R extends unknown = T & Record<string, any>>(list: T[], options?: Options): R[];
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 加载图片。
3
+ *
4
+ * <em style="font-weight: bold;">注意:该方法仅适用于浏览器端。</em>
5
+ *
6
+ * @static
7
+ * @alias module:Other.loadImage
8
+ * @since 4.20.0
9
+ * @param {string | Blob} img 图片地址或 blob 对象
10
+ * @param {boolean} [useCache=true] 缓存最近一次成功结果,当图片地址或 blob 对象一致时,直接返回该缓存。避免连续请求同一个图片资源,重复加载问题。
11
+ * @returns {Promise<HTMLImageElement>} HTML图片元素
12
+ * @example
13
+ *
14
+ * loadImage(file).then(image=>{
15
+ * // do something
16
+ * });
17
+ *
18
+ * loadImage('https://dummyimage.com/200x300').then(image=>{
19
+ * // do something
20
+ * });
21
+ *
22
+ * loadImage('data:image/png;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=').then(image=>{
23
+ * // do something
24
+ * });
25
+ *
26
+ */
27
+ declare function loadImage(img: string | Blob, useCache?: boolean): Promise<HTMLImageElement>;
28
+ export default loadImage;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @typedef {Object} ImageWithBlob HTML图片元素和 blob 对象
3
+ * @property {HTMLImageElement} image HTML图片元素
4
+ * @property {Blob} blob blob 对象
5
+ */
6
+ /**
7
+ * 加载图片,返回图片元素和 blob 对象。
8
+ *
9
+ * <em style="font-weight: bold;">注意:该方法仅适用于浏览器端。</em>
10
+ *
11
+ * @method
12
+ * @alias module:Other.loadImageWithBlob
13
+ * @since 4.20.0
14
+ * @param {string | Blob} img 图片地址或 blob 对象
15
+ * @param {boolean} [useCache=true] 缓存最近一次成功结果,当图片地址或 blob 对象一致时,直接返回该缓存。避免连续请求同一个图片资源,重复加载问题。
16
+ * @returns {Promise<ImageWithBlob>} HTML图片元素和 blob 对象
17
+ * @example
18
+ *
19
+ * loadImage(file).then(({image, blob})=>{
20
+ * // do something
21
+ * });
22
+ *
23
+ * loadImage('https://dummyimage.com/200x300').then(({image, blob})=>{
24
+ * // do something
25
+ * });
26
+ *
27
+ * loadImage('data:image/png;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=').then(({image, blob})=>{
28
+ * // do something
29
+ * });
30
+ *
31
+ */
32
+ declare function loadImageWithBlob(img: string | Blob, useCache?: boolean): Promise<{
33
+ image: HTMLImageElement;
34
+ blob: Blob;
35
+ }>;
36
+ export default loadImageWithBlob;
@@ -5,15 +5,17 @@ type ScriptAttribute = Pick<HTMLScriptElement, 'async' | 'crossOrigin' | 'defer'
5
5
  /**
6
6
  * 加载 js 文件。
7
7
  *
8
- * 默认属性 `async=true` `type=text/javascript` 。如果加载失败,默认会删除该 `script` 的 `dom` 标签。
9
- *
10
8
  * <em style="font-weight: bold;">注意:该方法仅适用于浏览器端。</em>
11
9
  *
12
10
  * @static
13
11
  * @alias module:Other.loadScript
14
12
  * @since 4.19.0
15
13
  * @param {string} src js 地址。
16
- * @param {Object} [options] script 标签属性。比如 `async` `defer` `onload` `onerror` `id` 等。如果需要设置属性,可以使用 `attrs` 。如果加载失败或错误不想删除,可以使用 `destroyOnError=false` 。
14
+ * @param {Object} [options] script 标签属性。比如 `defer` `onload` `onerror` `id` 等,下面列举部分带有默认值或额外扩展的配置。
15
+ * @param {boolean} [options.destroyOnError=true] 如果加载失败或错误,自动删除 dom 中的 script 标签。
16
+ * @param {Object} [options.attrs] 自定义 script 属性,通过 script.setAttribute 设置。
17
+ * @param {boolean} [options.async=true] 异步加载。
18
+ * @param {string} [options.type='text/javascript'] 类型。
17
19
  * @return {Promise<HTMLScriptElement>} 异步返回 script 元素。
18
20
  * @example
19
21
  *
package/types/minus.d.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  * @static
5
5
  * @alias module:Math.minus
6
6
  * @since 3.1.0
7
- * @param {...number|string} nums 相减的数
7
+ * @param {...(number|string)} nums 相减的数
8
8
  * @returns {number} 差
9
9
  * @example
10
10
  *
package/types/plus.d.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  * @static
5
5
  * @alias module:Math.plus
6
6
  * @since 3.1.0
7
- * @param {...number|string} nums 相加的数
7
+ * @param {...(number|string)} nums 相加的数
8
8
  * @returns {number} 总和
9
9
  * @example
10
10
  *
package/types/times.d.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  * @static
5
5
  * @alias module:Math.times
6
6
  * @since 3.1.0
7
- * @param {...number|string} nums 相乘的数
7
+ * @param {...(number|string)} nums 相乘的数
8
8
  * @returns {number} 乘积
9
9
  * @example
10
10
  *
@@ -8,10 +8,10 @@
8
8
  * @param {string} childrenField 子级字段名称
9
9
  * @returns {object[]} 列表数据
10
10
  * @example
11
- * const menus = [{ "id": "1", "name": "首页", "code": "trade", "pid": null }, { "id": "2", "name": "交易管理", "code": "trade", "pid": null, "children": [{ "id": "3", "name": "交易查询", "code": "trade-1", "pid": "2", "children": [{ "id": "4", "name": "交易查询-查询操作", "code": "trade-1-1", "pid": "3" }] }] }, { "id": "5", "name": "权限管理", "code": "authorization", "pid": null, "children": [{ "id": "6", "name": "角色管理", "code": "authorization-1", "pid": "5" }, { "id": "7", "name": "用户管理", "code": "authorization-2", "pid": "5" }] }];
11
+ * const menus = [{ id: '1', name: '首页', code: 'trade', pid: null }, { id: '2', name: '交易管理', code: 'trade', pid: null, children: [{ id: '3', name: '交易查询', code: 'trade-1', pid: '2', children: [{ id: '4', name: '交易查询-查询操作', code: 'trade-1-1', pid: '3' }]}]}, { id: '5', name: '权限管理', code: 'authorization', pid: null, children: [{ id: '6', name: '角色管理', code: 'authorization-1', pid: '5' }, { id: '7', name: '用户管理', code: 'authorization-2', pid: '5' }]}];
12
12
  *
13
13
  * treeToList(menus, 'children'));
14
- * // [{"id":"1","name":"首页","code":"trade","pid":null},{"id":"2","name":"交易管理","code":"trade","pid":null},{"id":"3","name":"交易查询","code":"trade-1","pid":"2"},{"id":"4","name":"交易查询-查询操作","code":"trade-1-1","pid":"3"},{"id":"5","name":"权限管理","code":"authorization","pid":null},{"id":"6","name":"角色管理","code":"authorization-1","pid":"5"},{"id":"7","name":"用户管理","code":"authorization-2","pid":"5"}]
14
+ * // [{id:'1',name:'首页',code:'trade',pid:null},{id:'2',name:'交易管理',code:'trade',pid:null},{id:'3',name:'交易查询',code:'trade-1',pid:'2'},{id:'4',name:'交易查询-查询操作',code:'trade-1-1',pid:'3'},{id:'5',name:'权限管理',code:'authorization',pid:null},{id:'6',name:'角色管理',code:'authorization-1',pid:'5'},{id:'7',name:'用户管理',code:'authorization-2',pid:'5'}]
15
15
  */
16
16
  declare function treeToList<T extends Record<string, any>, K extends keyof T, R extends Omit<T, K>>(tree: T[], childrenField: K): R[];
17
17
  export default treeToList;