@haluo/util 2.1.5 → 2.1.6

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.
@@ -14,28 +14,75 @@
14
14
  * tracker.track('EVENT_ID', { key: 'value' })
15
15
  * tracker.trackError({ err: 'error message' })
16
16
  */
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
28
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
29
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
30
+ return new (P || (P = Promise))(function (resolve, reject) {
31
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
32
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
33
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
34
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
35
+ });
36
+ };
37
+ var __generator = (this && this.__generator) || function (thisArg, body) {
38
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
39
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
40
+ function verb(n) { return function (v) { return step([n, v]); }; }
41
+ function step(op) {
42
+ if (f) throw new TypeError("Generator is already executing.");
43
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
44
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
45
+ if (y = 0, t) op = [op[0] & 2, t.value];
46
+ switch (op[0]) {
47
+ case 0: case 1: t = op; break;
48
+ case 4: _.label++; return { value: op[1], done: false };
49
+ case 5: _.label++; y = op[1]; op = [0]; continue;
50
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
51
+ default:
52
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
53
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
54
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
55
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
56
+ if (t[2]) _.ops.pop();
57
+ _.trys.pop(); continue;
58
+ }
59
+ op = body.call(thisArg, _);
60
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
61
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
62
+ }
63
+ };
17
64
  export * from './types';
18
65
  /** 默认埋点上报URL */
19
- const DEFAULT_LOG_URL = 'https://log-center.58moto.com/am/log/v1/json';
66
+ var DEFAULT_LOG_URL = 'https://log-center.58moto.com/am/log/v1/json';
20
67
  /** 默认应用名称 */
21
- const DEFAULT_APP_NAME = 'moto';
68
+ var DEFAULT_APP_NAME = 'moto';
22
69
  /** 默认错误上报事件ID */
23
- const ERROR_EVENT_ID = 'S_00000000000082';
70
+ var ERROR_EVENT_ID = 'S_00000000000082';
24
71
  /** 默认错误应用类型(H5异常) */
25
- const DEFAULT_ERROR_APPTYPE = '2012';
72
+ var DEFAULT_ERROR_APPTYPE = '2012';
26
73
  /**
27
74
  * 内置的简易 httpClient
28
75
  * 使用 fetch 实现 POST 请求
29
76
  */
