@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 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 const rangeOfYears: (start: number, end?: number) => number[];
9
- export interface RecentYearOption {
10
- label: string;
11
- value: number;
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
- * 获取最近n年, 从大到小
15
- * @param recentYears 最近几年
16
- * @param type 控制返回值类型
17
- * @param suffix 后缀,默认为'年'
20
+ * 获取n年, 从大到小
21
+ * @param options
18
22
  */
19
- export declare function getRecentYears(recentYears: number, type: 'number[]'): number[];
20
- export declare function getRecentYears(recentYears: number, type: 'object[]'): RecentYearOption[];
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 const rangeOfYears = (start, end = new Date().getFullYear()) => Array(end - start + 1)
9
- .fill(start)
10
- .map((year, index) => year + index);
11
- export function getRecentYears(recentYears, type, suffix = '年') {
12
- const thisYear = new Date().getFullYear();
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 < recentYears; i++) {
16
- result.push(thisYear - i);
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 < recentYears; i++) {
41
+ for (let i = 0; i < ranges; i++) {
23
42
  result.push({
24
- value: thisYear - i,
25
- label: `${thisYear - i}${suffix}`,
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 url = window.URL.createObjectURL(source);
95
- link.href = url;
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
- link.click();
100
- document.body.removeChild(link);
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
@@ -7,3 +7,4 @@ export * as algorithm from './algorithm';
7
7
  export * as file from './file';
8
8
  export * as support from './support';
9
9
  export * as timer from './timer';
10
+ export * as operator from './operator';
package/dist/index.js CHANGED
@@ -7,3 +7,4 @@ export * as algorithm from './algorithm';
7
7
  export * as file from './file';
8
8
  export * as support from './support';
9
9
  export * as timer from './timer';
10
+ export * as operator from './operator';
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 检查数据类型
3
+ * @param obj
4
+ * @returns
5
+ */
6
+ export declare const trueTypeOf: (obj: unknown) => string;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 检查数据类型
3
+ * @param obj
4
+ * @returns
5
+ */
6
+ export const trueTypeOf = (obj) => Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@d-matrix/utils",
3
3
  "sideEffects": false,
4
- "version": "1.9.2",
4
+ "version": "1.11.0",
5
5
  "description": "A dozen of utils for Front-End Development",
6
6
  "main": "dist/index.js",
7
7
  "scripts": {
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 function getRecentYears(recentYears: number, type: 'number[]'): number[];
149
- export function getRecentYears(recentYears: number, type: 'object[]'): RecentYearOption[];
150
- export function getRecentYears(recentYears: number, type: 'number[]' | 'object[]', suffix = '年'): number[] | RecentYearOption[]
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
- 获取最近n
165
+ 获取n年,`type`传`number[]`,返回`[2023, 2022, 2021]`数字数组;`type`传`object[]`,返回如下的对象数组
154
166
 
155
- ```ts
156
- import { date } from '@d-matrix/utils';
157
-
158
- getRecentYears(5, 'number[]'); // [2024, 2023, 2022, 2021, 2020]
159
- getRecentYears(5, 'object[]');
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" | "_black" | "_parent" | "_top"
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
  运行全部组件测试