ly-utils-lib 1.0.12 → 2.4.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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +889 -686
  3. package/dist/array.cjs +237 -0
  4. package/dist/array.cjs.map +1 -0
  5. package/dist/array.d.cts +2 -0
  6. package/dist/array.d.ts +2 -0
  7. package/dist/array.js +150 -0
  8. package/dist/array.js.map +1 -0
  9. package/dist/crypto.cjs +193 -0
  10. package/dist/crypto.cjs.map +1 -0
  11. package/dist/crypto.d.cts +3 -0
  12. package/dist/crypto.d.ts +3 -0
  13. package/dist/crypto.js +144 -0
  14. package/dist/crypto.js.map +1 -0
  15. package/dist/date.cjs +563 -0
  16. package/dist/date.cjs.map +1 -0
  17. package/dist/date.d.cts +2 -0
  18. package/dist/date.d.ts +2 -0
  19. package/dist/date.js +451 -0
  20. package/dist/date.js.map +1 -0
  21. package/dist/excel.cjs +227 -0
  22. package/dist/excel.cjs.map +1 -0
  23. package/dist/excel.d.cts +2 -0
  24. package/dist/excel.d.ts +2 -0
  25. package/dist/excel.js +196 -0
  26. package/dist/excel.js.map +1 -0
  27. package/dist/index-B80SEVzM.d.cts +382 -0
  28. package/dist/index-B80SEVzM.d.ts +382 -0
  29. package/dist/index-Ba1rjTzj.d.cts +299 -0
  30. package/dist/index-Ba1rjTzj.d.ts +299 -0
  31. package/dist/index-Bg1ise7y.d.cts +253 -0
  32. package/dist/index-Bg1ise7y.d.ts +253 -0
  33. package/dist/index-BoqNpwNa.d.cts +203 -0
  34. package/dist/index-BoqNpwNa.d.ts +203 -0
  35. package/dist/index-C0qUnb9Y.d.cts +533 -0
  36. package/dist/index-C0qUnb9Y.d.ts +533 -0
  37. package/dist/index-Cy-mb5v_.d.cts +262 -0
  38. package/dist/index-Cy-mb5v_.d.ts +262 -0
  39. package/dist/index-D1f9Sym2.d.cts +148 -0
  40. package/dist/index-D1f9Sym2.d.ts +148 -0
  41. package/dist/index-Dan5oF-5.d.cts +213 -0
  42. package/dist/index-Dan5oF-5.d.ts +213 -0
  43. package/dist/index-XABfrs7z.d.cts +596 -0
  44. package/dist/index-XABfrs7z.d.ts +596 -0
  45. package/dist/index-YXWfKCK7.d.cts +109 -0
  46. package/dist/index-YXWfKCK7.d.ts +109 -0
  47. package/dist/index.cjs +3355 -0
  48. package/dist/index.cjs.map +1 -0
  49. package/dist/index.d.cts +21 -0
  50. package/dist/index.d.ts +21 -0
  51. package/dist/index.js +3294 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/map.cjs +839 -0
  54. package/dist/map.cjs.map +1 -0
  55. package/dist/map.d.cts +6 -0
  56. package/dist/map.d.ts +6 -0
  57. package/dist/map.js +811 -0
  58. package/dist/map.js.map +1 -0
  59. package/dist/object.cjs +316 -0
  60. package/dist/object.cjs.map +1 -0
  61. package/dist/object.d.cts +2 -0
  62. package/dist/object.d.ts +2 -0
  63. package/dist/object.js +247 -0
  64. package/dist/object.js.map +1 -0
  65. package/dist/pdf.cjs +197 -0
  66. package/dist/pdf.cjs.map +1 -0
  67. package/dist/pdf.d.cts +3 -0
  68. package/dist/pdf.d.ts +3 -0
  69. package/dist/pdf.js +173 -0
  70. package/dist/pdf.js.map +1 -0
  71. package/dist/storage.cjs +255 -0
  72. package/dist/storage.cjs.map +1 -0
  73. package/dist/storage.d.cts +1 -0
  74. package/dist/storage.d.ts +1 -0
  75. package/dist/storage.js +226 -0
  76. package/dist/storage.js.map +1 -0
  77. package/dist/string.cjs +232 -0
  78. package/dist/string.cjs.map +1 -0
  79. package/dist/string.d.cts +2 -0
  80. package/dist/string.d.ts +2 -0
  81. package/dist/string.js +170 -0
  82. package/dist/string.js.map +1 -0
  83. package/dist/utils.cjs +429 -0
  84. package/dist/utils.cjs.map +1 -0
  85. package/dist/utils.d.cts +2 -0
  86. package/dist/utils.d.ts +2 -0
  87. package/dist/utils.js +371 -0
  88. package/dist/utils.js.map +1 -0
  89. package/package.json +159 -33
  90. package/dist/ly-utils-lib.cjs.js +0 -115
  91. package/dist/ly-utils-lib.cjs.js.map +0 -1
  92. package/dist/ly-utils-lib.es.js +0 -58589
  93. package/dist/ly-utils-lib.es.js.map +0 -1
  94. package/dist/ly-utils-lib.umd.js +0 -115
  95. package/dist/ly-utils-lib.umd.js.map +0 -1
  96. package/dist/types/index.d.ts +0 -15
  97. package/dist/types/utils/esToolkit.d.ts +0 -2
  98. package/dist/types/utils/ol.d.ts +0 -175
  99. package/dist/types/utils/router.d.ts +0 -10
  100. package/dist/types/utils/storage.d.ts +0 -42
  101. package/dist/types/utils/time.d.ts +0 -66
  102. package/dist/types/utils/tool.d.ts +0 -80
  103. package/dist/vite.svg +0 -1
