@astrolimit/fc-utils 25.12.18
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/index.d.ts +157 -0
- package/dist/index.js +452 -0
- package/package.json +30 -0
- package/readme.md +6 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
//#region src/debounce.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* 防抖函数工具
|
|
4
|
+
* 在指定时间内只执行最后一次函数调用
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 防抖函数
|
|
8
|
+
* @param fn - 要防抖的函数
|
|
9
|
+
* @param wait - 等待时间(毫秒)
|
|
10
|
+
* @returns 防抖后的函数
|
|
11
|
+
*/
|
|
12
|
+
declare function debounce<T extends (...args: any[]) => any>(fn: T, wait: number): (...args: Parameters<T>) => void;
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region src/toarray.d.ts
|
|
15
|
+
declare function toArray(value: any): any[];
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region src/tostring.d.ts
|
|
18
|
+
/**
|
|
19
|
+
* 转换为字符串工具
|
|
20
|
+
* 将值转换为字符串表示
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* 将值转换为字符串
|
|
24
|
+
* @param val - 要转换的值
|
|
25
|
+
* @returns 字符串表示
|
|
26
|
+
*/
|
|
27
|
+
declare function toString(val: any): string;
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region src/topromise.d.ts
|
|
30
|
+
declare function toPromise(value: any): any;
|
|
31
|
+
//#endregion
|
|
32
|
+
//#region src/toline.d.ts
|
|
33
|
+
declare function toLine(name: string): string;
|
|
34
|
+
//#endregion
|
|
35
|
+
//#region src/todate.d.ts
|
|
36
|
+
declare function toDate(timeStamp: number | string | Date): string | number | Date;
|
|
37
|
+
//#endregion
|
|
38
|
+
//#region src/deepextend.d.ts
|
|
39
|
+
/**
|
|
40
|
+
* 深度扩展对象
|
|
41
|
+
* @param origin - 源对象
|
|
42
|
+
* @param target - 目标对象,默认为空对象
|
|
43
|
+
* @param mode - 模式:true 表示使用 getRule,false 表示使用 _clone,undefined 表示普通模式
|
|
44
|
+
* @returns 扩展后的对象
|
|
45
|
+
*/
|
|
46
|
+
declare function deepExtend<T extends Record<string, any> | any[]>(origin: T, target?: any, mode?: boolean): T;
|
|
47
|
+
/**
|
|
48
|
+
* 深度复制对象
|
|
49
|
+
* @param value - 要复制的值
|
|
50
|
+
* @returns 复制后的值
|
|
51
|
+
*/
|
|
52
|
+
declare function deepCopy<T>(value: T): T;
|
|
53
|
+
/**
|
|
54
|
+
* 深度扩展多个对象
|
|
55
|
+
* @param origin - 源对象
|
|
56
|
+
* @param lst - 要扩展的对象列表
|
|
57
|
+
* @returns 扩展后的对象
|
|
58
|
+
*/
|
|
59
|
+
declare function deepExtendArgs<T extends Record<string, any> | any[]>(origin: T, ...lst: any[]): T;
|
|
60
|
+
//#endregion
|
|
61
|
+
//#region src/extend.d.ts
|
|
62
|
+
declare function extend(): any;
|
|
63
|
+
declare function copy<T>(obj: T): T;
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region src/json.d.ts
|
|
66
|
+
declare function toJson(obj: Record<string | number, any>, space: number): string;
|
|
67
|
+
declare function parseFn(fn: string, mode: boolean): any;
|
|
68
|
+
declare function parseJson(json: string, mode: boolean): any;
|
|
69
|
+
//#endregion
|
|
70
|
+
//#region src/modify.d.ts
|
|
71
|
+
declare function $set<T extends Record<string, any>, K extends keyof T>(target: T, field: K, value: T[K]): void;
|
|
72
|
+
declare function $del<T extends Record<string, any>, K extends keyof T>(target: T, field: K): void;
|
|
73
|
+
//#endregion
|
|
74
|
+
//#region src/type.d.ts
|
|
75
|
+
/**
|
|
76
|
+
* 类型检查工具
|
|
77
|
+
* 提供各种类型判断方法
|
|
78
|
+
*/
|
|
79
|
+
declare const is: {
|
|
80
|
+
readonly availStr: (val: any) => boolean;
|
|
81
|
+
/**
|
|
82
|
+
* 检查参数是否为指定类型
|
|
83
|
+
*/
|
|
84
|
+
readonly type: (arg: any, type: string) => boolean;
|
|
85
|
+
/**
|
|
86
|
+
* 检查值是否为 undefined 或 null
|
|
87
|
+
*/
|
|
88
|
+
readonly Nil: (v: any) => boolean;
|
|
89
|
+
/**
|
|
90
|
+
* 检查值是否为 undefined 或 null
|
|
91
|
+
*/
|
|
92
|
+
readonly Undef: (v: any) => boolean;
|
|
93
|
+
/**
|
|
94
|
+
* 检查是否为 DOM 元素
|
|
95
|
+
*/
|
|
96
|
+
readonly Element: (arg: any) => boolean;
|
|
97
|
+
/**
|
|
98
|
+
* 检查是否为非空数组
|
|
99
|
+
*/
|
|
100
|
+
readonly trueArray: (data: any) => boolean;
|
|
101
|
+
/**
|
|
102
|
+
* 检查是否为函数
|
|
103
|
+
*/
|
|
104
|
+
readonly Function: (v: any) => boolean;
|
|
105
|
+
/**
|
|
106
|
+
* 获取值的类型名称
|
|
107
|
+
*/
|
|
108
|
+
readonly getType: (v: any) => string;
|
|
109
|
+
/**
|
|
110
|
+
* 检查值是否为空
|
|
111
|
+
*/
|
|
112
|
+
readonly empty: (value: any) => boolean;
|
|
113
|
+
readonly Date: (arg: any) => boolean;
|
|
114
|
+
readonly Object: (arg: any) => boolean;
|
|
115
|
+
readonly String: (arg: any) => boolean;
|
|
116
|
+
readonly Boolean: (arg: any) => boolean;
|
|
117
|
+
readonly Array: (arg: any) => boolean;
|
|
118
|
+
readonly Number: (arg: any) => boolean;
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* 检查对象是否具有指定属性
|
|
122
|
+
* @param rule - 要检查的对象
|
|
123
|
+
* @param k - 属性名
|
|
124
|
+
* @returns 是否具有该属性
|
|
125
|
+
*/
|
|
126
|
+
declare function hasProperty(rule: any, k: string): boolean;
|
|
127
|
+
//#endregion
|
|
128
|
+
//#region src/unique.d.ts
|
|
129
|
+
declare function uniqueId(): string;
|
|
130
|
+
declare function shortKey(): string;
|
|
131
|
+
//#endregion
|
|
132
|
+
//#region src/slot.d.ts
|
|
133
|
+
declare function getSlot(slots: Record<string, any>, exclude: string[]): Record<string, any>;
|
|
134
|
+
//#endregion
|
|
135
|
+
//#region src/deepset.d.ts
|
|
136
|
+
declare function deepSet<T extends Record<string, any>>(data: T, idx: string, val: any): T;
|
|
137
|
+
//#endregion
|
|
138
|
+
//#region src/mitt.d.ts
|
|
139
|
+
interface IHandler {
|
|
140
|
+
(...args: any[]): void;
|
|
141
|
+
_once?: boolean;
|
|
142
|
+
}
|
|
143
|
+
declare function Mitt<T extends string>(all: Map<T | "*", Array<IHandler>>): {
|
|
144
|
+
readonly $on: (type: T, handler: IHandler) => void;
|
|
145
|
+
readonly $once: (type: T, handler: IHandler) => void;
|
|
146
|
+
readonly $off: (type: T, handler: IHandler) => void;
|
|
147
|
+
readonly $emit: (type: T, ...args: any[]) => void;
|
|
148
|
+
};
|
|
149
|
+
//#endregion
|
|
150
|
+
//#region src/tocase.d.ts
|
|
151
|
+
declare function toCase(str: string): string;
|
|
152
|
+
declare function lower(str: string): string;
|
|
153
|
+
//#endregion
|
|
154
|
+
//#region src/mergeprops.d.ts
|
|
155
|
+
declare const mergeProps: (objects: Array<Record<string, any>>, initial?: Record<string, any>, opt?: Record<string, any>) => Record<string, any>;
|
|
156
|
+
//#endregion
|
|
157
|
+
export { $del, $set, Mitt, copy, debounce, deepCopy, deepExtend, deepExtendArgs, deepSet, extend, getSlot, hasProperty, is, lower, mergeProps, parseFn, parseJson, shortKey, toArray, toCase, toDate, toJson, toLine, toPromise, toString, uniqueId };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
import { isString } from "lodash-es";
|
|
2
|
+
import dayjs from "dayjs";
|
|
3
|
+
|
|
4
|
+
//#region src/debounce.ts
|
|
5
|
+
/**
|
|
6
|
+
* 防抖函数工具
|
|
7
|
+
* 在指定时间内只执行最后一次函数调用
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 防抖函数
|
|
11
|
+
* @param fn - 要防抖的函数
|
|
12
|
+
* @param wait - 等待时间(毫秒)
|
|
13
|
+
* @returns 防抖后的函数
|
|
14
|
+
*/
|
|
15
|
+
function debounce(fn, wait) {
|
|
16
|
+
let timeout = null;
|
|
17
|
+
return function(...arg) {
|
|
18
|
+
if (timeout !== null) clearTimeout(timeout);
|
|
19
|
+
timeout = setTimeout(() => fn.call(this, ...arg), wait);
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/toarray.ts
|
|
25
|
+
function toArray(value) {
|
|
26
|
+
return Array.isArray(value) ? value : [
|
|
27
|
+
null,
|
|
28
|
+
void 0,
|
|
29
|
+
""
|
|
30
|
+
].indexOf(value) > -1 ? [] : [value];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
//#endregion
|
|
34
|
+
//#region src/tostring.ts
|
|
35
|
+
/**
|
|
36
|
+
* 转换为字符串工具
|
|
37
|
+
* 将值转换为字符串表示
|
|
38
|
+
*/
|
|
39
|
+
/**
|
|
40
|
+
* 将值转换为字符串
|
|
41
|
+
* @param val - 要转换的值
|
|
42
|
+
* @returns 字符串表示
|
|
43
|
+
*/
|
|
44
|
+
function toString(val) {
|
|
45
|
+
return val == null ? "" : typeof val === "object" ? JSON.stringify(val, null, 2) : String(val);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
//#endregion
|
|
49
|
+
//#region src/topromise.ts
|
|
50
|
+
function isPromise(value) {
|
|
51
|
+
return value && typeof value === "object" && typeof value.then === "function";
|
|
52
|
+
}
|
|
53
|
+
function toPromise(value) {
|
|
54
|
+
if (isPromise(value)) return value;
|
|
55
|
+
return Promise.resolve(value);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
//#endregion
|
|
59
|
+
//#region src/toline.ts
|
|
60
|
+
function toLine(name) {
|
|
61
|
+
let line = name.replace(/([A-Z])/g, "-$1").toLocaleLowerCase();
|
|
62
|
+
if (line.indexOf("-") === 0) line = line.substr(1);
|
|
63
|
+
return line;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
//#endregion
|
|
67
|
+
//#region src/type.ts
|
|
68
|
+
/**
|
|
69
|
+
* 类型检查工具
|
|
70
|
+
* 提供各种类型判断方法
|
|
71
|
+
*/
|
|
72
|
+
const is = {
|
|
73
|
+
availStr(val) {
|
|
74
|
+
return isString(val) && val.trim() != "";
|
|
75
|
+
},
|
|
76
|
+
type(arg, type) {
|
|
77
|
+
return Object.prototype.toString.call(arg) === "[object " + type + "]";
|
|
78
|
+
},
|
|
79
|
+
Nil(v) {
|
|
80
|
+
return v === null || v === void 0;
|
|
81
|
+
},
|
|
82
|
+
Undef(v) {
|
|
83
|
+
return v === void 0 || v === null;
|
|
84
|
+
},
|
|
85
|
+
Element(arg) {
|
|
86
|
+
return typeof arg === "object" && arg !== null && arg.nodeType === 1 && !is.Object(arg);
|
|
87
|
+
},
|
|
88
|
+
trueArray(data) {
|
|
89
|
+
return Array.isArray(data) && data.length > 0;
|
|
90
|
+
},
|
|
91
|
+
Function(v) {
|
|
92
|
+
const type = this.getType(v);
|
|
93
|
+
return type === "Function" || type === "AsyncFunction";
|
|
94
|
+
},
|
|
95
|
+
getType(v) {
|
|
96
|
+
const str = Object.prototype.toString.call(v);
|
|
97
|
+
const match = /^\[object (.*)\]$/.exec(str);
|
|
98
|
+
return match ? match[1] : "";
|
|
99
|
+
},
|
|
100
|
+
empty(value) {
|
|
101
|
+
if (value === void 0 || value === null) return true;
|
|
102
|
+
if (Array.isArray(value) && !value.length) return true;
|
|
103
|
+
return typeof value === "string" && !value;
|
|
104
|
+
},
|
|
105
|
+
Date(arg) {
|
|
106
|
+
return is.type(arg, "Date");
|
|
107
|
+
},
|
|
108
|
+
Object(arg) {
|
|
109
|
+
return is.type(arg, "Object");
|
|
110
|
+
},
|
|
111
|
+
String(arg) {
|
|
112
|
+
return is.type(arg, "String");
|
|
113
|
+
},
|
|
114
|
+
Boolean(arg) {
|
|
115
|
+
return is.type(arg, "Boolean");
|
|
116
|
+
},
|
|
117
|
+
Array(arg) {
|
|
118
|
+
return is.type(arg, "Array");
|
|
119
|
+
},
|
|
120
|
+
Number(arg) {
|
|
121
|
+
return is.type(arg, "Number");
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* 检查对象是否具有指定属性
|
|
126
|
+
* @param rule - 要检查的对象
|
|
127
|
+
* @param k - 属性名
|
|
128
|
+
* @returns 是否具有该属性
|
|
129
|
+
*/
|
|
130
|
+
function hasProperty(rule, k) {
|
|
131
|
+
return {}.hasOwnProperty.call(rule, k);
|
|
132
|
+
}
|
|
133
|
+
var type_default = is;
|
|
134
|
+
|
|
135
|
+
//#endregion
|
|
136
|
+
//#region src/todate.ts
|
|
137
|
+
function toDate(timeStamp) {
|
|
138
|
+
if (type_default.Date(timeStamp)) return timeStamp;
|
|
139
|
+
else {
|
|
140
|
+
let date = new Date(timeStamp);
|
|
141
|
+
return date.toString() === "Invalid Date" ? timeStamp : date;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
//#endregion
|
|
146
|
+
//#region src/modify.ts
|
|
147
|
+
function $set(target, field, value) {
|
|
148
|
+
target[field] = value;
|
|
149
|
+
}
|
|
150
|
+
function $del(target, field) {
|
|
151
|
+
delete target[field];
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
//#endregion
|
|
155
|
+
//#region src/deepextend.ts
|
|
156
|
+
/**
|
|
157
|
+
* 深度扩展对象
|
|
158
|
+
* @param origin - 源对象
|
|
159
|
+
* @param target - 目标对象,默认为空对象
|
|
160
|
+
* @param mode - 模式:true 表示使用 getRule,false 表示使用 _clone,undefined 表示普通模式
|
|
161
|
+
* @returns 扩展后的对象
|
|
162
|
+
*/
|
|
163
|
+
function deepExtend(origin, target = {}, mode) {
|
|
164
|
+
let isArr = false;
|
|
165
|
+
const originObj = origin;
|
|
166
|
+
for (const key in target) if (Object.prototype.hasOwnProperty.call(target, key)) {
|
|
167
|
+
let clone = target[key];
|
|
168
|
+
const isObject = typeof clone === "object" && clone !== null && !Array.isArray(clone);
|
|
169
|
+
if ((isArr = Array.isArray(clone)) || isObject) {
|
|
170
|
+
const nst = originObj[key] === void 0;
|
|
171
|
+
if (isArr) {
|
|
172
|
+
isArr = false;
|
|
173
|
+
if (nst) $set(originObj, key, []);
|
|
174
|
+
} else if (clone._clone && mode !== void 0) if (mode) {
|
|
175
|
+
clone = clone.getRule?.();
|
|
176
|
+
if (nst) $set(originObj, key, {});
|
|
177
|
+
} else {
|
|
178
|
+
$set(originObj, key, clone._clone());
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
else if (nst) $set(originObj, key, {});
|
|
182
|
+
originObj[key] = deepExtend(originObj[key], clone, mode);
|
|
183
|
+
} else {
|
|
184
|
+
$set(originObj, key, clone);
|
|
185
|
+
if (!type_default.Undef(clone)) {
|
|
186
|
+
if (!type_default.Undef(clone.__json)) originObj[key].__json = clone.__json;
|
|
187
|
+
if (!type_default.Undef(clone.__origin)) originObj[key].__origin = clone.__origin;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return mode !== void 0 && Array.isArray(origin) ? origin.filter((v) => !v || !v.__ctrl) : origin;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* 深度复制对象
|
|
195
|
+
* @param value - 要复制的值
|
|
196
|
+
* @returns 复制后的值
|
|
197
|
+
*/
|
|
198
|
+
function deepCopy(value) {
|
|
199
|
+
return deepExtend({}, { value }).value;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* 深度扩展多个对象
|
|
203
|
+
* @param origin - 源对象
|
|
204
|
+
* @param lst - 要扩展的对象列表
|
|
205
|
+
* @returns 扩展后的对象
|
|
206
|
+
*/
|
|
207
|
+
function deepExtendArgs(origin, ...lst) {
|
|
208
|
+
lst.forEach((target) => {
|
|
209
|
+
origin = deepExtend(origin, target);
|
|
210
|
+
});
|
|
211
|
+
return origin;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
//#endregion
|
|
215
|
+
//#region src/extend.ts
|
|
216
|
+
const _extends = Object.assign || function(a) {
|
|
217
|
+
for (let b, c = 1; c < arguments.length; c++) for (let d in b = arguments[c], b) Object.prototype.hasOwnProperty.call(b, d) && $set(a, d, b[d]);
|
|
218
|
+
return a;
|
|
219
|
+
};
|
|
220
|
+
function extend() {
|
|
221
|
+
return _extends.apply(this, arguments);
|
|
222
|
+
}
|
|
223
|
+
function copy(obj) {
|
|
224
|
+
if (typeof obj !== "object" || obj === null) return obj;
|
|
225
|
+
return obj instanceof Array ? [...obj] : { ...obj };
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
//#endregion
|
|
229
|
+
//#region src/console.ts
|
|
230
|
+
/**
|
|
231
|
+
* 格式化消息
|
|
232
|
+
* @param type - 消息类型
|
|
233
|
+
* @param msg - 消息内容
|
|
234
|
+
* @param rule - 规则对象(可选)
|
|
235
|
+
* @returns 格式化后的消息字符串
|
|
236
|
+
*/
|
|
237
|
+
function format(type, msg, rule) {
|
|
238
|
+
return `[form-create ${type}]: ${msg}` + (rule ? "\n\nrule: " + JSON.stringify(rule.getRule ? rule.getRule() : rule) : "");
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* 输出错误信息
|
|
242
|
+
* @param msg - 错误消息
|
|
243
|
+
* @param rule - 规则对象(可选)
|
|
244
|
+
*/
|
|
245
|
+
function err(msg, rule) {
|
|
246
|
+
console.error(format("err", msg, rule));
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
//#endregion
|
|
250
|
+
//#region src/json.ts
|
|
251
|
+
const PREFIX = "[[FORM-CREATE-PREFIX-";
|
|
252
|
+
const SUFFIX = "-FORM-CREATE-SUFFIX]]";
|
|
253
|
+
function toJson(obj, space) {
|
|
254
|
+
return JSON.stringify(deepExtend(Array.isArray(obj) ? [] : {}, obj, true), function(key, val) {
|
|
255
|
+
if (val && val._isVue === true) return void 0;
|
|
256
|
+
if (typeof val !== "function") return val;
|
|
257
|
+
if (val.__json) return val.__json;
|
|
258
|
+
if (val.__origin) val = val.__origin;
|
|
259
|
+
if (val.__emit) return void 0;
|
|
260
|
+
return PREFIX + val + SUFFIX;
|
|
261
|
+
}, space);
|
|
262
|
+
}
|
|
263
|
+
function makeFn(fn) {
|
|
264
|
+
return new Function("return " + fn)();
|
|
265
|
+
}
|
|
266
|
+
function parseFn(fn, mode) {
|
|
267
|
+
if (fn && type_default.String(fn) && fn.length > 4) {
|
|
268
|
+
let v = fn.trim();
|
|
269
|
+
let flag = false;
|
|
270
|
+
try {
|
|
271
|
+
if (v.indexOf(SUFFIX) > 0 && v.indexOf(PREFIX) === 0) {
|
|
272
|
+
v = v.replace(SUFFIX, "").replace(PREFIX, "");
|
|
273
|
+
flag = true;
|
|
274
|
+
} else if (v.indexOf("$FN:") === 0) {
|
|
275
|
+
v = v.substring(4);
|
|
276
|
+
flag = true;
|
|
277
|
+
} else if (v.indexOf("$EXEC:") === 0) {
|
|
278
|
+
v = v.substring(6);
|
|
279
|
+
flag = true;
|
|
280
|
+
} else if (v.indexOf("$GLOBAL:") === 0) {
|
|
281
|
+
const name = v.substring(8);
|
|
282
|
+
v = function(...args) {
|
|
283
|
+
const callback = args[0].api.getGlobalEvent(name);
|
|
284
|
+
if (callback) return callback.call(this, ...args);
|
|
285
|
+
};
|
|
286
|
+
v.__json = fn;
|
|
287
|
+
v.__inject = true;
|
|
288
|
+
return v;
|
|
289
|
+
} else if (v.indexOf("$FNX:") === 0) {
|
|
290
|
+
v = makeFn("function($inject){\n" + v.substring(5) + "\n}");
|
|
291
|
+
v.__json = fn;
|
|
292
|
+
v.__inject = true;
|
|
293
|
+
return v;
|
|
294
|
+
} else if (!mode && v.indexOf("function ") === 0 && v !== "function ") flag = true;
|
|
295
|
+
else if (!mode && v.indexOf("function(") === 0 && v !== "function(") flag = true;
|
|
296
|
+
if (!flag) return fn;
|
|
297
|
+
let val;
|
|
298
|
+
try {
|
|
299
|
+
val = makeFn(v);
|
|
300
|
+
} catch (e) {
|
|
301
|
+
val = makeFn("function " + v);
|
|
302
|
+
}
|
|
303
|
+
val.__json = fn;
|
|
304
|
+
return val;
|
|
305
|
+
} catch (e) {
|
|
306
|
+
err(`解析失败:${v}\n\nerr: ${e}`);
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return fn;
|
|
311
|
+
}
|
|
312
|
+
function parseJson(json, mode) {
|
|
313
|
+
return JSON.parse(json, function(k, v) {
|
|
314
|
+
if (type_default.Undef(v) || !v.indexOf) return v;
|
|
315
|
+
return parseFn(v, mode);
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
//#endregion
|
|
320
|
+
//#region src/unique.ts
|
|
321
|
+
var NumIdSingleton = class NumIdSingleton {
|
|
322
|
+
static _value = 36;
|
|
323
|
+
get value() {
|
|
324
|
+
NumIdSingleton._value = NumIdSingleton._value + 1;
|
|
325
|
+
if (NumIdSingleton._value > 1200) NumIdSingleton._value = 36;
|
|
326
|
+
return NumIdSingleton._value.toString(36);
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
const numId = new NumIdSingleton();
|
|
330
|
+
let id = 0;
|
|
331
|
+
function uniqueId() {
|
|
332
|
+
const num = 370 + ++id;
|
|
333
|
+
return "F" + Math.random().toString(36).substr(3, 3) + Number(`${Date.now()}`).toString(36) + num.toString(36) + "c";
|
|
334
|
+
}
|
|
335
|
+
function shortKey() {
|
|
336
|
+
return Number(`${dayjs().diff(dayjs("2025-01-01"), "millisecond")}`).toString(36) + numId.value;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
//#endregion
|
|
340
|
+
//#region src/slot.ts
|
|
341
|
+
function getSlot(slots, exclude) {
|
|
342
|
+
return Object.keys(slots).reduce((lst, name) => {
|
|
343
|
+
if (!exclude || exclude.indexOf(name) === -1) lst[name] = slots[name];
|
|
344
|
+
return lst;
|
|
345
|
+
}, {});
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
//#endregion
|
|
349
|
+
//#region src/deepset.ts
|
|
350
|
+
function deepSet(data, idx, val) {
|
|
351
|
+
let _data = data, to;
|
|
352
|
+
(idx || "").split(".").forEach((v) => {
|
|
353
|
+
if (to) {
|
|
354
|
+
if (!_data[to] || typeof _data[to] != "object") _data[to] = {};
|
|
355
|
+
_data = _data[to];
|
|
356
|
+
}
|
|
357
|
+
to = v;
|
|
358
|
+
});
|
|
359
|
+
_data[to] = val;
|
|
360
|
+
return _data;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
//#endregion
|
|
364
|
+
//#region src/mitt.ts
|
|
365
|
+
function Mitt(all) {
|
|
366
|
+
all = all || /* @__PURE__ */ new Map();
|
|
367
|
+
const mitt = {
|
|
368
|
+
$on(type, handler) {
|
|
369
|
+
const handlers = all.get(type);
|
|
370
|
+
if (!(handlers && handlers.push(handler))) all.set(type, [handler]);
|
|
371
|
+
},
|
|
372
|
+
$once(type, handler) {
|
|
373
|
+
handler._once = true;
|
|
374
|
+
mitt.$on(type, handler);
|
|
375
|
+
},
|
|
376
|
+
$off(type, handler) {
|
|
377
|
+
const handlers = all.get(type);
|
|
378
|
+
if (handlers) handlers.splice(handlers.indexOf(handler) >>> 0, 1);
|
|
379
|
+
},
|
|
380
|
+
$emit(type, ...args) {
|
|
381
|
+
(all.get(type) || []).slice().map((handler) => {
|
|
382
|
+
if (handler._once) {
|
|
383
|
+
mitt.$off(type, handler);
|
|
384
|
+
delete handler._once;
|
|
385
|
+
}
|
|
386
|
+
handler(...args);
|
|
387
|
+
});
|
|
388
|
+
(all.get("*") || []).slice().map((handler) => {
|
|
389
|
+
handler(type, args);
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
return mitt;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
//#endregion
|
|
397
|
+
//#region src/tocase.ts
|
|
398
|
+
function toCase(str) {
|
|
399
|
+
return lower(str.replace(/(-[a-z])/g, function(v) {
|
|
400
|
+
return v.replace("-", "").toLocaleUpperCase();
|
|
401
|
+
}));
|
|
402
|
+
}
|
|
403
|
+
function lower(str) {
|
|
404
|
+
return str.replace(str[0], str[0].toLowerCase());
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
//#endregion
|
|
408
|
+
//#region src/mergeprops.ts
|
|
409
|
+
const normalMerge = ["props"];
|
|
410
|
+
const toArrayMerge = [
|
|
411
|
+
"class",
|
|
412
|
+
"style",
|
|
413
|
+
"directives"
|
|
414
|
+
];
|
|
415
|
+
const functionalMerge = ["on", "hook"];
|
|
416
|
+
const mergeProps = (objects, initial = {}, opt = {}) => {
|
|
417
|
+
const _normalMerge = [...normalMerge, ...opt["normal"] || []];
|
|
418
|
+
const _toArrayMerge = [...toArrayMerge, ...opt["array"] || []];
|
|
419
|
+
const _functionalMerge = [...functionalMerge, ...opt["functional"] || []];
|
|
420
|
+
const propsMerge = opt["props"] || [];
|
|
421
|
+
return objects.reduce((a, b) => {
|
|
422
|
+
for (const key in b) if (a[key]) if (propsMerge.indexOf(key) > -1) a[key] = mergeProps([b[key]], a[key]);
|
|
423
|
+
else if (_normalMerge.indexOf(key) > -1) a[key] = {
|
|
424
|
+
...a[key],
|
|
425
|
+
...b[key]
|
|
426
|
+
};
|
|
427
|
+
else if (_toArrayMerge.indexOf(key) > -1) {
|
|
428
|
+
const arrA = a[key] instanceof Array ? a[key] : [a[key]];
|
|
429
|
+
const arrB = b[key] instanceof Array ? b[key] : [b[key]];
|
|
430
|
+
a[key] = [...arrA, ...arrB];
|
|
431
|
+
} else if (_functionalMerge.indexOf(key) > -1) for (const event in b[key]) if (a[key][event]) {
|
|
432
|
+
const arrA = a[key][event] instanceof Array ? a[key][event] : [a[key][event]];
|
|
433
|
+
const arrB = b[key][event] instanceof Array ? b[key][event] : [b[key][event]];
|
|
434
|
+
a[key][event] = [...arrA, ...arrB];
|
|
435
|
+
} else a[key][event] = b[key][event];
|
|
436
|
+
else if (key === "hook") for (let hook in b[key]) if (a[key][hook]) a[key][hook] = mergeFn(a[key][hook], b[key][hook]);
|
|
437
|
+
else a[key][hook] = b[key][hook];
|
|
438
|
+
else a[key] = b[key];
|
|
439
|
+
else if (_normalMerge.indexOf(key) > -1 || _functionalMerge.indexOf(key) > -1 || propsMerge.indexOf(key) > -1) a[key] = { ...b[key] };
|
|
440
|
+
else if (_toArrayMerge.indexOf(key) > -1) a[key] = b[key] instanceof Array ? [...b[key]] : typeof b[key] === "object" ? { ...b[key] } : b[key];
|
|
441
|
+
else a[key] = b[key];
|
|
442
|
+
return a;
|
|
443
|
+
}, initial);
|
|
444
|
+
};
|
|
445
|
+
const mergeFn = (fn1, fn2) => function() {
|
|
446
|
+
fn1 && fn1.apply(this, arguments);
|
|
447
|
+
fn2 && fn2.apply(this, arguments);
|
|
448
|
+
};
|
|
449
|
+
var mergeprops_default = mergeProps;
|
|
450
|
+
|
|
451
|
+
//#endregion
|
|
452
|
+
export { $del, $set, Mitt, copy, debounce, deepCopy, deepExtend, deepExtendArgs, deepSet, extend, getSlot, hasProperty, type_default as is, lower, mergeprops_default as mergeProps, parseFn, parseJson, shortKey, toArray, toCase, toDate, toJson, toLine, toPromise, toString, uniqueId };
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@astrolimit/fc-utils",
|
|
3
|
+
"version": "25.12.018",
|
|
4
|
+
"description": "",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "SFR",
|
|
7
|
+
"author": "Jack Lee",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"module": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./*": "./*"
|
|
20
|
+
},
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public",
|
|
23
|
+
"registry": "https://registry.npmjs.org"
|
|
24
|
+
},
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"change-case": "^5.4.4",
|
|
27
|
+
"dayjs": "^1.11.0",
|
|
28
|
+
"lodash-es": "^4.17.21"
|
|
29
|
+
}
|
|
30
|
+
}
|