@boteteam/utils 0.0.28 → 0.0.30

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 (151) hide show
  1. package/README.md +23 -23
  2. package/dist/cjs/CookieUtils.js.map +1 -1
  3. package/dist/cjs/asyncStorage.js.map +1 -1
  4. package/dist/cjs/environment.js.map +1 -1
  5. package/dist/cjs/file.js.map +1 -1
  6. package/dist/cjs/fileToBase64.js.map +1 -1
  7. package/dist/cjs/formatModule/formatModuleData.js +99 -9
  8. package/dist/cjs/formatModule/formatModuleData.js.map +2 -2
  9. package/dist/cjs/formatModule/helpers/formRulsRegMap.js.map +1 -1
  10. package/dist/cjs/formatModule/helpers/formatCarouselProps.js.map +1 -1
  11. package/dist/cjs/formatModule/helpers/formatChartsProps.js.map +1 -1
  12. package/dist/cjs/formatModule/helpers/formatControlBtn.d.ts +8 -0
  13. package/dist/cjs/formatModule/helpers/formatControlBtn.js +67 -0
  14. package/dist/cjs/formatModule/helpers/formatControlBtn.js.map +7 -0
  15. package/dist/cjs/formatModule/helpers/formatDescriptionsProps.js.map +1 -1
  16. package/dist/cjs/formatModule/helpers/formatEchartCommonProps.js.map +1 -1
  17. package/dist/cjs/formatModule/helpers/formatEchartLineProps.js.map +1 -1
  18. package/dist/cjs/formatModule/helpers/formatEchartPieProps.js.map +1 -1
  19. package/dist/cjs/formatModule/helpers/formatFormProps.d.ts +4 -1
  20. package/dist/cjs/formatModule/helpers/formatFormProps.js +51 -28
  21. package/dist/cjs/formatModule/helpers/formatFormProps.js.map +2 -2
  22. package/dist/cjs/formatModule/helpers/formatHighCodeProps.js.map +1 -1
  23. package/dist/cjs/formatModule/helpers/formatIconProps.d.ts +16 -0
  24. package/dist/cjs/formatModule/helpers/formatIconProps.js +49 -0
  25. package/dist/cjs/formatModule/helpers/formatIconProps.js.map +7 -0
  26. package/dist/cjs/formatModule/helpers/formatImageProps.js.map +1 -1
  27. package/dist/cjs/formatModule/helpers/formatListProps.js +69 -44
  28. package/dist/cjs/formatModule/helpers/formatListProps.js.map +3 -3
  29. package/dist/cjs/formatModule/helpers/formatLoopProps.d.ts +26 -2
  30. package/dist/cjs/formatModule/helpers/formatLoopProps.js +17 -10
  31. package/dist/cjs/formatModule/helpers/formatLoopProps.js.map +3 -3
  32. package/dist/cjs/formatModule/helpers/formatPanelProps.d.ts +8 -0
  33. package/dist/cjs/formatModule/helpers/formatPanelProps.js +67 -0
  34. package/dist/cjs/formatModule/helpers/formatPanelProps.js.map +7 -0
  35. package/dist/cjs/formatModule/helpers/formatStepsProps.js.map +1 -1
  36. package/dist/cjs/formatModule/helpers/formatStyleProps.js.map +1 -1
  37. package/dist/cjs/formatModule/helpers/formatTableProps.d.ts +5 -0
  38. package/dist/cjs/formatModule/helpers/formatTableProps.js +20 -0
  39. package/dist/cjs/formatModule/helpers/formatTableProps.js.map +3 -3
  40. package/dist/cjs/formatModule/helpers/index.d.ts +4 -1
  41. package/dist/cjs/formatModule/helpers/index.js +9 -0
  42. package/dist/cjs/formatModule/helpers/index.js.map +3 -3
  43. package/dist/cjs/formatModule/helpers/patternTransitionRegExp.js.map +1 -1
  44. package/dist/cjs/formatModule/helpers/staticCodeAssemble.js.map +1 -1
  45. package/dist/cjs/formatModule/helpers/stringPramarsValTransition.js.map +1 -1
  46. package/dist/cjs/formatModule/helpers/stringScriptExecution.js.map +1 -1
  47. package/dist/cjs/formatModule/helpers/urlPrefix.js.map +1 -1
  48. package/dist/cjs/getValueByPath.d.ts +10 -0
  49. package/dist/cjs/getValueByPath.js +69 -0
  50. package/dist/cjs/getValueByPath.js.map +7 -0
  51. package/dist/cjs/http.d.ts +8 -0
  52. package/dist/cjs/http.js +37 -1
  53. package/dist/cjs/http.js.map +2 -2
  54. package/dist/cjs/index.d.ts +5 -2
  55. package/dist/cjs/index.js +17 -0
  56. package/dist/cjs/index.js.map +3 -3
  57. package/dist/cjs/loopPageServiceApiMap.d.ts +17 -0
  58. package/dist/cjs/loopPageServiceApiMap.js +54 -0
  59. package/dist/cjs/loopPageServiceApiMap.js.map +7 -0
  60. package/dist/cjs/loopPageStaticCodeMap.js.map +1 -1
  61. package/dist/cjs/markdownEscape.js.map +1 -1
  62. package/dist/cjs/pathArgsUtils.js.map +1 -1
  63. package/dist/cjs/scriptExecution.js.map +1 -1
  64. package/dist/cjs/securityUtils.js +1 -1
  65. package/dist/cjs/securityUtils.js.map +2 -2
  66. package/dist/cjs/stringUtils.js.map +1 -1
  67. package/dist/cjs/timeFormat.d.ts +44 -0
  68. package/dist/cjs/timeFormat.js +127 -0
  69. package/dist/cjs/timeFormat.js.map +7 -0
  70. package/dist/cjs/treeUtils.js.map +1 -1
  71. package/dist/cjs/watchMatchMedia.js.map +1 -1
  72. package/dist/esm/CookieUtils.js.map +1 -1
  73. package/dist/esm/asyncStorage.js +4 -4
  74. package/dist/esm/asyncStorage.js.map +1 -1
  75. package/dist/esm/environment.js +3 -3
  76. package/dist/esm/environment.js.map +1 -1
  77. package/dist/esm/file.js +32 -32
  78. package/dist/esm/file.js.map +1 -1
  79. package/dist/esm/fileToBase64.js +4 -4
  80. package/dist/esm/fileToBase64.js.map +1 -1
  81. package/dist/esm/formatModule/formatModuleData.js +118 -26
  82. package/dist/esm/formatModule/formatModuleData.js.map +1 -1
  83. package/dist/esm/formatModule/helpers/formRulsRegMap.js.map +1 -1
  84. package/dist/esm/formatModule/helpers/formatCarouselProps.js.map +1 -1
  85. package/dist/esm/formatModule/helpers/formatChartsProps.js.map +1 -1
  86. package/dist/esm/formatModule/helpers/formatControlBtn.d.ts +8 -0
  87. package/dist/esm/formatModule/helpers/formatControlBtn.js +41 -0
  88. package/dist/esm/formatModule/helpers/formatControlBtn.js.map +1 -0
  89. package/dist/esm/formatModule/helpers/formatDescriptionsProps.js.map +1 -1
  90. package/dist/esm/formatModule/helpers/formatEchartCommonProps.js.map +1 -1
  91. package/dist/esm/formatModule/helpers/formatEchartLineProps.js.map +1 -1
  92. package/dist/esm/formatModule/helpers/formatEchartPieProps.js.map +1 -1
  93. package/dist/esm/formatModule/helpers/formatFormProps.d.ts +4 -1
  94. package/dist/esm/formatModule/helpers/formatFormProps.js +93 -31
  95. package/dist/esm/formatModule/helpers/formatFormProps.js.map +1 -1
  96. package/dist/esm/formatModule/helpers/formatHighCodeProps.js.map +1 -1
  97. package/dist/esm/formatModule/helpers/formatIconProps.d.ts +16 -0
  98. package/dist/esm/formatModule/helpers/formatIconProps.js +25 -0
  99. package/dist/esm/formatModule/helpers/formatIconProps.js.map +1 -0
  100. package/dist/esm/formatModule/helpers/formatImageProps.js.map +1 -1
  101. package/dist/esm/formatModule/helpers/formatListProps.js +69 -44
  102. package/dist/esm/formatModule/helpers/formatListProps.js.map +1 -1
  103. package/dist/esm/formatModule/helpers/formatLoopProps.d.ts +26 -2
  104. package/dist/esm/formatModule/helpers/formatLoopProps.js +35 -7
  105. package/dist/esm/formatModule/helpers/formatLoopProps.js.map +1 -1
  106. package/dist/esm/formatModule/helpers/formatPanelProps.d.ts +8 -0
  107. package/dist/esm/formatModule/helpers/formatPanelProps.js +41 -0
  108. package/dist/esm/formatModule/helpers/formatPanelProps.js.map +1 -0
  109. package/dist/esm/formatModule/helpers/formatStepsProps.js.map +1 -1
  110. package/dist/esm/formatModule/helpers/formatStyleProps.js.map +1 -1
  111. package/dist/esm/formatModule/helpers/formatTableProps.d.ts +5 -0
  112. package/dist/esm/formatModule/helpers/formatTableProps.js +12 -0
  113. package/dist/esm/formatModule/helpers/formatTableProps.js.map +1 -1
  114. package/dist/esm/formatModule/helpers/index.d.ts +4 -1
  115. package/dist/esm/formatModule/helpers/index.js +4 -1
  116. package/dist/esm/formatModule/helpers/index.js.map +1 -1
  117. package/dist/esm/formatModule/helpers/patternTransitionRegExp.js.map +1 -1
  118. package/dist/esm/formatModule/helpers/staticCodeAssemble.js +4 -4
  119. package/dist/esm/formatModule/helpers/staticCodeAssemble.js.map +1 -1
  120. package/dist/esm/formatModule/helpers/stringPramarsValTransition.js.map +1 -1
  121. package/dist/esm/formatModule/helpers/stringScriptExecution.js.map +1 -1
  122. package/dist/esm/formatModule/helpers/urlPrefix.js.map +1 -1
  123. package/dist/esm/getValueByPath.d.ts +10 -0
  124. package/dist/esm/getValueByPath.js +87 -0
  125. package/dist/esm/getValueByPath.js.map +1 -0
  126. package/dist/esm/http.d.ts +8 -0
  127. package/dist/esm/http.js +97 -58
  128. package/dist/esm/http.js.map +1 -1
  129. package/dist/esm/index.d.ts +5 -2
  130. package/dist/esm/index.js +5 -2
  131. package/dist/esm/index.js.map +1 -1
  132. package/dist/esm/loopPageServiceApiMap.d.ts +17 -0
  133. package/dist/esm/loopPageServiceApiMap.js +40 -0
  134. package/dist/esm/loopPageServiceApiMap.js.map +1 -0
  135. package/dist/esm/loopPageStaticCodeMap.js.map +1 -1
  136. package/dist/esm/markdownEscape.js.map +1 -1
  137. package/dist/esm/pathArgsUtils.js +8 -8
  138. package/dist/esm/pathArgsUtils.js.map +1 -1
  139. package/dist/esm/scriptExecution.js.map +1 -1
  140. package/dist/esm/securityUtils.js +20 -20
  141. package/dist/esm/securityUtils.js.map +1 -1
  142. package/dist/esm/stringUtils.js.map +1 -1
  143. package/dist/esm/timeFormat.d.ts +44 -0
  144. package/dist/esm/timeFormat.js +121 -0
  145. package/dist/esm/timeFormat.js.map +1 -0
  146. package/dist/esm/treeUtils.js +8 -8
  147. package/dist/esm/treeUtils.js.map +1 -1
  148. package/dist/esm/watchMatchMedia.js.map +1 -1
  149. package/dist/umd/index.min.js +1 -1
  150. package/dist/umd/index.min.js.map +1 -1
  151. package/package.json +4 -3
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/formatModule/helpers/urlPrefix.ts"],
4
- "sourcesContent": ["const urlPrefix = `${process.env.REACT_APP_REQ_PREFIX}/bote/`;\r\n\r\nexport default urlPrefix;\r\n"],
4
+ "sourcesContent": ["const urlPrefix = `${process.env.REACT_APP_REQ_PREFIX}/bote/`;\n\nexport default urlPrefix;\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAM,YAAY,GAAG,QAAQ,IAAI;AAEjC,IAAO,oBAAQ;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 根据路径字符串从对象中提取数据
3
+ * @param obj - 要提取数据的对象
4
+ * @param path - 路径字符串,例如 'res.data.list' 或 'user.name'
5
+ * @returns 提取到的数据,如果路径无效返回 null
6
+ */
7
+ export declare const getValueByPath: (obj: any, path: string) => any;
8
+ export declare const replaceServiceApiValue: (contentStr: string, item: {
9
+ [key: string]: any;
10
+ }) => string;
@@ -0,0 +1,69 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/getValueByPath.ts
20
+ var getValueByPath_exports = {};
21
+ __export(getValueByPath_exports, {
22
+ getValueByPath: () => getValueByPath,
23
+ replaceServiceApiValue: () => replaceServiceApiValue
24
+ });
25
+ module.exports = __toCommonJS(getValueByPath_exports);
26
+ var getValueByPath = (obj, path) => {
27
+ if (!path || !obj) {
28
+ return null;
29
+ }
30
+ const pathArr = path.split(".").filter(Boolean);
31
+ if (pathArr.length === 0) {
32
+ return null;
33
+ }
34
+ let currentData = obj;
35
+ if (pathArr[0] === "res") {
36
+ currentData = obj.res || obj;
37
+ pathArr.shift();
38
+ }
39
+ for (const key of pathArr) {
40
+ if (!key || !currentData || typeof currentData !== "object" || !currentData.hasOwnProperty(key)) {
41
+ return null;
42
+ }
43
+ currentData = currentData[key];
44
+ }
45
+ return currentData;
46
+ };
47
+ var replaceServiceApiValue = (contentStr, item) => {
48
+ if (!contentStr || typeof contentStr !== "string" || !item) {
49
+ return contentStr || "";
50
+ }
51
+ return contentStr.replace(/\$\{row\.(.+?)\}/g, (match, fieldPath) => {
52
+ const fieldPathArr = fieldPath.split(".").filter(Boolean);
53
+ let fieldValue = item;
54
+ for (const key of fieldPathArr) {
55
+ if (fieldValue && typeof fieldValue === "object" && key in fieldValue) {
56
+ fieldValue = fieldValue[key];
57
+ } else {
58
+ return "";
59
+ }
60
+ }
61
+ return fieldValue != null ? String(fieldValue) : "";
62
+ });
63
+ };
64
+ // Annotate the CommonJS export names for ESM import in node:
65
+ 0 && (module.exports = {
66
+ getValueByPath,
67
+ replaceServiceApiValue
68
+ });
69
+ //# sourceMappingURL=getValueByPath.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/getValueByPath.ts"],
4
+ "sourcesContent": ["/**\n * 根据路径字符串从对象中提取数据\n * @param obj - 要提取数据的对象\n * @param path - 路径字符串,例如 'res.data.list' 或 'user.name'\n * @returns 提取到的数据,如果路径无效返回 null\n */\nexport const getValueByPath = (obj: any, path: string): any => {\n // 空值检查:如果 path 或 obj 为空,返回 null\n if (!path || !obj) {\n return null;\n }\n\n // 分割路径并过滤空字符串\n const pathArr = path.split('.').filter(Boolean);\n \n // 如果过滤后路径为空,返回 null\n if (pathArr.length === 0) {\n return null;\n }\n\n // 如果路径以 res 开头,从 res 对象开始提取\n let currentData = obj;\n if (pathArr[0] === 'res') {\n currentData = obj.res || obj;\n pathArr.shift(); // 移除 'res'\n }\n\n // 遍历剩余路径获取数据,使用严格检查\n for (const key of pathArr) {\n // 严格检查:必须存在且为对象,且必须拥有该属性\n if (\n !key ||\n !currentData ||\n typeof currentData !== 'object' ||\n !currentData.hasOwnProperty(key)\n ) {\n return null;\n }\n // 继续深入下一层\n currentData = currentData[key];\n }\n\n // 返回最终的值\n return currentData;\n};\n\n// 替换 serviceApi 数据源中的模板字符串\nexport const replaceServiceApiValue = (\n contentStr: string,\n item: { [key: string]: any },\n): string => {\n if (!contentStr || typeof contentStr !== 'string' || !item) {\n return contentStr || '';\n }\n \n // 匹配 ${row.xxx} 格式的模板字符串\n return contentStr.replace(/\\$\\{row\\.(.+?)\\}/g, (match, fieldPath) => {\n // 支持嵌套字段,如 row.ACCESS_NAME 或 row.user.name\n const fieldPathArr = fieldPath.split('.').filter(Boolean);\n let fieldValue = item;\n \n // 遍历路径获取值\n for (const key of fieldPathArr) {\n if (fieldValue && typeof fieldValue === 'object' && key in fieldValue) {\n fieldValue = fieldValue[key];\n } else {\n return '';\n }\n }\n \n return fieldValue != null ? String(fieldValue) : '';\n });\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMO,IAAM,iBAAiB,CAAC,KAAU,SAAsB;AAE7D,MAAI,CAAC,QAAQ,CAAC,KAAK;AACjB,WAAO;AAAA,EACT;AAGA,QAAM,UAAU,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAG9C,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAGA,MAAI,cAAc;AAClB,MAAI,QAAQ,CAAC,MAAM,OAAO;AACxB,kBAAc,IAAI,OAAO;AACzB,YAAQ,MAAM;AAAA,EAChB;AAGA,aAAW,OAAO,SAAS;AAEzB,QACE,CAAC,OACD,CAAC,eACD,OAAO,gBAAgB,YACvB,CAAC,YAAY,eAAe,GAAG,GAC/B;AACA,aAAO;AAAA,IACT;AAEA,kBAAc,YAAY,GAAG;AAAA,EAC/B;AAGA,SAAO;AACT;AAGO,IAAM,yBAAyB,CACpC,YACA,SACW;AACX,MAAI,CAAC,cAAc,OAAO,eAAe,YAAY,CAAC,MAAM;AAC1D,WAAO,cAAc;AAAA,EACvB;AAGA,SAAO,WAAW,QAAQ,qBAAqB,CAAC,OAAO,cAAc;AAEnE,UAAM,eAAe,UAAU,MAAM,GAAG,EAAE,OAAO,OAAO;AACxD,QAAI,aAAa;AAGjB,eAAW,OAAO,cAAc;AAC9B,UAAI,cAAc,OAAO,eAAe,YAAY,OAAO,YAAY;AACrE,qBAAa,WAAW,GAAG;AAAA,MAC7B,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO,cAAc,OAAO,OAAO,UAAU,IAAI;AAAA,EACnD,CAAC;AACH;",
6
+ "names": []
7
+ }
@@ -9,8 +9,10 @@ declare const request: {
9
9
  setUrlPrefix: (prefix: string) => void;
10
10
  setTenantId: (tenantId: string) => void;
11
11
  getManagerUrl: (route?: string | null) => string | null;
12
+ getUserIconUrl: (userId?: string, updatedTime?: string, isSecurity?: boolean) => string;
12
13
  getBotUrl: (route?: string | null) => string | null;
13
14
  getBotIconUrl: (tenantId?: string, botId?: string, updatedTime?: string, isSecurity?: boolean) => string | undefined;
15
+ getPlatBotIconUrl: (platBotId: string) => string | undefined;
14
16
  getSceneIconUrl: (tenantId?: string, sceneId?: string, updatedTime?: string, isSecurity?: boolean) => string | undefined;
15
17
  getBotPageSettingIcon: ({ botId, tenantId, type, updatedTime, isSecurity, }: {
16
18
  botId: string;
@@ -19,6 +21,12 @@ declare const request: {
19
21
  updatedTime?: string | undefined;
20
22
  isSecurity?: boolean | undefined;
21
23
  }) => string;
24
+ getWorkspaceIcon: ({ spaceId }: {
25
+ spaceId: string;
26
+ }) => string | undefined;
27
+ getTenantIcon: ({ tenantId }: {
28
+ tenantId: string;
29
+ }) => string | undefined;
22
30
  docChain: {
23
31
  referenceDocUrl: ({ tenantId, docId, token, }: {
24
32
  [key: string]: string;
package/dist/cjs/http.js CHANGED
@@ -43,7 +43,10 @@ var http = (url, config) => {
43
43
  if (token) {
44
44
  config.headers.Authorization = `Bearer ${token}`;
45
45
  }
46
- config.headers["Tenant-Id"] = currentTenantId;
46
+ const tenantId = currentTenantId || sessionStorage.getItem(tenantIdSessionKey) || sessionStorage.getItem("managerSelectedTenantID");
47
+ if (tenantId) {
48
+ config.headers["Tenant-Id"] = tenantId;
49
+ }
47
50
  return new Promise((resolve, rejects) => {
48
51
  fetch(url, config).then((response) => {
49
52
  const contentType = response.headers.get("content-type");
@@ -120,6 +123,17 @@ var request = {
120
123
  currentTenantId = tenantId;
121
124
  },
122
125
  getManagerUrl,
126
+ // 获取用户头像
127
+ getUserIconUrl: (userId, updatedTime, isSecurity = true) => {
128
+ let url = `${baseUrl}/manager/user/userIcon?userId=${userId || ""}`;
129
+ if (updatedTime) {
130
+ url += `&_=${updatedTime.replace(/\D/g, "")}`;
131
+ }
132
+ if (isSecurity) {
133
+ url = import_security.default.autoSecurityWithUrl(url);
134
+ }
135
+ return url;
136
+ },
123
137
  getBotUrl,
124
138
  // 获取智能应用图标地址
125
139
  getBotIconUrl: (tenantId, botId, updatedTime, isSecurity = true) => {
@@ -135,6 +149,13 @@ var request = {
135
149
  }
136
150
  return void 0;
137
151
  },
152
+ getPlatBotIconUrl: (platBotId) => {
153
+ if (platBotId) {
154
+ const url = `${baseUrl}/manager/platBotInfo/getPlatBotIcon?platBotId=${platBotId}`;
155
+ return url;
156
+ }
157
+ return void 0;
158
+ },
138
159
  // 获取智能体图标地址
139
160
  getSceneIconUrl: (tenantId, sceneId, updatedTime, isSecurity = true) => {
140
161
  if (tenantId && sceneId) {
@@ -166,6 +187,21 @@ var request = {
166
187
  }
167
188
  return url;
168
189
  },
190
+ getWorkspaceIcon: ({ spaceId }) => {
191
+ if (spaceId) {
192
+ const url = `${baseUrl}/manager/workspace/getWorkspaceIcon?spaceId=${spaceId}`;
193
+ return url;
194
+ }
195
+ return void 0;
196
+ },
197
+ // 获取项目头像
198
+ getTenantIcon: ({ tenantId }) => {
199
+ if (tenantId) {
200
+ const url = `${baseUrl}/manager/tenant/getTenantIcon?tenantId=${tenantId}`;
201
+ return url;
202
+ }
203
+ return void 0;
204
+ },
169
205
  // 构造 DocChain 相关地址的辅助方法
170
206
  docChain: {
171
207
  referenceDocUrl: ({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/http.ts"],
4
- "sourcesContent": ["// import CookieUtil from './CookieUtils';\r\nimport security from '@lingxiteam/security';\r\nimport { getLocation } from './environment';\r\n\r\nexport const tenantIdSessionKey: string = 'botSelectedTenantID';\r\n\r\nconst http = (url: string, config: any) => {\r\n // const token = localStorage.getItem('X-Auth-Token');\r\n // config.headers['X-Auth-Token'] = token;\r\n config.headers['content-type'] = 'application/json;charset=UTF-8';\r\n\r\n // 获取 token\r\n const token = sessionStorage.getItem('token') as string;\r\n if (token) {\r\n config.headers.Authorization = `Bearer ${token}`;\r\n }\r\n\r\n // 兼容生产环境\r\n config.headers['Tenant-Id'] = currentTenantId;\r\n\r\n return new Promise((resolve, rejects) => {\r\n fetch(url, config)\r\n .then((response) => {\r\n const contentType: string | null = response.headers.get('content-type');\r\n if (contentType) {\r\n if (\r\n /application\\/octet-stream/.test(contentType) ||\r\n /application\\/zip/.test(contentType) ||\r\n /application\\/vnd\\.ms-excel/.test(contentType)\r\n ) {\r\n return response.blob();\r\n }\r\n if (/application\\/json/.test(contentType)) {\r\n return response.json();\r\n }\r\n if (/text\\/html/.test(contentType)) {\r\n return response.text();\r\n }\r\n }\r\n return response;\r\n })\r\n .then((data) => {\r\n if (Object.prototype.toString.call(data) === '[object Blob]') {\r\n if (\r\n typeof data === 'object' &&\r\n Object.hasOwnProperty.call(data, 'resultCode') &&\r\n String(data.resultCode) !== '0'\r\n ) {\r\n return Promise.reject(data);\r\n }\r\n return data;\r\n }\r\n if (Array.isArray(data)) return data;\r\n if (String(data?.resultCode) === '0') {\r\n resolve(data?.resultObject);\r\n }\r\n return data;\r\n })\r\n .catch((err) => {\r\n rejects(err);\r\n });\r\n });\r\n};\r\n\r\nlet baseUrl = `${process.env.REACT_APP_REQ_PREFIX}/bote`;\r\nconst getUrl = (url: string, params: any = {}) => {\r\n let paramsArr = '';\r\n if (params && Object.keys(params).length > 0) {\r\n paramsArr = Object.keys(params)\r\n .map((item) => `${item}=${params[item]}`)\r\n .join('&');\r\n }\r\n return `${baseUrl}${url}${paramsArr ? `?${paramsArr}` : ''}`;\r\n};\r\n\r\n// 当前租户ID\r\nlet currentTenantId = '';\r\n\r\n/**\r\n * 构造管理平台或机器人工程的完整访问地址\r\n * @param url 环境变量中配置的地址\r\n */\r\nexport const getAccessUrl = (url: string | undefined) => {\r\n // 未配置,表示使用当前工程地址,去掉 hash 部分\r\n if (!url) {\r\n const location = getLocation();\r\n if (location) {\r\n return new URL('', location.href).toString();\r\n }\r\n return null;\r\n }\r\n // 一串数字表示是端口号,与当前工程使用相同的 hostname 以兼容使用不同 IP (回环地址、内网 IP)访问的情况\r\n if (/^\\d+$/.test(url)) {\r\n const location = getLocation();\r\n if (location) {\r\n return `http://${location.hostname}:${url}/`;\r\n }\r\n return `http://localhost:${url}/`;\r\n }\r\n const location = getLocation();\r\n if (location) {\r\n return new URL(url, location.href).toString();\r\n }\r\n return url;\r\n};\r\n\r\n// 管理平台访问地址\r\nconst managerUrl = getAccessUrl(process.env.BOTE_MANAGER_URL);\r\n// 机器人工程访问地址\r\nconst botUrl = getAccessUrl(process.env.BOTE_BOT_URL);\r\n\r\n/**\r\n * 获取管理平台地址\r\n *\r\n * @param route 路由(\"#\" 后面的部分),可选\r\n */\r\nconst getManagerUrl = (route?: string | null) => route ? `${managerUrl}#${route}` : managerUrl;\r\n\r\n/**\r\n * 获取机器人工程访问地址\r\n *\r\n * @param route 路由(\"#\" 后面的部分),可选\r\n */\r\nconst getBotUrl = (route?: string | null) => route ? `${botUrl}#${route}` : botUrl;\r\n\r\nconst request = {\r\n getBaseUrl: () => baseUrl,\r\n setUrlPrefix: (prefix: string) => {\r\n baseUrl = `${prefix}${baseUrl}`;\r\n },\r\n setTenantId: (tenantId: string) => {\r\n currentTenantId = tenantId;\r\n },\r\n getManagerUrl,\r\n getBotUrl,\r\n // 获取智能应用图标地址\r\n getBotIconUrl: (tenantId?: string, botId?: string, updatedTime?: string, isSecurity = true) => {\r\n if (tenantId && botId) {\r\n let url = `${baseUrl}/manager/bot/botIcon?tenantId=${tenantId}&botId=${botId}`;\r\n // 管理平台构造图标链接时加上更新时间参数,可以确保修改图标后浏览器能立即请求新图标\r\n // 浏览器的缓存策略有些激进,不刷新页面不会重新请求图片(单页应用很少会刷新页面),即使后端返回了 Cache-Control: no-cache\r\n if (updatedTime) {\r\n url += `&_=${updatedTime.replace(/\\D/g, '')}`;\r\n }\r\n if (isSecurity) {\r\n url = security.autoSecurityWithUrl(url);\r\n }\r\n return url;\r\n }\r\n return undefined;\r\n },\r\n // 获取智能体图标地址\r\n getSceneIconUrl: (\r\n tenantId?: string,\r\n sceneId?: string,\r\n updatedTime?: string,\r\n isSecurity = true,\r\n ) => {\r\n if (tenantId && sceneId) {\r\n let url = `${baseUrl}/manager/scene/sceneIcon?tenantId=${tenantId}&sceneId=${sceneId}`;\r\n if (updatedTime) {\r\n url += `&_=${updatedTime.replace(/\\D/g, '')}`;\r\n }\r\n if (isSecurity) {\r\n url = security.autoSecurityWithUrl(url);\r\n }\r\n return url;\r\n }\r\n return undefined;\r\n },\r\n // 获取机器人配置图标\r\n getBotPageSettingIcon: ({\r\n botId,\r\n tenantId,\r\n type,\r\n updatedTime,\r\n isSecurity = true,\r\n }: {\r\n botId: string,\r\n tenantId?: string,\r\n type: 'welcomeBannerlg' | 'welcomeBannerxs' | 'welcomeIcon',\r\n updatedTime?: string,\r\n isSecurity?: boolean,\r\n }) => {\r\n let url = `${baseUrl}/manager/bot/getPageSettingIconByType?tenantId=${tenantId}&botId=${botId}&type=${type}`;\r\n if (updatedTime) {\r\n url += `&_=${updatedTime.replace(/\\D/g, '')}`;\r\n }\r\n if (isSecurity) {\r\n url = security.autoSecurityWithUrl(url);\r\n }\r\n return url;\r\n },\r\n // 构造 DocChain 相关地址的辅助方法\r\n docChain: {\r\n referenceDocUrl: ({\r\n tenantId,\r\n docId,\r\n token,\r\n }: {\r\n [key: string]: string;\r\n }) => {\r\n let url = `${managerUrl}#/referencesDetail?tenantId=${tenantId}&docId=${docId}`;\r\n if (token) {\r\n url += `&token=${token}`;\r\n }\r\n return url;\r\n },\r\n referenceDocChunkUrl: ({\r\n tenantId,\r\n docId,\r\n chunkId,\r\n token,\r\n score,\r\n rank,\r\n docType,\r\n botId,\r\n }: {\r\n [key: string]: string;\r\n }) => {\r\n let url = `${managerUrl}#/documentChunk?tenantId=${tenantId}&docId=${docId}&chunkId=${chunkId}&score=${score}&rank=${rank}&docType=${docType}`;\r\n if (botId) {\r\n url += `&botId=${botId}`;\r\n }\r\n if (token) {\r\n url += `&token=${token}`;\r\n }\r\n return url;\r\n },\r\n // 下载文档接口地址\r\n downloadDocUrl: ({\r\n tenantId,\r\n docId,\r\n token,\r\n isSecurity = true,\r\n }: {\r\n [key: string]: string | boolean;\r\n }) => {\r\n let url = `${baseUrl}/docchain/v1/doc/read?tenantId=${tenantId}&read_format=src&doc_id=${docId}`;\r\n if (token) {\r\n url += `&token=${token}`;\r\n }\r\n if (isSecurity) {\r\n url = security.autoSecurityWithUrl(url);\r\n }\r\n return url;\r\n },\r\n // 图片地址\r\n imageUrl: ({\r\n tenantId,\r\n docId,\r\n token,\r\n path,\r\n isSecurity = true,\r\n }: {\r\n [key: string]: string | boolean;\r\n }) => {\r\n let url = `${baseUrl}/docchain/v1/doc/read?tenantId=${tenantId}&read_format=path&doc_id=${docId}&path=${encodeURIComponent(\r\n path,\r\n )}`;\r\n if (token) {\r\n url += `&token=${token}`;\r\n }\r\n if (isSecurity) {\r\n url = security.autoSecurityWithUrl(url);\r\n }\r\n return url;\r\n },\r\n },\r\n // 构造 tenantKnowledge 相关地址的辅助方法\r\n tenantKnowledge: {\r\n referenceDocUrl: ({\r\n tenantId,\r\n docId,\r\n token,\r\n knowledgeType,\r\n docName,\r\n }: {\r\n [key: string]: string;\r\n }) => {\r\n let url = `${managerUrl}#/referencesDetail?tenantId=${tenantId}&docId=${docId}&knowledgeType=${knowledgeType}&casPortal=true&docName=${docName}`;\r\n if (token) {\r\n url += `&token=${token}`;\r\n }\r\n return url;\r\n },\r\n // 下载文档接口地址\r\n downloadDocUrl: ({ knowledgeType, docId }: { [key: string]: string }) => {\r\n const url = `${baseUrl}/knowledge/access/downloadKnowledgeDoc?knowledgeType=${knowledgeType}&docId=${docId}`;\r\n\r\n return url;\r\n },\r\n },\r\n get: (url: string, cfg: any) => {\r\n const { params, ...rest }: any = cfg || {};\r\n // 拼租户ID 到参数中\r\n if (!params.tenantId && currentTenantId) {\r\n params.tenantId = currentTenantId;\r\n }\r\n\r\n const _url = getUrl(url, params);\r\n return http(_url, {\r\n method: 'GET',\r\n headers: {},\r\n ...rest,\r\n });\r\n },\r\n post: (url: string, cfg: any) => {\r\n const { data, params, ...rest }: any = cfg || {};\r\n let _body;\r\n\r\n if (data instanceof FormData) {\r\n // 拼租户ID 到参数中\r\n if (!data.get('tenantId') && currentTenantId) {\r\n data.append('tenantId', currentTenantId);\r\n }\r\n\r\n _body = data;\r\n } else {\r\n // 拼租户ID 到参数中\r\n if (!data.tenantId && currentTenantId) {\r\n data.tenantId = currentTenantId;\r\n }\r\n\r\n _body = JSON.stringify(data || {});\r\n }\r\n\r\n const _url = getUrl(url, params);\r\n return http(_url, {\r\n body: _body,\r\n method: 'POST',\r\n headers: {},\r\n ...rest,\r\n });\r\n },\r\n};\r\n\r\nexport { request };\r\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// import CookieUtil from './CookieUtils';\nimport security from '@lingxiteam/security';\nimport { getLocation } from './environment';\n\nexport const tenantIdSessionKey: string = 'botSelectedTenantID';\n\nconst http = (url: string, config: any) => {\n // const token = localStorage.getItem('X-Auth-Token');\n // config.headers['X-Auth-Token'] = token;\n config.headers['content-type'] = 'application/json;charset=UTF-8';\n\n // 获取 token\n const token = sessionStorage.getItem('token') as string;\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n\n // 兼容生产环境\n const tenantId = currentTenantId || sessionStorage.getItem(tenantIdSessionKey) || sessionStorage.getItem('managerSelectedTenantID');\n if (tenantId) {\n config.headers['Tenant-Id'] = tenantId;\n }\n\n return new Promise((resolve, rejects) => {\n fetch(url, config)\n .then((response) => {\n const contentType: string | null = response.headers.get('content-type');\n if (contentType) {\n if (\n /application\\/octet-stream/.test(contentType) ||\n /application\\/zip/.test(contentType) ||\n /application\\/vnd\\.ms-excel/.test(contentType)\n ) {\n return response.blob();\n }\n if (/application\\/json/.test(contentType)) {\n return response.json();\n }\n if (/text\\/html/.test(contentType)) {\n return response.text();\n }\n }\n return response;\n })\n .then((data) => {\n if (Object.prototype.toString.call(data) === '[object Blob]') {\n if (\n typeof data === 'object' &&\n Object.hasOwnProperty.call(data, 'resultCode') &&\n String(data.resultCode) !== '0'\n ) {\n return Promise.reject(data);\n }\n return data;\n }\n if (Array.isArray(data)) return data;\n if (String(data?.resultCode) === '0') {\n resolve(data?.resultObject);\n }\n return data;\n })\n .catch((err) => {\n rejects(err);\n });\n });\n};\n\nlet baseUrl = `${process.env.REACT_APP_REQ_PREFIX}/bote`;\nconst getUrl = (url: string, params: any = {}) => {\n let paramsArr = '';\n if (params && Object.keys(params).length > 0) {\n paramsArr = Object.keys(params)\n .map((item) => `${item}=${params[item]}`)\n .join('&');\n }\n return `${baseUrl}${url}${paramsArr ? `?${paramsArr}` : ''}`;\n};\n\n// 当前项目ID\nlet currentTenantId = '';\n\n/**\n * 构造管理平台或机器人工程的完整访问地址\n * @param url 环境变量中配置的地址\n */\nexport const getAccessUrl = (url: string | undefined) => {\n // 未配置,表示使用当前工程地址,去掉 hash 部分\n if (!url) {\n const location = getLocation();\n if (location) {\n return new URL('', location.href).toString();\n }\n return null;\n }\n // 一串数字表示是端口号,与当前工程使用相同的 hostname 以兼容使用不同 IP (回环地址、内网 IP)访问的情况\n if (/^\\d+$/.test(url)) {\n const location = getLocation();\n if (location) {\n return `http://${location.hostname}:${url}/`;\n }\n return `http://localhost:${url}/`;\n }\n const location = getLocation();\n if (location) {\n return new URL(url, location.href).toString();\n }\n return url;\n};\n\n// 管理平台访问地址\nconst managerUrl = getAccessUrl(process.env.BOTE_MANAGER_URL);\n// 机器人工程访问地址\nconst botUrl = getAccessUrl(process.env.BOTE_BOT_URL);\n\n/**\n * 获取管理平台地址\n *\n * @param route 路由(\"#\" 后面的部分),可选\n */\nconst getManagerUrl = (route?: string | null) => route ? `${managerUrl}#${route}` : managerUrl;\n\n/**\n * 获取机器人工程访问地址\n *\n * @param route 路由(\"#\" 后面的部分),可选\n */\nconst getBotUrl = (route?: string | null) => route ? `${botUrl}#${route}` : botUrl;\n\nconst request = {\n getBaseUrl: () => baseUrl,\n setUrlPrefix: (prefix: string) => {\n baseUrl = `${prefix}${baseUrl}`;\n },\n setTenantId: (tenantId: string) => {\n currentTenantId = tenantId;\n },\n getManagerUrl,\n // 获取用户头像\n getUserIconUrl: (userId?: string, updatedTime?: string, isSecurity = true) => {\n let url = `${baseUrl}/manager/user/userIcon?userId=${userId || ''}`;\n if (updatedTime) {\n url += `&_=${updatedTime.replace(/\\D/g, '')}`;\n }\n if (isSecurity) {\n url = security.autoSecurityWithUrl(url);\n }\n return url;\n },\n getBotUrl,\n // 获取智能应用图标地址\n getBotIconUrl: (tenantId?: string, botId?: string, updatedTime?: string, isSecurity = true) => {\n if (tenantId && botId) {\n let url = `${baseUrl}/manager/bot/botIcon?tenantId=${tenantId}&botId=${botId}`;\n // 管理平台构造图标链接时加上更新时间参数,可以确保修改图标后浏览器能立即请求新图标\n // 浏览器的缓存策略有些激进,不刷新页面不会重新请求图片(单页应用很少会刷新页面),即使后端返回了 Cache-Control: no-cache\n if (updatedTime) {\n url += `&_=${updatedTime.replace(/\\D/g, '')}`;\n }\n if (isSecurity) {\n url = security.autoSecurityWithUrl(url);\n }\n return url;\n }\n return undefined;\n },\n getPlatBotIconUrl: (platBotId:string) => {\n if (platBotId) {\n const url = `${baseUrl}/manager/platBotInfo/getPlatBotIcon?platBotId=${platBotId}`;\n return url;\n }\n return undefined;\n },\n // 获取智能体图标地址\n getSceneIconUrl: (\n tenantId?: string,\n sceneId?: string,\n updatedTime?: string,\n isSecurity = true,\n ) => {\n if (tenantId && sceneId) {\n let url = `${baseUrl}/manager/scene/sceneIcon?tenantId=${tenantId}&sceneId=${sceneId}`;\n if (updatedTime) {\n url += `&_=${updatedTime.replace(/\\D/g, '')}`;\n }\n if (isSecurity) {\n url = security.autoSecurityWithUrl(url);\n }\n return url;\n }\n return undefined;\n },\n // 获取机器人配置图标\n getBotPageSettingIcon: ({\n botId,\n tenantId,\n type,\n updatedTime,\n isSecurity = true,\n }: {\n botId: string,\n tenantId?: string,\n type: 'welcomeBannerlg' | 'welcomeBannerxs' | 'welcomeIcon',\n updatedTime?: string,\n isSecurity?: boolean,\n }) => {\n let url = `${baseUrl}/manager/bot/getPageSettingIconByType?tenantId=${tenantId}&botId=${botId}&type=${type}`;\n if (updatedTime) {\n url += `&_=${updatedTime.replace(/\\D/g, '')}`;\n }\n if (isSecurity) {\n url = security.autoSecurityWithUrl(url);\n }\n return url;\n },\n getWorkspaceIcon: ({ spaceId }:{spaceId: string}) => {\n if (spaceId) {\n const url = `${baseUrl}/manager/workspace/getWorkspaceIcon?spaceId=${spaceId}`;\n return url;\n }\n return undefined;\n },\n // 获取项目头像\n getTenantIcon: ({ tenantId }: { tenantId: string }) => {\n if (tenantId) {\n const url = `${baseUrl}/manager/tenant/getTenantIcon?tenantId=${tenantId}`;\n return url;\n }\n return undefined;\n },\n // 构造 DocChain 相关地址的辅助方法\n docChain: {\n referenceDocUrl: ({\n tenantId,\n docId,\n token,\n }: {\n [key: string]: string;\n }) => {\n let url = `${managerUrl}#/referencesDetail?tenantId=${tenantId}&docId=${docId}`;\n if (token) {\n url += `&token=${token}`;\n }\n return url;\n },\n referenceDocChunkUrl: ({\n tenantId,\n docId,\n chunkId,\n token,\n score,\n rank,\n docType,\n botId,\n }: {\n [key: string]: string;\n }) => {\n let url = `${managerUrl}#/documentChunk?tenantId=${tenantId}&docId=${docId}&chunkId=${chunkId}&score=${score}&rank=${rank}&docType=${docType}`;\n if (botId) {\n url += `&botId=${botId}`;\n }\n if (token) {\n url += `&token=${token}`;\n }\n return url;\n },\n // 下载文档接口地址\n downloadDocUrl: ({\n tenantId,\n docId,\n token,\n isSecurity = true,\n }: {\n [key: string]: string | boolean;\n }) => {\n let url = `${baseUrl}/docchain/v1/doc/read?tenantId=${tenantId}&read_format=src&doc_id=${docId}`;\n if (token) {\n url += `&token=${token}`;\n }\n if (isSecurity) {\n url = security.autoSecurityWithUrl(url);\n }\n return url;\n },\n // 图片地址\n imageUrl: ({\n tenantId,\n docId,\n token,\n path,\n isSecurity = true,\n }: {\n [key: string]: string | boolean;\n }) => {\n let url = `${baseUrl}/docchain/v1/doc/read?tenantId=${tenantId}&read_format=path&doc_id=${docId}&path=${encodeURIComponent(\n path,\n )}`;\n if (token) {\n url += `&token=${token}`;\n }\n if (isSecurity) {\n url = security.autoSecurityWithUrl(url);\n }\n return url;\n },\n },\n // 构造 tenantKnowledge 相关地址的辅助方法\n tenantKnowledge: {\n referenceDocUrl: ({\n tenantId,\n docId,\n token,\n knowledgeType,\n docName,\n }: {\n [key: string]: string;\n }) => {\n let url = `${managerUrl}#/referencesDetail?tenantId=${tenantId}&docId=${docId}&knowledgeType=${knowledgeType}&casPortal=true&docName=${docName}`;\n if (token) {\n url += `&token=${token}`;\n }\n return url;\n },\n // 下载文档接口地址\n downloadDocUrl: ({ knowledgeType, docId }: { [key: string]: string }) => {\n const url = `${baseUrl}/knowledge/access/downloadKnowledgeDoc?knowledgeType=${knowledgeType}&docId=${docId}`;\n\n return url;\n },\n },\n get: (url: string, cfg: any) => {\n const { params, ...rest }: any = cfg || {};\n // 拼项目ID 到参数中\n if (!params.tenantId && currentTenantId) {\n params.tenantId = currentTenantId;\n }\n\n const _url = getUrl(url, params);\n return http(_url, {\n method: 'GET',\n headers: {},\n ...rest,\n });\n },\n post: (url: string, cfg: any) => {\n const { data, params, ...rest }: any = cfg || {};\n let _body;\n\n if (data instanceof FormData) {\n // 拼项目ID 到参数中\n if (!data.get('tenantId') && currentTenantId) {\n data.append('tenantId', currentTenantId);\n }\n\n _body = data;\n } else {\n // 拼项目ID 到参数中\n if (!data.tenantId && currentTenantId) {\n data.tenantId = currentTenantId;\n }\n\n _body = JSON.stringify(data || {});\n }\n\n const _url = getUrl(url, params);\n return http(_url, {\n body: _body,\n method: 'POST',\n headers: {},\n ...rest,\n });\n },\n};\n\nexport { request };\n"],
5
+ "mappings": "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",
6
6
  "names": ["location", "security"]
7
7
  }
@@ -7,11 +7,14 @@ import { getDataArr, replaceParamsValue, getParamsContentByParamKeys, replacePar
7
7
  import formatModuleData from './formatModule/formatModuleData';
8
8
  import { patternTransitionRegExp, stringPramarsValTransition, stringScriptExecution, createCompartmentExecution } from './formatModule/helpers';
9
9
  import loopPageStaticCodeMap from './loopPageStaticCodeMap';
10
+ import loopPageServiceApiMap from './loopPageServiceApiMap';
11
+ import { getValueByPath } from './getValueByPath';
10
12
  import scriptExecution, { type scriptExecutionType } from './scriptExecution';
11
13
  import { getFileUrlById, getFileUrlByFileInfoId, getRemoteComponentUrlByCode, getRemoteComponentUrlById } from './file';
12
14
  import { isValidUrl, sanitizeRedirectUrl, safeRedirect, sanitizeEventHandler } from './securityUtils';
13
15
  import { isReactNative, isWeb, isNode, getEnvironment, getWindow, getDocument, getLocation, isMobile } from './environment';
14
16
  import watchMatchMedia, { type pageSizeType } from './watchMatchMedia';
15
- import { request, tenantIdSessionKey } from './http';
17
+ import { request, tenantIdSessionKey, getAccessUrl } from './http';
18
+ import { formatTime, formatTimeCustom, isToday, getRelativeTime } from './timeFormat';
16
19
  export type { fileToBase64Type, asyncLocalStorageType, asyncSessionStorageType, scriptExecutionType, pageSizeType, };
17
- export { fileToBase64, CookieUtils, argsToString, argsToObject, getSearchObj, asyncLocalStorage, asyncSessionStorage, camelToSnake, underscoreToCamelCase, generateRandom18Int, formatModuleData, patternTransitionRegExp, stringPramarsValTransition, loopPageStaticCodeMap, getDataArr, replaceParamsValue, replaceParamsValueForEvent, getParamsContentByParamKeys, getFileUrlById, getFileUrlByFileInfoId, getRemoteComponentUrlByCode, getRemoteComponentUrlById, stringScriptExecution, createCompartmentExecution, scriptExecution, isValidUrl, sanitizeRedirectUrl, safeRedirect, sanitizeEventHandler, isReactNative, isWeb, isNode, getEnvironment, getWindow, getDocument, getLocation, isMobile, watchMatchMedia, request, tenantIdSessionKey, };
20
+ export { fileToBase64, CookieUtils, argsToString, argsToObject, getSearchObj, asyncLocalStorage, asyncSessionStorage, camelToSnake, underscoreToCamelCase, generateRandom18Int, formatModuleData, patternTransitionRegExp, stringPramarsValTransition, loopPageStaticCodeMap, loopPageServiceApiMap, getDataArr, replaceParamsValue, replaceParamsValueForEvent, getParamsContentByParamKeys, getFileUrlById, getFileUrlByFileInfoId, getRemoteComponentUrlByCode, getRemoteComponentUrlById, stringScriptExecution, createCompartmentExecution, scriptExecution, isValidUrl, sanitizeRedirectUrl, safeRedirect, sanitizeEventHandler, isReactNative, isWeb, isNode, getEnvironment, getWindow, getDocument, getLocation, isMobile, watchMatchMedia, request, tenantIdSessionKey, getAccessUrl, formatTime, formatTimeCustom, isToday, getRelativeTime, getValueByPath, };
package/dist/cjs/index.js CHANGED
@@ -38,7 +38,10 @@ __export(src_exports, {
38
38
  createCompartmentExecution: () => import_helpers.createCompartmentExecution,
39
39
  fileToBase64: () => import_fileToBase64.default,
40
40
  formatModuleData: () => import_formatModuleData.default,
41
+ formatTime: () => import_timeFormat.formatTime,
42
+ formatTimeCustom: () => import_timeFormat.formatTimeCustom,
41
43
  generateRandom18Int: () => import_stringUtils.generateRandom18Int,
44
+ getAccessUrl: () => import_http.getAccessUrl,
42
45
  getDataArr: () => import_treeUtils.getDataArr,
43
46
  getDocument: () => import_environment.getDocument,
44
47
  getEnvironment: () => import_environment.getEnvironment,
@@ -46,15 +49,19 @@ __export(src_exports, {
46
49
  getFileUrlById: () => import_file.getFileUrlById,
47
50
  getLocation: () => import_environment.getLocation,
48
51
  getParamsContentByParamKeys: () => import_treeUtils.getParamsContentByParamKeys,
52
+ getRelativeTime: () => import_timeFormat.getRelativeTime,
49
53
  getRemoteComponentUrlByCode: () => import_file.getRemoteComponentUrlByCode,
50
54
  getRemoteComponentUrlById: () => import_file.getRemoteComponentUrlById,
51
55
  getSearchObj: () => import_pathArgsUtils.getSearchObj,
56
+ getValueByPath: () => import_getValueByPath.getValueByPath,
52
57
  getWindow: () => import_environment.getWindow,
53
58
  isMobile: () => import_environment.isMobile,
54
59
  isNode: () => import_environment.isNode,
55
60
  isReactNative: () => import_environment.isReactNative,
61
+ isToday: () => import_timeFormat.isToday,
56
62
  isValidUrl: () => import_securityUtils.isValidUrl,
57
63
  isWeb: () => import_environment.isWeb,
64
+ loopPageServiceApiMap: () => import_loopPageServiceApiMap.default,
58
65
  loopPageStaticCodeMap: () => import_loopPageStaticCodeMap.default,
59
66
  patternTransitionRegExp: () => import_helpers.patternTransitionRegExp,
60
67
  replaceParamsValue: () => import_treeUtils.replaceParamsValue,
@@ -80,12 +87,15 @@ var import_treeUtils = require("./treeUtils");
80
87
  var import_formatModuleData = __toESM(require("./formatModule/formatModuleData"));
81
88
  var import_helpers = require("./formatModule/helpers");
82
89
  var import_loopPageStaticCodeMap = __toESM(require("./loopPageStaticCodeMap"));
90
+ var import_loopPageServiceApiMap = __toESM(require("./loopPageServiceApiMap"));
91
+ var import_getValueByPath = require("./getValueByPath");
83
92
  var import_scriptExecution = __toESM(require("./scriptExecution"));
84
93
  var import_file = require("./file");
85
94
  var import_securityUtils = require("./securityUtils");
86
95
  var import_environment = require("./environment");
87
96
  var import_watchMatchMedia = __toESM(require("./watchMatchMedia"));
88
97
  var import_http = require("./http");
98
+ var import_timeFormat = require("./timeFormat");
89
99
  var _ = require("lodash");
90
100
  _.noConflict();
91
101
  // Annotate the CommonJS export names for ESM import in node:
@@ -99,7 +109,10 @@ _.noConflict();
99
109
  createCompartmentExecution,
100
110
  fileToBase64,
101
111
  formatModuleData,
112
+ formatTime,
113
+ formatTimeCustom,
102
114
  generateRandom18Int,
115
+ getAccessUrl,
103
116
  getDataArr,
104
117
  getDocument,
105
118
  getEnvironment,
@@ -107,15 +120,19 @@ _.noConflict();
107
120
  getFileUrlById,
108
121
  getLocation,
109
122
  getParamsContentByParamKeys,
123
+ getRelativeTime,
110
124
  getRemoteComponentUrlByCode,
111
125
  getRemoteComponentUrlById,
112
126
  getSearchObj,
127
+ getValueByPath,
113
128
  getWindow,
114
129
  isMobile,
115
130
  isNode,
116
131
  isReactNative,
132
+ isToday,
117
133
  isValidUrl,
118
134
  isWeb,
135
+ loopPageServiceApiMap,
119
136
  loopPageStaticCodeMap,
120
137
  patternTransitionRegExp,
121
138
  replaceParamsValue,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "sourcesContent": ["import fileToBase64, { type fileToBase64Type } from './fileToBase64';\r\nimport CookieUtils from './CookieUtils';\r\nimport { argsToString, argsToObject, getSearchObj } from './pathArgsUtils';\r\nimport {\r\n asyncLocalStorage,\r\n asyncSessionStorage,\r\n type asyncLocalStorageType,\r\n type asyncSessionStorageType,\r\n} from './asyncStorage';\r\nimport {\r\n camelToSnake,\r\n underscoreToCamelCase,\r\n generateRandom18Int,\r\n} from './stringUtils';\r\nimport {\r\n getDataArr,\r\n replaceParamsValue,\r\n getParamsContentByParamKeys,\r\n replaceParamsValueForEvent,\r\n} from './treeUtils';\r\nimport formatModuleData from './formatModule/formatModuleData';\r\nimport {\r\n patternTransitionRegExp,\r\n stringPramarsValTransition,\r\n stringScriptExecution,\r\n createCompartmentExecution,\r\n} from './formatModule/helpers';\r\nimport loopPageStaticCodeMap from './loopPageStaticCodeMap';\r\nimport scriptExecution, { type scriptExecutionType } from './scriptExecution';\r\nimport {\r\n getFileUrlById,\r\n getFileUrlByFileInfoId,\r\n getRemoteComponentUrlByCode,\r\n getRemoteComponentUrlById,\r\n} from './file';\r\nimport {\r\n isValidUrl,\r\n sanitizeRedirectUrl,\r\n safeRedirect,\r\n sanitizeEventHandler,\r\n} from './securityUtils';\r\nimport {\r\n isReactNative,\r\n isWeb,\r\n isNode,\r\n getEnvironment,\r\n getWindow,\r\n getDocument,\r\n getLocation,\r\n isMobile,\r\n} from './environment';\r\n\r\nimport watchMatchMedia, { type pageSizeType } from './watchMatchMedia';\r\n\r\nimport { request, tenantIdSessionKey } from './http';\r\n\r\n// 避免 _对象 和其他库冲突\r\nconst _ = require('lodash');\r\n\r\n_.noConflict();\r\n\r\nexport type {\r\n fileToBase64Type,\r\n asyncLocalStorageType,\r\n asyncSessionStorageType,\r\n scriptExecutionType,\r\n pageSizeType,\r\n};\r\n\r\nexport {\r\n fileToBase64,\r\n CookieUtils,\r\n argsToString,\r\n argsToObject,\r\n getSearchObj,\r\n asyncLocalStorage,\r\n asyncSessionStorage,\r\n camelToSnake,\r\n underscoreToCamelCase,\r\n generateRandom18Int,\r\n formatModuleData,\r\n patternTransitionRegExp,\r\n stringPramarsValTransition,\r\n loopPageStaticCodeMap,\r\n getDataArr,\r\n replaceParamsValue,\r\n replaceParamsValueForEvent,\r\n getParamsContentByParamKeys,\r\n getFileUrlById,\r\n getFileUrlByFileInfoId,\r\n getRemoteComponentUrlByCode,\r\n getRemoteComponentUrlById,\r\n stringScriptExecution,\r\n createCompartmentExecution,\r\n scriptExecution,\r\n isValidUrl,\r\n sanitizeRedirectUrl,\r\n safeRedirect,\r\n sanitizeEventHandler,\r\n isReactNative,\r\n isWeb,\r\n isNode,\r\n getEnvironment,\r\n getWindow,\r\n getDocument,\r\n getLocation,\r\n isMobile,\r\n watchMatchMedia,\r\n request,\r\n tenantIdSessionKey,\r\n};\r\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,wCAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAAAC;AAAA,EAAA,gDAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4DAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,gDAAAC;AAAA;AAAA;AAAA,0BAAoD;AACpD,yBAAwB;AACxB,2BAAyD;AACzD,0BAKO;AACP,yBAIO;AACP,uBAKO;AACP,8BAA6B;AAC7B,qBAKO;AACP,mCAAkC;AAClC,6BAA0D;AAC1D,kBAKO;AACP,2BAKO;AACP,yBASO;AAEP,6BAAmD;AAEnD,kBAA4C;AAG5C,IAAM,IAAI,QAAQ,QAAQ;AAE1B,EAAE,WAAW;",
6
- "names": ["CookieUtils", "fileToBase64", "formatModuleData", "loopPageStaticCodeMap", "scriptExecution", "watchMatchMedia"]
4
+ "sourcesContent": ["import fileToBase64, { type fileToBase64Type } from './fileToBase64';\nimport CookieUtils from './CookieUtils';\nimport { argsToString, argsToObject, getSearchObj } from './pathArgsUtils';\nimport {\n asyncLocalStorage,\n asyncSessionStorage,\n type asyncLocalStorageType,\n type asyncSessionStorageType,\n} from './asyncStorage';\nimport {\n camelToSnake,\n underscoreToCamelCase,\n generateRandom18Int,\n} from './stringUtils';\nimport {\n getDataArr,\n replaceParamsValue,\n getParamsContentByParamKeys,\n replaceParamsValueForEvent,\n} from './treeUtils';\nimport formatModuleData from './formatModule/formatModuleData';\nimport {\n patternTransitionRegExp,\n stringPramarsValTransition,\n stringScriptExecution,\n createCompartmentExecution,\n} from './formatModule/helpers';\nimport loopPageStaticCodeMap from './loopPageStaticCodeMap';\nimport loopPageServiceApiMap from './loopPageServiceApiMap';\nimport { getValueByPath } from './getValueByPath';\nimport scriptExecution, { type scriptExecutionType } from './scriptExecution';\nimport {\n getFileUrlById,\n getFileUrlByFileInfoId,\n getRemoteComponentUrlByCode,\n getRemoteComponentUrlById,\n} from './file';\nimport {\n isValidUrl,\n sanitizeRedirectUrl,\n safeRedirect,\n sanitizeEventHandler,\n} from './securityUtils';\nimport {\n isReactNative,\n isWeb,\n isNode,\n getEnvironment,\n getWindow,\n getDocument,\n getLocation,\n isMobile,\n} from './environment';\n\n\nimport watchMatchMedia, { type pageSizeType } from './watchMatchMedia';\n\nimport { request, tenantIdSessionKey, getAccessUrl } from './http';\nimport { formatTime, formatTimeCustom, isToday, getRelativeTime } from './timeFormat';\n\n// 避免 _对象 和其他库冲突\nconst _ = require('lodash');\n\n_.noConflict();\n\nexport type {\n fileToBase64Type,\n asyncLocalStorageType,\n asyncSessionStorageType,\n scriptExecutionType,\n pageSizeType,\n};\n\nexport {\n fileToBase64,\n CookieUtils,\n argsToString,\n argsToObject,\n getSearchObj,\n asyncLocalStorage,\n asyncSessionStorage,\n camelToSnake,\n underscoreToCamelCase,\n generateRandom18Int,\n formatModuleData,\n patternTransitionRegExp,\n stringPramarsValTransition,\n loopPageStaticCodeMap,\n loopPageServiceApiMap,\n getDataArr,\n replaceParamsValue,\n replaceParamsValueForEvent,\n getParamsContentByParamKeys,\n getFileUrlById,\n getFileUrlByFileInfoId,\n getRemoteComponentUrlByCode,\n getRemoteComponentUrlById,\n stringScriptExecution,\n createCompartmentExecution,\n scriptExecution,\n isValidUrl,\n sanitizeRedirectUrl,\n safeRedirect,\n sanitizeEventHandler,\n isReactNative,\n isWeb,\n isNode,\n getEnvironment,\n getWindow,\n getDocument,\n getLocation,\n isMobile,\n watchMatchMedia,\n request,\n tenantIdSessionKey,\n getAccessUrl,\n formatTime,\n formatTimeCustom,\n isToday,\n getRelativeTime,\n getValueByPath,\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,wCAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAAAC;AAAA,EAAA,gDAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4DAAAC;AAAA,EAAA,0DAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,gDAAAC;AAAA;AAAA;AAAA,0BAAoD;AACpD,yBAAwB;AACxB,2BAAyD;AACzD,0BAKO;AACP,yBAIO;AACP,uBAKO;AACP,8BAA6B;AAC7B,qBAKO;AACP,mCAAkC;AAClC,mCAAkC;AAClC,4BAA+B;AAC/B,6BAA0D;AAC1D,kBAKO;AACP,2BAKO;AACP,yBASO;AAGP,6BAAmD;AAEnD,kBAA0D;AAC1D,wBAAuE;AAGvE,IAAM,IAAI,QAAQ,QAAQ;AAE1B,EAAE,WAAW;",
6
+ "names": ["CookieUtils", "fileToBase64", "formatModuleData", "loopPageServiceApiMap", "loopPageStaticCodeMap", "scriptExecution", "watchMatchMedia"]
7
7
  }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * 从页面配置的第一个元素(compType="page")的 dataSources 字段中收集所有 serviceApi 配置
3
+ * @param items 页面配置数据
4
+ * @returns 返回包含 serviceApi 配置的数组,每个元素包含 { apiId, reqParams, dataPath, name, type }
5
+ */
6
+ declare const loopPageServiceApiMap: (items: {
7
+ [key: string]: any;
8
+ }[]) => Array<{
9
+ apiId?: string;
10
+ dataPath?: string;
11
+ reqParams?: string;
12
+ name?: string;
13
+ type?: string;
14
+ dataStructure?: any;
15
+ customValue?: string;
16
+ }>;
17
+ export default loopPageServiceApiMap;
@@ -0,0 +1,54 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/loopPageServiceApiMap.ts
20
+ var loopPageServiceApiMap_exports = {};
21
+ __export(loopPageServiceApiMap_exports, {
22
+ default: () => loopPageServiceApiMap_default
23
+ });
24
+ module.exports = __toCommonJS(loopPageServiceApiMap_exports);
25
+ var loopPageServiceApiMap = (items) => {
26
+ const serviceApiList = [];
27
+ if (Array.isArray(items) && items.length > 0) {
28
+ const pageItem = items[0];
29
+ if ((pageItem == null ? void 0 : pageItem.compType) === "page" && Array.isArray(pageItem == null ? void 0 : pageItem.dataSources)) {
30
+ pageItem.dataSources.forEach((dataSource) => {
31
+ if ((dataSource == null ? void 0 : dataSource.type) === "api" && (dataSource == null ? void 0 : dataSource.apiId)) {
32
+ serviceApiList.push({
33
+ apiId: dataSource.apiId,
34
+ reqParams: dataSource.reqParams,
35
+ dataPath: dataSource.dataPath,
36
+ name: dataSource.name,
37
+ type: dataSource.type
38
+ });
39
+ }
40
+ if ((dataSource == null ? void 0 : dataSource.type) === "custom") {
41
+ serviceApiList.push({
42
+ dataStructure: dataSource.dataStructure,
43
+ customValue: dataSource.customValue,
44
+ name: dataSource.name,
45
+ type: dataSource.type
46
+ });
47
+ }
48
+ });
49
+ }
50
+ }
51
+ return serviceApiList;
52
+ };
53
+ var loopPageServiceApiMap_default = loopPageServiceApiMap;
54
+ //# sourceMappingURL=loopPageServiceApiMap.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/loopPageServiceApiMap.ts"],
4
+ "sourcesContent": ["/**\n * 从页面配置的第一个元素(compType=\"page\")的 dataSources 字段中收集所有 serviceApi 配置\n * @param items 页面配置数据\n * @returns 返回包含 serviceApi 配置的数组,每个元素包含 { apiId, reqParams, dataPath, name, type }\n */\nconst loopPageServiceApiMap = (items: { [key: string]: any }[]): Array<{\n apiId?: string;\n dataPath?: string;\n reqParams?: string;\n name?: string;\n type?: string;\n dataStructure?: any;\n customValue?: string;\n}> => {\n const serviceApiList: Array<{\n apiId?: string;\n dataPath?: string;\n reqParams?: string;\n name?: string;\n type?: string;\n dataStructure?: any;\n customValue?: string;\n }> = [];\n\n // 从 tempItems[0] 的 dataSources 字段中读取数据源配置\n if (Array.isArray(items) && items.length > 0) {\n const pageItem = items[0];\n if (pageItem?.compType === 'page' && Array.isArray(pageItem?.dataSources)) {\n pageItem.dataSources.forEach((dataSource: any) => {\n // 只处理 type 为 'api' 的数据源\n if (dataSource?.type === 'api' && dataSource?.apiId) {\n serviceApiList.push({\n apiId: dataSource.apiId,\n reqParams: dataSource.reqParams,\n dataPath: dataSource.dataPath,\n name: dataSource.name,\n type: dataSource.type,\n });\n }\n\n // type 为 'custom' 的数据源\n if (dataSource?.type === 'custom') {\n serviceApiList.push({\n dataStructure: dataSource.dataStructure,\n customValue: dataSource.customValue,\n name: dataSource.name,\n type: dataSource.type,\n });\n }\n });\n }\n }\n\n return serviceApiList;\n};\n\nexport default loopPageServiceApiMap;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,IAAM,wBAAwB,CAAC,UAQzB;AACJ,QAAM,iBAQD,CAAC;AAGN,MAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,GAAG;AAC5C,UAAM,WAAW,MAAM,CAAC;AACxB,SAAI,qCAAU,cAAa,UAAU,MAAM,QAAQ,qCAAU,WAAW,GAAG;AACzE,eAAS,YAAY,QAAQ,CAAC,eAAoB;AAEhD,aAAI,yCAAY,UAAS,UAAS,yCAAY,QAAO;AACnD,yBAAe,KAAK;AAAA,YAClB,OAAO,WAAW;AAAA,YAClB,WAAW,WAAW;AAAA,YACtB,UAAU,WAAW;AAAA,YACrB,MAAM,WAAW;AAAA,YACjB,MAAM,WAAW;AAAA,UACnB,CAAC;AAAA,QACH;AAGA,aAAI,yCAAY,UAAS,UAAU;AACjC,yBAAe,KAAK;AAAA,YAClB,eAAe,WAAW;AAAA,YAC1B,aAAa,WAAW;AAAA,YACxB,MAAM,WAAW;AAAA,YACjB,MAAM,WAAW;AAAA,UACnB,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAO,gCAAQ;",
6
+ "names": []
7
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/loopPageStaticCodeMap.ts"],
4
- "sourcesContent": ["const loopPageStaticCodeMap = (items: { [key: string]: any }[]) => {\r\n const staticCodeList: string[] = [];\r\n const LoopStaticCode = (items: { [key: string]: any }[]) => {\r\n if (Array.isArray(items)) {\r\n items.forEach((item) => {\r\n if (Array.isArray(item?.compProps?.attrs)) {\r\n item?.compProps?.attrs?.forEach((attr:any) => {\r\n if (attr?.staticCode && !staticCodeList.includes(attr?.staticCode)) {\r\n staticCodeList.push(attr?.staticCode);\r\n }\r\n });\r\n }\r\n if (\r\n (item?.compProps?.dataOptions?.staticCode &&\r\n !staticCodeList.includes(item?.compProps?.dataOptions?.staticCode))\r\n ) {\r\n staticCodeList.push(item?.compProps?.dataOptions?.staticCode);\r\n }\r\n LoopStaticCode(item?.children);\r\n });\r\n }\r\n };\r\n LoopStaticCode(items);\r\n return staticCodeList;\r\n};\r\n\r\nexport default loopPageStaticCodeMap;\r\n"],
4
+ "sourcesContent": ["const loopPageStaticCodeMap = (items: { [key: string]: any }[]) => {\n const staticCodeList: string[] = [];\n const LoopStaticCode = (items: { [key: string]: any }[]) => {\n if (Array.isArray(items)) {\n items.forEach((item) => {\n if (Array.isArray(item?.compProps?.attrs)) {\n item?.compProps?.attrs?.forEach((attr:any) => {\n if (attr?.staticCode && !staticCodeList.includes(attr?.staticCode)) {\n staticCodeList.push(attr?.staticCode);\n }\n });\n }\n if (\n (item?.compProps?.dataOptions?.staticCode &&\n !staticCodeList.includes(item?.compProps?.dataOptions?.staticCode))\n ) {\n staticCodeList.push(item?.compProps?.dataOptions?.staticCode);\n }\n LoopStaticCode(item?.children);\n });\n }\n };\n LoopStaticCode(items);\n return staticCodeList;\n};\n\nexport default loopPageStaticCodeMap;\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAM,wBAAwB,CAAC,UAAoC;AACjE,QAAM,iBAA2B,CAAC;AAClC,QAAM,iBAAiB,CAACA,WAAoC;AAC1D,QAAI,MAAM,QAAQA,MAAK,GAAG;AACxB,MAAAA,OAAM,QAAQ,CAAC,SAAS;AAJ9B;AAKQ,YAAI,MAAM,SAAQ,kCAAM,cAAN,mBAAiB,KAAK,GAAG;AACzC,mDAAM,cAAN,mBAAiB,UAAjB,mBAAwB,QAAQ,CAAC,SAAa;AAC5C,iBAAI,6BAAM,eAAc,CAAC,eAAe,SAAS,6BAAM,UAAU,GAAG;AAClE,6BAAe,KAAK,6BAAM,UAAU;AAAA,YACtC;AAAA,UACF;AAAA,QACF;AACA,cACG,wCAAM,cAAN,mBAAiB,gBAAjB,mBAA8B,eAC/B,CAAC,eAAe,UAAS,wCAAM,cAAN,mBAAiB,gBAAjB,mBAA8B,UAAU,GACjE;AACA,yBAAe,MAAK,wCAAM,cAAN,mBAAiB,gBAAjB,mBAA8B,UAAU;AAAA,QAC9D;AACA,uBAAe,6BAAM,QAAQ;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF;AACA,iBAAe,KAAK;AACpB,SAAO;AACT;AAEA,IAAO,gCAAQ;",
6
6
  "names": ["items"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/markdownEscape.ts"],
4
- "sourcesContent": ["const replacements = [\r\n [/\\*/g, '\\\\*', 'asterisks'],\r\n [/#/g, '\\\\#', 'numberSigns'],\r\n [/\\//g, '\\\\/', 'slashes'],\r\n [/\\(/g, '\\\\(', 'parentheses'],\r\n [/\\)/g, '\\\\)', 'parentheses'],\r\n [/\\[/g, '\\\\[', 'squareBrackets'],\r\n [/\\]/g, '\\\\]', 'squareBrackets'],\r\n [/</g, '&lt;', 'angleBrackets'],\r\n [/>/g, '&gt;', 'angleBrackets'],\r\n [/_/g, '\\\\_', 'underscores'],\r\n];\r\n\r\nconst escape = (string:string, skips:string[] = []) => {\r\n const _skips = Array.isArray(skips) ? skips : [];\r\n if (string && typeof string === 'string') {\r\n return replacements.reduce((string, replacement) => {\r\n const name = replacement?.[2];\r\n return name && _skips.indexOf(name as string) !== -1\r\n ? string\r\n : string.replace(replacement?.[0], replacement?.[1] as string);\r\n }, string);\r\n }\r\n return string;\r\n};\r\n\r\n\r\nexport default escape;\r\n"],
4
+ "sourcesContent": ["const replacements = [\n [/\\*/g, '\\\\*', 'asterisks'],\n [/#/g, '\\\\#', 'numberSigns'],\n [/\\//g, '\\\\/', 'slashes'],\n [/\\(/g, '\\\\(', 'parentheses'],\n [/\\)/g, '\\\\)', 'parentheses'],\n [/\\[/g, '\\\\[', 'squareBrackets'],\n [/\\]/g, '\\\\]', 'squareBrackets'],\n [/</g, '&lt;', 'angleBrackets'],\n [/>/g, '&gt;', 'angleBrackets'],\n [/_/g, '\\\\_', 'underscores'],\n];\n\nconst escape = (string:string, skips:string[] = []) => {\n const _skips = Array.isArray(skips) ? skips : [];\n if (string && typeof string === 'string') {\n return replacements.reduce((string, replacement) => {\n const name = replacement?.[2];\n return name && _skips.indexOf(name as string) !== -1\n ? string\n : string.replace(replacement?.[0], replacement?.[1] as string);\n }, string);\n }\n return string;\n};\n\n\nexport default escape;\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAM,eAAe;AAAA,EACnB,CAAC,OAAO,OAAO,WAAW;AAAA,EAC1B,CAAC,MAAM,OAAO,aAAa;AAAA,EAC3B,CAAC,OAAO,OAAO,SAAS;AAAA,EACxB,CAAC,OAAO,OAAO,aAAa;AAAA,EAC5B,CAAC,OAAO,OAAO,aAAa;AAAA,EAC5B,CAAC,OAAO,OAAO,gBAAgB;AAAA,EAC/B,CAAC,OAAO,OAAO,gBAAgB;AAAA,EAC/B,CAAC,MAAM,QAAQ,eAAe;AAAA,EAC9B,CAAC,MAAM,QAAQ,eAAe;AAAA,EAC9B,CAAC,MAAM,OAAO,aAAa;AAC7B;AAEA,IAAM,SAAS,CAAC,QAAe,QAAiB,CAAC,MAAM;AACrD,QAAM,SAAS,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AAC/C,MAAI,UAAU,OAAO,WAAW,UAAU;AACxC,WAAO,aAAa,OAAO,CAACA,SAAQ,gBAAgB;AAClD,YAAM,OAAO,2CAAc;AAC3B,aAAO,QAAQ,OAAO,QAAQ,IAAc,MAAM,KAC9CA,UACAA,QAAO,QAAQ,2CAAc,IAAI,2CAAc,EAAY;AAAA,IACjE,GAAG,MAAM;AAAA,EACX;AACA,SAAO;AACT;AAGA,IAAO,yBAAQ;",
6
6
  "names": ["string"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/pathArgsUtils.ts"],
4
- "sourcesContent": ["import { getLocation, isReactNative } from './environment';\r\n\r\n/**\r\n * 对象参数转字符串\r\n * @param params\r\n * @returns\r\n */\r\nconst argsToString = (params: { [key: string]: any }) => {\r\n const paramsAttr: string[] = [];\r\n try {\r\n if (\r\n params &&\r\n !Array.isArray(params) &&\r\n typeof params === 'object' &&\r\n Object.keys(params).length > 0\r\n ) {\r\n Object.keys(params).forEach((item: string) => {\r\n paramsAttr.push(`${item}=${params[item]}`);\r\n });\r\n return paramsAttr?.join('&') as string;\r\n }\r\n return '';\r\n } catch {\r\n return '';\r\n }\r\n};\r\n\r\n/**\r\n * 路径参数转对象\r\n * @param params\r\n * @returns\r\n */\r\nconst argsToObject = (params: string) => {\r\n const res: { [key: string]: any } = {};\r\n const _params = typeof params === 'string' && params ? params : '';\r\n const paramsArr = _params.startsWith('?') ? _params.slice(1).split('&') : _params.split('&');\r\n paramsArr.forEach((item: string) => {\r\n const itemArr: any[] = item.split('=');\r\n const key = itemArr[0];\r\n let value = itemArr[1];\r\n switch (value) {\r\n case 'false':\r\n value = false;\r\n break;\r\n case 'true':\r\n value = true;\r\n break;\r\n case 'undefined':\r\n case 'null':\r\n value = '';\r\n break;\r\n default:\r\n break;\r\n }\r\n res[key] = value;\r\n });\r\n return res as { [key: string]: any };\r\n};\r\n\r\nconst getSearchObj = (url?: string) => {\r\n // 如果没有提供 url,尝试从当前环境获取\r\n let targetUrl = url;\r\n if (!targetUrl) {\r\n if (isReactNative()) {\r\n // React Native 环境中无法获取当前 URL,返回空对象\r\n return {};\r\n }\r\n const location = getLocation();\r\n if (location) {\r\n targetUrl = location.href;\r\n } else {\r\n return {};\r\n }\r\n }\r\n\r\n const urlArr = targetUrl.split('?');\r\n if (urlArr.length === 1) return {};\r\n const search = urlArr.pop();\r\n const objs = search ? search.split('&') : [];\r\n const obj: { [key: string]: any } = {};\r\n\r\n objs.forEach((value) => {\r\n const [k, v] = value.split('=');\r\n if (v) {\r\n obj[decodeURIComponent(k)] = decodeURIComponent(v);\r\n }\r\n });\r\n\r\n return obj as any;\r\n};\r\n\r\nexport { argsToString, argsToObject, getSearchObj };\r\n"],
4
+ "sourcesContent": ["import { getLocation, isReactNative } from './environment';\n\n/**\n * 对象参数转字符串\n * @param params\n * @returns\n */\nconst argsToString = (params: { [key: string]: any }) => {\n const paramsAttr: string[] = [];\n try {\n if (\n params &&\n !Array.isArray(params) &&\n typeof params === 'object' &&\n Object.keys(params).length > 0\n ) {\n Object.keys(params).forEach((item: string) => {\n paramsAttr.push(`${item}=${params[item]}`);\n });\n return paramsAttr?.join('&') as string;\n }\n return '';\n } catch {\n return '';\n }\n};\n\n/**\n * 路径参数转对象\n * @param params\n * @returns\n */\nconst argsToObject = (params: string) => {\n const res: { [key: string]: any } = {};\n const _params = typeof params === 'string' && params ? params : '';\n const paramsArr = _params.startsWith('?') ? _params.slice(1).split('&') : _params.split('&');\n paramsArr.forEach((item: string) => {\n const itemArr: any[] = item.split('=');\n const key = itemArr[0];\n let value = itemArr[1];\n switch (value) {\n case 'false':\n value = false;\n break;\n case 'true':\n value = true;\n break;\n case 'undefined':\n case 'null':\n value = '';\n break;\n default:\n break;\n }\n res[key] = value;\n });\n return res as { [key: string]: any };\n};\n\nconst getSearchObj = (url?: string) => {\n // 如果没有提供 url,尝试从当前环境获取\n let targetUrl = url;\n if (!targetUrl) {\n if (isReactNative()) {\n // React Native 环境中无法获取当前 URL,返回空对象\n return {};\n }\n const location = getLocation();\n if (location) {\n targetUrl = location.href;\n } else {\n return {};\n }\n }\n\n const urlArr = targetUrl.split('?');\n if (urlArr.length === 1) return {};\n const search = urlArr.pop();\n const objs = search ? search.split('&') : [];\n const obj: { [key: string]: any } = {};\n\n objs.forEach((value) => {\n const [k, v] = value.split('=');\n if (v) {\n obj[decodeURIComponent(k)] = decodeURIComponent(v);\n }\n });\n\n return obj as any;\n};\n\nexport { argsToString, argsToObject, getSearchObj };\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAA2C;AAO3C,IAAM,eAAe,CAAC,WAAmC;AACvD,QAAM,aAAuB,CAAC;AAC9B,MAAI;AACF,QACE,UACA,CAAC,MAAM,QAAQ,MAAM,KACrB,OAAO,WAAW,YAClB,OAAO,KAAK,MAAM,EAAE,SAAS,GAC7B;AACA,aAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,SAAiB;AAC5C,mBAAW,KAAK,GAAG,QAAQ,OAAO,IAAI,GAAG;AAAA,MAC3C,CAAC;AACD,aAAO,yCAAY,KAAK;AAAA,IAC1B;AACA,WAAO;AAAA,EACT,QAAE;AACA,WAAO;AAAA,EACT;AACF;AAOA,IAAM,eAAe,CAAC,WAAmB;AACvC,QAAM,MAA8B,CAAC;AACrC,QAAM,UAAU,OAAO,WAAW,YAAY,SAAS,SAAS;AAChE,QAAM,YAAY,QAAQ,WAAW,GAAG,IAAI,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,QAAQ,MAAM,GAAG;AAC3F,YAAU,QAAQ,CAAC,SAAiB;AAClC,UAAM,UAAiB,KAAK,MAAM,GAAG;AACrC,UAAM,MAAM,QAAQ,CAAC;AACrB,QAAI,QAAQ,QAAQ,CAAC;AACrB,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,gBAAQ;AACR;AAAA,MACF,KAAK;AACH,gBAAQ;AACR;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ;AACR;AAAA,MACF;AACE;AAAA,IACJ;AACA,QAAI,GAAG,IAAI;AAAA,EACb,CAAC;AACD,SAAO;AACT;AAEA,IAAM,eAAe,CAAC,QAAiB;AAErC,MAAI,YAAY;AAChB,MAAI,CAAC,WAAW;AACd,YAAI,kCAAc,GAAG;AAEnB,aAAO,CAAC;AAAA,IACV;AACA,UAAM,eAAW,gCAAY;AAC7B,QAAI,UAAU;AACZ,kBAAY,SAAS;AAAA,IACvB,OAAO;AACL,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,QAAM,SAAS,UAAU,MAAM,GAAG;AAClC,MAAI,OAAO,WAAW;AAAG,WAAO,CAAC;AACjC,QAAM,SAAS,OAAO,IAAI;AAC1B,QAAM,OAAO,SAAS,OAAO,MAAM,GAAG,IAAI,CAAC;AAC3C,QAAM,MAA8B,CAAC;AAErC,OAAK,QAAQ,CAAC,UAAU;AACtB,UAAM,CAAC,GAAG,CAAC,IAAI,MAAM,MAAM,GAAG;AAC9B,QAAI,GAAG;AACL,UAAI,mBAAmB,CAAC,CAAC,IAAI,mBAAmB,CAAC;AAAA,IACnD;AAAA,EACF,CAAC;AAED,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/scriptExecution.ts"],
4
- "sourcesContent": ["import 'ses';\r\n\r\nexport type scriptExecutionType = (scriptCode: string, options: {[key:string]: any}) => any;\r\nconst scriptExecution = (scriptCode: string, options: {[key:string]: any}) => {\r\n const compartment = new Compartment(options);\r\n try {\r\n return scriptCode ? compartment.evaluate(scriptCode) : null;\r\n } catch (err) {\r\n console.error(err);\r\n return null;\r\n }\r\n};\r\n\r\nexport default scriptExecution;\r\n"],
4
+ "sourcesContent": ["import 'ses';\n\nexport type scriptExecutionType = (scriptCode: string, options: {[key:string]: any}) => any;\nconst scriptExecution = (scriptCode: string, options: {[key:string]: any}) => {\n const compartment = new Compartment(options);\n try {\n return scriptCode ? compartment.evaluate(scriptCode) : null;\n } catch (err) {\n console.error(err);\n return null;\n }\n};\n\nexport default scriptExecution;\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAO;AAGP,IAAM,kBAAkB,CAAC,YAAoB,YAAiC;AAC5E,QAAM,cAAc,IAAI,YAAY,OAAO;AAC3C,MAAI;AACF,WAAO,aAAa,YAAY,SAAS,UAAU,IAAI;AAAA,EACzD,SAAS,KAAP;AACA,YAAQ,MAAM,GAAG;AACjB,WAAO;AAAA,EACT;AACF;AAEA,IAAO,0BAAQ;",
6
6
  "names": []
7
7
  }
@@ -91,7 +91,7 @@ var sanitizeRedirectUrl = (url, allowedDomains = [], defaultUrl = "/") => {
91
91
  return defaultUrl;
92
92
  }
93
93
  }
94
- return urlObj.pathname + urlObj.search;
94
+ return urlObj.pathname + urlObj.search + urlObj.hash;
95
95
  } catch {
96
96
  return defaultUrl;
97
97
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/securityUtils.ts"],
4
- "sourcesContent": ["/**\r\n * 安全工具函数,用于防止XSS等安全漏洞\r\n */\r\nimport { getLocation, isReactNative } from './environment';\r\n\r\n/**\r\n * 验证URL是否安全,防止XSS攻击\r\n * @param url 待验证的URL\r\n * @returns 是否为安全的URL\r\n */\r\nexport const isValidUrl = (url: string): boolean => {\r\n if (!url || typeof url !== 'string') {\r\n return false;\r\n }\r\n\r\n try {\r\n let baseUrl: string;\r\n if (isReactNative()) {\r\n // React Native 环境中使用默认的 base URL\r\n baseUrl = 'http://localhost';\r\n } else {\r\n const location = getLocation();\r\n baseUrl = location ? location.origin : 'http://localhost';\r\n }\r\n \r\n const urlObj = new URL(url, baseUrl);\r\n \r\n // 只允许http和https协议,防止javascript:等危险协议\r\n if (!['http:', 'https:'].includes(urlObj.protocol)) {\r\n return false;\r\n }\r\n\r\n // 检查是否包含危险字符\r\n const dangerousPatterns = [\r\n /javascript:/i,\r\n /vbscript:/i,\r\n /data:/i,\r\n /file:/i,\r\n /<script/i,\r\n /onload=/i,\r\n /onerror=/i,\r\n /onclick=/i,\r\n ];\r\n\r\n return !dangerousPatterns.some(pattern => pattern.test(url));\r\n } catch {\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * 清理和验证重定向URL,确保安全\r\n * @param url 待清理的URL\r\n * @param allowedDomains 允许的域名列表,为空时允许同源URL\r\n * @returns 清理后的安全URL,如果不安全则返回默认URL\r\n */\r\nexport const sanitizeRedirectUrl = (\r\n url: string,\r\n allowedDomains: string[] = [],\r\n defaultUrl: string = '/'\r\n): string => {\r\n if (!url || typeof url !== 'string') {\r\n return defaultUrl;\r\n }\r\n\r\n // 基本URL验证\r\n if (!isValidUrl(url)) {\r\n return defaultUrl;\r\n }\r\n\r\n try {\r\n let baseUrl: string;\r\n let currentHost: string;\r\n \r\n if (isReactNative()) {\r\n // React Native 环境中使用默认值\r\n baseUrl = 'http://localhost';\r\n currentHost = 'localhost';\r\n } else {\r\n const location = getLocation();\r\n if (!location) {\r\n return defaultUrl;\r\n }\r\n baseUrl = location.origin;\r\n currentHost = location.hostname;\r\n }\r\n\r\n const urlObj = new URL(url, baseUrl);\r\n\r\n // 如果没有指定允许的域名,只允许同源URL\r\n if (allowedDomains.length === 0) {\r\n if (urlObj.hostname !== currentHost) {\r\n return defaultUrl;\r\n }\r\n } else {\r\n // 检查是否在允许的域名列表中\r\n const isAllowedDomain = allowedDomains.some(domain =>\r\n urlObj.hostname === domain || urlObj.hostname.endsWith(`.${domain}`)\r\n );\r\n \r\n if (!isAllowedDomain && urlObj.hostname !== currentHost) {\r\n return defaultUrl;\r\n }\r\n }\r\n\r\n return urlObj.pathname + urlObj.search;\r\n } catch {\r\n return defaultUrl;\r\n }\r\n};\r\n\r\n/**\r\n * 安全地设置window.location.href,防止XSS攻击\r\n * @param url 目标URL\r\n * @param allowedDomains 允许的域名列表\r\n */\r\nexport const safeRedirect = (url: string, allowedDomains: string[] = []): void => {\r\n const safeUrl = sanitizeRedirectUrl(url, allowedDomains);\r\n \r\n if (isReactNative()) {\r\n // React Native 环境中无法直接跳转,可以通过其他方式处理\r\n console.warn('safeRedirect is not supported in React Native environment');\r\n return;\r\n }\r\n \r\n const win = typeof window !== 'undefined' ? window : null;\r\n if (win) {\r\n win.location.href = safeUrl;\r\n }\r\n};\r\n\r\n/**\r\n * 验证和清理事件处理器,防止恶意代码注入\r\n * @param handler 事件处理函数\r\n * @returns 安全的事件处理函数\r\n */\r\nexport const sanitizeEventHandler = (handler: Function): Function => {\r\n if (typeof handler !== 'function') {\r\n return () => {};\r\n }\r\n \r\n return (...args: any[]) => {\r\n try {\r\n handler(...args);\r\n } catch (error) {\r\n console.error('Event handler error:', error);\r\n }\r\n };\r\n};\r\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,yBAA2C;AAOpC,IAAM,aAAa,CAAC,QAAyB;AAClD,MAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,QAAI;AACJ,YAAI,kCAAc,GAAG;AAEnB,gBAAU;AAAA,IACZ,OAAO;AACL,YAAM,eAAW,gCAAY;AAC7B,gBAAU,WAAW,SAAS,SAAS;AAAA,IACzC;AAEA,UAAM,SAAS,IAAI,IAAI,KAAK,OAAO;AAGnC,QAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,OAAO,QAAQ,GAAG;AAClD,aAAO;AAAA,IACT;AAGA,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,CAAC,kBAAkB,KAAK,aAAW,QAAQ,KAAK,GAAG,CAAC;AAAA,EAC7D,QAAE;AACA,WAAO;AAAA,EACT;AACF;AAQO,IAAM,sBAAsB,CACjC,KACA,iBAA2B,CAAC,GAC5B,aAAqB,QACV;AACX,MAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,QAAI;AACJ,QAAI;AAEJ,YAAI,kCAAc,GAAG;AAEnB,gBAAU;AACV,oBAAc;AAAA,IAChB,OAAO;AACL,YAAM,eAAW,gCAAY;AAC7B,UAAI,CAAC,UAAU;AACb,eAAO;AAAA,MACT;AACA,gBAAU,SAAS;AACnB,oBAAc,SAAS;AAAA,IACzB;AAEA,UAAM,SAAS,IAAI,IAAI,KAAK,OAAO;AAGnC,QAAI,eAAe,WAAW,GAAG;AAC/B,UAAI,OAAO,aAAa,aAAa;AACnC,eAAO;AAAA,MACT;AAAA,IACF,OAAO;AAEL,YAAM,kBAAkB,eAAe;AAAA,QAAK,YAC1C,OAAO,aAAa,UAAU,OAAO,SAAS,SAAS,IAAI,QAAQ;AAAA,MACrE;AAEA,UAAI,CAAC,mBAAmB,OAAO,aAAa,aAAa;AACvD,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO,OAAO,WAAW,OAAO;AAAA,EAClC,QAAE;AACA,WAAO;AAAA,EACT;AACF;AAOO,IAAM,eAAe,CAAC,KAAa,iBAA2B,CAAC,MAAY;AAChF,QAAM,UAAU,oBAAoB,KAAK,cAAc;AAEvD,UAAI,kCAAc,GAAG;AAEnB,YAAQ,KAAK,2DAA2D;AACxE;AAAA,EACF;AAEA,QAAM,MAAM,OAAO,WAAW,cAAc,SAAS;AACrD,MAAI,KAAK;AACP,QAAI,SAAS,OAAO;AAAA,EACtB;AACF;AAOO,IAAM,uBAAuB,CAAC,YAAgC;AACnE,MAAI,OAAO,YAAY,YAAY;AACjC,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AAEA,SAAO,IAAI,SAAgB;AACzB,QAAI;AACF,cAAQ,GAAG,IAAI;AAAA,IACjB,SAAS,OAAP;AACA,cAAQ,MAAM,wBAAwB,KAAK;AAAA,IAC7C;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["/**\n * 安全工具函数,用于防止XSS等安全漏洞\n */\nimport { getLocation, isReactNative } from './environment';\n\n/**\n * 验证URL是否安全,防止XSS攻击\n * @param url 待验证的URL\n * @returns 是否为安全的URL\n */\nexport const isValidUrl = (url: string): boolean => {\n if (!url || typeof url !== 'string') {\n return false;\n }\n\n try {\n let baseUrl: string;\n if (isReactNative()) {\n // React Native 环境中使用默认的 base URL\n baseUrl = 'http://localhost';\n } else {\n const location = getLocation();\n baseUrl = location ? location.origin : 'http://localhost';\n }\n \n const urlObj = new URL(url, baseUrl);\n \n // 只允许http和https协议,防止javascript:等危险协议\n if (!['http:', 'https:'].includes(urlObj.protocol)) {\n return false;\n }\n\n // 检查是否包含危险字符\n const dangerousPatterns = [\n /javascript:/i,\n /vbscript:/i,\n /data:/i,\n /file:/i,\n /<script/i,\n /onload=/i,\n /onerror=/i,\n /onclick=/i,\n ];\n\n return !dangerousPatterns.some(pattern => pattern.test(url));\n } catch {\n return false;\n }\n};\n\n/**\n * 清理和验证重定向URL,确保安全\n * @param url 待清理的URL\n * @param allowedDomains 允许的域名列表,为空时允许同源URL\n * @returns 清理后的安全URL,如果不安全则返回默认URL\n */\nexport const sanitizeRedirectUrl = (\n url: string,\n allowedDomains: string[] = [],\n defaultUrl: string = '/'\n): string => {\n if (!url || typeof url !== 'string') {\n return defaultUrl;\n }\n\n // 基本URL验证\n if (!isValidUrl(url)) {\n return defaultUrl;\n }\n\n try {\n let baseUrl: string;\n let currentHost: string;\n \n if (isReactNative()) {\n // React Native 环境中使用默认值\n baseUrl = 'http://localhost';\n currentHost = 'localhost';\n } else {\n const location = getLocation();\n if (!location) {\n return defaultUrl;\n }\n baseUrl = location.origin;\n currentHost = location.hostname;\n }\n\n const urlObj = new URL(url, baseUrl);\n\n // 如果没有指定允许的域名,只允许同源URL\n if (allowedDomains.length === 0) {\n if (urlObj.hostname !== currentHost) {\n return defaultUrl;\n }\n } else {\n // 检查是否在允许的域名列表中\n const isAllowedDomain = allowedDomains.some(domain =>\n urlObj.hostname === domain || urlObj.hostname.endsWith(`.${domain}`)\n );\n \n if (!isAllowedDomain && urlObj.hostname !== currentHost) {\n return defaultUrl;\n }\n }\n\n return urlObj.pathname + urlObj.search + urlObj.hash;\n } catch {\n return defaultUrl;\n }\n};\n\n/**\n * 安全地设置window.location.href,防止XSS攻击\n * @param url 目标URL\n * @param allowedDomains 允许的域名列表\n */\nexport const safeRedirect = (url: string, allowedDomains: string[] = []): void => {\n const safeUrl = sanitizeRedirectUrl(url, allowedDomains);\n \n if (isReactNative()) {\n // React Native 环境中无法直接跳转,可以通过其他方式处理\n console.warn('safeRedirect is not supported in React Native environment');\n return;\n }\n \n const win = typeof window !== 'undefined' ? window : null;\n if (win) {\n win.location.href = safeUrl;\n }\n};\n\n/**\n * 验证和清理事件处理器,防止恶意代码注入\n * @param handler 事件处理函数\n * @returns 安全的事件处理函数\n */\nexport const sanitizeEventHandler = (handler: Function): Function => {\n if (typeof handler !== 'function') {\n return () => {};\n }\n \n return (...args: any[]) => {\n try {\n handler(...args);\n } catch (error) {\n console.error('Event handler error:', error);\n }\n };\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,yBAA2C;AAOpC,IAAM,aAAa,CAAC,QAAyB;AAClD,MAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,QAAI;AACJ,YAAI,kCAAc,GAAG;AAEnB,gBAAU;AAAA,IACZ,OAAO;AACL,YAAM,eAAW,gCAAY;AAC7B,gBAAU,WAAW,SAAS,SAAS;AAAA,IACzC;AAEA,UAAM,SAAS,IAAI,IAAI,KAAK,OAAO;AAGnC,QAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,OAAO,QAAQ,GAAG;AAClD,aAAO;AAAA,IACT;AAGA,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,CAAC,kBAAkB,KAAK,aAAW,QAAQ,KAAK,GAAG,CAAC;AAAA,EAC7D,QAAE;AACA,WAAO;AAAA,EACT;AACF;AAQO,IAAM,sBAAsB,CACjC,KACA,iBAA2B,CAAC,GAC5B,aAAqB,QACV;AACX,MAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,QAAI;AACJ,QAAI;AAEJ,YAAI,kCAAc,GAAG;AAEnB,gBAAU;AACV,oBAAc;AAAA,IAChB,OAAO;AACL,YAAM,eAAW,gCAAY;AAC7B,UAAI,CAAC,UAAU;AACb,eAAO;AAAA,MACT;AACA,gBAAU,SAAS;AACnB,oBAAc,SAAS;AAAA,IACzB;AAEA,UAAM,SAAS,IAAI,IAAI,KAAK,OAAO;AAGnC,QAAI,eAAe,WAAW,GAAG;AAC/B,UAAI,OAAO,aAAa,aAAa;AACnC,eAAO;AAAA,MACT;AAAA,IACF,OAAO;AAEL,YAAM,kBAAkB,eAAe;AAAA,QAAK,YAC1C,OAAO,aAAa,UAAU,OAAO,SAAS,SAAS,IAAI,QAAQ;AAAA,MACrE;AAEA,UAAI,CAAC,mBAAmB,OAAO,aAAa,aAAa;AACvD,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO,OAAO,WAAW,OAAO,SAAS,OAAO;AAAA,EAClD,QAAE;AACA,WAAO;AAAA,EACT;AACF;AAOO,IAAM,eAAe,CAAC,KAAa,iBAA2B,CAAC,MAAY;AAChF,QAAM,UAAU,oBAAoB,KAAK,cAAc;AAEvD,UAAI,kCAAc,GAAG;AAEnB,YAAQ,KAAK,2DAA2D;AACxE;AAAA,EACF;AAEA,QAAM,MAAM,OAAO,WAAW,cAAc,SAAS;AACrD,MAAI,KAAK;AACP,QAAI,SAAS,OAAO;AAAA,EACtB;AACF;AAOO,IAAM,uBAAuB,CAAC,YAAgC;AACnE,MAAI,OAAO,YAAY,YAAY;AACjC,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AAEA,SAAO,IAAI,SAAgB;AACzB,QAAI;AACF,cAAQ,GAAG,IAAI;AAAA,IACjB,SAAS,OAAP;AACA,cAAQ,MAAM,wBAAwB,KAAK;AAAA,IAC7C;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }