#!/usr/bin/env node /** * verify-cross-platform.mjs — S2-P6 跨端一致性自动验证(方案 B:静态结构比对) * * 对索引中全部组件的 4 端实现(H5 / React-JSX / Vue2 / Vue3)提取 class 集合与 * 结构骨架(标签集合 + 元素数),做集合 diff,输出 tests/cross-platform-report.json。 * * - 零运行时依赖(只读文件 + 正则,不渲染、不联网)。 * - 本脚本只负责「暴露差异」,发现差异 = 任务价值,不在本脚本内顺手修。 * - 退出码:0 = 报告成功生成;1 = 脚本自身失败(读不到数据、无输出、total 与索引不一致)。 * * 用法:node tools/verify-cross-platform.mjs [--out tests/cross-platform-report.json] */ import { readFileSync, writeFileSync, mkdirSync } from 'fs'; import { fileURLToPath } from 'url'; import { dirname, join, basename } from 'path'; const __dirname = dirname(fileURLToPath(import.meta.url)); const ROOT = join(__dirname, '..'); const arg = (k) => { const i = process.argv.indexOf(k); return i > -1 ? process.argv[i + 1] : null; }; const OUT = arg('--out') || join(ROOT, 'tests', 'cross-platform-report.json'); const data = JSON.parse(readFileSync(join(ROOT, 'site', 'data.json'), 'utf8')); const components = data.components || []; if (!components.length) { console.error('[FATAL] site/data.json 无 components'); process.exit(1); } /* ---------- 提取器 ---------- */ function addTokens(set, text) { (text || '').split(/\s+/).filter(Boolean).forEach((t) => set.add(t)); } // H5:class="a b" function classesFromHtml(src) { const set = new Set(); const re = /class\s*=\s*"([^"]*)"/g; let m; while ((m = re.exec(src))) addTokens(set, m[1]); // H5 演示页 DOM 由内联