@d-matrix/utils 1.9.2 → 1.11.0
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/dist/date.d.ts +19 -11
- package/dist/date.js +29 -10
- package/dist/file.d.ts +6 -6
- package/dist/file.js +55 -4
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/operator.d.ts +6 -0
- package/dist/operator.js +6 -0
- package/package.json +1 -1
- package/readme.md +48 -17
package/dist/date.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
export interface RecentYearOption {
|
|
2
|
+
label: string;
|
|
3
|
+
value: number;
|
|
4
|
+
}
|
|
1
5
|
/**
|
|
2
6
|
* Generates an array of numbers representing a range of years between the start year and the end year.
|
|
3
7
|
*
|
|
@@ -5,16 +9,20 @@
|
|
|
5
9
|
* @param {number} end - the ending year of the range (defaults to the current year)
|
|
6
10
|
* @return {number[]} an array of numbers representing the range of years
|
|
7
11
|
*/
|
|
8
|
-
export declare
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
export declare function rangeOfYears(start: number, end?: number): number[];
|
|
13
|
+
export declare type GetRecentYearsOptions = {
|
|
14
|
+
startYear?: number;
|
|
15
|
+
recentYears?: number;
|
|
16
|
+
endYear?: number;
|
|
17
|
+
suffix?: string;
|
|
18
|
+
};
|
|
13
19
|
/**
|
|
14
|
-
*
|
|
15
|
-
* @param
|
|
16
|
-
* @param type 控制返回值类型
|
|
17
|
-
* @param suffix 后缀,默认为'年'
|
|
20
|
+
* 获取n年, 从大到小
|
|
21
|
+
* @param options
|
|
18
22
|
*/
|
|
19
|
-
export declare function
|
|
20
|
-
|
|
23
|
+
export declare function getYears(options: GetRecentYearsOptions & {
|
|
24
|
+
type: 'number[]';
|
|
25
|
+
}): number[];
|
|
26
|
+
export declare function getYears(options: GetRecentYearsOptions & {
|
|
27
|
+
type: 'object[]';
|
|
28
|
+
}): RecentYearOption[];
|
package/dist/date.js
CHANGED
|
@@ -5,24 +5,43 @@
|
|
|
5
5
|
* @param {number} end - the ending year of the range (defaults to the current year)
|
|
6
6
|
* @return {number[]} an array of numbers representing the range of years
|
|
7
7
|
*/
|
|
8
|
-
export
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
export function rangeOfYears(start, end = new Date().getFullYear()) {
|
|
9
|
+
return Array(end - start + 1)
|
|
10
|
+
.fill(start)
|
|
11
|
+
.map((year, index) => year + index);
|
|
12
|
+
}
|
|
13
|
+
export function getYears(options) {
|
|
14
|
+
const { recentYears = 0, startYear, endYear, suffix = '年', type } = options;
|
|
15
|
+
const endY = endYear ? endYear : new Date().getFullYear();
|
|
16
|
+
let ranges = recentYears;
|
|
17
|
+
if (typeof startYear === 'number') {
|
|
18
|
+
// 包含startYear
|
|
19
|
+
ranges = endY - startYear + 1;
|
|
20
|
+
if (ranges <= 0) {
|
|
21
|
+
if (process.env.NODE_ENV === 'development') {
|
|
22
|
+
if (endYear === undefined) {
|
|
23
|
+
console.error('startYear不能大于当前年份');
|
|
24
|
+
}
|
|
25
|
+
else if (typeof endYear === 'number') {
|
|
26
|
+
console.error('endYear不能小于startYear');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
13
32
|
if (type === 'number[]') {
|
|
14
33
|
const result = [];
|
|
15
|
-
for (let i = 0; i <
|
|
16
|
-
result.push(
|
|
34
|
+
for (let i = 0; i < ranges; i++) {
|
|
35
|
+
result.push(endY - i);
|
|
17
36
|
}
|
|
18
37
|
return result;
|
|
19
38
|
}
|
|
20
39
|
if (type === 'object[]') {
|
|
21
40
|
const result = [];
|
|
22
|
-
for (let i = 0; i <
|
|
41
|
+
for (let i = 0; i < ranges; i++) {
|
|
23
42
|
result.push({
|
|
24
|
-
value:
|
|
25
|
-
label: `${
|
|
43
|
+
value: endY - i,
|
|
44
|
+
label: `${endY - i}${suffix}`,
|
|
26
45
|
});
|
|
27
46
|
}
|
|
28
47
|
return result;
|
package/dist/file.d.ts
CHANGED
|
@@ -38,12 +38,12 @@ export declare function getFilenameFromContentDispositionHeader(header: {
|
|
|
38
38
|
}): string;
|
|
39
39
|
declare const HyperLinkTargets: readonly ["_self", "_blank", "_parent", "_top"];
|
|
40
40
|
export declare type HyperLinkTarget = (typeof HyperLinkTargets)[number];
|
|
41
|
-
/**
|
|
42
|
-
* 文件下载
|
|
43
|
-
* @param source 文件地址或blob对象
|
|
44
|
-
* @param fileName 文件名
|
|
45
|
-
* @param isPreview 是否
|
|
46
|
-
*/
|
|
47
41
|
export declare function download(source: Blob, fileName?: string): void;
|
|
48
42
|
export declare function download(source: string, fileName?: string, target?: HyperLinkTarget): void;
|
|
43
|
+
/**
|
|
44
|
+
* 通过创建iframe进行文件下载
|
|
45
|
+
* @param source
|
|
46
|
+
* @returns
|
|
47
|
+
*/
|
|
48
|
+
export declare function downloadFileByIframe(source: string): boolean;
|
|
49
49
|
export {};
|
package/dist/file.js
CHANGED
|
@@ -79,9 +79,32 @@ export function getFilenameFromContentDispositionHeader(header) {
|
|
|
79
79
|
return decodeURIComponent(filename);
|
|
80
80
|
}
|
|
81
81
|
const HyperLinkTargets = ['_self', '_blank', '_parent', '_top'];
|
|
82
|
+
/**
|
|
83
|
+
* 文件下载
|
|
84
|
+
* @param source 文件地址或blob对象
|
|
85
|
+
* @param fileName 文件名
|
|
86
|
+
* @param isPreview 是否
|
|
87
|
+
*/
|
|
88
|
+
// `a.click()` doesn't work for all browsers (#465)
|
|
89
|
+
function click(node) {
|
|
90
|
+
try {
|
|
91
|
+
node.dispatchEvent(new MouseEvent('click'));
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
var evt = document.createEvent('MouseEvents');
|
|
95
|
+
evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null);
|
|
96
|
+
node.dispatchEvent(evt);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
82
99
|
export function download(source, fileName = '', target) {
|
|
83
100
|
const link = document.createElement('a');
|
|
84
101
|
if (typeof source === 'string') {
|
|
102
|
+
if (!source.length) {
|
|
103
|
+
if (process.env.NODE_ENV === 'development') {
|
|
104
|
+
console.error('下载失败,原因:source为空字符串');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
85
108
|
if (typeof target === 'string' && HyperLinkTargets.includes(target)) {
|
|
86
109
|
link.target = target;
|
|
87
110
|
}
|
|
@@ -90,12 +113,40 @@ export function download(source, fileName = '', target) {
|
|
|
90
113
|
}
|
|
91
114
|
link.href = source;
|
|
92
115
|
}
|
|
116
|
+
let objectURL;
|
|
93
117
|
if (source instanceof Blob) {
|
|
94
|
-
const
|
|
95
|
-
link.href =
|
|
118
|
+
const objectURL = window.URL.createObjectURL(source);
|
|
119
|
+
link.href = objectURL;
|
|
96
120
|
link.download = fileName;
|
|
97
121
|
}
|
|
98
122
|
document.body.appendChild(link);
|
|
99
|
-
|
|
100
|
-
|
|
123
|
+
click(link);
|
|
124
|
+
setTimeout(() => {
|
|
125
|
+
if (typeof objectURL === 'string') {
|
|
126
|
+
window.URL.revokeObjectURL(objectURL);
|
|
127
|
+
}
|
|
128
|
+
document.body.removeChild(link);
|
|
129
|
+
}, 4e4); // 40S
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 通过创建iframe进行文件下载
|
|
133
|
+
* @param source
|
|
134
|
+
* @returns
|
|
135
|
+
*/
|
|
136
|
+
export function downloadFileByIframe(source) {
|
|
137
|
+
const httpsPath = source.replace(/http:\/\//, "https://");
|
|
138
|
+
const iframes = document.getElementsByTagName("iframe");
|
|
139
|
+
if (iframes.length === 0 ||
|
|
140
|
+
(iframes.length > 0 && iframes[0].className === "fill" && iframes[iframes.length - 1].className === "fill")) {
|
|
141
|
+
const element = document.createElement("iframe");
|
|
142
|
+
element.style.display = "none";
|
|
143
|
+
element.src = httpsPath;
|
|
144
|
+
document.body.appendChild(element);
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
if (iframes.length > 0 && iframes[iframes.length - 1].className !== "fill") {
|
|
148
|
+
iframes[0].src = httpsPath;
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
return false;
|
|
101
152
|
}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/operator.js
ADDED
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -16,6 +16,7 @@ A dozen of utils for Front-End Development
|
|
|
16
16
|
- [file](#file)
|
|
17
17
|
- [support](#support)
|
|
18
18
|
- [timer](#timer)
|
|
19
|
+
- [operator](#operator)
|
|
19
20
|
|
|
20
21
|
### clipboard
|
|
21
22
|
|
|
@@ -145,27 +146,34 @@ dom.strip('测试<em>高亮</em>测试'); // '测试高亮测试'
|
|
|
145
146
|
- `getRecentYears()`
|
|
146
147
|
|
|
147
148
|
```ts
|
|
148
|
-
export
|
|
149
|
-
|
|
150
|
-
|
|
149
|
+
export type GetRecentYearsOptions = {
|
|
150
|
+
// 开始年份
|
|
151
|
+
startYear?: number;
|
|
152
|
+
// 最近几年
|
|
153
|
+
recentYears?: number;
|
|
154
|
+
// 截止年份
|
|
155
|
+
endYear?: number;
|
|
156
|
+
// 后缀,默认为'年'
|
|
157
|
+
suffix?: string;
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
export function getYears(options: GetRecentYearsOptions & { type: 'number[]' }): number[];
|
|
161
|
+
export function getYears(options: GetRecentYearsOptions & { type: 'object[]' }): RecentYearOption[];
|
|
162
|
+
export function getYears(options: GetRecentYearsOptions & { type: 'object[]' | 'number[]' }): number[] | RecentYearOption[]
|
|
151
163
|
```
|
|
152
164
|
|
|
153
|
-
|
|
165
|
+
获取n年,`type`传`number[]`,返回`[2023, 2022, 2021]`数字数组;`type`传`object[]`,返回如下的对象数组
|
|
154
166
|
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
// { value: 2024, label: '2024年' },
|
|
162
|
-
// { value: 2023, label: '2023年' },
|
|
163
|
-
// { value: 2022, label: '2022年' },
|
|
164
|
-
// { value: 2021, label: '2021年' },
|
|
165
|
-
// { value: 2020, label: '2020年' },
|
|
166
|
-
// ]
|
|
167
|
+
```sh
|
|
168
|
+
[
|
|
169
|
+
{ value: 2023, label: '2023年' },
|
|
170
|
+
{ value: 2022, label: '2022年' },
|
|
171
|
+
{ value: 2021, label: '2021年' },
|
|
172
|
+
]
|
|
167
173
|
```
|
|
168
174
|
|
|
175
|
+
更多用法,见[测试用例](./tests/date.cy.ts)
|
|
176
|
+
|
|
169
177
|
### types
|
|
170
178
|
|
|
171
179
|
- `WithOptional<T, K extends keyof T>`
|
|
@@ -240,9 +248,13 @@ const filename = file.getFilenameFromContentDispositionHeader(header);
|
|
|
240
248
|
文件下载,`source`是文件地址或`blob`对象。
|
|
241
249
|
|
|
242
250
|
```ts
|
|
243
|
-
type HyperLinkTarget = "_self" | "
|
|
251
|
+
type HyperLinkTarget = "_self" | "_blank" | "_parent" | "_top"
|
|
244
252
|
```
|
|
245
253
|
|
|
254
|
+
- `downloadFileByIframe(source: string): boolean`
|
|
255
|
+
|
|
256
|
+
通过创建`iframe`进行文件下载
|
|
257
|
+
|
|
246
258
|
## support
|
|
247
259
|
|
|
248
260
|
- `isBrowserEnv(): boolean`
|
|
@@ -268,6 +280,25 @@ await sleep(3000); // 暂停3秒
|
|
|
268
280
|
console.log('continue'); // 继续执行
|
|
269
281
|
```
|
|
270
282
|
|
|
283
|
+
## operator
|
|
284
|
+
|
|
285
|
+
- `trueTypeOf = (obj: unknown): string`
|
|
286
|
+
|
|
287
|
+
检查数据类型
|
|
288
|
+
|
|
289
|
+
```ts
|
|
290
|
+
trueTypeOf([]); // array
|
|
291
|
+
trueTypeOf({}); // object
|
|
292
|
+
trueTypeOf(''); // string
|
|
293
|
+
trueTypeOf(new Date()); // date
|
|
294
|
+
trueTypeOf(1); // number
|
|
295
|
+
trueTypeOf(function () {}); // function
|
|
296
|
+
trueTypeOf(/test/i); // regexp
|
|
297
|
+
trueTypeOf(true); // boolean
|
|
298
|
+
trueTypeOf(null); // null
|
|
299
|
+
trueTypeOf(undefined); // undefined
|
|
300
|
+
```
|
|
301
|
+
|
|
271
302
|
## 测试
|
|
272
303
|
|
|
273
304
|
运行全部组件测试
|