30
- const defaultHttpClient = {
31
- post: (url, data) => {
77
+ var defaultHttpClient = {
78
+ post: function (url, data) {
32
79
  if (typeof window === 'undefined' || !window.fetch) {
33
80
  console.warn('[Tracker] 当前环境不支持 fetch');
34
81
  return Promise.resolve();
35
82
  }
36
83
  // 构建 form-urlencoded 格式的请求体
37
- const formBody = Object.keys(data)
38
- .map(key => encodeURIComponent(key) + '=' + encodeURIComponent(data[key]))
84
+ var formBody = Object.keys(data)
85
+ .map(function (key) { return encodeURIComponent(key) + '=' + encodeURIComponent(data[key]); })
39
86
  .join('&');
40
87
  return fetch(url, {
41
88
  method: 'POST',
@@ -43,7 +90,7 @@ const defaultHttpClient = {
43
90
  'Content-Type': 'application/x-www-form-urlencoded'
44
91
  },
45
92
  body: formBody
46
- }).then(res => res.json()).catch(err => {
93
+ }).then(function (res) { return res.json(); }).catch(function (err) {
47
94
  console.error('[Tracker] 埋点请求失败:', err);
48
95
  });
49
96
  }
@@ -56,13 +103,13 @@ function safeGetLocalStorage(key, defaultValue) {
56
103
  if (typeof window === 'undefined' || !window.localStorage) {
57
104
  return defaultValue;
58
105
  }
59
- const value = window.localStorage.getItem(key);
106
+ var value = window.localStorage.getItem(key);
60
107
  if (!value || value === 'undefined') {
61
108
  return defaultValue;
62
109
  }
63
110
  return JSON.parse(value);
64
111
  }
65
- catch {
112
+ catch (_a) {
66
113
  return defaultValue;
67
114
  }
68
115
  }
@@ -79,8 +126,8 @@ function getUserAgent() {
79
126
  * 检测平台类型
80
127
  */
81
128
  function detectPlatform(ua) {
82
- const isAndroid = ua.indexOf('android') > -1;
83
- const isHarmonyos = ua.indexOf('harmonyos') > -1;
129
+ var isAndroid = ua.indexOf('android') > -1;
130
+ var isHarmonyos = ua.indexOf('harmonyos') > -1;
84
131
  return isAndroid || isHarmonyos ? 'android' : 'ios';
85
132
  }
86
133
  /**
@@ -108,11 +155,12 @@ function getGlobalAppCall() {
108
155
  * 根据 UA 检测渠道:微信、QQ、微博等
109
156
  */
110
157
  function defaultGetChannel() {
158
+ var _a;
111
159
  if (typeof window === 'undefined' || !window.navigator) {
112
160
  return 'other';
113
161
  }
114
- const ua = window.navigator.userAgent.toLowerCase();
115
- const isAndroid = ua.indexOf('android') > -1;
162
+ var ua = window.navigator.userAgent.toLowerCase();
163
+ var isAndroid = ua.indexOf('android') > -1;
116
164
  // 区分出微信、QQ、微博平台、其他
117
165
  if (ua.indexOf('micromessenger') > -1) {
118
166
  // 在微信中打开
@@ -132,78 +180,77 @@ function defaultGetChannel() {
132
180
  }
133
181
  else {
134
182
  // 使用 AppCall 获取包名,或返回 other
135
- const appCall = getGlobalAppCall();
136
- return appCall?.getAppPackage?.() || 'other';
183
+ var appCall = getGlobalAppCall();
184
+ return ((_a = appCall === null || appCall === void 0 ? void 0 : appCall.getAppPackage) === null || _a === void 0 ? void 0 : _a.call(appCall)) || 'other';
137
185
  }
138
186
  }
139
187
  /**
140
188
  * Track 类
141
189
  * 提供埋点上报功能
142
190
  */
143
- class Tracker {
144
- config;
145
- constructor(config) {
191
+ var Tracker = /** @class */ (function () {
192
+ function Tracker(config) {
146
193
  this.config = config;
147
194
  }
148
195
  /**
149
196
  * 获取当前版本号
150
197
  * 优先级:window.AppCall.getAppVersion() > 传入的 appCall > config.version
151
198
  */
152
- getVersion() {
153
- const { version, appCall } = this.config;
199
+ Tracker.prototype.getVersion = function () {
200
+ var _a = this.config, version = _a.version, appCall = _a.appCall;
154
201
  // 优先使用全局 window.AppCall 获取版本号
155
- const globalAppCall = getGlobalAppCall();
156
- if (globalAppCall?.getAppVersion) {
157
- const appVersion = globalAppCall.getAppVersion();
202
+ var globalAppCall = getGlobalAppCall();
203
+ if (globalAppCall === null || globalAppCall === void 0 ? void 0 : globalAppCall.getAppVersion) {
204
+ var appVersion = globalAppCall.getAppVersion();
158
205
  if (appVersion)
159
206
  return appVersion;
160
207
  }
161
208
  // 其次使用传入的 appCall
162
- if (appCall?.getAppVersion) {
163
- const appVersion = appCall.getAppVersion();
209
+ if (appCall === null || appCall === void 0 ? void 0 : appCall.getAppVersion) {
210
+ var appVersion = appCall.getAppVersion();
164
211
  if (appVersion)
165
212
  return appVersion;
166
213
  }
167
214
  return version || '';
168
- }
215
+ };
169
216
  /**
170
217
  * 获取渠道号
171
218
  * 优先使用自定义 getChannel,否则使用内置的默认方法
172
219
  */
173
- getChannel() {
220
+ Tracker.prototype.getChannel = function () {
174
221
  if (this.config.getChannel) {
175
222
  return this.config.getChannel();
176
223
  }
177
224
  // 使用内置的 getChannel 方法
178
225
  return defaultGetChannel();
179
- }
226
+ };
180
227
  /**
181
228
  * 检查是否命中AB测试
182
229
  */
183
- checkAbTest(eId) {
230
+ Tracker.prototype.checkAbTest = function (eId) {
184
231
  if (!this.config.enableAbTest || !this.config.getAbFlags) {
185
232
  return undefined;
186
233
  }
187
234
  try {
188
- const abFlags = this.config.getAbFlags();
235
+ var abFlags = this.config.getAbFlags();
189
236
  // 支持数组和对象两种格式
190
- const flagList = Array.isArray(abFlags) ? abFlags : Object.values(abFlags);
191
- return flagList.find(item => item?.indexList?.includes(eId));
237
+ var flagList = Array.isArray(abFlags) ? abFlags : Object.values(abFlags);
238
+ return flagList.find(function (item) { var _a; return (_a = item === null || item === void 0 ? void 0 : item.indexList) === null || _a === void 0 ? void 0 : _a.includes(eId); });
192
239
  }
193
- catch {
240
+ catch (_a) {
194
241
  return undefined;
195
242
  }
196
- }
243
+ };
197
244
  /**
198
245
  * 构建埋点请求数据
199
246
  */
200
- buildPostData(params) {
201
- const { eId, eventContent } = params;
202
- const deviceData = safeGetLocalStorage('deviceData', {});
203
- const userData = safeGetLocalStorage('user', {});
204
- const ua = getUserAgent();
205
- const platform = detectPlatform(ua);
206
- const isClient = isClientEnv();
247
+ Tracker.prototype.buildPostData = function (params) {
248
+ var eId = params.eId, eventContent = params.eventContent;
249
+ var deviceData = safeGetLocalStorage('deviceData', {});
250
+ var userData = safeGetLocalStorage('user', {});
251
+ var ua = getUserAgent();
252
+ var platform = detectPlatform(ua);
253
+ var isClient = isClientEnv();
207
254
  return {
208
255
  deviceid: deviceData.deviceId || '',
209
256
  plateform: isClient ? platform : 'h5',
@@ -229,90 +276,93 @@ class Tracker {
229
276
  }
230
277
  ]
231
278
  };
232
- }
279
+ };
233
280
  /**
234
281
  * 发送埋点请求
235
282
  */
236
- sendRequest(postData) {
237
- const logUrl = this.config.logUrl || DEFAULT_LOG_URL;
238
- const appName = this.config.appName || DEFAULT_APP_NAME;
283
+ Tracker.prototype.sendRequest = function (postData) {
284
+ var _a, _b;
285
+ var logUrl = this.config.logUrl || DEFAULT_LOG_URL;
286
+ var appName = this.config.appName || DEFAULT_APP_NAME;
239
287
  // 优先使用传入的 httpClient,否则使用内置的默认实现
240
- const httpClient = this.config.httpClient?.() || defaultHttpClient;
288
+ var httpClient = ((_b = (_a = this.config).httpClient) === null || _b === void 0 ? void 0 : _b.call(_a)) || defaultHttpClient;
241
289
  return httpClient.post(logUrl, {
242
290
  json: JSON.stringify(postData),
243
- appName
291
+ appName: appName
244
292
  });
245
- }
293
+ };
246
294
  /**
247
295
  * 核心埋点方法
248
296
  * @param params 埋点参数
249
297
  */
250
- async trackUser(params) {
251
- const { eId, eventContent } = params;
252
- // 开发环境不发送埋点
253
- if (isDevelopment()) {
254
- console.log('[Tracker] 开发环境,跳过埋点:', { eId, eventContent });
255
- return Promise.resolve();
256
- }
257
- // 检查AB测试
258
- if (this.config.enableAbTest) {
259
- const abFlag = this.checkAbTest(eId);
260
- if (abFlag?.test) {
261
- // 优先使用全局 window.AppCall,其次使用传入的 appCall
262
- const globalAppCall = getGlobalAppCall();
263
- const appCall = globalAppCall || this.config.appCall;
264
- if (appCall?.sendEventMsg) {
265
- return appCall.sendEventMsg({ eId, eventContent: eventContent || '{}' });
298
+ Tracker.prototype.trackUser = function (params) {
299
+ return __awaiter(this, void 0, void 0, function () {
300
+ var eId, eventContent, abFlag, globalAppCall, appCall, postData;
301
+ return __generator(this, function (_a) {
302
+ eId = params.eId, eventContent = params.eventContent;
303
+ // 开发环境不发送埋点
304
+ if (isDevelopment()) {
305
+ console.log('[Tracker] 开发环境,跳过埋点:', { eId: eId, eventContent: eventContent });
306
+ return [2 /*return*/, Promise.resolve()];
266
307
  }
267
- }
268
- }
269
- // 构建并发送请求
270
- const postData = this.buildPostData(params);
271
- return this.sendRequest(postData);
272
- }
308
+ // 检查AB测试
309
+ if (this.config.enableAbTest) {
310
+ abFlag = this.checkAbTest(eId);
311
+ if (abFlag === null || abFlag === void 0 ? void 0 : abFlag.test) {
312
+ globalAppCall = getGlobalAppCall();
313
+ appCall = globalAppCall || this.config.appCall;
314
+ if (appCall === null || appCall === void 0 ? void 0 : appCall.sendEventMsg) {
315
+ return [2 /*return*/, appCall.sendEventMsg({ eId: eId, eventContent: eventContent || '{}' })];
316
+ }
317
+ }
318
+ }
319
+ postData = this.buildPostData(params);
320
+ return [2 /*return*/, this.sendRequest(postData)];
321
+ });
322
+ });
323
+ };
273
324
  /**
274
325
  * 埋点上报
275
326
  * @param eId 事件ID
276
327
  * @param contentObj 事件内容对象
277
328
  * @param isAbTest 是否AB测试(已废弃,保留兼容)
278
329
  */
279
- track(eId, contentObj = {}, isAbTest = false) {
330
+ Tracker.prototype.track = function (eId, contentObj, isAbTest) {
331
+ if (contentObj === void 0) { contentObj = {}; }
332
+ if (isAbTest === void 0) { isAbTest = false; }
280
333
  return this.trackUser({
281
- eId,
334
+ eId: eId,
282
335
  eventContent: JSON.stringify(contentObj),
283
- isAbTest
336
+ isAbTest: isAbTest
284
337
  });
285
- }
338
+ };
286
339
  /**
287
340
  * 错误上报
288
341
  * @param contentObj 错误内容对象
289
342
  */
290
- trackError(contentObj = {}) {
291
- const errorContent = {
292
- err: contentObj.err || '',
293
- apptype: contentObj.apptype || DEFAULT_ERROR_APPTYPE,
294
- url: contentObj.url || (typeof window !== 'undefined' ? window.location?.href : '') || '',
295
- platform: contentObj.platform || 'wap',
296
- ...contentObj
297
- };
343
+ Tracker.prototype.trackError = function (contentObj) {
344
+ var _a;
345
+ if (contentObj === void 0) { contentObj = {}; }
346
+ var errorContent = __assign({ err: contentObj.err || '', apptype: contentObj.apptype || DEFAULT_ERROR_APPTYPE, url: contentObj.url || (typeof window !== 'undefined' ? (_a = window.location) === null || _a === void 0 ? void 0 : _a.href : '') || '', platform: contentObj.platform || 'wap' }, contentObj);
298
347
  return this.trackUser({
299
348
  eId: ERROR_EVENT_ID,
300
349
  eventContent: JSON.stringify(errorContent)
301
350
  });
302
- }
351
+ };
303
352
  /**
304
353
  * 更新配置
305
354
  */
306
- updateConfig(config) {
307
- this.config = { ...this.config, ...config };
308
- }
355
+ Tracker.prototype.updateConfig = function (config) {
356
+ this.config = __assign(__assign({}, this.config), config);
357
+ };
309
358
  /**
310
359
  * 获取当前配置
311
360
  */
312
- getConfig() {
313
- return { ...this.config };
314
- }
315
- }
361
+ Tracker.prototype.getConfig = function () {
362
+ return __assign({}, this.config);
363
+ };
364
+ return Tracker;
365
+ }());
316
366
  /**
317
367
  * 创建 Tracker 实例
318
368
  * @param config 配置项
@@ -350,18 +400,21 @@ export function createTracker(config) {
350
400
  * postTrackError({ err: 'error message' })
351
401
  */
352
402
  export function createTrackMethods(config) {
353
- const tracker = createTracker(config);
403
+ var tracker = createTracker(config);
354
404
  return {
355
405
  /** 埋点上报方法 */
356
- postTrack: (eId, contentObj = {}, isAbTest = false) => {
406
+ postTrack: function (eId, contentObj, isAbTest) {
407
+ if (contentObj === void 0) { contentObj = {}; }
408
+ if (isAbTest === void 0) { isAbTest = false; }
357
409
  return tracker.track(eId, contentObj, isAbTest);
358
410
  },
359
411
  /** 错误上报方法 */
360
- postTrackError: (contentObj = {}) => {
412
+ postTrackError: function (contentObj) {
413
+ if (contentObj === void 0) { contentObj = {}; }
361
414
  return tracker.trackError(contentObj);
362
415
  },
363
416
  /** Tracker 实例 */
364
- tracker
417
+ tracker: tracker
365
418
  };
366
419
  }
367
420
  export { defaultGetChannel as getChannel };
@@ -263,28 +263,60 @@ export declare class AliOssClass {
263
263
  * 图片上传主方法
264
264
  * 整合了所有项目的图片上传逻辑
265
265
  * @param option 上传选项
266
- * @returns Promise
266
+ * @returns Promise - 成功时返回图片信息对象,失败时reject错误信息字符串
267
+ * @returns 成功返回结构: {
268
+ * url: string - 上传后的图片URL,
269
+ * imgUrl: string - 上传后的图片URL(可能包含尺寸信息),
270
+ * imgOrgUrl: string - 原始图片URL(包含尺寸信息),
271
+ * name: string - 文件名,
272
+ * fileName: string - 文件名
273
+ * }
274
+ * @returns 失败返回: 错误信息字符串,如"文件类型不支持"、"上传失败"等
267
275
  */
268
276
  ossUploadImage: (option: UploadOption) => Promise<any>;
269
277
  /**
270
278
  * 文件上传方法
271
279
  * 支持视频、文档、APK等文件类型
272
280
  * @param option 上传选项
273
- * @returns Promise
281
+ * @returns Promise - 成功时返回文件信息对象,失败时reject错误信息字符串
282
+ * @returns 成功返回结构: {
283
+ * url: string - 上传后的文件URL,
284
+ * imgUrl: string - 上传后的文件URL,
285
+ * imgOrgUrl: string - 上传后的文件URL,
286
+ * name: string - 文件名,
287
+ * fileName: string - 文件名
288
+ * }
289
+ * @returns 失败返回: 错误信息字符串,如"文件类型不支持"、"上传失败"等
274
290
  */
275
291
  ossUploadFile: (option: UploadOption) => Promise<any>;
276
292
  /**
277
293
  * 纯图片上传 pureOssUploadImage
278
294
  * 注释:图片上传,不压缩
279
295
  * @param option 上传选项
280
- * @returns Promise
296
+ * @returns Promise - 成功时返回图片信息对象,失败时reject错误信息字符串
297
+ * @returns 成功返回结构: {
298
+ * url: string - 上传后的图片URL,
299
+ * imgUrl: string - 上传后的图片URL,
300
+ * imgOrgUrl: string - 上传后的图片URL,
301
+ * name: string - 文件名,
302
+ * fileName: string - 文件名
303
+ * }
304
+ * @returns 失败返回: 错误信息字符串,如"文件类型不支持"、"上传失败"等
281
305
  */
282
306
  pureOssUploadImage: (option: UploadOption) => Promise<any>;
283
307
  /**
284
308
  * 商品详情图片上传(不建议直接使用,请使用 pureOssUploadImage)
285
309
  * 注释:图片上传,不压缩
286
310
  * @param option 上传选项
287
- * @returns Promise
311
+ * @returns Promise - 成功时返回图片信息对象,失败时reject错误信息字符串
312
+ * @returns 成功返回结构: {
313
+ * url: string - 上传后的图片URL,
314
+ * imgUrl: string - 上传后的图片URL,
315
+ * imgOrgUrl: string - 上传后的图片URL,
316
+ * name: string - 文件名,
317
+ * fileName: string - 文件名
318
+ * }
319
+ * @returns 失败返回: 错误信息字符串,如"文件类型不支持"、"上传失败"等
288
320
  */
289
321
  shopDetailUpdate: (option: UploadOption) => Promise<any>;
290
322
  /**