finej3 2.1.0 → 2.3.0

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/README.md CHANGED
@@ -2,7 +2,19 @@
2
2
 
3
3
  剑网 3 API 的 TypeScript SDK,无运行时依赖,支持 Node.js 18+、ESM、CommonJS 和类型声明。
4
4
 
5
- 当前实现面向 `nico.nicemoe.cn` 的新版 HTTP API,共包含主站 88 个、搜索服务 12 个、客户端服务 15 个方法。不包含 WebSocket 推送。
5
+ 当前实现包含主站 88 个、搜索服务 12 个、客户端服务 15 个和计算器服务 2 个方法,共 117 个 HTTP 接口。不包含 WebSocket 推送。
6
+
7
+ ## 2.3.0 版本说明
8
+
9
+ - `calcd.calculateDps` 增加可选 `fillMinimumHaste` 的类型适配,供支持补足加速试算的计算器服务使用。
10
+ - 补充 `hasteAdjustment` 和 `hasteShortfall` 类型,区分原始装备加速与试算加速。
11
+ - 增加参数透传、补足结果和错误诊断的回归检查。
12
+
13
+ ## 2.2.0 版本说明
14
+
15
+ - 新增独立 `calcd` 客户端,通过 `listRotations` 查询循环目录,通过 `calculateDps` 提交装备快照计算 DPS。
16
+ - 按计算器 OpenAPI 定义完整类型,保留原始成功数据、错误对象及 422 加速不匹配诊断。
17
+ - 支持数字字符串装备参数和可空镶嵌字段,提供两个接口的路由、错误响应及凭证隔离测试。
6
18
 
7
19
  ## 2.1.0 版本说明
8
20
 
@@ -59,7 +71,9 @@ SDK 不自动读取环境变量或加载 `.env`。公开接口可省略 `token`
59
71
 
60
72
  ## 响应与错误
61
73
 
62
- 三个客户端都原样返回 `{ status, detail }`。`status === 200` 表示成功,业务错误的 `detail` 为字符串。错误码范围未被文档限定,使用 `isSuccess(response)` 在 TypeScript 中安全收窄分支。
74
+ 主站、搜索和客户端服务都原样返回 `{ status, detail }`。`status === 200` 表示成功,业务错误的 `detail` 为字符串。错误码范围未被文档限定,使用 `isSuccess(response)` 在 TypeScript 中安全收窄分支。
75
+
76
+ 计算器服务返回原始成功数据或 `{ code, message, details? }` 错误对象,通过 `'code' in response` 收窄错误分支。HTTP 422 的加速不匹配错误可能包含实际加速、延迟档和可用循环档位。
63
77
 
64
78
  部分成功响应允许 `detail` 为 `{}` 或 `null`,类型中保留这些情况。榜单在查询全服时返回数组,指定服务器时返回分组对象;空字符串也表示全服,因此方法不会仅凭 `server: string` 就断言一定返回单对象。
65
79
 
@@ -74,14 +88,45 @@ SDK 不自动读取环境变量或加载 `.env`。公开接口可省略 `token`
74
88
  | `api` | `https://nico.nicemoe.cn` |
75
89
  | `search` | `https://nico.nicemoe.cn/search/submit` |
76
90
  | `client` | `https://nico.nicemoe.cn/client/submit` |
91
+ | `calcd` | `https://calcd.nicemoe.cn` |
92
+
93
+ 可传入自定义 `fetch`,或通过 `baseUrl: { api, search, client, calcd }` 分别覆盖入口。`api` 和 `calcd` 是 URL 前缀,`search` 和 `client` 是完整的 POST 提交地址。
94
+
95
+ ## 计算器接口
96
+
97
+ `calcd.listRotations({ spec? })` 调用 `GET /v1/rotations` 获取心法循环目录。`calcd.calculateDps({ rotationId, role })` 调用 `POST /v1/dps`,使用目录中的循环 ID 和角色原始装备快照计算木桩 DPS。两个接口均为公开接口。
98
+
99
+ 若返回 `HASTE_MISMATCH` 且 `details.hasteShortfall` 为正数,可用同一份快照调用 `calcd.calculateDps({ rotationId, role, fillMinimumHaste: true })`。实际补足后,`haste` 仍是装备加速,`hasteAdjustment` 提供 `addedHaste`(补足点数)和 `simulatedHaste`(试算加速)。正常结果省略该对象。
100
+
101
+ 2026-11-13 发布前实测时,公开计算器接口传入 `fillMinimumHaste` 会返回 `INVALID_REQUEST`。此选项需在所连接的服务端支持后启用。
102
+
103
+ ```ts
104
+ import { createJx3, type CalcdRole } from 'finej3';
105
+
106
+ const { calcd } = createJx3();
107
+ const catalog = await calcd.listRotations({ spec: 'shxj' });
108
+ if ('code' in catalog) throw new Error(catalog.message);
109
+ console.log(catalog.specs[0]?.rotations);
110
+
111
+ async function calculate(rotationId: string, role: CalcdRole) {
112
+ const result = await calcd.calculateDps({ rotationId, role });
113
+ if ('code' in result) {
114
+ console.log(result.code, result.message, result.details);
115
+ return;
116
+ }
117
+ console.log(result.dps, result.skills, result.enchantGains);
118
+ }
119
+ ```
120
+
121
+ `role` 可使用 `search.roleEquipDetail` 默认客户端格式的有效 `detail` 对象。必填字段为 `serverName`、`roleName`、`kungfuName` 和 `equipList`,额外快照字段会原样传递。装备数值字段支持文档规定的整数或数字字符串,镶嵌字段保留 `null` 和空槽。
77
122
 
