@boteteam/utils 0.0.20-alpha.0.1 → 0.0.20-alpha.0.2

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.
@@ -2,5 +2,8 @@ declare const CookieUtils: {
2
2
  get(name: string): string | null;
3
3
  set(name: string, value: string, expires?: Date, path?: string, domain?: string, secure?: boolean): void;
4
4
  unset(name: string, path?: string, domain?: string, secure?: boolean): void;
5
+ getAsync(name: string): Promise<string | null>;
6
+ setAsync(name: string, value: string, expires?: Date, path?: string, domain?: string, secure?: boolean): Promise<void>;
7
+ unsetAsync(name: string, path?: string, domain?: string, secure?: boolean): Promise<void>;
5
8
  };
6
9
  export default CookieUtils;
@@ -22,24 +22,57 @@ __export(CookieUtils_exports, {
22
22
  default: () => CookieUtils_default
23
23
  });
24
24
  module.exports = __toCommonJS(CookieUtils_exports);
25
+ var import_environment = require("./environment");
26
+ var getAsyncStorage = () => {
27
+ if ((0, import_environment.isReactNative)()) {
28
+ try {
29
+ return require("@react-native-async-storage/async-storage").default;
30
+ } catch {
31
+ console.warn("AsyncStorage not available in React Native environment");
32
+ return null;
33
+ }
34
+ }
35
+ return null;
36
+ };
25
37
  var CookieUtils = {
26
38
  get(name) {
39
+ if ((0, import_environment.isReactNative)()) {
40
+ const AsyncStorage = getAsyncStorage();
41
+ if (AsyncStorage) {
42
+ return null;
43
+ }
44
+ return null;
45
+ }
46
+ const doc = (0, import_environment.getDocument)();
47
+ if (!doc)
48
+ return null;
27
49
  const cookieName = `${encodeURIComponent(name)}=`;
28
- const cookieStart = document.cookie.indexOf(cookieName);
50
+ const cookieStart = doc.cookie.indexOf(cookieName);
29
51
  let cookieValue = null;
30
52
  let cookieEnd;
31
53
  if (cookieStart > -1) {
32
- cookieEnd = document.cookie.indexOf(";", cookieStart);
54
+ cookieEnd = doc.cookie.indexOf(";", cookieStart);
33
55
  if (cookieEnd === -1) {
34
- cookieEnd = document.cookie.length;
56
+ cookieEnd = doc.cookie.length;
35
57
  }
36
58
  cookieValue = decodeURIComponent(
37
- document.cookie.substring(cookieStart + cookieName.length, cookieEnd)
59
+ doc.cookie.substring(cookieStart + cookieName.length, cookieEnd)
38
60
  );
39
61
  }
40
62
  return cookieValue;
41
63
  },
42
64
  set(name, value, expires, path, domain, secure) {
65
+ if ((0, import_environment.isReactNative)()) {
66
+ const AsyncStorage = getAsyncStorage();
67
+ if (AsyncStorage) {
68
+ AsyncStorage.setItem(`cookie_${name}`, value).catch(console.error);
69
+ return;
70
+ }
71
+ return;
72
+ }
73
+ const doc = (0, import_environment.getDocument)();
74
+ if (!doc)
75
+ return;
43
76
  let cookieText = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
44
77
  if (expires instanceof Date) {
45
78
  cookieText += `; expires=${expires.toUTCString()}`;
@@ -53,10 +86,63 @@ var CookieUtils = {
53
86
  if (secure) {
54
87
  cookieText += "; secure";
55
88
  }
56
- document.cookie = cookieText;
89
+ doc.cookie = cookieText;
57
90
  },
58
91
  unset(name, path, domain, secure) {
92
+ if ((0, import_environment.isReactNative)()) {
93
+ const AsyncStorage = getAsyncStorage();
94
+ if (AsyncStorage) {
95
+ AsyncStorage.removeItem(`cookie_${name}`).catch(console.error);
96
+ return;
97
+ }
98
+ return;
99
+ }
59
100
  this.set(name, "", /* @__PURE__ */ new Date(0), path, domain, secure);
101
+ },
102
+ // React Native 异步版本
103
+ async getAsync(name) {
104
+ if ((0, import_environment.isReactNative)()) {
105
+ const AsyncStorage = getAsyncStorage();
106
+ if (AsyncStorage) {
107
+ try {
108
+ return await AsyncStorage.getItem(`cookie_${name}`);
109
+ } catch {
110
+ return null;
111
+ }
112
+ }
113
+ return null;
114
+ }
115
+ return this.get(name);
116
+ },
117
+ async setAsync(name, value, expires, path, domain, secure) {
118
+ if ((0, import_environment.isReactNative)()) {
119
+ const AsyncStorage = getAsyncStorage();
120
+ if (AsyncStorage) {
121
+ try {
122
+ await AsyncStorage.setItem(`cookie_${name}`, value);
123
+ } catch (error) {
124
+ console.error("Failed to set cookie in React Native:", error);
125
+ }
126
+ return;
127
+ }
128
+ return;
129
+ }
130
+ this.set(name, value, expires, path, domain, secure);
131
+ },
132
+ async unsetAsync(name, path, domain, secure) {
133
+ if ((0, import_environment.isReactNative)()) {
134
+ const AsyncStorage = getAsyncStorage();
135
+ if (AsyncStorage) {
136
+ try {
137
+ await AsyncStorage.removeItem(`cookie_${name}`);
138
+ } catch (error) {
139
+ console.error("Failed to unset cookie in React Native:", error);
140
+ }
141
+ return;
142
+ }
143
+ return;
144
+ }
145
+ this.unset(name, path, domain, secure);
60
146
  }
61
147
  };
62
148
  var CookieUtils_default = CookieUtils;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/CookieUtils.ts"],
4
- "sourcesContent": ["const CookieUtils = {\n get(name: string): string | null {\n const cookieName = `${encodeURIComponent(name)}=`;\n const cookieStart = document.cookie.indexOf(cookieName);\n let cookieValue: string | null = null;\n let cookieEnd: number;\n if (cookieStart > -1) {\n cookieEnd = document.cookie.indexOf(';', cookieStart);\n if (cookieEnd === -1) {\n cookieEnd = document.cookie.length;\n }\n cookieValue = decodeURIComponent(\n document.cookie.substring(cookieStart + cookieName.length, cookieEnd),\n );\n }\n return cookieValue;\n },\n set(\n name: string,\n value: string,\n expires?: Date,\n path?: string,\n domain?: string,\n secure?: boolean,\n ): void {\n let cookieText = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\n if (expires instanceof Date) {\n cookieText += `; expires=${expires.toUTCString()}`;\n }\n if (path) {\n cookieText += `; path=${path}`;\n }\n if (domain) {\n cookieText += `; domain=${domain}`;\n }\n if (secure) {\n cookieText += '; secure';\n }\n document.cookie = cookieText;\n },\n unset(name: string, path?: string, domain?: string, secure?: boolean): void {\n this.set(name, '', new Date(0), path, domain, secure);\n },\n};\n\nexport default CookieUtils;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAM,cAAc;AAAA,EAClB,IAAI,MAA6B;AAC/B,UAAM,aAAa,GAAG,mBAAmB,IAAI;AAC7C,UAAM,cAAc,SAAS,OAAO,QAAQ,UAAU;AACtD,QAAI,cAA6B;AACjC,QAAI;AACJ,QAAI,cAAc,IAAI;AACpB,kBAAY,SAAS,OAAO,QAAQ,KAAK,WAAW;AACpD,UAAI,cAAc,IAAI;AACpB,oBAAY,SAAS,OAAO;AAAA,MAC9B;AACA,oBAAc;AAAA,QACZ,SAAS,OAAO,UAAU,cAAc,WAAW,QAAQ,SAAS;AAAA,MACtE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EACA,IACE,MACA,OACA,SACA,MACA,QACA,QACM;AACN,QAAI,aAAa,GAAG,mBAAmB,IAAI,KAAK,mBAAmB,KAAK;AACxE,QAAI,mBAAmB,MAAM;AAC3B,oBAAc,aAAa,QAAQ,YAAY;AAAA,IACjD;AACA,QAAI,MAAM;AACR,oBAAc,UAAU;AAAA,IAC1B;AACA,QAAI,QAAQ;AACV,oBAAc,YAAY;AAAA,IAC5B;AACA,QAAI,QAAQ;AACV,oBAAc;AAAA,IAChB;AACA,aAAS,SAAS;AAAA,EACpB;AAAA,EACA,MAAM,MAAc,MAAe,QAAiB,QAAwB;AAC1E,SAAK,IAAI,MAAM,IAAI,oBAAI,KAAK,CAAC,GAAG,MAAM,QAAQ,MAAM;AAAA,EACtD;AACF;AAEA,IAAO,sBAAQ;",
4
+ "sourcesContent": ["import { getDocument, isReactNative } from './environment';\n\n// React Native 环境下的 Cookie 替代方案\nconst getAsyncStorage = () => {\n if (isReactNative()) {\n try {\n return require('@react-native-async-storage/async-storage').default;\n } catch {\n console.warn('AsyncStorage not available in React Native environment');\n return null;\n }\n }\n return null;\n};\n\nconst CookieUtils = {\n get(name: string): string | null {\n if (isReactNative()) {\n const AsyncStorage = getAsyncStorage();\n if (AsyncStorage) {\n // 在 React Native 中,我们使用 AsyncStorage 来模拟 cookie\n // 注意:这是异步操作,但在同步上下文中调用\n // 实际使用时应该使用异步版本\n return null; // 同步版本返回 null,异步版本需要单独实现\n }\n return null;\n }\n\n const doc = getDocument();\n if (!doc) return null;\n\n const cookieName = `${encodeURIComponent(name)}=`;\n const cookieStart = doc.cookie.indexOf(cookieName);\n let cookieValue: string | null = null;\n let cookieEnd: number;\n if (cookieStart > -1) {\n cookieEnd = doc.cookie.indexOf(';', cookieStart);\n if (cookieEnd === -1) {\n cookieEnd = doc.cookie.length;\n }\n cookieValue = decodeURIComponent(\n doc.cookie.substring(cookieStart + cookieName.length, cookieEnd),\n );\n }\n return cookieValue;\n },\n\n set(\n name: string,\n value: string,\n expires?: Date,\n path?: string,\n domain?: string,\n secure?: boolean,\n ): void {\n if (isReactNative()) {\n const AsyncStorage = getAsyncStorage();\n if (AsyncStorage) {\n // 在 React Native 中存储到 AsyncStorage\n AsyncStorage.setItem(`cookie_${name}`, value).catch(console.error);\n return;\n }\n return;\n }\n\n const doc = getDocument();\n if (!doc) return;\n\n let cookieText = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\n if (expires instanceof Date) {\n cookieText += `; expires=${expires.toUTCString()}`;\n }\n if (path) {\n cookieText += `; path=${path}`;\n }\n if (domain) {\n cookieText += `; domain=${domain}`;\n }\n if (secure) {\n cookieText += '; secure';\n }\n doc.cookie = cookieText;\n },\n\n unset(name: string, path?: string, domain?: string, secure?: boolean): void {\n if (isReactNative()) {\n const AsyncStorage = getAsyncStorage();\n if (AsyncStorage) {\n // 在 React Native 中从 AsyncStorage 删除\n AsyncStorage.removeItem(`cookie_${name}`).catch(console.error);\n return;\n }\n return;\n }\n\n this.set(name, '', new Date(0), path, domain, secure);\n },\n\n // React Native 异步版本\n async getAsync(name: string): Promise<string | null> {\n if (isReactNative()) {\n const AsyncStorage = getAsyncStorage();\n if (AsyncStorage) {\n try {\n return await AsyncStorage.getItem(`cookie_${name}`);\n } catch {\n return null;\n }\n }\n return null;\n }\n return this.get(name);\n },\n\n async setAsync(\n name: string,\n value: string,\n expires?: Date,\n path?: string,\n domain?: string,\n secure?: boolean,\n ): Promise<void> {\n if (isReactNative()) {\n const AsyncStorage = getAsyncStorage();\n if (AsyncStorage) {\n try {\n await AsyncStorage.setItem(`cookie_${name}`, value);\n } catch (error) {\n console.error('Failed to set cookie in React Native:', error);\n }\n return;\n }\n return;\n }\n this.set(name, value, expires, path, domain, secure);\n },\n\n async unsetAsync(name: string, path?: string, domain?: string, secure?: boolean): Promise<void> {\n if (isReactNative()) {\n const AsyncStorage = getAsyncStorage();\n if (AsyncStorage) {\n try {\n await AsyncStorage.removeItem(`cookie_${name}`);\n } catch (error) {\n console.error('Failed to unset cookie in React Native:', error);\n }\n return;\n }\n return;\n }\n this.unset(name, path, domain, secure);\n },\n};\n\nexport default CookieUtils;\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 环境检测工具
3
+ * 用于判断当前运行环境,提供跨平台兼容性支持
4
+ */
5
+ export declare const isReactNative: () => boolean;
6
+ export declare const isWeb: () => boolean;
7
+ export declare const isNode: () => boolean;
8
+ export declare const getEnvironment: () => 'web' | 'react-native' | 'node';
9
+ export declare const getWindow: () => Window | null;
10
+ export declare const getDocument: () => Document | null;
11
+ export declare const getLocation: () => Location | null;
@@ -0,0 +1,78 @@
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/environment.ts
20
+ var environment_exports = {};
21
+ __export(environment_exports, {
22
+ getDocument: () => getDocument,
23
+ getEnvironment: () => getEnvironment,
24
+ getLocation: () => getLocation,
25
+ getWindow: () => getWindow,
26
+ isNode: () => isNode,
27
+ isReactNative: () => isReactNative,
28
+ isWeb: () => isWeb
29
+ });
30
+ module.exports = __toCommonJS(environment_exports);
31
+ var isReactNative = () => {
32
+ return typeof global !== "undefined" && global.navigator && global.navigator.product === "ReactNative";
33
+ };
34
+ var isWeb = () => {
35
+ return typeof window !== "undefined" && typeof document !== "undefined" && !isReactNative();
36
+ };
37
+ var isNode = () => {
38
+ return typeof process !== "undefined" && process.versions && Boolean(process.versions.node);
39
+ };
40
+ var getEnvironment = () => {
41
+ if (isReactNative()) {
42
+ return "react-native";
43
+ }
44
+ if (isWeb()) {
45
+ return "web";
46
+ }
47
+ if (isNode()) {
48
+ return "node";
49
+ }
50
+ return "web";
51
+ };
52
+ var getWindow = () => {
53
+ if (isWeb()) {
54
+ return window;
55
+ }
56
+ return null;
57
+ };
58
+ var getDocument = () => {
59
+ if (isWeb()) {
60
+ return document;
61
+ }
62
+ return null;
63
+ };
64
+ var getLocation = () => {
65
+ const win = getWindow();
66
+ return win ? win.location : null;
67
+ };
68
+ // Annotate the CommonJS export names for ESM import in node:
69
+ 0 && (module.exports = {
70
+ getDocument,
71
+ getEnvironment,
72
+ getLocation,
73
+ getWindow,
74
+ isNode,
75
+ isReactNative,
76
+ isWeb
77
+ });
78
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/environment.ts"],
4
+ "sourcesContent": ["/**\n * 环境检测工具\n * 用于判断当前运行环境,提供跨平台兼容性支持\n */\n\n// 检测是否为 React Native 环境\nexport const isReactNative = (): boolean => {\n return typeof global !== 'undefined' &&\n global.navigator &&\n global.navigator.product === 'ReactNative';\n};\n\n// 检测是否为 Web 环境\nexport const isWeb = (): boolean => {\n return typeof window !== 'undefined' &&\n typeof document !== 'undefined' &&\n !isReactNative();\n};\n\n// 检测是否为 Node.js 环境\nexport const isNode = (): boolean => {\n return typeof process !== 'undefined' &&\n process.versions &&\n Boolean(process.versions.node);\n};\n\n// 获取当前环境类型\nexport const getEnvironment = (): 'web' | 'react-native' | 'node' => {\n if (isReactNative()) {\n return 'react-native';\n }\n if (isWeb()) {\n return 'web';\n }\n if (isNode()) {\n return 'node';\n }\n return 'web'; // 默认返回 web\n};\n\n// 安全地获取 window 对象\nexport const getWindow = (): Window | null => {\n if (isWeb()) {\n return window;\n }\n return null;\n};\n\n// 安全地获取 document 对象\nexport const getDocument = (): Document | null => {\n if (isWeb()) {\n return document;\n }\n return null;\n};\n\n// 安全地获取 location 对象\nexport const getLocation = (): Location | null => {\n const win = getWindow();\n return win ? win.location : null;\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMO,IAAM,gBAAgB,MAAe;AAC1C,SAAO,OAAO,WAAW,eAClB,OAAO,aACP,OAAO,UAAU,YAAY;AACtC;AAGO,IAAM,QAAQ,MAAe;AAClC,SAAO,OAAO,WAAW,eAClB,OAAO,aAAa,eACpB,CAAC,cAAc;AACxB;AAGO,IAAM,SAAS,MAAe;AACnC,SAAO,OAAO,YAAY,eACnB,QAAQ,YACR,QAAQ,QAAQ,SAAS,IAAI;AACtC;AAGO,IAAM,iBAAiB,MAAuC;AACnE,MAAI,cAAc,GAAG;AACnB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,GAAG;AACX,WAAO;AAAA,EACT;AACA,MAAI,OAAO,GAAG;AACZ,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGO,IAAM,YAAY,MAAqB;AAC5C,MAAI,MAAM,GAAG;AACX,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGO,IAAM,cAAc,MAAuB;AAChD,MAAI,MAAM,GAAG;AACX,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGO,IAAM,cAAc,MAAuB;AAChD,QAAM,MAAM,UAAU;AACtB,SAAO,MAAM,IAAI,WAAW;AAC9B;",
6
+ "names": []
7
+ }
package/dist/cjs/http.js CHANGED
@@ -35,11 +35,33 @@ __export(http_exports, {
35
35
  });
36
36
  module.exports = __toCommonJS(http_exports);
37
37
  var import_security = __toESM(require("@lingxiteam/security"));
38
+ var import_environment = require("./environment");
38
39
  var tenantIdSessionKey = "botSelectedTenantID";
40
+ var getStorage = () => {
41
+ if ((0, import_environment.isReactNative)()) {
42
+ try {
43
+ return require("@react-native-async-storage/async-storage").default;
44
+ } catch {
45
+ console.warn("AsyncStorage not available in React Native environment");
46
+ return null;
47
+ }
48
+ }
49
+ return null;
50
+ };
39
51
  var http = (url, config) => {
40
52
  config.headers["content-type"] = "application/json;charset=UTF-8";
41
- const token = sessionStorage.getItem("token");
42
- config.headers.Authorization = `Bearer ${token}`;
53
+ let token = null;
54
+ if ((0, import_environment.isReactNative)()) {
55
+ const AsyncStorage = getStorage();
56
+ if (AsyncStorage) {
57
+ token = null;
58
+ }
59
+ } else {
60
+ token = sessionStorage.getItem("token");
61
+ }
62
+ if (token) {
63
+ config.headers.Authorization = `Bearer ${token}`;
64
+ }
43
65
  config.headers["Tenant-Id"] = currentTenantId;
44
66
  return new Promise((resolve, rejects) => {
45
67
  fetch(url, config).then((response) => {
@@ -85,12 +107,33 @@ var getUrl = (url, params = {}) => {
85
107
  var currentTenantId = "";
86
108
  var getAccessUrl = (url) => {
87
109
  if (!url) {
88
- return new URL("", window.location.href).toString();
110
+ if ((0, import_environment.isReactNative)()) {
111
+ return "http://localhost/";
112
+ }
113
+ const location2 = (0, import_environment.getLocation)();
114
+ if (location2) {
115
+ return new URL("", location2.href).toString();
116
+ }
117
+ return "http://localhost/";
89
118
  }
90
119
  if (/^\d+$/.test(url)) {
91
- return `http://${window.location.hostname}:${url}/`;
120
+ if ((0, import_environment.isReactNative)()) {
121
+ return `http://localhost:${url}/`;
122
+ }
123
+ const location2 = (0, import_environment.getLocation)();
124
+ if (location2) {
125
+ return `http://${location2.hostname}:${url}/`;
126
+ }
127
+ return `http://localhost:${url}/`;
128
+ }
129
+ if ((0, import_environment.isReactNative)()) {
130
+ return url;
131
+ }
132
+ const location = (0, import_environment.getLocation)();
133
+ if (location) {
134
+ return new URL(url, location.href).toString();
92
135
  }
93
- return new URL(url, window.location.href).toString();
136
+ return url;
94
137
  };
95
138
  var managerUrl = getAccessUrl(process.env.BOTE_MANAGER_URL);
96
139
  var botUrl = getAccessUrl(process.env.BOTE_BOT_URL);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/http.ts"],
4
- "sourcesContent": ["// import CookieUtil from './CookieUtils';\nimport security from '@lingxiteam/security';\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 const token = sessionStorage.getItem('token') as string;\n config.headers.Authorization = `Bearer ${token}`;\n // 兼容生产环境\n config.headers['Tenant-Id'] = currentTenantId;\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 return new URL('', window.location.href).toString();\n }\n // 一串数字表示是端口号,与当前工程使用相同的 hostname 以兼容使用不同 IP (回环地址、内网 IP)访问的情况\n if (/^\\d+$/.test(url)) {\n return `http://${window.location.hostname}:${url}/`;\n }\n // 完整地址/相对路径/绝对路径,根据当前工程地址解析\n return new URL(url, window.location.href).toString();\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 getBotUrl,\n // 获取智能应用图标地址\n getBotIconUrl: (tenantId?: string, botId?: string, updatedTime?: string) => {\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 return url;\n }\n return undefined;\n },\n // 获取智能体图标地址\n getSceneIconUrl: (\n tenantId?: string,\n sceneId?: string,\n updatedTime?: string,\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 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 }: {\n [key: string]: string;\n }) => {\n let url = `${managerUrl}#/documentChunk?tenantId=${tenantId}&docId=${docId}&chunkId=${chunkId}&score=${score}&rank=${rank}&docType=${docType}`;\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 const tenantId = currentTenantId || params.tenantId;\n params.tenantId = tenantId;\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 // 拼租户ID 到参数中\n const tenantId = currentTenantId || data.tenantId;\n let _body;\n if (data instanceof FormData) {\n data.append('tenantId', tenantId);\n _body = data;\n } else {\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
- "names": ["security"]
4
+ "sourcesContent": ["// import CookieUtil from './CookieUtils';\nimport security from '@lingxiteam/security';\nimport { getLocation, isReactNative } from './environment';\n\nexport const tenantIdSessionKey: string = 'botSelectedTenantID';\n\n// React Native 环境下的存储替代方案\nconst getStorage = () => {\n if (isReactNative()) {\n try {\n return require('@react-native-async-storage/async-storage').default;\n } catch {\n console.warn('AsyncStorage not available in React Native environment');\n return null;\n }\n }\n return null;\n};\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 let token: string | null = null;\n if (isReactNative()) {\n const AsyncStorage = getStorage();\n if (AsyncStorage) {\n // 在 React Native 中,我们需要异步获取 token\n // 这里简化处理,实际使用时可能需要异步版本\n token = null; // 同步版本暂时返回 null\n }\n } else {\n token = sessionStorage.getItem('token') as string;\n }\n \n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n \n // 兼容生产环境\n config.headers['Tenant-Id'] = currentTenantId;\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 if (isReactNative()) {\n // React Native 环境中无法获取当前 URL,返回默认值\n return 'http://localhost/';\n }\n const location = getLocation();\n if (location) {\n return new URL('', location.href).toString();\n }\n return 'http://localhost/';\n }\n // 一串数字表示是端口号,与当前工程使用相同的 hostname 以兼容使用不同 IP (回环地址、内网 IP)访问的情况\n if (/^\\d+$/.test(url)) {\n if (isReactNative()) {\n // React Native 环境中无法获取 hostname,使用默认值\n return `http://localhost:${url}/`;\n }\n const location = getLocation();\n if (location) {\n return `http://${location.hostname}:${url}/`;\n }\n return `http://localhost:${url}/`;\n }\n // 完整地址/相对路径/绝对路径,根据当前工程地址解析\n if (isReactNative()) {\n // React Native 环境中无法获取当前 URL,直接返回原 URL\n return 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 getBotUrl,\n // 获取智能应用图标地址\n getBotIconUrl: (tenantId?: string, botId?: string, updatedTime?: string) => {\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 return url;\n }\n return undefined;\n },\n // 获取智能体图标地址\n getSceneIconUrl: (\n tenantId?: string,\n sceneId?: string,\n updatedTime?: string,\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 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 }: {\n [key: string]: string;\n }) => {\n let url = `${managerUrl}#/documentChunk?tenantId=${tenantId}&docId=${docId}&chunkId=${chunkId}&score=${score}&rank=${rank}&docType=${docType}`;\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 const tenantId = currentTenantId || params.tenantId;\n params.tenantId = tenantId;\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 // 拼租户ID 到参数中\n const tenantId = currentTenantId || data.tenantId;\n let _body;\n if (data instanceof FormData) {\n data.append('tenantId', tenantId);\n _body = data;\n } else {\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
+ "names": ["location", "security"]
7
7
  }
@@ -10,6 +10,7 @@ import loopPageStaticCodeMap from './loopPageStaticCodeMap';
10
10
  import scriptExecution, { type scriptExecutionType } from './scriptExecution';
11
11
  import { getFileUrlById, getRemoteComponentUrlByCode, getRemoteComponentUrlById } from './file';
12
12
  import { isValidUrl, sanitizeRedirectUrl, safeRedirect, sanitizeEventHandler } from './securityUtils';
13
+ import { isReactNative, isWeb, isNode, getEnvironment, getWindow, getDocument, getLocation } from './environment';
13
14
  import { request, tenantIdSessionKey } from './http';
14
15
  export type { fileToBase64Type, asyncLocalStorageType, asyncSessionStorageType, scriptExecutionType, };
15
- export { fileToBase64, CookieUtils, argsToString, argsToObject, getSearchObj, asyncLocalStorage, asyncSessionStorage, camelToSnake, underscoreToCamelCase, generateRandom18Int, formatModuleData, patternTransitionRegExp, stringPramarsValTransition, loopPageStaticCodeMap, getDataArr, replaceParamsValue, replaceParamsValueForEvent, getParamsContentByParamKeys, getFileUrlById, getRemoteComponentUrlByCode, getRemoteComponentUrlById, stringScriptExecution, scriptExecution, isValidUrl, sanitizeRedirectUrl, safeRedirect, sanitizeEventHandler, request, tenantIdSessionKey, };
16
+ export { fileToBase64, CookieUtils, argsToString, argsToObject, getSearchObj, asyncLocalStorage, asyncSessionStorage, camelToSnake, underscoreToCamelCase, generateRandom18Int, formatModuleData, patternTransitionRegExp, stringPramarsValTransition, loopPageStaticCodeMap, getDataArr, replaceParamsValue, replaceParamsValueForEvent, getParamsContentByParamKeys, getFileUrlById, getRemoteComponentUrlByCode, getRemoteComponentUrlById, stringScriptExecution, scriptExecution, isValidUrl, sanitizeRedirectUrl, safeRedirect, sanitizeEventHandler, isReactNative, isWeb, isNode, getEnvironment, getWindow, getDocument, getLocation, request, tenantIdSessionKey, };
package/dist/cjs/index.js CHANGED
@@ -39,12 +39,19 @@ __export(src_exports, {
39
39
  formatModuleData: () => import_formatModuleData.default,
40
40
  generateRandom18Int: () => import_stringUtils.generateRandom18Int,
41
41
  getDataArr: () => import_treeUtils.getDataArr,
42
+ getDocument: () => import_environment.getDocument,
43
+ getEnvironment: () => import_environment.getEnvironment,
42
44
  getFileUrlById: () => import_file.getFileUrlById,
45
+ getLocation: () => import_environment.getLocation,
43
46
  getParamsContentByParamKeys: () => import_treeUtils.getParamsContentByParamKeys,
44
47
  getRemoteComponentUrlByCode: () => import_file.getRemoteComponentUrlByCode,
45
48
  getRemoteComponentUrlById: () => import_file.getRemoteComponentUrlById,
46
49
  getSearchObj: () => import_pathArgsUtils.getSearchObj,
50
+ getWindow: () => import_environment.getWindow,
51
+ isNode: () => import_environment.isNode,
52
+ isReactNative: () => import_environment.isReactNative,
47
53
  isValidUrl: () => import_securityUtils.isValidUrl,
54
+ isWeb: () => import_environment.isWeb,
48
55
  loopPageStaticCodeMap: () => import_loopPageStaticCodeMap.default,
49
56
  patternTransitionRegExp: () => import_helpers.patternTransitionRegExp,
50
57
  replaceParamsValue: () => import_treeUtils.replaceParamsValue,
@@ -72,6 +79,7 @@ var import_loopPageStaticCodeMap = __toESM(require("./loopPageStaticCodeMap"));
72
79
  var import_scriptExecution = __toESM(require("./scriptExecution"));
73
80
  var import_file = require("./file");
74
81
  var import_securityUtils = require("./securityUtils");
82
+ var import_environment = require("./environment");
75
83
  var import_http = require("./http");
76
84
  var _ = require("lodash");
77
85
  _.noConflict();
@@ -87,12 +95,19 @@ _.noConflict();
87
95
  formatModuleData,
88
96
  generateRandom18Int,
89
97
  getDataArr,
98
+ getDocument,
99
+ getEnvironment,
90
100
  getFileUrlById,
101
+ getLocation,
91
102
  getParamsContentByParamKeys,
92
103
  getRemoteComponentUrlByCode,
93
104
  getRemoteComponentUrlById,
94
105
  getSearchObj,
106
+ getWindow,
107
+ isNode,
108
+ isReactNative,
95
109
  isValidUrl,
110
+ isWeb,
96
111
  loopPageStaticCodeMap,
97
112
  patternTransitionRegExp,
98
113
  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';\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} from './formatModule/helpers';\nimport loopPageStaticCodeMap from './loopPageStaticCodeMap';\nimport scriptExecution, { type scriptExecutionType } from './scriptExecution';\nimport {\n getFileUrlById,\n getRemoteComponentUrlByCode,\n getRemoteComponentUrlById,\n} from './file';\nimport {\n isValidUrl,\n sanitizeRedirectUrl,\n safeRedirect,\n sanitizeEventHandler,\n} from './securityUtils';\n\nimport { request, tenantIdSessionKey } from './http';\n\n// 避免 _对象 和其他库冲突\nconst _ = require('lodash');\n\n_.noConflict();\n\nexport type {\n fileToBase64Type,\n asyncLocalStorageType,\n asyncSessionStorageType,\n scriptExecutionType,\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 getDataArr,\n replaceParamsValue,\n replaceParamsValueForEvent,\n getParamsContentByParamKeys,\n getFileUrlById,\n getRemoteComponentUrlByCode,\n getRemoteComponentUrlById,\n stringScriptExecution,\n scriptExecution,\n isValidUrl,\n sanitizeRedirectUrl,\n safeRedirect,\n sanitizeEventHandler,\n request,\n tenantIdSessionKey,\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,wCAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAAAC;AAAA,EAAA,gDAAAC;AAAA,EAAA;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;AAAA;AAAA,0BAAoD;AACpD,yBAAwB;AACxB,2BAAyD;AACzD,0BAKO;AACP,yBAIO;AACP,uBAKO;AACP,8BAA6B;AAC7B,qBAIO;AACP,mCAAkC;AAClC,6BAA0D;AAC1D,kBAIO;AACP,2BAKO;AAEP,kBAA4C;AAG5C,IAAM,IAAI,QAAQ,QAAQ;AAE1B,EAAE,WAAW;",
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} from './formatModule/helpers';\nimport loopPageStaticCodeMap from './loopPageStaticCodeMap';\nimport scriptExecution, { type scriptExecutionType } from './scriptExecution';\nimport {\n getFileUrlById,\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} from './environment';\n\nimport { request, tenantIdSessionKey } from './http';\n\n// 避免 _对象 和其他库冲突\nconst _ = require('lodash');\n\n_.noConflict();\n\nexport type {\n fileToBase64Type,\n asyncLocalStorageType,\n asyncSessionStorageType,\n scriptExecutionType,\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 getDataArr,\n replaceParamsValue,\n replaceParamsValueForEvent,\n getParamsContentByParamKeys,\n getFileUrlById,\n getRemoteComponentUrlByCode,\n getRemoteComponentUrlById,\n stringScriptExecution,\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 request,\n tenantIdSessionKey,\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,wCAAAA;AAAA,EAAA;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,4DAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAoD;AACpD,yBAAwB;AACxB,2BAAyD;AACzD,0BAKO;AACP,yBAIO;AACP,uBAKO;AACP,8BAA6B;AAC7B,qBAIO;AACP,mCAAkC;AAClC,6BAA0D;AAC1D,kBAIO;AACP,2BAKO;AACP,yBAQO;AAEP,kBAA4C;AAG5C,IAAM,IAAI,QAAQ,QAAQ;AAE1B,EAAE,WAAW;",
6
6
  "names": ["CookieUtils", "fileToBase64", "formatModuleData", "loopPageStaticCodeMap", "scriptExecution"]
7
7
  }
@@ -24,6 +24,7 @@ __export(pathArgsUtils_exports, {
24
24
  getSearchObj: () => getSearchObj
25
25
  });
26
26
  module.exports = __toCommonJS(pathArgsUtils_exports);
27
+ var import_environment = require("./environment");
27
28
  var argsToString = (params) => {
28
29
  const paramsAttr = [];
29
30
  try {
@@ -64,8 +65,20 @@ var argsToObject = (params) => {
64
65
  });
65
66
  return res;
66
67
  };
67
- var getSearchObj = (url = window.location.href) => {
68
- const urlArr = url.split("?");
68
+ var getSearchObj = (url) => {
69
+ let targetUrl = url;
70
+ if (!targetUrl) {
71
+ if ((0, import_environment.isReactNative)()) {
72
+ return {};
73
+ }
74
+ const location = (0, import_environment.getLocation)();
75
+ if (location) {
76
+ targetUrl = location.href;
77
+ } else {
78
+ return {};
79
+ }
80
+ }
81
+ const urlArr = targetUrl.split("?");
69
82
  if (urlArr.length === 1)
70
83
  return {};
71
84
  const search = urlArr.pop();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/pathArgsUtils.ts"],
4
- "sourcesContent": ["/**\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 = window.location.href) => {\n const urlArr = url.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
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,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,MAAc,OAAO,SAAS,SAAS;AAC3D,QAAM,SAAS,IAAI,MAAM,GAAG;AAC5B,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;",
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
+ "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,6 +1,3 @@
1
- /**
2
- * 安全工具函数,用于防止XSS等安全漏洞
3
- */
4
1
  /**
5
2
  * 验证URL是否安全,防止XSS攻击
6
3
  * @param url 待验证的URL
@@ -25,12 +25,20 @@ __export(securityUtils_exports, {
25
25
  sanitizeRedirectUrl: () => sanitizeRedirectUrl
26
26
  });
27
27
  module.exports = __toCommonJS(securityUtils_exports);
28
+ var import_environment = require("./environment");
28
29
  var isValidUrl = (url) => {
29
30
  if (!url || typeof url !== "string") {
30
31
  return false;
31
32
  }
32
33
  try {
33
- const urlObj = new URL(url, window.location.origin);
34
+ let baseUrl;
35
+ if ((0, import_environment.isReactNative)()) {
36
+ baseUrl = "http://localhost";
37
+ } else {
38
+ const location = (0, import_environment.getLocation)();
39
+ baseUrl = location ? location.origin : "http://localhost";
40
+ }
41
+ const urlObj = new URL(url, baseUrl);
34
42
  if (!["http:", "https:"].includes(urlObj.protocol)) {
35
43
  return false;
36
44
  }
@@ -57,8 +65,20 @@ var sanitizeRedirectUrl = (url, allowedDomains = [], defaultUrl = "/") => {
57
65
  return defaultUrl;
58
66
  }
59
67
  try {
60
- const urlObj = new URL(url, window.location.origin);
61
- const currentHost = window.location.hostname;
68
+ let baseUrl;
69
+ let currentHost;
70
+ if ((0, import_environment.isReactNative)()) {
71
+ baseUrl = "http://localhost";
72
+ currentHost = "localhost";
73
+ } else {
74
+ const location = (0, import_environment.getLocation)();
75
+ if (!location) {
76
+ return defaultUrl;
77
+ }
78
+ baseUrl = location.origin;
79
+ currentHost = location.hostname;
80
+ }
81
+ const urlObj = new URL(url, baseUrl);
62
82
  if (allowedDomains.length === 0) {
63
83
  if (urlObj.hostname !== currentHost) {
64
84
  return defaultUrl;
@@ -78,7 +98,14 @@ var sanitizeRedirectUrl = (url, allowedDomains = [], defaultUrl = "/") => {
78
98
  };
79
99
  var safeRedirect = (url, allowedDomains = []) => {
80
100
  const safeUrl = sanitizeRedirectUrl(url, allowedDomains);
81
- window.location.href = safeUrl;
101
+ if ((0, import_environment.isReactNative)()) {
102
+ console.warn("safeRedirect is not supported in React Native environment");
103
+ return;
104
+ }
105
+ const win = typeof window !== "undefined" ? window : null;
106
+ if (win) {
107
+ win.location.href = safeUrl;
108
+ }
82
109
  };
83
110
  var sanitizeEventHandler = (handler) => {
84
111
  if (typeof handler !== "function") {