@anolilab/multi-semantic-release 4.4.9 → 4.4.11

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/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ ## @anolilab/multi-semantic-release [4.4.11](https://github.com/anolilab/semantic-release/compare/@anolilab/multi-semantic-release@4.4.10...@anolilab/multi-semantic-release@4.4.11) (2026-09-08)
2
+
3
+ ## @anolilab/multi-semantic-release [4.4.10](https://github.com/anolilab/semantic-release/compare/@anolilab/multi-semantic-release@4.4.9...@anolilab/multi-semantic-release@4.4.10) (2026-09-08)
4
+
5
+ ### Bug Fixes
6
+
7
+ * **lint:** revert eslint-config to v28 and relax unsafe-type rules ([#435](https://github.com/anolilab/semantic-release/issues/435)) ([33999ea](https://github.com/anolilab/semantic-release/commit/33999ea2786e544f0eca6fd751db12473719576f))
8
+
9
+ ### Miscellaneous Chores
10
+
11
+ * point every Discord link at the anolilab server ([8cee2ca](https://github.com/anolilab/semantic-release/commit/8cee2ca80ba2b7bac1af7a1ead62441492afa001))
12
+
13
+ ### Code Refactoring
14
+
15
+ * serialize manifests through one shared helper ([18c6e0a](https://github.com/anolilab/semantic-release/commit/18c6e0a8e5658c34d12d444c9b1ed4563cb5b393))
16
+
17
+
18
+ ### Dependencies
19
+
20
+ * **@anolilab/semantic-release-pnpm:** upgraded to 8.1.23
21
+
1
22
  ## @anolilab/multi-semantic-release [4.4.9](https://github.com/anolilab/semantic-release/compare/@anolilab/multi-semantic-release@4.4.8...@anolilab/multi-semantic-release@4.4.9) (2026-08-20)
2
23
 
3
24
  ### Bug Fixes
package/README.md CHANGED
@@ -556,7 +556,7 @@ This is an open source project and will always remain free to use. If you think
556
556
  [prs-welcome-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=for-the-badge
557
557
  [prs-welcome]: https://github.com/anolilab/multi-semantic-release/blob/main/.github/CONTRIBUTING.md
558
558
  [chat-badge]: https://img.shields.io/discord/902465130518949899.svg?style=for-the-badge
559
- [chat]: https://discord.gg/TtFJY8xkFK
559
+ [chat]: https://discord.gg/eajEZvk2PG
560
560
  [typescript-badge]: https://img.shields.io/badge/Typescript-294E80.svg?style=for-the-badge&logo=typescript
561
561
  [typescript-url]: https://www.typescriptlang.org/
562
562
  [license-url]: LICENSE.md
package/dist/bin/cli.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{createRequire as b}from"node:module";import c from"yargs";import{hideBin as l}from"yargs/helpers";import{q as d,d as s}from"../packem_shared/multi-semantic-release-9ZDbSO1j.js";const p=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,{exit:t}=p,n={array:!0,coerce:e=>{if(e.length===1&&e[0]?.trim()==="false")return[];const o=[];for(const i of e)o.push(...i.split(",").map(r=>r.trim()));return o},type:"array"},u=c(l(process.argv)).usage("$0 [args]").scriptName("multi-semantic-release").option("d",{alias:"dry-run",default:!1,describe:"Skip publishing",group:"Options",type:"boolean"}).option("h",{alias:"help",group:"Options"}).option("debug",{describe:"Output debugging information.",type:"boolean"}).option("silent",{describe:"Do not print configuration information.",type:"boolean"}).option("sequential-init",{describe:"Avoid hypothetical concurrent initialization collisions.",type:"boolean"}).option("sequential-prepare",{describe:"Avoid hypothetical concurrent preparation collisions. Do not use if your project have cyclic dependencies.",type:"boolean"}).option("first-parent",{describe:"Apply commit filtering to current branch only.",type:"boolean"}).option("deps.bump",{describe:"Define deps version updating rule. Allowed: override, satisfy, inherit.",type:"string"}).option("deps.release",{describe:"Define release type for dependent package if any of its deps changes. Supported values: patch, minor, major, inherit.",type:"string"}).option("deps.prefix",{describe:"Optional prefix to be attached to the next dep version if '--deps.bump' set to 'override'. Supported values: '^' | '~' | '' (empty string as default).",type:"string"}).option("b",{alias:"branches",describe:"Git branches to release from",...n,group:"Options"}).option("ci",{describe:"Toggle CI verifications",group:"Options",type:"boolean"}).option("ignore-packages",{...n,describe:"Packages list to be ignored on bumping process"}).option("ignore-private",{describe:"Exclude private packages. Enabled by default, pass 'no-ignore-private' to disable.",type:"boolean"}).option("tag-format",{describe:'Format to use for creating tag names. Should include "name" and "version" vars. Default: "${name}@${version}" generates "package-name@1.0.0"',type:"string"}).strict(!1).exitProcess(!1);try{const e=u.parse(process.argv.slice(2)),{help:o,version:i,...r}=e;(o||i)&&t(0);try{await d(null,{},{},r),t(0)}catch(a){s.error("[multi-semantic-release]:",a),t(1)}}catch(e){s.error("[multi-semantic-release]:",e),t(1)}
2
+ import{createRequire as b}from"node:module";import c from"yargs";import{hideBin as l}from"yargs/helpers";import{q as d,d as s}from"../packem_shared/multi-semantic-release-Cb0lEvjb.js";const p=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,{exit:t}=p,n={array:!0,coerce:e=>{if(e.length===1&&e[0]?.trim()==="false")return[];const o=[];for(const i of e)o.push(...i.split(",").map(r=>r.trim()));return o},type:"array"},u=c(l(process.argv)).usage("$0 [args]").scriptName("multi-semantic-release").option("d",{alias:"dry-run",default:!1,describe:"Skip publishing",group:"Options",type:"boolean"}).option("h",{alias:"help",group:"Options"}).option("debug",{describe:"Output debugging information.",type:"boolean"}).option("silent",{describe:"Do not print configuration information.",type:"boolean"}).option("sequential-init",{describe:"Avoid hypothetical concurrent initialization collisions.",type:"boolean"}).option("sequential-prepare",{describe:"Avoid hypothetical concurrent preparation collisions. Do not use if your project have cyclic dependencies.",type:"boolean"}).option("first-parent",{describe:"Apply commit filtering to current branch only.",type:"boolean"}).option("deps.bump",{describe:"Define deps version updating rule. Allowed: override, satisfy, inherit.",type:"string"}).option("deps.release",{describe:"Define release type for dependent package if any of its deps changes. Supported values: patch, minor, major, inherit.",type:"string"}).option("deps.prefix",{describe:"Optional prefix to be attached to the next dep version if '--deps.bump' set to 'override'. Supported values: '^' | '~' | '' (empty string as default).",type:"string"}).option("b",{alias:"branches",describe:"Git branches to release from",...n,group:"Options"}).option("ci",{describe:"Toggle CI verifications",group:"Options",type:"boolean"}).option("ignore-packages",{...n,describe:"Packages list to be ignored on bumping process"}).option("ignore-private",{describe:"Exclude private packages. Enabled by default, pass 'no-ignore-private' to disable.",type:"boolean"}).option("tag-format",{describe:'Format to use for creating tag names. Should include "name" and "version" vars. Default: "${name}@${version}" generates "package-name@1.0.0"',type:"string"}).strict(!1).exitProcess(!1);try{const e=u.parse(process.argv.slice(2)),{help:o,version:i,...r}=e;(o||i)&&t(0);try{await d(null,{},{},r),t(0)}catch(a){s.error("[multi-semantic-release]:",a),t(1)}}catch(e){s.error("[multi-semantic-release]:",e),t(1)}
@@ -1 +1 @@
1
- import{createRequire as r}from"node:module";import"@semrel-extra/topo";import"debug";import"lodash-es";import"semantic-release";import"semantic-release/package.json"with{type:"json"};import{q as _}from"./packem_shared/multi-semantic-release-9ZDbSO1j.js";const o=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process;export{_ as default};
1
+ import{createRequire as r}from"node:module";import"@semrel-extra/topo";import"debug";import"lodash-es";import"semantic-release";import"semantic-release/package.json"with{type:"json"};import{q as _}from"./packem_shared/multi-semantic-release-Cb0lEvjb.js";const o=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process;export{_ as default};
@@ -0,0 +1,5 @@
1
+ import{createRequire as _e}from"node:module";import{topo as Ee}from"@semrel-extra/topo";import V from"debug";import{transform as De,isEqual as Pe,isObject as K,castArray as F,pickBy as X,sortBy as Me,template as Ce}from"lodash-es";import Ne from"semantic-release";import qe from"semantic-release/package.json"with{type:"json"};import{execa as ce}from"execa";import{getTagHead as Ae}from"semantic-release/lib/git.js";import Z from"git-log-parser";import le from"signale";import{WritableStreamBuffer as de}from"stream-buffers";import $,{gt as He,rcompare as Le}from"semver";import{LF as ee,detect as ze,format as We}from"@visulima/fs/eol";import Ue from"detect-indent";import{isAccessibleSync as fe,readJson as Ve}from"@visulima/fs";import{readYamlSync as Je}from"@visulima/fs/yaml";import{resolve as ue}from"@visulima/path";import{cosmiconfig as ge}from"cosmiconfig";import Ge from"resolve-from";import Qe from"semantic-release/lib/get-config.js";let je;const ke=e=>(je??=_e(import.meta.url))(e),M=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,L=e=>{if(typeof M<"u"&&M.versions&&M.versions.node){const[t,r]=M.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return M.getBuiltinModule(e)}return ke(e)},{isAbsolute:I,normalize:xe,join:Re,parse:Oe,relative:Te,dirname:Se}=L("node:path"),{existsSync:G,lstatSync:Q,readFileSync:Be,writeFileSync:Fe}=L("node:fs"),{Writable:pe}=L("node:stream"),{createRequire:Ie}=L("node:module"),{Signale:Ye}=le,J=["error","warn","info","debug","trace"],Ke=(e,t)=>{const r=J.indexOf(e),s=J.indexOf(t);return r!==-1&&s!==-1&&r<=s},te={complete:"info",failure:"error",log:"info",success:"info"},v={config:{_level:"info",_signale:{},_stderr:process.stderr,_stdout:process.stdout,set level(e){e&&(this._level=e)},get level(){return this._level},set stdio([e,t]){this._stdout=t,this._stderr=e,this._signale=new Ye({config:{displayLabel:!1,displayTimestamp:!0},stream:t,types:{complete:{badge:"🎉",color:"green",label:"",stream:[t]},error:{badge:"✖",color:"red",label:"",stream:[e]},log:{badge:"•",color:"magenta",label:"",stream:[t]},success:{badge:"✔",color:"green",label:"",stream:[t]}}})},get stdio(){return[this._stderr,this._stdout]}},prefix:"msr:",withScope(e){return{...this,debug:V(e||this.prefix),prefix:e}},...[...J,...Object.keys(te)].reduce((e,t)=>(e[t]=function(...r){Ke(te[t]??t,this.config.level)&&(this.config._signale[t]??console[t]??(()=>{}))(this.prefix,...r)},e),{}),debug:V("msr:")};var Xe="4.4.10";const Ze={version:Xe},et=/^[a-f0-9]{40}$/i,tt=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,rt=e=>I(e)&&G(e)&&Q(e).isDirectory(),st=e=>e instanceof pe||e instanceof de,nt=e=>I(e),at=e=>typeof e=="string"&&e.length>0,ot=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),it=e=>e===void 0?!0:typeof e=="string"&&et.test(e),ct=e=>typeof e=="string"&&e.length>0,lt=e=>typeof e=="string"&&tt.test(e),pt=e=>typeof e=="string"&&e===e.toLowerCase(),dt=e=>Number.isSafeInteger(e),k=(e,t)=>{const[r,s]=t.split(":").map(p=>p.trim()),a=r??"value",o=s?.endsWith("?"),i=o&&s?s.slice(0,-1):s;if(!(o&&e==null)){if(i?.endsWith("[]")){if(!Array.isArray(e))throw new TypeError(`${a}: Must be an array`);const p=i.slice(0,-2);for(const l of e)k(l,`${a}[item]: ${p}`);return}switch(i){case"absolute":{if(!(typeof e=="string"&&nt(e)))throw new TypeError(`${a}: Must be an absolute path`);break}case"alphanumeric{40}":{if(!it(e))throw new TypeError(`${a}: Must be alphanumeric string with size 40 or empty`);break}case"directory":{if(!(typeof e=="string"&&rt(e)))throw new TypeError(`${a}: Must be directory that exists in the filesystem`);break}case"integer":{if(!(typeof e=="number"&&dt(e)))throw new TypeError(`${a}: Must be an integer`);break}case"kebab":{if(!(typeof e=="string"&&lt(e)))throw new TypeError(`${a}: Must be a kebab-case string`);break}case"lower":{if(!(typeof e=="string"&&pt(e)))throw new TypeError(`${a}: Must be a lowercase string`);break}case"objectlike":{if(!ot(e))throw new TypeError(`${a}: Must be an object`);break}case"path":{if(!(typeof e=="string"&&at(e)))throw new TypeError(`${a}: Must be valid path`);break}case"stream":{if(!st(e))throw new TypeError(`${a}: Must be an instance of stream.Writable or WritableStreamBuffer`);break}case"string":{if(typeof e!="string")throw new TypeError(`${a}: Must be a string`);break}case"string+":{if(!ct(e))throw new TypeError(`${a}: Must be a non-empty string`);break}default:if(e==null)throw new TypeError(`${a}: Must not be null or undefined`)}}},D=(e,t=process.cwd())=>{k(e,"path: path"),k(t,"cwd: absolute");const r=xe(I(e)?e:Re(t,e)),{root:s}=Oe(r);let a=r.length;for(;a>s.length&&(r[a-1]==="/"||r[a-1]==="\\");)a-=1;return a===r.length?r:r.slice(0,a)},ft=e=>e.readable?new Promise((t,r)=>{if(!e.readable){t([]);return}let s=[];const a=()=>{s=[],e.removeListener("data",o),e.removeListener("end",i),e.removeListener("error",p),e.removeListener("close",l)},o=g=>{s.push(g)},i=()=>{t(s),a()},p=g=>{r(g),a()},l=()=>{t(s),a()};e.on("data",o),e.on("end",i),e.on("error",p),e.on("close",l)}):Promise.resolve([]),{debug:re}=v.withScope("msr:commitsFilter"),W=async(e,t,r,s,a)=>{if(k(e,"cwd: directory"),e=D(e),k(t,"dir: path"),t=D(t,e),!G(t)||!Q(t).isDirectory())throw new TypeError("dir: Must be a path to an existing directory");if(k(r,"lastRelease: alphanumeric{40}?"),k(s,"nextRelease: alphanumeric{40}?"),!t.startsWith(e))throw new TypeError("dir: Must be inside cwd");if(t===e)throw new TypeError("dir: Must not be equal to cwd");const o=await ce("git",["rev-parse","--show-toplevel"],{cwd:e}),i=D(o.stdout);Object.assign(Z.fields,{committerDate:{key:"ci",type:Date},gitTags:"d",hash:"H",message:"B"});const p=Te(i,t),l=a?["--first-parent",a]:[],g=(r?`${r}..`:"")+(s??"HEAD"),f=[...l,g,"--",p],u=Z.parse({_:f},{cwd:i,env:process.env}),d=await ft(u);return d.forEach(n=>{n.message=n.message.trim(),n.gitTags=n.gitTags.trim()}),re("git log filter query: %o",f),re("filtered commits: %O",d),d},ut=2,gt=(e,t)=>{if(!t)return`${JSON.stringify(e,void 0,ut)}${ee}`;const r=ze(t)??ee,s=JSON.stringify(e,void 0,Ue(t).indent);return We(s,r)+(t.endsWith(`
2
+ `)?r:"")},mt=e=>{if(!G(e))throw new ReferenceError(`package.json file not found: "${e}"`);let t;try{t=Q(e)}catch{throw new ReferenceError(`package.json cannot be read: "${e}"`)}if(!t.isFile())throw new ReferenceError(`package.json is not a file: "${e}"`);try{return Be(e,"utf8")}catch{throw new ReferenceError(`package.json cannot be read: "${e}"`)}},me=e=>{const t=mt(e);let r;try{r=JSON.parse(t)}catch{throw new SyntaxError(`package.json could not be parsed: "${e}"`)}if(typeof r!="object"||r===null)throw new SyntaxError(`package.json was not an object: "${e}"`);const s=r;if(typeof s.name!="string"||s.name.length===0)throw new SyntaxError(`Package name must be non-empty string: "${e}"`);const a=o=>{if(Object.hasOwn(s,o)&&typeof s[o]!="object")throw new SyntaxError(`Package ${o} must be object: "${e}"`)};return a("dependencies"),a("devDependencies"),a("peerDependencies"),a("optionalDependencies"),Object.defineProperty(s,"__contents__",{enumerable:!1,value:t}),s},ht=(e,t,r)=>e&&t&&r?e(t,r)?t:r:t??r,yt=ht.bind(null,He),wt=(e,t)=>e.filter(r=>t).toSorted(Le)[0],{debug:U}=v.withScope("msr:updateDeps"),bt=/^workspace:(([\^~*])?.*)$/u,$t=/\d+/u,H=(e,t)=>{if(typeof e=="string")return e==="inherit"?t:e;if(t){const r=t;if(Object.hasOwn(e,r))return e[r]}},vt=(e,t,r)=>{const s=e?$.inc(e,"prerelease",r):void 0,a=$.inc(t,"prerelease",r)??void 0;return s?yt(a,s):a},_t=(e,t,r,s)=>{if(!$.prerelease(t)){if(!$.parse(t))return;const o=$.inc(t,r||"patch");return o?`${o}-${s}.1`:void 0}const a=wt(e,!0);return vt(a,t,s)},B=(e,t,r,s,a)=>{const o=["patch","minor","major"],{localDeps:i,manifest:p}=e,l=e._lastRelease?.version,{dependencies:g={},devDependencies:f={},optionalDependencies:u={},peerDependencies:d={}}=p,n=[g,f,d,u],b=[g,d,u],w=(y,m,_)=>{const O=y[m];if(!_||!O)return!1;const T=ae(O,_,t,a);return O!==T?(y[m]=T,!0):!1};let c;const h=i.filter(y=>!s.includes(y)).reduce((y,m)=>{const _=ye(m,t,r,[...s,e],a);let O;_?O=(m._preRelease?ne(m):se(m))??void 0:O=m._lastRelease?.version;let T=_,C=O;if(!_&&m.localDeps&&m.localDeps.length>0){const S=B(m,t,r,[...s,e],a);if(S){const P=o.indexOf(S),q=c?o.indexOf(c):-1;if(P>q&&(c=S),T=S,T&&m._lastRelease?.version){const z=m._nextType;m._nextType=T,C=(m._preRelease?ne(m):se(m))??void 0,m._nextType=z}}}if(n.forEach(S=>w(S,m.name,C??O)),!(b.some(S=>{const P=S[m.name],q=C??O;if(!P||!q||!C&&!O)return!1;const z=ae(P,q,t,a);return P!==z})||!l||T&&T!==_))return y;const Y=T??_;if(!Y)return y;const N=H(r,Y);if(!N)return y;if(!y)return N;const $e=o.indexOf(N),ve=o.indexOf(y);return $e>ve?N:y},void 0);return!h&&c?H(r,c)??c:h},jt=(e,t)=>{if(e.startsWith("workspace:")){const r=bt.exec(e);if(!r)return e;const[,s,a]=r;return a===s?a==="*"?t:(a??"")+t:s}return e},he=(e,t)=>De(e,(r,s,a)=>{Pe(s,t[a])||(r[a]=K(s)&&K(t[a])?JSON.stringify(he(s,t[a])):`${String(t[a])} → ${String(s)}`)})??{},kt=(e,t)=>{const r=`[${e.name}]`,s=me(t),a=["dependencies","devDependencies","peerDependencies","optionalDependencies"].reduce((o,i)=>{const p=he(e[i],s[i]);return Object.keys(p).length>0&&(o[i]=p),o},{});return U(r,"package.json path=",t),Object.keys(a).length>0?(U(r,"changes=",a),!0):(U(r,"no deps changes"),!1)},se=e=>{const t=e._lastRelease?.version;return t&&typeof e._nextType=="string"?$.inc(t,e._nextType):t??"1.0.0"},xt=e=>{const t=$.parse(e);if(!t)return null;const r=t.prerelease[0];return r===void 0?null:String(r)},ne=e=>{const t=e._lastRelease?.version,r=xt(t??"");return r!==null&&r!==e._preRelease||!t?`1.0.0-${e._preRelease??""}.1`:_t([],t,e._nextType??"patch",e._preRelease??"")},ye=(e,t="override",r="patch",s=[],a="")=>{const o=B(e,t,r,s,a);if(e._nextType)return e._nextType;if(!o&&e.localDeps&&e.localDeps.length>0&&e.manifest){const{manifest:p}=e,{dependencies:l={},optionalDependencies:g={},peerDependencies:f={}}=p,u={...l,...g,...f};if(e.localDeps.some(d=>!d.name||u[d.name]===void 0?!1:d._nextType?!0:d.localDeps&&d.localDeps.length>0?B(d,t,r,[...s,e],a)!==void 0:!1)){if(typeof r=="string"&&r==="inherit"){const n=B(e,t,r,s,a);if(n)return e._nextType=n,e._nextType}const d=typeof r=="string"&&r!=="inherit"?r:"patch";return e._nextType=d,e._nextType}}if(!o)return;const i=H(r,o);if(i)return e._nextType=i,e._nextType},ae=(e,t,r="override",s="")=>{if(e=jt(e,t),r==="ignore"||e===t||(r==="satisfy"||r==="inherit")&&$.satisfies(t,e))return e;if(r==="inherit"){const a=t.split(".");return e.split(".").map((o,i)=>i<a.length&&a[i]!==void 0?o.replace($t,a[i]):o).join(".")}return s+t},Rt=e=>{const{manifest:t,path:r}=e;t.version=e._nextRelease?.version??t.version,e.localDeps.forEach(s=>{if(!(s._nextRelease??s._lastRelease)?.version)throw new Error(`Cannot release ${e.name} because dependency ${s.name} has not been released yet`)}),kt(t,r)&&Fe(r,gt(t,t.__contents__))},{debug:E}=v.withScope("msr:catalogChanges"),Ot=/^[\^~]/,Tt=e=>{const t=ue(e,"pnpm-workspace.yaml");if(!fe(t))return null;try{return Je(t).catalogs??null}catch(r){return E("Failed to parse pnpm-workspace.yaml:",r),null}},St=async e=>{const t=ue(e,"package.json");if(!fe(t))return null;try{return(await Ve(t)).catalogs??null}catch(r){return E("Failed to parse package.json for yarn catalog:",r),null}},Et=async e=>Tt(e)||St(e),Dt=async(e,t)=>{const{execa:r}=await import("execa");try{try{const s=await r("git",["show",`${t}:pnpm-workspace.yaml`],{cwd:e,reject:!1});if(s.exitCode===0&&s.stdout){const{parse:a}=await import("yaml"),o=a(s.stdout);if(o.catalogs)return o.catalogs}}catch{}try{const s=await r("git",["show",`${t}:package.json`],{cwd:e,reject:!1});if(s.exitCode===0&&s.stdout)return JSON.parse(s.stdout).catalogs??null}catch{}}catch(s){E(`Failed to get catalog definitions at commit ${t}:`,s)}return null},Pt=(e,t)=>{const r=o=>o.replace(Ot,"").trim(),s=r(e),a=r(t);return!$.valid(s)||!$.valid(a)||$.eq(s,a)?null:$.major(s)!==$.major(a)?"major":$.minor(s)!==$.minor(a)?"minor":$.patch(s)!==$.patch(a)?"patch":null},Mt=async(e,t,r)=>{e=D(e);const s=await Et(e);if(!s)return E("No catalog definitions found"),{};if(!t)return E("No last release found, skipping catalog change detection"),{};const a=await Dt(e,t);if(!a)return E("No old catalog definitions found at last release"),{};const o={};for(const[i,p]of Object.entries(s)){const l=a[i];if(l)for(const[g,f]of Object.entries(p)){const u=l[g];if(u&&u!==f){const d=Pt(u,f);d&&(o[i]??={},o[i][g]={newVersion:f,oldVersion:u,releaseType:d},E(`Catalog change detected: ${i}:${g} ${u} -> ${f} (${d})`))}}}return o},Ct=(e,t,r)=>{const{manifest:s}=e,a=[s.dependencies,s.peerDependencies,s.optionalDependencies].filter(Boolean);for(const o of a)for(const[i,p]of Object.entries(o))if(p===t){if(r&&i!==r)continue;return!0}return!1},Nt=(e,t,r)=>{const s=`catalog:${t}`;return e.filter(a=>Ct(a,s,r))},qt=(e,t,r)=>{const s=e.get(t);if(s){const a={major:3,minor:2,patch:1},o=a[s];a[r]>o&&e.set(t,r)}else e.set(t,r)},At=(e,t)=>{const r=new Map;for(const[s,a]of Object.entries(t))for(const[o,i]of Object.entries(a)){const p=Nt(e,s,o);for(const l of p)i.releaseType&&qt(r,l.name,i.releaseType)}return r},{debug:j}=v.withScope("msr:inlinePlugin"),Bt=/^(#+) (\[?\d+\.\d+\.\d+\]?)/u,Ft=(e,t,r)=>{const{cwd:s}=t;let a=null,o=!1;return i=>{const{dir:p,name:l,plugins:g}=i,f=`[${l}]`,u={analyzeCommits:async(d,n)=>{if(!n.branch)throw new Error("context.branch is required");n.options||(n.options={}),Object.assign(n.options,i.options),Object.assign(n.options,n.options._pkgOptions??{}),i._preRelease=n.branch.prerelease??null,i._branch=n.branch.name,n.branch.channel&&j(f,`Branch channel: ${String(n.branch.channel)}`),n.cwd=p;const b=r.firstParent?n.branch.name:void 0;if(n.commits=await W(s,p,n.lastRelease?n.lastRelease.gitHead:void 0,n.nextRelease?n.nextRelease.gitHead:void 0,b),i._lastRelease=n.lastRelease,!o&&n.lastRelease?.gitHead)try{const h=await Mt(s,n.lastRelease.gitHead);Object.keys(h).length>0?(a=At(e,h),o=!0,j(f,`Detected catalog changes affecting ${String(a.size)} packages`)):o=!0}catch(h){j(f,"Failed to detect catalog changes:",h),o=!0}let w;if(a?.has(i.name)){const h=a.get(i.name);w=r.deps?.release?H(r.deps.release,h):h,j(f,`Catalog change triggers ${w??""} release (raw: ${h??""})`)}let c;if(g.analyzeCommits&&(c=await g.analyzeCommits(n)??void 0),!c&&w)c=w;else if(c&&w){const h={major:3,minor:2,patch:1},y=h[c]||0;(h[w]||0)>y&&(c=w)}return i._nextType=c,i._analyzed=!0,r.deps&&(i._nextType=ye(i,r.deps.bump,r.deps.release,[],r.deps.prefix)),j(f,"commits analyzed"),j(f,`release type: ${i._nextType??"none"}`),i._nextType??null},generateNotes:async(d,n)=>{n.options||(n.options={}),Object.assign(n.options,i.options),Object.assign(n.options,n.options._pkgOptions??{}),n.cwd=p,i._nextRelease=n.nextRelease,n.nextRelease?.channel&&j(f,`Release channel: ${n.nextRelease.channel}`);const b=[];if(n.lastRelease?.gitTag&&(!n.lastRelease.gitHead||n.lastRelease.gitHead===n.lastRelease.gitTag)){const y=await ce("git",["rev-parse","--show-toplevel"],{cwd:n.cwd}),m=D(y.stdout);n.lastRelease.gitHead=await Ae(n.lastRelease.gitTag,{cwd:m,env:n.env})}if(!n.branch)throw new Error("context.branch is required");const w=r.firstParent?n.branch.name:void 0;n.commits=await W(s,p,n.lastRelease?n.lastRelease.gitHead:void 0,n.nextRelease?n.nextRelease.gitHead:void 0,w);let c;g.generateNotes&&(c=await g.generateNotes(n)),c&&b.push(c.replace(Bt,`$1 ${l} $2`));const h=i.localDeps.filter(y=>y._nextRelease);if(h.length>0){b.push("### Dependencies");const y=h.map(m=>{const _=m._nextRelease;return _?`* **${m.name}:** upgraded to ${_.version}`:""}).filter(Boolean);b.push(y.join(`
3
+ `))}return j(f,"notes generated"),b.join(`
4
+
5
+ `)},prepare:async(d,n)=>{if(n.options||(n.options={}),Object.assign(n.options,i.options),Object.assign(n.options,n.options._pkgOptions??{}),r.dryRun){j(f,"skipping prepare in dry-run mode");return}if(Rt(i),i._depsUpdated=!0,n.cwd=p,!n.branch)throw new Error("context.branch is required");const b=r.firstParent?n.branch.name:void 0;n.commits=await W(s,p,n.lastRelease?n.lastRelease.gitHead:void 0,n.nextRelease?n.nextRelease.gitHead:void 0,b),g.prepare&&await g.prepare(n),i._prepared=!0,j(f,"prepared")},publish:async(d,n)=>{if(n.options||(n.options={}),Object.assign(n.options,i.options),Object.assign(n.options,n.options._pkgOptions??{}),r.dryRun)return j(f,"skipping publish in dry-run mode"),[];n.cwd=p;let b=[];if(g.publish){const w=await g.publish(n);w!==void 0&&(b=Array.isArray(w)?w:[w])}return i._published=!0,j(f,"published"),b.length>0?b[0]:{}},verifyConditions:async(d,n)=>{n.options||(n.options={}),Object.assign(n.options,i.options),Object.assign(n.options,n.options._pkgOptions??{}),n.cwd=p,g.verifyConditions&&await g.verifyConditions(n),i._ready=!0,j(f,"verified conditions")},verifyRelease:async(d,n)=>{n.options||(n.options={}),Object.assign(n.options,i.options),Object.assign(n.options,n.options._pkgOptions??{}),n.cwd=p,await g.verifyRelease?.(n),j(f,"release verified")}};return Object.keys(u).forEach(d=>Reflect.defineProperty(u[d],"pluginName",{enumerable:!0,value:"Inline plugin",writable:!1})),j(f,"inlinePlugin created"),u}},x="release",Ht=["package.json",`.${x}rc`,`.${x}rc.json`,`.${x}rc.yaml`,`.${x}rc.yml`,`.${x}rc.js`,`.${x}rc.cjs`,`.${x}rc.mjs`,`${x}.config.js`,`${x}.config.cjs`,`${x}.config.mjs`],we=async e=>(await ge(x,{mergeSearchPlaces:!1,searchPlaces:Ht}).search(e))?.config??{},oe=e=>e==null,A=(e={},t={})=>({...e,...X(t,r=>!oe(r)),deps:{...e.deps,...X(t.deps,r=>!oe(r))},ignorePackages:[...new Set([...F(e.ignorePackages??[]),...F(t.ignorePackages??[])])]}),R="multi-release",Lt=["package.json",`.${R}rc`,`.${R}rc.json`,`.${R}rc.yaml`,`.${R}rc.yml`,`.${R}rc.js`,`.${R}rc.cjs`,`.${R}rc.mjs`,`${R}.config.js`,`${R}.config.cjs`,`${R}.config.mjs`],zt=async(e,t)=>{const r=(await ge(R,{searchPlaces:Lt}).search(e))?.config??{},{extends:s,...a}=r;let o=a;if(s){const i=Ie(import.meta.url),p=F(s).reduce((l,g)=>{const f=i(Ge(e,g));return A(l,f)},{});o=A(o,p)}return o=A({branches:void 0,ci:void 0,debug:!1,deps:{bump:"override",prefix:"",release:"patch"},dryRun:void 0,firstParent:!1,ignorePackages:[],ignorePrivate:!0,logLevel:"info",sequentialInit:!1,sequentialPrepare:!0,silent:!1,tagFormat:"${name}@${version}"},o),A(o,t)},{Signale:Wt}=le,Ut=async({cwd:e,env:t,stderr:r,stdout:s},a)=>{try{const o=new de,i=new Wt({stream:o});return await Qe({cwd:e,env:t,logger:i,stderr:r,stdout:s},a)}catch(o){throw v.failure("Error in semantic-release getConfig(): %0",o),o}};class ie extends pe{_stream;_scope;constructor(t,r){super(),k(r,"scope: string"),k(t,"stream: stream"),this._stream=t,this._scope=r}write(t){return k(t,"msg: string"),this._stream.write(t.replace("[semantic-release]",`[${this._scope}]`))}}const Vt=/^git:\/\//u,be=e=>e&&(e.startsWith("git+")?e.slice(4):e.startsWith("git://")?e.replace(Vt,"https://"):e),Jt=async(e,{cwd:t,env:r,globalOptions:s,inputOptions:a,stderr:o,stdout:i})=>{e=D(e,t);const p=Se(e),l=me(e),{name:g}=l,f=Object.keys({...l.dependencies,...l.devDependencies,...l.peerDependencies,...l.optionalDependencies}),u=await we(p),d={...s,...u,...a};if(!d.repositoryUrl&&l.repository){let c;typeof l.repository=="string"?c=l.repository:typeof l.repository=="object"&&l.repository!==null&&"url"in l.repository&&(c=l.repository.url),c&&(d.repositoryUrl=be(c))}const n=Object.fromEntries(Object.entries(r).filter(([,c])=>c!==void 0).map(([c,h])=>[c,String(h)])),{options:b,plugins:w}=await Ut({cwd:p,env:n,stderr:o,stdout:i},d);return{deps:f,dir:p,localDeps:[],manifest:l,name:g,options:b,path:e,plugins:w}},It=async(e,t,r,s)=>{const{dir:a,name:o,options:i}=e,{env:p,stderr:l,stdout:g}=r,f=t(e),u={...i,...f},d={name:o,version:"${version}"},n="${name}@${version}";return u.tagFormat=Ce(s.tagFormat??n)(d),u.debug=s.debug,u.dryRun=s.dryRun??u.dryRun,u.ci=s.ci??u.ci,u.branches=s.branches?F(s.branches):u.branches,u._pkgOptions=i,u.repositoryUrl&&typeof u.repositoryUrl=="string"&&(u.repositoryUrl=be(u.repositoryUrl)),e.result=await Ne(u,{cwd:a,env:p,stderr:new ie(l,o),stdout:new ie(g,o)}),e},gr=async(e,t={},{cwd:r=process.cwd(),env:s=process.env,stderr:a=process.stderr,stdout:o=process.stdout}={},i={})=>{e&&k(e,"paths: string[]"),k(r,"cwd: directory"),k(s,"env: objectlike"),k(o,"stdout: stream"),k(a,"stderr: stream"),r=D(r);const p=await zt(r,i),l={deps:{},...p,...i};if(v.config.stdio=[a,o],v.config.level=l.logLevel,l.silent&&(v.config.level="silent"),l.debug){v.config.level="debug";const c=s.DEBUG?`,${s.DEBUG}`:"";V.enable(`msr:*,semantic-release:*${c}`)}v.info(`multi-semantic-release version: ${Ze.version}`),v.info(`semantic-release version: ${qe.version}`),l.debug&&v.info(`flags: ${JSON.stringify(l,null,2)}`);const g=await we(r),f={cwd:r,env:s,globalOptions:g,inputOptions:t,stderr:a,stdout:o},{packages:u,queue:d}=await Ee({cwd:r,filter:(c=>{const{manifest:h}=c;return(!l.ignorePrivate||!h.private)&&(e?e.includes(c.manifestAbsPath)||e.includes(c.manifestRelPath):!0)}),workspacesExtra:Array.isArray(l.ignorePackages)?l.ignorePackages.map(c=>`!${c}`):[]});e??=Object.values(u).map(c=>c.manifestPath),v.complete(`Started multirelease! Loading ${String(e.length)} packages...`);const n=(await Promise.all(e.map(c=>Jt(c,f)))).filter(c=>c!==void 0);n.forEach(c=>{c.localDeps=[...new Set(c.deps.map(h=>n.find(y=>h===y.name)).filter(Boolean))],v.success(`Loaded package ${c.name}`)}),v.complete(`Queued ${String(d.length)} packages! Starting release...`);const b=Ft(n,f,l),w=await d.reduce(async(c,h)=>{const y=await c,m=n.find(({name:_})=>_===h);if(m){const{result:_}=await It(m,b,f,l);if(_)return y+1}return y},Promise.resolve(0));return v.complete(`Released ${String(w)} of ${String(d.length)} packages, semantically!`),Me(n,({name:c})=>d.indexOf(c))};export{v as d,gr as q};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anolilab/multi-semantic-release",
3
- "version": "4.4.9",
3
+ "version": "4.4.11",
4
4
  "description": "A multi semantic release tool for a monorepo.",
5
5
  "keywords": [
6
6
  "anolilab",
@@ -58,10 +58,9 @@
58
58
  "@semrel-extra/topo": "^1.14.1",
59
59
  "@visulima/fs": "^5.1.0",
60
60
  "@visulima/path": "^3.0.0",
61
- "cosmiconfig": "10.0.0",
61
+ "cosmiconfig": "10.0.1",
62
62
  "debug": "^4.4.3",
63
63
  "detect-indent": "^7.0.2",
64
- "detect-newline": "^4.0.1",
65
64
  "execa": "^10.0.1",
66
65
  "git-log-parser": "^1.2.1",
67
66
  "lodash-es": "4.18.1",
@@ -1,4 +0,0 @@
1
- import{createRequire as ve}from"node:module";import{topo as Se}from"@semrel-extra/topo";import V from"debug";import{transform as Ee,isEqual as De,isObject as K,castArray as H,pickBy as X,sortBy as Pe,template as Me}from"lodash-es";import Ce from"semantic-release";import Ne from"semantic-release/package.json"with{type:"json"};import{execa as ie}from"execa";import{getTagHead as qe}from"semantic-release/lib/git.js";import Z from"git-log-parser";import ce from"signale";import{WritableStreamBuffer as pe}from"stream-buffers";import $,{gt as He,rcompare as Fe}from"semver";import Le from"detect-indent";import{detectNewline as We}from"detect-newline";import{isAccessibleSync as de,readJson as ze}from"@visulima/fs";import{readYamlSync as Ue}from"@visulima/fs/yaml";import{resolve as ue}from"@visulima/path";import{cosmiconfig as fe}from"cosmiconfig";import Je from"resolve-from";import Ie from"semantic-release/lib/get-config.js";let _e;const je=e=>(_e??=ve(import.meta.url))(e),M=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,L=e=>{if(typeof M<"u"&&M.versions&&M.versions.node){const[t,r]=M.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return M.getBuiltinModule(e)}return je(e)},{isAbsolute:I,normalize:ke,join:xe,parse:Re,relative:Oe,dirname:Te}=L("node:path"),{existsSync:G,lstatSync:Q,readFileSync:Ae,writeFileSync:Be}=L("node:fs"),{Writable:le}=L("node:stream"),{createRequire:Ve}=L("node:module"),{Signale:Ge}=ce,J=["error","warn","info","debug","trace"],Qe=(e,t)=>{const r=J.indexOf(e),s=J.indexOf(t);return r!==-1&&s!==-1&&r<=s},ee={complete:"info",failure:"error",log:"info",success:"info"},v={config:{_level:"info",_signale:{},_stderr:process.stderr,_stdout:process.stdout,set level(e){e&&(this._level=e)},get level(){return this._level},set stdio([e,t]){this._stdout=t,this._stderr=e,this._signale=new Ge({config:{displayLabel:!1,displayTimestamp:!0},stream:t,types:{complete:{badge:"🎉",color:"green",label:"",stream:[t]},error:{badge:"✖",color:"red",label:"",stream:[e]},log:{badge:"•",color:"magenta",label:"",stream:[t]},success:{badge:"✔",color:"green",label:"",stream:[t]}}})},get stdio(){return[this._stderr,this._stdout]}},prefix:"msr:",withScope(e){return{...this,debug:V(e||this.prefix),prefix:e}},...[...J,...Object.keys(ee)].reduce((e,t)=>(e[t]=function(...r){Qe(ee[t]??t,this.config.level)&&(this.config._signale[t]??console[t]??(()=>{}))(this.prefix,...r)},e),{}),debug:V("msr:")};var Ye="4.4.8";const Ke={version:Ye},Xe=/^[a-f0-9]{40}$/i,Ze=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,et=e=>I(e)&&G(e)&&Q(e).isDirectory(),tt=e=>e instanceof le||e instanceof pe,rt=e=>I(e),st=e=>typeof e=="string"&&e.length>0,nt=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),at=e=>e===void 0?!0:typeof e=="string"&&Xe.test(e),ot=e=>typeof e=="string"&&e.length>0,it=e=>typeof e=="string"&&Ze.test(e),ct=e=>typeof e=="string"&&e===e.toLowerCase(),lt=e=>Number.isSafeInteger(e),k=(e,t)=>{const[r,s]=t.split(":").map(p=>p.trim()),a=r??"value",o=s?.endsWith("?"),i=o&&s?s.slice(0,-1):s;if(!(o&&e==null)){if(i?.endsWith("[]")){if(!Array.isArray(e))throw new TypeError(`${a}: Must be an array`);const p=i.slice(0,-2);for(const l of e)k(l,`${a}[item]: ${p}`);return}switch(i){case"absolute":{if(!(typeof e=="string"&&rt(e)))throw new TypeError(`${a}: Must be an absolute path`);break}case"alphanumeric{40}":{if(!at(e))throw new TypeError(`${a}: Must be alphanumeric string with size 40 or empty`);break}case"directory":{if(!(typeof e=="string"&&et(e)))throw new TypeError(`${a}: Must be directory that exists in the filesystem`);break}case"integer":{if(!(typeof e=="number"&&lt(e)))throw new TypeError(`${a}: Must be an integer`);break}case"kebab":{if(!(typeof e=="string"&&it(e)))throw new TypeError(`${a}: Must be a kebab-case string`);break}case"lower":{if(!(typeof e=="string"&&ct(e)))throw new TypeError(`${a}: Must be a lowercase string`);break}case"objectlike":{if(!nt(e))throw new TypeError(`${a}: Must be an object`);break}case"path":{if(!(typeof e=="string"&&st(e)))throw new TypeError(`${a}: Must be valid path`);break}case"stream":{if(!tt(e))throw new TypeError(`${a}: Must be an instance of stream.Writable or WritableStreamBuffer`);break}case"string":{if(typeof e!="string")throw new TypeError(`${a}: Must be a string`);break}case"string+":{if(!ot(e))throw new TypeError(`${a}: Must be a non-empty string`);break}default:if(e==null)throw new TypeError(`${a}: Must not be null or undefined`)}}},D=(e,t=process.cwd())=>{k(e,"path: path"),k(t,"cwd: absolute");const r=ke(I(e)?e:xe(t,e)),{root:s}=Re(r);let a=r.length;for(;a>s.length&&(r[a-1]==="/"||r[a-1]==="\\");)a-=1;return a===r.length?r:r.slice(0,a)},pt=e=>e.readable?new Promise((t,r)=>{if(!e.readable){t([]);return}let s=[];const a=()=>{s=[],e.removeListener("data",o),e.removeListener("end",i),e.removeListener("error",p),e.removeListener("close",l)},o=g=>{s.push(g)},i=()=>{t(s),a()},p=g=>{r(g),a()},l=()=>{t(s),a()};e.on("data",o),e.on("end",i),e.on("error",p),e.on("close",l)}):Promise.resolve([]),{debug:te}=v.withScope("msr:commitsFilter"),z=async(e,t,r,s,a)=>{if(k(e,"cwd: directory"),e=D(e),k(t,"dir: path"),t=D(t,e),!G(t)||!Q(t).isDirectory())throw new TypeError("dir: Must be a path to an existing directory");if(k(r,"lastRelease: alphanumeric{40}?"),k(s,"nextRelease: alphanumeric{40}?"),!t.startsWith(e))throw new TypeError("dir: Must be inside cwd");if(t===e)throw new TypeError("dir: Must not be equal to cwd");const o=await ie("git",["rev-parse","--show-toplevel"],{cwd:e}),i=D(o.stdout);Object.assign(Z.fields,{committerDate:{key:"ci",type:Date},gitTags:"d",hash:"H",message:"B"});const p=Oe(i,t),l=a?["--first-parent",a]:[],g=(r?`${r}..`:"")+(s??"HEAD"),u=[...l,g,"--",p],f=Z.parse({_:u},{cwd:i,env:process.env}),d=await pt(f);return d.forEach(n=>{n.message=n.message.trim(),n.gitTags=n.gitTags.trim()}),te("git log filter query: %o",u),te("filtered commits: %O",d),d},dt=e=>{if(!G(e))throw new ReferenceError(`package.json file not found: "${e}"`);let t;try{t=Q(e)}catch{throw new ReferenceError(`package.json cannot be read: "${e}"`)}if(!t.isFile())throw new ReferenceError(`package.json is not a file: "${e}"`);try{return Ae(e,"utf8")}catch{throw new ReferenceError(`package.json cannot be read: "${e}"`)}},ge=e=>{const t=dt(e);let r;try{r=JSON.parse(t)}catch{throw new SyntaxError(`package.json could not be parsed: "${e}"`)}if(typeof r!="object"||r===null)throw new SyntaxError(`package.json was not an object: "${e}"`);const s=r;if(typeof s.name!="string"||s.name.length===0)throw new SyntaxError(`Package name must be non-empty string: "${e}"`);const a=o=>{if(Object.hasOwn(s,o)&&typeof s[o]!="object")throw new SyntaxError(`Package ${o} must be object: "${e}"`)};return a("dependencies"),a("devDependencies"),a("peerDependencies"),a("optionalDependencies"),Object.defineProperty(s,"__contents__",{enumerable:!1,value:t}),s},ut=(e,t,r)=>e&&t&&r?e(t,r)?t:r:t??r,ft=ut.bind(null,He),gt=(e,t)=>e.filter(r=>t).toSorted(Fe)[0],mt=e=>({indent:Le(e).indent,trailingWhitespace:We(e)??""}),{debug:U}=v.withScope("msr:updateDeps"),ht=/^workspace:(([\^~*])?.*)$/u,yt=/\d+/u,F=(e,t)=>{if(typeof e=="string")return e==="inherit"?t:e;if(t){const r=t;if(Object.hasOwn(e,r))return e[r]}},wt=(e,t,r)=>{const s=e?$.inc(e,"prerelease",r):void 0,a=$.inc(t,"prerelease",r)??void 0;return s?ft(a,s):a},bt=(e,t,r,s)=>{if(!$.prerelease(t)){if(!$.parse(t))return;const o=$.inc(t,r||"patch");return o?`${o}-${s}.1`:void 0}const a=gt(e,!0);return wt(a,t,s)},B=(e,t,r,s,a)=>{const o=["patch","minor","major"],{localDeps:i,manifest:p}=e,l=e._lastRelease?.version,{dependencies:g={},devDependencies:u={},optionalDependencies:f={},peerDependencies:d={}}=p,n=[g,u,d,f],b=[g,d,f],w=(y,m,_)=>{const O=y[m];if(!_||!O)return!1;const T=ne(O,_,t,a);return O!==T?(y[m]=T,!0):!1};let c;const h=i.filter(y=>!s.includes(y)).reduce((y,m)=>{const _=he(m,t,r,[...s,e],a);let O;_?O=(m._preRelease?se(m):re(m))??void 0:O=m._lastRelease?.version;let T=_,C=O;if(!_&&m.localDeps&&m.localDeps.length>0){const S=B(m,t,r,[...s,e],a);if(S){const P=o.indexOf(S),q=c?o.indexOf(c):-1;if(P>q&&(c=S),T=S,T&&m._lastRelease?.version){const W=m._nextType;m._nextType=T,C=(m._preRelease?se(m):re(m))??void 0,m._nextType=W}}}if(n.forEach(S=>w(S,m.name,C??O)),!(b.some(S=>{const P=S[m.name],q=C??O;if(!P||!q||!C&&!O)return!1;const W=ne(P,q,t,a);return P!==W})||!l||T&&T!==_))return y;const Y=T??_;if(!Y)return y;const N=F(r,Y);if(!N)return y;if(!y)return N;const be=o.indexOf(N),$e=o.indexOf(y);return be>$e?N:y},void 0);return!h&&c?F(r,c)??c:h},$t=(e,t)=>{if(e.startsWith("workspace:")){const r=ht.exec(e);if(!r)return e;const[,s,a]=r;return a===s?a==="*"?t:(a??"")+t:s}return e},me=(e,t)=>Ee(e,(r,s,a)=>{De(s,t[a])||(r[a]=K(s)&&K(t[a])?JSON.stringify(me(s,t[a])):`${String(t[a])} → ${String(s)}`)})??{},vt=(e,t)=>{const r=`[${e.name}]`,s=ge(t),a=["dependencies","devDependencies","peerDependencies","optionalDependencies"].reduce((o,i)=>{const p=me(e[i],s[i]);return Object.keys(p).length>0&&(o[i]=p),o},{});return U(r,"package.json path=",t),Object.keys(a).length>0?(U(r,"changes=",a),!0):(U(r,"no deps changes"),!1)},re=e=>{const t=e._lastRelease?.version;return t&&typeof e._nextType=="string"?$.inc(t,e._nextType):t??"1.0.0"},_t=e=>{const t=$.parse(e);if(!t)return null;const r=t.prerelease[0];return r===void 0?null:String(r)},se=e=>{const t=e._lastRelease?.version,r=_t(t??"");return r!==null&&r!==e._preRelease||!t?`1.0.0-${e._preRelease??""}.1`:bt([],t,e._nextType??"patch",e._preRelease??"")},he=(e,t="override",r="patch",s=[],a="")=>{const o=B(e,t,r,s,a);if(e._nextType)return e._nextType;if(!o&&e.localDeps&&e.localDeps.length>0&&e.manifest){const{manifest:p}=e,{dependencies:l={},optionalDependencies:g={},peerDependencies:u={}}=p,f={...l,...g,...u};if(e.localDeps.some(d=>!d.name||f[d.name]===void 0?!1:d._nextType?!0:d.localDeps&&d.localDeps.length>0?B(d,t,r,[...s,e],a)!==void 0:!1)){if(typeof r=="string"&&r==="inherit"){const n=B(e,t,r,s,a);if(n)return e._nextType=n,e._nextType}const d=typeof r=="string"&&r!=="inherit"?r:"patch";return e._nextType=d,e._nextType}}if(!o)return;const i=F(r,o);if(i)return e._nextType=i,e._nextType},ne=(e,t,r="override",s="")=>{if(e=$t(e,t),r==="ignore"||e===t||(r==="satisfy"||r==="inherit")&&$.satisfies(t,e))return e;if(r==="inherit"){const a=t.split(".");return e.split(".").map((o,i)=>i<a.length&&a[i]!==void 0?o.replace(yt,a[i]):o).join(".")}return s+t},jt=e=>{const{manifest:t,path:r}=e,{indent:s,trailingWhitespace:a}=mt(t.__contents__);t.version=e._nextRelease?.version??t.version,e.localDeps.forEach(o=>{if(!(o._nextRelease??o._lastRelease)?.version)throw new Error(`Cannot release ${e.name} because dependency ${o.name} has not been released yet`)}),vt(t,r)&&Be(r,JSON.stringify(t,null,s)+a)},{debug:E}=v.withScope("msr:catalogChanges"),kt=/^[\^~]/,xt=e=>{const t=ue(e,"pnpm-workspace.yaml");if(!de(t))return null;try{return Ue(t).catalogs??null}catch(r){return E("Failed to parse pnpm-workspace.yaml:",r),null}},Rt=async e=>{const t=ue(e,"package.json");if(!de(t))return null;try{return(await ze(t)).catalogs??null}catch(r){return E("Failed to parse package.json for yarn catalog:",r),null}},Ot=async e=>xt(e)||Rt(e),Tt=async(e,t)=>{const{execa:r}=await import("execa");try{try{const s=await r("git",["show",`${t}:pnpm-workspace.yaml`],{cwd:e,reject:!1});if(s.exitCode===0&&s.stdout){const{parse:a}=await import("yaml"),o=a(s.stdout);if(o.catalogs)return o.catalogs}}catch{}try{const s=await r("git",["show",`${t}:package.json`],{cwd:e,reject:!1});if(s.exitCode===0&&s.stdout)return JSON.parse(s.stdout).catalogs??null}catch{}}catch(s){E(`Failed to get catalog definitions at commit ${t}:`,s)}return null},St=(e,t)=>{const r=o=>o.replace(kt,"").trim(),s=r(e),a=r(t);return!$.valid(s)||!$.valid(a)||$.eq(s,a)?null:$.major(s)!==$.major(a)?"major":$.minor(s)!==$.minor(a)?"minor":$.patch(s)!==$.patch(a)?"patch":null},Et=async(e,t,r)=>{e=D(e);const s=await Ot(e);if(!s)return E("No catalog definitions found"),{};if(!t)return E("No last release found, skipping catalog change detection"),{};const a=await Tt(e,t);if(!a)return E("No old catalog definitions found at last release"),{};const o={};for(const[i,p]of Object.entries(s)){const l=a[i];if(l)for(const[g,u]of Object.entries(p)){const f=l[g];if(f&&f!==u){const d=St(f,u);d&&(o[i]??={},o[i][g]={newVersion:u,oldVersion:f,releaseType:d},E(`Catalog change detected: ${i}:${g} ${f} -> ${u} (${d})`))}}}return o},Dt=(e,t,r)=>{const{manifest:s}=e,a=[s.dependencies,s.peerDependencies,s.optionalDependencies].filter(Boolean);for(const o of a)for(const[i,p]of Object.entries(o))if(p===t){if(r&&i!==r)continue;return!0}return!1},Pt=(e,t,r)=>{const s=`catalog:${t}`;return e.filter(a=>Dt(a,s,r))},Mt=(e,t,r)=>{const s=e.get(t);if(s){const a={major:3,minor:2,patch:1},o=a[s];a[r]>o&&e.set(t,r)}else e.set(t,r)},Ct=(e,t)=>{const r=new Map;for(const[s,a]of Object.entries(t))for(const[o,i]of Object.entries(a)){const p=Pt(e,s,o);for(const l of p)i.releaseType&&Mt(r,l.name,i.releaseType)}return r},{debug:j}=v.withScope("msr:inlinePlugin"),Nt=/^(#+) (\[?\d+\.\d+\.\d+\]?)/u,qt=(e,t,r)=>{const{cwd:s}=t;let a=null,o=!1;return i=>{const{dir:p,name:l,plugins:g}=i,u=`[${l}]`,f={analyzeCommits:async(d,n)=>{if(!n.branch)throw new Error("context.branch is required");n.options||(n.options={}),Object.assign(n.options,i.options),Object.assign(n.options,n.options._pkgOptions??{}),i._preRelease=n.branch.prerelease??null,i._branch=n.branch.name,n.branch.channel&&j(u,`Branch channel: ${String(n.branch.channel)}`),n.cwd=p;const b=r.firstParent?n.branch.name:void 0;if(n.commits=await z(s,p,n.lastRelease?n.lastRelease.gitHead:void 0,n.nextRelease?n.nextRelease.gitHead:void 0,b),i._lastRelease=n.lastRelease,!o&&n.lastRelease?.gitHead)try{const h=await Et(s,n.lastRelease.gitHead);Object.keys(h).length>0?(a=Ct(e,h),o=!0,j(u,`Detected catalog changes affecting ${String(a.size)} packages`)):o=!0}catch(h){j(u,"Failed to detect catalog changes:",h),o=!0}let w;if(a?.has(i.name)){const h=a.get(i.name);w=r.deps?.release?F(r.deps.release,h):h,j(u,`Catalog change triggers ${w??""} release (raw: ${h??""})`)}let c;if(g.analyzeCommits&&(c=await g.analyzeCommits(n)??void 0),!c&&w)c=w;else if(c&&w){const h={major:3,minor:2,patch:1},y=h[c]||0;(h[w]||0)>y&&(c=w)}return i._nextType=c,i._analyzed=!0,r.deps&&(i._nextType=he(i,r.deps.bump,r.deps.release,[],r.deps.prefix)),j(u,"commits analyzed"),j(u,`release type: ${i._nextType??"none"}`),i._nextType??null},generateNotes:async(d,n)=>{n.options||(n.options={}),Object.assign(n.options,i.options),Object.assign(n.options,n.options._pkgOptions??{}),n.cwd=p,i._nextRelease=n.nextRelease,n.nextRelease?.channel&&j(u,`Release channel: ${n.nextRelease.channel}`);const b=[];if(n.lastRelease?.gitTag&&(!n.lastRelease.gitHead||n.lastRelease.gitHead===n.lastRelease.gitTag)){const y=await ie("git",["rev-parse","--show-toplevel"],{cwd:n.cwd}),m=D(y.stdout);n.lastRelease.gitHead=await qe(n.lastRelease.gitTag,{cwd:m,env:n.env})}if(!n.branch)throw new Error("context.branch is required");const w=r.firstParent?n.branch.name:void 0;n.commits=await z(s,p,n.lastRelease?n.lastRelease.gitHead:void 0,n.nextRelease?n.nextRelease.gitHead:void 0,w);let c;g.generateNotes&&(c=await g.generateNotes(n)),c&&b.push(c.replace(Nt,`$1 ${l} $2`));const h=i.localDeps.filter(y=>y._nextRelease);if(h.length>0){b.push("### Dependencies");const y=h.map(m=>{const _=m._nextRelease;return _?`* **${m.name}:** upgraded to ${_.version}`:""}).filter(Boolean);b.push(y.join(`
2
- `))}return j(u,"notes generated"),b.join(`
3
-
4
- `)},prepare:async(d,n)=>{if(n.options||(n.options={}),Object.assign(n.options,i.options),Object.assign(n.options,n.options._pkgOptions??{}),r.dryRun){j(u,"skipping prepare in dry-run mode");return}if(jt(i),i._depsUpdated=!0,n.cwd=p,!n.branch)throw new Error("context.branch is required");const b=r.firstParent?n.branch.name:void 0;n.commits=await z(s,p,n.lastRelease?n.lastRelease.gitHead:void 0,n.nextRelease?n.nextRelease.gitHead:void 0,b),g.prepare&&await g.prepare(n),i._prepared=!0,j(u,"prepared")},publish:async(d,n)=>{if(n.options||(n.options={}),Object.assign(n.options,i.options),Object.assign(n.options,n.options._pkgOptions??{}),r.dryRun)return j(u,"skipping publish in dry-run mode"),[];n.cwd=p;let b=[];if(g.publish){const w=await g.publish(n);w!==void 0&&(b=Array.isArray(w)?w:[w])}return i._published=!0,j(u,"published"),b.length>0?b[0]:{}},verifyConditions:async(d,n)=>{n.options||(n.options={}),Object.assign(n.options,i.options),Object.assign(n.options,n.options._pkgOptions??{}),n.cwd=p,g.verifyConditions&&await g.verifyConditions(n),i._ready=!0,j(u,"verified conditions")},verifyRelease:async(d,n)=>{n.options||(n.options={}),Object.assign(n.options,i.options),Object.assign(n.options,n.options._pkgOptions??{}),n.cwd=p,await g.verifyRelease?.(n),j(u,"release verified")}};return Object.keys(f).forEach(d=>Reflect.defineProperty(f[d],"pluginName",{enumerable:!0,value:"Inline plugin",writable:!1})),j(u,"inlinePlugin created"),f}},x="release",At=["package.json",`.${x}rc`,`.${x}rc.json`,`.${x}rc.yaml`,`.${x}rc.yml`,`.${x}rc.js`,`.${x}rc.cjs`,`.${x}rc.mjs`,`${x}.config.js`,`${x}.config.cjs`,`${x}.config.mjs`],ye=async e=>(await fe(x,{mergeSearchPlaces:!1,searchPlaces:At}).search(e))?.config??{},ae=e=>e==null,A=(e={},t={})=>({...e,...X(t,r=>!ae(r)),deps:{...e.deps,...X(t.deps,r=>!ae(r))},ignorePackages:[...new Set([...H(e.ignorePackages??[]),...H(t.ignorePackages??[])])]}),R="multi-release",Bt=["package.json",`.${R}rc`,`.${R}rc.json`,`.${R}rc.yaml`,`.${R}rc.yml`,`.${R}rc.js`,`.${R}rc.cjs`,`.${R}rc.mjs`,`${R}.config.js`,`${R}.config.cjs`,`${R}.config.mjs`],Ht=async(e,t)=>{const r=(await fe(R,{searchPlaces:Bt}).search(e))?.config??{},{extends:s,...a}=r;let o=a;if(s){const i=Ve(import.meta.url),p=H(s).reduce((l,g)=>{const u=i(Je(e,g));return A(l,u)},{});o=A(o,p)}return o=A({branches:void 0,ci:void 0,debug:!1,deps:{bump:"override",prefix:"",release:"patch"},dryRun:void 0,firstParent:!1,ignorePackages:[],ignorePrivate:!0,logLevel:"info",sequentialInit:!1,sequentialPrepare:!0,silent:!1,tagFormat:"${name}@${version}"},o),A(o,t)},{Signale:Ft}=ce,Lt=async({cwd:e,env:t,stderr:r,stdout:s},a)=>{try{const o=new pe,i=new Ft({stream:o});return await Ie({cwd:e,env:t,logger:i,stderr:r,stdout:s},a)}catch(o){throw v.failure("Error in semantic-release getConfig(): %0",o),o}};class oe extends le{_stream;_scope;constructor(t,r){super(),k(r,"scope: string"),k(t,"stream: stream"),this._stream=t,this._scope=r}write(t){return k(t,"msg: string"),this._stream.write(t.replace("[semantic-release]",`[${this._scope}]`))}}const Wt=/^git:\/\//u,we=e=>e&&(e.startsWith("git+")?e.slice(4):e.startsWith("git://")?e.replace(Wt,"https://"):e),zt=async(e,{cwd:t,env:r,globalOptions:s,inputOptions:a,stderr:o,stdout:i})=>{e=D(e,t);const p=Te(e),l=ge(e),{name:g}=l,u=Object.keys({...l.dependencies,...l.devDependencies,...l.peerDependencies,...l.optionalDependencies}),f=await ye(p),d={...s,...f,...a};if(!d.repositoryUrl&&l.repository){let c;typeof l.repository=="string"?c=l.repository:typeof l.repository=="object"&&l.repository!==null&&"url"in l.repository&&(c=l.repository.url),c&&(d.repositoryUrl=we(c))}const n=Object.fromEntries(Object.entries(r).filter(([,c])=>c!==void 0).map(([c,h])=>[c,String(h)])),{options:b,plugins:w}=await Lt({cwd:p,env:n,stderr:o,stdout:i},d);return{deps:u,dir:p,localDeps:[],manifest:l,name:g,options:b,path:e,plugins:w}},Ut=async(e,t,r,s)=>{const{dir:a,name:o,options:i}=e,{env:p,stderr:l,stdout:g}=r,u=t(e),f={...i,...u},d={name:o,version:"${version}"},n="${name}@${version}";return f.tagFormat=Me(s.tagFormat??n)(d),f.debug=s.debug,f.dryRun=s.dryRun??f.dryRun,f.ci=s.ci??f.ci,f.branches=s.branches?H(s.branches):f.branches,f._pkgOptions=i,f.repositoryUrl&&typeof f.repositoryUrl=="string"&&(f.repositoryUrl=we(f.repositoryUrl)),e.result=await Ce(f,{cwd:a,env:p,stderr:new oe(l,o),stdout:new oe(g,o)}),e},dr=async(e,t={},{cwd:r=process.cwd(),env:s=process.env,stderr:a=process.stderr,stdout:o=process.stdout}={},i={})=>{e&&k(e,"paths: string[]"),k(r,"cwd: directory"),k(s,"env: objectlike"),k(o,"stdout: stream"),k(a,"stderr: stream"),r=D(r);const p=await Ht(r,i),l={deps:{},...p,...i};if(v.config.stdio=[a,o],v.config.level=l.logLevel,l.silent&&(v.config.level="silent"),l.debug){v.config.level="debug";const c=s.DEBUG?`,${s.DEBUG}`:"";V.enable(`msr:*,semantic-release:*${c}`)}v.info(`multi-semantic-release version: ${Ke.version}`),v.info(`semantic-release version: ${Ne.version}`),l.debug&&v.info(`flags: ${JSON.stringify(l,null,2)}`);const g=await ye(r),u={cwd:r,env:s,globalOptions:g,inputOptions:t,stderr:a,stdout:o},{packages:f,queue:d}=await Se({cwd:r,filter:(c=>{const{manifest:h}=c;return(!l.ignorePrivate||!h.private)&&(e?e.includes(c.manifestAbsPath)||e.includes(c.manifestRelPath):!0)}),workspacesExtra:Array.isArray(l.ignorePackages)?l.ignorePackages.map(c=>`!${c}`):[]});e??=Object.values(f).map(c=>c.manifestPath),v.complete(`Started multirelease! Loading ${String(e.length)} packages...`);const n=(await Promise.all(e.map(c=>zt(c,u)))).filter(c=>c!==void 0);n.forEach(c=>{c.localDeps=[...new Set(c.deps.map(h=>n.find(y=>h===y.name)).filter(Boolean))],v.success(`Loaded package ${c.name}`)}),v.complete(`Queued ${String(d.length)} packages! Starting release...`);const b=qt(n,u,l),w=await d.reduce(async(c,h)=>{const y=await c,m=n.find(({name:_})=>_===h);if(m){const{result:_}=await Ut(m,b,u,l);if(_)return y+1}return y},Promise.resolve(0));return v.complete(`Released ${String(w)} of ${String(d.length)} packages, semantically!`),Pe(n,({name:c})=>d.indexOf(c))};export{v as d,dr as q};