78
- 可传入自定义 `fetch`,或通过 `baseUrl: { api, search, client }` 分别覆盖入口。`api` 是 URL 前缀;另外两项是完整的 POST 提交地址,SDK 不再追加路径。
123
+ `baselineAvailable` 表示循环的固定基准可用性,实际角色加速仍需匹配档位。查询或计算失败时可读取 `code`、`message`,以及可选的 `details.availableVariants`。完整字段定义依据[计算器 OpenAPI](https://nico.nicemoe.cn/doc/json/openapi.calcd.json)。
79
124
 
80
125
  ## 补充接口
81
126
 
82
127
  | 方法 | 用途与参数 |
83
128
  | --- | --- |
84
- | `api.calcdCalculate({ server, name, page?, cycle? })` | DPS 计算,`page` 支持 `pvedps` 和 `界pvedps` |
129
+ | `api.calcdCalculate({ server, name, page?, cycle? })` | 主站代理 DPS 计算,`page` 支持 `pvedps` 和 `界pvedps` |
85
130
  | `api.chatContent({ server, name, limit?, page? })` | 合并补充记录后去重分页,返回聊天记录数组 |
86
131
  | `api.raidRecords({ server, name })` | 主站团队副本进度 |
87
132
  | `api.roleBatch({ ids })` | 批量角色资料,`ids` 为非空字符串数组,通过 POST JSON 发送 |
@@ -152,7 +197,7 @@ npm test
152
197
  npm run verify-package
153
198
  ```
154
199
 
155
- `npm run prepublishOnly` 依次运行以上检查,不执行发布。`npm test` 使用本地 HTTP 服务验证全部 115 个方法的路由、参数和鉴权,并检查错误响应、空值、超时及自定义入口;运行前需要构建。
200
+ `npm run prepublishOnly` 依次运行以上检查,不执行发布。`npm test` 验证 117 个接口的路由、参数和响应,包括计算器原始错误、422 诊断及凭证隔离,并检查空值、超时及自定义入口。运行前需要构建。
156
201
 
157
202
  `npm run verify-package` 还会通过包名编译 `.mts` / `.cts` 消费者,检查两种模块解析模式下的类型入口,并确认声明文件包含在发布包中。
158
203
 
@@ -0,0 +1,14 @@
1
+ import { HttpClient, type Jx3Options } from '../core/http.js';
2
+ import type * as T from '../types/calcd.js';
3
+ export declare const CALCD_BASE_URL = "https://calcd.nicemoe.cn";
4
+ export type Jx3CalcdOptions = Pick<Jx3Options, 'baseUrl' | 'fetch' | 'timeoutMs'>;
5
+ /** 独立计算器服务,原样返回成功数据或 { code, message, details? } 错误。 */
6
+ export declare class Jx3CalcdApi extends HttpClient {
7
+ constructor({ baseUrl, fetch, timeoutMs }?: Jx3CalcdOptions);
8
+ /** 循环目录。spec 为心法简写,省略时查询全部心法。 */
9
+ listRotations(params?: {
10
+ spec?: string;
11
+ }): Promise<T.CalcdRotationsData | T.CalcdError>;
12
+ /** 按目录 rotationId 和角色原始装备快照计算木桩 DPS。 */
13
+ calculateDps<Role extends T.CalcdRole>(params: T.CalcdDpsParams<Role>): Promise<T.CalcdDpsData | T.CalcdError>;
14
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Jx3CalcdApi = exports.CALCD_BASE_URL = void 0;
4
+ const http_js_1 = require("../core/http.js");
5
+ exports.CALCD_BASE_URL = 'https://calcd.nicemoe.cn';
6
+ function isCalcdError(value) {
7
+ return value !== null && typeof value === 'object'
8
+ && 'code' in value && typeof value.code === 'string'
9
+ && 'message' in value && typeof value.message === 'string';
10
+ }
11
+ /** 独立计算器服务,原样返回成功数据或 { code, message, details? } 错误。 */
12
+ class Jx3CalcdApi extends http_js_1.HttpClient {
13
+ constructor({ baseUrl, fetch, timeoutMs } = {}) {
14
+ super(exports.CALCD_BASE_URL, { baseUrl, fetch, timeoutMs });
15
+ }
16
+ /** 循环目录。spec 为心法简写,省略时查询全部心法。 */
17
+ async listRotations(params = {}) {
18
+ const query = new URLSearchParams();
19
+ if (params.spec !== undefined)
20
+ query.set('spec', params.spec);
21
+ const suffix = query.toString();
22
+ const { body } = await this.requestJson(`/v1/rotations${suffix ? `?${suffix}` : ''}`, { method: 'GET' }, '/v1/rotations');
23
+ if (isCalcdError(body))
24
+ return body;
25
+ if (body !== null && typeof body === 'object' && 'specs' in body && Array.isArray(body.specs)) {
26
+ return body;
27
+ }
28
+ throw new Error('finej3: [/v1/rotations] 响应不符合计算器目录格式');
29
+ }
30
+ /** 按目录 rotationId 和角色原始装备快照计算木桩 DPS。 */
31
+ async calculateDps(params) {
32
+ const { body } = await this.requestJson('/v1/dps', {
33
+ method: 'POST',
34
+ headers: { 'Content-Type': 'application/json' },
35
+ body: JSON.stringify(params),
36
+ }, '/v1/dps');
37
+ if (isCalcdError(body))
38
+ return body;
39
+ if (body !== null && typeof body === 'object' && 'dps' in body && typeof body.dps === 'number') {
40
+ return body;
41
+ }
42
+ throw new Error('finej3: [/v1/dps] 响应不符合计算器结果格式');
43
+ }
44
+ }
45
+ exports.Jx3CalcdApi = Jx3CalcdApi;
46
+ //# sourceMappingURL=calcd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calcd.js","sourceRoot":"","sources":["../../../src/clients/calcd.ts"],"names":[],"mappings":";;;AAAA,6CAA8D;AAGjD,QAAA,cAAc,GAAG,0BAA0B,CAAC;AAGzD,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;WAC7C,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;WACjD,SAAS,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC;AAC/D,CAAC;AAED,wDAAwD;AACxD,MAAa,WAAY,SAAQ,oBAAU;IACzC,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,KAAsB,EAAE;QAC7D,KAAK,CAAC,sBAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,iCAAiC;IACjC,KAAK,CAAC,aAAa,CAAC,SAA4B,EAAE;QAChD,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,eAAe,CAAC,CAAC;QAC1H,IAAI,YAAY,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9F,OAAO,IAA4B,CAAC;QACtC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,YAAY,CAA2B,MAA8B;QACzE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;SAC7B,EAAE,SAAS,CAAC,CAAC;QACd,IAAI,YAAY,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC/F,OAAO,IAAsB,CAAC;QAChC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;CACF;AA/BD,kCA+BC"}
@@ -33,6 +33,11 @@ export declare class HttpClient {
33
33
  private readonly baseUrl;
34
34
  constructor(defaultBaseUrl: string, options: Jx3Options);
35
35
  protected requireTicket(ticket: string | undefined, endpoint: string): string;
36
+ /** 共用请求、鉴权、超时及 JSON 解析,响应格式由各服务处理。 */
37
+ protected requestJson(path: string, init: RequestInit, endpoint: string): Promise<{
38
+ status: number;
39
+ body: unknown;
40
+ }>;
36
41
  private fetchJson;
37
42
  /** 主站 GET;null 和 undefined 都按未传参处理,token 只放请求头。 */
38
43
  protected get<T>(path: string, params: object): Promise<Jx3Envelope<T>>;
@@ -19,11 +19,12 @@ class HttpClient {
19
19
  }
20
20
  return value;
21
21
  }
22
- async fetchJson(url, init, endpoint) {
22
+ /** 共用请求、鉴权、超时及 JSON 解析,响应格式由各服务处理。 */
23
+ async requestJson(path, init, endpoint) {
23
24
  const headers = new Headers(init.headers);
24
25
  if (this.options.token)
25
26
  headers.set('token', this.options.token);
26
- const response = await (this.options.fetch ?? fetch)(url, {
27
+ const response = await (this.options.fetch ?? fetch)(`${this.baseUrl}${path}`, {
27
28
  ...init,
28
29
  headers,
29
30
  signal: AbortSignal.timeout(this.options.timeoutMs ?? 30000),
@@ -36,10 +37,14 @@ class HttpClient {
36
37
  catch {
37
38
  throw new Error(`finej3: [${endpoint}] 响应不是合法 JSON (http ${response.status})`);
38
39
  }
40
+ return { status: response.status, body };
41
+ }
42
+ async fetchJson(path, init, endpoint) {
43
+ const { status, body } = await this.requestJson(path, init, endpoint);
39
44
  if (body === null || typeof body !== 'object' || !('status' in body)
40
45
  || !Number.isInteger(body.status) || !('detail' in body)
41
46
  || (body.status !== 200 && typeof body.detail !== 'string')) {
42
- throw new Error(`finej3: [${endpoint}] 响应不符合 { status, detail } 格式 (http ${response.status})`);
47
+ throw new Error(`finej3: [${endpoint}] 响应不符合 { status, detail } 格式 (http ${status})`);
43
48
  }
44
49
  return body;
45
50
  }
@@ -52,11 +57,11 @@ class HttpClient {
52
57
  }
53
58
  const encoded = query.toString();
54
59
  const suffix = encoded ? `?${encoded}` : '';
55
- return this.fetchJson(`${this.baseUrl}${path}${suffix}`, { method: 'GET' }, path);
60
+ return this.fetchJson(`${path}${suffix}`, { method: 'GET' }, path);
56
61
  }
57
62
  /** 网关 action 使用 JSON body,token 通过请求头传入。 */
58
63
  post(action, payload) {
59
- return this.fetchJson(this.baseUrl, {
64
+ return this.fetchJson('', {
60
65
  method: 'POST',
61
66
  headers: { 'Content-Type': 'application/json' },
62
67
  body: JSON.stringify({ ...payload, action }),
@@ -64,7 +69,7 @@ class HttpClient {
64
69
  }
65
70
  /** 主站路径使用 JSON body,支持批量 ID 等数组参数。 */
66
71
  postPath(path, payload) {
67
- return this.fetchJson(`${this.baseUrl}${path}`, {
72
+ return this.fetchJson(path, {
68
73
  method: 'POST',
69
74
  headers: { 'Content-Type': 'application/json' },
70
75
  body: JSON.stringify(payload),
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/core/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/core/http.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,20 @@
1
1
  export { Jx3Api, MAIN_BASE_URL } from './clients/main.js';
2
2
  export { Jx3SearchApi, SEARCH_BASE_URL } from './clients/search.js';
3
3
  export { Jx3ClientApi, CLIENT_BASE_URL } from './clients/client.js';
4
+ export { Jx3CalcdApi, CALCD_BASE_URL, type Jx3CalcdOptions } from './clients/calcd.js';
4
5
  export { isSuccess } from './core/http.js';
5
6
  export type { Jx3Options, Jx3Envelope, Jx3SuccessEnvelope, Jx3ErrorEnvelope, EmptyObject, GatewayEnvelope, GatewaySuccessEnvelope, GatewayErrorEnvelope, GatewayErrorStatus } from './core/http.js';
6
7
  export type * from './types/main.js';
7
8
  export type * from './types/search.js';
8
9
  export type * from './types/client.js';
10
+ export type * from './types/calcd.js';
9
11
  import { Jx3Api } from './clients/main.js';
10
12
  import { Jx3SearchApi } from './clients/search.js';
11
13
  import { Jx3ClientApi } from './clients/client.js';
14
+ import { Jx3CalcdApi } from './clients/calcd.js';
12
15
  import type { Jx3Options } from './core/http.js';
13
16
  /**
14
- * 按服务覆盖地址。主站为 URL 前缀,搜索和客户端为完整提交入口。
17
+ * 按服务覆盖地址。主站和计算器为 URL 前缀,搜索和客户端为完整提交入口。
15
18
  * 省略的服务使用官方地址。
16
19
  */
17
20
  export interface Jx3BaseUrls {
@@ -21,6 +24,8 @@ export interface Jx3BaseUrls {
21
24
  search?: string;
22
25
  /** 客户端服务,缺省 https://nico.nicemoe.cn/client/submit */
23
26
  client?: string;
27
+ /** 计算器,缺省 https://calcd.nicemoe.cn */
28
+ calcd?: string;
24
29
  }
25
30
  export interface CreateJx3Options extends Omit<Jx3Options, 'baseUrl'> {
26
31
  /** 按服务覆盖地址(自建代理 / 镜像 / 测试环境),可只覆盖其中一部分 */
@@ -33,9 +38,11 @@ export interface Jx3Clients {
33
38
  search: Jx3SearchApi;
34
39
  /** 客户端服务 */
35
40
  client: Jx3ClientApi;
41
+ /** 公开计算器服务 */
42
+ calcd: Jx3CalcdApi;
36
43
  }
37
44
  /**
38
- * 一次性创建三个服务的客户端。
45
+ * 一次性创建四个服务的客户端。
39
46
  *
40
47
  * @example
41
48
  * ```ts
package/dist/cjs/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isSuccess = exports.CLIENT_BASE_URL = exports.Jx3ClientApi = exports.SEARCH_BASE_URL = exports.Jx3SearchApi = exports.MAIN_BASE_URL = exports.Jx3Api = void 0;
3
+ exports.isSuccess = exports.CALCD_BASE_URL = exports.Jx3CalcdApi = exports.CLIENT_BASE_URL = exports.Jx3ClientApi = exports.SEARCH_BASE_URL = exports.Jx3SearchApi = exports.MAIN_BASE_URL = exports.Jx3Api = void 0;
4
4
  exports.createJx3 = createJx3;
5
5
  var main_js_1 = require("./clients/main.js");
6
6
  Object.defineProperty(exports, "Jx3Api", { enumerable: true, get: function () { return main_js_1.Jx3Api; } });
@@ -11,13 +11,17 @@ Object.defineProperty(exports, "SEARCH_BASE_URL", { enumerable: true, get: funct
11
11
  var client_js_1 = require("./clients/client.js");
12
12
  Object.defineProperty(exports, "Jx3ClientApi", { enumerable: true, get: function () { return client_js_1.Jx3ClientApi; } });
13
13
  Object.defineProperty(exports, "CLIENT_BASE_URL", { enumerable: true, get: function () { return client_js_1.CLIENT_BASE_URL; } });
14
+ var calcd_js_1 = require("./clients/calcd.js");
15
+ Object.defineProperty(exports, "Jx3CalcdApi", { enumerable: true, get: function () { return calcd_js_1.Jx3CalcdApi; } });
16
+ Object.defineProperty(exports, "CALCD_BASE_URL", { enumerable: true, get: function () { return calcd_js_1.CALCD_BASE_URL; } });
14
17
  var http_js_1 = require("./core/http.js");
15
18
  Object.defineProperty(exports, "isSuccess", { enumerable: true, get: function () { return http_js_1.isSuccess; } });
16
19
  const main_js_2 = require("./clients/main.js");
17
20
  const search_js_2 = require("./clients/search.js");
18
21
  const client_js_2 = require("./clients/client.js");
22
+ const calcd_js_2 = require("./clients/calcd.js");
19
23
  /**
20
- * 一次性创建三个服务的客户端。
24
+ * 一次性创建四个服务的客户端。
21
25
  *
22
26
  * @example
23
27
  * ```ts
@@ -33,6 +37,7 @@ function createJx3(options = {}) {
33
37
  api: new main_js_2.Jx3Api({ ...shared, baseUrl: baseUrl?.api }),
34
38
  search: new search_js_2.Jx3SearchApi({ ...shared, baseUrl: baseUrl?.search }),
35
39
  client: new client_js_2.Jx3ClientApi({ ...shared, baseUrl: baseUrl?.client }),
40
+ calcd: new calcd_js_2.Jx3CalcdApi({ fetch: shared.fetch, timeoutMs: shared.timeoutMs, baseUrl: baseUrl?.calcd }),
36
41
  };
37
42
  }
38
43
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AA+CA,8BAOC;AAtDD,6CAA0D;AAAjD,iGAAA,MAAM,OAAA;AAAE,wGAAA,aAAa,OAAA;AAC9B,iDAAoE;AAA3D,yGAAA,YAAY,OAAA;AAAE,4GAAA,eAAe,OAAA;AACtC,iDAAoE;AAA3D,yGAAA,YAAY,OAAA;AAAE,4GAAA,eAAe,OAAA;AACtC,0CAA2C;AAAlC,oGAAA,SAAS,OAAA;AAKlB,+CAA2C;AAC3C,mDAAmD;AACnD,mDAAmD;AA0BnD;;;;;;;;;;GAUG;AACH,SAAgB,SAAS,CAAC,UAA4B,EAAE;IACtD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;IACvC,OAAO;QACL,GAAG,EAAE,IAAI,gBAAM,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QACrD,MAAM,EAAE,IAAI,wBAAY,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACjE,MAAM,EAAE,IAAI,wBAAY,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;KAClE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAsDA,8BAQC;AA9DD,6CAA0D;AAAjD,iGAAA,MAAM,OAAA;AAAE,wGAAA,aAAa,OAAA;AAC9B,iDAAoE;AAA3D,yGAAA,YAAY,OAAA;AAAE,4GAAA,eAAe,OAAA;AACtC,iDAAoE;AAA3D,yGAAA,YAAY,OAAA;AAAE,4GAAA,eAAe,OAAA;AACtC,+CAAuF;AAA9E,uGAAA,WAAW,OAAA;AAAE,0GAAA,cAAc,OAAA;AACpC,0CAA2C;AAAlC,oGAAA,SAAS,OAAA;AAMlB,+CAA2C;AAC3C,mDAAmD;AACnD,mDAAmD;AACnD,iDAAiD;AA8BjD;;;;;;;;;;GAUG;AACH,SAAgB,SAAS,CAAC,UAA4B,EAAE;IACtD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;IACvC,OAAO;QACL,GAAG,EAAE,IAAI,gBAAM,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QACrD,MAAM,EAAE,IAAI,wBAAY,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACjE,MAAM,EAAE,IAAI,wBAAY,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACjE,KAAK,EAAE,IAAI,sBAAW,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;KACtG,CAAC;AACJ,CAAC"}
@@ -0,0 +1,121 @@
1
+ /** 计算器类型依据 openapi.calcd.json 的完整 schema。 */
2
+ /** 循环的加速、延迟档位。 */
3
+ export interface CalcdVariant {
4
+ index: number;
5
+ /** 加速值区间 [下限, 上限),为 null 时使用 hasteTier。 */
6
+ hasteRange: [number, number] | null;
7
+ hasteTier: number | null;
8
+ latencyTier: number | null;
9
+ durationSeconds: number;
10
+ }
11
+ export interface CalcdRotation {
12
+ rotationId: string;
13
+ name: string;
14
+ title: string;
15
+ weapon: string | null;
16
+ strictHaste: boolean;
17
+ /** 基准可用仍需校验角色实际加速。 */
18
+ baselineAvailable: boolean;
19
+ unavailableReason: string | null;
20
+ variants: CalcdVariant[];
21
+ }
22
+ export interface CalcdSpec {
23
+ spec: string;
24
+ name: string;
25
+ rotations: CalcdRotation[];
26
+ }
27
+ export interface CalcdRotationsData {
28
+ specs: CalcdSpec[];
29
+ }
30
+ /** 整数及数字字符串由服务端按字段约束校验。 */
31
+ export type CalcdIntegerInput = number | string;
32
+ export type CalcdGemSlots = Array<CalcdIntegerInput[] | null> | null;
33
+ /** 客户端格式的装备条目,支持文档中的两套镶嵌字段。 */
34
+ export interface CalcdEquipmentItem {
35
+ nItemIndex: CalcdIntegerInput;
36
+ dwTabIndex: CalcdIntegerInput;
37
+ dwTabType?: CalcdIntegerInput;
38
+ /** 精炼等级 0~10,省略时按 0 计算。 */
39
+ nStrengthLevel?: CalcdIntegerInput;
40
+ dwPermanentEnchantID?: CalcdIntegerInput;
41
+ dwTemporaryEnchantID?: CalcdIntegerInput;
42
+ aMountDiamond?: CalcdGemSlots;
43
+ aSlotItem?: CalcdGemSlots;
44
+ aColorDiamond?: CalcdIntegerInput[] | null;
45
+ ColorInfo?: CalcdGemSlots;
46
+ }
47
+ /** 可直接传入原始装备查询的成功 detail 对象。 */
48
+ export interface CalcdRole {
49
+ serverName: string;
50
+ roleName: string;
51
+ kungfuName: string;
52
+ equipList: CalcdEquipmentItem[];
53
+ }
54
+ /** role 和装备条目允许额外字段,保留调用方快照中的信息。 */
55
+ export interface CalcdDpsParams<Role extends CalcdRole = CalcdRole> {
56
+ rotationId: string;
57
+ role: Role;
58
+ /** 仅在实际加速低于所选循环最低可用档时,补到该档试算。默认关闭。 */
59
+ fillMinimumHaste?: boolean;
60
+ }
61
+ export interface CalcdDpsSkill {
62
+ name: string;
63
+ count: number;
64
+ damage: number;
65
+ dps: number;
66
+ sharePct: number;
67
+ }
68
+ export interface CalcdEnchantGain {
69
+ stat: string;
70
+ amount: number;
71
+ dps: number;
72
+ deltaDps: number;
73
+ gainPct: number;
74
+ }
75
+ export interface CalcdDpsData {
76
+ character: {
77
+ server: string;
78
+ roleName: string;
79
+ kungfu: string;
80
+ };
81
+ spec: string;
82
+ rotationId: string;
83
+ baseline: {
84
+ target: string;
85
+ latencyTier: number;
86
+ externalBuffs: boolean;
87
+ };
88
+ haste: number;
89
+ /** 仅补足试算返回;haste 始终为原始装备加速。 */
90
+ hasteAdjustment?: {
91
+ addedHaste: number;
92
+ simulatedHaste: number;
93
+ };
94
+ matchedVariant: CalcdVariant;
95
+ durationSeconds: number;
96
+ totalDamage: number;
97
+ dps: number;
98
+ skills: CalcdDpsSkill[];
99
+ enchantGains: CalcdEnchantGain[];
100
+ equipment: {
101
+ received: number;
102
+ recognized: number;
103
+ };
104
+ warnings: string[];
105
+ }
106
+ /** HTTP 422 的 HASTE_MISMATCH 错误可提供此诊断信息。 */
107
+ export interface CalcdHasteMismatchDetails {
108
+ actualHaste: number;
109
+ /** 低于最低可用档时,补足到该档所需的点数。 */
110
+ hasteShortfall?: number;
111
+ actualHasteTier: number;
112
+ latencyTier: number;
113
+ availableVariants: CalcdVariant[];
114
+ warnings: string[];
115
+ }
116
+ /** 计算器错误原样返回,以 'code' in response 收窄。 */
117
+ export interface CalcdError {
118
+ code: string;
119
+ message: string;
120
+ details?: CalcdHasteMismatchDetails;
121
+ }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ /** 计算器类型依据 openapi.calcd.json 的完整 schema。 */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=calcd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calcd.js","sourceRoot":"","sources":["../../../src/types/calcd.ts"],"names":[],"mappings":";AAAA,6CAA6C"}
@@ -0,0 +1,15 @@
1
+ import { HttpClient, type Jx3Options } from '../core/http.js';
2
+ import type * as T from '../types/calcd.js';
3
+ export declare const CALCD_BASE_URL = "https://calcd.nicemoe.cn";
4
+ export type Jx3CalcdOptions = Pick<Jx3Options, 'baseUrl' | 'fetch' | 'timeoutMs'>;
5
+ /** 独立计算器服务,原样返回成功数据或 { code, message, details? } 错误。 */
6
+ export declare class Jx3CalcdApi extends HttpClient {
7
+ constructor({ baseUrl, fetch, timeoutMs }?: Jx3CalcdOptions);
8
+ /** 循环目录。spec 为心法简写,省略时查询全部心法。 */
9
+ listRotations(params?: {
10
+ spec?: string;
11
+ }): Promise<T.CalcdRotationsData | T.CalcdError>;
12
+ /** 按目录 rotationId 和角色原始装备快照计算木桩 DPS。 */
13
+ calculateDps<Role extends T.CalcdRole>(params: T.CalcdDpsParams<Role>): Promise<T.CalcdDpsData | T.CalcdError>;
14
+ }
15
+ //# sourceMappingURL=calcd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calcd.d.ts","sourceRoot":"","sources":["../../../src/clients/calcd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,KAAK,CAAC,MAAM,mBAAmB,CAAC;AAE5C,eAAO,MAAM,cAAc,6BAA6B,CAAC;AACzD,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC,CAAC;AAQlF,wDAAwD;AACxD,qBAAa,WAAY,SAAQ,UAAU;gBAC7B,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAE,eAAoB;IAI/D,iCAAiC;IAC3B,aAAa,CAAC,MAAM,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,CAAC,CAAC,kBAAkB,GAAG,CAAC,CAAC,UAAU,CAAC;IAYjG,wCAAwC;IAClC,YAAY,CAAC,IAAI,SAAS,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,UAAU,CAAC;CAYrH"}
@@ -0,0 +1,42 @@
1
+ import { HttpClient } from '../core/http.js';
2
+ export const CALCD_BASE_URL = 'https://calcd.nicemoe.cn';
3
+ function isCalcdError(value) {
4
+ return value !== null && typeof value === 'object'
5
+ && 'code' in value && typeof value.code === 'string'
6
+ && 'message' in value && typeof value.message === 'string';
7
+ }
8
+ /** 独立计算器服务,原样返回成功数据或 { code, message, details? } 错误。 */
9
+ export class Jx3CalcdApi extends HttpClient {
10
+ constructor({ baseUrl, fetch, timeoutMs } = {}) {
11
+ super(CALCD_BASE_URL, { baseUrl, fetch, timeoutMs });
12
+ }
13
+ /** 循环目录。spec 为心法简写,省略时查询全部心法。 */
14
+ async listRotations(params = {}) {
15
+ const query = new URLSearchParams();
16
+ if (params.spec !== undefined)
17
+ query.set('spec', params.spec);
18
+ const suffix = query.toString();
19
+ const { body } = await this.requestJson(`/v1/rotations${suffix ? `?${suffix}` : ''}`, { method: 'GET' }, '/v1/rotations');
20
+ if (isCalcdError(body))
21
+ return body;
22
+ if (body !== null && typeof body === 'object' && 'specs' in body && Array.isArray(body.specs)) {
23
+ return body;
24
+ }
25
+ throw new Error('finej3: [/v1/rotations] 响应不符合计算器目录格式');
26
+ }
27
+ /** 按目录 rotationId 和角色原始装备快照计算木桩 DPS。 */
28
+ async calculateDps(params) {
29
+ const { body } = await this.requestJson('/v1/dps', {
30
+ method: 'POST',
31
+ headers: { 'Content-Type': 'application/json' },
32
+ body: JSON.stringify(params),
33
+ }, '/v1/dps');
34
+ if (isCalcdError(body))
35
+ return body;
36
+ if (body !== null && typeof body === 'object' && 'dps' in body && typeof body.dps === 'number') {
37
+ return body;
38
+ }
39
+ throw new Error('finej3: [/v1/dps] 响应不符合计算器结果格式');
40
+ }
41
+ }
42
+ //# sourceMappingURL=calcd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calcd.js","sourceRoot":"","sources":["../../../src/clients/calcd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAmB,MAAM,iBAAiB,CAAC;AAG9D,MAAM,CAAC,MAAM,cAAc,GAAG,0BAA0B,CAAC;AAGzD,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;WAC7C,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;WACjD,SAAS,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC;AAC/D,CAAC;AAED,wDAAwD;AACxD,MAAM,OAAO,WAAY,SAAQ,UAAU;IACzC,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,KAAsB,EAAE;QAC7D,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,iCAAiC;IACjC,KAAK,CAAC,aAAa,CAAC,SAA4B,EAAE;QAChD,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,eAAe,CAAC,CAAC;QAC1H,IAAI,YAAY,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9F,OAAO,IAA4B,CAAC;QACtC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,YAAY,CAA2B,MAA8B;QACzE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;SAC7B,EAAE,SAAS,CAAC,CAAC;QACd,IAAI,YAAY,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC/F,OAAO,IAAsB,CAAC;QAChC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;CACF"}
@@ -33,6 +33,11 @@ export declare class HttpClient {
33
33
  private readonly baseUrl;
34
34
  constructor(defaultBaseUrl: string, options: Jx3Options);
35
35
  protected requireTicket(ticket: string | undefined, endpoint: string): string;
36
+ /** 共用请求、鉴权、超时及 JSON 解析,响应格式由各服务处理。 */
37
+ protected requestJson(path: string, init: RequestInit, endpoint: string): Promise<{
38
+ status: number;
39
+ body: unknown;
40
+ }>;
36
41
  private fetchJson;
37
42
  /** 主站 GET;null 和 undefined 都按未传参处理,token 只放请求头。 */
38
43
  protected get<T>(path: string, params: object): Promise<Jx3Envelope<T>>;
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/core/http.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,mBAAmB;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qCAAqC;AACrC,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAEpD,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,CAAC;IACZ,MAAM,EAAE,CAAC,CAAC;CACX;AAED,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,uCAAuC;AACvC,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC;AAEtE,wBAAgB,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAExF;AAED,mCAAmC;AACnC,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;AAChD,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAC9D,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AACpD,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAIxC,qBAAa,UAAU;IACrB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU;IAKvD,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;YAQ/D,SAAS;IAuBvB,mDAAmD;IACnD,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAUvE,4CAA4C;IAC5C,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAQ3E,sCAAsC;IACtC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CAO9E"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/core/http.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,mBAAmB;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qCAAqC;AACrC,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAEpD,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,CAAC;IACZ,MAAM,EAAE,CAAC,CAAC;CACX;AAED,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,uCAAuC;AACvC,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC;AAEtE,wBAAgB,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAExF;AAED,mCAAmC;AACnC,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;AAChD,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAC9D,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AACpD,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAIxC,qBAAa,UAAU;IACrB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU;IAKvD,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAQ7E,sCAAsC;cACtB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;YAkB5G,SAAS;IAUvB,mDAAmD;IACnD,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAUvE,4CAA4C;IAC5C,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAQ3E,sCAAsC;IACtC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CAO9E"}
@@ -15,11 +15,12 @@ export class HttpClient {
15
15
  }
16
16
  return value;
17
17
  }
18
- async fetchJson(url, init, endpoint) {
18
+ /** 共用请求、鉴权、超时及 JSON 解析,响应格式由各服务处理。 */
19
+ async requestJson(path, init, endpoint) {
19
20
  const headers = new Headers(init.headers);
20
21
  if (this.options.token)
21
22
  headers.set('token', this.options.token);
22
- const response = await (this.options.fetch ?? fetch)(url, {
23
+ const response = await (this.options.fetch ?? fetch)(`${this.baseUrl}${path}`, {
23
24
  ...init,
24
25
  headers,
25
26
  signal: AbortSignal.timeout(this.options.timeoutMs ?? 30000),
@@ -32,10 +33,14 @@ export class HttpClient {
32
33
  catch {
33
34
  throw new Error(`finej3: [${endpoint}] 响应不是合法 JSON (http ${response.status})`);
34
35
  }
36
+ return { status: response.status, body };
37
+ }
38
+ async fetchJson(path, init, endpoint) {
39
+ const { status, body } = await this.requestJson(path, init, endpoint);
35
40
  if (body === null || typeof body !== 'object' || !('status' in body)
36
41
  || !Number.isInteger(body.status) || !('detail' in body)
37
42
  || (body.status !== 200 && typeof body.detail !== 'string')) {
38
- throw new Error(`finej3: [${endpoint}] 响应不符合 { status, detail } 格式 (http ${response.status})`);
43
+ throw new Error(`finej3: [${endpoint}] 响应不符合 { status, detail } 格式 (http ${status})`);
39
44
  }
40
45
  return body;
41
46
  }
@@ -48,11 +53,11 @@ export class HttpClient {
48
53
  }
49
54
  const encoded = query.toString();
50
55
  const suffix = encoded ? `?${encoded}` : '';
51
- return this.fetchJson(`${this.baseUrl}${path}${suffix}`, { method: 'GET' }, path);
56
+ return this.fetchJson(`${path}${suffix}`, { method: 'GET' }, path);
52
57
  }
53
58
  /** 网关 action 使用 JSON body,token 通过请求头传入。 */
54
59
  post(action, payload) {
55
- return this.fetchJson(this.baseUrl, {
60
+ return this.fetchJson('', {
56
61
  method: 'POST',
57
62
  headers: { 'Content-Type': 'application/json' },
58
63
  body: JSON.stringify({ ...payload, action }),
@@ -60,7 +65,7 @@ export class HttpClient {
60
65
  }
61
66
  /** 主站路径使用 JSON body,支持批量 ID 等数组参数。 */
62
67
  postPath(path, payload) {
63
- return this.fetchJson(`${this.baseUrl}${path}`, {
68
+ return this.fetchJson(path, {
64
69
  method: 'POST',
65
70
  headers: { 'Content-Type': 'application/json' },
66
71
  body: JSON.stringify(payload),
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/core/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/core/http.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,20 @@
1
1
  export { Jx3Api, MAIN_BASE_URL } from './clients/main.js';
2
2
  export { Jx3SearchApi, SEARCH_BASE_URL } from './clients/search.js';
3
3
  export { Jx3ClientApi, CLIENT_BASE_URL } from './clients/client.js';
4
+ export { Jx3CalcdApi, CALCD_BASE_URL, type Jx3CalcdOptions } from './clients/calcd.js';
4
5
  export { isSuccess } from './core/http.js';
5
6
  export type { Jx3Options, Jx3Envelope, Jx3SuccessEnvelope, Jx3ErrorEnvelope, EmptyObject, GatewayEnvelope, GatewaySuccessEnvelope, GatewayErrorEnvelope, GatewayErrorStatus } from './core/http.js';
6
7
  export type * from './types/main.js';
7
8
  export type * from './types/search.js';
8
9
  export type * from './types/client.js';
10
+ export type * from './types/calcd.js';
9
11
  import { Jx3Api } from './clients/main.js';
10
12
  import { Jx3SearchApi } from './clients/search.js';
11
13
  import { Jx3ClientApi } from './clients/client.js';
14
+ import { Jx3CalcdApi } from './clients/calcd.js';
12
15
  import type { Jx3Options } from './core/http.js';
13
16
  /**
14
- * 按服务覆盖地址。主站为 URL 前缀,搜索和客户端为完整提交入口。
17
+ * 按服务覆盖地址。主站和计算器为 URL 前缀,搜索和客户端为完整提交入口。
15
18
  * 省略的服务使用官方地址。
16
19
  */
17
20
  export interface Jx3BaseUrls {
@@ -21,6 +24,8 @@ export interface Jx3BaseUrls {
21
24
  search?: string;
22
25
  /** 客户端服务,缺省 https://nico.nicemoe.cn/client/submit */
23
26
  client?: string;
27
+ /** 计算器,缺省 https://calcd.nicemoe.cn */
28
+ calcd?: string;
24
29
  }
25
30
  export interface CreateJx3Options extends Omit<Jx3Options, 'baseUrl'> {
26
31
  /** 按服务覆盖地址(自建代理 / 镜像 / 测试环境),可只覆盖其中一部分 */
@@ -33,9 +38,11 @@ export interface Jx3Clients {
33
38
  search: Jx3SearchApi;
34
39
  /** 客户端服务 */
35
40
  client: Jx3ClientApi;
41
+ /** 公开计算器服务 */
42
+ calcd: Jx3CalcdApi;
36
43
  }
37
44
  /**
38
- * 一次性创建三个服务的客户端。
45
+ * 一次性创建四个服务的客户端。
39
46
  *
40
47
  * @example
41
48
  * ```ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpM,mBAAmB,iBAAiB,CAAC;AACrC,mBAAmB,mBAAmB,CAAC;AACvC,mBAAmB,mBAAmB,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;IACnE,0CAA0C;IAC1C,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AACD,MAAM,WAAW,UAAU;IACzB,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW;IACX,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY;IACZ,MAAM,EAAE,YAAY,CAAC;CACtB;AACD;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,UAAU,CAOpE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpM,mBAAmB,iBAAiB,CAAC;AACrC,mBAAmB,mBAAmB,CAAC;AACvC,mBAAmB,mBAAmB,CAAC;AACvC,mBAAmB,kBAAkB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;IACnE,0CAA0C;IAC1C,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AACD,MAAM,WAAW,UAAU;IACzB,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW;IACX,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY;IACZ,MAAM,EAAE,YAAY,CAAC;IACrB,cAAc;IACd,KAAK,EAAE,WAAW,CAAC;CACpB;AACD;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,UAAU,CAQpE"}
package/dist/esm/index.js CHANGED
@@ -1,12 +1,14 @@
1
1
  export { Jx3Api, MAIN_BASE_URL } from './clients/main.js';
2
2
  export { Jx3SearchApi, SEARCH_BASE_URL } from './clients/search.js';
3
3
  export { Jx3ClientApi, CLIENT_BASE_URL } from './clients/client.js';
4
+ export { Jx3CalcdApi, CALCD_BASE_URL } from './clients/calcd.js';
4
5
  export { isSuccess } from './core/http.js';
5
6
  import { Jx3Api } from './clients/main.js';
6
7
  import { Jx3SearchApi } from './clients/search.js';
7
8
  import { Jx3ClientApi } from './clients/client.js';
9
+ import { Jx3CalcdApi } from './clients/calcd.js';
8
10
  /**
9
- * 一次性创建三个服务的客户端。
11
+ * 一次性创建四个服务的客户端。
10
12
  *
11
13
  * @example
12
14
  * ```ts
@@ -22,6 +24,7 @@ export function createJx3(options = {}) {
22
24
  api: new Jx3Api({ ...shared, baseUrl: baseUrl?.api }),
23
25
  search: new Jx3SearchApi({ ...shared, baseUrl: baseUrl?.search }),
24
26
  client: new Jx3ClientApi({ ...shared, baseUrl: baseUrl?.client }),
27
+ calcd: new Jx3CalcdApi({ fetch: shared.fetch, timeoutMs: shared.timeoutMs, baseUrl: baseUrl?.calcd }),
25
28
  };
26
29
  }
27
30
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAK3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AA0BnD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,SAAS,CAAC,UAA4B,EAAE;IACtD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;IACvC,OAAO;QACL,GAAG,EAAE,IAAI,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QACrD,MAAM,EAAE,IAAI,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACjE,MAAM,EAAE,IAAI,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;KAClE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAwB,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAM3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA8BjD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,SAAS,CAAC,UAA4B,EAAE;IACtD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;IACvC,OAAO;QACL,GAAG,EAAE,IAAI,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QACrD,MAAM,EAAE,IAAI,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACjE,MAAM,EAAE,IAAI,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACjE,KAAK,EAAE,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;KACtG,CAAC;AACJ,CAAC"}
@@ -0,0 +1,122 @@
1
+ /** 计算器类型依据 openapi.calcd.json 的完整 schema。 */
2
+ /** 循环的加速、延迟档位。 */
3
+ export interface CalcdVariant {
4
+ index: number;
5
+ /** 加速值区间 [下限, 上限),为 null 时使用 hasteTier。 */
6
+ hasteRange: [number, number] | null;
7
+ hasteTier: number | null;
8
+ latencyTier: number | null;
9
+ durationSeconds: number;
10
+ }
11
+ export interface CalcdRotation {
12
+ rotationId: string;
13
+ name: string;
14
+ title: string;
15
+ weapon: string | null;
16
+ strictHaste: boolean;
17
+ /** 基准可用仍需校验角色实际加速。 */
18
+ baselineAvailable: boolean;
19
+ unavailableReason: string | null;
20
+ variants: CalcdVariant[];
21
+ }
22
+ export interface CalcdSpec {
23
+ spec: string;
24
+ name: string;
25
+ rotations: CalcdRotation[];
26
+ }
27
+ export interface CalcdRotationsData {
28
+ specs: CalcdSpec[];
29
+ }
30
+ /** 整数及数字字符串由服务端按字段约束校验。 */
31
+ export type CalcdIntegerInput = number | string;
32
+ export type CalcdGemSlots = Array<CalcdIntegerInput[] | null> | null;
33
+ /** 客户端格式的装备条目,支持文档中的两套镶嵌字段。 */
34
+ export interface CalcdEquipmentItem {
35
+ nItemIndex: CalcdIntegerInput;
36
+ dwTabIndex: CalcdIntegerInput;
37
+ dwTabType?: CalcdIntegerInput;
38
+ /** 精炼等级 0~10,省略时按 0 计算。 */
39
+ nStrengthLevel?: CalcdIntegerInput;
40
+ dwPermanentEnchantID?: CalcdIntegerInput;
41
+ dwTemporaryEnchantID?: CalcdIntegerInput;
42
+ aMountDiamond?: CalcdGemSlots;
43
+ aSlotItem?: CalcdGemSlots;
44
+ aColorDiamond?: CalcdIntegerInput[] | null;
45
+ ColorInfo?: CalcdGemSlots;
46
+ }
47
+ /** 可直接传入原始装备查询的成功 detail 对象。 */
48
+ export interface CalcdRole {
49
+ serverName: string;
50
+ roleName: string;
51
+ kungfuName: string;
52
+ equipList: CalcdEquipmentItem[];
53
+ }
54
+ /** role 和装备条目允许额外字段,保留调用方快照中的信息。 */
55
+ export interface CalcdDpsParams<Role extends CalcdRole = CalcdRole> {
56
+ rotationId: string;
57
+ role: Role;
58
+ /** 仅在实际加速低于所选循环最低可用档时,补到该档试算。默认关闭。 */
59
+ fillMinimumHaste?: boolean;
60
+ }
61
+ export interface CalcdDpsSkill {
62
+ name: string;
63
+ count: number;
64
+ damage: number;
65
+ dps: number;
66
+ sharePct: number;
67
+ }
68
+ export interface CalcdEnchantGain {
69
+ stat: string;
70
+ amount: number;
71
+ dps: number;
72
+ deltaDps: number;
73
+ gainPct: number;
74
+ }
75
+ export interface CalcdDpsData {
76
+ character: {
77
+ server: string;
78
+ roleName: string;
79
+ kungfu: string;
80
+ };
81
+ spec: string;
82
+ rotationId: string;
83
+ baseline: {
84
+ target: string;
85
+ latencyTier: number;
86
+ externalBuffs: boolean;
87
+ };
88
+ haste: number;
89
+ /** 仅补足试算返回;haste 始终为原始装备加速。 */
90
+ hasteAdjustment?: {
91
+ addedHaste: number;
92
+ simulatedHaste: number;
93
+ };
94
+ matchedVariant: CalcdVariant;
95
+ durationSeconds: number;
96
+ totalDamage: number;
97
+ dps: number;
98
+ skills: CalcdDpsSkill[];
99
+ enchantGains: CalcdEnchantGain[];
100
+ equipment: {
101
+ received: number;
102
+ recognized: number;
103
+ };
104
+ warnings: string[];
105
+ }
106
+ /** HTTP 422 的 HASTE_MISMATCH 错误可提供此诊断信息。 */
107
+ export interface CalcdHasteMismatchDetails {
108
+ actualHaste: number;
109
+ /** 低于最低可用档时,补足到该档所需的点数。 */
110
+ hasteShortfall?: number;
111
+ actualHasteTier: number;
112
+ latencyTier: number;
113
+ availableVariants: CalcdVariant[];
114
+ warnings: string[];
115
+ }
116
+ /** 计算器错误原样返回,以 'code' in response 收窄。 */
117
+ export interface CalcdError {
118
+ code: string;
119
+ message: string;
120
+ details?: CalcdHasteMismatchDetails;
121
+ }
122
+ //# sourceMappingURL=calcd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calcd.d.ts","sourceRoot":"","sources":["../../../src/types/calcd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** 计算器类型依据 openapi.calcd.json 的完整 schema。 */
2
+ export {};
3
+ //# sourceMappingURL=calcd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calcd.js","sourceRoot":"","sources":["../../../src/types/calcd.ts"],"names":[],"mappings":"AAAA,6CAA6C"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "finej3",
3
- "version": "2.1.0",
4
- "description": "剑网 3 API 的 TypeScript SDK,支持主站、搜索和客户端服务,提供 ESM 与 CommonJS 双格式。",
3
+ "version": "2.3.0",
4
+ "description": "剑网 3 API 的 TypeScript SDK,支持主站、搜索、客户端和 DPS 计算器服务,提供 ESM 与 CommonJS 双格式。",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",
7
7
  "module": "./dist/esm/index.js",
@@ -27,7 +27,7 @@
27
27
  "clean": "node -e \"fs.rmSync('dist',{recursive:true,force:true})\"",
28
28
  "build": "npm run clean && tsc -p tsconfig.json && tsc -p tsconfig.cjs.json && node scripts/fixup-dist.mjs",
29
29
  "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p test/tsconfig.json",
30
- "test": "node test/baseurl.mjs",
30
+ "test": "node test/baseurl.mjs && node test/calcd.mjs",
31
31
  "smoke": "node --env-file=.env test/smoke.mjs",
32
32
  "verify-package": "node scripts/verify-package.mjs",
33
33
  "prepublishOnly": "npm run typecheck && npm run build && npm test && npm run verify-package"