lgsso-sdk 1.2.2 → 1.2.4

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.
@@ -4079,35 +4079,46 @@ function validateConfig(options) {
4079
4079
  }
4080
4080
 
4081
4081
  /**
4082
- * 判断是否是iOS移动端(兼容iPadOS 13+ UA伪装成Mac的场景)
4082
+ * 判断是否是iOS移动端(精准适配iPad Air/所有iPad机型 + 全版本iPadOS)
4083
4083
  * @returns {boolean} 是否为iOS环境
4084
4084
  */
4085
4085
  function isIOS() {
4086
- // 非浏览器环境直接返回false(如果需要保留这行可取消注释)
4086
+ // 非浏览器环境直接返回false(如需保留请取消注释)
4087
4087
  // if (!isBrowser()) return false;
4088
4088
 
4089
4089
  const userAgent = navigator.userAgent.toLowerCase();
4090
- const platform = navigator.platform;
4090
+ const platform = navigator.platform.toLowerCase(); // 统一转小写,避免大小写兼容问题
4091
4091
  const maxTouchPoints = navigator.maxTouchPoints || 0;
4092
+ const screenRatio = screen.width / screen.height; // 屏幕宽高比(iPad核心特征:4:3左右)
4092
4093
 
4093
- // 1. 原有逻辑:匹配iPhone/iPod(UA仍保留标识) + 排除Windows Phone
4094
+ // ========== 核心检测规则 ==========
4095
+ // 1. 基础规则:iPhone/iPod 直接命中(无兼容问题)
4094
4096
  const isIphoneIpod = /iphone|ipod/.test(userAgent) && !window.MSStream;
4095
-
4096
- // 2. 兼容iPadOS 13+:分两种情况检测iPad
4097
+
4098
+ // 2. iPad 专属检测(覆盖所有iPad机型,含iPad Air)
4097
4099
  const isIpad = (
4098
- // 情况1:老版本iPadOS/原生iPad标识(platform直接是iPad
4099
- platform === 'iPad' ||
4100
- // 情况2:iPadOS 13+ 伪装Mac的场景(UA含macintosh + 支持触摸 + 排除真Mac
4100
+ // 场景1:老版本iPadOS/原生标识(platform含ipad
4101
+ platform.includes('ipad') ||
4102
+ // 场景2:iPadOS 13+ 伪装MacUA含macintosh + 触摸+ Mac平台)
4101
4103
  (
4102
- userAgent.includes('macintosh') &&
4103
- maxTouchPoints > 0 &&
4104
- !platform.includes('Mac') &&
4104
+ userAgent.includes('macintosh') &&
4105
+ maxTouchPoints > 0 && // iPad Air 触摸点≥5,Mac几乎为0
4106
+ !platform.includes('mac') && // 排除真Mac
4105
4107
  !window.MSStream
4108
+ ) ||
4109
+ // 场景3:新版本iPadOS(UA直接含ipados,如iPad Air搭载的iPadOS 15+)
4110
+ userAgent.includes('ipados') ||
4111
+ // 场景4:极端场景(第三方浏览器如Chrome for iPad Air)
4112
+ (
4113
+ maxTouchPoints >= 5 && // iPad Air 固定支持5点触摸
4114
+ !platform.includes('android') && // 排除安卓平板
4115
+ (screenRatio > 0.7 && screenRatio < 1.4) // iPad宽高比≈0.75(4:3),Mac多为1.78(16:9)
4106
4116
  )
4107
4117
  );
4108
4118
 
4109
- // 3. 只要是iPhone/iPod/iPad任意一种,且是iOS环境,返回true
4110
- return isIphoneIpod || isIpad;
4119
+ // ========== 最终判定 ==========
4120
+ const result = isIphoneIpod || isIpad;
4121
+ return result;
4111
4122
  }
4112
4123
 
