@wenext/h5-test-login v1.0.1
WeNext H5 测试登录工具包。它会根据品牌 app 找到对应的登录配置,自动把 fbAccount 写入请求体,调用登录接口,并把接口返回的 res.data 原样保留,同时把常用字段扁平化到结果顶层,方便直接取值。
目录结构
text
src/
index.ts # 对外统一出口
core/
login.ts # 登录主流程、请求、错误捕获
bridge.ts # 从登录响应派生 bridge mock 数据
config/
defaults.ts # 内置品牌登录配置
parser/
curl.ts # Markdown/curl 解析
errors/
index.ts # 结构化错误类型
types/
index.ts # 类型定义安装与构建
开发本包:
bash
cd /Users/huangxinhong/Desktop/wenext-h5-common-libs/packages/wenext-h5-test-login
pnpm install
pnpm run typecheck
pnpm run build业务项目本地安装:
bash
pnpm add @wenext/h5-test-login@file:/Users/huangxinhong/Desktop/wenext-h5-common-libs/packages/wenext-h5-test-login发布到 npm 仓库后安装:
bash
pnpm add @wenext/h5-test-login支持品牌
app 只支持品牌名和别名匹配,不支持直接传 packageName 匹配。匹配前会统一转小写并做规范化处理,所以 gamepartyPro、GamepartyPro 这类大小写差异可以正常匹配。
domain 使用登录接口 URL 的 host,例如 http://101.32.203.73/api/account/login 对应 101.32.203.73,这个 host 会对应到具体品牌。品牌前端/资源域名会单独放在 resourceDomain,完整登录地址会放在 loginUrl。
packageName 仍会保留在内置配置、登录请求体和返回结果里,用于后续接入业务或 bridge mock。
不传 curlMarkdown 时,会使用下表内置配置。
| 品牌 | 推荐 app | 支持别名 | 默认 domain | 默认 resourceDomain | 默认 packageName | 默认登录地址 |
|---|---|---|---|---|---|---|
| InChat | inchat | inchat | 101.32.203.73 | inchat-resource-cf.wenext-resource.chat | com.wenext.inchat | http://101.32.203.73/api/account/login |
| Ludo / Lama Ludo | ludo | lama-ludo、lamaludo | 101.32.221.140 | ludo-resource-cf.wenext-resource.chat | com.courage.ludo | http://101.32.221.140/api/account/login |
| Lama | lama | lama | 47.242.233.186 | lama-cf.wenext-resource.chat | com.wenext.lama | http://47.242.233.186/api/account/login |
| Wyak | wyak | wyak | 43.134.222.242 | wyak-resource-cf.wenext-resource.chat | com.wenext.wayak | http://43.134.222.242/api/account/login |
| Fungo | fungo | fungo | weparty-gateway-fungo-test.wenext.technology | fungo-resource.wenext.media | com.gamparty.fungo | http://weparty-gateway-fungo-test.wenext.technology/api/account/login |
| Lamajackaroo | lamajackaroo | ludokas、jackaroo、ludo-ksa | api-dev.lamajackaroo.com | lamajackaroo-resource-cf.wenext-resource.chat | com.courage.ludo.ksa.hw | https://api-dev.lamajackaroo.com/api/account/login |
| Hayi | hayi | hayi | 43.173.167.239 | hayi-resource-cf.wenext-resource.chat | com.gamparty.hayi | http://43.173.167.239/api/account/login |
| Yoki | yoki | yoki | 47.83.162.112 | web-test.yoki.chat | com.partyjoy.yoki | http://47.83.162.112/api/account/login |
| Gameparty Pro | gmparty | gameparty-pro、gamepartyPro、gmparty | api-gmparty-dev.wenext.technology | gmparty-resource-cf.wenext-resource.chat | com.partyjoy.gameparty.pro.hw | http://api-gmparty-dev.wenext.technology/api/account/login |
参数说明
| 参数 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
app | string | 是 | 无 | 品牌标识。只支持推荐 app 和支持别名,不支持直接传 packageName。 |
fbAccount | string | number | 否 | "888" | 写入登录请求体的 fbAccount。不传时默认使用测试账号 888。 |
curlMarkdown | string | 否 | 内置品牌登录配置 | 覆盖内置配置时使用。传入包含登录 curl 代码块的 Markdown 文本。 |
timeoutMs | number | 否 | 20000 | 登录请求超时时间,单位毫秒。 |
默认行为
| 不传参数 | 行为 |
|---|---|
不传 fbAccount | 自动使用 "888" 并覆盖请求体里的 fbAccount。 |
不传 curlMarkdown | 根据 app 从 config/defaults.ts 找内置登录配置。 |
不传 timeoutMs | 20 秒后自动中断请求,并返回 REQUEST_TIMEOUT。 |
使用方式
推荐使用 loginSafe。它不会向外抛异常,失败时返回结构化错误。
ts
import { loginSafe } from '@wenext/h5-test-login'
const result = await loginSafe({
app: 'inchat',
// fbAccount 不传时默认是 '888'
// curlMarkdown 不传时使用包内置配置
})
if (!result.ok) {
console.log(result.error.code)
console.log(result.error.message)
console.log(result.error.details)
return
}
const session = result.data
console.log(session.token)
console.log(session.userInfo)
console.log(session.uid)
console.log(session.data)指定账号:
ts
import { loginSafe } from '@wenext/h5-test-login'
const result = await loginSafe({
app: 'inchat',
fbAccount: '100005755',
})覆盖默认 curl:
ts
import { readFileSync } from 'node:fs'
import { loginSafe } from '@wenext/h5-test-login'
const curlMarkdown = readFileSync('/Users/huangxinhong/Downloads/inchat 100005755.md', 'utf-8')
const result = await loginSafe({
app: 'inchat',
fbAccount: '100005755',
curlMarkdown,
})如果调用方希望失败时直接抛错,可以使用 login:
ts
import { login } from '@wenext/h5-test-login'
const session = await login({
app: 'wyak',
})
console.log(session.token)返回结果
login() 成功时直接返回 WenextLoginResult。loginSafe() 成功时返回 { ok: true, data: WenextLoginResult }。
| 字段 | 说明 |
|---|---|
data | 原始 res.data,完整保留登录接口返回的数据。 |
response | 完整登录响应,包括 code、message、data、sucessed/succeeded 等字段。 |
token | 从 res.data.token 扁平化出来的登录 token。 |
refreshToken | 从 res.data.refreshToken 扁平化出来的刷新 token。 |
deviceId | 从 res.data.deviceId 扁平化出来的设备 ID。 |
userInfo | 从 res.data.userInfo 扁平化出来的用户信息。 |
uid | 从 res.data.userInfo.uid 派生。 |
sid | 从 res.data.userInfo.sid 派生。 |
country | 从 res.data.userInfo.country 派生。 |
region | 从 res.data.userInfo.region 派生。 |
app | 本次调用传入的品牌标识。 |
fbAccount | 本次实际注入请求体的账号。 |
domain | 登录接口 URL 的 host,用于表达“接口域名对应品牌”,例如 101.32.203.73 对应 InChat。 |
apiDomain | 同 domain,保留该字段是为了让调用方语义更明确。 |
resourceDomain | 品牌前端/资源域名,内置配置来自 c-first-screen-optimize env 的 VUE_APP_CDN_URL host。外部 curlMarkdown 无法推断该值时可能为空。 |
loginUrl | 本次登录请求使用的完整 URL。 |
packageName | 本次登录请求使用的包名。 |
requestPayload | 实际发送给登录接口的请求体,包含覆盖后的 fbAccount。 |
requestHeaders | 实际解析到的登录请求头。 |
bridgeOverrides | 从登录响应和请求配置派生出的 bridge mock 数据,可用于 H5 本地联调。 |
因为结果顶层会展开 res.data,所以接口新增字段也可以直接取:
ts
console.log(session.seqid)
console.log(session.data.seqid)错误结果
loginSafe() 失败时返回:
ts
{
ok: false,
error: {
name: 'WenextLoginError',
code: 'APP_NOT_FOUND',
message: 'No login curl entry matched app: xxx',
details: {},
status: 404,
response: {}
}
}| 错误码 | 说明 |
|---|---|
INVALID_OPTIONS | 必填参数缺失,例如没有传 app。 |
NO_CURL_ENTRIES | 传入了 curlMarkdown,但里面没有找到 curl 代码块。 |
APP_NOT_FOUND | 没有找到匹配当前 app 的登录配置。 |
AMBIGUOUS_APP | 多个登录配置同时匹配当前 app。 |
INVALID_CURL | curl 命令格式无法解析。 |
INVALID_CURL_PAYLOAD | curl 请求体缺失或不是合法 JSON。 |
REQUEST_TIMEOUT | 登录请求超时。 |
NETWORK_ERROR | 网络请求失败,未拿到响应。 |
HTTP_ERROR | 登录接口返回非 2xx HTTP 状态码。 |
INVALID_JSON_RESPONSE | 登录接口响应不是合法 JSON。 |
LOGIN_FAILED | 登录接口业务状态失败,例如 code !== 200 或 sucessed === false。 |
INVALID_LOGIN_RESPONSE | 登录响应缺少 data.token 或 data.userInfo.uid。 |