change-versions 1.4.1 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +14 -14
- package/docs/commands.md +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var G=(e,t,n)=>()=>{if(e)try{t=e(e=0)}catch(r){n=[r]}if(n)throw n[0];return t};import{styleText as rn}from"node:util";function q(e,t,n){return rn(e,t,{stream:n})}function S(e){return q(["bold","cyan"],e,process.stdout)}function Q(e){return q("bold",e,process.stdout)}function oe(e){return q("green",e,process.stdout)}function
|
|
2
|
+
var G=(e,t,n)=>()=>{if(e)try{t=e(e=0)}catch(r){n=[r]}if(n)throw n[0];return t};import{styleText as rn}from"node:util";function q(e,t,n){return rn(e,t,{stream:n})}function S(e){return q(["bold","cyan"],e,process.stdout)}function Q(e){return q("bold",e,process.stdout)}function oe(e){return q("green",e,process.stdout)}function v(e){return q("dim",e,process.stdout)}function F(e){return q("cyan",e,process.stdout)}function ct(e,t,n){return`${Q(e)} ${v(t)} ${v("=>")} ${oe(n)}`}function H(e){let[t,...n]=e.split(`
|
|
3
3
|
`),r=q("red",t,process.stderr);if(!n.length)return r;return[r,...n.map((s)=>q("yellow",s,process.stderr))].join(`
|
|
4
|
-
`)}function M(e){return q("green",e,process.stdout)}function
|
|
4
|
+
`)}function M(e){return q("green",e,process.stdout)}function k(e){return q("yellow",e,process.stdout)}function ze(e){return q("red",e,process.stdout)}var I=()=>{};function Ke(){let e=(process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||"").split(".")[0];return/^zh/i.test(e)?"zh":"en"}function i(e,t,n=Ke()){let r=on[e][n];if(t)for(let[s,o]of Object.entries(t))r=r.replaceAll(`{${s}}`,String(o));return r}var on;var D=G(()=>{on={interactiveCancelled:{zh:"已取消,尚未执行的步骤不会继续。",en:"Cancelled. Remaining steps will not run."},confirmAnswer:{zh:"请输入 y 确认、n 返回,或 q 退出。",en:"Enter y to confirm, n to decline, or q to quit."},chooseReleaseKind:{zh:"选择版本类型",en:"Choose a release type"},releaseKindFormal:{zh:"正式版(发布到 latest)",en:"Formal release (default tag: latest)"},releaseKindPre:{zh:"预发布(例如 alpha、beta)",en:"Prerelease (for example alpha or beta)"},choosePreid:{zh:"预发布标识,回车采用默认值,q 退出:",en:"Prerelease identifier; Enter accepts the default, q quits:"},invalidPreid:{zh:"标识不符合 semver,例如可使用 alpha、beta、rc。请重新输入。",en:"Invalid semver prerelease identifier. Try alpha, beta or rc."},chooseDistTag:{zh:"目标 npm 标签,回车采用默认值,q 退出:",en:"Target npm tag; Enter accepts the default, q quits:"},firstBaseline:{zh:"尚未找到版本基线。请指定一条已存在的提交或 Git 标签作为本轮比较起点;q 退出。",en:"No release baseline found. Choose an existing commit or Git tag as the comparison start; q quits."},chooseBaseline:{zh:"首次版本基线(SHA 或 Git 标签):",en:"First release baseline (SHA or Git tag):"},wizardCandidates:{zh:"本次入选包(含依赖方):",en:"Packages to version (including dependents):"},wizardExecutionPlan:{zh:"执行前确认发布设置",en:"Review release settings before execution"},wizardPlanContext:{zh:"目标 npm 标签: {tag};推送分支: {branch}",en:"Target npm tag: {tag}; push branch: {branch}"},wizardNeedsConfig:{zh:"未找到 change-versions.yml,请先初始化配置。",en:"No change-versions.yml found. Initialize the configuration first."},wizardAction:{zh:"选择操作(输入序号,q 退出)",en:"Choose an action (enter a number, q quits)"},actionNewRelease:{zh:"发布新版本",en:"Release new versions"},actionResume:{zh:"恢复上一次发布(不升版)",en:"Resume publication (no version bump)"},actionStatus:{zh:"查看发布状态",en:"View publication status"},actionInit:{zh:"初始化配置",en:"Initialize configuration"},actionExit:{zh:"退出",en:"Exit"},actionRetry:{zh:"重试当前批次(不升版)",en:"Retry this batch (no version bump)"},actionRetryUnpublished:{zh:"使用当前代码重试未发布的包(保留原版本号)",en:"Retry unpublished packages using current code (no version bump)"},optRetryUnpublished:{zh:"记录已提交的修复代码,保留原版本号,仅补发未发布包",en:"Record committed fixes and retry unpublished packages without changing versions"},repairPublication:{zh:"【修复后补发】保留原版本号,检查未发布包与源码提交",en:"[Repair publication] Keep versions and check unpublished package sources"},repairPlan:{zh:"将创建一条空的恢复记录提交,不修改版本或文件。仅未发布包可采用当前已提交的代码;已发布包继续对应原源码提交。",en:"An empty recovery commit will record package sources without changing versions or files. Only unpublished packages may use current committed code; published packages retain their original sources."},repairCurrentCode:{zh:"(采用修复后的代码)",en:"(use repaired code)"},confirmRepairPublication:{zh:"是否记录修复后的源码提交并保留原版本号?",en:"Record repaired package sources without changing versions?"},repairPublishedChanged:{zh:"已发布或私有包发生改动: {name}@{version}。此入口仅允许未发布的公开包采用修复代码;请还原该包改动,或为它另发新版本。",en:"Already published package changed: {name}@{version} (or the package is private). Only unpublished public packages may use repaired sources; restore this package or release a new version."},repairRecorded:{zh:"修复补发记录已提交,所有版本号保持不变。后续可直接恢复发布。版本提交: {commit}",en:"Recovery sources recorded; all versions are unchanged. Ordinary publication can now resume. Version commit: {commit}"},actionExitFailed:{zh:"退出,保留失败状态",en:"Exit with failure status"},recoveryAction:{zh:"发布未完成,选择下一步",en:"Publication incomplete. Choose the next action"},pendingAction:{zh:"上一批尚未完成,选择下一步",en:"The previous batch is incomplete. Choose the next action"},optDryRunRelease:{zh:"预览升版或恢复发布计划,不执行修改",en:"Preview versioning or resumed publication without changes"},badDistTag:{zh:"dist-tag 必须是有效的 npm 标签,不能是版本范围或含空白等 URL 保留字符,例如 latest、alpha、next。",en:"dist-tag must be a valid npm tag, not a version range or a value containing whitespace or URL-reserved characters. Try latest, alpha or next."},distTagDowngrade:{zh:"拒绝回退 npm 标签 {tag}:{name} 当前指向 {current},本批次目标为 {version}。请核对批次或改用其他发布标签。",en:"Refusing to move {tag} backward for {name}: it currently points to {current}, but this batch targets {version}. Review the batch or choose another publication tag."},registryVersionDisappeared:{zh:"之前已存在的版本 {name}@{version} 已无法查询确认。已停止,不将标签修复自动转换为重新上传;请核对 registry 后恢复。",en:"Previously published version {name}@{version} can no longer be confirmed. Stopped without converting a tag repair into an upload; check the registry before resuming."},publishSourceDirty:{zh:"发布期间工作区被修改。已成功上传的包保留;请检查并清理变更后恢复发布。",en:"The working tree changed during publication. Successful uploads are preserved; review and clean the changes before resuming."},cmdRelease:{zh:"升版并发布,失败后可恢复发布",en:"Version and publish, with publication recovery"},cmdStatus:{zh:"只读查询发布批次的 registry 与 Git 标签状态",en:"Inspect registry and Git tag state without changing anything"},optReleaseCommit:{zh:"指定待发布版本提交(必须在当前历史中)",en:"Use this version commit (must be an ancestor of HEAD)"},optResume:{zh:"恢复上一批发布,不再次升版",en:"Resume publication without another version bump"},badReleaseCommit:{zh:"无效的版本提交 {commit}:需要当前历史中的提交,正文包含唯一且有效的包名 old => new 版本列表。请核对后重试。",en:"Invalid version commit {commit}: it must be in the current history with unique package old => new version lines. Review the commit before retrying."},repositoryLocked:{zh:`另一个发布操作持有仓库锁: {file}
|
|
5
5
|
持有者: {owner}
|
|
6
6
|
下一步:等待该进程结束;若进程已退出,确认没有其他发布操作后再删除该锁并重试。`,en:`Another release operation holds the repository lock: {file}
|
|
7
7
|
Owner: {owner}
|
|
@@ -13,7 +13,7 @@ For committed fixes to unpublished packages, append --retry-unpublished to keep
|
|
|
13
13
|
{detail}`,en:`git failed. Next: rerun this inside a git repository
|
|
14
14
|
{detail}`},noPackagesSince:{zh:"自 {rev} 以来没有需要升版的包",en:"No packages to version since {rev}"},changedHeader:{zh:"变更:",en:"Changed:"},dependentsHeader:{zh:"依赖方:",en:"Dependents:"},confirmVersions:{zh:"以上版本是否确认?",en:"Apply these versions?"},cancelledVersion:{zh:"已取消。还没改文件。想继续就再跑同一条命令",en:"Cancelled. No files were changed. Rerun the same command to continue"},branchPushFailed:{zh:`分支推送失败。commit 已在本地。下一步: git push origin {branch};成功后恢复 publish,不要重跑 version
|
|
15
15
|
{detail}`,en:`Branch push failed. The commit is local. Next: git push origin {branch}, then resume publish. Do not rerun version
|
|
16
|
-
{detail}`},noVersionCommit:{zh:"没有 version 提交。下一步: 尚未升版时先跑 version;若已升版,请先检查提交正文的 Co-authored-by: change-versions <publish@change-versions.com> 是否保留;也可用 publish --commit=<版本提交> 明确指定",en:"No version commit. Next: run version first if no bump exists; otherwise check that the version commit retains Co-authored-by: change-versions <publish@change-versions.com>, or use publish --commit=<version commit>"},packageNotInDir:{zh:"正文里的包不在 {dir}: {name}",en:"Package from the commit body is not in {dir}: {name}"},noGitTag:{zh:"不打 git tag",en:"No git tag"},willPublish:{zh:"即将执行(确认后开始):",en:"Publication plan (starts after confirmation):"},distTagOnlyMark:{zh:"(版本已存在,仅更新 npm 标签)",en:"(version exists; npm tag update only)"},privateMark:{zh:"(私有)",en:"(private)"},confirmPublish:{zh:"是否发布?",en:"Publish?"},cancelledPublish:{zh:"已取消。不跑 hook,不上传,不打 git tag。想继续时重跑同一条 publish,无需再次升版",en:"Cancelled. No hooks, no upload, no git tag. Rerun the same publish to continue without bumping versions"},publishInterrupted:{zh:"发布已中断,已完成的操作保留;registry 和 Git 标签可能部分完成。下一步: 重跑同一条 publish 确认状态,不要重跑 version",en:"Publish interrupted. Completed operations remain; registry and Git tags may be partially complete. Next: rerun the same publish to check state. Do not rerun version"},badBaseline:{zh:"修订无法解析: {rev}。下一步: 换成 git rev-parse 能解析的 SHA 或 tag",en:"Cannot resolve revision: {rev}. Next: pass a SHA or tag that git rev-parse accepts"},noBaseline:{zh:"没有基线。下一步: changed 或 version 加上 --baseline=SHA或tag",en:"No baseline. Next: rerun changed or version with --baseline=<sha-or-tag>"},chooseBump:{zh:"选择档位",en:"Select a bump"},versionRestored:{zh:"已尝试恢复本次拥有且未再次变化的文件。检查 git status 后重试",en:"Restored the tree to HEAD from when the command started. Fix the error, then rerun version"},tagPointsElsewhere:{zh:"git tag {tag} 指向别的 commit。下一步: 人工处理这个同名 tag 后,再重跑 publish。不要重跑 version",en:"git tag {tag} points at another commit. Next: fix that tag by hand, then rerun publish. Do not rerun version"},tagPushFailed:{zh:`git tag 没推上去。当前包已在 registry,其余包可能尚未发布。下一步: 检查 Git 远端权限后重跑同一条 publish,补齐该包标签并继续;配置的 hook 仍会执行,不要重跑 version
|
|
16
|
+
{detail}`},noVersionCommit:{zh:"没有 version 提交。下一步: 尚未升版时先跑 version;若已升版,请先检查提交正文的 Co-authored-by: change-versions <publish@change-versions.com> 是否保留;也可用 publish --commit=<版本提交> 明确指定",en:"No version commit. Next: run version first if no bump exists; otherwise check that the version commit retains Co-authored-by: change-versions <publish@change-versions.com>, or use publish --commit=<version commit>"},packageNotInDir:{zh:"正文里的包不在 {dir}: {name}",en:"Package from the commit body is not in {dir}: {name}"},noGitTag:{zh:"不打 git tag",en:"No git tag"},willPublish:{zh:"即将执行(确认后开始):",en:"Publication plan (starts after confirmation):"},distTagOnlyMark:{zh:"(版本已存在,仅更新 npm 标签)",en:"(version exists; npm tag update only)"},privateMark:{zh:"(私有)",en:"(private)"},privateVersionHint:{zh:"私有包仅升版,不上传,也不创建 Git tag。",en:"Private packages are versioned only; they are not uploaded and receive no Git tags."},confirmPublish:{zh:"是否发布?",en:"Publish?"},cancelledPublish:{zh:"已取消。不跑 hook,不上传,不打 git tag。想继续时重跑同一条 publish,无需再次升版",en:"Cancelled. No hooks, no upload, no git tag. Rerun the same publish to continue without bumping versions"},publishInterrupted:{zh:"发布已中断,已完成的操作保留;registry 和 Git 标签可能部分完成。下一步: 重跑同一条 publish 确认状态,不要重跑 version",en:"Publish interrupted. Completed operations remain; registry and Git tags may be partially complete. Next: rerun the same publish to check state. Do not rerun version"},badBaseline:{zh:"修订无法解析: {rev}。下一步: 换成 git rev-parse 能解析的 SHA 或 tag",en:"Cannot resolve revision: {rev}. Next: pass a SHA or tag that git rev-parse accepts"},noBaseline:{zh:"没有基线。下一步: changed 或 version 加上 --baseline=SHA或tag",en:"No baseline. Next: rerun changed or version with --baseline=<sha-or-tag>"},chooseBump:{zh:"选择档位",en:"Select a bump"},versionRestored:{zh:"已尝试恢复本次拥有且未再次变化的文件。检查 git status 后重试",en:"Restored the tree to HEAD from when the command started. Fix the error, then rerun version"},tagPointsElsewhere:{zh:"git tag {tag} 指向别的 commit。下一步: 人工处理这个同名 tag 后,再重跑 publish。不要重跑 version",en:"git tag {tag} points at another commit. Next: fix that tag by hand, then rerun publish. Do not rerun version"},tagPushFailed:{zh:`git tag 没推上去。当前包已在 registry,其余包可能尚未发布。下一步: 检查 Git 远端权限后重跑同一条 publish,补齐该包标签并继续;配置的 hook 仍会执行,不要重跑 version
|
|
17
17
|
{detail}`,en:`git tag was not pushed. This package is on the registry; other packages may still be pending. Next: check Git remote permissions, then rerun the same publish to finish its tag and continue; configured hooks still run. Do not rerun version
|
|
18
18
|
{detail}`},networkFailed:{zh:`操作失败,已重试 2 次。后续发布步骤已停止。下一步: 重跑同一条 publish,不要重跑 version
|
|
19
19
|
{detail}`,en:`Operation failed after 2 retries. Later publication steps were stopped. Next: rerun the same publish. Do not rerun version
|
|
@@ -25,9 +25,9 @@ For committed fixes to unpublished packages, append --retry-unpublished to keep
|
|
|
25
25
|
{detail}`,en:`{name} failed. Next: fix the hook, then rerun publish. Uploaded packages and existing Git tags are preserved
|
|
26
26
|
{detail}`},beforePublishDirty:{zh:"beforePublish 改了被跟踪的文件。下一步: hook 只能改 git 忽略的构建产物,弄干净后重跑 publish",en:"beforePublish changed tracked files. Next: the hook may only change gitignored build output. Clean the tree, then rerun publish"},afterPublishDirty:{zh:"afterPublish 改了被跟踪的文件。已上传包和已创建的 Git 标签保留。下一步: 让 hook 不改被跟踪的文件,弄干净后重跑 publish",en:"afterPublish changed tracked files. Uploaded packages and existing Git tags are preserved. Next: keep the hook off tracked files, clean the tree, then rerun publish"},configUnreadable:{zh:"配置读不了: {file}。下一步: 补上 include,删掉不认识的字段",en:"Cannot read config: {file}. Next: add include and remove unknown fields"},packagesDirMissing:{zh:"找不到目录 {dir}",en:"Directory not found: {dir}"},packageJsonIncomplete:{zh:"{folder} 的 package.json 缺少 name 或 version",en:"{folder} package.json is missing name or version"},publicDependsOnPrivate:{zh:"public 包 {name} 不能依赖 private 包 {dep}。下一步: 改依赖后重跑 version",en:"Public package {name} cannot depend on private package {dep}. Next: change the dependency, then rerun version"},missingVersionField:{zh:"{folder} 缺少 version",en:"{folder} is missing version"},badBump:{zh:"档位非法: {bump}。可用 {list}",en:"Invalid bump: {bump}. Use {list}"},preidRequired:{zh:"{kind} 必须带 --preid。预发布用 prepatch 这类档位",en:"{kind} requires --preid. Use a pre* bump for prereleases"},preidForbidden:{zh:"正式版不能带 --preid。预发布用 prepatch 这类档位",en:"A stable bump cannot take --preid. Use a pre* bump for prereleases"},badLine:{zh:"第 {line} 行无法解析",en:"Cannot parse line {line}"},unknownField:{zh:"不认识的字段 {name}",en:"Unknown field {name}"},missingValue:{zh:"{name} 缺少值",en:"{name} is missing a value"},includeRequired:{zh:"include 不能为空。下一步: 补上 include,删掉不认识的字段",en:"include must not be empty. Next: add include and remove unknown fields"},commitMessageNeedsToken:{zh:"commitMessage 需要 %s",en:"commitMessage must contain %s"},patternBang:{zh:"模式不能包含 !: {pattern}",en:"Patterns cannot contain !: {pattern}"},patternClass:{zh:"不支持字符组: {pattern}",en:"Character classes are not supported: {pattern}"},badHook:{zh:"hooks 无法解析: {line}",en:"Cannot parse hooks: {line}"},unknownHook:{zh:"不认识的 hook {name}",en:"Unknown hook {name}"},hookMissingCommand:{zh:"{name} 缺少命令",en:"{name} is missing a command"},badPatternLine:{zh:"路径列表无法解析: {line}",en:"Cannot parse path list: {line}"},badSemver:{zh:"无法解析版本 {version}",en:"Cannot parse version {version}"},dependencyCycle:{zh:"依赖成环: {name}",en:"Dependency cycle: {name}"},bumpRequired:{zh:"非交互环境或 --yes 模式必须指定档位,例如 release patch --yes;交互式发布请运行 release。",en:"A bump is required when not interactive or using --yes. Use release patch --yes, or run release interactively."},chooseIndex:{zh:"请输入序号(q 退出): ",en:"Enter a number (q to quit): "},invalidChoice:{zh:"无效选择: {answer}",en:"Invalid choice: {answer}"},emptyAnswer:{zh:"(空)",en:"(empty)"},yesRequired:{zh:"非交互环境需要 --yes",en:"Pass --yes when not interactive"},commandFailed:{zh:"{command} 失败: {detail}",en:"{command} failed: {detail}"},commandFailedShort:{zh:"{command} 失败",en:"{command} failed"},commandExit:{zh:"{command} 退出 {code}",en:"{command} exited {code}"},cliDescription:{zh:"只给需要发的包升版本,再按那次提交发布",en:"Version only the packages that need a release, then publish that commit"},optRoot:{zh:"仓库根目录",en:"Repository root"},optVersionsFile:{zh:"配置文件",en:"Config file"},optPackages:{zh:"覆盖 packagesDir",en:"Override packagesDir"},cmdChanged:{zh:"列出会升版的包",en:"List packages that would be versioned"},optBaseline:{zh:"这一次的比较起点,SHA 或 tag",en:"Comparison start for this run, SHA or tag"},cmdVersion:{zh:"升版本并提交",en:"Bump versions and commit"},argBump:{zh:"patch、minor、major、prerelease、prepatch、preminor、premajor",en:"patch, minor, major, prerelease, prepatch, preminor, or premajor"},optPreid:{zh:"预发布标识,pre* 必填",en:"Prerelease identifier, required for pre*"},optYes:{zh:"自动执行,不补问缺失参数",en:"Run without prompts; supply required options"},optDryRunVersion:{zh:"只打印旧版本到新版本",en:"Print old and new versions only"},optBranch:{zh:"覆盖配置里的 branch",en:"Override branch from the config"},optCommitMessage:{zh:"覆盖 commitMessage",en:"Override commitMessage"},cmdPublish:{zh:"发布最近一次 version 提交里的包",en:"Publish packages listed in the latest version commit"},optDistTag:{zh:"npm dist-tag",en:"npm dist-tag"},optDryRunPublish:{zh:"查询 registry 并预览计划;不执行 hook、上传、标签修改或推送",en:"Query the registry and preview the plan without hooks, uploads, tag changes or pushes"},cmdInit:{zh:"写入带注释的配置",en:"Write a commented config file"},optYesInit:{zh:"不提问,按探测到的目录写默认配置",en:"Write defaults from the detected directory, without prompts"},configExists:{zh:"已有 {file}。下一步: 直接改这个文件,或删掉后重跑 init",en:"Config already exists: {file}. Next: edit that file, or delete it and rerun init"},initIntro:{zh:"写入 {file}",en:"Write {file}"},initFoundDirs:{zh:"发现包目录: {dirs}",en:"Package directories: {dirs}"},initPackagesDir:{zh:"包目录",en:"Package directory"},initInclude:{zh:"源码路径,逗号分隔",en:"Source paths, comma-separated"},initExclude:{zh:"排除路径,逗号分隔",en:"Excluded paths, comma-separated"},initBranch:{zh:"推送分支,回车跳过",en:"Branch to push, Enter to skip"},initBeforeCommit:{zh:"beforeCommit,回车跳过",en:"beforeCommit, Enter to skip"},initBeforePublish:{zh:"beforePublish,回车跳过",en:"beforePublish, Enter to skip"},initWrote:{zh:"已写入 {file}",en:"Wrote {file}"},initNotePackagesDir:{zh:"包所在目录。这次可用 --packages 覆盖",en:"Directory of packages. Override once with --packages"},initNoteCommitMessage:{zh:"%s 换成档位。有 --preid 时再空一格接上,例如 bump: prerelease alpha。查找看正文末尾的 Co-authored-by: change-versions <publish@change-versions.com>,不改提交作者",en:"%s becomes the bump. With --preid, a space and the id follow, for example bump: prerelease alpha. Lookup uses the Co-authored-by: change-versions <publish@change-versions.com> trailer. The commit author stays unchanged"},initNoteBranch:{zh:"不写就不推送。version 只推这个分支,不推 tag",en:"Omit to skip pushing. version pushes this branch only, not tags"},initNoteBeforeCommit:{zh:"版本和 CHANGELOG 写完之后、git commit 之前。失败仅恢复本次拥有的文件",en:"After versions and CHANGELOG are written, before git commit. Failure restores only files owned by this operation"},initNoteBeforePublish:{zh:"确认之后、npm publish 之前。只能改 git 忽略的构建产物",en:"After confirm, before npm publish. May only change gitignored build output"},initNoteAfterPublish:{zh:"要发的包都已在 registry 上之后。不能把工作区弄脏",en:"After every selected package is on the registry. Must leave the tree clean"},initNoteInclude:{zh:"相对仓库根。* 和 ? 不跨过 /,** 可以。命中目录时,目录里的文件也算",en:"Relative to the repo root. * and ? do not cross /, ** may. A matching directory includes files under it"},initNoteExclude:{zh:"命中这里的文件不触发升版。package.json 另比,去掉 devDependencies 后有差异才算",en:"Files that match here do not trigger a bump. package.json is compared separately, after dropping devDependencies"}}});import lt from"picomatch";import Te from"semver";import{YAMLParseError as sn,parse as an}from"yaml";function Xe(e){return dt.has(e)}function De(e,t){if(!mt.includes(e))throw new l(i("badBump",{bump:e,list:mt.join(", ")}));let n=e;if(cn.has(n)&&!t)throw new l(i("preidRequired",{kind:n}));if(dt.has(n)&&t)throw new l(i("preidForbidden"));return n}function Fe(e){let t=gn(e);for(let d of Object.keys(t))if(!ln.has(d))throw new l(i("unknownField",{name:d}));let n=t.packagesDir===void 0?"packages":Qe(t.packagesDir,"packagesDir"),r=t.commitMessage===void 0?"bump: %s":Qe(t.commitMessage,"commitMessage"),s=t.branch===void 0?void 0:Qe(t.branch,"branch"),o=t.hooks==null?{}:un(t.hooks),a=t.include==null?[]:Ye(t.include,"include"),c=t.exclude==null?[]:Ye(t.exclude,"exclude");if(!a.length)throw new l(i("includeRequired"));if(!r.includes("%s"))throw new l(i("commitMessageNeedsToken"));for(let d of[...a,...c]){if(d.includes("!"))throw new l(i("patternBang",{pattern:d}));if(/\[[^\]]+\]/.test(d))throw new l(i("patternClass",{pattern:d}))}let m=t.commitFiles==null?void 0:Ye(t.commitFiles,"commitFiles");return{packagesDir:n,commitMessage:r,branch:s,hooks:o,include:a,exclude:c,...m?{commitFiles:m}:{}}}function gn(e){try{let t=an(e);if(t==null)return{};if(!pt(t))throw new l(i("badLine",{line:1}));return t}catch(t){if(t instanceof l)throw t;if(t instanceof sn)throw new l(i("badLine",{line:t.linePos?.[0]?.line??1}));throw t}}function un(e){if(!pt(e))throw new l(i("badHook",{line:"hooks"}));let t={};for(let[n,r]of Object.entries(e)){if(!mn.has(n))throw new l(i("unknownHook",{name:n}));if(typeof r!=="string"||!r)throw new l(i("hookMissingCommand",{name:n}));t[n]=r}return t}function Ye(e,t){if(!Array.isArray(e))throw new l(i("badPatternLine",{line:t}));return e.map((n)=>{if(typeof n!=="string"||!n)throw new l(i("badPatternLine",{line:t}));return n})}function Qe(e,t){if(typeof e!=="string"||!e)throw new l(i("missingValue",{name:t}));return e}function pt(e){return Boolean(e)&&typeof e==="object"&&!Array.isArray(e)}function gt(e,t){let n={dot:!0};if(lt(t,n)(e))return!0;if(t.endsWith("/**"))return!1;return lt(`${t}/**`,n)(e)}function Ze(e,t,n){return t.some((r)=>gt(e,r))&&!n.some((r)=>gt(e,r))}function ht(e,t,n){let r=new Set(n),s=`${t}/`,o=new Map;for(let a of e.split(`
|
|
27
27
|
`)){if(!a.startsWith(s))continue;let c=a.slice(s.length),m=c.split("/")[0];if(!m||!c.includes("/")||!r.has(m))continue;let d=o.get(m)??[];d.push(a),o.set(m,d)}return o}function ft(e,t,n,r,s,o){let a=[],c=[];for(let m of e){let d=t.get(m);if(!d?.length){c.push(m);continue}let h=`${o}/${m}/package.json`;if(d.some((f)=>f!==h&&Ze(f,n,r))||d.includes(h)&&!s(m))a.push(m);else c.push(m)}return{changed:a,ignored:c}}function bt(e,t){return JSON.stringify($e(ut(e)))===JSON.stringify($e(ut(t)))}function ut(e){if(!e||typeof e!=="object"||Array.isArray(e))return e;let t={...e};return delete t.devDependencies,t}function $e(e){if(Array.isArray(e))return e.map($e);if(e&&typeof e==="object"){let t=e;return Object.fromEntries(Object.keys(t).sort().map((n)=>[n,$e(t[n])]))}return e}function wt(e,t,n){let r=n?Te.inc(e,t,n):Te.inc(e,t);if(!r)throw new l(i("badSemver",{version:e}));return r}function yt(e,t,n){let r=new Set(t),s=new Map(e.map((a)=>[a,[]]));for(let a of e)for(let c of n(a))s.get(c)?.push(a);let o=[...t];while(o.length){let a=o.pop();if(!a)break;for(let c of s.get(a)??[]){if(r.has(c))continue;r.add(c),o.push(c)}}return e.filter((a)=>r.has(a))}function vt(e,t,n){let r=e.replace("%s",t);return n?`${r} ${n}`:r}function Ne(e){return e.length>0&&e.every((t)=>Boolean(Te.valid(t.to))&&Te.prerelease(t.to)==null)}function et(e){return/^v\d/.test(e)}function kt(e){return/^v\d+\.\d+\.\d+$/.test(e)}function de(e){let t=[];for(let n of e.split(`
|
|
28
|
-
`)){let r=/^(\S+) (\S+) => (\S+)$/.exec(n.trim());if(r)t.push({name:r[1],from:r[2],to:r[3]})}return t}function Pt(e){let t=new Map(e.map((o)=>[o.folder,o])),n=new Set,r=[],s=(o,a)=>{if(n.has(o.folder))return;if(a.has(o.folder))throw new l(i("dependencyCycle",{name:o.name}));a.add(o.folder);for(let c of o.deps){let m=t.get(c);if(m)s(m,a)}a.delete(o.folder),n.add(o.folder),r.push(o)};for(let o of e)s(o,new Set);return r}function ye(e){return/ENEEDAUTH|E401|E403|need auth|not logged in|401 Unauthorized|403 Forbidden/i.test(e)}function ve(e){try{return JSON.parse(e)?.error?.code==="E404"}catch{return!1}}var l,mt,dt,cn,ln,mn,dn="publish@change-versions.com",pn,ue;var N=G(()=>{D();l=class l extends Error{auth;constructor(e,t=!1){super(e);this.name="Fail",this.auth=t}};mt=["patch","minor","major","prerelease","prepatch","preminor","premajor"],dt=new Set(["patch","minor","major"]),cn=new Set(["prerelease","prepatch","preminor","premajor"]);ln=new Set(["packagesDir","commitMessage","branch","hooks","include","exclude","commitFiles"]),mn=new Set(["beforeCommit","beforePublish","afterPublish"]);pn=`change-versions <${dn}>`,ue=`Co-authored-by: ${pn}`});import{spawn as xt}from"node:child_process";function P(e,t,n){return new Promise((r)=>{let s=xt(e,t,{cwd:n,stdio:["ignore","pipe","pipe"]}),o="",a="";s.stdout.on("data",(c)=>{o+=c}),s.stderr.on("data",(c)=>{a+=c}),s.on("error",(c)=>r({code:1,stdout:o,stderr:`${a}${c.message}`})),s.on("close",(c)=>r({code:c??1,stdout:o,stderr:a}))})}async function y(e,t,n){let r=await P(e,t,n);if(r.code!==0){let s=(r.stderr||r.stdout).trim();throw new l(s?i("commandFailed",{command:e,detail:s}):i("commandFailedShort",{command:e}))}return r.stdout}function Ee(e,t,n,r){return new Promise((s,o)=>{let a=xt(e,t,{cwd:n,stdio:"inherit",env:{...process.env,...r}});a.on("error",o),a.on("exit",(c)=>{if(c===0)s();else o(new l(i("commandExit",{command:e,code:c??1})))})})}var W=G(()=>{D();N()});function Ct(e){let t=e.packages.map((m)=>m.folder),n=new Map(e.packages.map((m)=>[m.folder,m])),r=new Map(e.packages.map((m)=>[m.name,m])),s=new Map(e.packages.map((m)=>[m.name,m.folder])),{changed:o}=ft(t,e.filesByFolder,e.include,e.exclude,(m)=>e.devOnly.has(m),e.packagesDir),a=yt(t,o,(m)=>hn(n.get(m),s));for(let m of a){let d=n.get(m);if(!d||d.private)continue;for(let h of Object.keys(d.dependencies??{}))if(r.get(h)?.private)throw new l(i("publicDependsOnPrivate",{name:d.name,dep:h}))}let c=new Set(o);return{changed:o,dependents:a.filter((m)=>!c.has(m))}}function hn(e,t){if(!e)return[];return[...Object.keys(e.dependencies??{}),...Object.keys(e.devDependencies??{})].flatMap((r)=>{let s=t.get(r);return s?[s]:[]})}var St=G(()=>{D();N()});import pe from"node:fs";import tt from"node:path";import fn from"node:os";import{randomUUID as bn}from"node:crypto";import{AsyncLocalStorage as wn}from"node:async_hooks";async function X(e,t,n){if(t)return n();e=tt.resolve(e);let r=tt.resolve(e,(await y("git",["rev-parse","--git-common-dir"],e)).trim()),s=tt.join(r,"change-versions.lock");if(nt.getStore()?.has(s))return n();let o={pid:process.pid,host:fn.hostname(),token:bn()},a;try{a=pe.openSync(s,"wx",384)}catch(d){if(d.code!=="EEXIST")throw d;let h="";try{h=pe.readFileSync(s,"utf8")}catch{}throw new l(i("repositoryLocked",{file:s,owner:h.trim()}))}let c=()=>{try{if(JSON.parse(pe.readFileSync(s,"utf8")).token===o.token)pe.unlinkSync(s)}catch{}};try{pe.writeFileSync(a,JSON.stringify(o))}finally{pe.closeSync(a)}let m=()=>{if(process.listenerCount("SIGINT")<=1&&process.listenerCount("SIGTERM")<=1)process.exit(1)};process.on("exit",c),process.on("SIGINT",m),process.on("SIGTERM",m);try{return await nt.run(new Set([...nt.getStore()??[],s]),n)}finally{process.off("SIGINT",m),process.off("SIGTERM",m),process.off("exit",c),c()}}var nt;var ke=G(()=>{W();N();D();nt=new wn});function vn(e){if(/^[a-zA-Z0-9_./:@=+-]+$/.test(e))return e;return"'"+e.replaceAll("'","'\\''")+"'"}function O(e){let t=["change-versions","publish",`--dist-tag=${e.distTag}`,`--root=${e.root}`,`--versions-file=${e.versionsFile}`];if(e.commit)t.push(`--commit=${e.commit}`);if(e.packages)t.push(`--packages=${e.packages}`);if(e.retryUnpublished)t.push("--retry-unpublished");return t.map(vn).join(" ")}import kn from"node:readline/promises";import{stdin as Rt,stdout as zt}from"node:process";async function it(e){let t=kn.createInterface({input:Rt,output:zt}),n=new AbortController,r=()=>n.abort();t.once("SIGINT",r),t.once("close",r);try{return await t.question(e,{signal:n.signal})}catch(s){if(n.signal.aborted)throw new J;throw s}finally{t.off("SIGINT",r),t.off("close",r),t.close()}}function T(){return Boolean(Rt.isTTY&&zt.isTTY)}async function Tt(e,t){if(!T())throw new l(i("bumpRequired"));console.log(S(e)),t.forEach((n,r)=>{let s=n.tone?Pn[n.tone](n.label):n.label;console.log(` ${F(String(r+1))}) ${s}`)});while(!0){let n=(await it(F(i("chooseIndex")))).trim();if(n.toLowerCase()==="q")throw new J;let r=/^\d+$/.test(n)?Number(n)-1:-1;if(Number.isInteger(r)&&r>=0&&r<t.length)return r;console.log(v(i("invalidChoice",{answer:n||i("emptyAnswer")})))}}async function $t(e,t){return t[await Tt(e,t.map((n)=>({label:n})))]}async function Z(e,t){return t[await Tt(e,t)].value}async function L(e,t=""){if(!T())throw new l(i("yesRequired"));let n=t?` ${M(`[${t}]`)}`:"",r=(await it(`${S(e)}${n} `)).trim();if(r.toLowerCase()==="q")throw new J;return r||t}async function se(e){if(!T())throw new l(i("yesRequired"));console.log(S(e));while(!0){let t=(await it(`${v("[y/N/q]")} `)).trim().toLowerCase();if(t==="q")throw new J;if(t==="y"||t==="yes")return!0;if(!t||t==="n"||t==="no")return!1;console.log(v(i("confirmAnswer")))}}var J,Pn;var _=G(()=>{I();D();N();J=class J extends l{constructor(){super(i("interactiveCancelled"))}};Pn={positive:M,caution:v,muted:C}});function Dt(e){let t=[];if(e.beforePublish)t.push({kind:"hook",name:"beforePublish",command:e.beforePublish});for(let n of Pt(e.packages.filter((r)=>!r.private))){let r=n.registry??"";if(!n.published||n.distTagVersion!==n.version)t.push(n.published?{kind:"dist-tag",name:n.name,version:n.version,folder:n.folder,registry:r,tag:e.distTag}:{kind:"publish",name:n.name,version:n.version,folder:n.folder,registry:r,tag:e.distTag});if(e.formal)t.push({kind:"tag",name:n.name,version:n.version,commit:n.commit??e.commit})}if(e.afterPublish)t.push({kind:"hook",name:"afterPublish",command:e.afterPublish});return t}var Ft=G(()=>{N()});import Ie from"node:path";import je from"semver";async function Bt(e){return X(e.root,Boolean(e.dryRun),()=>xn(e))}async function xn(e){console.log(e.dryRun?v(i("publishPreview")):S(i("publishPreparing")));let{root:t,startHead:n,config:r,release:s,entries:o,formal:a,registryOf:c,published:m,distTagVersions:d,steps:h}=await ae(e),x=O({...e,root:t,commit:s.hash}),f={CHANGE_VERSIONS_PUBLISH_CONTEXT:JSON.stringify({schemaVersion:1,root:t,packagesDir:r.packagesDir,commit:s.hash,distTag:e.distTag,packages:h.flatMap((g)=>g.kind==="publish"?[{name:g.name,version:g.version,path:Ie.join(r.packagesDir,g.folder)}]:[])})};for(let g of o)if(m.has(g.folder)&&d.get(g.folder)===g.to)console.log(C(i("alreadyTagged",{name:g.name,version:g.to,tag:e.distTag,registry:c.get(g.folder)||""})));if(console.log(i("publishPlanSummary",{uploads:h.filter((g)=>g.kind==="publish").length,retags:h.filter((g)=>g.kind==="dist-tag").length,tags:h.filter((g)=>g.kind==="tag").length})),e.dryRun){rt({steps:h,formal:a,config:r,entries:o},x);return}console.log(C(i("publishResumeInfo"))),console.log(S(i("willPublish")));for(let g of o){if(m.has(g.folder)&&d.get(g.folder)===g.to)continue;let E=g.pkg.private?` ${C(i("privateMark"))}`:m.has(g.folder)?` ${C(i("distTagOnlyMark"))}`:"";console.log(` ${Q(g.name)} ${oe(g.to)}${E}`)}if(!e.yes&&!await se(i("confirmPublish")))throw new l(i("cancelledPublish"));let u=new Map(o.map((g)=>[g.folder,g.pkg.private?"summaryPrivate":m.has(g.folder)&&d.get(g.folder)===g.to?"summarySkipped":"summaryPending"])),w="beforePublish",p,k=!1,b=(g)=>g==="summaryPublished"||g==="summaryRetagged"?M:g==="summaryFailed"?ze:g==="summaryPending"?v:C,R=()=>{console.log((k?M:ze)(i(k?"publishComplete":"publishIncomplete"))),console.log(i("publishSummaryContext",{commit:s.hash,tag:e.distTag}));let g=new Map;for(let E of o){let z=u.get(E.folder);g.set(z,(g.get(z)??0)+1);let re=c.get(E.folder);console.log(` ${b(z)(i(z))}: ${Q(E.name)}@${Q(E.to)}${re?` — ${C(re)}`:""}`)}if(console.log([...g].map(([E,z])=>`${b(E)(i(E))}: ${Q(String(z))}`).join(", ")),k)console.log(M(i("publishReady"))),console.log(C(i(h.some((E)=>E.kind==="tag")?r.branch?"gitTagsPushed":"gitTagsLocal":"noGitTag")));else{if(console.log(ze(i("publishFailedStage",{stage:w}))),w==="git tag / git push")console.log(v(i("publishTagRecovery")));console.log(v(i("publishRetryTitle"))),console.log(S(i("publishRetry"))),console.log(C(i("publishResumeInfo"))),console.log(F(x))}},B=()=>{if(p)u.set(p,"summaryFailed");R(),console.error(H(i("publishInterrupted"))),process.exit(1)};process.on("SIGINT",B),process.on("SIGTERM",B);try{await At(t,r.hooks.beforePublish,"beforePublish",f),await Pe(t,i("beforePublishDirty")),await Ae(t,n);for(let g of h){if(g.kind==="tag"){w="git tag / git push",console.log(S(i("executingStep",{step:Be(g)}))),await Cn(t,r.branch,[{name:g.name,to:g.version,commit:g.commit}]);continue}if(g.kind!=="publish"&&g.kind!=="dist-tag")continue;let E=Ie.join(t,r.packagesDir,g.folder);w=`${g.kind==="publish"?"npm publish":"npm dist-tag add"} ${g.name}@${g.version}`,p=g.folder;let z="summaryPending";await It(async()=>{let re=await jt(t,g.name,g.version,g.registry);if(!re&&g.kind==="dist-tag")throw new l(i("registryVersionDisappeared",{name:g.name,version:g.version}));let at=await Mt(t,g.name,g.tag,g.registry,!re);if(Ht(g.name,g.version,at,g.tag),await Pe(t,i("publishSourceDirty")),await Ae(t,n),re&&at===g.version)z="summarySkipped",console.log(C(i("alreadyTagged",{name:g.name,version:g.version,tag:g.tag,registry:g.registry})));else if(re)w=`npm dist-tag add ${g.name}@${g.version}`,console.log(S(i("executingStep",{step:Be({...g,kind:"dist-tag"})}))),await Nt(t,["dist-tag","add",`${g.name}@${g.version}`,g.tag,`--registry=${g.registry}`],g.registry),z="summaryRetagged";else w=`npm publish ${g.name}@${g.version}`,console.log(S(i("executingStep",{step:Be({...g,kind:"publish"})}))),await Nt(E,["publish",`--tag=${g.tag}`,`--registry=${g.registry}`],g.registry),z="summaryPublished"}),u.set(g.folder,z),p=void 0,await Pe(t,i("publishSourceDirty")),await Ae(t,n)}w="afterPublish",await At(t,r.hooks.afterPublish,"afterPublish",f),await Pe(t,i("afterPublishDirty")),await Ae(t,n),k=!0}catch(g){if(p)u.set(p,"summaryFailed");throw g}finally{process.off("SIGINT",B),process.off("SIGTERM",B),R()}}async function ae(e,t=!1,n=!1){let r=Ie.resolve(e.root);if(!t)await V(r);let s=(await y("git",["rev-parse","HEAD"],r)).trim(),o=he(r,e.versionsFile);if(e.packages)o.packagesDir=e.packages;let a=await j(r,e.commit);if(!a?.lines.length)throw new l(i("noVersionCommit"));let c=ee(r,o.packagesDir),m=new Map(c.map((b)=>[A(r,o.packagesDir,b).name,b])),d=a.lines.map((b)=>{let R=m.get(b.name);if(!R)throw new l(i("packageNotInDir",{dir:o.packagesDir,name:b.name}));let B=A(r,o.packagesDir,R);if(B.version!==b.to)throw new l(i("releaseVersionMismatch",{name:b.name,expected:b.to,actual:B.version,commit:a.hash}));return{...b,folder:R,pkg:B,commit:a.sourceCommits.get(b.name)??a.hash,deps:He(B,m)}}),h=new Set;for(let b of d){let R=await P("git",["diff","--quiet",b.commit,s,"--",`${o.packagesDir}/${b.folder}`],r);if(R.code===1)h.add(b.folder);if(R.code!==0&&R.code!==1)throw new l(i("gitFailed",{detail:R.stderr.trim()}))}if(h.size&&!n)throw new l(i("releaseContentsChanged"));if(!t)console.log(i("publishSummaryContext",{commit:a.hash,tag:e.distTag}));let x=Ne(a.lines);if(x)await Me(r,d.filter((b)=>!b.pkg.private));let f=new Map;for(let b of d){if(b.pkg.private)continue;let R=await Rn(r,b.pkg);if(f.set(b.folder,R),!t)console.log(i("checkingRegistry",{name:b.name,version:b.to,registry:R}))}let u=new Set;for(let b of d){let R=f.get(b.folder);if(!R||u.has(R))continue;if(u.add(R),!t)await Sn(r,R)}let w=new Set,p=new Map;for(let b of d){if(b.pkg.private)continue;let R=f.get(b.folder);if(!R)continue;await It(async()=>{let B=await jt(r,b.name,b.to,R);if(B)w.add(b.folder);let g=await Mt(r,b.name,e.distTag,R,!B);if(!t)Ht(b.name,b.to,g,e.distTag);p.set(b.folder,g)})}let k=Dt({packages:d.map((b)=>({name:b.name,version:b.to,folder:b.folder,private:b.pkg.private,deps:b.deps,registry:f.get(b.folder),published:w.has(b.folder),distTagVersion:p.get(b.folder),commit:b.commit})),distTag:e.distTag,formal:x,commit:a.hash,beforePublish:o.hooks.beforePublish,afterPublish:o.hooks.afterPublish});return{root:r,startHead:s,config:o,release:a,entries:d,formal:x,registryOf:f,published:w,distTagVersions:p,steps:k,changed:h}}function rt(e,t){for(let n of e.steps)if(console.log(`${v(i("plannedStep",{step:""}))}${Be(n)}`),n.kind==="tag"&&e.config.branch)console.log(v(i("plannedStep",{step:`git push origin refs/tags/${n.name}@${n.version}`})));if(!e.formal)console.log(C(i("noGitTag")));console.log(v(i("publishPreviewComplete"))),console.log(S(i("publishPreviewNext"))),console.log(F(t))}function Be(e){if(e.kind==="hook")return`${C(`${e.name}:`)} ${F(e.command)}`;if(e.kind==="tag")return F(`git tag ${e.name}@${e.version} ${e.commit}`);if(e.kind==="dist-tag")return F(`npm dist-tag add ${e.name}@${e.version} ${e.tag} --registry=${e.registry}`);return F(`npm publish --tag=${e.tag} --registry=${e.registry} ${e.name}@${e.version}`)}async function j(e,t){if((await P("git",["rev-parse","--verify","HEAD"],e)).code!==0)return null;let r;if(t){let c=await P("git",["rev-parse","--verify","--end-of-options",`${t}^{commit}`],e);if(c.code!==0)throw new l(i("badReleaseCommit",{commit:t}));let m=c.stdout.trim();if((await P("git",["merge-base","--is-ancestor",m,"HEAD"],e)).code!==0)throw new l(i("badReleaseCommit",{commit:t}));r={hash:m,subject:(await y("git",["show","-s","--format=%s",m],e)).trim(),body:await y("git",["show","-s","--format=%b",m],e)}}else r=(await fe(e))[0];if(!r)return null;let s=de(r.body);if(!s.length){if(t)throw new l(i("badReleaseCommit",{commit:t}));return null}if(new Set(s.map((c)=>c.name)).size!==s.length||s.some((c)=>!je.valid(c.from)||!je.valid(c.to)))throw new l(i("badReleaseCommit",{commit:r.hash}));let o=/^Change-Versions-Dist-Tag: (\S+)$/m.exec(r.body)?.[1],a=new Map;for(let c of r.body.split(`
|
|
29
|
-
`).filter((m)=>m.startsWith("Change-Versions-Source:"))){let m=/^Change-Versions-Source: (\S+) ([a-f0-9]{40}|[a-f0-9]{64})$/.exec(c);if(!m||a.has(m[1])||!s.some((d)=>d.name===m[1]))throw new l(i("badReleaseCommit",{commit:r.hash}));a.set(m[1],m[2])}if(a.size&&a.size!==s.length)throw new l(i("badReleaseCommit",{commit:r.hash}));for(let c of new Set(a.values()))if((await
|
|
30
|
-
`).filter(Boolean).map((n)=>{let[r,s]=n.split("\x1F");return{hash:r,subject:s??""}})}async function fe(e){let t=await y("git",["log","-F",`--grep=${ue}`,"--format=%H%x1f%s%x1f%b%x1e"],e),n=[];for(let r of t.split("\x1E")){let s=r.replace(/^\n/,"").trim();if(!s)continue;let[o,a,c]=s.split("\x1F");if(!o)continue;n.push({hash:o,subject:a??"",body:c??""})}return n}async function te(e,t){if(t){let o=await
|
|
28
|
+
`)){let r=/^(\S+) (\S+) => (\S+)$/.exec(n.trim());if(r)t.push({name:r[1],from:r[2],to:r[3]})}return t}function Pt(e){let t=new Map(e.map((o)=>[o.folder,o])),n=new Set,r=[],s=(o,a)=>{if(n.has(o.folder))return;if(a.has(o.folder))throw new l(i("dependencyCycle",{name:o.name}));a.add(o.folder);for(let c of o.deps){let m=t.get(c);if(m)s(m,a)}a.delete(o.folder),n.add(o.folder),r.push(o)};for(let o of e)s(o,new Set);return r}function ye(e){return/ENEEDAUTH|E401|E403|need auth|not logged in|401 Unauthorized|403 Forbidden/i.test(e)}function ve(e){try{return JSON.parse(e)?.error?.code==="E404"}catch{return!1}}var l,mt,dt,cn,ln,mn,dn="publish@change-versions.com",pn,ue;var N=G(()=>{D();l=class l extends Error{auth;constructor(e,t=!1){super(e);this.name="Fail",this.auth=t}};mt=["patch","minor","major","prerelease","prepatch","preminor","premajor"],dt=new Set(["patch","minor","major"]),cn=new Set(["prerelease","prepatch","preminor","premajor"]);ln=new Set(["packagesDir","commitMessage","branch","hooks","include","exclude","commitFiles"]),mn=new Set(["beforeCommit","beforePublish","afterPublish"]);pn=`change-versions <${dn}>`,ue=`Co-authored-by: ${pn}`});import{spawn as xt}from"node:child_process";function x(e,t,n){return new Promise((r)=>{let s=xt(e,t,{cwd:n,stdio:["ignore","pipe","pipe"]}),o="",a="";s.stdout.on("data",(c)=>{o+=c}),s.stderr.on("data",(c)=>{a+=c}),s.on("error",(c)=>r({code:1,stdout:o,stderr:`${a}${c.message}`})),s.on("close",(c)=>r({code:c??1,stdout:o,stderr:a}))})}async function y(e,t,n){let r=await x(e,t,n);if(r.code!==0){let s=(r.stderr||r.stdout).trim();throw new l(s?i("commandFailed",{command:e,detail:s}):i("commandFailedShort",{command:e}))}return r.stdout}function Ee(e,t,n,r){return new Promise((s,o)=>{let a=xt(e,t,{cwd:n,stdio:"inherit",env:{...process.env,...r}});a.on("error",o),a.on("exit",(c)=>{if(c===0)s();else o(new l(i("commandExit",{command:e,code:c??1})))})})}var W=G(()=>{D();N()});function Ct(e){let t=e.packages.map((m)=>m.folder),n=new Map(e.packages.map((m)=>[m.folder,m])),r=new Map(e.packages.map((m)=>[m.name,m])),s=new Map(e.packages.map((m)=>[m.name,m.folder])),{changed:o}=ft(t,e.filesByFolder,e.include,e.exclude,(m)=>e.devOnly.has(m),e.packagesDir),a=yt(t,o,(m)=>hn(n.get(m),s));for(let m of a){let d=n.get(m);if(!d||d.private)continue;for(let h of Object.keys(d.dependencies??{}))if(r.get(h)?.private)throw new l(i("publicDependsOnPrivate",{name:d.name,dep:h}))}let c=new Set(o);return{changed:o,dependents:a.filter((m)=>!c.has(m))}}function hn(e,t){if(!e)return[];return[...Object.keys(e.dependencies??{}),...Object.keys(e.devDependencies??{})].flatMap((r)=>{let s=t.get(r);return s?[s]:[]})}var St=G(()=>{D();N()});import pe from"node:fs";import tt from"node:path";import fn from"node:os";import{randomUUID as bn}from"node:crypto";import{AsyncLocalStorage as wn}from"node:async_hooks";async function X(e,t,n){if(t)return n();e=tt.resolve(e);let r=tt.resolve(e,(await y("git",["rev-parse","--git-common-dir"],e)).trim()),s=tt.join(r,"change-versions.lock");if(nt.getStore()?.has(s))return n();let o={pid:process.pid,host:fn.hostname(),token:bn()},a;try{a=pe.openSync(s,"wx",384)}catch(d){if(d.code!=="EEXIST")throw d;let h="";try{h=pe.readFileSync(s,"utf8")}catch{}throw new l(i("repositoryLocked",{file:s,owner:h.trim()}))}let c=()=>{try{if(JSON.parse(pe.readFileSync(s,"utf8")).token===o.token)pe.unlinkSync(s)}catch{}};try{pe.writeFileSync(a,JSON.stringify(o))}finally{pe.closeSync(a)}let m=()=>{if(process.listenerCount("SIGINT")<=1&&process.listenerCount("SIGTERM")<=1)process.exit(1)};process.on("exit",c),process.on("SIGINT",m),process.on("SIGTERM",m);try{return await nt.run(new Set([...nt.getStore()??[],s]),n)}finally{process.off("SIGINT",m),process.off("SIGTERM",m),process.off("exit",c),c()}}var nt;var ke=G(()=>{W();N();D();nt=new wn});function vn(e){if(/^[a-zA-Z0-9_./:@=+-]+$/.test(e))return e;return"'"+e.replaceAll("'","'\\''")+"'"}function O(e){let t=["change-versions","publish",`--dist-tag=${e.distTag}`,`--root=${e.root}`,`--versions-file=${e.versionsFile}`];if(e.commit)t.push(`--commit=${e.commit}`);if(e.packages)t.push(`--packages=${e.packages}`);if(e.retryUnpublished)t.push("--retry-unpublished");return t.map(vn).join(" ")}import kn from"node:readline/promises";import{stdin as Rt,stdout as zt}from"node:process";async function it(e){let t=kn.createInterface({input:Rt,output:zt}),n=new AbortController,r=()=>n.abort();t.once("SIGINT",r),t.once("close",r);try{return await t.question(e,{signal:n.signal})}catch(s){if(n.signal.aborted)throw new J;throw s}finally{t.off("SIGINT",r),t.off("close",r),t.close()}}function T(){return Boolean(Rt.isTTY&&zt.isTTY)}async function Tt(e,t){if(!T())throw new l(i("bumpRequired"));console.log(S(e)),t.forEach((n,r)=>{let s=n.tone?Pn[n.tone](n.label):n.label;console.log(` ${F(String(r+1))}) ${s}`)});while(!0){let n=(await it(F(i("chooseIndex")))).trim();if(n.toLowerCase()==="q")throw new J;let r=/^\d+$/.test(n)?Number(n)-1:-1;if(Number.isInteger(r)&&r>=0&&r<t.length)return r;console.log(k(i("invalidChoice",{answer:n||i("emptyAnswer")})))}}async function $t(e,t){return t[await Tt(e,t.map((n)=>({label:n})))]}async function Z(e,t){return t[await Tt(e,t)].value}async function L(e,t=""){if(!T())throw new l(i("yesRequired"));let n=t?` ${M(`[${t}]`)}`:"",r=(await it(`${S(e)}${n} `)).trim();if(r.toLowerCase()==="q")throw new J;return r||t}async function se(e){if(!T())throw new l(i("yesRequired"));console.log(S(e));while(!0){let t=(await it(`${k("[y/N/q]")} `)).trim().toLowerCase();if(t==="q")throw new J;if(t==="y"||t==="yes")return!0;if(!t||t==="n"||t==="no")return!1;console.log(k(i("confirmAnswer")))}}var J,Pn;var _=G(()=>{I();D();N();J=class J extends l{constructor(){super(i("interactiveCancelled"))}};Pn={positive:M,caution:k,muted:v}});function Dt(e){let t=[];if(e.beforePublish)t.push({kind:"hook",name:"beforePublish",command:e.beforePublish});for(let n of Pt(e.packages.filter((r)=>!r.private))){let r=n.registry??"";if(!n.published||n.distTagVersion!==n.version)t.push(n.published?{kind:"dist-tag",name:n.name,version:n.version,folder:n.folder,registry:r,tag:e.distTag}:{kind:"publish",name:n.name,version:n.version,folder:n.folder,registry:r,tag:e.distTag});if(e.formal)t.push({kind:"tag",name:n.name,version:n.version,commit:n.commit??e.commit})}if(e.afterPublish)t.push({kind:"hook",name:"afterPublish",command:e.afterPublish});return t}var Ft=G(()=>{N()});import Ie from"node:path";import je from"semver";async function Bt(e){return X(e.root,Boolean(e.dryRun),()=>xn(e))}async function xn(e){console.log(e.dryRun?k(i("publishPreview")):S(i("publishPreparing")));let{root:t,startHead:n,config:r,release:s,entries:o,formal:a,registryOf:c,published:m,distTagVersions:d,steps:h}=await ae(e),C=O({...e,root:t,commit:s.hash}),f={CHANGE_VERSIONS_PUBLISH_CONTEXT:JSON.stringify({schemaVersion:1,root:t,packagesDir:r.packagesDir,commit:s.hash,distTag:e.distTag,packages:h.flatMap((g)=>g.kind==="publish"?[{name:g.name,version:g.version,path:Ie.join(r.packagesDir,g.folder)}]:[])})};for(let g of o)if(m.has(g.folder)&&d.get(g.folder)===g.to)console.log(v(i("alreadyTagged",{name:g.name,version:g.to,tag:e.distTag,registry:c.get(g.folder)||""})));if(console.log(i("publishPlanSummary",{uploads:h.filter((g)=>g.kind==="publish").length,retags:h.filter((g)=>g.kind==="dist-tag").length,tags:h.filter((g)=>g.kind==="tag").length})),e.dryRun){rt({steps:h,formal:a,config:r,entries:o},C);return}console.log(v(i("publishResumeInfo"))),console.log(S(i("willPublish")));for(let g of o){if(m.has(g.folder)&&d.get(g.folder)===g.to)continue;let E=g.pkg.private?` ${v(i("privateMark"))}`:m.has(g.folder)?` ${v(i("distTagOnlyMark"))}`:"";console.log(` ${Q(g.name)} ${oe(g.to)}${E}`)}if(!e.yes&&!await se(i("confirmPublish")))throw new l(i("cancelledPublish"));let u=new Map(o.map((g)=>[g.folder,g.pkg.private?"summaryPrivate":m.has(g.folder)&&d.get(g.folder)===g.to?"summarySkipped":"summaryPending"])),w="beforePublish",p,P=!1,b=(g)=>g==="summaryPublished"||g==="summaryRetagged"?M:g==="summaryFailed"?ze:g==="summaryPending"?k:v,R=()=>{console.log((P?M:ze)(i(P?"publishComplete":"publishIncomplete"))),console.log(i("publishSummaryContext",{commit:s.hash,tag:e.distTag}));let g=new Map;for(let E of o){let z=u.get(E.folder);g.set(z,(g.get(z)??0)+1);let re=c.get(E.folder);console.log(` ${b(z)(i(z))}: ${Q(E.name)}@${Q(E.to)}${re?` — ${v(re)}`:""}`)}if(console.log([...g].map(([E,z])=>`${b(E)(i(E))}: ${Q(String(z))}`).join(", ")),P)console.log(M(i("publishReady"))),console.log(v(i(h.some((E)=>E.kind==="tag")?r.branch?"gitTagsPushed":"gitTagsLocal":"noGitTag")));else{if(console.log(ze(i("publishFailedStage",{stage:w}))),w==="git tag / git push")console.log(k(i("publishTagRecovery")));console.log(k(i("publishRetryTitle"))),console.log(S(i("publishRetry"))),console.log(v(i("publishResumeInfo"))),console.log(F(C))}},B=()=>{if(p)u.set(p,"summaryFailed");R(),console.error(H(i("publishInterrupted"))),process.exit(1)};process.on("SIGINT",B),process.on("SIGTERM",B);try{await At(t,r.hooks.beforePublish,"beforePublish",f),await Pe(t,i("beforePublishDirty")),await Ae(t,n);for(let g of h){if(g.kind==="tag"){w="git tag / git push",console.log(S(i("executingStep",{step:Be(g)}))),await Cn(t,r.branch,[{name:g.name,to:g.version,commit:g.commit}]);continue}if(g.kind!=="publish"&&g.kind!=="dist-tag")continue;let E=Ie.join(t,r.packagesDir,g.folder);w=`${g.kind==="publish"?"npm publish":"npm dist-tag add"} ${g.name}@${g.version}`,p=g.folder;let z="summaryPending";await It(async()=>{let re=await jt(t,g.name,g.version,g.registry);if(!re&&g.kind==="dist-tag")throw new l(i("registryVersionDisappeared",{name:g.name,version:g.version}));let at=await Mt(t,g.name,g.tag,g.registry,!re);if(Ht(g.name,g.version,at,g.tag),await Pe(t,i("publishSourceDirty")),await Ae(t,n),re&&at===g.version)z="summarySkipped",console.log(v(i("alreadyTagged",{name:g.name,version:g.version,tag:g.tag,registry:g.registry})));else if(re)w=`npm dist-tag add ${g.name}@${g.version}`,console.log(S(i("executingStep",{step:Be({...g,kind:"dist-tag"})}))),await Nt(t,["dist-tag","add",`${g.name}@${g.version}`,g.tag,`--registry=${g.registry}`],g.registry),z="summaryRetagged";else w=`npm publish ${g.name}@${g.version}`,console.log(S(i("executingStep",{step:Be({...g,kind:"publish"})}))),await Nt(E,["publish",`--tag=${g.tag}`,`--registry=${g.registry}`],g.registry),z="summaryPublished"}),u.set(g.folder,z),p=void 0,await Pe(t,i("publishSourceDirty")),await Ae(t,n)}w="afterPublish",await At(t,r.hooks.afterPublish,"afterPublish",f),await Pe(t,i("afterPublishDirty")),await Ae(t,n),P=!0}catch(g){if(p)u.set(p,"summaryFailed");throw g}finally{process.off("SIGINT",B),process.off("SIGTERM",B),R()}}async function ae(e,t=!1,n=!1){let r=Ie.resolve(e.root);if(!t)await V(r);let s=(await y("git",["rev-parse","HEAD"],r)).trim(),o=he(r,e.versionsFile);if(e.packages)o.packagesDir=e.packages;let a=await j(r,e.commit);if(!a?.lines.length)throw new l(i("noVersionCommit"));let c=ee(r,o.packagesDir),m=new Map(c.map((b)=>[A(r,o.packagesDir,b).name,b])),d=a.lines.map((b)=>{let R=m.get(b.name);if(!R)throw new l(i("packageNotInDir",{dir:o.packagesDir,name:b.name}));let B=A(r,o.packagesDir,R);if(B.version!==b.to)throw new l(i("releaseVersionMismatch",{name:b.name,expected:b.to,actual:B.version,commit:a.hash}));return{...b,folder:R,pkg:B,commit:a.sourceCommits.get(b.name)??a.hash,deps:He(B,m)}}),h=new Set;for(let b of d){let R=await x("git",["diff","--quiet",b.commit,s,"--",`${o.packagesDir}/${b.folder}`],r);if(R.code===1)h.add(b.folder);if(R.code!==0&&R.code!==1)throw new l(i("gitFailed",{detail:R.stderr.trim()}))}if(h.size&&!n)throw new l(i("releaseContentsChanged"));if(!t)console.log(i("publishSummaryContext",{commit:a.hash,tag:e.distTag}));let C=Ne(a.lines);if(C)await Me(r,d.filter((b)=>!b.pkg.private));let f=new Map;for(let b of d){if(b.pkg.private)continue;let R=await Rn(r,b.pkg);if(f.set(b.folder,R),!t)console.log(i("checkingRegistry",{name:b.name,version:b.to,registry:R}))}let u=new Set;for(let b of d){let R=f.get(b.folder);if(!R||u.has(R))continue;if(u.add(R),!t)await Sn(r,R)}let w=new Set,p=new Map;for(let b of d){if(b.pkg.private)continue;let R=f.get(b.folder);if(!R)continue;await It(async()=>{let B=await jt(r,b.name,b.to,R);if(B)w.add(b.folder);let g=await Mt(r,b.name,e.distTag,R,!B);if(!t)Ht(b.name,b.to,g,e.distTag);p.set(b.folder,g)})}let P=Dt({packages:d.map((b)=>({name:b.name,version:b.to,folder:b.folder,private:b.pkg.private,deps:b.deps,registry:f.get(b.folder),published:w.has(b.folder),distTagVersion:p.get(b.folder),commit:b.commit})),distTag:e.distTag,formal:C,commit:a.hash,beforePublish:o.hooks.beforePublish,afterPublish:o.hooks.afterPublish});return{root:r,startHead:s,config:o,release:a,entries:d,formal:C,registryOf:f,published:w,distTagVersions:p,steps:P,changed:h}}function rt(e,t){for(let n of e.steps)if(console.log(`${k(i("plannedStep",{step:""}))}${Be(n)}`),n.kind==="tag"&&e.config.branch)console.log(k(i("plannedStep",{step:`git push origin refs/tags/${n.name}@${n.version}`})));if(!e.formal)console.log(v(i("noGitTag")));console.log(k(i("publishPreviewComplete"))),console.log(S(i("publishPreviewNext"))),console.log(F(t))}function Be(e){if(e.kind==="hook")return`${v(`${e.name}:`)} ${F(e.command)}`;if(e.kind==="tag")return F(`git tag ${e.name}@${e.version} ${e.commit}`);if(e.kind==="dist-tag")return F(`npm dist-tag add ${e.name}@${e.version} ${e.tag} --registry=${e.registry}`);return F(`npm publish --tag=${e.tag} --registry=${e.registry} ${e.name}@${e.version}`)}async function j(e,t){if((await x("git",["rev-parse","--verify","HEAD"],e)).code!==0)return null;let r;if(t){let c=await x("git",["rev-parse","--verify","--end-of-options",`${t}^{commit}`],e);if(c.code!==0)throw new l(i("badReleaseCommit",{commit:t}));let m=c.stdout.trim();if((await x("git",["merge-base","--is-ancestor",m,"HEAD"],e)).code!==0)throw new l(i("badReleaseCommit",{commit:t}));r={hash:m,subject:(await y("git",["show","-s","--format=%s",m],e)).trim(),body:await y("git",["show","-s","--format=%b",m],e)}}else r=(await fe(e))[0];if(!r)return null;let s=de(r.body);if(!s.length){if(t)throw new l(i("badReleaseCommit",{commit:t}));return null}if(new Set(s.map((c)=>c.name)).size!==s.length||s.some((c)=>!je.valid(c.from)||!je.valid(c.to)))throw new l(i("badReleaseCommit",{commit:r.hash}));let o=/^Change-Versions-Dist-Tag: (\S+)$/m.exec(r.body)?.[1],a=new Map;for(let c of r.body.split(`
|
|
29
|
+
`).filter((m)=>m.startsWith("Change-Versions-Source:"))){let m=/^Change-Versions-Source: (\S+) ([a-f0-9]{40}|[a-f0-9]{64})$/.exec(c);if(!m||a.has(m[1])||!s.some((d)=>d.name===m[1]))throw new l(i("badReleaseCommit",{commit:r.hash}));a.set(m[1],m[2])}if(a.size&&a.size!==s.length)throw new l(i("badReleaseCommit",{commit:r.hash}));for(let c of new Set(a.values()))if((await x("git",["merge-base","--is-ancestor",c,r.hash],e)).code!==0)throw new l(i("badReleaseCommit",{commit:r.hash}));return{hash:r.hash,subject:r.subject,lines:s,distTag:o,sourceCommits:a}}async function Cn(e,t,n){await Me(e,n);let r=n.map((o)=>`${o.name}@${o.to}`);for(let o of n){let a=`${o.name}@${o.to}`;if((await x("git",["rev-parse","--verify",`refs/tags/${a}^{commit}`],e)).code===0)continue;await y("git",["tag",a,o.commit],e)}if(!t)return;let s=await x("git",["push","origin",...r.map((o)=>`refs/tags/${o}`)],e);if(s.code!==0)throw new l(i("tagPushFailed",{detail:s.stderr.trim()}))}async function Me(e,t){for(let n of t){let r=`${n.name}@${n.to}`,s=await x("git",["rev-parse","--verify",`refs/tags/${r}^{commit}`],e);if(s.code===0&&s.stdout.trim()!==n.commit)throw new l(i("tagPointsElsewhere",{tag:r}))}}async function Ae(e,t){if((await y("git",["rev-parse","HEAD"],e)).trim()!==t)throw new l(i("publishHeadChanged"))}async function It(e){let t="";for(let n=0;n<3;n++)try{await e();return}catch(r){if(r instanceof l)throw r;t=r instanceof Error?r.message:String(r)}throw new l(i("networkFailed",{detail:t}))}async function Nt(e,t,n){let r=await x("npm",t,e);if(r.code===0)return;let s=`${r.stderr}${r.stdout}`;if(process.stderr.write(r.stderr),ye(s))throw new l(i("notLoggedIn",{registry:n}),!0);throw Error(s.trim()||i("npmFailed"))}async function jt(e,t,n,r){let s=await x("npm",["view",`${t}@${n}`,"version","--json",`--registry=${r}`],e);if(s.code===0){let a;try{a=JSON.parse(s.stdout)}catch{}if(a===n||Array.isArray(a)&&a.length===1&&a[0]===n)return!0;throw Error(i("unexpectedRegistryVersion",{name:t,version:n,registry:r}))}let o=`${s.stderr}${s.stdout}`;if(ye(o))throw new l(i("notLoggedIn",{registry:r}),!0);if(ve(s.stdout)||ve(s.stderr))return!1;throw Error(o.trim()||i("npmViewFailed"))}async function Mt(e,t,n,r,s=!1){let o=await x("npm",["view",t,"dist-tags","--json",`--registry=${r}`],e);if(o.code!==0){let m=`${o.stderr}${o.stdout}`.trim();if(ye(m))throw new l(i("notLoggedIn",{registry:r}),!0);if(s&&(ve(o.stdout)||ve(o.stderr)))return;throw Error(m||i("npmViewFailed"))}let a;try{a=JSON.parse(o.stdout)}catch{}if(Array.isArray(a)&&a.length===1)a=a[0];if(!a||typeof a!=="object"||Array.isArray(a))throw Error(i("unexpectedRegistryTags",{name:t,tag:n,registry:r}));let c=Object.prototype.hasOwnProperty.call(a,n)?a[n]:void 0;if(c!==void 0&&(typeof c!=="string"||!je.valid(c)))throw Error(i("unexpectedRegistryTags",{name:t,tag:n,registry:r}));return c}function Ht(e,t,n,r){if(n&&je.gt(n,t))throw new l(i("distTagDowngrade",{name:e,version:t,current:n,tag:r}))}async function Sn(e,t){let n=await x("npm",["whoami",`--registry=${t}`],e);if(n.code===0)return;let r=`${n.stderr}${n.stdout}`;if(ye(r))throw new l(i("notLoggedIn",{registry:t}),!0);throw new l(i("registryUnreachable",{registry:t,detail:r.trim()}))}async function Rn(e,t){if(t.publishConfig?.registry)return t.publishConfig.registry.replace(/\/$/,"");if(t.name.startsWith("@")&&t.name.includes("/")){let r=t.name.slice(0,t.name.indexOf("/")),s=await Et(e,`${r}:registry`);if(s&&s!=="undefined"&&s!=="null")return s.replace(/\/$/,"")}let n=await Et(e,"registry");if(!n||n==="undefined"||n==="null")throw new l(i("noNpmRegistry",{detail:"npm config get registry: empty value"}));return n.replace(/\/$/,"")}async function Et(e,t){let n=await x("npm",["config","get",t],e);if(n.code!==0){let r=n.stderr.trim()||n.stdout.trim()||`npm config get ${t}: exit ${n.code}`;throw new l(i("noNpmRegistry",{detail:r}))}return n.stdout.trim()}async function At(e,t,n,r){if(!t)return;console.log(S(i("executingStep",{step:`${n}: ${t}`})));try{await Ee("sh",["-c",t],e,r)}catch(s){let o=s instanceof Error?s.message:String(s);throw new l(i("hookFailed",{name:n,detail:o}))}}async function xe(e,t,n){return t??(await j(Ie.resolve(e),n))?.distTag??"latest"}var K=G(()=>{ke();I();D();N();W();_();Ft();ce()});import be from"node:fs";import Oe from"node:path";function he(e,t){let n=Oe.resolve(e,t);if(!be.existsSync(n))throw new l(i("configUnreadable",{file:t}));return Fe(be.readFileSync(n,"utf8"))}function ee(e,t){let n=Oe.join(e,t);if(!be.existsSync(n))throw new l(i("packagesDirMissing",{dir:t}));return be.readdirSync(n).filter((r)=>!r.startsWith(".")&&be.existsSync(Oe.join(n,r,"package.json")))}function A(e,t,n){let r=JSON.parse(be.readFileSync(Oe.join(e,t,n,"package.json"),"utf8"));if(!r.name||!r.version)throw new l(i("packageJsonIncomplete",{folder:n}));return r}function He(e,t){let n=[];for(let r of["dependencies","devDependencies"])for(let s of Object.keys(e[r]??{})){let o=t.get(s);if(o)n.push(o)}return n}async function V(e){let t=await x("git",["status","--porcelain"],e);if(t.code!==0)throw new l(i("gitFailed",{detail:t.stderr.trim()}));if(t.stdout.trim())throw new l(i("dirtyTree"))}async function Pe(e,t){let n=await x("git",["status","--porcelain"],e);if(n.code!==0)throw new l(i("gitFailed",{detail:n.stderr.trim()}));if(n.stdout.trim())throw new l(t)}async function Ve(e){return(await y("git",["log","--format=%H%x1f%s"],e)).split(`
|
|
30
|
+
`).filter(Boolean).map((n)=>{let[r,s]=n.split("\x1F");return{hash:r,subject:s??""}})}async function fe(e){let t=await y("git",["log","-F",`--grep=${ue}`,"--format=%H%x1f%s%x1f%b%x1e"],e),n=[];for(let r of t.split("\x1E")){let s=r.replace(/^\n/,"").trim();if(!s)continue;let[o,a,c]=s.split("\x1F");if(!o)continue;n.push({hash:o,subject:a??"",body:c??""})}return n}async function te(e,t){if(t){let o=await x("git",["rev-parse","--verify",`${t}^{commit}`],e);if(o.code!==0)throw new l(i("badBaseline",{rev:t}));return o.stdout.trim()}if((await x("git",["rev-parse","--verify","HEAD"],e)).code!==0)throw new l(i("noBaseline"));let r=await fe(e),s=(await Ve(e)).find((o)=>et(o.subject));if(r[0]){if(s&&s.hash!==r[0].hash&&(await x("git",["merge-base","--is-ancestor",r[0].hash,s.hash],e)).code===0)return s.hash;return r[0].hash}return s?.hash??Tn()}async function Ge(e,t,n,r=!n){let s=await te(e,n),o=ee(e,t.packagesDir),a=o.map((u)=>({...A(e,t.packagesDir,u),folder:u})),c=await zn(e,a,s,r),m=new Map,d=new Map;for(let u of o){let w=c.get(u);d.set(w,[...d.get(w)??[],u])}for(let[u,w]of d){let p=await y("git",["diff","--name-only",u,"HEAD","--",...w.map((P)=>`${t.packagesDir}/${P}`)],e);for(let[P,b]of ht(p,t.packagesDir,w))m.set(P,b)}let h=new Set;for(let[u,w]of m){let p=c.get(u),P=`${t.packagesDir}/${u}/package.json`;if(w.includes(P)&&await ot(e,p,"HEAD",P))h.add(u)}let{changed:C,dependents:f}=Ct({packages:a,filesByFolder:m,devOnly:h,include:t.include,exclude:t.exclude,packagesDir:t.packagesDir});return{baseline:s,changed:C,dependents:f}}async function zn(e,t,n,r){let s=new Map(t.map((f)=>[f.folder,n]));if(!r)return s;let o=await fe(e);if(!o.length||o[0].hash!==n)return s;let a=(await Ve(e)).find((f)=>et(f.subject))?.hash,c=o[o.length-1].hash,m=await x("git",["rev-parse","--verify",`${c}^`],e),d=a??(m.code===0?m.stdout.trim():c);for(let f of t)s.set(f.folder,d);let h=new Map(t.map((f)=>[f.name,f.folder]));await Promise.resolve().then(() => K());for(let f of o){if(!h.size)break;if(!de(f.body).some((w)=>h.has(w.name)))continue;let u=await j(e,f.hash);if(!u)continue;for(let w of u.lines){let p=h.get(w.name);if(!p)continue;let P=u.sourceCommits.get(w.name)??u.hash,b=a&&(await x("git",["merge-base","--is-ancestor",P,a],e)).code===0;s.set(p,b?a:P),h.delete(w.name)}}return s}async function ot(e,t,n,r){let s=await Ot(e,`${t}:${r}`),o=await Ot(e,`${n}:${r}`);if(s===null||o===null)return!1;try{return bt(JSON.parse(s),JSON.parse(o))}catch{return!1}}async function Ot(e,t){let n=await x("git",["show",t],e);return n.code===0?n.stdout:null}function Tn(){throw new l(i("noBaseline"))}var ce=G(()=>{D();N();W();St()});import{CommitParser as On}from"conventional-commits-parser";import{writeChangelogString as Vn}from"conventional-changelog-writer";function Kt(e){return e.find((t)=>Ne(de(t.body)))?.hash}function Yt(e,t,n,r,s,o){let a=`${n}/${t}/package.json`,c=`${n}/${t}/`,m=[];for(let d of e)if(d.files.some((C)=>C!==a&&C.startsWith(c)&&Ze(C,r,s))||d.files.includes(a)&&o.has(d.hash))m.push({hash:d.hash,body:d.body});return m}async function Qt(e){let t=new Date().toISOString().slice(0,10),n=[`## ${e.version} (${t})`];if(e.previousTag){let o=`../../compare/${encodeURIComponent(e.previousTag)}...${encodeURIComponent(e.currentTag)}`;n.push(`[${e.previousTag}...${e.currentTag}](${o})`)}let r=new On({noteKeywords:["BREAKING CHANGE","BREAKING-CHANGE"]}),s=[];for(let o of e.messages){let a;try{a=r.parse(o.body)}catch{continue}s.push({...a,hash:o.hash.slice(0,7),notes:a.notes??[],subject:a.subject})}if(s.length){let a=(await Vn(s,{version:e.version,date:t},{groupBy:"type",mainTemplate:Ln,transform(c){let d=(c.notes??[]).some((C)=>/breaking/i.test(C.title)),h=c.type??"";if(Gn.has(h)&&!d)return null;if(!Jt[h]&&!d)return null;return{type:Jt[h]??null}}})).trim();if(a)n.push("",a);else if(e.dependencies.length)n.push("",_t(e.dependencies))}else if(e.dependencies.length)n.push("",_t(e.dependencies).trimEnd());return`${n.join(`
|
|
31
31
|
`).trim()}
|
|
32
32
|
`}function _t(e){return`### Dependencies
|
|
33
33
|
|
|
@@ -50,23 +50,23 @@ For committed fixes to unpublished packages, append --retry-unpublished to keep
|
|
|
50
50
|
{{/each}}
|
|
51
51
|
|
|
52
52
|
{{/each}}
|
|
53
|
-
`;var Xt=G(()=>{N();Gn=new Set(["docs","style","chore","refactor","test","build","ci"]),Jt={feat:"Features",feature:"Features",fix:"Bug Fixes",perf:"Performance Improvements",revert:"Reverts"}});import{Command as ti}from"commander";import{readFileSync as ni}from"node:fs";I();D();W();ce();import $n from"node:path";async function Vt(e){let t=$n.resolve(e.root),n=he(t,e.versionsFile);if(e.packages)n.packagesDir=e.packages;await V(t);let{baseline:r,changed:s,dependents:o}=await Ge(t,n,e.baseline);if(!s.length&&!o.length){let a=(await y("git",["rev-parse","--short",r],t)).trim();console.log(
|
|
53
|
+
`;var Xt=G(()=>{N();Gn=new Set(["docs","style","chore","refactor","test","build","ci"]),Jt={feat:"Features",feature:"Features",fix:"Bug Fixes",perf:"Performance Improvements",revert:"Reverts"}});import{Command as ti}from"commander";import{readFileSync as ni}from"node:fs";I();D();W();ce();import $n from"node:path";async function Vt(e){let t=$n.resolve(e.root),n=he(t,e.versionsFile);if(e.packages)n.packagesDir=e.packages;await V(t);let{baseline:r,changed:s,dependents:o}=await Ge(t,n,e.baseline);if(!s.length&&!o.length){let a=(await y("git",["rev-parse","--short",r],t)).trim();console.log(v(i("noPackagesSince",{rev:a})));return}console.log(S(i("changedHeader")));for(let a of s){let c=A(t,n.packagesDir,a);console.log(` ${Q(c.name)}${c.private?` ${v(i("privateMark"))}`:""}`)}if(o.length){console.log(S(i("dependentsHeader")));for(let a of o){let c=A(t,n.packagesDir,a);console.log(` ${oe(c.name)}${c.private?` ${v(i("privateMark"))}`:""}`)}}}I();D();N();_();import U from"node:fs";import le from"node:path";function Dn(e){let t=new Set,n=[];for(let r of[...An(e),...Bn(e)]){if(t.has(r))continue;t.add(r),n.push(r)}return n}function Fn(e,t=Ke()){let n=(o,a="")=>i(o,void 0,t).split(`
|
|
54
54
|
`).map((c)=>`${a}# ${c}`).join(`
|
|
55
55
|
`),r=(o,a,c,m)=>[n(m," "),a?` ${o}: ${Ce(a)}`:` # ${o}: ${c}`].join(`
|
|
56
56
|
`),s=[n("initNotePackagesDir"),`packagesDir: ${Ce(e.packagesDir)}`,"",n("initNoteCommitMessage"),'commitMessage: "bump: %s"',"",n("initNoteBranch"),e.branch?`branch: ${Ce(e.branch)}`:"# branch: main","","hooks:",r("beforeCommit",e.beforeCommit,"bun install","initNoteBeforeCommit"),r("beforePublish",e.beforePublish,"bun run build","initNoteBeforePublish"),r("afterPublish",void 0,"echo published","initNoteAfterPublish"),"",n("initNoteInclude"),"include:",...e.include.map((o)=>` - ${Ce(o)}`),` # - ${e.packagesDir}/*/bin`,"",n("initNoteExclude")];if(e.exclude.length)s.push("exclude:",...e.exclude.map((o)=>` - ${Ce(o)}`));else s.push("# exclude:",`# - ${e.packagesDir}/*/src/**/__tests__/**`);return`${s.join(`
|
|
57
57
|
`)}
|
|
58
|
-
`}async function Le(e){let t=le.resolve(e.root),n=le.resolve(t,e.versionsFile);if(U.existsSync(n))throw new l(i("configExists",{file:e.versionsFile}));let r=Dn(t),s=r[0]??"packages",o=e.yes?Nn(s):await En(e.versionsFile,r,s);if(!o.include.length)throw new l(i("includeRequired"));let a=Fn(o);Fe(a),U.mkdirSync(le.dirname(n),{recursive:!0}),U.writeFileSync(n,a),console.log(oe(i("initWrote",{file:e.versionsFile})))}function Nn(e){return{packagesDir:e,include:[`${e}/*/src`],exclude:[`${e}/*/src/**/__tests__/**`]}}async function En(e,t,n){if(!T())throw new l(i("yesRequired"));if(console.log(S(i("initIntro",{file:e}))),t.length)console.log(
|
|
58
|
+
`}async function Le(e){let t=le.resolve(e.root),n=le.resolve(t,e.versionsFile);if(U.existsSync(n))throw new l(i("configExists",{file:e.versionsFile}));let r=Dn(t),s=r[0]??"packages",o=e.yes?Nn(s):await En(e.versionsFile,r,s);if(!o.include.length)throw new l(i("includeRequired"));let a=Fn(o);Fe(a),U.mkdirSync(le.dirname(n),{recursive:!0}),U.writeFileSync(n,a),console.log(oe(i("initWrote",{file:e.versionsFile})))}function Nn(e){return{packagesDir:e,include:[`${e}/*/src`],exclude:[`${e}/*/src/**/__tests__/**`]}}async function En(e,t,n){if(!T())throw new l(i("yesRequired"));if(console.log(S(i("initIntro",{file:e}))),t.length)console.log(v(i("initFoundDirs",{dirs:t.join(", ")})));let r=await L(i("initPackagesDir"),n),s=Gt(await L(i("initInclude"),`${r}/*/src`)),o=Gt(await L(i("initExclude"),`${r}/*/src/**/__tests__/**`)),a=await L(i("initBranch")),c=await L(i("initBeforeCommit")),m=await L(i("initBeforePublish"));return{packagesDir:r,branch:a||void 0,beforeCommit:c||void 0,beforePublish:m||void 0,include:s,exclude:o}}function Gt(e){return e.split(",").map((t)=>t.trim()).filter(Boolean)}function Ce(e){return/^[A-Za-z0-9_./@*+-]+$/.test(e)?e:JSON.stringify(e)}function An(e){return jn(e).flatMap((t)=>{let n=t.replace(/\/\*\*?$/,"");if(!n||n===t||n.includes("*"))return[];return U.existsSync(le.join(e,n))?[n]:[]})}function Bn(e){if(!U.existsSync(e))return[];let t=[];for(let n of U.readdirSync(e)){if(n.startsWith(".")||n==="node_modules")continue;let r=le.join(e,n);if(!U.statSync(r).isDirectory())continue;if(In(r))t.push(n)}return t}function In(e){return U.readdirSync(e).some((t)=>U.existsSync(le.join(e,t,"package.json")))}function jn(e){let t=le.join(e,"package.json");if(!U.existsSync(t))return[];try{let n=JSON.parse(U.readFileSync(t,"utf8")),r=Array.isArray(n.workspaces)?n.workspaces:n.workspaces?.packages;return Array.isArray(r)?r.filter((s)=>typeof s==="string"):[]}catch{return[]}}K();ke();K();import Xn from"node:path";import tn from"semver";ke();import ge from"node:fs";import qe from"node:path";W();N();I();D();import me from"node:fs";import ne from"node:path";import{spawnSync as Mn}from"node:child_process";function st(e){try{let t=me.lstatSync(e);if(!t.isFile())throw new l(i("unsafeCommitFile",{file:e}));return{bytes:me.readFileSync(e),mode:t.mode&511}}catch(t){if(t.code==="ENOENT")return;throw t}}function Hn(e,t){return e===t||Boolean(e&&t&&e.mode===t.mode&&e.bytes.equals(t.bytes))}async function Lt(e,t,n){let r=(await y("git",["rev-parse","HEAD"],e)).trim();if(n&&r!==n)throw new l(i("versionHeadChanged"));let s=new Map;for(let f of new Set(t)){let u=ne.resolve(e,f),w=ne.relative(e,u);if(!w||w.startsWith("..")||ne.isAbsolute(w)||/[*?\[\]\\]/.test(f)||w.split(ne.sep).includes(".git"))throw new l(i("unsafeCommitFile",{file:f}));for(let p=ne.dirname(u);p!==e;p=ne.dirname(p))if(me.existsSync(p)&&me.lstatSync(p).isSymbolicLink())throw new l(i("unsafeCommitFile",{file:f}));s.set(w,st(u))}let o=new Map(s),a,c=!0,m=()=>{o=new Map([...s.keys()].map((f)=>[f,st(ne.join(e,f))]))},d=(...f)=>Mn("git",f,{cwd:e,encoding:"utf8"}),h=()=>{if(!c)return;c=!1,process.off("SIGINT",C),process.off("SIGTERM",C);let f=d("rev-parse","HEAD");if(f.status!==0||f.stdout.trim()!==r){console.error(H(i("versionHeadChanged")));return}if(a!==void 0&&d("write-tree").stdout.trim()===a)d("restore","--staged","--",...s.keys());for(let[u,w]of s){let p=ne.join(e,u);try{if(!Hn(st(p),o.get(u)))continue;if(w)me.writeFileSync(p,w.bytes),me.chmodSync(p,w.mode);else me.rmSync(p,{force:!0})}catch{}}},C=()=>{h(),console.error(H(i("versionRecovery"))),process.exit(1)};return process.on("SIGINT",C),process.on("SIGTERM",C),{checkpoint:m,async stage(){if((await y("git",["rev-parse","HEAD"],e)).trim()!==r)throw new l(i("versionHeadChanged"));if(await y("git",["diff","--cached","--name-only","-z"],e))throw new l(i("versionUnexpectedIndex"));let u=(await y("git",["diff","--name-only","-z"],e)).split("\x00").filter(Boolean),w=(await y("git",["ls-files","--others","--exclude-standard","-z"],e)).split("\x00").filter(Boolean),p=[...u,...w].filter((R)=>!s.has(R));if(p.length)throw new l(i("versionUnexpectedFiles",{files:p.join(", ")}));m();let P=[...new Set([...u,...w])];if(!P.length)throw new l(i("versionUnexpectedIndex"));if(await y("git",["add","--",...P],e),a=(await y("git",["write-tree"],e)).trim(),(await y("git",["diff","--cached","--name-only","-z"],e)).split("\x00").filter(Boolean).some((R)=>!s.has(R)))throw new l(i("versionUnexpectedIndex"))},async verifyCommit(){let f=(await y("git",["rev-parse","HEAD^"],e)).trim(),u=(await y("git",["rev-parse","HEAD^{tree}"],e)).trim();if(f!==r||u!==a)throw new l(i("versionHeadChanged"))},disarm(){c=!1,process.off("SIGINT",C),process.off("SIGTERM",C)},fail(f){throw h(),f}}}I();D();K();N();W();_();I();D();N();_();ce();import Ut from"semver";async function qt(e){let{bump:t,preid:n}=e;if(!t){if(e.yes||!T())throw new l(i("bumpRequired"));let r=n?"pre":await Z(i("chooseReleaseKind"),[{value:"formal",label:i("releaseKindFormal")},{value:"pre",label:i("releaseKindPre")}]);t=await $t(i("chooseBump"),r==="pre"?["prerelease","prepatch","preminor","premajor"]:["patch","minor","major"])}if(!t.startsWith("pre")||n||!["prerelease","prepatch","preminor","premajor"].includes(t))return{bump:De(t,n),preid:n};if(e.yes||!T())return{bump:De(t,n),preid:n};while(!n){let r=await L(i("choosePreid"),"alpha");if(Ut.valid(`0.0.0-${r}.0`))n=r;else console.log(k(i("invalidPreid")))}return{bump:De(t,n),preid:n}}function Ue(e){return Boolean(e)&&encodeURIComponent(e)===e&&!Ut.validRange(e)}async function Se(e,t,n){if(e!==void 0||n||!T()){let r=e??t;if(!Ue(r))throw new l(i("badDistTag"));return r}while(!0){let r=await L(i("chooseDistTag"),t);if(Ue(r))return r;console.log(k(i("badDistTag")))}}async function Wt(e,t,n){try{return await te(e,t)}catch(r){if(t||n||!T()||!(r instanceof l)||r.message!==i("noBaseline"))throw r}console.log(k(i("firstBaseline")));while(!0){let r=await L(i("chooseBaseline"));if(!r)continue;try{return await te(e,r)}catch(s){if(!(s instanceof l))throw s;console.log(k(s.message))}}}ce();async function We(e){return X(e.root,Boolean(e.dryRun),()=>Un(e))}async function Un(e){let t=qe.resolve(e.root),n=he(t,e.versionsFile);if(e.packages)n.packagesDir=e.packages;if(e.messageFromCli&&e.commitMessage)n.commitMessage=e.commitMessage;if(e.branchFromCli)n.branch=e.branch||void 0;if(await V(t),n.branch){let u=await x("git",["symbolic-ref","--quiet","--short","HEAD"],t);if(u.code!==0||u.stdout.trim()!==n.branch)throw new l(i("wrongBranch",{branch:n.branch}))}let r=await Wt(t,e.baseline,e.yes),s=(await y("git",["rev-parse","HEAD"],t)).trim(),o=e.force?{baseline:r,changed:await Zt(t,n),dependents:[]}:await Ge(t,n,r,!e.baseline);if(!o.changed.length&&!o.dependents.length){let u=(await y("git",["rev-parse","--short",o.baseline],t)).trim();if(console.log(v(i("noPackagesSince",{rev:u}))),console.log(v(i("noVersionChangesNext"))),e.yes||!T()||!await j(t)||!await se(i("confirmForceVersion")))return;o.changed=await Zt(t,n)}if(T()&&!e.yes){console.log(S(i("wizardCandidates")));for(let u of[...o.changed,...o.dependents]){let w=A(t,n.packagesDir,u);console.log(` ${w.name}${w.private?` ${v(i("privateMark"))}`:""}`)}}let{bump:a,preid:c}=await qt(e),m=[...o.changed,...o.dependents].map((u)=>{let w=A(t,n.packagesDir,u);return{folder:u,name:w.name,private:w.private,from:w.version,to:wt(w.version,a,c)}});if(e.dryRun)console.log(k(i("versionPreview")));for(let u of m)console.log(`${ct(u.name,u.from,u.to)}${u.private?` ${v(i("privateMark"))}`:""}`);if(m.some((u)=>u.private))console.log(v(i("privateVersionHint")));let d=e.preparePublish?await e.preparePublish({preid:c,config:n}):e.publishTag;if(e.dryRun){console.log(S(i("versionPreviewComplete")));return}if(!e.yes&&!await se(i("confirmVersions")))throw new l(i("cancelledVersion"));if(await V(t),(await y("git",["rev-parse","HEAD"],t)).trim()!==s)throw new l(i("versionHeadChanged"));let h=ee(t,n.packagesDir).map((u)=>`${n.packagesDir}/${u}/package.json`);if(Xe(a))h.push(...m.map((u)=>`${n.packagesDir}/${u.folder}/CHANGELOG.md`));h.push("bun.lock","bun.lockb","package-lock.json","npm-shrinkwrap.json","yarn.lock","pnpm-lock.yaml",...n.commitFiles??[]);let C=await Lt(t,h,s);try{try{for(let p of m)_n(t,n.packagesDir,p.folder,p.to);if(Kn(t,n.packagesDir),Xe(a))await qn(t,n,m,r)}finally{C.checkpoint()}if(n.hooks.beforeCommit)await Ee("sh",["-c",n.hooks.beforeCommit],t);let u=vt(n.commitMessage,a,c),w=m.map((p)=>`${p.name} ${p.from} => ${p.to}`).join(`
|
|
59
59
|
`)+(d?`
|
|
60
60
|
|
|
61
|
-
Change-Versions-Dist-Tag: ${d}`:"");await
|
|
61
|
+
Change-Versions-Dist-Tag: ${d}`:"");await C.stage(),await y("git",["commit","-m",u,"-m",w,"-m",ue],t),await C.verifyCommit(),C.disarm()}catch(u){await C.fail(u)}let f=(await y("git",["rev-parse","HEAD"],t)).trim();if(console.log(M(i("versionCommitted",{commit:f}))),console.log(k(i("versionTrailerHint"))),n.branch){let u=await x("git",["push","origin",n.branch],t);if(u.code!==0)throw new l(i("branchPushFailed",{branch:n.branch,detail:u.stderr.trim()}))}return console.log(S(i("versionPublishNext"))),console.log(F(O({...e,root:t,commit:f,distTag:d??c??"latest"}))),f}async function Zt(e,t){let n=await j(e);if(!n)throw new l(i("noVersionCommit"));let r=ee(e,t.packagesDir).map((o)=>({folder:o,...A(e,t.packagesDir,o)})),s=new Map(r.map((o)=>[o.name,o]));return console.log(k(i("forcePreviousBatch",{commit:n.hash}))),n.lines.map((o)=>{let a=s.get(o.name);if(!a)throw new l(i("packageNotInDir",{dir:t.packagesDir,name:o.name}));if(a.version!==o.to)throw new l(i("releaseVersionMismatch",{name:o.name,expected:o.to,actual:a.version,commit:n.hash}));if(!a.private){for(let c of Object.keys(a.dependencies??{}))if(s.get(c)?.private)throw new l(i("publicDependsOnPrivate",{name:a.name,dep:c}))}return a.folder})}async function qn(e,t,n,r){await Promise.resolve().then(() => Xt());let c=await fe(e),m=(await Ve(e)).find((u)=>kt(u.subject))?.hash,d=Kt(c)??m??(r?await te(e,r):void 0),h=await Wn(e,d),C=new Set(n.map((u)=>u.folder)),f=new Map(ee(e,t.packagesDir).map((u)=>[A(e,t.packagesDir,u).name,u]));for(let u of n){let w=`${t.packagesDir}/${u.folder}/package.json`,p=new Set;for(let z of h)if(z.files.includes(w)&&await Jn(e,z.hash,w))p.add(z.hash);let P=Yt(h,u.folder,t.packagesDir,t.include,t.exclude,p),b=A(e,t.packagesDir,u.folder),R=P.length?[]:He(b,f).filter((z)=>C.has(z)).map((z)=>A(e,t.packagesDir,z)).map((z)=>({name:z.name,version:z.version})),B=await Qt({messages:P,version:u.to,previousTag:`${u.name}@${u.from}`,currentTag:`${u.name}@${u.to}`,dependencies:R}),g=qe.join(e,t.packagesDir,u.folder,"CHANGELOG.md"),E=ge.existsSync(g)?ge.readFileSync(g,"utf8"):"";ge.writeFileSync(g,E?`${B}
|
|
62
62
|
${E}`:B)}}async function Wn(e,t){let n=t?["rev-list","--reverse",`${t}..HEAD`]:["rev-list","--reverse","HEAD"],r=(await y("git",n,e)).split(`
|
|
63
|
-
`).filter(Boolean),s=[];for(let o of r){let a=await y("git",["log","-1","--format=%B",o],e),c=await
|
|
63
|
+
`).filter(Boolean),s=[];for(let o of r){let a=await y("git",["log","-1","--format=%B",o],e),c=await x("git",["diff-tree","--no-commit-id","--name-only","-r","--root",o],e);s.push({hash:o,body:a,files:c.code===0?c.stdout.split(`
|
|
64
64
|
`).filter(Boolean):[]})}return s}async function Jn(e,t,n){return!await ot(e,`${t}^`,t,n)}function _n(e,t,n,r){let s=qe.join(e,t,n,"package.json"),o=ge.readFileSync(s,"utf8"),a=JSON.parse(o);if(typeof a.version!=="string")throw new l(i("missingVersionField",{folder:n}));a.version=r;let c=/\n([\t ]+)"/.exec(o)?.[1]??" ";ge.writeFileSync(s,JSON.stringify(a,null,c)+`
|
|
65
|
-
`)}function Kn(e,t){let n=ee(e,t),r=new Map(n.map((s)=>[A(e,t,s).name,A(e,t,s)]));for(let s of n){let o=qe.join(e,t,s,"package.json"),a=ge.readFileSync(o,"utf8"),c=JSON.parse(a),m=!1;for(let d of["dependencies","devDependencies"])for(let h of Object.keys(c[d]??{})){let
|
|
66
|
-
`)}}}ce();W();async function Je(e){let t=[],n=new Map,r;if(!e.formal||e.entries.every((s)=>s.pkg.private))return{entries:t,remoteError:r};if(e.config.branch){let s=e.entries.filter((a)=>!a.pkg.private).flatMap((a)=>[`refs/tags/${a.name}@${a.to}`,`refs/tags/${a.name}@${a.to}^{}`]),o=await
|
|
67
|
-
`).filter(Boolean)){let[c,m]=a.split(/\s+/);n.set(m,c)}}for(let s of e.entries){if(s.pkg.private)continue;let o=`${s.name}@${s.to}`,a=await
|
|
65
|
+
`)}function Kn(e,t){let n=ee(e,t),r=new Map(n.map((s)=>[A(e,t,s).name,A(e,t,s)]));for(let s of n){let o=qe.join(e,t,s,"package.json"),a=ge.readFileSync(o,"utf8"),c=JSON.parse(a),m=!1;for(let d of["dependencies","devDependencies"])for(let h of Object.keys(c[d]??{})){let C=r.get(h);if(!C)continue;let f=`^${C.version}`;if(c[d][h]!==f)c[d][h]=f,m=!0}if(m){let d=/\n([\t ]+)"/.exec(a)?.[1]??" ";ge.writeFileSync(o,JSON.stringify(c,null,d)+`
|
|
66
|
+
`)}}}ce();W();async function Je(e){let t=[],n=new Map,r;if(!e.formal||e.entries.every((s)=>s.pkg.private))return{entries:t,remoteError:r};if(e.config.branch){let s=e.entries.filter((a)=>!a.pkg.private).flatMap((a)=>[`refs/tags/${a.name}@${a.to}`,`refs/tags/${a.name}@${a.to}^{}`]),o=await x("git",["ls-remote","--tags","origin",...s],e.root);if(o.code!==0)r=o.stderr.trim()||o.stdout.trim()||`git ls-remote: exit ${o.code}`;else for(let a of o.stdout.trim().split(`
|
|
67
|
+
`).filter(Boolean)){let[c,m]=a.split(/\s+/);n.set(m,c)}}for(let s of e.entries){if(s.pkg.private)continue;let o=`${s.name}@${s.to}`,a=await x("git",["rev-parse","--verify",`refs/tags/${o}^{commit}`],e.root),c=n.get(`refs/tags/${o}^{}`)??n.get(`refs/tags/${o}`);t.push({tag:o,localReady:a.code===0&&a.stdout.trim()===s.commit,remoteReady:!e.config.branch||!r&&c===s.commit})}return{entries:t,remoteError:r}}N();D();I();I();N();D();K();_();I();D();K();import Yn from"node:path";W();async function ie(e){let t=Yn.resolve(e.root);if(await y("git",["rev-parse","--show-toplevel"],t),!await j(t,e.commit)){console.log(v(i("statusNoBatch")));return}console.log(S(i("statusHeading")));let n=await ae(e,!0);console.log(i("publishSummaryContext",{commit:n.release.hash,tag:e.distTag}));let r=!0;for(let a of n.entries){let c=a.pkg.private?"summaryPrivate":!n.published.has(a.folder)?"statusUpload":n.distTagVersions.get(a.folder)!==a.to?"statusRetag":"summarySkipped";if(c==="statusUpload"||c==="statusRetag")r=!1;console.log(` ${(c==="statusUpload"||c==="statusRetag"?k:v)(i(c))}: ${a.name}@${a.to}`)}let s=await Je(n);if(s.remoteError)r=!1,console.log(k(i("statusRemoteUnknown",{detail:s.remoteError})));for(let{tag:a,localReady:c,remoteReady:m}of s.entries){if(!c||!m)r=!1;console.log((c&&m?v:k)(i("statusGitTag",{tag:a,local:c?i("statusReady"):i("statusMissing"),remote:n.config.branch?m?i("statusReady"):i("statusMissing"):i("statusNotConfigured")})))}let o=await x("git",["status","--porcelain"],t);if(o.code!==0||o.stdout.trim())r=!1,console.log(k(i("dirtyTree")));console.log((r?M:k)(i(r?"statusExternalReady":"statusPending"))),console.log(v(i("statusHooksUnknown"))),console.log(F(O({...e,root:t,commit:n.release.hash})))}ke();I();D();N();W();_();K();ce();async function en(e,t){console.log(S(i("repairPublication")));let n=await ae(e,!1,!0),{root:r,startHead:s,config:o,release:a,entries:c,changed:m,published:d}=n;for(let p of c){if(!m.has(p.folder))continue;if(d.has(p.folder)||p.pkg.private)throw new l(i("repairPublishedChanged",{name:p.name,version:p.to}))}if(!m.size)return a.hash;if(o.branch){let p=await x("git",["symbolic-ref","--quiet","--short","HEAD"],r);if(p.code!==0||p.stdout.trim()!==o.branch)throw new l(i("wrongBranch",{branch:o.branch}))}let h=c.map((p)=>({...p,commit:m.has(p.folder)?s:p.commit}));if(n.formal)await Me(r,h.filter((p)=>!p.pkg.private));console.log(k(i("repairPlan")));for(let p of h)console.log(` ${p.name}@${p.to}: ${p.commit}${m.has(p.folder)?` ${i("repairCurrentCode")}`:""}`);if(e.dryRun){console.log(k(i("publishPreview"))),console.log(k(i("plannedStep",{step:i("confirmRepairPublication")}))),console.log(i("publishPlanSummary",{uploads:n.steps.filter((P)=>P.kind==="publish").length,retags:n.steps.filter((P)=>P.kind==="dist-tag").length,tags:n.steps.filter((P)=>P.kind==="tag").length}));let p=new Map(h.map((P)=>[P.name,P.commit]));rt({...n,entries:h,steps:n.steps.map((P)=>P.kind==="tag"?{...P,commit:p.get(P.name)}:P)},O({...e,root:r,commit:a.hash}));return}if(!e.yes&&!await se(i("confirmRepairPublication")))throw new l(i("cancelledPublish"));if(await V(r),(await y("git",["rev-parse","HEAD"],r)).trim()!==s)throw new l(i("versionHeadChanged"));let C=a.lines.map((p)=>`${p.name} ${p.from} => ${p.to}`).join(`
|
|
68
68
|
`)+`
|
|
69
69
|
|
|
70
70
|
Change-Versions-Dist-Tag: ${e.distTag}
|
|
71
71
|
`+h.map((p)=>`Change-Versions-Source: ${p.name} ${p.commit}`).join(`
|
|
72
|
-
`);await y("git",["commit","--allow-empty","-m","chore: record repaired publication","-m",
|
|
72
|
+
`);await y("git",["commit","--allow-empty","-m","chore: record repaired publication","-m",C,"-m",ue],r);let f=(await y("git",["rev-parse","HEAD"],r)).trim(),u=(await y("git",["rev-parse","HEAD^"],r)).trim(),w=(await y("git",["rev-parse","HEAD^{tree}"],r)).trim();if(u!==s||w!==(await y("git",["rev-parse",`${s}^{tree}`],r)).trim())throw new l(i("versionHeadChanged"));if(await V(r),t?.(f),console.log(M(i("repairRecorded",{commit:f}))),console.log(F(O({...e,root:r,commit:f,retryUnpublished:!1}))),o.branch){let p=await x("git",["push","origin",o.branch],r);if(p.code!==0)throw new l(i("branchPushFailed",{branch:o.branch,detail:p.stderr.trim()}))}return console.log(v(i("publishResumeInfo"))),f}async function we(e){return X(e.root,Boolean(e.dryRun),()=>Qn(e))}async function Qn(e){let t=await j(e.root,e.commit),n={...e,commit:t?.hash??e.commit};while(!0)try{if(n.retryUnpublished){let r=await en(n,(s)=>{n.commit=s,n.retryUnpublished=!1});if(!r)return;n.commit=r,n.retryUnpublished=!1}await Bt(n);return}catch(r){if(r instanceof J||r instanceof l&&r.message===i("cancelledPublish")||e.yes||e.dryRun||!T()||!n.commit)throw r;console.error(H(r instanceof Error?r.message:String(r)));while(!0){let s;try{s=await Z(i("recoveryAction"),[{value:"retry",label:i("actionRetry"),tone:"positive"},{value:"status",label:i("actionStatus")},{value:"exit",label:i("actionExitFailed"),tone:"muted"},{value:"repair",label:i("actionRetryUnpublished"),tone:"caution"}])}catch(o){if(o instanceof J)throw r;throw o}if(s==="exit")throw r;if(s==="retry")break;if(s==="repair"){n.retryUnpublished=!0;break}try{await ie(n)}catch(o){console.error(H(o instanceof Error?o.message:String(o)))}}}}_();async function _e(e){let t=Xn.resolve(e.root);if(e.distTag!==void 0&&!Ue(e.distTag))throw new l(i("badDistTag"));await X(t,Boolean(e.dryRun),async()=>{if(e.resume||e.commit||e.retryUnpublished){if(e.force||e.bump||e.baseline||e.branchFromCli||e.messageFromCli)throw new l(i("releaseResumeOptions"));let o=await j(t,e.commit);if(!o)throw new l(i("noVersionCommit"));let a=o?tn.prerelease(o.lines[0].to)?.[0]:void 0,c=e.distTag??e.preid??o?.distTag??String(a??"latest");await we({...e,root:t,commit:o?.hash??e.commit,distTag:await Se(e.distTag,c,e.yes)});return}await V(t);let n=await j(t);if(!e.force&&n&&await te(t,e.baseline)===n.hash){let o=n.distTag??String(tn.prerelease(n.lines[0].to)?.[0]??"latest"),a=await ae({...e,root:t,distTag:o},!0,!0),c=await Je(a);if(c.remoteError)throw new l(i("statusRemoteUnknown",{detail:c.remoteError}));if(a.steps.some((m)=>m.kind==="publish"||m.kind==="dist-tag")||c.entries.some((m)=>!m.localReady||!m.remoteReady)){let m=i("releasePending",{command:O({...e,root:t,distTag:o,commit:n.hash})});if(e.yes||!T())throw new l(m);console.log(k(m));while(!0){let d=await Z(i("pendingAction"),[{value:"resume",label:i("actionResume"),tone:"positive"},{value:"status",label:i("actionStatus")},{value:"exit",label:i("actionExit"),tone:"muted"},{value:"force",label:i("actionForceVersion"),tone:"caution"},{value:"repair",label:i("actionRetryUnpublished"),tone:"caution"}]);if(d==="exit")return;if(d==="force"){e={...e,force:!0};break}if(d==="status"){try{await ie({...e,root:t,commit:n.hash,distTag:o})}catch(h){console.error(H(h instanceof Error?h.message:String(h)))}continue}await we({...e,root:t,commit:n.hash,distTag:o,retryUnpublished:d==="repair"});return}}}console.log(S(i("releaseVersionStage")));let r=e.distTag??e.preid??"latest",s=await We({...e,root:t,preparePublish:async({preid:o,config:a})=>{if(r=await Se(e.distTag,o??"latest",e.yes),T()&&!e.yes){console.log(S(i("wizardExecutionPlan"))),console.log(i("wizardPlanContext",{tag:r,branch:a.branch??i("statusNotConfigured")}));for(let[c,m]of Object.entries(a.hooks))if(m)console.log(` ${c}: ${m}`)}return r}});if(e.dryRun){console.log(k(i("releasePreviewComplete")));return}if(!s)return;console.log(S(i("releasePublishStage"))),console.log(F(O({...e,root:t,distTag:r,commit:s}))),await we({...e,root:t,distTag:r,commit:s})})}I();D();I();D();import Zn from"node:fs";import ei from"node:path";K();_();async function nn(e=process.cwd()){let t={root:e,versionsFile:"change-versions.yml",branchFromCli:!1,messageFromCli:!1};while(!0){let n=Zn.existsSync(ei.resolve(e,t.versionsFile));if(!n)console.log(k(i("wizardNeedsConfig")));let r=n?[{value:"release",label:i("actionNewRelease")},{value:"resume",label:i("actionResume"),tone:"positive"},{value:"status",label:i("actionStatus")},{value:"exit",label:i("actionExit"),tone:"muted"}]:[{value:"init",label:i("actionInit")},{value:"exit",label:i("actionExit"),tone:"muted"}],s=await Z(i("wizardAction"),r);if(s==="exit")return;if(s==="init"){await Le(t);continue}if(s==="status"){await ie({...t,distTag:await xe(e)});continue}await _e({...t,resume:s==="resume"});return}}_();N();var Y=new ti;Y.name("change-versions").version(JSON.parse(ni(new URL("../package.json",import.meta.url),"utf8")).version).description(i("cliDescription"));function Re(e){return e.option("--root <dir>",i("optRoot"),process.cwd()).option("--versions-file <file>",i("optVersionsFile"),"change-versions.yml").option("--packages <dir>",i("optPackages"))}Y.command("init").description(i("cmdInit")).option("--root <dir>",i("optRoot"),process.cwd()).option("--versions-file <file>",i("optVersionsFile"),"change-versions.yml").option("--yes",i("optYesInit")).action(async function(){let e=this.opts();await Le(e)});Re(Y.command("changed").description(i("cmdChanged"))).option("--baseline <rev>",i("optBaseline")).action(async function(){let e=this.opts();await Vt(e)});Re(Y.command("version").description(i("cmdVersion")).argument("[bump]",i("argBump"))).option("--force",i("optForceVersion")).option("--preid <id>",i("optPreid")).option("--yes",i("optYes")).option("--dry-run",i("optDryRunVersion")).option("--baseline <rev>",i("optBaseline")).option("--branch <name>",i("optBranch")).option("--commit-message <template>",i("optCommitMessage")).action(async function(e){let t=this.opts();await We({...t,bump:e,branchFromCli:this.getOptionValueSource("branch")==="cli",messageFromCli:this.getOptionValueSource("commitMessage")==="cli"})});Re(Y.command("publish").description(i("cmdPublish"))).option("--retry-unpublished",i("optRetryUnpublished")).option("--commit <rev>",i("optReleaseCommit")).option("--dist-tag <tag>",i("optDistTag")).option("--yes",i("optYes")).option("--dry-run",i("optDryRunPublish")).action(async function(){let e=this.opts();await we({...e,distTag:await Se(e.distTag,await xe(e.root,e.distTag,e.commit),e.yes)})});Re(Y.command("status").description(i("cmdStatus"))).option("--commit <rev>",i("optReleaseCommit")).option("--dist-tag <tag>",i("optDistTag")).action(async function(){let e=this.opts();await ie({...e,distTag:await xe(e.root,e.distTag,e.commit)})});Re(Y.command("release").description(i("cmdRelease")).argument("[bump]",i("argBump"))).option("--retry-unpublished",i("optRetryUnpublished")).option("--force",i("optForceVersion")).option("--preid <id>",i("optPreid")).option("--dist-tag <tag>",i("optDistTag")).option("--yes",i("optYes")).option("--dry-run",i("optDryRunRelease")).option("--baseline <rev>",i("optBaseline")).option("--branch <name>",i("optBranch")).option("--commit-message <template>",i("optCommitMessage")).option("--resume",i("optResume")).option("--commit <rev>",i("optReleaseCommit")).action(async function(e){await _e({...this.opts(),bump:e,branchFromCli:this.getOptionValueSource("branch")==="cli",messageFromCli:this.getOptionValueSource("commitMessage")==="cli"})});async function ii(){if(process.argv.length<=2){if(T())await nn();else Y.outputHelp();return}await Y.parseAsync(process.argv)}ii().catch((e)=>{if(e instanceof J){console.log(v(e.message));return}if(e instanceof l)console.error(H(e.message));else console.error(e);process.exit(1)});
|
package/docs/commands.md
CHANGED
|
@@ -110,7 +110,7 @@ registry 也不进配置。每个包按这个顺序解析,查询、上传、di
|
|
|
110
110
|
2. 否则,`@scope/name` 用 `.npmrc` 里的 `@scope:registry`
|
|
111
111
|
3. 否则用 `npm config get registry`
|
|
112
112
|
|
|
113
|
-
`"private": true`
|
|
113
|
+
`"private": true` 的包仍参与变更检测、依赖方传播和入选升版,用版本批次记录其源码变化;不上传,也不创建 Git tag。`changed`、交互入选列表和版本预览会显示私有标记;升版预览还会说明“私有包仅升版,不上传,也不创建 Git tag”。
|
|
114
114
|
|
|
115
115
|
## 退出后下一步
|
|
116
116
|
|