package/dist/object.js ADDED
@@ -0,0 +1,247 @@
1
+ import { isEmptyObject, isEqual, groupBy } from 'es-toolkit';
2
+ export { cloneDeep, groupBy, invert, isEmptyObject, isEqual, merge, omit, pick } from 'es-toolkit';
3
+
4
+ // src/modules/object/index.ts
5
+ var keys = (obj) => {
6
+ return Object.keys(obj);
7
+ };
8
+ var values = (obj) => {
9
+ return Object.values(obj);
10
+ };
11
+ var entries = (obj) => {
12
+ return Object.entries(obj);
13
+ };
14
+ var fromPairs = (pairs) => {
15
+ const result = {};
16
+ for (const [key, value] of pairs) {
17
+ result[key] = value;
18
+ }
19
+ return result;
20
+ };
21
+ var get = (obj, path, defaultValue) => {
22
+ const keys2 = path.split(".");
23
+ let result = obj;
24
+ for (const key of keys2) {
25
+ if (result === null || result === void 0) {
26
+ return defaultValue;
27
+ }
28
+ result = result[key];
29
+ }
30
+ return result === void 0 ? defaultValue : result;
31
+ };
32
+ var set = (obj, path, value) => {
33
+ const keys2 = path.split(".");
34
+ let result = obj;
35
+ for (let i = 0; i < keys2.length - 1; i++) {
36
+ const key = keys2[i];
37
+ if (!(key in result) || typeof result[key] !== "object") {
38
+ result[key] = {};
39
+ }
40
+ result = result[key];
41
+ }
42
+ result[keys2[keys2.length - 1]] = value;
43
+ };
44
+ var has = (obj, path) => {
45
+ const keys2 = path.split(".");
46
+ let result = obj;
47
+ for (const key of keys2) {
48
+ if (result === null || result === void 0 || !(key in result)) {
49
+ return false;
50
+ }
51
+ result = result[key];
52
+ }
53
+ return true;
54
+ };
55
+ var isEmpty = (obj) => {
56
+ if (obj === null || obj === void 0) return true;
57
+ if (Array.isArray(obj)) return obj.length === 0;
58
+ if (typeof obj === "object") return isEmptyObject(obj);
59
+ return false;
60
+ };
61
+ var deepMerge = (target, ...sources) => {
62
+ if (!sources.length) return target;
63
+ const source = sources.shift();
64
+ if (isObject(target) && isObject(source)) {
65
+ for (const key in source) {
66
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
67
+ const sourceValue = source[key];
68
+ const targetValue = target[key];
69
+ if (isObject(sourceValue)) {
70
+ if (!isObject(targetValue)) {
71
+ target[key] = {};
72
+ }
73
+ deepMerge(target[key], sourceValue);
74
+ } else {
75
+ target[key] = sourceValue;
76
+ }
77
+ }
78
+ }
79
+ }
80
+ return deepMerge(target, ...sources);
81
+ };
82
+ var isObject = (obj) => {
83
+ return obj !== null && typeof obj === "object" && !Array.isArray(obj);
84
+ };
85
+ var isArray = (obj) => {
86
+ return Array.isArray(obj);
87
+ };
88
+ var isFunction = (obj) => {
89
+ return typeof obj === "function";
90
+ };
91
+ var isNumber = (obj) => {
92
+ return typeof obj === "number" && !isNaN(obj);
93
+ };
94
+ var isString = (obj) => {
95
+ return typeof obj === "string";
96
+ };
97
+ var isBoolean = (obj) => {
98
+ return typeof obj === "boolean";
99
+ };
100
+ var isNil = (obj) => {
101
+ return obj === null || obj === void 0;
102
+ };
103
+ var isNull = (obj) => {
104
+ return obj === null;
105
+ };
106
+ var isUndefined = (obj) => {
107
+ return obj === void 0;
108
+ };
109
+ var size = (obj) => {
110
+ return Object.keys(obj).length;
111
+ };
112
+ var clear = (obj) => {
113
+ Object.keys(obj).forEach((key) => {
114
+ delete obj[key];
115
+ });
116
+ return obj;
117
+ };
118
+ var toQueryString = (obj) => {
119
+ return Object.entries(obj).filter(([, value]) => value !== void 0 && value !== null).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`).join("&");
120
+ };
121
+ var fromQueryString = (queryString) => {
122
+ const params = {};
123
+ const pairs = queryString.slice(1).split("&");
124
+ for (const pair of pairs) {
125
+ const [key, value] = pair.split("=");
126
+ if (key) {
127
+ params[decodeURIComponent(key)] = value ? decodeURIComponent(value) : "";
128
+ }
129
+ }
130
+ return params;
131
+ };
132
+ var sortKeys = (obj, compareFn) => {
133
+ const sortedKeys = Object.keys(obj).sort(compareFn);
134
+ const result = {};
135
+ for (const key of sortedKeys) {
136
+ result[key] = obj[key];
137
+ }
138
+ return result;
139
+ };
140
+ var renameKeys = (obj, renameMap) => {
141
+ const result = {};
142
+ for (const key in obj) {
143
+ const newKey = renameMap[key] || key;
144
+ result[newKey] = obj[key];
145
+ }
146
+ return result;
147
+ };
148
+ var filter = (obj, predicate) => {
149
+ const result = {};
150
+ for (const key in obj) {
151
+ if (predicate(obj[key], key)) {
152
+ result[key] = obj[key];
153
+ }
154
+ }
155
+ return result;
156
+ };
157
+ var mapValues = (obj, mapper) => {
158
+ const result = {};
159
+ for (const key in obj) {
160
+ result[key] = mapper(obj[key], key);
161
+ }
162
+ return result;
163
+ };
164
+ var mapKeys = (obj, mapper) => {
165
+ const result = {};
166
+ for (const key in obj) {
167
+ const newKey = mapper(key, obj[key]);
168
+ result[newKey] = obj[key];
169
+ }
170
+ return result;
171
+ };
172
+ var getDeep = (obj, path, defaultValue) => {
173
+ return get(obj, path, defaultValue);
174
+ };
175
+ var setDeep = (obj, path, value) => {
176
+ set(obj, path, value);
177
+ };
178
+ var hasDeep = (obj, path) => {
179
+ return has(obj, path);
180
+ };
181
+ var deleteDeep = (obj, path) => {
182
+ const keys2 = path.split(".");
183
+ let current = obj;
184
+ for (let i = 0; i < keys2.length - 1; i++) {
185
+ if (!current[keys2[i]]) {
186
+ return false;
187
+ }
188
+ current = current[keys2[i]];
189
+ }
190
+ const lastKey = keys2[keys2.length - 1];
191
+ if (lastKey in current) {
192
+ delete current[lastKey];
193
+ return true;
194
+ }
195
+ return false;
196
+ };
197
+ var toFormData = (obj) => {
198
+ const formData = new FormData();
199
+ for (const key in obj) {
200
+ const value = obj[key];
201
+ if (value !== void 0 && value !== null) {
202
+ if (value instanceof File) {
203
+ formData.append(key, value);
204
+ } else if (Array.isArray(value)) {
205
+ formData.append(key, JSON.stringify(value));
206
+ } else if (typeof value === "object") {
207
+ formData.append(key, JSON.stringify(value));
208
+ } else {
209
+ formData.append(key, String(value));
210
+ }
211
+ }
212
+ }
213
+ return formData;
214
+ };
215
+ var diff = (obj, base) => {
216
+ const result = {};
217
+ for (const key in obj) {
218
+ if (!isEqual(obj[key], base[key])) {
219
+ result[key] = obj[key];
220
+ }
221
+ }
222
+ return result;
223
+ };
224
+ var deepFreeze = (obj) => {
225
+ if (isObject(obj) || isArray(obj)) {
226
+ Object.freeze(obj);
227
+ for (const key in obj) {
228
+ deepFreeze(obj[key]);
229
+ }
230
+ }
231
+ return obj;
232
+ };
233
+ var first = (obj) => {
234
+ const values2 = Object.values(obj);
235
+ return values2[0];
236
+ };
237
+ var last = (obj) => {
238
+ const values2 = Object.values(obj);
239
+ return values2[values2.length - 1];
240
+ };
241
+ var groupByPath = (arr, keyPath) => {
242
+ return groupBy(arr, (item) => get(item, keyPath));
243
+ };
244
+
245
+ export { clear, deepFreeze, deepMerge, deleteDeep, diff, entries, filter, first, fromPairs, fromQueryString, get, getDeep, groupByPath, has, hasDeep, isArray, isBoolean, isEmpty, isFunction, isNil, isNull, isNumber, isObject, isString, isUndefined, keys, last, mapKeys, mapValues, renameKeys, set, setDeep, size, sortKeys, toFormData, toQueryString, values };
246
+ //# sourceMappingURL=object.js.map
247
+ //# sourceMappingURL=object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/modules/object/index.ts"],"names":["keys","values"],"mappings":"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","file":"object.js","sourcesContent":["/**\n * 对象工具模块\n * 基于 es-toolkit 封装,提供常用的对象处理功能\n */\n\nimport { pick, omit, merge, cloneDeep, isEqual, invert, groupBy, isEmptyObject } from 'es-toolkit'\n\n// 直接导出 es-toolkit 的常用方法\nexport { pick, omit, merge, cloneDeep, isEqual, invert, groupBy, isEmptyObject }\n\n/**\n * 获取对象的所有键\n * @param obj 对象\n */\nexport const keys = <T extends Record<string, any>>(obj: T): (keyof T)[] => {\n return Object.keys(obj) as (keyof T)[]\n}\n\n/**\n * 获取对象的所有值\n * @param obj 对象\n */\nexport const values = <T extends Record<string, any>>(obj: T): T[keyof T][] => {\n return Object.values(obj)\n}\n\n/**\n * 获取对象的所有键值对\n * @param obj 对象\n */\nexport const entries = <T extends Record<string, any>>(obj: T): [keyof T, T[keyof T]][] => {\n return Object.entries(obj) as [keyof T, T[keyof T]][]\n}\n\n/**\n * 从键值对数组创建对象\n * @param pairs 键值对数组\n */\nexport const fromPairs = <K extends string | number | symbol, V>(pairs: [K, V][]): Record<K, V> => {\n const result = {} as Record<K, V>\n for (const [key, value] of pairs) {\n result[key] = value\n }\n return result\n}\n\n/**\n * 获取对象的嵌套属性值\n * @param obj 对象\n * @param path 路径\n * @param defaultValue 默认值\n */\nexport const get = <T>(obj: Record<string, any>, path: string, defaultValue?: T): T => {\n const keys = path.split('.')\n let result = obj\n for (const key of keys) {\n if (result === null || result === undefined) {\n return defaultValue as T\n }\n result = result[key]\n }\n return (result === undefined ? (defaultValue as T) : result) as T\n}\n\n/**\n * 设置对象的嵌套属性值\n * @param obj 对象\n * @param path 路径\n * @param value 值\n */\nexport const set = (obj: Record<string, any>, path: string, value: any): void => {\n const keys = path.split('.')\n let result = obj\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]\n if (!(key in result) || typeof result[key] !== 'object') {\n result[key] = {}\n }\n result = result[key]\n }\n result[keys[keys.length - 1]] = value\n}\n\n/**\n * 判断对象是否有某个路径\n * @param obj 对象\n * @param path 路径\n */\nexport const has = (obj: Record<string, any>, path: string): boolean => {\n const keys = path.split('.')\n let result = obj\n for (const key of keys) {\n if (result === null || result === undefined || !(key in result)) {\n return false\n }\n result = result[key]\n }\n return true\n}\n\n/**\n * 判断对象是否为空\n * @param obj 对象\n */\nexport const isEmpty = (obj: any): boolean => {\n if (obj === null || obj === undefined) return true\n if (Array.isArray(obj)) return obj.length === 0\n if (typeof obj === 'object') return isEmptyObject(obj)\n return false\n}\n\n/**\n * 深度合并对象\n * @param target 目标对象\n * @param sources 源对象\n */\nexport const deepMerge = <T extends Record<string, any>>(\n target: T,\n ...sources: Partial<T>[]\n): T => {\n if (!sources.length) return target\n const source = sources.shift() as Partial<T>\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key]\n const targetValue = (target as any)[key]\n\n if (isObject(sourceValue)) {\n if (!isObject(targetValue)) {\n ;(target as any)[key] = {}\n }\n deepMerge((target as any)[key], sourceValue)\n } else {\n ;(target as any)[key] = sourceValue\n }\n }\n }\n }\n\n return deepMerge(target, ...sources)\n}\n\n/**\n * 判断是否是对象\n * @param obj 值\n */\nexport const isObject = (obj: any): obj is Record<string, any> => {\n return obj !== null && typeof obj === 'object' && !Array.isArray(obj)\n}\n\n/**\n * 判断是否是数组\n * @param obj 值\n */\nexport const isArray = (obj: any): obj is any[] => {\n return Array.isArray(obj)\n}\n\n/**\n * 判断是否是函数\n * @param obj 值\n */\nexport const isFunction = (obj: any): obj is (...args: unknown[]) => unknown => {\n return typeof obj === 'function'\n}\n\n/**\n * 判断是否是数字\n * @param obj 值\n */\nexport const isNumber = (obj: any): obj is number => {\n return typeof obj === 'number' && !isNaN(obj)\n}\n\n/**\n * 判断是否是字符串\n * @param obj 值\n */\nexport const isString = (obj: any): obj is string => {\n return typeof obj === 'string'\n}\n\n/**\n * 判断是否是布尔值\n * @param obj 值\n */\nexport const isBoolean = (obj: any): obj is boolean => {\n return typeof obj === 'boolean'\n}\n\n/**\n * 判断是否是 null 或 undefined\n * @param obj 值\n */\nexport const isNil = (obj: any): boolean => {\n return obj === null || obj === undefined\n}\n\n/**\n * 判断是否是 null\n * @param obj 值\n */\nexport const isNull = (obj: any): obj is null => {\n return obj === null\n}\n\n/**\n * 判断是否是 undefined\n * @param obj 值\n */\nexport const isUndefined = (obj: any): obj is undefined => {\n return obj === undefined\n}\n\n/**\n * 获取对象的键值对数量\n * @param obj 对象\n */\nexport const size = (obj: Record<string, any>): number => {\n return Object.keys(obj).length\n}\n\n/**\n * 清空对象\n * @param obj 对象\n */\nexport const clear = <T extends Record<string, any>>(obj: T): T => {\n Object.keys(obj).forEach(key => {\n delete obj[key]\n })\n return obj\n}\n\n/**\n * 转换为查询字符串\n * @param obj 对象\n */\nexport const toQueryString = (obj: Record<string, any>): string => {\n return Object.entries(obj)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n .join('&')\n}\n\n/**\n * 查询字符串转对象\n * @param queryString 查询字符串\n */\nexport const fromQueryString = (queryString: string): Record<string, string> => {\n const params: Record<string, string> = {}\n const pairs = queryString.slice(1).split('&')\n for (const pair of pairs) {\n const [key, value] = pair.split('=')\n if (key) {\n params[decodeURIComponent(key)] = value ? decodeURIComponent(value) : ''\n }\n }\n return params\n}\n\n/**\n * 对象排序\n * @param obj 对象\n * @param compareFn 比较函数\n */\nexport const sortKeys = <T extends Record<string, any>>(\n obj: T,\n compareFn?: (a: string, b: string) => number\n): T => {\n const sortedKeys = Object.keys(obj).sort(compareFn)\n const result: Record<string, any> = {}\n for (const key of sortedKeys) {\n result[key] = obj[key]\n }\n return result as T\n}\n\n/**\n * 重命名对象的键\n * @param obj 对象\n * @param renameMap 重命名映射\n */\nexport const renameKeys = <T extends Record<string, any>>(\n obj: T,\n renameMap: Record<string, string>\n): T => {\n const result: Record<string, any> = {}\n for (const key in obj) {\n const newKey = renameMap[key] || key\n result[newKey] = obj[key]\n }\n return result as T\n}\n\n/**\n * 过滤对象的键值对\n * @param obj 对象\n * @param predicate 过滤函数\n */\nexport const filter = <T extends Record<string, any>>(\n obj: T,\n predicate: (value: any, key: string) => boolean\n): Partial<T> => {\n const result: Record<string, any> = {}\n for (const key in obj) {\n if (predicate(obj[key], key)) {\n result[key] = obj[key]\n }\n }\n return result as Partial<T>\n}\n\n/**\n * 映射对象的值\n * @param obj 对象\n * @param mapper 映射函数\n */\nexport const mapValues = <T extends Record<string, any>, R>(\n obj: T,\n mapper: (value: any, key: string) => R\n): Record<string, R> => {\n const result: Record<string, R> = {}\n for (const key in obj) {\n result[key] = mapper(obj[key], key)\n }\n return result\n}\n\n/**\n * 映射对象的键\n * @param obj 对象\n * @param mapper 映射函数\n */\nexport const mapKeys = <T extends Record<string, any>, R extends string>(\n obj: T,\n mapper: (key: string, value: any) => R\n): Record<R, any> => {\n const result: Record<string, any> = {}\n for (const key in obj) {\n const newKey = mapper(key, obj[key])\n result[newKey] = obj[key]\n }\n return result as Record<R, any>\n}\n\n/**\n * 获取嵌套路径的值\n * @param obj 对象\n * @param path 路径\n * @param defaultValue 默认值\n */\nexport const getDeep = <T>(obj: Record<string, any>, path: string, defaultValue?: T): T => {\n return get(obj, path, defaultValue)\n}\n\n/**\n * 设置嵌套路径的值\n * @param obj 对象\n * @param path 路径\n * @param value 值\n */\nexport const setDeep = (obj: Record<string, any>, path: string, value: any): void => {\n set(obj, path, value)\n}\n\n/**\n * 判断对象是否有某个路径\n * @param obj 对象\n * @param path 路径\n */\nexport const hasDeep = (obj: Record<string, any>, path: string): boolean => {\n return has(obj, path)\n}\n\n/**\n * 删除嵌套路径的值\n * @param obj 对象\n * @param path 路径\n */\nexport const deleteDeep = (obj: Record<string, any>, path: string): boolean => {\n const keys = path.split('.')\n let current = obj\n for (let i = 0; i < keys.length - 1; i++) {\n if (!current[keys[i]]) {\n return false\n }\n current = current[keys[i]]\n }\n const lastKey = keys[keys.length - 1]\n if (lastKey in current) {\n delete current[lastKey]\n return true\n }\n return false\n}\n\n/**\n * 转换为 FormData\n * @param obj 对象\n */\nexport const toFormData = (obj: Record<string, any>): FormData => {\n const formData = new FormData()\n for (const key in obj) {\n const value = obj[key]\n if (value !== undefined && value !== null) {\n if (value instanceof File) {\n formData.append(key, value)\n } else if (Array.isArray(value)) {\n formData.append(key, JSON.stringify(value))\n } else if (typeof value === 'object') {\n formData.append(key, JSON.stringify(value))\n } else {\n formData.append(key, String(value))\n }\n }\n }\n return formData\n}\n\n/**\n * 对象差值(返回在 obj 中但不在 base 中的键值对)\n * @param obj 对象\n * @param base 基础对象\n */\nexport const diff = <T extends Record<string, any>>(obj: T, base: T): Partial<T> => {\n const result: Record<string, any> = {}\n for (const key in obj) {\n if (!isEqual(obj[key], base[key])) {\n result[key] = obj[key]\n }\n }\n return result as Partial<T>\n}\n\n/**\n * 深度冻结对象\n * @param obj 对象\n */\nexport const deepFreeze = <T>(obj: T): T => {\n if (isObject(obj) || isArray(obj)) {\n Object.freeze(obj)\n for (const key in obj) {\n deepFreeze((obj as any)[key])\n }\n }\n return obj\n}\n\n/**\n * 获取对象的第一个值\n * @param obj 对象\n */\nexport const first = <T>(obj: Record<string, T>): T | undefined => {\n const values = Object.values(obj)\n return values[0]\n}\n\n/**\n * 获取对象的最后一个值\n * @param obj 对象\n */\nexport const last = <T>(obj: Record<string, T>): T | undefined => {\n const values = Object.values(obj)\n return values[values.length - 1]\n}\n\n/**\n * 按路径分组对象数组\n * @param arr 对象数组\n * @param keyPath 键路径\n */\nexport const groupByPath = <T extends Record<string, any>>(\n arr: T[],\n keyPath: string\n): Record<string, T[]> => {\n return groupBy(arr, item => get(item, keyPath))\n}\n"]}
package/dist/pdf.cjs ADDED
@@ -0,0 +1,197 @@
1
+ 'use strict';
2
+
3
+ var html2canvas = require('html2canvas');
4
+ var jspdf = require('jspdf');
5
+
6
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+
8
+ var html2canvas__default = /*#__PURE__*/_interopDefault(html2canvas);
9
+
10
+ // src/modules/pdf/index.ts
11
+ var captureToPDF = async (element, options = {}) => {
12
+ const {
13
+ filename = "download.pdf",
14
+ scale = 2,
15
+ useCORS = true,
16
+ backgroundColor = "#ffffff",
17
+ logging = false,
18
+ margin = 10
19
+ } = options;
20
+ const canvas = await html2canvas__default.default(element, {
21
+ scale,
22
+ useCORS,
23
+ backgroundColor,
24
+ logging
25
+ });
26
+ const imgData = canvas.toDataURL("image/png");
27
+ const imgWidth = canvas.width;
28
+ const imgHeight = canvas.height;
29
+ const pdfWidth = imgWidth / scale;
30
+ const pdfHeight = imgHeight / scale;
31
+ const pdf = new jspdf.jsPDF({
32
+ orientation: pdfWidth > pdfHeight ? "l" : "p",
33
+ unit: "pt",
34
+ format: [pdfWidth + margin * 2, pdfHeight + margin * 2]
35
+ });
36
+ pdf.addImage(imgData, "PNG", margin, margin, pdfWidth, pdfHeight);
37
+ pdf.save(filename);
38
+ };
39
+ var captureToPDFWithPagination = async (element, options = {}) => {
40
+ const {
41
+ filename = "download.pdf",
42
+ scale = 2,
43
+ useCORS = true,
44
+ backgroundColor = "#ffffff",
45
+ logging = false,
46
+ margin = 10
47
+ } = options;
48
+ const canvas = await html2canvas__default.default(element, {
49
+ scale,
50
+ useCORS,
51
+ backgroundColor,
52
+ logging
53
+ });
54
+ const imgData = canvas.toDataURL("image/png");
55
+ const imgWidth = canvas.width;
56
+ const imgHeight = canvas.height;
57
+ const pdf = new jspdf.jsPDF("p", "pt", "a4");
58
+ const pdfWidth = pdf.internal.pageSize.getWidth();
59
+ const pdfHeight = pdf.internal.pageSize.getHeight();
60
+ const imgWidthInPDF = pdfWidth - margin * 2;
61
+ const imgHeightInPDF = imgHeight / imgWidth * imgWidthInPDF;
62
+ let heightLeft = imgHeightInPDF;
63
+ let position = margin;
64
+ pdf.addImage(imgData, "PNG", margin, position, imgWidthInPDF, imgHeightInPDF);
65
+ heightLeft -= pdfHeight - margin * 2;
66
+ while (heightLeft > 0) {
67
+ position = heightLeft - imgHeightInPDF + margin;
68
+ pdf.addPage();
69
+ pdf.addImage(imgData, "PNG", margin, position, imgWidthInPDF, imgHeightInPDF);
70
+ heightLeft -= pdfHeight - margin * 2;
71
+ }
72
+ pdf.save(filename);
73
+ };
74
+ var captureToImage = async (element, options = {}) => {
75
+ const canvas = await html2canvas__default.default(element, {
76
+ scale: 2,
77
+ useCORS: true,
78
+ backgroundColor: "#ffffff",
79
+ logging: false,
80
+ ...options
81
+ });
82
+ return canvas.toDataURL("image/png");
83
+ };
84
+ var captureToImageDownload = async (element, filename = "screenshot.png", options = {}) => {
85
+ const dataUrl = await captureToImage(element, options);
86
+ const link = document.createElement("a");
87
+ link.href = dataUrl;
88
+ link.download = filename;
89
+ link.click();
90
+ };
91
+ var createPDF = (options = {}) => {
92
+ return new jspdf.jsPDF(options);
93
+ };
94
+ var addTextToPDF = (pdf, text, x, y, options = {}) => {
95
+ const { maxWidth, align = "left", fontSize = 12, fontStyle = "normal" } = options;
96
+ pdf.setFontSize(fontSize);
97
+ pdf.setFont("helvetica", fontStyle);
98
+ pdf.text(text, x, y, { maxWidth, align });
99
+ };
100
+ var addImageToPDF = (pdf, imageData, x, y, width, height) => {
101
+ pdf.addImage(imageData, "PNG", x, y, width, height);
102
+ };
103
+ var addTableToPDF = (pdf, headers, data, options = {}) => {
104
+ const {
105
+ x = 10,
106
+ y = 10,
107
+ cellWidth = 50,
108
+ cellHeight = 20,
109
+ headerBackgroundColor = "#4472C4",
110
+ headerTextColor = "#ffffff",
111
+ textColor = "#000000",
112
+ fontSize = 10,
113
+ lineWidth = 0.1,
114
+ lineColor = [200, 200, 200]
115
+ } = options;
116
+ pdf.setFontSize(fontSize);
117
+ let currentY = y;
118
+ headers.forEach((header, index) => {
119
+ const cellX = x + index * cellWidth;
120
+ pdf.setFillColor(
121
+ parseInt(headerBackgroundColor.slice(1, 3), 16),
122
+ parseInt(headerBackgroundColor.slice(3, 5), 16),
123
+ parseInt(headerBackgroundColor.slice(5, 7), 16)
124
+ );
125
+ pdf.rect(cellX, currentY, cellWidth, cellHeight, "F");
126
+ pdf.setDrawColor(lineColor[0], lineColor[1], lineColor[2]);
127
+ pdf.setLineWidth(lineWidth);
128
+ pdf.rect(cellX, currentY, cellWidth, cellHeight, "S");
129
+ pdf.setTextColor(
130
+ parseInt(headerTextColor.slice(1, 3), 16),
131
+ parseInt(headerTextColor.slice(3, 5), 16),
132
+ parseInt(headerTextColor.slice(5, 7), 16)
133
+ );
134
+ pdf.text(header, cellX + cellWidth / 2, currentY + cellHeight / 2 + fontSize / 4, {
135
+ align: "center"
136
+ });
137
+ });
138
+ currentY += cellHeight;
139
+ pdf.setTextColor(
140
+ parseInt(textColor.slice(1, 3), 16),
141
+ parseInt(textColor.slice(3, 5), 16),
142
+ parseInt(textColor.slice(5, 7), 16)
143
+ );
144
+ data.forEach((row) => {
145
+ row.forEach((cell, index) => {
146
+ const cellX = x + index * cellWidth;
147
+ pdf.setDrawColor(lineColor[0], lineColor[1], lineColor[2]);
148
+ pdf.setLineWidth(lineWidth);
149
+ pdf.rect(cellX, currentY, cellWidth, cellHeight, "S");
150
+ pdf.text(cell, cellX + cellWidth / 2, currentY + cellHeight / 2 + fontSize / 4, {
151
+ align: "center"
152
+ });
153
+ });
154
+ currentY += cellHeight;
155
+ });
156
+ };
157
+ var addPage = (pdf) => {
158
+ pdf.addPage();
159
+ };
160
+ var savePDF = (pdf, filename = "download.pdf") => {
161
+ pdf.save(filename);
162
+ };
163
+ var pdfToDataURL = (pdf) => {
164
+ return pdf.output("dataurlstring");
165
+ };
166
+ var pdfToBlob = (pdf) => {
167
+ return pdf.output("blob");
168
+ };
169
+ var mergePDFs = (_pdfs) => {
170
+ return Promise.reject(
171
+ new Error("mergePDFs \u529F\u80FD\u9700\u8981\u4F7F\u7528 pdf-lib \u5E93\u5B9E\u73B0\u3002\u8BF7\u5B89\u88C5 pdf-lib \u5E76\u4F7F\u7528\u5176\u63D0\u4F9B\u7684\u5408\u5E76\u529F\u80FD\u3002")
172
+ );
173
+ };
174
+
175
+ Object.defineProperty(exports, "html2canvas", {
176
+ enumerable: true,
177
+ get: function () { return html2canvas__default.default; }
178
+ });
179
+ Object.defineProperty(exports, "jsPDF", {
180
+ enumerable: true,
181
+ get: function () { return jspdf.jsPDF; }
182
+ });
183
+ exports.addImageToPDF = addImageToPDF;
184
+ exports.addPage = addPage;
185
+ exports.addTableToPDF = addTableToPDF;
186
+ exports.addTextToPDF = addTextToPDF;
187
+ exports.captureToImage = captureToImage;
188
+ exports.captureToImageDownload = captureToImageDownload;
189
+ exports.captureToPDF = captureToPDF;
190
+ exports.captureToPDFWithPagination = captureToPDFWithPagination;
191
+ exports.createPDF = createPDF;
192
+ exports.mergePDFs = mergePDFs;
193
+ exports.pdfToBlob = pdfToBlob;
194
+ exports.pdfToDataURL = pdfToDataURL;
195
+ exports.savePDF = savePDF;
196
+ //# sourceMappingURL=pdf.cjs.map
197
+ //# sourceMappingURL=pdf.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/modules/pdf/index.ts"],"names":["html2canvas","jsPDF"],"mappings":"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","file":"pdf.cjs","sourcesContent":["/**\n * PDF 工具模块\n * 基于 html2canvas 和 jspdf 封装,提供常用的 PDF 处理功能\n */\n\nimport html2canvas, { type Options as Html2CanvasOptions } from 'html2canvas'\nimport { jsPDF } from 'jspdf'\n\nexport interface CaptureToPDFOptions {\n filename?: string\n scale?: number\n useCORS?: boolean\n backgroundColor?: string\n logging?: boolean\n pagebreak?: { mode?: string; before?: string; after?: string }\n margin?: number\n}\n\nexport interface PDFOptions {\n orientation?: 'p' | 'portrait' | 'l' | 'landscape'\n unit?: 'pt' | 'mm' | 'cm' | 'in'\n format?: 'a0' | 'a1' | 'a2' | 'a3' | 'a4' | 'legal' | 'letter' | [number, number]\n}\n\n/**\n * 将 DOM 元素转换为 PDF\n * @param element DOM 元素\n * @param options 选项\n */\nexport const captureToPDF = async (\n element: HTMLElement,\n options: CaptureToPDFOptions = {}\n): Promise<void> => {\n const {\n filename = 'download.pdf',\n scale = 2,\n useCORS = true,\n backgroundColor = '#ffffff',\n logging = false,\n margin = 10,\n } = options\n\n // 使用 html2canvas 将 DOM 转换为 canvas\n const canvas = await html2canvas(element, {\n scale,\n useCORS,\n backgroundColor,\n logging,\n })\n\n // 获取 canvas 的尺寸\n const imgData = canvas.toDataURL('image/png')\n const imgWidth = canvas.width\n const imgHeight = canvas.height\n\n // 计算 PDF 尺寸\n const pdfWidth = imgWidth / scale\n const pdfHeight = imgHeight / scale\n\n // 创建 PDF\n const pdf = new jsPDF({\n orientation: pdfWidth > pdfHeight ? 'l' : 'p',\n unit: 'pt',\n format: [pdfWidth + margin * 2, pdfHeight + margin * 2],\n })\n\n // 添加图片到 PDF\n pdf.addImage(imgData, 'PNG', margin, margin, pdfWidth, pdfHeight)\n pdf.save(filename)\n}\n\n/**\n * 将 DOM 元素转换为 PDF(分页)\n * @param element DOM 元素\n * @param options 选项\n */\nexport const captureToPDFWithPagination = async (\n element: HTMLElement,\n options: CaptureToPDFOptions = {}\n): Promise<void> => {\n const {\n filename = 'download.pdf',\n scale = 2,\n useCORS = true,\n backgroundColor = '#ffffff',\n logging = false,\n margin = 10,\n } = options\n\n // 使用 html2canvas 将 DOM 转换为 canvas\n const canvas = await html2canvas(element, {\n scale,\n useCORS,\n backgroundColor,\n logging,\n })\n\n // 获取 canvas 的尺寸\n const imgData = canvas.toDataURL('image/png')\n const imgWidth = canvas.width\n const imgHeight = canvas.height\n\n // 创建 PDF (A4)\n const pdf = new jsPDF('p', 'pt', 'a4')\n const pdfWidth = pdf.internal.pageSize.getWidth()\n const pdfHeight = pdf.internal.pageSize.getHeight()\n\n // 计算图片在 PDF 中的尺寸\n const imgWidthInPDF = pdfWidth - margin * 2\n const imgHeightInPDF = (imgHeight / imgWidth) * imgWidthInPDF\n\n let heightLeft = imgHeightInPDF\n let position = margin\n\n // 第一页\n pdf.addImage(imgData, 'PNG', margin, position, imgWidthInPDF, imgHeightInPDF)\n heightLeft -= pdfHeight - margin * 2\n\n // 分页\n while (heightLeft > 0) {\n position = heightLeft - imgHeightInPDF + margin\n pdf.addPage()\n pdf.addImage(imgData, 'PNG', margin, position, imgWidthInPDF, imgHeightInPDF)\n heightLeft -= pdfHeight - margin * 2\n }\n\n pdf.save(filename)\n}\n\n/**\n * 截取 DOM 元素为图片\n * @param element DOM 元素\n * @param options html2canvas 选项\n */\nexport const captureToImage = async (\n element: HTMLElement,\n options: Partial<Html2CanvasOptions> = {}\n): Promise<string> => {\n const canvas = await html2canvas(element, {\n scale: 2,\n useCORS: true,\n backgroundColor: '#ffffff',\n logging: false,\n ...options,\n })\n\n return canvas.toDataURL('image/png')\n}\n\n/**\n * 截取 DOM 元素并下载为图片\n * @param element DOM 元素\n * @param filename 文件名\n * @param options html2canvas 选项\n */\nexport const captureToImageDownload = async (\n element: HTMLElement,\n filename = 'screenshot.png',\n options: Partial<Html2CanvasOptions> = {}\n): Promise<void> => {\n const dataUrl = await captureToImage(element, options)\n\n const link = document.createElement('a')\n link.href = dataUrl\n link.download = filename\n link.click()\n}\n\n/**\n * 创建空白 PDF\n * @param options PDF 选项\n */\nexport const createPDF = (options: PDFOptions = {}): jsPDF => {\n return new jsPDF(options)\n}\n\n/**\n * 添加文本到 PDF\n * @param pdf PDF 实例\n * @param text 文本\n * @param x X 坐标\n * @param y Y 坐标\n * @param options 选项\n */\nexport const addTextToPDF = (\n pdf: jsPDF,\n text: string,\n x: number,\n y: number,\n options: {\n maxWidth?: number\n align?: 'left' | 'center' | 'right'\n fontSize?: number\n fontStyle?: 'normal' | 'bold' | 'italic' | 'bolditalic'\n } = {}\n): void => {\n const { maxWidth, align = 'left', fontSize = 12, fontStyle = 'normal' } = options\n\n pdf.setFontSize(fontSize)\n pdf.setFont('helvetica', fontStyle)\n pdf.text(text, x, y, { maxWidth, align })\n}\n\n/**\n * 添加图片到 PDF\n * @param pdf PDF 实例\n * @param imageData 图片数据(DataURL 或 URL)\n * @param x X 坐标\n * @param y Y 坐标\n * @param width 宽度\n * @param height 高度\n */\nexport const addImageToPDF = (\n pdf: jsPDF,\n imageData: string,\n x: number,\n y: number,\n width: number,\n height: number\n): void => {\n pdf.addImage(imageData, 'PNG', x, y, width, height)\n}\n\n/**\n * 添加表格到 PDF\n * @param pdf PDF 实例\n * @param headers 表头\n * @param data 数据\n * @param options 选项\n */\nexport const addTableToPDF = (\n pdf: jsPDF,\n headers: string[],\n data: string[][],\n options: {\n x?: number\n y?: number\n cellWidth?: number\n cellHeight?: number\n headerBackgroundColor?: string\n headerTextColor?: string\n textColor?: string\n fontSize?: number\n lineWidth?: number\n lineColor?: number[]\n } = {}\n): void => {\n const {\n x = 10,\n y = 10,\n cellWidth = 50,\n cellHeight = 20,\n headerBackgroundColor = '#4472C4',\n headerTextColor = '#ffffff',\n textColor = '#000000',\n fontSize = 10,\n lineWidth = 0.1,\n lineColor = [200, 200, 200],\n } = options\n\n pdf.setFontSize(fontSize)\n let currentY = y\n\n // 绘制表头\n headers.forEach((header, index) => {\n const cellX = x + index * cellWidth\n\n // 绘制背景\n pdf.setFillColor(\n parseInt(headerBackgroundColor.slice(1, 3), 16),\n parseInt(headerBackgroundColor.slice(3, 5), 16),\n parseInt(headerBackgroundColor.slice(5, 7), 16)\n )\n pdf.rect(cellX, currentY, cellWidth, cellHeight, 'F')\n\n // 绘制边框\n pdf.setDrawColor(lineColor[0], lineColor[1], lineColor[2])\n pdf.setLineWidth(lineWidth)\n pdf.rect(cellX, currentY, cellWidth, cellHeight, 'S')\n\n // 绘制文本\n pdf.setTextColor(\n parseInt(headerTextColor.slice(1, 3), 16),\n parseInt(headerTextColor.slice(3, 5), 16),\n parseInt(headerTextColor.slice(5, 7), 16)\n )\n pdf.text(header, cellX + cellWidth / 2, currentY + cellHeight / 2 + fontSize / 4, {\n align: 'center',\n })\n })\n\n currentY += cellHeight\n\n // 绘制数据\n pdf.setTextColor(\n parseInt(textColor.slice(1, 3), 16),\n parseInt(textColor.slice(3, 5), 16),\n parseInt(textColor.slice(5, 7), 16)\n )\n\n data.forEach(row => {\n row.forEach((cell, index) => {\n const cellX = x + index * cellWidth\n\n // 绘制边框\n pdf.setDrawColor(lineColor[0], lineColor[1], lineColor[2])\n pdf.setLineWidth(lineWidth)\n pdf.rect(cellX, currentY, cellWidth, cellHeight, 'S')\n\n // 绘制文本\n pdf.text(cell, cellX + cellWidth / 2, currentY + cellHeight / 2 + fontSize / 4, {\n align: 'center',\n })\n })\n currentY += cellHeight\n })\n}\n\n/**\n * 添加新页面\n * @param pdf PDF 实例\n */\nexport const addPage = (pdf: jsPDF): void => {\n pdf.addPage()\n}\n\n/**\n * 保存 PDF\n * @param pdf PDF 实例\n * @param filename 文件名\n */\nexport const savePDF = (pdf: jsPDF, filename = 'download.pdf'): void => {\n pdf.save(filename)\n}\n\n/**\n * PDF 转 DataURL\n * @param pdf PDF 实例\n */\nexport const pdfToDataURL = (pdf: jsPDF): string => {\n return pdf.output('dataurlstring')\n}\n\n/**\n * PDF 转 Blob\n * @param pdf PDF 实例\n */\nexport const pdfToBlob = (pdf: jsPDF): Blob => {\n return pdf.output('blob')\n}\n\n/**\n * 合并多个 PDF(需要使用 pdf-lib 库实现)\n * @param _pdfs PDF 实例数组\n */\nexport const mergePDFs = (_pdfs: jsPDF[]): Promise<jsPDF> => {\n return Promise.reject(\n new Error('mergePDFs 功能需要使用 pdf-lib 库实现。请安装 pdf-lib 并使用其提供的合并功能。')\n )\n}\n\n/**\n * 导出 jsPDF 和 html2canvas 原始对象,方便高级用法\n */\nexport { jsPDF, html2canvas }\n"]}
package/dist/pdf.d.cts ADDED
@@ -0,0 +1,3 @@
1
+ export { default as html2canvas } from 'html2canvas';
2
+ export { jsPDF } from 'jspdf';
3
+ export { C as CaptureToPDFOptions, P as PDFOptions, a as addImageToPDF, b as addPage, c as addTableToPDF, d as addTextToPDF, e as captureToImage, f as captureToImageDownload, g as captureToPDF, h as captureToPDFWithPagination, j as createPDF, m as mergePDFs, p as pdfToBlob, k as pdfToDataURL, s as savePDF } from './index-D1f9Sym2.cjs';
package/dist/pdf.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export { default as html2canvas } from 'html2canvas';
2
+ export { jsPDF } from 'jspdf';
3
+ export { C as CaptureToPDFOptions, P as PDFOptions, a as addImageToPDF, b as addPage, c as addTableToPDF, d as addTextToPDF, e as captureToImage, f as captureToImageDownload, g as captureToPDF, h as captureToPDFWithPagination, j as createPDF, m as mergePDFs, p as pdfToBlob, k as pdfToDataURL, s as savePDF } from './index-D1f9Sym2.js';