sa2kit 1.0.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/LICENSE +22 -0
- package/README.md +298 -0
- package/dist/AliyunOSSProvider-7JLMJDXK.js +15 -0
- package/dist/AliyunOSSProvider-7JLMJDXK.js.map +1 -0
- package/dist/AliyunOSSProvider-GQMSDJGZ.mjs +6 -0
- package/dist/AliyunOSSProvider-GQMSDJGZ.mjs.map +1 -0
- package/dist/LocalStorageProvider-FVLLHBHO.mjs +6 -0
- package/dist/LocalStorageProvider-FVLLHBHO.mjs.map +1 -0
- package/dist/LocalStorageProvider-NBNHHWLY.js +15 -0
- package/dist/LocalStorageProvider-NBNHHWLY.js.map +1 -0
- package/dist/analytics/index.d.mts +1084 -0
- package/dist/analytics/index.d.ts +1084 -0
- package/dist/analytics/index.js +2595 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/index.mjs +2518 -0
- package/dist/analytics/index.mjs.map +1 -0
- package/dist/analytics/server/index.d.mts +499 -0
- package/dist/analytics/server/index.d.ts +499 -0
- package/dist/analytics/server/index.js +529 -0
- package/dist/analytics/server/index.js.map +1 -0
- package/dist/analytics/server/index.mjs +525 -0
- package/dist/analytics/server/index.mjs.map +1 -0
- package/dist/auth/client/index.d.mts +104 -0
- package/dist/auth/client/index.d.ts +104 -0
- package/dist/auth/client/index.js +21 -0
- package/dist/auth/client/index.js.map +1 -0
- package/dist/auth/client/index.mjs +4 -0
- package/dist/auth/client/index.mjs.map +1 -0
- package/dist/auth/components/index.d.mts +82 -0
- package/dist/auth/components/index.d.ts +82 -0
- package/dist/auth/components/index.js +93 -0
- package/dist/auth/components/index.js.map +1 -0
- package/dist/auth/components/index.mjs +86 -0
- package/dist/auth/components/index.mjs.map +1 -0
- package/dist/auth/hooks/index.d.mts +2 -0
- package/dist/auth/hooks/index.d.ts +2 -0
- package/dist/auth/hooks/index.js +17 -0
- package/dist/auth/hooks/index.js.map +1 -0
- package/dist/auth/hooks/index.mjs +4 -0
- package/dist/auth/hooks/index.mjs.map +1 -0
- package/dist/auth/index.d.mts +15 -0
- package/dist/auth/index.d.ts +15 -0
- package/dist/auth/index.js +110 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/index.mjs +9 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/auth/middleware/index.d.mts +75 -0
- package/dist/auth/middleware/index.d.ts +75 -0
- package/dist/auth/middleware/index.js +15 -0
- package/dist/auth/middleware/index.js.map +1 -0
- package/dist/auth/middleware/index.mjs +6 -0
- package/dist/auth/middleware/index.mjs.map +1 -0
- package/dist/auth/routes/index.d.mts +163 -0
- package/dist/auth/routes/index.d.ts +163 -0
- package/dist/auth/routes/index.js +27 -0
- package/dist/auth/routes/index.js.map +1 -0
- package/dist/auth/routes/index.mjs +6 -0
- package/dist/auth/routes/index.mjs.map +1 -0
- package/dist/auth/schema/index.d.mts +789 -0
- package/dist/auth/schema/index.d.ts +789 -0
- package/dist/auth/schema/index.js +41 -0
- package/dist/auth/schema/index.js.map +1 -0
- package/dist/auth/schema/index.mjs +4 -0
- package/dist/auth/schema/index.mjs.map +1 -0
- package/dist/auth/services/index.d.mts +47 -0
- package/dist/auth/services/index.d.ts +47 -0
- package/dist/auth/services/index.js +34 -0
- package/dist/auth/services/index.js.map +1 -0
- package/dist/auth/services/index.mjs +5 -0
- package/dist/auth/services/index.mjs.map +1 -0
- package/dist/chunk-3RFBUDRA.js +507 -0
- package/dist/chunk-3RFBUDRA.js.map +1 -0
- package/dist/chunk-3XG5OHFD.mjs +37 -0
- package/dist/chunk-3XG5OHFD.mjs.map +1 -0
- package/dist/chunk-6BL3AZGD.js +285 -0
- package/dist/chunk-6BL3AZGD.js.map +1 -0
- package/dist/chunk-6FNUWAIV.js +394 -0
- package/dist/chunk-6FNUWAIV.js.map +1 -0
- package/dist/chunk-6PRFP5EG.js +171 -0
- package/dist/chunk-6PRFP5EG.js.map +1 -0
- package/dist/chunk-6VHWOPRR.mjs +90 -0
- package/dist/chunk-6VHWOPRR.mjs.map +1 -0
- package/dist/chunk-AIKEVVDR.mjs +122 -0
- package/dist/chunk-AIKEVVDR.mjs.map +1 -0
- package/dist/chunk-APY57REU.js +300 -0
- package/dist/chunk-APY57REU.js.map +1 -0
- package/dist/chunk-BJTO5JO5.mjs +10 -0
- package/dist/chunk-BJTO5JO5.mjs.map +1 -0
- package/dist/chunk-C64RY2OW.mjs +295 -0
- package/dist/chunk-C64RY2OW.mjs.map +1 -0
- package/dist/chunk-DGUM43GV.js +12 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-FV3FNHQY.js +92 -0
- package/dist/chunk-FV3FNHQY.js.map +1 -0
- package/dist/chunk-GSTLV3MB.mjs +316 -0
- package/dist/chunk-GSTLV3MB.mjs.map +1 -0
- package/dist/chunk-HEMA7SWK.mjs +212 -0
- package/dist/chunk-HEMA7SWK.mjs.map +1 -0
- package/dist/chunk-HWJ34NL6.js +43 -0
- package/dist/chunk-HWJ34NL6.js.map +1 -0
- package/dist/chunk-HXFFYNIF.mjs +385 -0
- package/dist/chunk-HXFFYNIF.mjs.map +1 -0
- package/dist/chunk-KGRQNEIR.mjs +183 -0
- package/dist/chunk-KGRQNEIR.mjs.map +1 -0
- package/dist/chunk-KH6RQ4J5.js +28 -0
- package/dist/chunk-KH6RQ4J5.js.map +1 -0
- package/dist/chunk-KQGP6BTS.mjs +165 -0
- package/dist/chunk-KQGP6BTS.mjs.map +1 -0
- package/dist/chunk-NMF4ANIC.js +365 -0
- package/dist/chunk-NMF4ANIC.js.map +1 -0
- package/dist/chunk-O26VCNS3.js +216 -0
- package/dist/chunk-O26VCNS3.js.map +1 -0
- package/dist/chunk-OLHGZXN3.mjs +86 -0
- package/dist/chunk-OLHGZXN3.mjs.map +1 -0
- package/dist/chunk-QU5OT4DF.js +88 -0
- package/dist/chunk-QU5OT4DF.js.map +1 -0
- package/dist/chunk-RCNNVNLT.mjs +356 -0
- package/dist/chunk-RCNNVNLT.mjs.map +1 -0
- package/dist/chunk-ROEYW4A7.js +186 -0
- package/dist/chunk-ROEYW4A7.js.map +1 -0
- package/dist/chunk-SVWQN2LR.js +131 -0
- package/dist/chunk-SVWQN2LR.js.map +1 -0
- package/dist/chunk-TKCYPDWU.js +338 -0
- package/dist/chunk-TKCYPDWU.js.map +1 -0
- package/dist/chunk-U2L6V7KD.mjs +273 -0
- package/dist/chunk-U2L6V7KD.mjs.map +1 -0
- package/dist/chunk-YVBU7QDJ.mjs +505 -0
- package/dist/chunk-YVBU7QDJ.mjs.map +1 -0
- package/dist/chunk-ZGVB35L2.mjs +25 -0
- package/dist/chunk-ZGVB35L2.mjs.map +1 -0
- package/dist/config/index.d.mts +64 -0
- package/dist/config/index.d.ts +64 -0
- package/dist/config/index.js +136 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/index.mjs +128 -0
- package/dist/config/index.mjs.map +1 -0
- package/dist/drizzle-auth-service-Bxlovhv8.d.ts +145 -0
- package/dist/drizzle-auth-service-DZY2F1sv.d.mts +145 -0
- package/dist/enums-Dume-V5Y.d.mts +16 -0
- package/dist/enums-Dume-V5Y.d.ts +16 -0
- package/dist/i18n/index.d.mts +416 -0
- package/dist/i18n/index.d.ts +416 -0
- package/dist/i18n/index.js +671 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/index.mjs +650 -0
- package/dist/i18n/index.mjs.map +1 -0
- package/dist/index-8VoHap_4.d.mts +105 -0
- package/dist/index-8VoHap_4.d.ts +105 -0
- package/dist/index.d.mts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +84 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +7 -0
- package/dist/index.mjs.map +1 -0
- package/dist/logger/index.d.mts +125 -0
- package/dist/logger/index.d.ts +125 -0
- package/dist/logger/index.js +29 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/index.mjs +4 -0
- package/dist/logger/index.mjs.map +1 -0
- package/dist/request/index.d.mts +51 -0
- package/dist/request/index.d.ts +51 -0
- package/dist/request/index.js +85 -0
- package/dist/request/index.js.map +1 -0
- package/dist/request/index.mjs +82 -0
- package/dist/request/index.mjs.map +1 -0
- package/dist/storage/index.d.mts +74 -0
- package/dist/storage/index.d.ts +74 -0
- package/dist/storage/index.js +46 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/index.mjs +5 -0
- package/dist/storage/index.mjs.map +1 -0
- package/dist/types-BINlP9MK.d.mts +286 -0
- package/dist/types-BINlP9MK.d.ts +286 -0
- package/dist/types-BaZccpvk.d.mts +48 -0
- package/dist/types-BaZccpvk.d.ts +48 -0
- package/dist/types-CbTsi9CZ.d.mts +31 -0
- package/dist/types-CbTsi9CZ.d.ts +31 -0
- package/dist/types-CoGG1rNV.d.mts +258 -0
- package/dist/types-CoGG1rNV.d.ts +258 -0
- package/dist/types-DAxQ1MeY.d.ts +70 -0
- package/dist/types-DT8LVCvE.d.mts +70 -0
- package/dist/types-DW9qar-w.d.mts +52 -0
- package/dist/types-DW9qar-w.d.ts +52 -0
- package/dist/universalExport/index.d.mts +235 -0
- package/dist/universalExport/index.d.ts +235 -0
- package/dist/universalExport/index.js +621 -0
- package/dist/universalExport/index.js.map +1 -0
- package/dist/universalExport/index.mjs +580 -0
- package/dist/universalExport/index.mjs.map +1 -0
- package/dist/universalExport/server/index.d.mts +429 -0
- package/dist/universalExport/server/index.d.ts +429 -0
- package/dist/universalExport/server/index.js +263 -0
- package/dist/universalExport/server/index.js.map +1 -0
- package/dist/universalExport/server/index.mjs +242 -0
- package/dist/universalExport/server/index.mjs.map +1 -0
- package/dist/universalFile/index.d.mts +310 -0
- package/dist/universalFile/index.d.ts +310 -0
- package/dist/universalFile/index.js +811 -0
- package/dist/universalFile/index.js.map +1 -0
- package/dist/universalFile/index.mjs +736 -0
- package/dist/universalFile/index.mjs.map +1 -0
- package/dist/universalFile/server/index.d.mts +2428 -0
- package/dist/universalFile/server/index.d.ts +2428 -0
- package/dist/universalFile/server/index.js +4578 -0
- package/dist/universalFile/server/index.js.map +1 -0
- package/dist/universalFile/server/index.mjs +4518 -0
- package/dist/universalFile/server/index.mjs.map +1 -0
- package/dist/useElectronStorage-Dj0rcorG.d.mts +65 -0
- package/dist/useElectronStorage-DwnNfIhl.d.ts +65 -0
- package/dist/utils/index.d.mts +188 -0
- package/dist/utils/index.d.ts +188 -0
- package/dist/utils/index.js +42 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +5 -0
- package/dist/utils/index.mjs.map +1 -0
- package/package.json +220 -0
- package/tailwind.animations.js +34 -0
|
@@ -0,0 +1,621 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
require('../chunk-DGUM43GV.js');
|
|
4
|
+
|
|
5
|
+
// src/universalExport/types.ts
|
|
6
|
+
var ExportServiceError = class extends Error {
|
|
7
|
+
constructor(message, code, details) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.details = details;
|
|
11
|
+
this.name = "ExportServiceError";
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
var ExportConfigError = class extends ExportServiceError {
|
|
15
|
+
constructor(message, details) {
|
|
16
|
+
super(message, "EXPORT_CONFIG_ERROR", details);
|
|
17
|
+
this.name = "ExportConfigError";
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
var ExportDataError = class extends ExportServiceError {
|
|
21
|
+
constructor(message, details) {
|
|
22
|
+
super(message, "EXPORT_DATA_ERROR", details);
|
|
23
|
+
this.name = "ExportDataError";
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
var ExportFileError = class extends ExportServiceError {
|
|
27
|
+
constructor(message, details) {
|
|
28
|
+
super(message, "EXPORT_FILE_ERROR", details);
|
|
29
|
+
this.name = "ExportFileError";
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// src/universalExport/constants.ts
|
|
34
|
+
var UNIVERSAL_EXPORT_VERSION = "1.0.0";
|
|
35
|
+
var UNIVERSAL_EXPORT_NAME = "@lyricnote/universal-export";
|
|
36
|
+
var DEFAULT_EXPORT_FORMAT = "csv";
|
|
37
|
+
var DEFAULT_CSV_DELIMITER = ",";
|
|
38
|
+
var DEFAULT_ENCODING = "utf-8";
|
|
39
|
+
var DEFAULT_ADD_BOM = true;
|
|
40
|
+
var DEFAULT_MAX_FILE_SIZE = 100 * 1024 * 1024;
|
|
41
|
+
var DEFAULT_MAX_ROWS = 1e5;
|
|
42
|
+
var DEFAULT_MAX_CONCURRENT_EXPORTS = 5;
|
|
43
|
+
var DEFAULT_EXPORT_TIMEOUT = 3e5;
|
|
44
|
+
var DEFAULT_CONFIG_CACHE_TTL = 3600;
|
|
45
|
+
var DEFAULT_RESULT_CACHE_TTL = 1800;
|
|
46
|
+
var EXPORT_FORMAT_EXTENSIONS = {
|
|
47
|
+
csv: "csv",
|
|
48
|
+
excel: "xlsx",
|
|
49
|
+
json: "json"
|
|
50
|
+
};
|
|
51
|
+
var EXPORT_FORMAT_MIME_TYPES = {
|
|
52
|
+
csv: "text/csv; charset=utf-8",
|
|
53
|
+
excel: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
54
|
+
json: "application/json; charset=utf-8"
|
|
55
|
+
};
|
|
56
|
+
var API_BASE_PATH = "/api/universal-export";
|
|
57
|
+
var API_ENDPOINTS = {
|
|
58
|
+
/** 获取配置列表 */
|
|
59
|
+
GET_CONFIGS: `${API_BASE_PATH}/configs`,
|
|
60
|
+
/** 创建配置 */
|
|
61
|
+
CREATE_CONFIG: `${API_BASE_PATH}/configs`,
|
|
62
|
+
/** 更新配置 */
|
|
63
|
+
UPDATE_CONFIG: (configId) => `${API_BASE_PATH}/configs/${configId}`,
|
|
64
|
+
/** 删除配置 */
|
|
65
|
+
DELETE_CONFIG: (configId) => `${API_BASE_PATH}/configs/${configId}`,
|
|
66
|
+
/** 触发导出 */
|
|
67
|
+
EXPORT_DATA: `${API_BASE_PATH}/export`,
|
|
68
|
+
/** 查询导出进度 */
|
|
69
|
+
GET_PROGRESS: (exportId) => `${API_BASE_PATH}/export/${exportId}/progress`,
|
|
70
|
+
/** 下载导出文件 */
|
|
71
|
+
DOWNLOAD_FILE: (exportId) => `${API_BASE_PATH}/export/${exportId}/download`
|
|
72
|
+
};
|
|
73
|
+
var ERROR_CODES = {
|
|
74
|
+
/** 导出配置错误 */
|
|
75
|
+
EXPORT_CONFIG_ERROR: "EXPORT_CONFIG_ERROR",
|
|
76
|
+
/** 导出数据错误 */
|
|
77
|
+
EXPORT_DATA_ERROR: "EXPORT_DATA_ERROR",
|
|
78
|
+
/** 导出文件错误 */
|
|
79
|
+
EXPORT_FILE_ERROR: "EXPORT_FILE_ERROR",
|
|
80
|
+
/** 网络错误 */
|
|
81
|
+
NETWORK_ERROR: "NETWORK_ERROR",
|
|
82
|
+
/** 超时错误 */
|
|
83
|
+
TIMEOUT_ERROR: "TIMEOUT_ERROR",
|
|
84
|
+
/** 未授权 */
|
|
85
|
+
UNAUTHORIZED: "UNAUTHORIZED",
|
|
86
|
+
/** 服务器错误 */
|
|
87
|
+
SERVER_ERROR: "SERVER_ERROR"
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
// src/universalExport/utils.ts
|
|
91
|
+
function generateExportFileName(template, format) {
|
|
92
|
+
const now = /* @__PURE__ */ new Date();
|
|
93
|
+
const dateStr = now.toISOString().split("T")[0] || "";
|
|
94
|
+
const timeStr = (now.toTimeString().split(" ")[0] || "").replace(/:/g, "-");
|
|
95
|
+
const extension = EXPORT_FORMAT_EXTENSIONS[format];
|
|
96
|
+
return template.replace("{date}", dateStr).replace("{time}", timeStr).replace("{timestamp}", now.getTime().toString()) + `.${extension}`;
|
|
97
|
+
}
|
|
98
|
+
function validateFileName(fileName) {
|
|
99
|
+
const invalidChars = /[<>:"|?*\/\\]/;
|
|
100
|
+
if (invalidChars.test(fileName)) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
if (fileName.length === 0 || fileName.length > 255) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
function sanitizeFileName(fileName) {
|
|
109
|
+
return fileName.replace(/[<>:"|?*\/\\]/g, "_").substring(0, 255);
|
|
110
|
+
}
|
|
111
|
+
function escapeCSVField(value, delimiter = ",") {
|
|
112
|
+
const valueStr = String(value || "");
|
|
113
|
+
if (valueStr.includes(delimiter) || valueStr.includes('"') || valueStr.includes("\n")) {
|
|
114
|
+
return `"${valueStr.replace(/"/g, '""')}"`;
|
|
115
|
+
}
|
|
116
|
+
return valueStr;
|
|
117
|
+
}
|
|
118
|
+
function parseCSVField(field) {
|
|
119
|
+
if (field.startsWith('"') && field.endsWith('"')) {
|
|
120
|
+
return field.slice(1, -1).replace(/""/g, '"');
|
|
121
|
+
}
|
|
122
|
+
return field;
|
|
123
|
+
}
|
|
124
|
+
var DEFAULT_FORMATTERS = {
|
|
125
|
+
// 日期格式化
|
|
126
|
+
date: (value) => {
|
|
127
|
+
if (!value) return "";
|
|
128
|
+
const date = new Date(value);
|
|
129
|
+
if (isNaN(date.getTime())) return String(value);
|
|
130
|
+
return date.toISOString().split("T")[0] || "";
|
|
131
|
+
},
|
|
132
|
+
// 时间格式化
|
|
133
|
+
datetime: (value) => {
|
|
134
|
+
if (!value) return "";
|
|
135
|
+
const date = new Date(value);
|
|
136
|
+
if (isNaN(date.getTime())) return String(value);
|
|
137
|
+
return date.toLocaleString("zh-CN");
|
|
138
|
+
},
|
|
139
|
+
// 数字格式化
|
|
140
|
+
number: (value) => {
|
|
141
|
+
if (value === null || value === void 0) return "";
|
|
142
|
+
return String(value);
|
|
143
|
+
},
|
|
144
|
+
// 货币格式化
|
|
145
|
+
currency: (value) => {
|
|
146
|
+
if (value === null || value === void 0) return "";
|
|
147
|
+
return `\xA5${Number(value).toFixed(2)}`;
|
|
148
|
+
},
|
|
149
|
+
// 百分比格式化
|
|
150
|
+
percentage: (value) => {
|
|
151
|
+
if (value === null || value === void 0) return "";
|
|
152
|
+
return `${(Number(value) * 100).toFixed(2)}%`;
|
|
153
|
+
},
|
|
154
|
+
// 布尔值格式化
|
|
155
|
+
boolean: (value) => {
|
|
156
|
+
if (value === null || value === void 0) return "";
|
|
157
|
+
return value ? "\u662F" : "\u5426";
|
|
158
|
+
},
|
|
159
|
+
// 数组格式化
|
|
160
|
+
array: (value) => {
|
|
161
|
+
if (!Array.isArray(value)) return "";
|
|
162
|
+
return value.join(", ");
|
|
163
|
+
},
|
|
164
|
+
// 对象格式化
|
|
165
|
+
object: (value) => {
|
|
166
|
+
if (!value || typeof value !== "object") return "";
|
|
167
|
+
return JSON.stringify(value);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
function applyFormatter(value, formatter, type) {
|
|
171
|
+
if (formatter) {
|
|
172
|
+
return formatter(value);
|
|
173
|
+
}
|
|
174
|
+
if (type && DEFAULT_FORMATTERS[type]) {
|
|
175
|
+
return DEFAULT_FORMATTERS[type](value);
|
|
176
|
+
}
|
|
177
|
+
return String(value || "");
|
|
178
|
+
}
|
|
179
|
+
function validateExportConfig(config) {
|
|
180
|
+
const errors = [];
|
|
181
|
+
if (!config.name || config.name.trim() === "") {
|
|
182
|
+
errors.push("\u914D\u7F6E\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");
|
|
183
|
+
}
|
|
184
|
+
if (!config.fields || !Array.isArray(config.fields) || config.fields.length === 0) {
|
|
185
|
+
errors.push("\u81F3\u5C11\u9700\u8981\u5B9A\u4E49\u4E00\u4E2A\u5B57\u6BB5");
|
|
186
|
+
}
|
|
187
|
+
if (config.fields) {
|
|
188
|
+
const enabledFields = config.fields.filter((f) => f.enabled);
|
|
189
|
+
if (enabledFields.length === 0) {
|
|
190
|
+
errors.push("\u81F3\u5C11\u9700\u8981\u542F\u7528\u4E00\u4E2A\u5B57\u6BB5");
|
|
191
|
+
}
|
|
192
|
+
const keys = config.fields.map((f) => f.key);
|
|
193
|
+
const uniqueKeys = new Set(keys);
|
|
194
|
+
if (keys.length !== uniqueKeys.size) {
|
|
195
|
+
errors.push("\u5B57\u6BB5\u952E\u540D\u5FC5\u987B\u552F\u4E00");
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
valid: errors.length === 0,
|
|
200
|
+
errors
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
function validateExportRequest(request) {
|
|
204
|
+
const errors = [];
|
|
205
|
+
if (!request.configId) {
|
|
206
|
+
errors.push("\u5BFC\u51FA\u914D\u7F6EID\u4E0D\u80FD\u4E3A\u7A7A");
|
|
207
|
+
}
|
|
208
|
+
if (!request.dataSource) {
|
|
209
|
+
errors.push("\u6570\u636E\u6E90\u4E0D\u80FD\u4E3A\u7A7A");
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
valid: errors.length === 0,
|
|
213
|
+
errors
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
function formatFileSize(bytes) {
|
|
217
|
+
if (bytes === 0) return "0 B";
|
|
218
|
+
const units = ["B", "KB", "MB", "GB", "TB"];
|
|
219
|
+
const k = 1024;
|
|
220
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
221
|
+
return `${(bytes / Math.pow(k, i)).toFixed(2)} ${units[i]}`;
|
|
222
|
+
}
|
|
223
|
+
function formatDuration(milliseconds) {
|
|
224
|
+
if (milliseconds < 1e3) {
|
|
225
|
+
return `${milliseconds}ms`;
|
|
226
|
+
}
|
|
227
|
+
const seconds = Math.floor(milliseconds / 1e3);
|
|
228
|
+
if (seconds < 60) {
|
|
229
|
+
return `${seconds}\u79D2`;
|
|
230
|
+
}
|
|
231
|
+
const minutes = Math.floor(seconds / 60);
|
|
232
|
+
const remainingSeconds = seconds % 60;
|
|
233
|
+
if (minutes < 60) {
|
|
234
|
+
return remainingSeconds > 0 ? `${minutes}\u5206${remainingSeconds}\u79D2` : `${minutes}\u5206\u949F`;
|
|
235
|
+
}
|
|
236
|
+
const hours = Math.floor(minutes / 60);
|
|
237
|
+
const remainingMinutes = minutes % 60;
|
|
238
|
+
return remainingMinutes > 0 ? `${hours}\u5C0F\u65F6${remainingMinutes}\u5206\u949F` : `${hours}\u5C0F\u65F6`;
|
|
239
|
+
}
|
|
240
|
+
function estimateEndTime(startTime, processedRows, totalRows) {
|
|
241
|
+
if (processedRows === 0 || totalRows === 0) {
|
|
242
|
+
return void 0;
|
|
243
|
+
}
|
|
244
|
+
const elapsed = Date.now() - startTime.getTime();
|
|
245
|
+
const avgTimePerRow = elapsed / processedRows;
|
|
246
|
+
const remainingRows = totalRows - processedRows;
|
|
247
|
+
const remainingTime = avgTimePerRow * remainingRows;
|
|
248
|
+
return new Date(Date.now() + remainingTime);
|
|
249
|
+
}
|
|
250
|
+
function getNestedValue(obj, path) {
|
|
251
|
+
return path.split(".").reduce((current, key) => {
|
|
252
|
+
return current && current[key] !== void 0 ? current[key] : null;
|
|
253
|
+
}, obj);
|
|
254
|
+
}
|
|
255
|
+
function setNestedValue(obj, path, value) {
|
|
256
|
+
const keys = path.split(".");
|
|
257
|
+
const lastKey = keys.pop();
|
|
258
|
+
if (!lastKey) return;
|
|
259
|
+
const target = keys.reduce((current, key) => {
|
|
260
|
+
if (!current[key] || typeof current[key] !== "object") {
|
|
261
|
+
current[key] = {};
|
|
262
|
+
}
|
|
263
|
+
return current[key];
|
|
264
|
+
}, obj);
|
|
265
|
+
target[lastKey] = value;
|
|
266
|
+
}
|
|
267
|
+
function createExportError(code, message, details) {
|
|
268
|
+
return {
|
|
269
|
+
code,
|
|
270
|
+
message,
|
|
271
|
+
details,
|
|
272
|
+
timestamp: /* @__PURE__ */ new Date()
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
function formatErrorMessage(error) {
|
|
276
|
+
if (error instanceof Error) {
|
|
277
|
+
return error.message;
|
|
278
|
+
}
|
|
279
|
+
if (typeof error === "string") {
|
|
280
|
+
return error;
|
|
281
|
+
}
|
|
282
|
+
return "\u672A\u77E5\u9519\u8BEF";
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// src/universalExport/client.ts
|
|
286
|
+
var UniversalExportClient = class {
|
|
287
|
+
constructor(config = {}) {
|
|
288
|
+
this.config = {
|
|
289
|
+
baseUrl: config.baseUrl || "",
|
|
290
|
+
timeout: config.timeout || 3e4,
|
|
291
|
+
headers: config.headers || {}
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
// ============= 配置管理API =============
|
|
295
|
+
/**
|
|
296
|
+
* 获取模块的导出配置列表
|
|
297
|
+
*/
|
|
298
|
+
async getConfigsByModule(moduleId, businessId) {
|
|
299
|
+
const params = new URLSearchParams({ moduleId });
|
|
300
|
+
if (businessId) {
|
|
301
|
+
params.append("businessId", businessId);
|
|
302
|
+
}
|
|
303
|
+
const url = `${this.config.baseUrl}${API_ENDPOINTS.GET_CONFIGS}?${params}`;
|
|
304
|
+
try {
|
|
305
|
+
const response = await this.fetchWithTimeout(url, {
|
|
306
|
+
method: "GET",
|
|
307
|
+
headers: this.getHeaders()
|
|
308
|
+
});
|
|
309
|
+
if (!response.ok) {
|
|
310
|
+
throw new Error(`\u83B7\u53D6\u914D\u7F6E\u5931\u8D25: ${response.statusText}`);
|
|
311
|
+
}
|
|
312
|
+
const data = await response.json();
|
|
313
|
+
return this.transformConfigsFromAPI(data.configs || []);
|
|
314
|
+
} catch (error) {
|
|
315
|
+
throw createExportError(
|
|
316
|
+
ERROR_CODES.NETWORK_ERROR,
|
|
317
|
+
`\u83B7\u53D6\u5BFC\u51FA\u914D\u7F6E\u5931\u8D25: ${formatErrorMessage(error)}`,
|
|
318
|
+
{ moduleId, businessId, originalError: error }
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* 创建导出配置
|
|
324
|
+
*/
|
|
325
|
+
async createConfig(config) {
|
|
326
|
+
const url = `${this.config.baseUrl}${API_ENDPOINTS.CREATE_CONFIG}`;
|
|
327
|
+
try {
|
|
328
|
+
const response = await this.fetchWithTimeout(url, {
|
|
329
|
+
method: "POST",
|
|
330
|
+
headers: {
|
|
331
|
+
...this.getHeaders(),
|
|
332
|
+
"Content-Type": "application/json"
|
|
333
|
+
},
|
|
334
|
+
body: JSON.stringify(config)
|
|
335
|
+
});
|
|
336
|
+
if (!response.ok) {
|
|
337
|
+
throw new Error(`\u521B\u5EFA\u914D\u7F6E\u5931\u8D25: ${response.statusText}`);
|
|
338
|
+
}
|
|
339
|
+
const data = await response.json();
|
|
340
|
+
return this.transformConfigFromAPI(data.config);
|
|
341
|
+
} catch (error) {
|
|
342
|
+
throw createExportError(
|
|
343
|
+
ERROR_CODES.NETWORK_ERROR,
|
|
344
|
+
`\u521B\u5EFA\u5BFC\u51FA\u914D\u7F6E\u5931\u8D25: ${formatErrorMessage(error)}`,
|
|
345
|
+
{ config, originalError: error }
|
|
346
|
+
);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* 更新导出配置
|
|
351
|
+
*/
|
|
352
|
+
async updateConfig(configId, updates) {
|
|
353
|
+
const url = `${this.config.baseUrl}${API_ENDPOINTS.UPDATE_CONFIG(configId)}`;
|
|
354
|
+
try {
|
|
355
|
+
const response = await this.fetchWithTimeout(url, {
|
|
356
|
+
method: "PUT",
|
|
357
|
+
headers: {
|
|
358
|
+
...this.getHeaders(),
|
|
359
|
+
"Content-Type": "application/json"
|
|
360
|
+
},
|
|
361
|
+
body: JSON.stringify(updates)
|
|
362
|
+
});
|
|
363
|
+
if (!response.ok) {
|
|
364
|
+
throw new Error(`\u66F4\u65B0\u914D\u7F6E\u5931\u8D25: ${response.statusText}`);
|
|
365
|
+
}
|
|
366
|
+
const data = await response.json();
|
|
367
|
+
return this.transformConfigFromAPI(data.config);
|
|
368
|
+
} catch (error) {
|
|
369
|
+
throw createExportError(
|
|
370
|
+
ERROR_CODES.NETWORK_ERROR,
|
|
371
|
+
`\u66F4\u65B0\u5BFC\u51FA\u914D\u7F6E\u5931\u8D25: ${formatErrorMessage(error)}`,
|
|
372
|
+
{ configId, updates, originalError: error }
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* 删除导出配置
|
|
378
|
+
*/
|
|
379
|
+
async deleteConfig(configId) {
|
|
380
|
+
const url = `${this.config.baseUrl}${API_ENDPOINTS.DELETE_CONFIG(configId)}`;
|
|
381
|
+
try {
|
|
382
|
+
const response = await this.fetchWithTimeout(url, {
|
|
383
|
+
method: "DELETE",
|
|
384
|
+
headers: this.getHeaders()
|
|
385
|
+
});
|
|
386
|
+
if (!response.ok) {
|
|
387
|
+
throw new Error(`\u5220\u9664\u914D\u7F6E\u5931\u8D25: ${response.statusText}`);
|
|
388
|
+
}
|
|
389
|
+
} catch (error) {
|
|
390
|
+
throw createExportError(
|
|
391
|
+
ERROR_CODES.NETWORK_ERROR,
|
|
392
|
+
`\u5220\u9664\u5BFC\u51FA\u914D\u7F6E\u5931\u8D25: ${formatErrorMessage(error)}`,
|
|
393
|
+
{ configId, originalError: error }
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
// ============= 导出执行API =============
|
|
398
|
+
/**
|
|
399
|
+
* 触发数据导出
|
|
400
|
+
*/
|
|
401
|
+
async exportData(request) {
|
|
402
|
+
const url = `${this.config.baseUrl}${API_ENDPOINTS.EXPORT_DATA}`;
|
|
403
|
+
try {
|
|
404
|
+
const response = await this.fetchWithTimeout(url, {
|
|
405
|
+
method: "POST",
|
|
406
|
+
headers: {
|
|
407
|
+
...this.getHeaders(),
|
|
408
|
+
"Content-Type": "application/json"
|
|
409
|
+
},
|
|
410
|
+
body: JSON.stringify({
|
|
411
|
+
configId: request.configId,
|
|
412
|
+
dataSource: typeof request.dataSource === "string" ? request.dataSource : void 0,
|
|
413
|
+
queryParams: request.queryParams,
|
|
414
|
+
fieldMapping: request.fieldMapping,
|
|
415
|
+
filters: request.filters,
|
|
416
|
+
sortBy: request.sortBy,
|
|
417
|
+
pagination: request.pagination,
|
|
418
|
+
customFileName: request.customFileName
|
|
419
|
+
})
|
|
420
|
+
});
|
|
421
|
+
if (!response.ok) {
|
|
422
|
+
throw new Error(`\u5BFC\u51FA\u5931\u8D25: ${response.statusText}`);
|
|
423
|
+
}
|
|
424
|
+
const data = await response.json();
|
|
425
|
+
return this.transformExportResultFromAPI(data.result);
|
|
426
|
+
} catch (error) {
|
|
427
|
+
throw createExportError(
|
|
428
|
+
ERROR_CODES.EXPORT_DATA_ERROR,
|
|
429
|
+
`\u6570\u636E\u5BFC\u51FA\u5931\u8D25: ${formatErrorMessage(error)}`,
|
|
430
|
+
{ request, originalError: error }
|
|
431
|
+
);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* 查询导出进度
|
|
436
|
+
*/
|
|
437
|
+
async getExportProgress(exportId) {
|
|
438
|
+
const url = `${this.config.baseUrl}${API_ENDPOINTS.GET_PROGRESS(exportId)}`;
|
|
439
|
+
try {
|
|
440
|
+
const response = await this.fetchWithTimeout(url, {
|
|
441
|
+
method: "GET",
|
|
442
|
+
headers: this.getHeaders()
|
|
443
|
+
});
|
|
444
|
+
if (!response.ok) {
|
|
445
|
+
throw new Error(`\u83B7\u53D6\u5BFC\u51FA\u8FDB\u5EA6\u5931\u8D25: ${response.statusText}`);
|
|
446
|
+
}
|
|
447
|
+
const data = await response.json();
|
|
448
|
+
return this.transformProgressFromAPI(data.progress);
|
|
449
|
+
} catch (error) {
|
|
450
|
+
throw createExportError(
|
|
451
|
+
ERROR_CODES.NETWORK_ERROR,
|
|
452
|
+
`\u83B7\u53D6\u5BFC\u51FA\u8FDB\u5EA6\u5931\u8D25: ${formatErrorMessage(error)}`,
|
|
453
|
+
{ exportId, originalError: error }
|
|
454
|
+
);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* 下载导出文件
|
|
459
|
+
*/
|
|
460
|
+
async downloadExportFile(exportId) {
|
|
461
|
+
const url = `${this.config.baseUrl}${API_ENDPOINTS.DOWNLOAD_FILE(exportId)}`;
|
|
462
|
+
try {
|
|
463
|
+
const response = await this.fetchWithTimeout(url, {
|
|
464
|
+
method: "GET",
|
|
465
|
+
headers: this.getHeaders()
|
|
466
|
+
});
|
|
467
|
+
if (!response.ok) {
|
|
468
|
+
throw new Error(`\u4E0B\u8F7D\u6587\u4EF6\u5931\u8D25: ${response.statusText}`);
|
|
469
|
+
}
|
|
470
|
+
return await response.blob();
|
|
471
|
+
} catch (error) {
|
|
472
|
+
throw createExportError(
|
|
473
|
+
ERROR_CODES.NETWORK_ERROR,
|
|
474
|
+
`\u4E0B\u8F7D\u5BFC\u51FA\u6587\u4EF6\u5931\u8D25: ${formatErrorMessage(error)}`,
|
|
475
|
+
{ exportId, originalError: error }
|
|
476
|
+
);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
// ============= 私有辅助方法 =============
|
|
480
|
+
/**
|
|
481
|
+
* 获取请求头
|
|
482
|
+
*/
|
|
483
|
+
getHeaders() {
|
|
484
|
+
return {
|
|
485
|
+
...this.config.headers
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* 带超时的fetch请求
|
|
490
|
+
*/
|
|
491
|
+
async fetchWithTimeout(url, options) {
|
|
492
|
+
const controller = new AbortController();
|
|
493
|
+
const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
|
|
494
|
+
try {
|
|
495
|
+
const response = await fetch(url, {
|
|
496
|
+
...options,
|
|
497
|
+
signal: controller.signal
|
|
498
|
+
});
|
|
499
|
+
return response;
|
|
500
|
+
} catch (error) {
|
|
501
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
502
|
+
throw createExportError(ERROR_CODES.TIMEOUT_ERROR, "\u8BF7\u6C42\u8D85\u65F6", {
|
|
503
|
+
url,
|
|
504
|
+
timeout: this.config.timeout
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
throw error;
|
|
508
|
+
} finally {
|
|
509
|
+
clearTimeout(timeoutId);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* 转换API返回的配置数据
|
|
514
|
+
*/
|
|
515
|
+
transformConfigFromAPI(apiConfig) {
|
|
516
|
+
return {
|
|
517
|
+
id: apiConfig.id,
|
|
518
|
+
name: apiConfig.name,
|
|
519
|
+
description: apiConfig.description || void 0,
|
|
520
|
+
format: apiConfig.format,
|
|
521
|
+
fields: apiConfig.fields,
|
|
522
|
+
grouping: apiConfig.grouping,
|
|
523
|
+
fileNameTemplate: apiConfig.fileNameTemplate,
|
|
524
|
+
includeHeader: apiConfig.includeHeader,
|
|
525
|
+
delimiter: apiConfig.delimiter,
|
|
526
|
+
encoding: apiConfig.encoding,
|
|
527
|
+
addBOM: apiConfig.addBOM,
|
|
528
|
+
maxRows: apiConfig.maxRows || void 0,
|
|
529
|
+
createdAt: new Date(apiConfig.createdAt),
|
|
530
|
+
updatedAt: new Date(apiConfig.updatedAt),
|
|
531
|
+
moduleId: apiConfig.moduleId,
|
|
532
|
+
businessId: apiConfig.businessId || void 0,
|
|
533
|
+
createdBy: apiConfig.createdBy || void 0
|
|
534
|
+
};
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* 转换API返回的配置列表
|
|
538
|
+
*/
|
|
539
|
+
transformConfigsFromAPI(apiConfigs) {
|
|
540
|
+
return apiConfigs.map((config) => this.transformConfigFromAPI(config));
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* 转换API返回的导出结果
|
|
544
|
+
*/
|
|
545
|
+
transformExportResultFromAPI(apiResult) {
|
|
546
|
+
return {
|
|
547
|
+
exportId: apiResult.exportId,
|
|
548
|
+
fileName: apiResult.fileName,
|
|
549
|
+
fileSize: apiResult.fileSize,
|
|
550
|
+
fileUrl: apiResult.fileUrl,
|
|
551
|
+
exportedRows: apiResult.exportedRows,
|
|
552
|
+
startTime: new Date(apiResult.startTime),
|
|
553
|
+
endTime: new Date(apiResult.endTime),
|
|
554
|
+
duration: apiResult.duration,
|
|
555
|
+
statistics: apiResult.statistics
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* 转换API返回的进度数据
|
|
560
|
+
*/
|
|
561
|
+
transformProgressFromAPI(apiProgress) {
|
|
562
|
+
return {
|
|
563
|
+
exportId: apiProgress.exportId,
|
|
564
|
+
status: apiProgress.status,
|
|
565
|
+
progress: apiProgress.progress,
|
|
566
|
+
processedRows: apiProgress.processedRows,
|
|
567
|
+
totalRows: apiProgress.totalRows,
|
|
568
|
+
startTime: new Date(apiProgress.startTime),
|
|
569
|
+
estimatedEndTime: apiProgress.estimatedEndTime ? new Date(apiProgress.estimatedEndTime) : void 0,
|
|
570
|
+
currentData: apiProgress.currentData,
|
|
571
|
+
error: apiProgress.error
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
};
|
|
575
|
+
var universalExportClient = new UniversalExportClient();
|
|
576
|
+
function createExportClient(config) {
|
|
577
|
+
return new UniversalExportClient(config);
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
exports.API_BASE_PATH = API_BASE_PATH;
|
|
581
|
+
exports.API_ENDPOINTS = API_ENDPOINTS;
|
|
582
|
+
exports.DEFAULT_ADD_BOM = DEFAULT_ADD_BOM;
|
|
583
|
+
exports.DEFAULT_CONFIG_CACHE_TTL = DEFAULT_CONFIG_CACHE_TTL;
|
|
584
|
+
exports.DEFAULT_CSV_DELIMITER = DEFAULT_CSV_DELIMITER;
|
|
585
|
+
exports.DEFAULT_ENCODING = DEFAULT_ENCODING;
|
|
586
|
+
exports.DEFAULT_EXPORT_FORMAT = DEFAULT_EXPORT_FORMAT;
|
|
587
|
+
exports.DEFAULT_EXPORT_TIMEOUT = DEFAULT_EXPORT_TIMEOUT;
|
|
588
|
+
exports.DEFAULT_FORMATTERS = DEFAULT_FORMATTERS;
|
|
589
|
+
exports.DEFAULT_MAX_CONCURRENT_EXPORTS = DEFAULT_MAX_CONCURRENT_EXPORTS;
|
|
590
|
+
exports.DEFAULT_MAX_FILE_SIZE = DEFAULT_MAX_FILE_SIZE;
|
|
591
|
+
exports.DEFAULT_MAX_ROWS = DEFAULT_MAX_ROWS;
|
|
592
|
+
exports.DEFAULT_RESULT_CACHE_TTL = DEFAULT_RESULT_CACHE_TTL;
|
|
593
|
+
exports.ERROR_CODES = ERROR_CODES;
|
|
594
|
+
exports.EXPORT_FORMAT_EXTENSIONS = EXPORT_FORMAT_EXTENSIONS;
|
|
595
|
+
exports.EXPORT_FORMAT_MIME_TYPES = EXPORT_FORMAT_MIME_TYPES;
|
|
596
|
+
exports.ExportConfigError = ExportConfigError;
|
|
597
|
+
exports.ExportDataError = ExportDataError;
|
|
598
|
+
exports.ExportFileError = ExportFileError;
|
|
599
|
+
exports.ExportServiceError = ExportServiceError;
|
|
600
|
+
exports.UNIVERSAL_EXPORT_NAME = UNIVERSAL_EXPORT_NAME;
|
|
601
|
+
exports.UNIVERSAL_EXPORT_VERSION = UNIVERSAL_EXPORT_VERSION;
|
|
602
|
+
exports.UniversalExportClient = UniversalExportClient;
|
|
603
|
+
exports.applyFormatter = applyFormatter;
|
|
604
|
+
exports.createExportClient = createExportClient;
|
|
605
|
+
exports.createExportError = createExportError;
|
|
606
|
+
exports.escapeCSVField = escapeCSVField;
|
|
607
|
+
exports.estimateEndTime = estimateEndTime;
|
|
608
|
+
exports.formatDuration = formatDuration;
|
|
609
|
+
exports.formatErrorMessage = formatErrorMessage;
|
|
610
|
+
exports.formatFileSize = formatFileSize;
|
|
611
|
+
exports.generateExportFileName = generateExportFileName;
|
|
612
|
+
exports.getNestedValue = getNestedValue;
|
|
613
|
+
exports.parseCSVField = parseCSVField;
|
|
614
|
+
exports.sanitizeFileName = sanitizeFileName;
|
|
615
|
+
exports.setNestedValue = setNestedValue;
|
|
616
|
+
exports.universalExportClient = universalExportClient;
|
|
617
|
+
exports.validateExportConfig = validateExportConfig;
|
|
618
|
+
exports.validateExportRequest = validateExportRequest;
|
|
619
|
+
exports.validateFileName = validateFileName;
|
|
620
|
+
//# sourceMappingURL=index.js.map
|
|
621
|
+
//# sourceMappingURL=index.js.map
|