Skip to content

Commit a009838

Browse files
committed
补齐测试框架 JSDoc 并应用 eslint 自动修复
1 parent 81f31dc commit a009838

15 files changed

Lines changed: 79 additions & 55 deletions

File tree

src/public/parts/shells/chat/src/chat/lib/utils.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ export async function safeRm(path, options) {
100100
}
101101
catch (e) {
102102
if (isEnoent(e)) return
103-
lastError = /** @type {NodeJS.ErrnoException} */ (e)
103+
lastError = /** @type {NodeJS.ErrnoException} */ e
104104
if (!RM_TRANSIENT_CODES.has(lastError.code)) throw lastError
105105
}
106106
}

src/public/parts/shells/social/src/endpoints/posts.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export function registerPostsRoutes(router) {
4040
const draftContent = {
4141
text: String(req.body.text),
4242
mediaRefs: [
43-
...(req.body.mediaRefs ?? []),
43+
...req.body.mediaRefs ?? [],
4444
...await buildEmojiMediaRefsForPost(username, String(req.body.text)),
4545
],
4646
replyTo: req.body.replyTo,

src/scripts/p2p/test/pure/link_handshake_reorder.test.mjs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,19 @@ class MockDataChannel {
4949
this._listeners = new Map()
5050
}
5151

52-
/** @param {string} type 事件名 @param {Function} handler 处理器 */
52+
/**
53+
* @param {string} type 事件名
54+
* @param {Function} handler 处理器
55+
*/
5356
addEventListener(type, handler) {
5457
if (!this._listeners.has(type)) this._listeners.set(type, new Set())
5558
this._listeners.get(type).add(handler)
5659
}
5760

58-
/** @param {string} type 事件名 @param {Function} handler 处理器 */
61+
/**
62+
* @param {string} type 事件名
63+
* @param {Function} handler 处理器
64+
*/
5965
removeEventListener(type, handler) {
6066
this._listeners.get(type)?.delete(handler)
6167
}
@@ -65,6 +71,7 @@ class MockDataChannel {
6571
this.sent.push(typeof data === 'string' ? data : Buffer.from(data).toString('utf8'))
6672
}
6773

74+
/** 关闭通道。 */
6875
close() {
6976
this.readyState = 'closed'
7077
}
@@ -77,11 +84,14 @@ class MockDataChannel {
7784

7885
/**
7986
* answerer 侧最小 RTCPeerConnection mock:收到 offer 后就绪双通道,答复 answer。
87+
* @returns {{ RTCPeerConnection: typeof MockPC, getInstance: () => MockPC | null }} rtc 工厂与实例取回器
8088
*/
8189
function createAnswererRtc() {
8290
/** @type {MockPC | null} */
8391
let instance = null
92+
/** 最小 RTCPeerConnection mock。 */
8493
class MockPC {
94+
/** 初始化为已连接的稳定状态。 */
8595
constructor() {
8696
this.localDescription = null
8797
this.remoteDescription = null
@@ -121,10 +131,16 @@ function createAnswererRtc() {
121131
else this.signalingState = 'stable'
122132
}
123133

124-
async addIceCandidate() { /* trickle 关闭时不经此路径 */ }
134+
/** trickle 关闭时不经此路径。 */
135+
async addIceCandidate() { }
136+
/** 标记连接关闭。 */
125137
async close() { this.connectionState = 'closed' }
126138
}
127-
return { RTCPeerConnection: MockPC, getInstance: () => instance }
139+
return {
140+
RTCPeerConnection: MockPC,
141+
/** @returns {MockPC | null} 最近创建的 mock 实例 */
142+
getInstance: () => instance,
143+
}
128144
}
129145

130146
Deno.test({
@@ -145,7 +161,10 @@ Deno.test({
145161
const signal = {
146162
/** @param {unknown} _message 出站信令(answer/ice,测试中忽略) */
147163
send(_message) {},
148-
/** @param {(message: unknown) => void} handler 入站信令处理器 @returns {() => void} */
164+
/**
165+
* @param {(message: unknown) => void} handler 入站信令处理器
166+
* @returns {() => void} 取消订阅
167+
*/
149168
onRemote(handler) { signalHandler = handler; return () => { signalHandler = null } },
150169
}
151170

src/scripts/test/core/baseline.mjs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export function nextBaselineEma(current, sample, emaN, opts = {}) {
3232
/**
3333
* @param {number | null | undefined} current 当前基线 ms
3434
* @param {number | null | undefined} durationMs 本次耗时
35-
* @returns {number | null}
35+
* @returns {number | null} 新基线 ms
3636
*/
3737
export function nextBaselineDurationMs(current, durationMs) {
3838
return nextBaselineEma(current, durationMs, BASELINE_EMA_DURATION, { min: 0, allowZero: false })
@@ -41,7 +41,7 @@ export function nextBaselineDurationMs(current, durationMs) {
4141
/**
4242
* @param {number | null | undefined} current 当前基线 MB
4343
* @param {number | null | undefined} measuredMb 本次峰值 MB
44-
* @returns {number | null}
44+
* @returns {number | null} 新基线 MB
4545
*/
4646
export function nextBaselineMemMb(current, measuredMb) {
4747
const sample = measuredMb == null ? null : Math.ceil(measuredMb)
@@ -51,7 +51,7 @@ export function nextBaselineMemMb(current, measuredMb) {
5151
/**
5252
* @param {number | null | undefined} current 当前基线 %
5353
* @param {number | null | undefined} avgCpuPct 本次运行期间平均全机 CPU %
54-
* @returns {number | null}
54+
* @returns {number | null} 新基线 %
5555
*/
5656
export function nextBaselineCpuPct(current, avgCpuPct) {
5757
const sample = avgCpuPct == null ? null : Math.round(avgCpuPct * 10) / 10

src/scripts/test/core/deps.mjs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ function topoSortKeys(keys, deps, compareTieBreak) {
159159
* @param {string} b 键
160160
* @param {Map<string, number>} dependentCount 被依赖计数
161161
* @param {Map<string, number>} depCount 依赖计数
162-
* @returns {number}
162+
* @returns {number} 排序比较值(<0 表示 a 在前)
163163
*/
164164
function compareTopoTieBreak(a, b, dependentCount, depCount) {
165165
const depByA = dependentCount.get(a) ?? 0
@@ -178,7 +178,7 @@ function compareTopoTieBreak(a, b, dependentCount, depCount) {
178178
/**
179179
* 全库 suite 依赖计数(tie-break 用)。
180180
* @param {SuiteDef[]} allSuites 全部 suite
181-
* @returns {{ depCount: Map<string, number>, dependentCount: Map<string, number> }}
181+
* @returns {{ depCount: Map<string, number>, dependentCount: Map<string, number> }} 各 suite 的依赖数与被依赖数
182182
*/
183183
function buildSuiteMetrics(allSuites) {
184184
/** @type {Map<string, number>} */
@@ -208,7 +208,7 @@ function buildSuiteMetrics(allSuites) {
208208
/**
209209
* suite 直接依赖边(越界边由 topoSortKeys 内部按 keySet 过滤)。
210210
* @param {SuiteDef[]} suites 待排序 suite
211-
* @returns {Map<string, Set<string>>}
211+
* @returns {Map<string, Set<string>>} suite 键 → 直接依赖键集合
212212
*/
213213
function buildSuiteDeps(suites) {
214214
return new Map(suites.map(suite => [
@@ -241,7 +241,7 @@ export function topoSortSuites(suites, allSuites = suites) {
241241
/**
242242
* 从 suite 依赖构建 manifest 级图(同 manifest 内边忽略)。
243243
* @param {SuiteDef[]} suites 全部 suite
244-
* @returns {{ depCount: Map<string, number>, dependentCount: Map<string, number>, deps: Map<string, Set<string>> }}
244+
* @returns {{ depCount: Map<string, number>, dependentCount: Map<string, number>, deps: Map<string, Set<string>> }} manifest 级依赖计数与边
245245
*/
246246
function buildManifestGraph(suites) {
247247
const ids = [...new Set(suites.map(s => s.manifestId))]

src/scripts/test/core/manifest.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import { join, relative } from 'node:path'
66

77
import { attachDependencies, sortManifestIds } from './deps.mjs'
88
import { matchGlob } from './glob.mjs'
9-
import { filterTriggerRelevantFiles, mergeTriggerFilter } from './trigger_filter.mjs'
109
import { parseManifestResources } from './resources.mjs'
10+
import { filterTriggerRelevantFiles, mergeTriggerFilter } from './trigger_filter.mjs'
1111
/**
1212
* manifest 中单个 suite 的解析结果。
1313
* @typedef {object} SuiteDef

src/scripts/test/core/proc_sample.mjs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import { meanSample } from './baseline.mjs'
1212
let osUtilsModule = null
1313

1414
/**
15-
* @returns {Promise<import('npm:node-os-utils').default>}
15+
* 惰性加载并缓存 node-os-utils 实例。
16+
* @returns {Promise<import('npm:node-os-utils').default>} OSUtils 单例
1617
*/
1718
async function getOsUtils() {
1819
if (!osUtilsModule) {
@@ -26,7 +27,7 @@ async function getOsUtils() {
2627
/**
2728
* @param {object[]} list node-os-utils ProcessInfo[]
2829
* @param {number} rootPid 根 PID
29-
* @returns {number[]}
30+
* @returns {number[]} 根及其全部子孙 PID
3031
*/
3132
export function treePidsFromProcessList(list, rootPid) {
3233
/** @type {Map<number, number[]>} */
@@ -53,8 +54,9 @@ export function treePidsFromProcessList(list, rootPid) {
5354
}
5455

5556
/**
57+
* Windows 下经 PowerShell 枚举进程树 PID(回退路径)。
5658
* @param {number} rootPid 根 PID
57-
* @returns {Promise<number[]>}
59+
* @returns {Promise<number[]>} 根及其全部子孙 PID
5860
*/
5961
async function collectTreePidsWindows(rootPid) {
6062
try {
@@ -138,7 +140,7 @@ export async function samplePidsUsage(pids) {
138140
/**
139141
* pidusage 多核 CPU% 压到调度语义 0–100。
140142
* @param {number} cpu pidusage 聚合 cpu
141-
* @returns {number}
143+
* @returns {number} 归一化后的 0–100 CPU%
142144
*/
143145
export function normalizePidusageCpuPct(cpu) {
144146
const cores = Math.max(1, os.cpus().length)
@@ -174,7 +176,7 @@ export class ProcessUsageTracker {
174176
}
175177

176178
/**
177-
* @returns {{ peakMemMb?: number, avgCpuPct?: number }}
179+
* @returns {{ peakMemMb?: number, avgCpuPct?: number }} 采样汇总(峰值内存 MB、平均 CPU%)
178180
*/
179181
finish() {
180182
const peakMemMb = this.#memBytesSamples.length

src/scripts/test/core/resources.mjs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ import { MiB } from './concurrency.mjs'
2222
export function parseManifestResources(raw) {
2323
if (!raw || typeof raw !== 'object') return {}
2424
return {
25-
...(Number.isFinite(raw.memMb) && raw.memMb > 0 ? { memMb: Math.floor(raw.memMb) } : {}),
26-
...(Number.isFinite(raw.cpuPct) && raw.cpuPct >= 0 ? { cpuPct: Math.min(100, raw.cpuPct) } : {}),
25+
...Number.isFinite(raw.memMb) && raw.memMb > 0 ? { memMb: Math.floor(raw.memMb) } : {},
26+
...Number.isFinite(raw.cpuPct) && raw.cpuPct >= 0 ? { cpuPct: Math.min(100, raw.cpuPct) } : {},
2727
}
2828
}
2929

@@ -95,7 +95,7 @@ export function suiteSchedulePriority(suite, entry) {
9595
/**
9696
* suite 是否通过 serial.mjs 在内部并行跑多文件(应下放 CPU/内存预算)。
9797
* @param {SuiteDef} suite suite
98-
* @returns {boolean}
98+
* @returns {boolean} 是否经 serial.mjs 内部并行多文件
9999
*/
100100
export function suiteUsesSerialRunner(suite) {
101101
return suite.run.some(arg => String(arg).includes('serial.mjs'))

src/scripts/test/core/trigger_filter.mjs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,17 @@ const DEFAULT_IGNORE_PATTERNS = [
2323

2424
/**
2525
* Merge manifest- and suite-level triggerFilter.
26-
* @param {TriggerFilter | undefined} manifestFilter
27-
* @param {TriggerFilter | undefined} suiteFilter
28-
* @returns {TriggerFilter | undefined}
26+
* @param {TriggerFilter | undefined} manifestFilter manifest-level filter
27+
* @param {TriggerFilter | undefined} suiteFilter suite-level filter (overrides manifest)
28+
* @returns {TriggerFilter | undefined} merged filter, or undefined when defaults apply unchanged
2929
*/
3030
export function mergeTriggerFilter(manifestFilter, suiteFilter) {
3131
if (!manifestFilter && !suiteFilter) return undefined
3232
const m = manifestFilter ?? {}
3333
const s = suiteFilter ?? {}
3434
const ignoreDefaults = s.ignoreDefaults ?? m.ignoreDefaults ?? true
35-
const ignore = [...(m.ignore ?? []), ...(s.ignore ?? [])]
36-
const unignore = [...(m.unignore ?? []), ...(s.unignore ?? [])]
35+
const ignore = [...m.ignore ?? [], ...s.ignore ?? []]
36+
const unignore = [...m.unignore ?? [], ...s.unignore ?? []]
3737
if (ignoreDefaults !== false && !ignore.length && !unignore.length)
3838
return undefined
3939
/** @type {TriggerFilter} */
@@ -45,8 +45,8 @@ export function mergeTriggerFilter(manifestFilter, suiteFilter) {
4545

4646
/**
4747
* @param {string} path repo-relative path
48-
* @param {TriggerFilter | undefined} [filter]
49-
* @returns {boolean}
48+
* @param {TriggerFilter | undefined} [filter] merged trigger filter
49+
* @returns {boolean} true when the path counts as a trigger-relevant change
5050
*/
5151
function isTriggerRelevantPath(path, filter) {
5252
if (filter?.unignore?.some(pat => matchGlob(pat, path)))
@@ -62,8 +62,8 @@ function isTriggerRelevantPath(path, filter) {
6262

6363
/**
6464
* @param {string[]} files changed paths
65-
* @param {TriggerFilter | undefined} [filter]
66-
* @returns {string[]}
65+
* @param {TriggerFilter | undefined} [filter] merged trigger filter
66+
* @returns {string[]} paths that survive filtering (trigger-relevant)
6767
*/
6868
export function filterTriggerRelevantFiles(files, filter) {
6969
return files.filter(file => isTriggerRelevantPath(file, filter))

src/scripts/test/runner/run_command.mjs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,7 @@ export async function runCommand(command, extraEnv = {}, options) {
173173
usageTracker.sample().finally(() => { usageSampling = false })
174174
}, WATCH_INTERVAL_MS)
175175

176-
/**
177-
*
178-
*/
176+
/** @returns {{ peakMemMb?: number, avgCpuPct?: number }} 采样汇总 */
179177
const usageResult = () => usageTracker.finish()
180178

181179
const watchdog = setInterval(() => {
@@ -208,8 +206,8 @@ export async function runCommand(command, extraEnv = {}, options) {
208206
signal: abortController.signal,
209207
no_output_record: true,
210208
/**
211-
*
212-
* @param child
209+
* @param {import('node:child_process').ChildProcess} child spawn 子进程
210+
* @returns {void}
213211
*/
214212
on_spawn: child => usageTracker.setRootFromChild(child),
215213
/**

0 commit comments

Comments
 (0)