十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Notes for release

Notes for release Notes for release【免费下载链接】sanitySanity Studio – Rapidly configure content workspaces powered by structured content项目地址: https://gitcode.com/GitHub_Trending/sa/sanityRelease Notessanity-io/cli (​sanity/cli)v6.1.3Bug Fixesuse non-deprecated--project-idflag for dataset import during init (#661) (0b660b9)...sanity-io/some-other-repo (some-other-package)v1.0.0Bug Fixessome unrelated fix (#1) (abc1234)逐层拆解这份骨架### Notes for release 分隔线这是 Sanity PR 模板要求的发布说明章节头。夹具中紧随其后的---横向分隔线也是extractReleaseNotes普通路径判定章节结束的标记。### Release NotesRenovate 自带的总标题与details块共同构成 changelog 摘要。details/summary块每个依赖包一个折叠块summary采用仓库 (包名)格式例如sanity-io/cli (sanity/cli)。注意包名中的被写成了#8203;实体——这是 Renovate 插入的零宽空格用于防止触发 GitHub 的 提及通知。版本标题h3### \v6.1.3每个版本一段。章节标题h5##### Bug Fixes、##### Features、##### Dependencies等。列表项形如- 描述 (#661) (0b660b9)同时携带 PR/issue 引用与提交哈希。!--renovate-debug:...--Renovate 的调试注释内容是 base64 编码的 JSON本例解码后为{createdInVer:43.66.4}即生成该 PR 的 Renovate 版本。夹具中三个版本的sanity/cli变更内容是理解解析行为的关键素材版本章节变更内容v6.1.3Bug Fixes在 init 期间的数据集导入中使用非弃用的--project-id标志#661commit0b660b9v6.1.2Bug Fixes新安装时升级 react react-dom 到最新版本从 studio workDir 解析react-dom/server与sanity/uideps:更新 oclif-tooling需剔除v6.1.2Dependenciessanity/cli-core提升到 1.1.1sanity/cli-test提升到 0.2.3需剔除v6.1.1Bug Fixes懒加载 icon resolver避免在 import 时引入sanity/uiv6.1.1Features为sanity init新增--template标志其他仓库Bug Fixessome unrelated fix非白名单整体剔除解析管线parseRenovateReleaseNotes 的四阶段处理核心实现位于 parseRenovateReleaseNotes.ts入口函数parseRenovateReleaseNotes(prBody)将原始 PR 描述转换为可写入 Sanity 的 Portable Text 块。它刻意在原始 Markdown/HTML 字符串上操作因为源码注释明确说明details块在 Portable Text 转换后无法存活见函数上方的 JSDoc。export function parseRenovateReleaseNotes(prBody: string): NormalizedMarkdownBlock[] { const blocks extractDetailsBlocks(prBody) const allowed blocks.filter((b) RENOVATE_RELEASE_NOTES_PACKAGES.has(b.packageName)) if (allowed.length 0) return [] const combined allowed.map((b) b.content).join(\n\n) const filtered filterVisibleSections(combined) const cleaned cleanChangelogItems(filtered) if (!cleaned.trim()) return [] return markdownToPortableText(cleaned) }阶段一提取details块并解析包名extractDetailsBlocks用正则匹配details\s*summary.../summary.../details从summary的括号部分提取包名核心是cleaned.match(/\(([^)])\)\s*$/)。提取前先执行summaryText.replace(/#8203;/g, )去除零宽空格实体这正是夹具中#8203;sanity/cli能正确解析为sanity/cli的原因。没有任何details块或块内无内容时返回空数组。阶段二白名单过滤export const RENOVATE_RELEASE_NOTES_PACKAGES: ReadonlySetstring new Set([sanity/cli])只有包名命中白名单的块才被保留。因此夹具中sanity-io/some-other-repo (some-other-package)块的some unrelated fix会整体丢弃。若过滤后没有白名单包函数直接返回[]。源码注释还说明往白名单添加包的前提是该包在renovate.json中配置了带 changelog 的prBodyTemplate。阶段三筛选可见章节跨版本合并filterVisibleSections逐行扫描维护一个可见章节状态机跳过版本标题匹配/^###\s\/的行如### [\v6.1.3被完全忽略同时重置当前章节状态识别章节标题匹配/^#{5}\s(.)/的 h5 行章节名转小写后查表VISIBLE_CHANGELOG_SECTIONSconst VISIBLE_CHANGELOG_SECTIONS: ReadonlySetstring new Set([ features, bug fixes, performance improvements, reverts, documentation, ])可见章节的内容被收集不可见章节如Dependencies的内容被丢弃输出时不带标题收集的内容仅含列表项行章节标题本身不进入输出最终按首次出现的顺序拼接。这一设计的两个关键行为一是夹具中 v6.1.2 的##### Dependenciessanity/cli-core等版本提升被排除——依赖版本变动对用户没有发布价值二是同类型章节跨版本合并——v6.1.3、v6.1.2、v6.1.1 三个版本的Bug Fixes内容会合并成一组输出且不出现任何版本号标题测试用例merges same-type sections across multiple versions明确验证了这一点。阶段四清洗列表项cleanChangelogItems用三个正则完成清洗夹具中的每一项变更都能对应到具体规则markdown // ① 删除依赖作用域条目- **deps:** ... .replace(/^\s*-\s\*\*deps:\*\*.*$/gm, ) // ② 剥离尾部提交哈希链接(0b660b9) .replace(/\s*\(\[[0-9a-f]]\([^)]*\)\)/gm, ) // ③ 展开 PR/issue 引用(#661) → #661 .replace(/\(\[#(\d)]\(([^)]*)\)\)/gm, #$1)规则①删除- **deps:** update oclif-tooling这类依赖作用域条目——它们混在Bug Fixes里但不是面向用户的修复规则②删除(0b660b9)格式的提交哈希引用7 位十六进制因为发布说明不需要 commit 级细节规则③将(#661)外层的括号去掉保留#661链接——这是唯一保住链接的规则测试用expect(markdown).toMatch(/\[#\d]\(/)与not.toMatch(/\(\[#\d]\(/)双向断言。清洗后为空则返回[]否则交给markdownToPortableText转成 Portable Text 块。转换包装位于 markdownToPortableText.ts它基于portabletext/markdown并额外用 TurndownService 把html类型的块先转回 Markdown 再递归解析保证details等 HTML 结构不会泄漏进最终文档。在 changelog 生成流程中的接入点解析器并非独立运行而是深度嵌入 changelog 文档生成命令 createOrUpdateChangelogDocs.ts。关键逻辑是按 PR 作者类型分流const isBot userType bot const releaseNoteBlocks flattenCallouts( pr?.body ? isBot ? parseRenovateReleaseNotes(pr.body) : await extractReleaseNotesFromPrBody(pr.body) : [], )【免费下载链接】sanitySanity Studio – Rapidly configure content workspaces powered by structured content项目地址: https://gitcode.com/GitHub_Trending/sa/sanity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表