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.
- package/dist/lgsso-sdk.cjs +83 -56
- package/dist/lgsso-sdk.esm.js +83 -56
- package/dist/lgsso-sdk.js +83 -56
- package/dist/lgsso-sdk.min.js +1 -1
- package/package.json +1 -1
- package/src/sso.js +83 -56
package/dist/lgsso-sdk.cjs
CHANGED
|
@@ -4079,35 +4079,46 @@ function validateConfig(options) {
|
|
|
4079
4079
|
}
|
|
4080
4080
|
|
|
4081
4081
|
/**
|
|
4082
|
-
* 判断是否是iOS
|
|
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
|
-
//
|
|
4094
|
+
// ========== 核心检测规则 ==========
|
|
4095
|
+
// 1. 基础规则:iPhone/iPod 直接命中(无兼容问题)
|
|
4094
4096
|
const isIphoneIpod = /iphone|ipod/.test(userAgent) && !window.MSStream;
|
|
4095
|
-
|
|
4096
|
-
// 2.
|
|
4097
|
+
|
|
4098
|
+
// 2. iPad 专属检测(覆盖所有iPad机型,含iPad Air)
|
|
4097
4099
|
const isIpad = (
|
|
4098
|
-
//
|
|
4099
|
-
platform
|
|
4100
|
-
//
|
|
4100
|
+
// 场景1:老版本iPadOS/原生标识(platform含ipad)
|
|
4101
|
+
platform.includes('ipad') ||
|
|
4102
|
+
// 场景2:iPadOS 13+ 伪装Mac(UA含macintosh + 触摸+ 非Mac平台)
|
|
4101
4103
|
(
|
|
4102
|
-
userAgent.includes('macintosh') &&
|
|
4103
|
-
maxTouchPoints > 0 &&
|
|
4104
|
-
!platform.includes('
|
|
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
|
-
//
|
|
4110
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4212
|
-
|
|
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
|
-
|
|
4221
|
-
|
|
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
|
-
//
|
|
4243
|
-
|
|
4244
|
-
|
|
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 =
|
|
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
|
-
|
|
4294
|
-
if (
|
|
4295
|
-
|
|
4296
|
-
|
|
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
|
-
|
|
4304
|
-
if (
|
|
4305
|
-
|
|
4306
|
-
|
|
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
|
}
|
package/dist/lgsso-sdk.esm.js
CHANGED
|
@@ -4075,35 +4075,46 @@ function validateConfig(options) {
|
|
|
4075
4075
|
}
|
|
4076
4076
|
|
|
4077
4077
|
/**
|
|
4078
|
-
* 判断是否是iOS
|
|
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
|
-
//
|
|
4090
|
+
// ========== 核心检测规则 ==========
|
|
4091
|
+
// 1. 基础规则:iPhone/iPod 直接命中(无兼容问题)
|
|
4090
4092
|
const isIphoneIpod = /iphone|ipod/.test(userAgent) && !window.MSStream;
|
|
4091
|
-
|
|
4092
|
-
// 2.
|
|
4093
|
+
|
|
4094
|
+
// 2. iPad 专属检测(覆盖所有iPad机型,含iPad Air)
|
|
4093
4095
|
const isIpad = (
|
|
4094
|
-
//
|
|
4095
|
-
platform
|
|
4096
|
-
//
|
|
4096
|
+
// 场景1:老版本iPadOS/原生标识(platform含ipad)
|
|
4097
|
+
platform.includes('ipad') ||
|
|
4098
|
+
// 场景2:iPadOS 13+ 伪装Mac(UA含macintosh + 触摸+ 非Mac平台)
|
|
4097
4099
|
(
|
|
4098
|
-
userAgent.includes('macintosh') &&
|
|
4099
|
-
maxTouchPoints > 0 &&
|
|
4100
|
-
!platform.includes('
|
|
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
|
-
//
|
|
4106
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4208
|
-
|
|
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
|
-
|
|
4217
|
-
|
|
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
|
-
//
|
|
4239
|
-
|
|
4240
|
-
|
|
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 =
|
|
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
|
-
|
|
4290
|
-
if (
|
|
4291
|
-
|
|
4292
|
-
|
|
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
|
-
|
|
4300
|
-
if (
|
|
4301
|
-
|
|
4302
|
-
|
|
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
|
|
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
|
-
//
|
|
4096
|
+
// ========== 核心检测规则 ==========
|
|
4097
|
+
// 1. 基础规则:iPhone/iPod 直接命中(无兼容问题)
|
|
4096
4098
|
const isIphoneIpod = /iphone|ipod/.test(userAgent) && !window.MSStream;
|
|
4097
|
-
|
|
4098
|
-
// 2.
|
|
4099
|
+
|
|
4100
|
+
// 2. iPad 专属检测(覆盖所有iPad机型,含iPad Air)
|
|
4099
4101
|
const isIpad = (
|
|
4100
|
-
//
|
|
4101
|
-
platform
|
|
4102
|
-
//
|
|
4102
|
+
// 场景1:老版本iPadOS/原生标识(platform含ipad)
|
|
4103
|
+
platform.includes('ipad') ||
|
|
4104
|
+
// 场景2:iPadOS 13+ 伪装Mac(UA含macintosh + 触摸+ 非Mac平台)
|
|
4103
4105
|
(
|
|
4104
|
-
userAgent.includes('macintosh') &&
|
|
4105
|
-
maxTouchPoints > 0 &&
|
|
4106
|
-
!platform.includes('
|
|
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
|
-
//
|
|
4112
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4214
|
-
|
|
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
|
-
|
|
4223
|
-
|
|
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
|
-
//
|
|
4245
|
-
|
|
4246
|
-
|
|
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 =
|
|
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
|
-
|
|
4296
|
-
if (
|
|
4297
|
-
|
|
4298
|
-
|
|
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
|
-
|
|
4306
|
-
if (
|
|
4307
|
-
|
|
4308
|
-
|
|
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
|
}
|
package/dist/lgsso-sdk.min.js
CHANGED
|
@@ -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&<.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
package/src/sso.js
CHANGED
|
@@ -40,35 +40,46 @@ function validateConfig(options) {
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
/**
|
|
43
|
-
* 判断是否是iOS
|
|
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
|
-
//
|
|
55
|
+
// ========== 核心检测规则 ==========
|
|
56
|
+
// 1. 基础规则:iPhone/iPod 直接命中(无兼容问题)
|
|
55
57
|
const isIphoneIpod = /iphone|ipod/.test(userAgent) && !window.MSStream;
|
|
56
|
-
|
|
57
|
-
// 2.
|
|
58
|
+
|
|
59
|
+
// 2. iPad 专属检测(覆盖所有iPad机型,含iPad Air)
|
|
58
60
|
const isIpad = (
|
|
59
|
-
//
|
|
60
|
-
platform
|
|
61
|
-
//
|
|
61
|
+
// 场景1:老版本iPadOS/原生标识(platform含ipad)
|
|
62
|
+
platform.includes('ipad') ||
|
|
63
|
+
// 场景2:iPadOS 13+ 伪装Mac(UA含macintosh + 触摸+ 非Mac平台)
|
|
62
64
|
(
|
|
63
|
-
userAgent.includes('macintosh') &&
|
|
64
|
-
maxTouchPoints > 0 &&
|
|
65
|
-
!platform.includes('
|
|
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
|
-
//
|
|
71
|
-
|
|
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
|
-
|
|
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
|
-
|
|
173
|
-
|
|
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
|
-
|
|
182
|
-
|
|
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
|
-
//
|
|
204
|
-
|
|
205
|
-
|
|
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 =
|
|
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
|
-
|
|
255
|
-
if (
|
|
256
|
-
|
|
257
|
-
|
|
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
|
-
|
|
265
|
-
if (
|
|
266
|
-
|
|
267
|
-
|
|
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
|
}
|