- 新增 miniapp/constants/profileLabels.js 作为「枚举码→中文简体」唯一字典 (婚姻/子女/学历/职业/吸烟饮酒/择偶子女/红娘状态),覆盖表单值与种子 实际值两套并集,保证详情页无论后端返回哪种码都显示中文 - 修复「择偶条件-子女」下拉英文选项(any/accept/reject→不限/可接受/不接受), 改用 value/label 数组 + range-key="label" - 修复 recommend-card / user-card / profile-detail / profile-confirm 直接渲染 后端枚举码(educationCode/maritalStatus/occupationCode…)的问题,改由 observers 派生中文 label 上屏 - 清理残留英文文案:Required 条件→必须符合的条件、喜欢TA/向Ta→喜欢对方/向对方、 U51 服务预约→服务预约、U64 公益服务记录→公益服务记录 - 修复 7 个英文窗口标题与 3 个英文占位页正文 - matchmaker 历史服务状态消除原始码兜底,统一走字典 - 加固 scripts/audit-miniapp-language.mjs(A 整行先剥离 mustache、B 排除 bind:action 处理器、F 窗口标题、JPG/PNG 入白名单) - 新增 ui-tests/miniapp-language-contracts.mjs 语种守卫(复用审计脚本,断言 0 命中), UI 契约门禁 MIN_GUARDS 21→22;已做负向注入验证判别力
55 lines
2.0 KiB
JavaScript
55 lines
2.0 KiB
JavaScript
import assert from 'node:assert/strict'
|
||
import { spawnSync } from 'node:child_process'
|
||
import { dirname, resolve } from 'node:path'
|
||
import { fileURLToPath } from 'node:url'
|
||
|
||
/**
|
||
* 小程序界面语种契约守卫
|
||
* ============================
|
||
* 复用 scripts/audit-miniapp-language.mjs 的全量扫描(A 文本节点 / B 属性 /
|
||
* C picker 选项 / D JS 文案字段 / E 繁体字 / F 窗口标题),断言「0 命中」。
|
||
*
|
||
* 为什么必须独立成守卫:2026-09 真机事故——后端枚举码(never_married / bachelor /
|
||
* any / accept / reject)直接当展示值上屏,静态类型检查 / WXML·WXSS 编译 / 结构
|
||
* 守卫全都抓不到,只有人眼在真机才看得见。这是「界面必须全中文简体」唯一的自动化兜底。
|
||
*
|
||
* 单一事实源:本守卫不重复实现扫描逻辑,而是直接派生 audit 脚本——改扫描规则只改一处。
|
||
*/
|
||
|
||
const root = resolve(dirname(fileURLToPath(import.meta.url)), '..')
|
||
const auditScript = resolve(root, 'scripts/audit-miniapp-language.mjs')
|
||
|
||
const r = spawnSync(process.execPath, [auditScript, '--json'], {
|
||
cwd: root,
|
||
encoding: 'utf8',
|
||
env: { ...process.env, NO_COLOR: '1' },
|
||
})
|
||
|
||
let findings = []
|
||
if (r.status === 3) {
|
||
// 审计脚本自身崩溃(异常分支),绝不能当成「通过」默默绿掉
|
||
throw new Error(
|
||
'语种审计脚本执行失败(exit 3),请先修复 scripts/audit-miniapp-language.mjs:\n' +
|
||
(r.stderr || r.stdout || '(无输出)'),
|
||
)
|
||
}
|
||
if (r.stdout && r.stdout.trim()) {
|
||
try {
|
||
findings = JSON.parse(r.stdout)
|
||
} catch {
|
||
// 理论上 --json 只输出 JSON;解析失败则交给下面的长度断言兜底
|
||
}
|
||
}
|
||
|
||
assert.equal(
|
||
findings.length,
|
||
0,
|
||
`小程序仍存在英文/非中文简体上屏(${findings.length} 处)。示例:\n` +
|
||
findings
|
||
.slice(0, 8)
|
||
.map((f) => ` ${f.file}:${f.line} [${f.kind}] ${f.detail}`)
|
||
.join('\n'),
|
||
)
|
||
|
||
console.log(`Miniapp language contracts passed(语种审计 0 命中)`)
|