4113
4124
  /**
@@ -4183,21 +4194,37 @@ function createSSO() {
4183
4194
  },
4184
4195
 
4185
4196
  /**
4186
- * 退出登录
4187
- * @returns {Promise<Object>} 接口返回结果
4188
- */
4197
+ * 退出登录
4198
+ * @returns {Promise<Object>} 接口返回结果
4199
+ */
4189
4200
  async logout() {
4201
+ // 1. 前置校验:初始化状态
4190
4202
  if (!config) {
4191
4203
  return { code: -101, msg: '请先调用init方法初始化', success: false };
4192
4204
  }
4193
4205
 
4206
+ // 2. 工具函数:统一构建登录跳转URL(确保完整编码当前URL的所有参数/hash)
4207
+ const buildLoginUrl = () => {
4208
+ if (!config.logOutUrl || !isBrowser()) return '';
4209
+ // 关键:获取当前完整URL(含query、hash)并完整编码,避免参数丢失
4210
+ const currentFullUrl = window.location.href;
4211
+ const encodedRedirectUri = encodeURIComponent(currentFullUrl);
4212
+ return `${config.logOutUrl}?redirect_uri=${encodedRedirectUri}`;
4213
+ };
4214
+
4215
+ // 3. 校验logoutApi配置(仅接口调用时需要,跳转登录页不受此影响)
4194
4216
  if (!config.logoutApi) {
4217
+ // 无logoutApi时仍清除token并跳转登录页,保证基础退出逻辑
4218
+ this.removeToken();
4219
+ const loginUrl = buildLoginUrl();
4220
+ if (loginUrl) window.location.href = loginUrl;
4195
4221
  return { code: -102, msg: '未配置logoutApi', success: false };
4196
4222
  }
4197
4223
 
4198
4224
  const token = this.getToken();
4199
4225
  if (token) {
4200
4226
  try {
4227
+ // 调用退出接口
4201
4228
  const result = await request(
4202
4229
  config.logoutApi,
4203
4230
  {
@@ -4206,31 +4233,37 @@ function createSSO() {
4206
4233
  timeout: config.timeout
4207
4234
  }
4208
4235
  );
4236
+ // 无论接口返回结果如何,都清除token
4209
4237
  this.removeToken();
4210
4238
 
4211
- if (isBrowser() && config.logOutUrl) {
4212
- window.location.href = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(getCurrentUrlWithParams())}`;
4213
- }
4239
+ // 跳转登录页(携带完整的当前URL)
4240
+ const loginUrl = buildLoginUrl();
4241
+ if (loginUrl) window.location.href = loginUrl;
4214
4242
  return result;
4215
4243
  } catch (error) {
4244
+ // 接口调用失败,仍清除token并跳转登录页
4245
+ this.removeToken();
4246
+ const loginUrl = buildLoginUrl();
4247
+ if (loginUrl) window.location.href = loginUrl;
4216
4248
  return { code: -103, msg: `退出失败: ${error.message}`, success: false };
4217
4249
  }
4218
4250
  } else {
4251
+ // 无token时直接清除(兜底)并跳转登录页
4219
4252
  this.removeToken();
4220
- if (isBrowser() && config.logOutUrl) {
4221
- window.location.href = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(getCurrentUrlWithParams())}`;
4222
- }
4253
+ const loginUrl = buildLoginUrl();
4254
+ if (loginUrl) window.location.href = loginUrl;
4223
4255
  return { code: 0, msg: '已成功清除token', success: true };
4224
4256
  }
4225
4257
  },
4226
4258
 
4227
4259
  /**
4228
4260
  * 用token换取新accessCode并跳转到指定URL
4229
- * @param {string} redirectUrl - 目标跳转地址
4261
+ * @param {string} redirectUrl - 目标跳转地址(支持带query/hash参数)
4230
4262
  * @param {string} target - 当前页面:_self、新页面打开:_blank,默认当前页_self
4231
4263
  * @returns {Promise<Object>} 接口返回结果
4232
4264
  */
4233
4265
  async toUrl(redirectUrl, target = '_self') {
4266
+ // 1. 前置校验:初始化状态、参数合法性
4234
4267
  if (!config) {
4235
4268
  return { code: -101, msg: '请先调用init方法初始化', success: false };
4236
4269
  }
@@ -4239,35 +4272,36 @@ function createSSO() {
4239
4272
  return { code: -104, msg: '请提供跳转地址', success: false };
4240
4273
  }
4241
4274
 
4242
- // 核心修改:iOS移动端强制使用当前页面打开
4243
- if (isIOS()) {
4244
- target = '_self';
4245
- }
4246
-
4247
- // 验证target参数有效性
4248
- if (!['_self', '_blank'].includes(target)) {
4275
+ // 2. 处理target参数:iOS强制_self,且校验参数范围
4276
+ const finalTarget = isIOS() ? '_self' : target;
4277
+ if (!['_self', '_blank'].includes(finalTarget)) {
4249
4278
  return { code: -108, msg: 'target参数必须是"_self"或"_blank"', success: false };
4250
4279
  }
4251
4280
 
4281
+ // 3. 工具函数:统一构建登录跳转URL(避免重复代码,确保参数完整编码)
4282
+ const buildLoginUrl = (redirectUrl) => {
4283
+ if (!config.logOutUrl) return '';
4284
+ // 关键:encodeURIComponent 会完整编码redirectUrl的所有部分(query/hash),避免参数丢失
4285
+ const encodedRedirectUri = encodeURIComponent(redirectUrl);
4286
+ return `${config.logOutUrl}?redirect_uri=${encodedRedirectUri}`;
4287
+ };
4288
+
4289
+ // 4. 校验refreshCodeApi配置
4252
4290
  if (!config.refreshCodeApi) {
4253
4291
  return { code: -105, msg: '未配置refreshCodeApi', success: false };
4254
4292
  }
4255
4293
 
4294
+ // 5. 获取token,无token则直接跳登录页
4256
4295
  const token = this.getToken();
4257
4296
  if (!token) {
4258
4297
  if (isBrowser() && config.logOutUrl) {
4259
- const loginUrl = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
4260
-
4261
- // 根据target决定打开方式
4262
- if (target === '_blank') {
4263
- window.open(loginUrl, '_blank');
4264
- } else {
4265
- window.location.href = loginUrl;
4266
- }
4298
+ const loginUrl = buildLoginUrl(redirectUrl);
4299
+ finalTarget === '_blank' ? window.open(loginUrl, '_blank') : window.location.href = loginUrl;
4267
4300
  }
4268
4301
  return { code: -106, msg: '未找到有效token', success: false };
4269
4302
  }
4270
4303
 
4304
+ // 6. 有token则尝试换取accessCode并跳转
4271
4305
  try {
4272
4306
  const result = await request(
4273
4307
  config.refreshCodeApi,
@@ -4279,32 +4313,25 @@ function createSSO() {
4279
4313
  );
4280
4314
 
4281
4315
  if (result.code === 0 && result.data && isBrowser()) {
4316
+ // 拼接accessCode到目标URL,保留原URL的所有参数/hash
4282
4317
  const url = new URL(redirectUrl);
4283
4318
  url.searchParams.set(config.accessCodeKey, result.data);
4284
4319
  const targetUrl = url.toString();
4285
-
4286
- // 根据target参数决定跳转方式
4287
- if (target === '_blank') {
4288
- window.open(targetUrl, '_blank');
4289
- } else {
4290
- window.location.href = targetUrl;
4291
- }
4320
+ finalTarget === '_blank' ? window.open(targetUrl, '_blank') : window.location.href = targetUrl;
4292
4321
  } else {
4293
- const loginUrl = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
4294
- if (target === '_blank') {
4295
- window.open(loginUrl, '_blank');
4296
- } else {
4297
- window.location.href = loginUrl;
4322
+ // 接口返回失败,跳登录页(复用统一的登录URL构建逻辑)
4323
+ if (isBrowser() && config.logOutUrl) {
4324
+ const loginUrl = buildLoginUrl(redirectUrl);
4325
+ finalTarget === '_blank' ? window.open(loginUrl, '_blank') : window.location.href = loginUrl;
4298
4326
  }
4299
4327
  }
4300
4328
 
4301
4329
  return result;
4302
4330
  } catch (error) {
4303
- const loginUrl = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
4304
- if (target === '_blank') {
4305
- window.open(loginUrl, '_blank');
4306
- } else {
4307
- window.location.href = loginUrl;
4331
+ // 接口异常,跳登录页(复用统一的登录URL构建逻辑)
4332
+ if (isBrowser() && config.logOutUrl) {
4333
+ const loginUrl = buildLoginUrl(redirectUrl);
4334
+ finalTarget === '_blank' ? window.open(loginUrl, '_blank') : window.location.href = loginUrl;
4308
4335
  }
4309
4336
  return { code: -107, msg: `跳转失败: ${error.message}`, success: false };
4310
4337
  }
@@ -4075,35 +4075,46 @@ function validateConfig(options) {
4075
4075
  }
4076
4076
 
4077
4077
  /**
4078
- * 判断是否是iOS移动端(兼容iPadOS 13+ UA伪装成Mac的场景)
4078
+ * 判断是否是iOS移动端(精准适配iPad Air/所有iPad机型 + 全版本iPadOS)
4079
4079
  * @returns {boolean} 是否为iOS环境
4080
4080
  */
4081
4081
  function isIOS() {
4082
- // 非浏览器环境直接返回false(如果需要保留这行可取消注释)
4082
+ // 非浏览器环境直接返回false(如需保留请取消注释)
4083
4083
  // if (!isBrowser()) return false;
4084
4084
 
4085
4085
  const userAgent = navigator.userAgent.toLowerCase();
4086
- const platform = navigator.platform;
4086
+ const platform = navigator.platform.toLowerCase(); // 统一转小写,避免大小写兼容问题
4087
4087
  const maxTouchPoints = navigator.maxTouchPoints || 0;
4088
+ const screenRatio = screen.width / screen.height; // 屏幕宽高比(iPad核心特征:4:3左右)
4088
4089
 
4089
- // 1. 原有逻辑:匹配iPhone/iPod(UA仍保留标识) + 排除Windows Phone
4090
+ // ========== 核心检测规则 ==========
4091
+ // 1. 基础规则:iPhone/iPod 直接命中(无兼容问题)
4090
4092
  const isIphoneIpod = /iphone|ipod/.test(userAgent) && !window.MSStream;
4091
-
4092
- // 2. 兼容iPadOS 13+:分两种情况检测iPad
4093
+
4094
+ // 2. iPad 专属检测(覆盖所有iPad机型,含iPad Air)
4093
4095
  const isIpad = (
4094
- // 情况1:老版本iPadOS/原生iPad标识(platform直接是iPad
4095
- platform === 'iPad' ||
4096
- // 情况2:iPadOS 13+ 伪装Mac的场景(UA含macintosh + 支持触摸 + 排除真Mac
4096
+ // 场景1:老版本iPadOS/原生标识(platform含ipad
4097
+ platform.includes('ipad') ||
4098
+ // 场景2:iPadOS 13+ 伪装MacUA含macintosh + 触摸+ Mac平台)
4097
4099
  (
4098
- userAgent.includes('macintosh') &&
4099
- maxTouchPoints > 0 &&
4100
- !platform.includes('Mac') &&
4100
+ userAgent.includes('macintosh') &&
4101
+ maxTouchPoints > 0 && // iPad Air 触摸点≥5,Mac几乎为0
4102
+ !platform.includes('mac') && // 排除真Mac
4101
4103
  !window.MSStream
4104
+ ) ||
4105
+ // 场景3:新版本iPadOS(UA直接含ipados,如iPad Air搭载的iPadOS 15+)
4106
+ userAgent.includes('ipados') ||
4107
+ // 场景4:极端场景(第三方浏览器如Chrome for iPad Air)
4108
+ (
4109
+ maxTouchPoints >= 5 && // iPad Air 固定支持5点触摸
4110
+ !platform.includes('android') && // 排除安卓平板
4111
+ (screenRatio > 0.7 && screenRatio < 1.4) // iPad宽高比≈0.75(4:3),Mac多为1.78(16:9)
4102
4112
  )
4103
4113
  );
4104
4114
 
4105
- // 3. 只要是iPhone/iPod/iPad任意一种,且是iOS环境,返回true
4106
- return isIphoneIpod || isIpad;
4115
+ // ========== 最终判定 ==========
4116
+ const result = isIphoneIpod || isIpad;
4117
+ return result;
4107
4118
  }
4108
4119
 
4109
4120
  /**
@@ -4179,21 +4190,37 @@ function createSSO() {
4179
4190
  },
4180
4191
 
4181
4192
  /**
4182
- * 退出登录
4183
- * @returns {Promise<Object>} 接口返回结果
4184
- */
4193
+ * 退出登录
4194
+ * @returns {Promise<Object>} 接口返回结果
4195
+ */
4185
4196
  async logout() {
4197
+ // 1. 前置校验:初始化状态
4186
4198
  if (!config) {
4187
4199
  return { code: -101, msg: '请先调用init方法初始化', success: false };
4188
4200
  }
4189
4201
 
4202
+ // 2. 工具函数:统一构建登录跳转URL(确保完整编码当前URL的所有参数/hash)
4203
+ const buildLoginUrl = () => {
4204
+ if (!config.logOutUrl || !isBrowser()) return '';
4205
+ // 关键:获取当前完整URL(含query、hash)并完整编码,避免参数丢失
4206
+ const currentFullUrl = window.location.href;
4207
+ const encodedRedirectUri = encodeURIComponent(currentFullUrl);
4208
+ return `${config.logOutUrl}?redirect_uri=${encodedRedirectUri}`;
4209
+ };
4210
+
4211
+ // 3. 校验logoutApi配置(仅接口调用时需要,跳转登录页不受此影响)
4190
4212
  if (!config.logoutApi) {
4213
+ // 无logoutApi时仍清除token并跳转登录页,保证基础退出逻辑
4214
+ this.removeToken();
4215
+ const loginUrl = buildLoginUrl();
4216
+ if (loginUrl) window.location.href = loginUrl;
4191
4217
  return { code: -102, msg: '未配置logoutApi', success: false };
4192
4218
  }
4193
4219
 
4194
4220
  const token = this.getToken();
4195
4221
  if (token) {
4196
4222
  try {
4223
+ // 调用退出接口
4197
4224
  const result = await request(
4198
4225
  config.logoutApi,
4199
4226
  {
@@ -4202,31 +4229,37 @@ function createSSO() {
4202
4229
  timeout: config.timeout
4203
4230
  }
4204
4231
  );
4232
+ // 无论接口返回结果如何,都清除token
4205
4233
  this.removeToken();
4206
4234
 
4207
- if (isBrowser() && config.logOutUrl) {
4208
- window.location.href = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(getCurrentUrlWithParams())}`;
4209
- }
4235
+ // 跳转登录页(携带完整的当前URL)
4236
+ const loginUrl = buildLoginUrl();
4237
+ if (loginUrl) window.location.href = loginUrl;
4210
4238
  return result;
4211
4239
  } catch (error) {
4240
+ // 接口调用失败,仍清除token并跳转登录页
4241
+ this.removeToken();
4242
+ const loginUrl = buildLoginUrl();
4243
+ if (loginUrl) window.location.href = loginUrl;
4212
4244
  return { code: -103, msg: `退出失败: ${error.message}`, success: false };
4213
4245
  }
4214
4246
  } else {
4247
+ // 无token时直接清除(兜底)并跳转登录页
4215
4248
  this.removeToken();
4216
- if (isBrowser() && config.logOutUrl) {
4217
- window.location.href = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(getCurrentUrlWithParams())}`;
4218
- }
4249
+ const loginUrl = buildLoginUrl();
4250
+ if (loginUrl) window.location.href = loginUrl;
4219
4251
  return { code: 0, msg: '已成功清除token', success: true };
4220
4252
  }
4221
4253
  },
4222
4254
 
4223
4255
  /**
4224
4256
  * 用token换取新accessCode并跳转到指定URL
4225
- * @param {string} redirectUrl - 目标跳转地址
4257
+ * @param {string} redirectUrl - 目标跳转地址(支持带query/hash参数)
4226
4258
  * @param {string} target - 当前页面:_self、新页面打开:_blank,默认当前页_self
4227
4259
  * @returns {Promise<Object>} 接口返回结果
4228
4260
  */
4229
4261
  async toUrl(redirectUrl, target = '_self') {
4262
+ // 1. 前置校验:初始化状态、参数合法性
4230
4263
  if (!config) {
4231
4264
  return { code: -101, msg: '请先调用init方法初始化', success: false };
4232
4265
  }
@@ -4235,35 +4268,36 @@ function createSSO() {
4235
4268
  return { code: -104, msg: '请提供跳转地址', success: false };
4236
4269
  }
4237
4270
 
4238
- // 核心修改:iOS移动端强制使用当前页面打开
4239
- if (isIOS()) {
4240
- target = '_self';
4241
- }
4242
-
4243
- // 验证target参数有效性
4244
- if (!['_self', '_blank'].includes(target)) {
4271
+ // 2. 处理target参数:iOS强制_self,且校验参数范围
4272
+ const finalTarget = isIOS() ? '_self' : target;
4273
+ if (!['_self', '_blank'].includes(finalTarget)) {
4245
4274
  return { code: -108, msg: 'target参数必须是"_self"或"_blank"', success: false };
4246
4275
  }
4247
4276
 
4277
+ // 3. 工具函数:统一构建登录跳转URL(避免重复代码,确保参数完整编码)
4278
+ const buildLoginUrl = (redirectUrl) => {
4279
+ if (!config.logOutUrl) return '';
4280
+ // 关键:encodeURIComponent 会完整编码redirectUrl的所有部分(query/hash),避免参数丢失
4281
+ const encodedRedirectUri = encodeURIComponent(redirectUrl);
4282
+ return `${config.logOutUrl}?redirect_uri=${encodedRedirectUri}`;
4283
+ };
4284
+
4285
+ // 4. 校验refreshCodeApi配置
4248
4286
  if (!config.refreshCodeApi) {
4249
4287
  return { code: -105, msg: '未配置refreshCodeApi', success: false };
4250
4288
  }
4251
4289
 
4290
+ // 5. 获取token,无token则直接跳登录页
4252
4291
  const token = this.getToken();
4253
4292
  if (!token) {
4254
4293
  if (isBrowser() && config.logOutUrl) {
4255
- const loginUrl = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
4256
-
4257
- // 根据target决定打开方式
4258
- if (target === '_blank') {
4259
- window.open(loginUrl, '_blank');
4260
- } else {
4261
- window.location.href = loginUrl;
4262
- }
4294
+ const loginUrl = buildLoginUrl(redirectUrl);
4295
+ finalTarget === '_blank' ? window.open(loginUrl, '_blank') : window.location.href = loginUrl;
4263
4296
  }
4264
4297
  return { code: -106, msg: '未找到有效token', success: false };
4265
4298
  }
4266
4299
 
4300
+ // 6. 有token则尝试换取accessCode并跳转
4267
4301
  try {
4268
4302
  const result = await request(
4269
4303
  config.refreshCodeApi,
@@ -4275,32 +4309,25 @@ function createSSO() {
4275
4309
  );
4276
4310
 
4277
4311
  if (result.code === 0 && result.data && isBrowser()) {
4312
+ // 拼接accessCode到目标URL,保留原URL的所有参数/hash
4278
4313
  const url = new URL(redirectUrl);
4279
4314
  url.searchParams.set(config.accessCodeKey, result.data);
4280
4315
  const targetUrl = url.toString();
4281
-
4282
- // 根据target参数决定跳转方式
4283
- if (target === '_blank') {
4284
- window.open(targetUrl, '_blank');
4285
- } else {
4286
- window.location.href = targetUrl;
4287
- }
4316
+ finalTarget === '_blank' ? window.open(targetUrl, '_blank') : window.location.href = targetUrl;
4288
4317
  } else {
4289
- const loginUrl = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
4290
- if (target === '_blank') {
4291
- window.open(loginUrl, '_blank');
4292
- } else {
4293
- window.location.href = loginUrl;
4318
+ // 接口返回失败,跳登录页(复用统一的登录URL构建逻辑)
4319
+ if (isBrowser() && config.logOutUrl) {
4320
+ const loginUrl = buildLoginUrl(redirectUrl);
4321
+ finalTarget === '_blank' ? window.open(loginUrl, '_blank') : window.location.href = loginUrl;
4294
4322
  }
4295
4323
  }
4296
4324
 
4297
4325
  return result;
4298
4326
  } catch (error) {
4299
- const loginUrl = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
4300
- if (target === '_blank') {
4301
- window.open(loginUrl, '_blank');
4302
- } else {
4303
- window.location.href = loginUrl;
4327
+ // 接口异常,跳登录页(复用统一的登录URL构建逻辑)
4328
+ if (isBrowser() && config.logOutUrl) {
4329
+ const loginUrl = buildLoginUrl(redirectUrl);
4330
+ finalTarget === '_blank' ? window.open(loginUrl, '_blank') : window.location.href = loginUrl;
4304
4331
  }
4305
4332
  return { code: -107, msg: `跳转失败: ${error.message}`, success: false };
4306
4333
  }
package/dist/lgsso-sdk.js CHANGED
@@ -4081,35 +4081,46 @@
4081
4081
  }
4082
4082
 
4083
4083
  /**
4084
- * 判断是否是iOS移动端(兼容iPadOS 13+ UA伪装成Mac的场景)
4084
+ * 判断是否是iOS移动端(精准适配iPad Air/所有iPad机型 + 全版本iPadOS)
4085
4085
  * @returns {boolean} 是否为iOS环境
4086
4086
  */
4087
4087
  function isIOS() {
4088
- // 非浏览器环境直接返回false(如果需要保留这行可取消注释)
4088
+ // 非浏览器环境直接返回false(如需保留请取消注释)
4089
4089
  // if (!isBrowser()) return false;
4090
4090
 
4091
4091
  const userAgent = navigator.userAgent.toLowerCase();
4092
- const platform = navigator.platform;
4092
+ const platform = navigator.platform.toLowerCase(); // 统一转小写,避免大小写兼容问题
4093
4093
  const maxTouchPoints = navigator.maxTouchPoints || 0;
4094
+ const screenRatio = screen.width / screen.height; // 屏幕宽高比(iPad核心特征:4:3左右)
4094
4095
 
4095
- // 1. 原有逻辑:匹配iPhone/iPod(UA仍保留标识) + 排除Windows Phone
4096
+ // ========== 核心检测规则 ==========
4097
+ // 1. 基础规则:iPhone/iPod 直接命中(无兼容问题)
4096
4098
  const isIphoneIpod = /iphone|ipod/.test(userAgent) && !window.MSStream;
4097
-
4098
- // 2. 兼容iPadOS 13+:分两种情况检测iPad
4099
+
4100
+ // 2. iPad 专属检测(覆盖所有iPad机型,含iPad Air)
4099
4101
  const isIpad = (
4100
- // 情况1:老版本iPadOS/原生iPad标识(platform直接是iPad
4101
- platform === 'iPad' ||
4102
- // 情况2:iPadOS 13+ 伪装Mac的场景(UA含macintosh + 支持触摸 + 排除真Mac
4102
+ // 场景1:老版本iPadOS/原生标识(platform含ipad
4103
+ platform.includes('ipad') ||
4104
+ // 场景2:iPadOS 13+ 伪装MacUA含macintosh + 触摸+ Mac平台)
4103
4105
  (
4104
- userAgent.includes('macintosh') &&
4105
- maxTouchPoints > 0 &&
4106
- !platform.includes('Mac') &&
4106
+ userAgent.includes('macintosh') &&
4107
+ maxTouchPoints > 0 && // iPad Air 触摸点≥5,Mac几乎为0
4108
+ !platform.includes('mac') && // 排除真Mac
4107
4109
  !window.MSStream
4110
+ ) ||
4111
+ // 场景3:新版本iPadOS(UA直接含ipados,如iPad Air搭载的iPadOS 15+)
4112
+ userAgent.includes('ipados') ||
4113
+ // 场景4:极端场景(第三方浏览器如Chrome for iPad Air)
4114
+ (
4115
+ maxTouchPoints >= 5 && // iPad Air 固定支持5点触摸
4116
+ !platform.includes('android') && // 排除安卓平板
4117
+ (screenRatio > 0.7 && screenRatio < 1.4) // iPad宽高比≈0.75(4:3),Mac多为1.78(16:9)
4108
4118
  )
4109
4119
  );
4110
4120
 
4111
- // 3. 只要是iPhone/iPod/iPad任意一种,且是iOS环境,返回true
4112
- return isIphoneIpod || isIpad;
4121
+ // ========== 最终判定 ==========
4122
+ const result = isIphoneIpod || isIpad;
4123
+ return result;
4113
4124
  }
4114
4125
 
4115
4126
  /**
@@ -4185,21 +4196,37 @@
4185
4196
  },
4186
4197
 
4187
4198
  /**
4188
- * 退出登录
4189
- * @returns {Promise<Object>} 接口返回结果
4190
- */
4199
+ * 退出登录
4200
+ * @returns {Promise<Object>} 接口返回结果
4201
+ */
4191
4202
  async logout() {
4203
+ // 1. 前置校验:初始化状态
4192
4204
  if (!config) {
4193
4205
  return { code: -101, msg: '请先调用init方法初始化', success: false };
4194
4206
  }
4195
4207
 
4208
+ // 2. 工具函数:统一构建登录跳转URL(确保完整编码当前URL的所有参数/hash)
4209
+ const buildLoginUrl = () => {
4210
+ if (!config.logOutUrl || !isBrowser()) return '';
4211
+ // 关键:获取当前完整URL(含query、hash)并完整编码,避免参数丢失
4212
+ const currentFullUrl = window.location.href;
4213
+ const encodedRedirectUri = encodeURIComponent(currentFullUrl);
4214
+ return `${config.logOutUrl}?redirect_uri=${encodedRedirectUri}`;
4215
+ };
4216
+
4217
+ // 3. 校验logoutApi配置(仅接口调用时需要,跳转登录页不受此影响)
4196
4218
  if (!config.logoutApi) {
4219
+ // 无logoutApi时仍清除token并跳转登录页,保证基础退出逻辑
4220
+ this.removeToken();
4221
+ const loginUrl = buildLoginUrl();
4222
+ if (loginUrl) window.location.href = loginUrl;
4197
4223
  return { code: -102, msg: '未配置logoutApi', success: false };
4198
4224
  }
4199
4225
 
4200
4226
  const token = this.getToken();
4201
4227
  if (token) {
4202
4228
  try {
4229
+ // 调用退出接口
4203
4230
  const result = await request(
4204
4231
  config.logoutApi,
4205
4232
  {
@@ -4208,31 +4235,37 @@
4208
4235
  timeout: config.timeout
4209
4236
  }
4210
4237
  );
4238
+ // 无论接口返回结果如何,都清除token
4211
4239
  this.removeToken();
4212
4240
 
4213
- if (isBrowser() && config.logOutUrl) {
4214
- window.location.href = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(getCurrentUrlWithParams())}`;
4215
- }
4241
+ // 跳转登录页(携带完整的当前URL)
4242
+ const loginUrl = buildLoginUrl();
4243
+ if (loginUrl) window.location.href = loginUrl;
4216
4244
  return result;
4217
4245
  } catch (error) {
4246
+ // 接口调用失败,仍清除token并跳转登录页
4247
+ this.removeToken();
4248
+ const loginUrl = buildLoginUrl();
4249
+ if (loginUrl) window.location.href = loginUrl;
4218
4250
  return { code: -103, msg: `退出失败: ${error.message}`, success: false };
4219
4251
  }
4220
4252
  } else {
4253
+ // 无token时直接清除(兜底)并跳转登录页
4221
4254
  this.removeToken();
4222
- if (isBrowser() && config.logOutUrl) {
4223
- window.location.href = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(getCurrentUrlWithParams())}`;
4224
- }
4255
+ const loginUrl = buildLoginUrl();
4256
+ if (loginUrl) window.location.href = loginUrl;
4225
4257
  return { code: 0, msg: '已成功清除token', success: true };
4226
4258
  }
4227
4259
  },
4228
4260
 
4229
4261
  /**
4230
4262
  * 用token换取新accessCode并跳转到指定URL
4231
- * @param {string} redirectUrl - 目标跳转地址
4263
+ * @param {string} redirectUrl - 目标跳转地址(支持带query/hash参数)
4232
4264
  * @param {string} target - 当前页面:_self、新页面打开:_blank,默认当前页_self
4233
4265
  * @returns {Promise<Object>} 接口返回结果
4234
4266
  */
4235
4267
  async toUrl(redirectUrl, target = '_self') {
4268
+ // 1. 前置校验:初始化状态、参数合法性
4236
4269
  if (!config) {
4237
4270
  return { code: -101, msg: '请先调用init方法初始化', success: false };
4238
4271
  }
@@ -4241,35 +4274,36 @@
4241
4274
  return { code: -104, msg: '请提供跳转地址', success: false };
4242
4275
  }
4243
4276
 
4244
- // 核心修改:iOS移动端强制使用当前页面打开
4245
- if (isIOS()) {
4246
- target = '_self';
4247
- }
4248
-
4249
- // 验证target参数有效性
4250
- if (!['_self', '_blank'].includes(target)) {
4277
+ // 2. 处理target参数:iOS强制_self,且校验参数范围
4278
+ const finalTarget = isIOS() ? '_self' : target;
4279
+ if (!['_self', '_blank'].includes(finalTarget)) {
4251
4280
  return { code: -108, msg: 'target参数必须是"_self"或"_blank"', success: false };
4252
4281
  }
4253
4282
 
4283
+ // 3. 工具函数:统一构建登录跳转URL(避免重复代码,确保参数完整编码)
4284
+ const buildLoginUrl = (redirectUrl) => {
4285
+ if (!config.logOutUrl) return '';
4286
+ // 关键:encodeURIComponent 会完整编码redirectUrl的所有部分(query/hash),避免参数丢失
4287
+ const encodedRedirectUri = encodeURIComponent(redirectUrl);
4288
+ return `${config.logOutUrl}?redirect_uri=${encodedRedirectUri}`;
4289
+ };
4290
+
4291
+ // 4. 校验refreshCodeApi配置
4254
4292
  if (!config.refreshCodeApi) {
4255
4293
  return { code: -105, msg: '未配置refreshCodeApi', success: false };
4256
4294
  }
4257
4295
 
4296
+ // 5. 获取token,无token则直接跳登录页
4258
4297
  const token = this.getToken();
4259
4298
  if (!token) {
4260
4299
  if (isBrowser() && config.logOutUrl) {
4261
- const loginUrl = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
4262
-
4263
- // 根据target决定打开方式
4264
- if (target === '_blank') {
4265
- window.open(loginUrl, '_blank');
4266
- } else {
4267
- window.location.href = loginUrl;
4268
- }
4300
+ const loginUrl = buildLoginUrl(redirectUrl);
4301
+ finalTarget === '_blank' ? window.open(loginUrl, '_blank') : window.location.href = loginUrl;
4269
4302
  }
4270
4303
  return { code: -106, msg: '未找到有效token', success: false };
4271
4304
  }
4272
4305
 
4306
+ // 6. 有token则尝试换取accessCode并跳转
4273
4307
  try {
4274
4308
  const result = await request(
4275
4309
  config.refreshCodeApi,
@@ -4281,32 +4315,25 @@
4281
4315
  );
4282
4316
 
4283
4317
  if (result.code === 0 && result.data && isBrowser()) {
4318
+ // 拼接accessCode到目标URL,保留原URL的所有参数/hash
4284
4319
  const url = new URL(redirectUrl);
4285
4320
  url.searchParams.set(config.accessCodeKey, result.data);
4286
4321
  const targetUrl = url.toString();
4287
-
4288
- // 根据target参数决定跳转方式
4289
- if (target === '_blank') {
4290
- window.open(targetUrl, '_blank');
4291
- } else {
4292
- window.location.href = targetUrl;
4293
- }
4322
+ finalTarget === '_blank' ? window.open(targetUrl, '_blank') : window.location.href = targetUrl;
4294
4323
  } else {
4295
- const loginUrl = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
4296
- if (target === '_blank') {
4297
- window.open(loginUrl, '_blank');
4298
- } else {
4299
- window.location.href = loginUrl;
4324
+ // 接口返回失败,跳登录页(复用统一的登录URL构建逻辑)
4325
+ if (isBrowser() && config.logOutUrl) {
4326
+ const loginUrl = buildLoginUrl(redirectUrl);
4327
+ finalTarget === '_blank' ? window.open(loginUrl, '_blank') : window.location.href = loginUrl;
4300
4328
  }
4301
4329
  }
4302
4330
 
4303
4331
  return result;
4304
4332
  } catch (error) {
4305
- const loginUrl = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
4306
- if (target === '_blank') {
4307
- window.open(loginUrl, '_blank');
4308
- } else {
4309
- window.location.href = loginUrl;
4333
+ // 接口异常,跳登录页(复用统一的登录URL构建逻辑)
4334
+ if (isBrowser() && config.logOutUrl) {
4335
+ const loginUrl = buildLoginUrl(redirectUrl);
4336
+ finalTarget === '_blank' ? window.open(loginUrl, '_blank') : window.location.href = loginUrl;
4310
4337
  }
4311
4338
  return { code: -107, msg: `跳转失败: ${error.message}`, success: false };
4312
4339
  }
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).lgsso={})}(this,function(e){"use strict";function t(){return"undefined"!=typeof window&&"undefined"!=typeof document}function n(){return t()?window.location.href:""}function r(e,t){return function(){return e.apply(t,arguments)}}const{toString:o}=Object.prototype,{getPrototypeOf:s}=Object,{iterator:i,toStringTag:a}=Symbol,c=(u=Object.create(null),e=>{const t=o.call(e);return u[t]||(u[t]=t.slice(8,-1).toLowerCase())});var u;const l=e=>(e=e.toLowerCase(),t=>c(t)===e),d=e=>t=>typeof t===e,{isArray:f}=Array,h=d("undefined");function p(e){return null!==e&&!h(e)&&null!==e.constructor&&!h(e.constructor)&&y(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const m=l("ArrayBuffer");const g=d("string"),y=d("function"),w=d("number"),b=e=>null!==e&&"object"==typeof e,E=e=>{if("object"!==c(e))return!1;const t=s(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||a in e||i in e)},O=l("Date"),R=l("File"),S=l("Blob"),T=l("FileList"),A=l("URLSearchParams"),[C,v,P,k]=["ReadableStream","Request","Response","Headers"].map(l);function U(e,t,{allOwnKeys:n=!1}={}){if(null==e)return;let r,o;if("object"!=typeof e&&(e=[e]),f(e))for(r=0,o=e.length;r<o;r++)t.call(null,e[r],r,e);else{if(p(e))return;const o=n?Object.getOwnPropertyNames(e):Object.keys(e),s=o.length;let i;for(r=0;r<s;r++)i=o[r],t.call(null,e[i],i,e)}}function x(e,t){if(p(e))return null;t=t.toLowerCase();const n=Object.keys(e);let r,o=n.length;for(;o-- >0;)if(r=n[o],t===r.toLowerCase())return r;return null}const _="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,j=e=>!h(e)&&e!==_;const N=(L="undefined"!=typeof Uint8Array&&s(Uint8Array),e=>L&&e instanceof L);var L;const F=l("HTMLFormElement"),B=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),D=l("RegExp"),K=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};U(n,(n,o)=>{let s;!1!==(s=t(n,o,e))&&(r[o]=s||n)}),Object.defineProperties(e,r)};const q=l("AsyncFunction"),I=(M="function"==typeof setImmediate,$=y(_.postMessage),M?setImmediate:$?(z=`axios@${Math.random()}`,H=[],_.addEventListener("message",({source:e,data:t})=>{e===_&&t===z&&H.length&&H.shift()()},!1),e=>{H.push(e),_.postMessage(z,"*")}):e=>setTimeout(e));var M,$,z,H;const J="undefined"!=typeof queueMicrotask?queueMicrotask.bind(_):"undefined"!=typeof process&&process.nextTick||I;var W={isArray:f,isArrayBuffer:m,isBuffer:p,isFormData:e=>{let t;return e&&("function"==typeof FormData&&e instanceof FormData||y(e.append)&&("formdata"===(t=c(e))||"object"===t&&y(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){let t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&m(e.buffer),t},isString:g,isNumber:w,isBoolean:e=>!0===e||!1===e,isObject:b,isPlainObject:E,isEmptyObject:e=>{if(!b(e)||p(e))return!1;try{return 0===Object.keys(e).length&&Object.getPrototypeOf(e)===Object.prototype}catch(e){return!1}},isReadableStream:C,isRequest:v,isResponse:P,isHeaders:k,isUndefined:h,isDate:O,isFile:R,isBlob:S,isRegExp:D,isFunction:y,isStream:e=>b(e)&&y(e.pipe),isURLSearchParams:A,isTypedArray:N,isFileList:T,forEach:U,merge:function e(){const{caseless:t}=j(this)&&this||{},n={},r=(r,o)=>{const s=t&&x(n,o)||o;E(n[s])&&E(r)?n[s]=e(n[s],r):E(r)?n[s]=e({},r):f(r)?n[s]=r.slice():n[s]=r};for(let e=0,t=arguments.length;e<t;e++)arguments[e]&&U(arguments[e],r);return n},extend:(e,t,n,{allOwnKeys:o}={})=>(U(t,(t,o)=>{n&&y(t)?e[o]=r(t,n):e[o]=t},{allOwnKeys:o}),e),trim:e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""),stripBOM:e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),inherits:(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:(e,t,n,r)=>{let o,i,a;const c={};if(t=t||{},null==e)return t;do{for(o=Object.getOwnPropertyNames(e),i=o.length;i-- >0;)a=o[i],r&&!r(a,e,t)||c[a]||(t[a]=e[a],c[a]=!0);e=!1!==n&&s(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:c,kindOfTest:l,endsWith:(e,t,n)=>{e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return-1!==r&&r===n},toArray:e=>{if(!e)return null;if(f(e))return e;let t=e.length;if(!w(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},forEachEntry:(e,t)=>{const n=(e&&e[i]).call(e);let r;for(;(r=n.next())&&!r.done;){const n=r.value;t.call(e,n[0],n[1])}},matchAll:(e,t)=>{let n;const r=[];for(;null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:F,hasOwnProperty:B,hasOwnProp:B,reduceDescriptors:K,freezeMethods:e=>{K(e,(t,n)=>{if(y(e)&&-1!==["arguments","caller","callee"].indexOf(n))return!1;const r=e[n];y(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")}))})},toObjectSet:(e,t)=>{const n={},r=e=>{e.forEach(e=>{n[e]=!0})};return f(e)?r(e):r(String(e).split(t)),n},toCamelCase:e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(e,t,n){return t.toUpperCase()+n}),noop:()=>{},toFiniteNumber:(e,t)=>null!=e&&Number.isFinite(e=+e)?e:t,findKey:x,global:_,isContextDefined:j,isSpecCompliantForm:function(e){return!!(e&&y(e.append)&&"FormData"===e[a]&&e[i])},toJSONObject:e=>{const t=new Array(10),n=(e,r)=>{if(b(e)){if(t.indexOf(e)>=0)return;if(p(e))return e;if(!("toJSON"in e)){t[r]=e;const o=f(e)?[]:{};return U(e,(e,t)=>{const s=n(e,r+1);!h(s)&&(o[t]=s)}),t[r]=void 0,o}}return e};return n(e,0)},isAsyncFn:q,isThenable:e=>e&&(b(e)||y(e))&&y(e.then)&&y(e.catch),setImmediate:I,asap:J,isIterable:e=>null!=e&&y(e[i])};function V(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o,this.status=o.status?o.status:null)}W.inherits(V,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:W.toJSONObject(this.config),code:this.code,status:this.status}}});const G=V.prototype,X={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{X[e]={value:e}}),Object.defineProperties(V,X),Object.defineProperty(G,"isAxiosError",{value:!0}),V.from=(e,t,n,r,o,s)=>{const i=Object.create(G);return W.toFlatObject(e,i,function(e){return e!==Error.prototype},e=>"isAxiosError"!==e),V.call(i,e.message,t,n,r,o),i.cause=e,i.name=e.name,s&&Object.assign(i,s),i};function Q(e){return W.isPlainObject(e)||W.isArray(e)}function Z(e){return W.endsWith(e,"[]")?e.slice(0,-2):e}function Y(e,t,n){return e?e.concat(t).map(function(e,t){return e=Z(e),!n&&t?"["+e+"]":e}).join(n?".":""):t}const ee=W.toFlatObject(W,{},null,function(e){return/^is[A-Z]/.test(e)});function te(e,t,n){if(!W.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;const r=(n=W.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(e,t){return!W.isUndefined(t[e])})).metaTokens,o=n.visitor||u,s=n.dots,i=n.indexes,a=(n.Blob||"undefined"!=typeof Blob&&Blob)&&W.isSpecCompliantForm(t);if(!W.isFunction(o))throw new TypeError("visitor must be a function");function c(e){if(null===e)return"";if(W.isDate(e))return e.toISOString();if(W.isBoolean(e))return e.toString();if(!a&&W.isBlob(e))throw new V("Blob is not supported. Use a Buffer instead.");return W.isArrayBuffer(e)||W.isTypedArray(e)?a&&"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}function u(e,n,o){let a=e;if(e&&!o&&"object"==typeof e)if(W.endsWith(n,"{}"))n=r?n:n.slice(0,-2),e=JSON.stringify(e);else if(W.isArray(e)&&function(e){return W.isArray(e)&&!e.some(Q)}(e)||(W.isFileList(e)||W.endsWith(n,"[]"))&&(a=W.toArray(e)))return n=Z(n),a.forEach(function(e,r){!W.isUndefined(e)&&null!==e&&t.append(!0===i?Y([n],r,s):null===i?n:n+"[]",c(e))}),!1;return!!Q(e)||(t.append(Y(o,n,s),c(e)),!1)}const l=[],d=Object.assign(ee,{defaultVisitor:u,convertValue:c,isVisitable:Q});if(!W.isObject(e))throw new TypeError("data must be an object");return function e(n,r){if(!W.isUndefined(n)){if(-1!==l.indexOf(n))throw Error("Circular reference detected in "+r.join("."));l.push(n),W.forEach(n,function(n,s){!0===(!(W.isUndefined(n)||null===n)&&o.call(t,n,W.isString(s)?s.trim():s,r,d))&&e(n,r?r.concat(s):[s])}),l.pop()}}(e),t}function ne(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(e){return t[e]})}function re(e,t){this._pairs=[],e&&te(e,this,t)}const oe=re.prototype;function se(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function ie(e,t,n){if(!t)return e;const r=n&&n.encode||se;W.isFunction(n)&&(n={serialize:n});const o=n&&n.serialize;let s;if(s=o?o(t,n):W.isURLSearchParams(t)?t.toString():new re(t,n).toString(r),s){const t=e.indexOf("#");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+s}return e}oe.append=function(e,t){this._pairs.push([e,t])},oe.toString=function(e){const t=e?function(t){return e.call(this,t,ne)}:ne;return this._pairs.map(function(e){return t(e[0])+"="+t(e[1])},"").join("&")};var ae=class{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){W.forEach(this.handlers,function(t){null!==t&&e(t)})}},ce={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},ue={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:re,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]};const le="undefined"!=typeof window&&"undefined"!=typeof document,de="object"==typeof navigator&&navigator||void 0,fe=le&&(!de||["ReactNative","NativeScript","NS"].indexOf(de.product)<0),he="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,pe=le&&window.location.href||"http://localhost";var me={...Object.freeze({__proto__:null,hasBrowserEnv:le,hasStandardBrowserEnv:fe,hasStandardBrowserWebWorkerEnv:he,navigator:de,origin:pe}),...ue};function ge(e){function t(e,n,r,o){let s=e[o++];if("__proto__"===s)return!0;const i=Number.isFinite(+s),a=o>=e.length;if(s=!s&&W.isArray(r)?r.length:s,a)return W.hasOwnProp(r,s)?r[s]=[r[s],n]:r[s]=n,!i;r[s]&&W.isObject(r[s])||(r[s]=[]);return t(e,n,r[s],o)&&W.isArray(r[s])&&(r[s]=function(e){const t={},n=Object.keys(e);let r;const o=n.length;let s;for(r=0;r<o;r++)s=n[r],t[s]=e[s];return t}(r[s])),!i}if(W.isFormData(e)&&W.isFunction(e.entries)){const n={};return W.forEachEntry(e,(e,r)=>{t(function(e){return W.matchAll(/\w+|\[(\w*)]/g,e).map(e=>"[]"===e[0]?"":e[1]||e[0])}(e),r,n,0)}),n}return null}const ye={transitional:ce,adapter:["xhr","http","fetch"],transformRequest:[function(e,t){const n=t.getContentType()||"",r=n.indexOf("application/json")>-1,o=W.isObject(e);o&&W.isHTMLForm(e)&&(e=new FormData(e));if(W.isFormData(e))return r?JSON.stringify(ge(e)):e;if(W.isArrayBuffer(e)||W.isBuffer(e)||W.isStream(e)||W.isFile(e)||W.isBlob(e)||W.isReadableStream(e))return e;if(W.isArrayBufferView(e))return e.buffer;if(W.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let s;if(o){if(n.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return te(e,new me.classes.URLSearchParams,{visitor:function(e,t,n,r){return me.isNode&&W.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)},...t})}(e,this.formSerializer).toString();if((s=W.isFileList(e))||n.indexOf("multipart/form-data")>-1){const t=this.env&&this.env.FormData;return te(s?{"files[]":e}:e,t&&new t,this.formSerializer)}}return o||r?(t.setContentType("application/json",!1),function(e,t,n){if(W.isString(e))try{return(t||JSON.parse)(e),W.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){const t=this.transitional||ye.transitional,n=t&&t.forcedJSONParsing,r="json"===this.responseType;if(W.isResponse(e)||W.isReadableStream(e))return e;if(e&&W.isString(e)&&(n&&!this.responseType||r)){const n=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw V.from(e,V.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:me.classes.FormData,Blob:me.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};W.forEach(["delete","get","head","post","put","patch"],e=>{ye.headers[e]={}});var we=ye;const be=W.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]);const Ee=Symbol("internals");function Oe(e){return e&&String(e).trim().toLowerCase()}function Re(e){return!1===e||null==e?e:W.isArray(e)?e.map(Re):String(e)}function Se(e,t,n,r,o){return W.isFunction(r)?r.call(this,t,n):(o&&(t=n),W.isString(t)?W.isString(r)?-1!==t.indexOf(r):W.isRegExp(r)?r.test(t):void 0:void 0)}class Te{constructor(e){e&&this.set(e)}set(e,t,n){const r=this;function o(e,t,n){const o=Oe(t);if(!o)throw new Error("header name must be a non-empty string");const s=W.findKey(r,o);(!s||void 0===r[s]||!0===n||void 0===n&&!1!==r[s])&&(r[s||t]=Re(e))}const s=(e,t)=>W.forEach(e,(e,n)=>o(e,n,t));if(W.isPlainObject(e)||e instanceof this.constructor)s(e,t);else if(W.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))s((e=>{const t={};let n,r,o;return e&&e.split("\n").forEach(function(e){o=e.indexOf(":"),n=e.substring(0,o).trim().toLowerCase(),r=e.substring(o+1).trim(),!n||t[n]&&be[n]||("set-cookie"===n?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t})(e),t);else if(W.isObject(e)&&W.isIterable(e)){let n,r,o={};for(const t of e){if(!W.isArray(t))throw TypeError("Object iterator must return a key-value pair");o[r=t[0]]=(n=o[r])?W.isArray(n)?[...n,t[1]]:[n,t[1]]:t[1]}s(o,t)}else null!=e&&o(t,e,n);return this}get(e,t){if(e=Oe(e)){const n=W.findKey(this,e);if(n){const e=this[n];if(!t)return e;if(!0===t)return function(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}(e);if(W.isFunction(t))return t.call(this,e,n);if(W.isRegExp(t))return t.exec(e);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,t){if(e=Oe(e)){const n=W.findKey(this,e);return!(!n||void 0===this[n]||t&&!Se(0,this[n],n,t))}return!1}delete(e,t){const n=this;let r=!1;function o(e){if(e=Oe(e)){const o=W.findKey(n,e);!o||t&&!Se(0,n[o],o,t)||(delete n[o],r=!0)}}return W.isArray(e)?e.forEach(o):o(e),r}clear(e){const t=Object.keys(this);let n=t.length,r=!1;for(;n--;){const o=t[n];e&&!Se(0,this[o],o,e,!0)||(delete this[o],r=!0)}return r}normalize(e){const t=this,n={};return W.forEach(this,(r,o)=>{const s=W.findKey(n,o);if(s)return t[s]=Re(r),void delete t[o];const i=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(e,t,n)=>t.toUpperCase()+n)}(o):String(o).trim();i!==o&&delete t[o],t[i]=Re(r),n[i]=!0}),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const t=Object.create(null);return W.forEach(this,(n,r)=>{null!=n&&!1!==n&&(t[r]=e&&W.isArray(n)?n.join(", "):n)}),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([e,t])=>e+": "+t).join("\n")}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...t){const n=new this(e);return t.forEach(e=>n.set(e)),n}static accessor(e){const t=(this[Ee]=this[Ee]={accessors:{}}).accessors,n=this.prototype;function r(e){const r=Oe(e);t[r]||(!function(e,t){const n=W.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(e,n,o){return this[r].call(this,t,e,n,o)},configurable:!0})})}(n,e),t[r]=!0)}return W.isArray(e)?e.forEach(r):r(e),this}}Te.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),W.reduceDescriptors(Te.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(e){this[n]=e}}}),W.freezeMethods(Te);var Ae=Te;function Ce(e,t){const n=this||we,r=t||n,o=Ae.from(r.headers);let s=r.data;return W.forEach(e,function(e){s=e.call(n,s,o.normalize(),t?t.status:void 0)}),o.normalize(),s}function ve(e){return!(!e||!e.__CANCEL__)}function Pe(e,t,n){V.call(this,null==e?"canceled":e,V.ERR_CANCELED,t,n),this.name="CanceledError"}function ke(e,t,n){const r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(new V("Request failed with status code "+n.status,[V.ERR_BAD_REQUEST,V.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n)):e(n)}W.inherits(Pe,V,{__CANCEL__:!0});const Ue=(e,t,n=3)=>{let r=0;const o=function(e,t){e=e||10;const n=new Array(e),r=new Array(e);let o,s=0,i=0;return t=void 0!==t?t:1e3,function(a){const c=Date.now(),u=r[i];o||(o=c),n[s]=a,r[s]=c;let l=i,d=0;for(;l!==s;)d+=n[l++],l%=e;if(s=(s+1)%e,s===i&&(i=(i+1)%e),c-o<t)return;const f=u&&c-u;return f?Math.round(1e3*d/f):void 0}}(50,250);return function(e,t){let n,r,o=0,s=1e3/t;const i=(t,s=Date.now())=>{o=s,n=null,r&&(clearTimeout(r),r=null),e(...t)};return[(...e)=>{const t=Date.now(),a=t-o;a>=s?i(e,t):(n=e,r||(r=setTimeout(()=>{r=null,i(n)},s-a)))},()=>n&&i(n)]}(n=>{const s=n.loaded,i=n.lengthComputable?n.total:void 0,a=s-r,c=o(a);r=s;e({loaded:s,total:i,progress:i?s/i:void 0,bytes:a,rate:c||void 0,estimated:c&&i&&s<=i?(i-s)/c:void 0,event:n,lengthComputable:null!=i,[t?"download":"upload"]:!0})},n)},xe=(e,t)=>{const n=null!=e;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},_e=e=>(...t)=>W.asap(()=>e(...t));var je=me.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,me.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(me.origin),me.navigator&&/(msie|trident)/i.test(me.navigator.userAgent)):()=>!0,Ne=me.hasStandardBrowserEnv?{write(e,t,n,r,o,s){const i=[e+"="+encodeURIComponent(t)];W.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),W.isString(r)&&i.push("path="+r),W.isString(o)&&i.push("domain="+o),!0===s&&i.push("secure"),document.cookie=i.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read:()=>null,remove(){}};function Le(e,t,n){let r=!/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t);return e&&(r||0==n)?function(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}(e,t):t}const Fe=e=>e instanceof Ae?{...e}:e;function Be(e,t){t=t||{};const n={};function r(e,t,n,r){return W.isPlainObject(e)&&W.isPlainObject(t)?W.merge.call({caseless:r},e,t):W.isPlainObject(t)?W.merge({},t):W.isArray(t)?t.slice():t}function o(e,t,n,o){return W.isUndefined(t)?W.isUndefined(e)?void 0:r(void 0,e,0,o):r(e,t,0,o)}function s(e,t){if(!W.isUndefined(t))return r(void 0,t)}function i(e,t){return W.isUndefined(t)?W.isUndefined(e)?void 0:r(void 0,e):r(void 0,t)}function a(n,o,s){return s in t?r(n,o):s in e?r(void 0,n):void 0}const c={url:s,method:s,data:s,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:a,headers:(e,t,n)=>o(Fe(e),Fe(t),0,!0)};return W.forEach(Object.keys({...e,...t}),function(r){const s=c[r]||o,i=s(e[r],t[r],r);W.isUndefined(i)&&s!==a||(n[r]=i)}),n}var De=e=>{const t=Be({},e);let n,{data:r,withXSRFToken:o,xsrfHeaderName:s,xsrfCookieName:i,headers:a,auth:c}=t;if(t.headers=a=Ae.from(a),t.url=ie(Le(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),c&&a.set("Authorization","Basic "+btoa((c.username||"")+":"+(c.password?unescape(encodeURIComponent(c.password)):""))),W.isFormData(r))if(me.hasStandardBrowserEnv||me.hasStandardBrowserWebWorkerEnv)a.setContentType(void 0);else if(!1!==(n=a.getContentType())){const[e,...t]=n?n.split(";").map(e=>e.trim()).filter(Boolean):[];a.setContentType([e||"multipart/form-data",...t].join("; "))}if(me.hasStandardBrowserEnv&&(o&&W.isFunction(o)&&(o=o(t)),o||!1!==o&&je(t.url))){const e=s&&i&&Ne.read(i);e&&a.set(s,e)}return t};var Ke="undefined"!=typeof XMLHttpRequest&&function(e){return new Promise(function(t,n){const r=De(e);let o=r.data;const s=Ae.from(r.headers).normalize();let i,a,c,u,l,{responseType:d,onUploadProgress:f,onDownloadProgress:h}=r;function p(){u&&u(),l&&l(),r.cancelToken&&r.cancelToken.unsubscribe(i),r.signal&&r.signal.removeEventListener("abort",i)}let m=new XMLHttpRequest;function g(){if(!m)return;const r=Ae.from("getAllResponseHeaders"in m&&m.getAllResponseHeaders());ke(function(e){t(e),p()},function(e){n(e),p()},{data:d&&"text"!==d&&"json"!==d?m.response:m.responseText,status:m.status,statusText:m.statusText,headers:r,config:e,request:m}),m=null}m.open(r.method.toUpperCase(),r.url,!0),m.timeout=r.timeout,"onloadend"in m?m.onloadend=g:m.onreadystatechange=function(){m&&4===m.readyState&&(0!==m.status||m.responseURL&&0===m.responseURL.indexOf("file:"))&&setTimeout(g)},m.onabort=function(){m&&(n(new V("Request aborted",V.ECONNABORTED,e,m)),m=null)},m.onerror=function(){n(new V("Network Error",V.ERR_NETWORK,e,m)),m=null},m.ontimeout=function(){let t=r.timeout?"timeout of "+r.timeout+"ms exceeded":"timeout exceeded";const o=r.transitional||ce;r.timeoutErrorMessage&&(t=r.timeoutErrorMessage),n(new V(t,o.clarifyTimeoutError?V.ETIMEDOUT:V.ECONNABORTED,e,m)),m=null},void 0===o&&s.setContentType(null),"setRequestHeader"in m&&W.forEach(s.toJSON(),function(e,t){m.setRequestHeader(t,e)}),W.isUndefined(r.withCredentials)||(m.withCredentials=!!r.withCredentials),d&&"json"!==d&&(m.responseType=r.responseType),h&&([c,l]=Ue(h,!0),m.addEventListener("progress",c)),f&&m.upload&&([a,u]=Ue(f),m.upload.addEventListener("progress",a),m.upload.addEventListener("loadend",u)),(r.cancelToken||r.signal)&&(i=t=>{m&&(n(!t||t.type?new Pe(null,e,m):t),m.abort(),m=null)},r.cancelToken&&r.cancelToken.subscribe(i),r.signal&&(r.signal.aborted?i():r.signal.addEventListener("abort",i)));const y=function(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}(r.url);y&&-1===me.protocols.indexOf(y)?n(new V("Unsupported protocol "+y+":",V.ERR_BAD_REQUEST,e)):m.send(o||null)})};var qe=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let n,r=new AbortController;const o=function(e){if(!n){n=!0,i();const t=e instanceof Error?e:this.reason;r.abort(t instanceof V?t:new Pe(t instanceof Error?t.message:t))}};let s=t&&setTimeout(()=>{s=null,o(new V(`timeout ${t} of ms exceeded`,V.ETIMEDOUT))},t);const i=()=>{e&&(s&&clearTimeout(s),s=null,e.forEach(e=>{e.unsubscribe?e.unsubscribe(o):e.removeEventListener("abort",o)}),e=null)};e.forEach(e=>e.addEventListener("abort",o));const{signal:a}=r;return a.unsubscribe=()=>W.asap(i),a}};const Ie=function*(e,t){let n=e.byteLength;if(!t||n<t)return void(yield e);let r,o=0;for(;o<n;)r=o+t,yield e.slice(o,r),o=r},Me=async function*(e){if(e[Symbol.asyncIterator])return void(yield*e);const t=e.getReader();try{for(;;){const{done:e,value:n}=await t.read();if(e)break;yield n}}finally{await t.cancel()}},$e=(e,t,n,r)=>{const o=async function*(e,t){for await(const n of Me(e))yield*Ie(n,t)}(e,t);let s,i=0,a=e=>{s||(s=!0,r&&r(e))};return new ReadableStream({async pull(e){try{const{done:t,value:r}=await o.next();if(t)return a(),void e.close();let s=r.byteLength;if(n){let e=i+=s;n(e)}e.enqueue(new Uint8Array(r))}catch(e){throw a(e),e}},cancel:e=>(a(e),o.return())},{highWaterMark:2})},ze="function"==typeof fetch&&"function"==typeof Request&&"function"==typeof Response,He=ze&&"function"==typeof ReadableStream,Je=ze&&("function"==typeof TextEncoder?(We=new TextEncoder,e=>We.encode(e)):async e=>new Uint8Array(await new Response(e).arrayBuffer()));var We;const Ve=(e,...t)=>{try{return!!e(...t)}catch(e){return!1}},Ge=He&&Ve(()=>{let e=!1;const t=new Request(me.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t}),Xe=He&&Ve(()=>W.isReadableStream(new Response("").body)),Qe={stream:Xe&&(e=>e.body)};var Ze;ze&&(Ze=new Response,["text","arrayBuffer","blob","formData","stream"].forEach(e=>{!Qe[e]&&(Qe[e]=W.isFunction(Ze[e])?t=>t[e]():(t,n)=>{throw new V(`Response type '${e}' is not supported`,V.ERR_NOT_SUPPORT,n)})}));const Ye=async(e,t)=>{const n=W.toFiniteNumber(e.getContentLength());return null==n?(async e=>{if(null==e)return 0;if(W.isBlob(e))return e.size;if(W.isSpecCompliantForm(e)){const t=new Request(me.origin,{method:"POST",body:e});return(await t.arrayBuffer()).byteLength}return W.isArrayBufferView(e)||W.isArrayBuffer(e)?e.byteLength:(W.isURLSearchParams(e)&&(e+=""),W.isString(e)?(await Je(e)).byteLength:void 0)})(t):n};var et=ze&&(async e=>{let{url:t,method:n,data:r,signal:o,cancelToken:s,timeout:i,onDownloadProgress:a,onUploadProgress:c,responseType:u,headers:l,withCredentials:d="same-origin",fetchOptions:f}=De(e);u=u?(u+"").toLowerCase():"text";let h,p=qe([o,s&&s.toAbortSignal()],i);const m=p&&p.unsubscribe&&(()=>{p.unsubscribe()});let g;try{if(c&&Ge&&"get"!==n&&"head"!==n&&0!==(g=await Ye(l,r))){let e,n=new Request(t,{method:"POST",body:r,duplex:"half"});if(W.isFormData(r)&&(e=n.headers.get("content-type"))&&l.setContentType(e),n.body){const[e,t]=xe(g,Ue(_e(c)));r=$e(n.body,65536,e,t)}}W.isString(d)||(d=d?"include":"omit");const o="credentials"in Request.prototype;h=new Request(t,{...f,signal:p,method:n.toUpperCase(),headers:l.normalize().toJSON(),body:r,duplex:"half",credentials:o?d:void 0});let s=await fetch(h,f);const i=Xe&&("stream"===u||"response"===u);if(Xe&&(a||i&&m)){const e={};["status","statusText","headers"].forEach(t=>{e[t]=s[t]});const t=W.toFiniteNumber(s.headers.get("content-length")),[n,r]=a&&xe(t,Ue(_e(a),!0))||[];s=new Response($e(s.body,65536,n,()=>{r&&r(),m&&m()}),e)}u=u||"text";let y=await Qe[W.findKey(Qe,u)||"text"](s,e);return!i&&m&&m(),await new Promise((t,n)=>{ke(t,n,{data:y,headers:Ae.from(s.headers),status:s.status,statusText:s.statusText,config:e,request:h})})}catch(t){if(m&&m(),t&&"TypeError"===t.name&&/Load failed|fetch/i.test(t.message))throw Object.assign(new V("Network Error",V.ERR_NETWORK,e,h),{cause:t.cause||t});throw V.from(t,t&&t.code,e,h)}});const tt={http:null,xhr:Ke,fetch:et};W.forEach(tt,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch(e){}Object.defineProperty(e,"adapterName",{value:t})}});const nt=e=>`- ${e}`,rt=e=>W.isFunction(e)||null===e||!1===e;var ot=e=>{e=W.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let s=0;s<t;s++){let t;if(n=e[s],r=n,!rt(n)&&(r=tt[(t=String(n)).toLowerCase()],void 0===r))throw new V(`Unknown adapter '${t}'`);if(r)break;o[t||"#"+s]=r}if(!r){const e=Object.entries(o).map(([e,t])=>`adapter ${e} `+(!1===t?"is not supported by the environment":"is not available in the build"));throw new V("There is no suitable adapter to dispatch the request "+(t?e.length>1?"since :\n"+e.map(nt).join("\n"):" "+nt(e[0]):"as no adapter specified"),"ERR_NOT_SUPPORT")}return r};function st(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Pe(null,e)}function it(e){st(e),e.headers=Ae.from(e.headers),e.data=Ce.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1);return ot(e.adapter||we.adapter)(e).then(function(t){return st(e),t.data=Ce.call(e,e.transformResponse,t),t.headers=Ae.from(t.headers),t},function(t){return ve(t)||(st(e),t&&t.response&&(t.response.data=Ce.call(e,e.transformResponse,t.response),t.response.headers=Ae.from(t.response.headers))),Promise.reject(t)})}const at="1.11.0",ct={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{ct[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}});const ut={};ct.transitional=function(e,t,n){function r(e,t){return"[Axios v"+at+"] Transitional option '"+e+"'"+t+(n?". "+n:"")}return(n,o,s)=>{if(!1===e)throw new V(r(o," has been removed"+(t?" in "+t:"")),V.ERR_DEPRECATED);return t&&!ut[o]&&(ut[o]=!0,console.warn(r(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,o,s)}},ct.spelling=function(e){return(t,n)=>(console.warn(`${n} is likely a misspelling of ${e}`),!0)};var lt={assertOptions:function(e,t,n){if("object"!=typeof e)throw new V("options must be an object",V.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let o=r.length;for(;o-- >0;){const s=r[o],i=t[s];if(i){const t=e[s],n=void 0===t||i(t,s,e);if(!0!==n)throw new V("option "+s+" must be "+n,V.ERR_BAD_OPTION_VALUE);continue}if(!0!==n)throw new V("Unknown option "+s,V.ERR_BAD_OPTION)}},validators:ct};const dt=lt.validators;class ft{constructor(e){this.defaults=e||{},this.interceptors={request:new ae,response:new ae}}async request(e,t){try{return await this._request(e,t)}catch(e){if(e instanceof Error){let t={};Error.captureStackTrace?Error.captureStackTrace(t):t=new Error;const n=t.stack?t.stack.replace(/^.+\n/,""):"";try{e.stack?n&&!String(e.stack).endsWith(n.replace(/^.+\n.+\n/,""))&&(e.stack+="\n"+n):e.stack=n}catch(e){}}throw e}}_request(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},t=Be(this.defaults,t);const{transitional:n,paramsSerializer:r,headers:o}=t;void 0!==n&&lt.assertOptions(n,{silentJSONParsing:dt.transitional(dt.boolean),forcedJSONParsing:dt.transitional(dt.boolean),clarifyTimeoutError:dt.transitional(dt.boolean)},!1),null!=r&&(W.isFunction(r)?t.paramsSerializer={serialize:r}:lt.assertOptions(r,{encode:dt.function,serialize:dt.function},!0)),void 0!==t.allowAbsoluteUrls||(void 0!==this.defaults.allowAbsoluteUrls?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),lt.assertOptions(t,{baseUrl:dt.spelling("baseURL"),withXsrfToken:dt.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();let s=o&&W.merge(o.common,o[t.method]);o&&W.forEach(["delete","get","head","post","put","patch","common"],e=>{delete o[e]}),t.headers=Ae.concat(s,o);const i=[];let a=!0;this.interceptors.request.forEach(function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(a=a&&e.synchronous,i.unshift(e.fulfilled,e.rejected))});const c=[];let u;this.interceptors.response.forEach(function(e){c.push(e.fulfilled,e.rejected)});let l,d=0;if(!a){const e=[it.bind(this),void 0];for(e.unshift(...i),e.push(...c),l=e.length,u=Promise.resolve(t);d<l;)u=u.then(e[d++],e[d++]);return u}l=i.length;let f=t;for(d=0;d<l;){const e=i[d++],t=i[d++];try{f=e(f)}catch(e){t.call(this,e);break}}try{u=it.call(this,f)}catch(e){return Promise.reject(e)}for(d=0,l=c.length;d<l;)u=u.then(c[d++],c[d++]);return u}getUri(e){return ie(Le((e=Be(this.defaults,e)).baseURL,e.url,e.allowAbsoluteUrls),e.params,e.paramsSerializer)}}W.forEach(["delete","get","head","options"],function(e){ft.prototype[e]=function(t,n){return this.request(Be(n||{},{method:e,url:t,data:(n||{}).data}))}}),W.forEach(["post","put","patch"],function(e){function t(t){return function(n,r,o){return this.request(Be(o||{},{method:e,headers:t?{"Content-Type":"multipart/form-data"}:{},url:n,data:r}))}}ft.prototype[e]=t(),ft.prototype[e+"Form"]=t(!0)});var ht=ft;class pt{constructor(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");let t;this.promise=new Promise(function(e){t=e});const n=this;this.promise.then(e=>{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null}),this.promise.then=e=>{let t;const r=new Promise(e=>{n.subscribe(e),t=e}).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e(function(e,r,o){n.reason||(n.reason=new Pe(e,r,o),t(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}toAbortSignal(){const e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let e;return{token:new pt(function(t){e=t}),cancel:e}}}var mt=pt;const gt={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(gt).forEach(([e,t])=>{gt[t]=e});var yt=gt;const wt=function e(t){const n=new ht(t),o=r(ht.prototype.request,n);return W.extend(o,ht.prototype,n,{allOwnKeys:!0}),W.extend(o,n,null,{allOwnKeys:!0}),o.create=function(n){return e(Be(t,n))},o}(we);wt.Axios=ht,wt.CanceledError=Pe,wt.CancelToken=mt,wt.isCancel=ve,wt.VERSION=at,wt.toFormData=te,wt.AxiosError=V,wt.Cancel=wt.CanceledError,wt.all=function(e){return Promise.all(e)},wt.spread=function(e){return function(t){return e.apply(null,t)}},wt.isAxiosError=function(e){return W.isObject(e)&&!0===e.isAxiosError},wt.mergeConfig=Be,wt.AxiosHeaders=Ae,wt.formToJSON=e=>ge(W.isHTMLForm(e)?new FormData(e):e),wt.getAdapter=ot,wt.HttpStatusCode=yt,wt.default=wt;var bt=wt;async function Et(e,{method:n="GET",data:r={},headers:o={},timeout:s=5e3}={}){return t()?"fetch"in window&&"AbortController"in window?async function(e,t){const{method:n="GET",data:r={},headers:o={},timeout:s=5e3}=t,i=new AbortController,a=setTimeout(()=>i.abort(),s),c={method:n.toUpperCase(),headers:{"Content-Type":"application/json",...o},signal:i.signal};"GET"!==c.method&&r&&(c.body=JSON.stringify(r));try{const t=await fetch(e,c);if(clearTimeout(a),!t.ok)return{code:t.status,msg:`HTTP请求失败: ${t.statusText}`,success:!1};try{return await t.json()}catch(e){return{code:-201,msg:"响应数据不是有效的JSON格式",success:!1}}}catch(e){return clearTimeout(a),"AbortError"===e.name?{code:-202,msg:`请求超时(${s}ms)`,success:!1}:{code:-203,msg:`网络请求失败: ${e.message}`,success:!1}}}(e,{method:n,data:r,headers:o,timeout:s}):async function(e,t){const{method:n="GET",data:r={},headers:o={},timeout:s=5e3}=t,i={url:e,method:n.toUpperCase(),headers:{"Content-Type":"application/json",...o},timeout:s,["GET"===n.toUpperCase()?"params":"data"]:r};try{return(await bt(i)).data}catch(e){return"ECONNABORTED"===e.code?{code:-202,msg:`请求超时(${s}ms)`,success:!1}:e.response?{code:e.response.status,msg:`HTTP请求失败: ${e.response.statusText}`,success:!1}:{code:-203,msg:`网络请求失败: ${e.message}`,success:!1}}}(e,{method:n,data:r,headers:o,timeout:s}):{code:-200,msg:"request方法只能在浏览器环境使用",success:!1}}const Ot={accessCodeKey:"accessCode",tokenKey:"scm_token",timeout:5e3,headers:{},tokenApi:"",refreshCodeApi:"",logoutApi:"",logOutUrl:"",storage:localStorage,oldPwdKey:"oldPwd",newPwdKey:"newPwd",changePasswordApi:"",sendCaptchaCodeApi:"",typeKey:"type",codeKey:"code"};let Rt=null;function St(){return{async init(e={}){try{Rt=function(e,t){if(!t)return{...e};const n={...e};for(const e in t)t.hasOwnProperty(e)&&(n[e]=t[e]);return n}(Ot,e),function(e){if("string"!=typeof e.accessCodeKey||""===e.accessCodeKey.trim())throw new Error("accessCodeKey必须是有效的字符串");if("string"!=typeof e.tokenKey||""===e.tokenKey.trim())throw new Error("tokenKey必须是有效的字符串");if(e.storage&&("function"!=typeof e.storage.setItem||"function"!=typeof e.storage.getItem))throw new Error("storage必须实现setItem和getItem方法")}(Rt);const r=function(e,n){if(!t())return null;const r=n||window.location.href,o=new URL(r);let s=o.searchParams.get(e);if(null!==s)return s;if(o.hash.includes("?")){const t=o.hash.split("?")[1];return new URLSearchParams(t).get(e)}return null}(Rt.accessCodeKey);if(!Rt.tokenApi)return{code:-100,msg:"缺少tokenApi配置",success:!1};if(r){const e=await Et(Rt.tokenApi,{method:"POST",data:{accessCode:r},headers:Rt.headers,timeout:Rt.timeout});return 0===e.code&&e.data&&(Rt.storage.setItem(Rt.tokenKey,e.data),function(e){if(!t())return;const n=new URL(window.location.href);let r,o;if(n.hash.includes("?")){const[t,s]=n.hash.split("?");if(r=new URLSearchParams(s),r.has(e)){r.delete(e);const s=r.toString()?`${t}?${r.toString()}`:t;n.hash=s,o=n.toString()}}else r=new URLSearchParams(n.search),r.has(e)&&(r.delete(e),n.search=r.toString(),o=n.toString());o&&o!==window.location.href&&window.location.replace(o)}(Rt.accessCodeKey)),e}return this.getToken()||t()&&Rt.logOutUrl&&(window.location.href=`${Rt.logOutUrl}?redirect_uri=${encodeURIComponent(n())}`),{code:0,msg:"初始化成功",success:!0}}catch(e){return{code:-100,msg:`初始化失败: ${e.message}`,success:!1}}},getToken:()=>Rt&&t()?Rt.storage.getItem(Rt.tokenKey):null,removeToken(){Rt&&t()&&Rt.storage.removeItem(Rt.tokenKey)},async logout(){if(!Rt)return{code:-101,msg:"请先调用init方法初始化",success:!1};if(!Rt.logoutApi)return{code:-102,msg:"未配置logoutApi",success:!1};const e=this.getToken();if(!e)return this.removeToken(),t()&&Rt.logOutUrl&&(window.location.href=`${Rt.logOutUrl}?redirect_uri=${encodeURIComponent(n())}`),{code:0,msg:"已成功清除token",success:!0};try{const r=await Et(Rt.logoutApi,{method:"POST",headers:{...Rt.headers,[Rt.tokenKey]:e},timeout:Rt.timeout});return this.removeToken(),t()&&Rt.logOutUrl&&(window.location.href=`${Rt.logOutUrl}?redirect_uri=${encodeURIComponent(n())}`),r}catch(e){return{code:-103,msg:`退出失败: ${e.message}`,success:!1}}},async toUrl(e,n="_self"){if(!Rt)return{code:-101,msg:"请先调用init方法初始化",success:!1};if(!e)return{code:-104,msg:"请提供跳转地址",success:!1};if(function(){const e=navigator.userAgent.toLowerCase(),t=navigator.platform,n=navigator.maxTouchPoints||0,r=/iphone|ipod/.test(e)&&!window.MSStream,o="iPad"===t||e.includes("macintosh")&&n>0&&!t.includes("Mac")&&!window.MSStream;return r||o}()&&(n="_self"),!["_self","_blank"].includes(n))return{code:-108,msg:'target参数必须是"_self"或"_blank"',success:!1};if(!Rt.refreshCodeApi)return{code:-105,msg:"未配置refreshCodeApi",success:!1};const r=this.getToken();if(!r){if(t()&&Rt.logOutUrl){const t=`${Rt.logOutUrl}?redirect_uri=${encodeURIComponent(e)}`;"_blank"===n?window.open(t,"_blank"):window.location.href=t}return{code:-106,msg:"未找到有效token",success:!1}}try{const o=await Et(Rt.refreshCodeApi,{method:"POST",headers:{...Rt.headers,[Rt.tokenKey]:r},timeout:Rt.timeout});if(0===o.code&&o.data&&t()){const t=new URL(e);t.searchParams.set(Rt.accessCodeKey,o.data);const r=t.toString();"_blank"===n?window.open(r,"_blank"):window.location.href=r}else{const t=`${Rt.logOutUrl}?redirect_uri=${encodeURIComponent(e)}`;"_blank"===n?window.open(t,"_blank"):window.location.href=t}return o}catch(t){const r=`${Rt.logOutUrl}?redirect_uri=${encodeURIComponent(e)}`;return"_blank"===n?window.open(r,"_blank"):window.location.href=r,{code:-107,msg:`跳转失败: ${t.message}`,success:!1}}},async getAccessCode(){if(!Rt)return{code:-101,msg:"请先调用init方法初始化",success:!1};const e=this.getToken();return e?Rt.refreshCodeApi?Et(Rt.refreshCodeApi,{method:"POST",headers:{...Rt.headers,[Rt.tokenKey]:e},timeout:Rt.timeout}):{code:-105,msg:"未配置refreshCodeApi",success:!1}:{code:-106,msg:"未找到有效token",success:!1}},getConfig:()=>({...Rt}),async changePassword(e={}){if(!e[Rt.oldPwdKey]&&"CAPTCHA"!==e[Rt.typeKey])return{code:-1,msg:"请输入旧密码",success:!1};if(!e[Rt.newPwdKey])return{code:-1,msg:"请输入新密码",success:!1};if("CAPTCHA"===e[Rt.typeKey]&&!e[Rt.codeKey])return{code:-1,msg:"请输入验证码",success:!1};const t=this.getToken();return Et(Rt.changePasswordApi,{method:"POST",headers:{...Rt.headers,[Rt.tokenKey]:t},timeout:Rt.timeout,data:{[Rt.oldPwdKey]:e[Rt.oldPwdKey],[Rt.newPwdKey]:e[Rt.newPwdKey],...e}})},async getPhoneCode(){const e=this.getToken();return Et(Rt.sendCaptchaCodeApi,{method:"GET",headers:{...Rt.headers,[Rt.tokenKey]:e},timeout:Rt.timeout})}}}const Tt=St();e.createSSO=St,e.default=Tt,e.lgsso=Tt,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).lgsso={})}(this,function(e){"use strict";function t(){return"undefined"!=typeof window&&"undefined"!=typeof document}function n(e,t){return function(){return e.apply(t,arguments)}}const{toString:r}=Object.prototype,{getPrototypeOf:o}=Object,{iterator:s,toStringTag:i}=Symbol,a=(c=Object.create(null),e=>{const t=r.call(e);return c[t]||(c[t]=t.slice(8,-1).toLowerCase())});var c;const u=e=>(e=e.toLowerCase(),t=>a(t)===e),l=e=>t=>typeof t===e,{isArray:d}=Array,f=l("undefined");function h(e){return null!==e&&!f(e)&&null!==e.constructor&&!f(e.constructor)&&g(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const p=u("ArrayBuffer");const m=l("string"),g=l("function"),y=l("number"),w=e=>null!==e&&"object"==typeof e,b=e=>{if("object"!==a(e))return!1;const t=o(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||i in e||s in e)},E=u("Date"),O=u("File"),R=u("Blob"),S=u("FileList"),T=u("URLSearchParams"),[A,v,C,P]=["ReadableStream","Request","Response","Headers"].map(u);function k(e,t,{allOwnKeys:n=!1}={}){if(null==e)return;let r,o;if("object"!=typeof e&&(e=[e]),d(e))for(r=0,o=e.length;r<o;r++)t.call(null,e[r],r,e);else{if(h(e))return;const o=n?Object.getOwnPropertyNames(e):Object.keys(e),s=o.length;let i;for(r=0;r<s;r++)i=o[r],t.call(null,e[i],i,e)}}function U(e,t){if(h(e))return null;t=t.toLowerCase();const n=Object.keys(e);let r,o=n.length;for(;o-- >0;)if(r=n[o],t===r.toLowerCase())return r;return null}const x="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,j=e=>!f(e)&&e!==x;const _=(N="undefined"!=typeof Uint8Array&&o(Uint8Array),e=>N&&e instanceof N);var N;const L=u("HTMLFormElement"),F=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),B=u("RegExp"),D=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};k(n,(n,o)=>{let s;!1!==(s=t(n,o,e))&&(r[o]=s||n)}),Object.defineProperties(e,r)};const K=u("AsyncFunction"),q=(I="function"==typeof setImmediate,M=g(x.postMessage),I?setImmediate:M?(z=`axios@${Math.random()}`,$=[],x.addEventListener("message",({source:e,data:t})=>{e===x&&t===z&&$.length&&$.shift()()},!1),e=>{$.push(e),x.postMessage(z,"*")}):e=>setTimeout(e));var I,M,z,$;const H="undefined"!=typeof queueMicrotask?queueMicrotask.bind(x):"undefined"!=typeof process&&process.nextTick||q;var J={isArray:d,isArrayBuffer:p,isBuffer:h,isFormData:e=>{let t;return e&&("function"==typeof FormData&&e instanceof FormData||g(e.append)&&("formdata"===(t=a(e))||"object"===t&&g(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){let t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&p(e.buffer),t},isString:m,isNumber:y,isBoolean:e=>!0===e||!1===e,isObject:w,isPlainObject:b,isEmptyObject:e=>{if(!w(e)||h(e))return!1;try{return 0===Object.keys(e).length&&Object.getPrototypeOf(e)===Object.prototype}catch(e){return!1}},isReadableStream:A,isRequest:v,isResponse:C,isHeaders:P,isUndefined:f,isDate:E,isFile:O,isBlob:R,isRegExp:B,isFunction:g,isStream:e=>w(e)&&g(e.pipe),isURLSearchParams:T,isTypedArray:_,isFileList:S,forEach:k,merge:function e(){const{caseless:t}=j(this)&&this||{},n={},r=(r,o)=>{const s=t&&U(n,o)||o;b(n[s])&&b(r)?n[s]=e(n[s],r):b(r)?n[s]=e({},r):d(r)?n[s]=r.slice():n[s]=r};for(let e=0,t=arguments.length;e<t;e++)arguments[e]&&k(arguments[e],r);return n},extend:(e,t,r,{allOwnKeys:o}={})=>(k(t,(t,o)=>{r&&g(t)?e[o]=n(t,r):e[o]=t},{allOwnKeys:o}),e),trim:e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""),stripBOM:e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),inherits:(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:(e,t,n,r)=>{let s,i,a;const c={};if(t=t||{},null==e)return t;do{for(s=Object.getOwnPropertyNames(e),i=s.length;i-- >0;)a=s[i],r&&!r(a,e,t)||c[a]||(t[a]=e[a],c[a]=!0);e=!1!==n&&o(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:a,kindOfTest:u,endsWith:(e,t,n)=>{e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return-1!==r&&r===n},toArray:e=>{if(!e)return null;if(d(e))return e;let t=e.length;if(!y(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},forEachEntry:(e,t)=>{const n=(e&&e[s]).call(e);let r;for(;(r=n.next())&&!r.done;){const n=r.value;t.call(e,n[0],n[1])}},matchAll:(e,t)=>{let n;const r=[];for(;null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:L,hasOwnProperty:F,hasOwnProp:F,reduceDescriptors:D,freezeMethods:e=>{D(e,(t,n)=>{if(g(e)&&-1!==["arguments","caller","callee"].indexOf(n))return!1;const r=e[n];g(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")}))})},toObjectSet:(e,t)=>{const n={},r=e=>{e.forEach(e=>{n[e]=!0})};return d(e)?r(e):r(String(e).split(t)),n},toCamelCase:e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(e,t,n){return t.toUpperCase()+n}),noop:()=>{},toFiniteNumber:(e,t)=>null!=e&&Number.isFinite(e=+e)?e:t,findKey:U,global:x,isContextDefined:j,isSpecCompliantForm:function(e){return!!(e&&g(e.append)&&"FormData"===e[i]&&e[s])},toJSONObject:e=>{const t=new Array(10),n=(e,r)=>{if(w(e)){if(t.indexOf(e)>=0)return;if(h(e))return e;if(!("toJSON"in e)){t[r]=e;const o=d(e)?[]:{};return k(e,(e,t)=>{const s=n(e,r+1);!f(s)&&(o[t]=s)}),t[r]=void 0,o}}return e};return n(e,0)},isAsyncFn:K,isThenable:e=>e&&(w(e)||g(e))&&g(e.then)&&g(e.catch),setImmediate:q,asap:H,isIterable:e=>null!=e&&g(e[s])};function W(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o,this.status=o.status?o.status:null)}J.inherits(W,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:J.toJSONObject(this.config),code:this.code,status:this.status}}});const V=W.prototype,G={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{G[e]={value:e}}),Object.defineProperties(W,G),Object.defineProperty(V,"isAxiosError",{value:!0}),W.from=(e,t,n,r,o,s)=>{const i=Object.create(V);return J.toFlatObject(e,i,function(e){return e!==Error.prototype},e=>"isAxiosError"!==e),W.call(i,e.message,t,n,r,o),i.cause=e,i.name=e.name,s&&Object.assign(i,s),i};function X(e){return J.isPlainObject(e)||J.isArray(e)}function Q(e){return J.endsWith(e,"[]")?e.slice(0,-2):e}function Z(e,t,n){return e?e.concat(t).map(function(e,t){return e=Q(e),!n&&t?"["+e+"]":e}).join(n?".":""):t}const Y=J.toFlatObject(J,{},null,function(e){return/^is[A-Z]/.test(e)});function ee(e,t,n){if(!J.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;const r=(n=J.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(e,t){return!J.isUndefined(t[e])})).metaTokens,o=n.visitor||u,s=n.dots,i=n.indexes,a=(n.Blob||"undefined"!=typeof Blob&&Blob)&&J.isSpecCompliantForm(t);if(!J.isFunction(o))throw new TypeError("visitor must be a function");function c(e){if(null===e)return"";if(J.isDate(e))return e.toISOString();if(J.isBoolean(e))return e.toString();if(!a&&J.isBlob(e))throw new W("Blob is not supported. Use a Buffer instead.");return J.isArrayBuffer(e)||J.isTypedArray(e)?a&&"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}function u(e,n,o){let a=e;if(e&&!o&&"object"==typeof e)if(J.endsWith(n,"{}"))n=r?n:n.slice(0,-2),e=JSON.stringify(e);else if(J.isArray(e)&&function(e){return J.isArray(e)&&!e.some(X)}(e)||(J.isFileList(e)||J.endsWith(n,"[]"))&&(a=J.toArray(e)))return n=Q(n),a.forEach(function(e,r){!J.isUndefined(e)&&null!==e&&t.append(!0===i?Z([n],r,s):null===i?n:n+"[]",c(e))}),!1;return!!X(e)||(t.append(Z(o,n,s),c(e)),!1)}const l=[],d=Object.assign(Y,{defaultVisitor:u,convertValue:c,isVisitable:X});if(!J.isObject(e))throw new TypeError("data must be an object");return function e(n,r){if(!J.isUndefined(n)){if(-1!==l.indexOf(n))throw Error("Circular reference detected in "+r.join("."));l.push(n),J.forEach(n,function(n,s){!0===(!(J.isUndefined(n)||null===n)&&o.call(t,n,J.isString(s)?s.trim():s,r,d))&&e(n,r?r.concat(s):[s])}),l.pop()}}(e),t}function te(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(e){return t[e]})}function ne(e,t){this._pairs=[],e&&ee(e,this,t)}const re=ne.prototype;function oe(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function se(e,t,n){if(!t)return e;const r=n&&n.encode||oe;J.isFunction(n)&&(n={serialize:n});const o=n&&n.serialize;let s;if(s=o?o(t,n):J.isURLSearchParams(t)?t.toString():new ne(t,n).toString(r),s){const t=e.indexOf("#");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+s}return e}re.append=function(e,t){this._pairs.push([e,t])},re.toString=function(e){const t=e?function(t){return e.call(this,t,te)}:te;return this._pairs.map(function(e){return t(e[0])+"="+t(e[1])},"").join("&")};var ie=class{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){J.forEach(this.handlers,function(t){null!==t&&e(t)})}},ae={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},ce={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:ne,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]};const ue="undefined"!=typeof window&&"undefined"!=typeof document,le="object"==typeof navigator&&navigator||void 0,de=ue&&(!le||["ReactNative","NativeScript","NS"].indexOf(le.product)<0),fe="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,he=ue&&window.location.href||"http://localhost";var pe={...Object.freeze({__proto__:null,hasBrowserEnv:ue,hasStandardBrowserEnv:de,hasStandardBrowserWebWorkerEnv:fe,navigator:le,origin:he}),...ce};function me(e){function t(e,n,r,o){let s=e[o++];if("__proto__"===s)return!0;const i=Number.isFinite(+s),a=o>=e.length;if(s=!s&&J.isArray(r)?r.length:s,a)return J.hasOwnProp(r,s)?r[s]=[r[s],n]:r[s]=n,!i;r[s]&&J.isObject(r[s])||(r[s]=[]);return t(e,n,r[s],o)&&J.isArray(r[s])&&(r[s]=function(e){const t={},n=Object.keys(e);let r;const o=n.length;let s;for(r=0;r<o;r++)s=n[r],t[s]=e[s];return t}(r[s])),!i}if(J.isFormData(e)&&J.isFunction(e.entries)){const n={};return J.forEachEntry(e,(e,r)=>{t(function(e){return J.matchAll(/\w+|\[(\w*)]/g,e).map(e=>"[]"===e[0]?"":e[1]||e[0])}(e),r,n,0)}),n}return null}const ge={transitional:ae,adapter:["xhr","http","fetch"],transformRequest:[function(e,t){const n=t.getContentType()||"",r=n.indexOf("application/json")>-1,o=J.isObject(e);o&&J.isHTMLForm(e)&&(e=new FormData(e));if(J.isFormData(e))return r?JSON.stringify(me(e)):e;if(J.isArrayBuffer(e)||J.isBuffer(e)||J.isStream(e)||J.isFile(e)||J.isBlob(e)||J.isReadableStream(e))return e;if(J.isArrayBufferView(e))return e.buffer;if(J.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let s;if(o){if(n.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return ee(e,new pe.classes.URLSearchParams,{visitor:function(e,t,n,r){return pe.isNode&&J.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)},...t})}(e,this.formSerializer).toString();if((s=J.isFileList(e))||n.indexOf("multipart/form-data")>-1){const t=this.env&&this.env.FormData;return ee(s?{"files[]":e}:e,t&&new t,this.formSerializer)}}return o||r?(t.setContentType("application/json",!1),function(e,t,n){if(J.isString(e))try{return(t||JSON.parse)(e),J.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){const t=this.transitional||ge.transitional,n=t&&t.forcedJSONParsing,r="json"===this.responseType;if(J.isResponse(e)||J.isReadableStream(e))return e;if(e&&J.isString(e)&&(n&&!this.responseType||r)){const n=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw W.from(e,W.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:pe.classes.FormData,Blob:pe.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};J.forEach(["delete","get","head","post","put","patch"],e=>{ge.headers[e]={}});var ye=ge;const we=J.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]);const be=Symbol("internals");function Ee(e){return e&&String(e).trim().toLowerCase()}function Oe(e){return!1===e||null==e?e:J.isArray(e)?e.map(Oe):String(e)}function Re(e,t,n,r,o){return J.isFunction(r)?r.call(this,t,n):(o&&(t=n),J.isString(t)?J.isString(r)?-1!==t.indexOf(r):J.isRegExp(r)?r.test(t):void 0:void 0)}class Se{constructor(e){e&&this.set(e)}set(e,t,n){const r=this;function o(e,t,n){const o=Ee(t);if(!o)throw new Error("header name must be a non-empty string");const s=J.findKey(r,o);(!s||void 0===r[s]||!0===n||void 0===n&&!1!==r[s])&&(r[s||t]=Oe(e))}const s=(e,t)=>J.forEach(e,(e,n)=>o(e,n,t));if(J.isPlainObject(e)||e instanceof this.constructor)s(e,t);else if(J.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))s((e=>{const t={};let n,r,o;return e&&e.split("\n").forEach(function(e){o=e.indexOf(":"),n=e.substring(0,o).trim().toLowerCase(),r=e.substring(o+1).trim(),!n||t[n]&&we[n]||("set-cookie"===n?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t})(e),t);else if(J.isObject(e)&&J.isIterable(e)){let n,r,o={};for(const t of e){if(!J.isArray(t))throw TypeError("Object iterator must return a key-value pair");o[r=t[0]]=(n=o[r])?J.isArray(n)?[...n,t[1]]:[n,t[1]]:t[1]}s(o,t)}else null!=e&&o(t,e,n);return this}get(e,t){if(e=Ee(e)){const n=J.findKey(this,e);if(n){const e=this[n];if(!t)return e;if(!0===t)return function(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}(e);if(J.isFunction(t))return t.call(this,e,n);if(J.isRegExp(t))return t.exec(e);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,t){if(e=Ee(e)){const n=J.findKey(this,e);return!(!n||void 0===this[n]||t&&!Re(0,this[n],n,t))}return!1}delete(e,t){const n=this;let r=!1;function o(e){if(e=Ee(e)){const o=J.findKey(n,e);!o||t&&!Re(0,n[o],o,t)||(delete n[o],r=!0)}}return J.isArray(e)?e.forEach(o):o(e),r}clear(e){const t=Object.keys(this);let n=t.length,r=!1;for(;n--;){const o=t[n];e&&!Re(0,this[o],o,e,!0)||(delete this[o],r=!0)}return r}normalize(e){const t=this,n={};return J.forEach(this,(r,o)=>{const s=J.findKey(n,o);if(s)return t[s]=Oe(r),void delete t[o];const i=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(e,t,n)=>t.toUpperCase()+n)}(o):String(o).trim();i!==o&&delete t[o],t[i]=Oe(r),n[i]=!0}),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const t=Object.create(null);return J.forEach(this,(n,r)=>{null!=n&&!1!==n&&(t[r]=e&&J.isArray(n)?n.join(", "):n)}),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([e,t])=>e+": "+t).join("\n")}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...t){const n=new this(e);return t.forEach(e=>n.set(e)),n}static accessor(e){const t=(this[be]=this[be]={accessors:{}}).accessors,n=this.prototype;function r(e){const r=Ee(e);t[r]||(!function(e,t){const n=J.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(e,n,o){return this[r].call(this,t,e,n,o)},configurable:!0})})}(n,e),t[r]=!0)}return J.isArray(e)?e.forEach(r):r(e),this}}Se.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),J.reduceDescriptors(Se.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(e){this[n]=e}}}),J.freezeMethods(Se);var Te=Se;function Ae(e,t){const n=this||ye,r=t||n,o=Te.from(r.headers);let s=r.data;return J.forEach(e,function(e){s=e.call(n,s,o.normalize(),t?t.status:void 0)}),o.normalize(),s}function ve(e){return!(!e||!e.__CANCEL__)}function Ce(e,t,n){W.call(this,null==e?"canceled":e,W.ERR_CANCELED,t,n),this.name="CanceledError"}function Pe(e,t,n){const r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(new W("Request failed with status code "+n.status,[W.ERR_BAD_REQUEST,W.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n)):e(n)}J.inherits(Ce,W,{__CANCEL__:!0});const ke=(e,t,n=3)=>{let r=0;const o=function(e,t){e=e||10;const n=new Array(e),r=new Array(e);let o,s=0,i=0;return t=void 0!==t?t:1e3,function(a){const c=Date.now(),u=r[i];o||(o=c),n[s]=a,r[s]=c;let l=i,d=0;for(;l!==s;)d+=n[l++],l%=e;if(s=(s+1)%e,s===i&&(i=(i+1)%e),c-o<t)return;const f=u&&c-u;return f?Math.round(1e3*d/f):void 0}}(50,250);return function(e,t){let n,r,o=0,s=1e3/t;const i=(t,s=Date.now())=>{o=s,n=null,r&&(clearTimeout(r),r=null),e(...t)};return[(...e)=>{const t=Date.now(),a=t-o;a>=s?i(e,t):(n=e,r||(r=setTimeout(()=>{r=null,i(n)},s-a)))},()=>n&&i(n)]}(n=>{const s=n.loaded,i=n.lengthComputable?n.total:void 0,a=s-r,c=o(a);r=s;e({loaded:s,total:i,progress:i?s/i:void 0,bytes:a,rate:c||void 0,estimated:c&&i&&s<=i?(i-s)/c:void 0,event:n,lengthComputable:null!=i,[t?"download":"upload"]:!0})},n)},Ue=(e,t)=>{const n=null!=e;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},xe=e=>(...t)=>J.asap(()=>e(...t));var je=pe.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,pe.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(pe.origin),pe.navigator&&/(msie|trident)/i.test(pe.navigator.userAgent)):()=>!0,_e=pe.hasStandardBrowserEnv?{write(e,t,n,r,o,s){const i=[e+"="+encodeURIComponent(t)];J.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),J.isString(r)&&i.push("path="+r),J.isString(o)&&i.push("domain="+o),!0===s&&i.push("secure"),document.cookie=i.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read:()=>null,remove(){}};function Ne(e,t,n){let r=!/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t);return e&&(r||0==n)?function(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}(e,t):t}const Le=e=>e instanceof Te?{...e}:e;function Fe(e,t){t=t||{};const n={};function r(e,t,n,r){return J.isPlainObject(e)&&J.isPlainObject(t)?J.merge.call({caseless:r},e,t):J.isPlainObject(t)?J.merge({},t):J.isArray(t)?t.slice():t}function o(e,t,n,o){return J.isUndefined(t)?J.isUndefined(e)?void 0:r(void 0,e,0,o):r(e,t,0,o)}function s(e,t){if(!J.isUndefined(t))return r(void 0,t)}function i(e,t){return J.isUndefined(t)?J.isUndefined(e)?void 0:r(void 0,e):r(void 0,t)}function a(n,o,s){return s in t?r(n,o):s in e?r(void 0,n):void 0}const c={url:s,method:s,data:s,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:a,headers:(e,t,n)=>o(Le(e),Le(t),0,!0)};return J.forEach(Object.keys({...e,...t}),function(r){const s=c[r]||o,i=s(e[r],t[r],r);J.isUndefined(i)&&s!==a||(n[r]=i)}),n}var Be=e=>{const t=Fe({},e);let n,{data:r,withXSRFToken:o,xsrfHeaderName:s,xsrfCookieName:i,headers:a,auth:c}=t;if(t.headers=a=Te.from(a),t.url=se(Ne(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),c&&a.set("Authorization","Basic "+btoa((c.username||"")+":"+(c.password?unescape(encodeURIComponent(c.password)):""))),J.isFormData(r))if(pe.hasStandardBrowserEnv||pe.hasStandardBrowserWebWorkerEnv)a.setContentType(void 0);else if(!1!==(n=a.getContentType())){const[e,...t]=n?n.split(";").map(e=>e.trim()).filter(Boolean):[];a.setContentType([e||"multipart/form-data",...t].join("; "))}if(pe.hasStandardBrowserEnv&&(o&&J.isFunction(o)&&(o=o(t)),o||!1!==o&&je(t.url))){const e=s&&i&&_e.read(i);e&&a.set(s,e)}return t};var De="undefined"!=typeof XMLHttpRequest&&function(e){return new Promise(function(t,n){const r=Be(e);let o=r.data;const s=Te.from(r.headers).normalize();let i,a,c,u,l,{responseType:d,onUploadProgress:f,onDownloadProgress:h}=r;function p(){u&&u(),l&&l(),r.cancelToken&&r.cancelToken.unsubscribe(i),r.signal&&r.signal.removeEventListener("abort",i)}let m=new XMLHttpRequest;function g(){if(!m)return;const r=Te.from("getAllResponseHeaders"in m&&m.getAllResponseHeaders());Pe(function(e){t(e),p()},function(e){n(e),p()},{data:d&&"text"!==d&&"json"!==d?m.response:m.responseText,status:m.status,statusText:m.statusText,headers:r,config:e,request:m}),m=null}m.open(r.method.toUpperCase(),r.url,!0),m.timeout=r.timeout,"onloadend"in m?m.onloadend=g:m.onreadystatechange=function(){m&&4===m.readyState&&(0!==m.status||m.responseURL&&0===m.responseURL.indexOf("file:"))&&setTimeout(g)},m.onabort=function(){m&&(n(new W("Request aborted",W.ECONNABORTED,e,m)),m=null)},m.onerror=function(){n(new W("Network Error",W.ERR_NETWORK,e,m)),m=null},m.ontimeout=function(){let t=r.timeout?"timeout of "+r.timeout+"ms exceeded":"timeout exceeded";const o=r.transitional||ae;r.timeoutErrorMessage&&(t=r.timeoutErrorMessage),n(new W(t,o.clarifyTimeoutError?W.ETIMEDOUT:W.ECONNABORTED,e,m)),m=null},void 0===o&&s.setContentType(null),"setRequestHeader"in m&&J.forEach(s.toJSON(),function(e,t){m.setRequestHeader(t,e)}),J.isUndefined(r.withCredentials)||(m.withCredentials=!!r.withCredentials),d&&"json"!==d&&(m.responseType=r.responseType),h&&([c,l]=ke(h,!0),m.addEventListener("progress",c)),f&&m.upload&&([a,u]=ke(f),m.upload.addEventListener("progress",a),m.upload.addEventListener("loadend",u)),(r.cancelToken||r.signal)&&(i=t=>{m&&(n(!t||t.type?new Ce(null,e,m):t),m.abort(),m=null)},r.cancelToken&&r.cancelToken.subscribe(i),r.signal&&(r.signal.aborted?i():r.signal.addEventListener("abort",i)));const y=function(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}(r.url);y&&-1===pe.protocols.indexOf(y)?n(new W("Unsupported protocol "+y+":",W.ERR_BAD_REQUEST,e)):m.send(o||null)})};var Ke=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let n,r=new AbortController;const o=function(e){if(!n){n=!0,i();const t=e instanceof Error?e:this.reason;r.abort(t instanceof W?t:new Ce(t instanceof Error?t.message:t))}};let s=t&&setTimeout(()=>{s=null,o(new W(`timeout ${t} of ms exceeded`,W.ETIMEDOUT))},t);const i=()=>{e&&(s&&clearTimeout(s),s=null,e.forEach(e=>{e.unsubscribe?e.unsubscribe(o):e.removeEventListener("abort",o)}),e=null)};e.forEach(e=>e.addEventListener("abort",o));const{signal:a}=r;return a.unsubscribe=()=>J.asap(i),a}};const qe=function*(e,t){let n=e.byteLength;if(!t||n<t)return void(yield e);let r,o=0;for(;o<n;)r=o+t,yield e.slice(o,r),o=r},Ie=async function*(e){if(e[Symbol.asyncIterator])return void(yield*e);const t=e.getReader();try{for(;;){const{done:e,value:n}=await t.read();if(e)break;yield n}}finally{await t.cancel()}},Me=(e,t,n,r)=>{const o=async function*(e,t){for await(const n of Ie(e))yield*qe(n,t)}(e,t);let s,i=0,a=e=>{s||(s=!0,r&&r(e))};return new ReadableStream({async pull(e){try{const{done:t,value:r}=await o.next();if(t)return a(),void e.close();let s=r.byteLength;if(n){let e=i+=s;n(e)}e.enqueue(new Uint8Array(r))}catch(e){throw a(e),e}},cancel:e=>(a(e),o.return())},{highWaterMark:2})},ze="function"==typeof fetch&&"function"==typeof Request&&"function"==typeof Response,$e=ze&&"function"==typeof ReadableStream,He=ze&&("function"==typeof TextEncoder?(Je=new TextEncoder,e=>Je.encode(e)):async e=>new Uint8Array(await new Response(e).arrayBuffer()));var Je;const We=(e,...t)=>{try{return!!e(...t)}catch(e){return!1}},Ve=$e&&We(()=>{let e=!1;const t=new Request(pe.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t}),Ge=$e&&We(()=>J.isReadableStream(new Response("").body)),Xe={stream:Ge&&(e=>e.body)};var Qe;ze&&(Qe=new Response,["text","arrayBuffer","blob","formData","stream"].forEach(e=>{!Xe[e]&&(Xe[e]=J.isFunction(Qe[e])?t=>t[e]():(t,n)=>{throw new W(`Response type '${e}' is not supported`,W.ERR_NOT_SUPPORT,n)})}));const Ze=async(e,t)=>{const n=J.toFiniteNumber(e.getContentLength());return null==n?(async e=>{if(null==e)return 0;if(J.isBlob(e))return e.size;if(J.isSpecCompliantForm(e)){const t=new Request(pe.origin,{method:"POST",body:e});return(await t.arrayBuffer()).byteLength}return J.isArrayBufferView(e)||J.isArrayBuffer(e)?e.byteLength:(J.isURLSearchParams(e)&&(e+=""),J.isString(e)?(await He(e)).byteLength:void 0)})(t):n};var Ye=ze&&(async e=>{let{url:t,method:n,data:r,signal:o,cancelToken:s,timeout:i,onDownloadProgress:a,onUploadProgress:c,responseType:u,headers:l,withCredentials:d="same-origin",fetchOptions:f}=Be(e);u=u?(u+"").toLowerCase():"text";let h,p=Ke([o,s&&s.toAbortSignal()],i);const m=p&&p.unsubscribe&&(()=>{p.unsubscribe()});let g;try{if(c&&Ve&&"get"!==n&&"head"!==n&&0!==(g=await Ze(l,r))){let e,n=new Request(t,{method:"POST",body:r,duplex:"half"});if(J.isFormData(r)&&(e=n.headers.get("content-type"))&&l.setContentType(e),n.body){const[e,t]=Ue(g,ke(xe(c)));r=Me(n.body,65536,e,t)}}J.isString(d)||(d=d?"include":"omit");const o="credentials"in Request.prototype;h=new Request(t,{...f,signal:p,method:n.toUpperCase(),headers:l.normalize().toJSON(),body:r,duplex:"half",credentials:o?d:void 0});let s=await fetch(h,f);const i=Ge&&("stream"===u||"response"===u);if(Ge&&(a||i&&m)){const e={};["status","statusText","headers"].forEach(t=>{e[t]=s[t]});const t=J.toFiniteNumber(s.headers.get("content-length")),[n,r]=a&&Ue(t,ke(xe(a),!0))||[];s=new Response(Me(s.body,65536,n,()=>{r&&r(),m&&m()}),e)}u=u||"text";let y=await Xe[J.findKey(Xe,u)||"text"](s,e);return!i&&m&&m(),await new Promise((t,n)=>{Pe(t,n,{data:y,headers:Te.from(s.headers),status:s.status,statusText:s.statusText,config:e,request:h})})}catch(t){if(m&&m(),t&&"TypeError"===t.name&&/Load failed|fetch/i.test(t.message))throw Object.assign(new W("Network Error",W.ERR_NETWORK,e,h),{cause:t.cause||t});throw W.from(t,t&&t.code,e,h)}});const et={http:null,xhr:De,fetch:Ye};J.forEach(et,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch(e){}Object.defineProperty(e,"adapterName",{value:t})}});const tt=e=>`- ${e}`,nt=e=>J.isFunction(e)||null===e||!1===e;var rt=e=>{e=J.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let s=0;s<t;s++){let t;if(n=e[s],r=n,!nt(n)&&(r=et[(t=String(n)).toLowerCase()],void 0===r))throw new W(`Unknown adapter '${t}'`);if(r)break;o[t||"#"+s]=r}if(!r){const e=Object.entries(o).map(([e,t])=>`adapter ${e} `+(!1===t?"is not supported by the environment":"is not available in the build"));throw new W("There is no suitable adapter to dispatch the request "+(t?e.length>1?"since :\n"+e.map(tt).join("\n"):" "+tt(e[0]):"as no adapter specified"),"ERR_NOT_SUPPORT")}return r};function ot(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ce(null,e)}function st(e){ot(e),e.headers=Te.from(e.headers),e.data=Ae.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1);return rt(e.adapter||ye.adapter)(e).then(function(t){return ot(e),t.data=Ae.call(e,e.transformResponse,t),t.headers=Te.from(t.headers),t},function(t){return ve(t)||(ot(e),t&&t.response&&(t.response.data=Ae.call(e,e.transformResponse,t.response),t.response.headers=Te.from(t.response.headers))),Promise.reject(t)})}const it="1.11.0",at={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{at[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}});const ct={};at.transitional=function(e,t,n){function r(e,t){return"[Axios v"+it+"] Transitional option '"+e+"'"+t+(n?". "+n:"")}return(n,o,s)=>{if(!1===e)throw new W(r(o," has been removed"+(t?" in "+t:"")),W.ERR_DEPRECATED);return t&&!ct[o]&&(ct[o]=!0,console.warn(r(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,o,s)}},at.spelling=function(e){return(t,n)=>(console.warn(`${n} is likely a misspelling of ${e}`),!0)};var ut={assertOptions:function(e,t,n){if("object"!=typeof e)throw new W("options must be an object",W.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let o=r.length;for(;o-- >0;){const s=r[o],i=t[s];if(i){const t=e[s],n=void 0===t||i(t,s,e);if(!0!==n)throw new W("option "+s+" must be "+n,W.ERR_BAD_OPTION_VALUE);continue}if(!0!==n)throw new W("Unknown option "+s,W.ERR_BAD_OPTION)}},validators:at};const lt=ut.validators;class dt{constructor(e){this.defaults=e||{},this.interceptors={request:new ie,response:new ie}}async request(e,t){try{return await this._request(e,t)}catch(e){if(e instanceof Error){let t={};Error.captureStackTrace?Error.captureStackTrace(t):t=new Error;const n=t.stack?t.stack.replace(/^.+\n/,""):"";try{e.stack?n&&!String(e.stack).endsWith(n.replace(/^.+\n.+\n/,""))&&(e.stack+="\n"+n):e.stack=n}catch(e){}}throw e}}_request(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},t=Fe(this.defaults,t);const{transitional:n,paramsSerializer:r,headers:o}=t;void 0!==n&&ut.assertOptions(n,{silentJSONParsing:lt.transitional(lt.boolean),forcedJSONParsing:lt.transitional(lt.boolean),clarifyTimeoutError:lt.transitional(lt.boolean)},!1),null!=r&&(J.isFunction(r)?t.paramsSerializer={serialize:r}:ut.assertOptions(r,{encode:lt.function,serialize:lt.function},!0)),void 0!==t.allowAbsoluteUrls||(void 0!==this.defaults.allowAbsoluteUrls?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),ut.assertOptions(t,{baseUrl:lt.spelling("baseURL"),withXsrfToken:lt.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();let s=o&&J.merge(o.common,o[t.method]);o&&J.forEach(["delete","get","head","post","put","patch","common"],e=>{delete o[e]}),t.headers=Te.concat(s,o);const i=[];let a=!0;this.interceptors.request.forEach(function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(a=a&&e.synchronous,i.unshift(e.fulfilled,e.rejected))});const c=[];let u;this.interceptors.response.forEach(function(e){c.push(e.fulfilled,e.rejected)});let l,d=0;if(!a){const e=[st.bind(this),void 0];for(e.unshift(...i),e.push(...c),l=e.length,u=Promise.resolve(t);d<l;)u=u.then(e[d++],e[d++]);return u}l=i.length;let f=t;for(d=0;d<l;){const e=i[d++],t=i[d++];try{f=e(f)}catch(e){t.call(this,e);break}}try{u=st.call(this,f)}catch(e){return Promise.reject(e)}for(d=0,l=c.length;d<l;)u=u.then(c[d++],c[d++]);return u}getUri(e){return se(Ne((e=Fe(this.defaults,e)).baseURL,e.url,e.allowAbsoluteUrls),e.params,e.paramsSerializer)}}J.forEach(["delete","get","head","options"],function(e){dt.prototype[e]=function(t,n){return this.request(Fe(n||{},{method:e,url:t,data:(n||{}).data}))}}),J.forEach(["post","put","patch"],function(e){function t(t){return function(n,r,o){return this.request(Fe(o||{},{method:e,headers:t?{"Content-Type":"multipart/form-data"}:{},url:n,data:r}))}}dt.prototype[e]=t(),dt.prototype[e+"Form"]=t(!0)});var ft=dt;class ht{constructor(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");let t;this.promise=new Promise(function(e){t=e});const n=this;this.promise.then(e=>{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null}),this.promise.then=e=>{let t;const r=new Promise(e=>{n.subscribe(e),t=e}).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e(function(e,r,o){n.reason||(n.reason=new Ce(e,r,o),t(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}toAbortSignal(){const e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let e;return{token:new ht(function(t){e=t}),cancel:e}}}var pt=ht;const mt={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(mt).forEach(([e,t])=>{mt[t]=e});var gt=mt;const yt=function e(t){const r=new ft(t),o=n(ft.prototype.request,r);return J.extend(o,ft.prototype,r,{allOwnKeys:!0}),J.extend(o,r,null,{allOwnKeys:!0}),o.create=function(n){return e(Fe(t,n))},o}(ye);yt.Axios=ft,yt.CanceledError=Ce,yt.CancelToken=pt,yt.isCancel=ve,yt.VERSION=it,yt.toFormData=ee,yt.AxiosError=W,yt.Cancel=yt.CanceledError,yt.all=function(e){return Promise.all(e)},yt.spread=function(e){return function(t){return e.apply(null,t)}},yt.isAxiosError=function(e){return J.isObject(e)&&!0===e.isAxiosError},yt.mergeConfig=Fe,yt.AxiosHeaders=Te,yt.formToJSON=e=>me(J.isHTMLForm(e)?new FormData(e):e),yt.getAdapter=rt,yt.HttpStatusCode=gt,yt.default=yt;var wt=yt;async function bt(e,{method:n="GET",data:r={},headers:o={},timeout:s=5e3}={}){return t()?"fetch"in window&&"AbortController"in window?async function(e,t){const{method:n="GET",data:r={},headers:o={},timeout:s=5e3}=t,i=new AbortController,a=setTimeout(()=>i.abort(),s),c={method:n.toUpperCase(),headers:{"Content-Type":"application/json",...o},signal:i.signal};"GET"!==c.method&&r&&(c.body=JSON.stringify(r));try{const t=await fetch(e,c);if(clearTimeout(a),!t.ok)return{code:t.status,msg:`HTTP请求失败: ${t.statusText}`,success:!1};try{return await t.json()}catch(e){return{code:-201,msg:"响应数据不是有效的JSON格式",success:!1}}}catch(e){return clearTimeout(a),"AbortError"===e.name?{code:-202,msg:`请求超时(${s}ms)`,success:!1}:{code:-203,msg:`网络请求失败: ${e.message}`,success:!1}}}(e,{method:n,data:r,headers:o,timeout:s}):async function(e,t){const{method:n="GET",data:r={},headers:o={},timeout:s=5e3}=t,i={url:e,method:n.toUpperCase(),headers:{"Content-Type":"application/json",...o},timeout:s,["GET"===n.toUpperCase()?"params":"data"]:r};try{return(await wt(i)).data}catch(e){return"ECONNABORTED"===e.code?{code:-202,msg:`请求超时(${s}ms)`,success:!1}:e.response?{code:e.response.status,msg:`HTTP请求失败: ${e.response.statusText}`,success:!1}:{code:-203,msg:`网络请求失败: ${e.message}`,success:!1}}}(e,{method:n,data:r,headers:o,timeout:s}):{code:-200,msg:"request方法只能在浏览器环境使用",success:!1}}const Et={accessCodeKey:"accessCode",tokenKey:"scm_token",timeout:5e3,headers:{},tokenApi:"",refreshCodeApi:"",logoutApi:"",logOutUrl:"",storage:localStorage,oldPwdKey:"oldPwd",newPwdKey:"newPwd",changePasswordApi:"",sendCaptchaCodeApi:"",typeKey:"type",codeKey:"code"};let Ot=null;function Rt(){return{async init(e={}){try{Ot=function(e,t){if(!t)return{...e};const n={...e};for(const e in t)t.hasOwnProperty(e)&&(n[e]=t[e]);return n}(Et,e),function(e){if("string"!=typeof e.accessCodeKey||""===e.accessCodeKey.trim())throw new Error("accessCodeKey必须是有效的字符串");if("string"!=typeof e.tokenKey||""===e.tokenKey.trim())throw new Error("tokenKey必须是有效的字符串");if(e.storage&&("function"!=typeof e.storage.setItem||"function"!=typeof e.storage.getItem))throw new Error("storage必须实现setItem和getItem方法")}(Ot);const n=function(e,n){if(!t())return null;const r=n||window.location.href,o=new URL(r);let s=o.searchParams.get(e);if(null!==s)return s;if(o.hash.includes("?")){const t=o.hash.split("?")[1];return new URLSearchParams(t).get(e)}return null}(Ot.accessCodeKey);if(!Ot.tokenApi)return{code:-100,msg:"缺少tokenApi配置",success:!1};if(n){const e=await bt(Ot.tokenApi,{method:"POST",data:{accessCode:n},headers:Ot.headers,timeout:Ot.timeout});return 0===e.code&&e.data&&(Ot.storage.setItem(Ot.tokenKey,e.data),function(e){if(!t())return;const n=new URL(window.location.href);let r,o;if(n.hash.includes("?")){const[t,s]=n.hash.split("?");if(r=new URLSearchParams(s),r.has(e)){r.delete(e);const s=r.toString()?`${t}?${r.toString()}`:t;n.hash=s,o=n.toString()}}else r=new URLSearchParams(n.search),r.has(e)&&(r.delete(e),n.search=r.toString(),o=n.toString());o&&o!==window.location.href&&window.location.replace(o)}(Ot.accessCodeKey)),e}return this.getToken()||t()&&Ot.logOutUrl&&(window.location.href=`${Ot.logOutUrl}?redirect_uri=${encodeURIComponent(t()?window.location.href:"")}`),{code:0,msg:"初始化成功",success:!0}}catch(e){return{code:-100,msg:`初始化失败: ${e.message}`,success:!1}}},getToken:()=>Ot&&t()?Ot.storage.getItem(Ot.tokenKey):null,removeToken(){Ot&&t()&&Ot.storage.removeItem(Ot.tokenKey)},async logout(){if(!Ot)return{code:-101,msg:"请先调用init方法初始化",success:!1};const e=()=>{if(!Ot.logOutUrl||!t())return"";const e=window.location.href,n=encodeURIComponent(e);return`${Ot.logOutUrl}?redirect_uri=${n}`};if(!Ot.logoutApi){this.removeToken();const t=e();return t&&(window.location.href=t),{code:-102,msg:"未配置logoutApi",success:!1}}const n=this.getToken();if(!n){this.removeToken();const t=e();return t&&(window.location.href=t),{code:0,msg:"已成功清除token",success:!0}}try{const t=await bt(Ot.logoutApi,{method:"POST",headers:{...Ot.headers,[Ot.tokenKey]:n},timeout:Ot.timeout});this.removeToken();const r=e();return r&&(window.location.href=r),t}catch(t){this.removeToken();const n=e();return n&&(window.location.href=n),{code:-103,msg:`退出失败: ${t.message}`,success:!1}}},async toUrl(e,n="_self"){if(!Ot)return{code:-101,msg:"请先调用init方法初始化",success:!1};if(!e)return{code:-104,msg:"请提供跳转地址",success:!1};const r=function(){const e=navigator.userAgent.toLowerCase(),t=navigator.platform.toLowerCase(),n=navigator.maxTouchPoints||0,r=screen.width/screen.height,o=/iphone|ipod/.test(e)&&!window.MSStream,s=t.includes("ipad")||e.includes("macintosh")&&n>0&&!t.includes("mac")&&!window.MSStream||e.includes("ipados")||n>=5&&!t.includes("android")&&r>.7&&r<1.4;return o||s}()?"_self":n;if(!["_self","_blank"].includes(r))return{code:-108,msg:'target参数必须是"_self"或"_blank"',success:!1};const o=e=>{if(!Ot.logOutUrl)return"";const t=encodeURIComponent(e);return`${Ot.logOutUrl}?redirect_uri=${t}`};if(!Ot.refreshCodeApi)return{code:-105,msg:"未配置refreshCodeApi",success:!1};const s=this.getToken();if(!s){if(t()&&Ot.logOutUrl){const t=o(e);"_blank"===r?window.open(t,"_blank"):window.location.href=t}return{code:-106,msg:"未找到有效token",success:!1}}try{const n=await bt(Ot.refreshCodeApi,{method:"POST",headers:{...Ot.headers,[Ot.tokenKey]:s},timeout:Ot.timeout});if(0===n.code&&n.data&&t()){const t=new URL(e);t.searchParams.set(Ot.accessCodeKey,n.data);const o=t.toString();"_blank"===r?window.open(o,"_blank"):window.location.href=o}else if(t()&&Ot.logOutUrl){const t=o(e);"_blank"===r?window.open(t,"_blank"):window.location.href=t}return n}catch(n){if(t()&&Ot.logOutUrl){const t=o(e);"_blank"===r?window.open(t,"_blank"):window.location.href=t}return{code:-107,msg:`跳转失败: ${n.message}`,success:!1}}},async getAccessCode(){if(!Ot)return{code:-101,msg:"请先调用init方法初始化",success:!1};const e=this.getToken();return e?Ot.refreshCodeApi?bt(Ot.refreshCodeApi,{method:"POST",headers:{...Ot.headers,[Ot.tokenKey]:e},timeout:Ot.timeout}):{code:-105,msg:"未配置refreshCodeApi",success:!1}:{code:-106,msg:"未找到有效token",success:!1}},getConfig:()=>({...Ot}),async changePassword(e={}){if(!e[Ot.oldPwdKey]&&"CAPTCHA"!==e[Ot.typeKey])return{code:-1,msg:"请输入旧密码",success:!1};if(!e[Ot.newPwdKey])return{code:-1,msg:"请输入新密码",success:!1};if("CAPTCHA"===e[Ot.typeKey]&&!e[Ot.codeKey])return{code:-1,msg:"请输入验证码",success:!1};const t=this.getToken();return bt(Ot.changePasswordApi,{method:"POST",headers:{...Ot.headers,[Ot.tokenKey]:t},timeout:Ot.timeout,data:{[Ot.oldPwdKey]:e[Ot.oldPwdKey],[Ot.newPwdKey]:e[Ot.newPwdKey],...e}})},async getPhoneCode(){const e=this.getToken();return bt(Ot.sendCaptchaCodeApi,{method:"GET",headers:{...Ot.headers,[Ot.tokenKey]:e},timeout:Ot.timeout})}}}const St=Rt();e.createSSO=Rt,e.default=St,e.lgsso=St,Object.defineProperty(e,"__esModule",{value:!0})});
2
2
  //# sourceMappingURL=lgsso-sdk.min.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lgsso-sdk",
3
- "version": "1.2.2",
3
+ "version": "1.2.4",
4
4
  "type": "module",
5
5
  "description": "无框架依赖的单点登录SDK",
6
6
  "main": "dist/lgsso-sdk.cjs",
package/src/sso.js CHANGED
@@ -40,35 +40,46 @@ function validateConfig(options) {
40
40
  }
41
41
 
42
42
  /**
43
- * 判断是否是iOS移动端(兼容iPadOS 13+ UA伪装成Mac的场景)
43
+ * 判断是否是iOS移动端(精准适配iPad Air/所有iPad机型 + 全版本iPadOS)
44
44
  * @returns {boolean} 是否为iOS环境
45
45
  */
46
46
  function isIOS() {
47
- // 非浏览器环境直接返回false(如果需要保留这行可取消注释)
47
+ // 非浏览器环境直接返回false(如需保留请取消注释)
48
48
  // if (!isBrowser()) return false;
49
49
 
50
50
  const userAgent = navigator.userAgent.toLowerCase();
51
- const platform = navigator.platform;
51
+ const platform = navigator.platform.toLowerCase(); // 统一转小写,避免大小写兼容问题
52
52
  const maxTouchPoints = navigator.maxTouchPoints || 0;
53
+ const screenRatio = screen.width / screen.height; // 屏幕宽高比(iPad核心特征:4:3左右)
53
54
 
54
- // 1. 原有逻辑:匹配iPhone/iPod(UA仍保留标识) + 排除Windows Phone
55
+ // ========== 核心检测规则 ==========
56
+ // 1. 基础规则:iPhone/iPod 直接命中(无兼容问题)
55
57
  const isIphoneIpod = /iphone|ipod/.test(userAgent) && !window.MSStream;
56
-
57
- // 2. 兼容iPadOS 13+:分两种情况检测iPad
58
+
59
+ // 2. iPad 专属检测(覆盖所有iPad机型,含iPad Air)
58
60
  const isIpad = (
59
- // 情况1:老版本iPadOS/原生iPad标识(platform直接是iPad
60
- platform === 'iPad' ||
61
- // 情况2:iPadOS 13+ 伪装Mac的场景(UA含macintosh + 支持触摸 + 排除真Mac
61
+ // 场景1:老版本iPadOS/原生标识(platform含ipad
62
+ platform.includes('ipad') ||
63
+ // 场景2:iPadOS 13+ 伪装MacUA含macintosh + 触摸+ Mac平台)
62
64
  (
63
- userAgent.includes('macintosh') &&
64
- maxTouchPoints > 0 &&
65
- !platform.includes('Mac') &&
65
+ userAgent.includes('macintosh') &&
66
+ maxTouchPoints > 0 && // iPad Air 触摸点≥5,Mac几乎为0
67
+ !platform.includes('mac') && // 排除真Mac
66
68
  !window.MSStream
69
+ ) ||
70
+ // 场景3:新版本iPadOS(UA直接含ipados,如iPad Air搭载的iPadOS 15+)
71
+ userAgent.includes('ipados') ||
72
+ // 场景4:极端场景(第三方浏览器如Chrome for iPad Air)
73
+ (
74
+ maxTouchPoints >= 5 && // iPad Air 固定支持5点触摸
75
+ !platform.includes('android') && // 排除安卓平板
76
+ (screenRatio > 0.7 && screenRatio < 1.4) // iPad宽高比≈0.75(4:3),Mac多为1.78(16:9)
67
77
  )
68
78
  );
69
79
 
70
- // 3. 只要是iPhone/iPod/iPad任意一种,且是iOS环境,返回true
71
- return isIphoneIpod || isIpad;
80
+ // ========== 最终判定 ==========
81
+ const result = isIphoneIpod || isIpad;
82
+ return result;
72
83
  }
73
84
 
74
85
  /**
@@ -144,21 +155,37 @@ export function createSSO() {
144
155
  },
145
156
 
146
157
  /**
147
- * 退出登录
148
- * @returns {Promise<Object>} 接口返回结果
149
- */
158
+ * 退出登录
159
+ * @returns {Promise<Object>} 接口返回结果
160
+ */
150
161
  async logout() {
162
+ // 1. 前置校验:初始化状态
151
163
  if (!config) {
152
164
  return { code: -101, msg: '请先调用init方法初始化', success: false };
153
165
  }
154
166
 
167
+ // 2. 工具函数:统一构建登录跳转URL(确保完整编码当前URL的所有参数/hash)
168
+ const buildLoginUrl = () => {
169
+ if (!config.logOutUrl || !isBrowser()) return '';
170
+ // 关键:获取当前完整URL(含query、hash)并完整编码,避免参数丢失
171
+ const currentFullUrl = window.location.href;
172
+ const encodedRedirectUri = encodeURIComponent(currentFullUrl);
173
+ return `${config.logOutUrl}?redirect_uri=${encodedRedirectUri}`;
174
+ };
175
+
176
+ // 3. 校验logoutApi配置(仅接口调用时需要,跳转登录页不受此影响)
155
177
  if (!config.logoutApi) {
178
+ // 无logoutApi时仍清除token并跳转登录页,保证基础退出逻辑
179
+ this.removeToken();
180
+ const loginUrl = buildLoginUrl();
181
+ if (loginUrl) window.location.href = loginUrl;
156
182
  return { code: -102, msg: '未配置logoutApi', success: false };
157
183
  }
158
184
 
159
185
  const token = this.getToken();
160
186
  if (token) {
161
187
  try {
188
+ // 调用退出接口
162
189
  const result = await request(
163
190
  config.logoutApi,
164
191
  {
@@ -167,31 +194,37 @@ export function createSSO() {
167
194
  timeout: config.timeout
168
195
  }
169
196
  );
197
+ // 无论接口返回结果如何,都清除token
170
198
  this.removeToken();
171
199
 
172
- if (isBrowser() && config.logOutUrl) {
173
- window.location.href = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(getCurrentUrlWithParams())}`;
174
- }
200
+ // 跳转登录页(携带完整的当前URL)
201
+ const loginUrl = buildLoginUrl();
202
+ if (loginUrl) window.location.href = loginUrl;
175
203
  return result;
176
204
  } catch (error) {
205
+ // 接口调用失败,仍清除token并跳转登录页
206
+ this.removeToken();
207
+ const loginUrl = buildLoginUrl();
208
+ if (loginUrl) window.location.href = loginUrl;
177
209
  return { code: -103, msg: `退出失败: ${error.message}`, success: false };
178
210
  }
179
211
  } else {
212
+ // 无token时直接清除(兜底)并跳转登录页
180
213
  this.removeToken();
181
- if (isBrowser() && config.logOutUrl) {
182
- window.location.href = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(getCurrentUrlWithParams())}`;
183
- }
214
+ const loginUrl = buildLoginUrl();
215
+ if (loginUrl) window.location.href = loginUrl;
184
216
  return { code: 0, msg: '已成功清除token', success: true };
185
217
  }
186
218
  },
187
219
 
188
220
  /**
189
221
  * 用token换取新accessCode并跳转到指定URL
190
- * @param {string} redirectUrl - 目标跳转地址
222
+ * @param {string} redirectUrl - 目标跳转地址(支持带query/hash参数)
191
223
  * @param {string} target - 当前页面:_self、新页面打开:_blank,默认当前页_self
192
224
  * @returns {Promise<Object>} 接口返回结果
193
225
  */
194
226
  async toUrl(redirectUrl, target = '_self') {
227
+ // 1. 前置校验:初始化状态、参数合法性
195
228
  if (!config) {
196
229
  return { code: -101, msg: '请先调用init方法初始化', success: false };
197
230
  }
@@ -200,35 +233,36 @@ export function createSSO() {
200
233
  return { code: -104, msg: '请提供跳转地址', success: false };
201
234
  }
202
235
 
203
- // 核心修改:iOS移动端强制使用当前页面打开
204
- if (isIOS()) {
205
- target = '_self';
206
- }
207
-
208
- // 验证target参数有效性
209
- if (!['_self', '_blank'].includes(target)) {
236
+ // 2. 处理target参数:iOS强制_self,且校验参数范围
237
+ const finalTarget = isIOS() ? '_self' : target;
238
+ if (!['_self', '_blank'].includes(finalTarget)) {
210
239
  return { code: -108, msg: 'target参数必须是"_self"或"_blank"', success: false };
211
240
  }
212
241
 
242
+ // 3. 工具函数:统一构建登录跳转URL(避免重复代码,确保参数完整编码)
243
+ const buildLoginUrl = (redirectUrl) => {
244
+ if (!config.logOutUrl) return '';
245
+ // 关键:encodeURIComponent 会完整编码redirectUrl的所有部分(query/hash),避免参数丢失
246
+ const encodedRedirectUri = encodeURIComponent(redirectUrl);
247
+ return `${config.logOutUrl}?redirect_uri=${encodedRedirectUri}`;
248
+ };
249
+
250
+ // 4. 校验refreshCodeApi配置
213
251
  if (!config.refreshCodeApi) {
214
252
  return { code: -105, msg: '未配置refreshCodeApi', success: false };
215
253
  }
216
254
 
255
+ // 5. 获取token,无token则直接跳登录页
217
256
  const token = this.getToken();
218
257
  if (!token) {
219
258
  if (isBrowser() && config.logOutUrl) {
220
- const loginUrl = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
221
-
222
- // 根据target决定打开方式
223
- if (target === '_blank') {
224
- window.open(loginUrl, '_blank');
225
- } else {
226
- window.location.href = loginUrl;
227
- }
259
+ const loginUrl = buildLoginUrl(redirectUrl);
260
+ finalTarget === '_blank' ? window.open(loginUrl, '_blank') : window.location.href = loginUrl;
228
261
  }
229
262
  return { code: -106, msg: '未找到有效token', success: false };
230
263
  }
231
264
 
265
+ // 6. 有token则尝试换取accessCode并跳转
232
266
  try {
233
267
  const result = await request(
234
268
  config.refreshCodeApi,
@@ -240,32 +274,25 @@ export function createSSO() {
240
274
  );
241
275
 
242
276
  if (result.code === 0 && result.data && isBrowser()) {
277
+ // 拼接accessCode到目标URL,保留原URL的所有参数/hash
243
278
  const url = new URL(redirectUrl);
244
279
  url.searchParams.set(config.accessCodeKey, result.data);
245
280
  const targetUrl = url.toString();
246
-
247
- // 根据target参数决定跳转方式
248
- if (target === '_blank') {
249
- window.open(targetUrl, '_blank');
250
- } else {
251
- window.location.href = targetUrl;
252
- }
281
+ finalTarget === '_blank' ? window.open(targetUrl, '_blank') : window.location.href = targetUrl;
253
282
  } else {
254
- const loginUrl = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
255
- if (target === '_blank') {
256
- window.open(loginUrl, '_blank');
257
- } else {
258
- window.location.href = loginUrl;
283
+ // 接口返回失败,跳登录页(复用统一的登录URL构建逻辑)
284
+ if (isBrowser() && config.logOutUrl) {
285
+ const loginUrl = buildLoginUrl(redirectUrl);
286
+ finalTarget === '_blank' ? window.open(loginUrl, '_blank') : window.location.href = loginUrl;
259
287
  }
260
288
  }
261
289
 
262
290
  return result;
263
291
  } catch (error) {
264
- const loginUrl = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
265
- if (target === '_blank') {
266
- window.open(loginUrl, '_blank');
267
- } else {
268
- window.location.href = loginUrl;
292
+ // 接口异常,跳登录页(复用统一的登录URL构建逻辑)
293
+ if (isBrowser() && config.logOutUrl) {
294
+ const loginUrl = buildLoginUrl(redirectUrl);
295
+ finalTarget === '_blank' ? window.open(loginUrl, '_blank') : window.location.href = loginUrl;
269
296
  }
270
297
  return { code: -107, msg: `跳转失败: ${error.message}`, success: false };
271
298
  }