尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Rome JSON Formatter 的 Prettier 兼容性测试套件:快照提取、运行机制与报告生成

发布时间:2026/9/20 2:21:53

资讯中心
01
ARTICLE

Rome JSON Formatter 的 Prettier 兼容性测试套件:快照提取、运行机制与报告生成

Rome JSON Formatter 的 Prettier 兼容性测试套件:快照提取、运行机制与报告生成
开发工具CLILint格式化静态分析代码质量构建工具【免费下载链接】toolsUnified developer tools for JavaScript, TypeScript, and the web项目地址https://gitcode.com/gh_mirrors/to/tools点击查看免费下载Rome本项目为 Rome 工具的完整镜像仓库面向 JavaScript、TypeScript 与 Web 的统一开发者工具链的 JSON 格式化器并非闭门造车而是建立在一套与 Prettier 官方快照逐字节对齐的兼容性测试体系之上。本文以 crates/rome_json_formatter/tests/specs/prettier/README.md 为骨架结合仓库内测试入口、快照提取脚本与差异报告器的源码实现完整讲解这套测试套件的目录组织、运行命令、REPORT_PRETTIER报告机制以及从 Prettier 仓库同步更新快照的完整流程。读完本文你将掌握如何运行该测试、如何解读.snap与.prettier-snap文件的差异、如何生成兼容性度量报告并理解占位符、范围格式化range formatting等底层细节的实现原理。这套测试套件要解决什么问题Rome 的格式化器在设计上以 Prettier 的输出作为兼容性基准同一段代码rome_json_formatter格式化后的结果应当与 Prettier 的官方快照一致。为此仓库将 Prettier 官方测试仓库中的 JSON 相关用例含输入文件与期望输出抽取出来转存为本仓库的 Rust 测试数据并注册为常规的cargo test用例。这套机制的价值在于持续回归每次修改格式化器实现都能立即发现与 Prettier 输出的偏差差异可视化不一致时生成 unified diff指出 Rome 与 Prettier 的具体分歧点量化兼容度通过REPORT_PRETTIER1环境变量输出整份report.md统计文件级与行级相似度用数字追踪兼容性进展。测试数据的目录组织Prettier 相关测试数据全部位于crates/rome_json_formatter/tests/specs/prettier/下按语言特性分子目录。当前仓库中 JSON 侧包含四大类目录覆盖场景代表性文件json/JSON 语法全覆盖pass1.jsonJSON Test Pattern、number.json、single-quote.json、key-value.json等json5-as-json-with-trailing-commas/带尾逗号的 JSON5 风格输入nested-quotes.jsonrange/范围range格式化仅重排指定区间inside-array.json 及大量 issue 用例issue-4009.json、issue-7116.json、issue2297.jsonwith-comment/块注释与行注释line-comment.json每个用例目录内同时存在三种文件.json输入文件可能含占位符见下文.prettier-snapPrettier 官方期望输出由提取脚本生成测试时作为比对基准.snapRome 自身测试快照仅在 Rome 输出与 Prettier 不一致时才生成。此外还有两份支撑文件prepare_tests.jsJSON 侧提取脚本入口与 README.md本文所讲解的说明文档。运行 Prettier 兼容性测试原文档给出的命令是cargo test -p rome_js_formatter --test prettier_tests需要说明的是该 README 在rome_js_formatter与rome_json_formatter两个 crate 中各有一份见 crates/rome_js_formatter/tests/specs/prettier/README.md针对 JSON 侧的正确包名应为cargo test -p rome_json_formatter --test prettier_tests测试入口位于 crates/rome_json_formatter/tests/prettier_tests.rs核心只有两段逻辑tests_macros::gen_tests! {tests/specs/prettier/{json}/**/*.{json}, crate::test_snapshot, } fn test_snapshot(input: static str, _: str, _: str, _: str) { countme::enable(true); let root_path Path::new(concat!( env!(CARGO_MANIFEST_DIR), /tests/specs/prettier/ )); let test_file PrettierTestFile::new(input, root_path); let options JsonFormatOptions::default().with_indent_style(IndentStyle::Space(2)); let language language::JsonTestFormatLanguage::default(); let snapshot PrettierSnapshot::new(test_file, language, options); snapshot.test() }要点解读tests_macros::gen_tests!是仓库自定义的声明式测试生成宏实现见 crates/tests_macros/src/lib.rs按 glob 模式tests/specs/prettier/{json}/**/*.{json}把每个匹配文件展开为一个独立测试用例无需手写测试函数测试固定使用2 空格缩进IndentStyle::Space(2)与 Prettier 默认配置对齐crates/rome_json_formatter/tests/language.rs 中的JsonTestFormatLanguage通过parse_json(text, JsonParserOptions::default().with_allow_comments())解析输入——注意这里显式允许注释这正是with-comment/目录用例能够通过解析的前提。测试执行链路从输入文件到差异判定单条用例的完整执行由 crates/rome_formatter_test/src/test_prettier_snapshot.rs 中的PrettierTestFile与PrettierSnapshot两个结构体承担流程如下读取并预处理输入PrettierTestFile::new读取输入文件调用strip_prettier_placeholders剥离 Prettier 风格的占位符光标lt;|gt;、lt;lt;lt;PRETTIER_RANGE_STARTgt;gt;gt;、lt;lt;lt;PRETTIER_RANGE_ENDgt;gt;gt;见 utils.rs 的StripPlaceholders并记录它们在原文中的偏移量随后把prettier-ignore替换为rome-ignore format: prettier ignore使 Rome 的抑制注释语法与 Prettier 的prettier-ignore语义对齐解析按parse_input解析出语法树AnyParse格式化formatted()根据是否有范围占位符分两条路径——有范围时调用language.format_range只格式化指定TextRange再替换回原文件无范围时调用format_node全量格式化幂等性校验无错误且非范围格式化时CheckReformat会对输出结果再次解析并格式化验证格式化结果再格式化后不变实现见 crates/rome_formatter_test/src/check_reformat.rs这是格式化器稳定性的重要保障与 Prettier 快照比对get_prettier_diff读取同目录下对应的.prettier-snap文件若 Rome 输出与之一致则判定PrettierDiff::Same并清理可能残留的.snap/.snap.new文件不一致则用similar::TextDiff生成 unified diff头部标注Prettier与Rome写快照仅当存在差异时才通过SnapshotBuilder生成.snap文件。解读一份.snap文件以 nested-quotes.json.snap 为例快照依次包含# Input、# Prettier differencesunified diff、# OutputRome 实际输出与解析错误信息四段。diff 段直观展示了 Rome 与 Prettier 的分歧例如 Prettier 会把首行对象展开为多行属性而当时版本的 Rome 保持单行紧凑singleQuote: example这类 JSON5 单引号与未归一化的键Rome 也未做重排。这类快照正是追踪兼容性差距、指导后续实现改进的第一手资料。生成兼容性差异报告REPORT_PRETTIER原文档说明设置环境变量REPORT_PRETTIER1后运行测试会输出一份report.md其中包含 Rome 与 Prettier 输出的穷尽式差异exhaustive difference。其实现位于 crates/rome_formatter_test/src/diff_report.rsDiffReport是一个进程级单例内部用MutexVecDiffReportItem收集每个用例的 Rome 输出与 Prettier 输出首次访问时通过libc::atexit注册进程退出回调确保测试全部结束后统一打印报告仅当REPORT_PRETTIER1时收集数据is_ignored会过滤掉一批 Prettier 中暂不支持的实验性语法文件名如partial-application、pipeline、record、v8intrinsic.js等报告输出格式由环境变量控制REPORT_TYPEmarkdown默认→ 输出report.mdREPORT_TYPEjson→ 输出report.json结构化数据便于程序消费REPORT_FILENAMEpath→ 自定义报告文件名。报告内容包含两个核心兼容度指标文件级平均相似度file_based_average_prettier_similaritycompatibility_file 匹配行数 / max(rome 行数, prettier 行数)再对所有文件取平均行级平均相似度line_based_average_prettier_similarity所有文件中匹配行总数 / 双方行数较大者之和。每个文件还会附带各自的Prettier Similarity百分比与逐行 diff/-标注Markdown 报告按文件名排序并汇总# Overall Metrics章节。这套指标让兼容性工作从感觉差不多了变成可量化、可追踪的工程度量。更新 Prettier 快照完整操作流程当 Prettier 官方修复了某个格式问题、新增了用例或 Rome 需要对齐新的行为时需要把 Prettier 仓库中的最新快照重新提取进本仓库。原文档给出了完整步骤结合源码可进一步明确每一步的实质克隆 Prettier 仓库到本地提取脚本会从该仓库的tests/format目录下遍历用例见下文PRETTIER_ROOT定义清空本仓库的crates/rome_json_formatter/tests/specs/prettier目录确保所有过时用例被移除避免残留文件干扰进入crates/rome_formatter_test/src/prettier目录该目录是跨 formatter 共享的提取工具所在地包含 package.json、prepare_tests.js与pnpm-lock.yaml安装依赖pnpm install根据 package.json依赖为prettier3.0.0并声明pnpm^8.0.0引擎约束——提取过程本身需要用 Node 版 Prettier 重新格式化期望输出回到crates/rome_json_formatter/tests/specs/prettier目录运行node crates/rome_json_formatter/tests/specs/prettier/prepare_tests.js prettier root directory其中prettier root directory是步骤 1 克隆的 Prettier 仓库根目录。提取脚本的工作原理入口脚本 crates/rome_json_formatter/tests/specs/prettier/prepare_tests.js 只有数行真正的工作在共享实现 crates/rome_formatter_test/src/prettier/prepare_tests.js 中PRETTIER_ROOT path.resolve(process.argv[2], tests/format)即从 Prettier 仓库的tests/format出发递归遍历tests/format/jsonJSON 侧通过extractPrettierTests(json, { parser: json })指定跳过以jsfmt.spec开头的 spec 文件对每个输入文件定位同级__snapshots__/jsfmt.spec.js.snap快照按 key${file} format 1取出期望输出再用正则截取output与结尾之间的内容关键细节由于 Rome 与 Prettier 的默认格式化选项不同提取脚本会用 Node 版 Prettier 以统一配置重新格式化快照内容再写入.prettier-snap文件。统一配置在脚本顶部定义const defaultConfig { trailingComma: all, tabWidth: 2, printWidth: 80, singleQuote: false, jsxSingleQuote: false, useTabs: false, embeddedLanguageFormatting: off };这保证printWidth: 80、双引号、2 空格缩进、全量尾逗号等基准与 Rome 测试侧使用的JsonFormatOptions::default().with_indent_style(IndentStyle::Space(2))对齐若快照中找不到对应 keyPrettier 侧无快照则退而求其次直接用 Prettier 格式化输入文件本身把结果作为期望输出写入.prettier-snap输入文件会原样复制到本仓库对应相对路径相对tests/format的路径映射为相对tests/specs/prettier的路径保持目录结构一一对应。实战解读从用例到兼容性结论以 JSON Test Pattern 用例 pass1.json 为例输入是一段故意写得杂乱无章的 JSON元素间散布换行与空格、数字写成98.6/1e00、键含转义序列等对应的 pass1.json.prettier-snap 展示了 Prettier 的规范化结果数组与对象元素每行一个、数字规整为-9876.54321、1.23456789e34空数组/空对象紧凑为[]/{}字符串中的\/归一为/。由于该目录下没有pass1.json.snap说明当前 Rome 输出与 Prettier 完全一致——这是判断单个用例通过与否的最快捷方式存在.snap即有差异不存在即完全对齐。类似地range/inside-array.json 通过lt;lt;lt;PRETTIER_RANGE_STARTgt;gt;gt;与lt;lt;lt;PRETTIER_RANGE_ENDgt;gt;gt;占位符圈定只格式化[2, 3, 4, 5, 6, 7]这一区间其 期望输出 表明 Prettier 会对整个数组乃至外层对象做连贯重排。这类用例专门验证 Romeformat_range的区间处理与 Prettier 的一致性对应 utils.rs 中占位符剥离与 test_prettier_snapshot.rs 中反向区间的防御性处理end start时直接跳过因为 Rust 侧无法构造反向TextRange。注意事项与边界包名差异原 README 中命令写的是rome_js_formatter但该目录属于 JSON 侧运行时应使用cargo test -p rome_json_formatter --test prettier_tests忽略列表REPORT_PRETTIER报告会过滤 Prettier 中 Rome 尚未实现/有意跳过的实验性语法见diff_report.rs的is_ignored模式列表统计时这些文件不参与度量Node 依赖更新快照依赖 Node 侧 Prettier 3.0.0 与 pnpm 8仅在需要同步上游时执行日常cargo test不依赖 Node 环境仓库只读本仓库为镜像上述更新流程用于说明机制实际开发应在可写副本中进行。通过这套机制Rome 的 JSON 格式化器得以在数千行真实用例的监督下持续向 Prettier 对齐任何一次重构都能被立刻暴露、量化并回归验证。赞分享开发工具CLILint格式化静态分析代码质量构建工具【免费下载链接】toolsUnified developer tools for JavaScript, TypeScript, and the web项目地址https://gitcode.com/gh_mirrors/to/tools点击查看免费下载相关推荐3步搞定B站音频无损下载BilibiliDown新手完全指南3步搞定B站音频无损下载BilibiliDown新手完全指南 还在为无法下载B站音频而烦恼吗想收藏喜欢的音乐却找不到合适的工具今天我要为你介绍一款神器——开发工具CLILint格式化静态分析代码质量构建工具Biome CSS 格式化器 Prettier 兼容性测试套件快照镜像、差异报告与更新机制全解析Biome CSS 格式化器 Prettier 兼容性测试套件快照镜像、差异报告与更新机制全解析 Biome 的 CSS 与 SCSS 格式化器通过镜像 Pr开发工具Lint格式化静态分析代码质量前端Biome HTML Formatter 的 Svelte 兼容性测试套件prettier-plugin-svelte 样本导入机制深度解析Biome HTML Formatter 的 Svelte 兼容性测试套件prettier plugin svelte 样本导入机制深度解析 本篇文章围绕 B开发工具Lint格式化静态分析代码质量前端上一篇如何用Hunter快速搭建C/C项目5分钟入门教程与实战案例下一篇企业级3D人体动作生成实战指南HumanML3D数据集深度解析与架构设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。