mejora 2.0.0 → 2.0.1

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.
Files changed (3) hide show
  1. package/README.md +11 -9
  2. package/dist/run.mjs +13 -16
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -182,24 +182,26 @@ If there is any difference between the committed baseline and the expected resul
182
182
 
183
183
  ## Merge Conflicts
184
184
 
185
- `mejora` automatically resolves conflicts in both `baseline.json` and `baseline.md`:
185
+ `mejora` can automatically resolve merge conflicts in both `baseline.json` and `baseline.md`.
186
+
187
+ After merging branches, you may see conflicts like:
186
188
 
187
189
  ```bash
188
- # After merging branches with baseline changes
189
190
  $ git status
190
- both modified: .mejora/baseline.json
191
- both modified: .mejora/baseline.md
191
+ both modified: .mejora/baseline.json
192
+ both modified: .mejora/baseline.md
193
+ ```
194
+
195
+ Instead of resolving these by hand, simply run `mejora`:
192
196
 
193
- # Just run mejora - both files are auto-resolved
197
+ ```bash
194
198
  $ mejora
195
199
  Merge conflict detected in baseline, auto-resolving...
196
200
  ✔ Baseline conflict resolved
197
-
198
- # Commit the resolved files
199
- $ git add .mejora/
200
- $ git commit -m "Merge feature branch"
201
201
  ```
202
202
 
203
+ `mejora` reconciles both sides of the conflict and regenerates a consistent baseline.
204
+
203
205
  ## Credits
204
206
 
205
207
  - `mejora` is inspired by [betterer](https://phenomnomnominal.github.io/betterer/).
package/dist/run.mjs CHANGED
@@ -1,25 +1,22 @@
1
1
  #!/usr/bin/env node
2
- import{a as e,c as t,d as n,l as r,n as i,r as a,s as o,u as s}from"./config-qvPknVN-.mjs";import{mkdir as c,readFile as l,writeFile as u}from"node:fs/promises";import*as d from"node:util";import{inspect as f,parseArgs as p,styleText as m}from"node:util";import{env as h}from"node:process";function g(e,t){if(!(e===void 0||t===0))return e/t}function ee(e){let{results:t,totalDuration:n}=e,r=t.length,i=[],a=[],o=[],s=[],c=0,l=0,u=0,d=0,f=0,p=[];for(let e of t){let t=e.snapshot.items.length;f+=t,e.isInitial?(u+=t,o.push(e.checkId)):(e.hasImprovement&&(c+=e.removedItems.length,i.push(e.checkId)),e.hasRegression&&(l+=e.newItems.length,a.push(e.checkId)),!e.hasImprovement&&!e.hasRegression&&(d+=t,s.push(e.checkId))),p.push({checkId:e.checkId,duration:e.duration,hasImprovement:e.hasImprovement,hasRegression:e.hasRegression,isInitial:e.isInitial,newItems:e.newItems,removedItems:e.removedItems,totalIssues:t})}let m={checks:p,exitCode:e.exitCode,hasImprovement:e.hasImprovement,hasRegression:e.hasRegression,summary:{avgDuration:g(n,r),checksRun:r,improvementChecks:i,improvements:c,initial:u,initialChecks:o,regressionChecks:a,regressions:l,totalIssues:f,unchanged:d,unchangedChecks:s},totalDuration:n};return JSON.stringify(m,null,2)}const _=e=>t=>m(e,typeof t==`number`?t.toString():t),v=_(`blue`),y=_(`bold`),te=_(`cyan`),b=_(`dim`),x=_(`green`),S=_(`red`),ne=_(`gray`),re=_(`underline`);function ie(e){if(e<1e3)return`${e}ms`;let t=e/1e3;if(t<60)return t%1==0?`${t}s`:`${t.toFixed(1)}s`;let n=e/6e4;if(n<60)return n%1==0?`${n}m`:`${n.toFixed(1)}m`;let r=e/36e5;return r%1==0?`${r}h`:`${r.toFixed(1)}h`}function C(e){let t=Math.round(e);return t<1?`<1ms`:ie(t)}function w(e,t){return e===1?t:`${t}s`}const T=` `,ae=`${T} `;function oe(e){return e===`initial`?b(`→`):e===`improvement`?x(`↑`):S(`↓`)}function se(e,t,n){let i=s(e),a=r(e),o=t>0?`:${t}:${n>0?n:1}`:``;return`${i===`.`?``:b(`${i}/`)}${re(a)}${o?b(o):``}`}function ce(e,t){return[`${oe(t)} ${se(e.file,e.line,e.column)} ${b(e.rule)}`,e.message]}function E(e,t){let n=[],r=e.slice(0,10);for(let e of r){let[r,i]=ce(e,t);n.push(`${T}${r}`,`${ae}${i}`)}let i=e.length-r.length;return i>0&&n.push(`${T}${b(`... and ${i} more`)}`),n}function le(e){return e===void 0?[]:[` ${b(`Duration`)} ${C(e)}`]}function ue(e){return[` ${b(`Issues`)} ${y(e)}`]}function D(e){return[...le(e.duration),...ue(e.snapshot.items.length)]}function de(e){if(!e.hasRegression)return[];let t=e.newItems.length;return[` ${S(t)} new ${w(t,`issue`)} (${w(t,`regression`)}):`,...E(e.newItems,`regression`)]}function fe(e){if(!e.hasImprovement)return[];let t=e.removedItems.length;return[` ${x(t)} ${w(t,`issue`)} fixed (${w(t,`improvement`)}):`,...E(e.removedItems,`improvement`)]}function pe(e,t){let n=t?``:`
3
- `,r=e.snapshot.items.length,i=[`${n}${e.checkId}:`,` Initial baseline created with ${v(r)} ${w(r,`issue`)}`];return e.snapshot.items.length>0&&i.push(...E(e.snapshot.items,`initial`)),i.push(``,...D(e)),i}function O(e,t){return[`${t?``:`
4
- `}${e.checkId}:`,...de(e),...fe(e),``,...D(e)]}function me(e,t){let n=t?``:`
5
- `,r=e.snapshot.items.length;return e.duration===void 0?[`${n}${e.checkId} (${y(r)})`]:[`${n}${e.checkId} (${y(r)}) ${b(C(e.duration))}`]}function he(e,t){return e.isInitial?pe(e,t):e.hasRegression||e.hasImprovement?O(e,t):me(e,t)}function ge(e,t){return t?v(`✔ Initial baseline created successfully`):e.hasRegression?`${S(`✗ Regressions detected`)} - Run failed`:e.hasImprovement?`${x(`✔ Improvements detected`)} - Baseline updated`:x(`✔ All checks passed`)}function _e(e){let t={hasAnyInitial:!1,totalImprovements:0,totalInitial:0,totalIssues:0,totalRegressions:0};for(let n of e.results){let e=n.snapshot.items.length;if(t.totalIssues+=e,n.isInitial){t.hasAnyInitial=!0,t.totalInitial+=e;continue}let{hasImprovement:r,hasRegression:i}=n;r&&(t.totalImprovements+=n.removedItems.length),i&&(t.totalRegressions+=n.newItems.length)}let n=[` ${b(`Improvements`)} ${x(t.totalImprovements)}`,` ${b(`Regressions`)} ${S(t.totalRegressions)}`,` ${b(`Initial`)} ${v(t.totalInitial)}`,` ${b(`Checks`)} ${e.results.length}`,` ${b(`Issues`)} ${y(t.totalIssues)}`],r=g(e.totalDuration,e.results.length);return e.totalDuration!==void 0&&r!==void 0&&n.push(` ${b(`Duration`)} ${C(e.totalDuration)} ${ne(`(avg ${C(r)})`)}`),n.push(``,ge(e,t.hasAnyInitial)),n.join(`
6
- `)}function ve(e){let t=[];for(let[n,r]of e.results.entries())t.push(...he(r,n===0));return t.length>0&&t.push(``),t.push(_e(e)),t.join(`
7
- `)}const k=e=>e in h&&h[e]!==`0`&&h[e]!==`false`;var A=k(`CI`)||k(`CONTINUOUS_INTEGRATION`);const ye=[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`],j=`\x1B[?25h`,M=`\r\x1B[K`,be={succeed:`✔`,fail:`✖`,warn:`!`,info:`ℹ`},N={succeed:`green`,fail:`red`,warn:`yellow`,info:`blue`,spinner:`cyan`},xe=[[768,879],[1155,1158],[1160,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1536,1539],[1552,1557],[1611,1630],[1648,1648],[1750,1764],[1767,1768],[1770,1773],[1807,1807],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2305,2306],[2364,2364],[2369,2376],[2381,2381],[2385,2388],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2672,2673],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2817,2817],[2876,2876],[2879,2879],[2881,2883],[2893,2893],[2902,2902],[2946,2946],[3008,3008],[3021,3021],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3393,3395],[3405,3405],[3530,3530],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3769],[3771,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3984,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4146],[4150,4151],[4153,4153],[4184,4185],[4448,4607],[4959,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6157],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7616,7626],[7678,7679],[8203,8207],[8234,8238],[8288,8291],[8298,8303],[8400,8431],[12330,12335],[12441,12442],[43014,43014],[43019,43019],[43045,43046],[64286,64286],[65024,65039],[65056,65059],[65279,65279],[65529,65531],[68097,68099],[68101,68102],[68108,68111],[68152,68154],[68159,68159],[119143,119145],[119155,119170],[119173,119179],[119210,119213],[119362,119364],[917505,917505],[917536,917631],[917760,917999]],P=/(?:\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F)(?:\u200d(?:\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F))*/uy,F=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/y,I=/\p{M}+/uy;function Se(e,t){let n=0,r,i=t.length-1;if(e<t[0][0]||e>t[i][1])return!1;for(;i>=n;)if(r=Math.floor((n+i)/2),e>t[r][1])n=r+1;else if(e<t[r][0])i=r-1;else return!0;return!1}function Ce(e){return e===0||e<32||e>=127&&e<160||Se(e,xe)?0:e>=4352&&(e<=4447||e==9001||e==9002||e>=11904&&e<=42191&&e!=12351||e>=44032&&e<=55203||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65135||e>=65280&&e<=65376||e>=65504&&e<=65510||e>=131072&&e<=196605||e>=196608&&e<=262141)?2:1}function we(e){let t=0,n=0;for(let r=0;r<e.length;r++){if(n=e[r].charCodeAt(0),n>=32&&n<127){t++;continue}if(F.lastIndex=r,F.test(e)){r=F.lastIndex-1;continue}if(P.lastIndex=r,P.test(e)){r=P.lastIndex-1,t+=2;continue}if(I.lastIndex=r,I.test(e)){r=I.lastIndex-1;continue}t+=Ce(n)}return t}function Te(e,t){let n=e.split(`
8
- `).length;if(t===1/0)return n;for(let r of e.split(`
9
- `))n+=Math.max(Math.ceil(we(r)/t)-1,0);return n}var Ee=class{text;onChange;onFinish;finished=!1;newLineEnding=!0;constructor(e){this.text=e}setText(e){this.text=e,typeof this.onChange==`function`&&this.onChange()}finish(){!this.finished&&typeof this.onFinish==`function`&&this.onFinish(),this.finished=!0}output(){return this.text}disableNewLineEnding(){this.newLineEnding=!1}};const L=new class{hideCursor;components=[];lastLinesAmt=0;terminalWidth=1/0;finishedComponents=0;outputBuffer=``;constructor(e=!0){this.hideCursor=e}addComponent(e){this.components.push(e),e.onChange=this.render.bind(this),e.onFinish=this.onComponentFinish.bind(this),process.stdout.getWindowSize&&(this.terminalWidth=process.stdout.getWindowSize()[0]),this.render()}onComponentFinish(){this.finishedComponents++,this.finishedComponents===this.components.length&&(this._reset(),process.stdout.write(j))}removeComponent(e){this.components=this.components.filter(t=>t!==e),e.onChange=void 0,e.finished&&this.finishedComponents--,this.render()}render(){if(this.outputBuffer=``,this.clear(),this.components.length===0){process.stdout.write(this.outputBuffer),this.hideCursor&&process.stdout.write(j),this.lastLinesAmt=0;return}this.hideCursor&&(this.outputBuffer+=`\x1B[?25l`);let e=``,t=!0;for(let n=0;n<this.components.length;n++){let r=this.components[n];e+=r.output()+(n!==this.components.length-1||r.newLineEnding?`
10
- `:``),r.finished||(t=!1)}this.lastLinesAmt=Te(e,this.terminalWidth),this.outputBuffer+=e,t&&(this._reset(),this.outputBuffer+=j),process.stdout.write(this.outputBuffer)}clear(){for(let e=0;e<this.lastLinesAmt-1;e++)this.outputBuffer+=M+`\x1B[1A`;this.outputBuffer+=M}_reset(){this.components=[],this.lastLinesAmt=0,this.terminalWidth=1/0,this.finishedComponents=0}};var De=class{running=!1;text=``;currentSymbol;symbolFormatter;interval;frameIndex=0;symbols;frames;component=new Ee(``);colors;constructor(e=``,{disableNewLineEnding:t,colors:n,frames:r=ye,symbols:i={}}={}){this.symbols={...be,...i},typeof n==`object`?this.colors={...N,...n}:n!==!1&&(this.colors=N),t===!0&&this.component.disableNewLineEnding(),typeof e==`string`&&(e={text:e}),delete e.symbol,this.setDisplay(e,!1),this.frames=r,this.currentSymbol=r[0]}start(e=50){if(this.running)throw Error(`Spinner is already running.`);this.component.finished&&(this.component.finished=!1),this.interval=setInterval(this.tick.bind(this),e),this.running=!0,this.currentSymbol=this.frames[0],this.tick(),L.addComponent(this.component),this.addListeners()}tick(){this.currentSymbol=this.format(this.frames[this.frameIndex++],`spinner`),this.frameIndex===this.frames.length&&(this.frameIndex=0),this.refresh()}onProcessExit=e=>{this.stop();let t;t=e===`SIGTERM`?143:e===`SIGINT`?130:Number(e),process.exit(t)};addListeners(){process.once(`SIGTERM`,this.onProcessExit),process.once(`SIGINT`,this.onProcessExit),process.once(`exit`,this.onProcessExit)}clearListeners(){process.off(`SIGTERM`,this.onProcessExit),process.off(`SIGINT`,this.onProcessExit),process.off(`exit`,this.onProcessExit)}refresh(){let e=this.currentSymbol;this.symbolFormatter&&(e=this.symbolFormatter(e));let t=(e?e+` `:``)+this.text;this.component.setText(t)}setDisplay(e={},t=!0){typeof e.symbol==`string`&&(typeof e.symbolType==`string`?this.currentSymbol=this.format(e.symbol,e.symbolType):this.currentSymbol=e.symbol),typeof e.text==`string`&&this.setText(e.text,!1),e.symbolFormatter&&(this.symbolFormatter=e.symbolFormatter),t&&this.refresh(),typeof e.symbol==`string`&&this.end()}setText(e,t=!0){this.text=this.format(e,`text`),this.running&&t&&this.refresh()}succeed(e){typeof e==`string`?this.setDisplay({text:e,symbol:this.symbols.succeed,symbolType:`succeed`}):this.setDisplay({...e,symbol:this.symbols.succeed,symbolType:`succeed`})}fail(e){typeof e==`string`?this.setDisplay({text:e,symbol:this.symbols.fail,symbolType:`fail`}):this.setDisplay({...e,symbol:this.symbols.fail,symbolType:`fail`})}warn(e){typeof e==`string`?this.setDisplay({text:e,symbol:this.symbols.warn,symbolType:`warn`}):this.setDisplay({...e,symbol:this.symbols.warn,symbolType:`warn`})}info(e){typeof e==`string`?this.setDisplay({text:e,symbol:this.symbols.info,symbolType:`info`}):this.setDisplay({...e,symbol:this.symbols.info,symbolType:`info`})}stop(){this.end(!1)}end(e=!0){clearInterval(this.interval),this.clearListeners(),e?this.component.finish():L.removeComponent(this.component),this.running=!1}format(e,t){if(this.colors===void 0)return e;let n=this.colors[t];return n&&d.styleText!==void 0?d.styleText(n,e):e}};function Oe(e){try{return JSON.parse(e)}catch{return}}function R(e){let t=e.trim();return t.endsWith(`,`)?t.slice(0,-1):t}function ke(e,t){let n=e;for(let e=0;e<t;e++){let e=n.trimEnd();if(!e.endsWith(`}`))break;n=e.slice(0,-1)}return n}function Ae(e,t){return`${e}${`
11
- }`.repeat(t)}`}function je(e){let t=0;for(let n of e)n===`{`?t++:n===`}`&&t--;return t===0?e:t<0?ke(e,-t):Ae(e,t)}function Me(e){return`{
2
+ import{a as e,c as t,d as n,l as r,n as i,r as a,s as o,u as s}from"./config-qvPknVN-.mjs";import{mkdir as c,readFile as l,writeFile as u}from"node:fs/promises";import{inspect as d,parseArgs as f,styleText as p}from"node:util";import{env as m}from"node:process";function h(e,t){if(!(e===void 0||t===0))return e/t}function ee(e){let{results:t,totalDuration:n}=e,r=t.length,i=[],a=[],o=[],s=[],c=0,l=0,u=0,d=0,f=0,p=[];for(let e of t){let t=e.snapshot.items.length;f+=t,e.isInitial?(u+=t,o.push(e.checkId)):(e.hasImprovement&&(c+=e.removedItems.length,i.push(e.checkId)),e.hasRegression&&(l+=e.newItems.length,a.push(e.checkId)),!e.hasImprovement&&!e.hasRegression&&(d+=t,s.push(e.checkId))),p.push({checkId:e.checkId,duration:e.duration,hasImprovement:e.hasImprovement,hasRegression:e.hasRegression,isInitial:e.isInitial,newItems:e.newItems,removedItems:e.removedItems,totalIssues:t})}let m={checks:p,exitCode:e.exitCode,hasImprovement:e.hasImprovement,hasRegression:e.hasRegression,summary:{avgDuration:h(n,r),checksRun:r,improvementChecks:i,improvements:c,initial:u,initialChecks:o,regressionChecks:a,regressions:l,totalIssues:f,unchanged:d,unchangedChecks:s},totalDuration:n};return JSON.stringify(m,null,2)}const g=e=>t=>p(e,typeof t==`number`?t.toString():t),_=g(`blue`),v=g(`bold`),y=g(`cyan`),b=g(`dim`),x=g(`green`),S=g(`red`),C=g(`gray`),w=g(`underline`);function te(e){if(e<1e3)return`${e}ms`;let t=e/1e3;if(t<60)return t%1==0?`${t}s`:`${t.toFixed(1)}s`;let n=e/6e4;if(n<60)return n%1==0?`${n}m`:`${n.toFixed(1)}m`;let r=e/36e5;return r%1==0?`${r}h`:`${r.toFixed(1)}h`}function T(e){let t=Math.round(e);return t<1?`<1ms`:te(t)}function E(e,t){return e===1?t:`${t}s`}const D=` `,ne=`${D} `;function re(e){return e===`initial`?b(`→`):e===`improvement`?x(`↑`):S(`↓`)}function ie(e,t,n){let i=s(e),a=r(e),o=t>0?`:${t}:${n>0?n:1}`:``;return`${i===`.`?``:b(`${i}/`)}${w(a)}${o?b(o):``}`}function ae(e,t){return[`${re(t)} ${ie(e.file,e.line,e.column)} ${b(e.rule)}`,e.message]}function O(e,t){let n=[],r=e.slice(0,10);for(let e of r){let[r,i]=ae(e,t);n.push(`${D}${r}`,`${ne}${i}`)}let i=e.length-r.length;return i>0&&n.push(`${D}${b(`... and ${i} more`)}`),n}function oe(e){return e===void 0?[]:[` ${b(`Duration`)} ${T(e)}`]}function se(e){return[` ${b(`Issues`)} ${v(e)}`]}function k(e){return[...oe(e.duration),...se(e.snapshot.items.length)]}function ce(e){if(!e.hasRegression)return[];let t=e.newItems.length;return[` ${S(t)} new ${E(t,`issue`)} (${E(t,`regression`)}):`,...O(e.newItems,`regression`)]}function le(e){if(!e.hasImprovement)return[];let t=e.removedItems.length;return[` ${x(t)} ${E(t,`issue`)} fixed (${E(t,`improvement`)}):`,...O(e.removedItems,`improvement`)]}function ue(e,t){let n=t?``:`
3
+ `,r=e.snapshot.items.length,i=[`${n}${_(`ℹ`)} ${e.checkId}:`,` Initial baseline created with ${_(r)} ${E(r,`issue`)}`];return e.snapshot.items.length>0&&i.push(...O(e.snapshot.items,`initial`)),i.push(``,...k(e)),i}function de(e,t){return[`${t?``:`
4
+ `}${e.hasRegression?S(`✖`):x(`✔`)} ${e.checkId}:`,...ce(e),...le(e),``,...k(e)]}function fe(e,t){let n=t?``:`
5
+ `,r=e.snapshot.items.length;return e.duration===void 0?[`${n}${C(`ℹ`)} ${e.checkId} (${v(r)})`]:[`${n}${C(`ℹ`)} ${e.checkId} (${v(r)}) ${b(T(e.duration))}`]}function pe(e,t){return e.isInitial?ue(e,t):e.hasRegression||e.hasImprovement?de(e,t):fe(e,t)}function me(e,t){return t?_(`✔ Initial baseline created successfully`):e.hasRegression?`${S(`✗ Regressions detected`)} - Run failed`:e.hasImprovement?`${x(`✔ Improvements detected`)} - Baseline updated`:x(`✔ All checks passed`)}function he(e){let t={hasAnyInitial:!1,totalImprovements:0,totalInitial:0,totalIssues:0,totalRegressions:0};for(let n of e.results){let e=n.snapshot.items.length;if(t.totalIssues+=e,n.isInitial){t.hasAnyInitial=!0,t.totalInitial+=e;continue}let{hasImprovement:r,hasRegression:i}=n;r&&(t.totalImprovements+=n.removedItems.length),i&&(t.totalRegressions+=n.newItems.length)}let n=[` ${b(`Improvements`)} ${x(t.totalImprovements)}`,` ${b(`Regressions`)} ${S(t.totalRegressions)}`,` ${b(`Initial`)} ${_(t.totalInitial)}`,` ${b(`Checks`)} ${e.results.length}`,` ${b(`Issues`)} ${v(t.totalIssues)}`],r=h(e.totalDuration,e.results.length);return e.totalDuration!==void 0&&r!==void 0&&n.push(` ${b(`Duration`)} ${T(e.totalDuration)} ${C(`(avg ${T(r)})`)}`),n.push(``,me(e,t.hasAnyInitial)),n.join(`
6
+ `)}function A(e){let t=[];for(let[n,r]of e.results.entries())t.push(...pe(r,n===0));return t.length>0&&t.push(``),t.push(he(e)),t.join(`
7
+ `)}const j=e=>e in m&&m[e]!==`0`&&m[e]!==`false`;var M=j(`CI`)||j(`CONTINUOUS_INTEGRATION`);function N(e){try{return JSON.parse(e)}catch{return}}function P(e){let t=e.trim();return t.endsWith(`,`)?t.slice(0,-1):t}function F(e,t){let n=e;for(let e=0;e<t;e++){let e=n.trimEnd();if(!e.endsWith(`}`))break;n=e.slice(0,-1)}return n}function I(e,t){return`${e}${`
8
+ }`.repeat(t)}`}function L(e){let t=0;for(let n of e)n===`{`?t++:n===`}`&&t--;return t===0?e:t<0?F(e,-t):I(e,t)}function R(e){return`{
12
9
  "version": 2,
13
- ${R(e)}
14
- }`}function z(e){if(typeof e!=`object`||!e)throw TypeError(`Baseline must be an object`);if(`checks`in e&&e.checks&&typeof e.checks==`object`)return{checks:e.checks,version:2};let t={};for(let[n,r]of Object.entries(e))n!==`version`&&(t[n]=r);return{checks:t,version:2}}function B(e){try{let t=Oe(e.trim());if(t)return z(t);let n=Me(je(R(e)));return z(JSON.parse(n))}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to parse baseline during conflict resolution: ${t}`,{cause:e})}}function Ne(e){let t=[...e.matchAll(/<<<<<<< .*\n([\s\S]*?)\n=======\n([\s\S]*?)\n>>>>>>> .*$/gm)];if(t.length===0)throw Error(`Could not parse conflict markers in baseline`);return t.map(([,e=``,t=``])=>({ours:e,theirs:t}))}function Pe(e){let t=new Map;for(let n of e)for(let[e,{items:r=[]}]of Object.entries(n.checks)){if(r.length===0)continue;let n=t.get(e);n||(n=new Map,t.set(e,n));for(let e of r)n.set(e.id,e)}let n={};for(let[e,r]of t)n[e]={items:[...r.values()].toSorted((e,t)=>e.id.localeCompare(t.id)),type:`items`};return{checks:n,version:2}}function V(e){let t=Ne(e),n=[];for(let{ours:e,theirs:r}of t)n.push(B(e),B(r));return Pe(n)}const H=`__unparsable__`;function U(e){return e.replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`[`,`&#91;`).replaceAll(`]`,`&#93;`)}function W(e,t){return n(t,e)}function G(e,t,r){let i=n(t,e);return r?`${i}#L${r}`:i}function K(e,t){return`[${e}](${t})`}function Fe(e,t,n){let r=W(e.file,t),i=G(e.file,n,e.line);return`- ${K(e.line?`Line ${e.line}`:r,i)} - ${`${e.rule}: ${U(e.message)}`}\n`}function Ie(e){let t=Object.groupBy(e,e=>e.file||H);return Object.entries(t).map(([e,t=[]])=>({filePath:e,items:t})).toSorted((e,t)=>e.filePath===H?1:t.filePath===H?-1:e.filePath.localeCompare(t.filePath))}function Le(e){let t=`\n### Other Issues (${e.length})\n\n`;for(let n of e)t+=`- ${n.rule}: ${U(n.message)}\n`;return`${t}\n`}function Re(e,t,n){if(e.filePath===H)return Le(e.items);let r=`\n### ${K(W(e.filePath,t),G(e.filePath,n))} (${e.items.length})\n\n`;for(let i of e.items)r+=Fe(i,t,n);return`${r}\n`}function ze(e,t,n,r){let i=t.length,a=`\n## ${e} (${i} ${w(i,`issue`)})\n\n`;if(t.length===0)return`${a}No issues\n`;let o=Ie(t);for(let e of o)a+=Re(e,n,r);return a}function Be(e){return`${e.replaceAll(/\n{3,}/g,`
10
+ ${P(e)}
11
+ }`}function z(e){if(typeof e!=`object`||!e)throw TypeError(`Baseline must be an object`);if(`checks`in e&&e.checks&&typeof e.checks==`object`)return{checks:e.checks,version:2};let t={};for(let[n,r]of Object.entries(e))n!==`version`&&(t[n]=r);return{checks:t,version:2}}function B(e){try{let t=N(e.trim());if(t)return z(t);let n=R(L(P(e)));return z(JSON.parse(n))}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to parse baseline during conflict resolution: ${t}`,{cause:e})}}function ge(e){let t=[...e.matchAll(/<<<<<<< .*\n([\s\S]*?)\n=======\n([\s\S]*?)\n>>>>>>> .*$/gm)];if(t.length===0)throw Error(`Could not parse conflict markers in baseline`);return t.map(([,e=``,t=``])=>({ours:e,theirs:t}))}function _e(e){let t=new Map;for(let n of e)for(let[e,{items:r=[]}]of Object.entries(n.checks)){if(r.length===0)continue;let n=t.get(e);n||(n=new Map,t.set(e,n));for(let e of r)n.set(e.id,e)}let n={};for(let[e,r]of t)n[e]={items:[...r.values()].toSorted((e,t)=>e.id.localeCompare(t.id)),type:`items`};return{checks:n,version:2}}function ve(e){let t=ge(e),n=[];for(let{ours:e,theirs:r}of t)n.push(B(e),B(r));return _e(n)}const V=`__unparsable__`;function H(e){return e.replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`[`,`&#91;`).replaceAll(`]`,`&#93;`)}function U(e,t){return n(t,e)}function W(e,t,r){let i=n(t,e);return r?`${i}#L${r}`:i}function G(e,t){return`[${e}](${t})`}function ye(e,t,n){let r=U(e.file,t),i=W(e.file,n,e.line);return`- ${G(e.line?`Line ${e.line}`:r,i)} - ${`${e.rule}: ${H(e.message)}`}\n`}function be(e){let t=Object.groupBy(e,e=>e.file||V);return Object.entries(t).map(([e,t=[]])=>({filePath:e,items:t})).toSorted((e,t)=>e.filePath===V?1:t.filePath===V?-1:e.filePath.localeCompare(t.filePath))}function xe(e){let t=`\n### Other Issues (${e.length})\n\n`;for(let n of e)t+=`- ${n.rule}: ${H(n.message)}\n`;return`${t}\n`}function Se(e,t,n){if(e.filePath===V)return xe(e.items);let r=`\n### ${G(U(e.filePath,t),W(e.filePath,n))} (${e.items.length})\n\n`;for(let i of e.items)r+=ye(i,t,n);return`${r}\n`}function Ce(e,t,n,r){let i=t.length,a=`\n## ${e} (${i} ${E(i,`issue`)})\n\n`;if(t.length===0)return`${a}No issues\n`;let o=be(t);for(let e of o)a+=Se(e,n,r);return a}function we(e){return`${e.replaceAll(/\n{3,}/g,`
15
12
 
16
- `).trimEnd()}\n`}function Ve(e,t){let n=process.cwd(),r=`# Mejora Baseline
13
+ `).trimEnd()}\n`}function Te(e,t){let n=process.cwd(),r=`# Mejora Baseline
17
14
 
18
15
  This file represents the current accepted state of the codebase.
19
- `;for(let[i,{items:a=[]}]of Object.entries(e.checks))r+=ze(i,a,n,t);return Be(r)}const He=(e,t)=>{if(!t)return!1;let n=e.items??[],r=t.items??[];if(n.length!==r.length)return!1;let i=n.toSorted((e,t)=>e.id.localeCompare(t.id)),a=r.toSorted((e,t)=>e.id.localeCompare(t.id));return i.every((e,t)=>{let n=a[t];return e.id===n.id&&e.file===n.file&&e.line===n.line&&e.column===n.column&&e.rule===n.rule&&e.message===n.message})};function Ue(e){let t=[e.message];if(e.stack){let n=e.stack.split(`
16
+ `;for(let[i,{items:a=[]}]of Object.entries(e.checks))r+=Ce(i,a,n,t);return we(r)}const Ee=(e,t)=>{if(!t)return!1;let n=e.items??[],r=t.items??[];if(n.length!==r.length)return!1;let i=n.toSorted((e,t)=>e.id.localeCompare(t.id)),a=r.toSorted((e,t)=>e.id.localeCompare(t.id));return i.every((e,t)=>{let n=a[t];return e.id===n.id&&e.file===n.file&&e.line===n.line&&e.column===n.column&&e.rule===n.rule&&e.message===n.message})};function De(e){let t=[e.message];if(e.stack){let n=e.stack.split(`
20
17
  `).slice(1).map(e=>b(e.trim())).join(`
21
18
  `);t.push(n)}return t.join(`
22
- `)}function q(...e){return e.map(e=>typeof e==`string`?e:e instanceof Error?Ue(e):f(e,{colors:!1,depth:10})).join(` `)}const J={error:(...e)=>{console.error(S(`✖`),q(...e))},log:(...e)=>{console.log(q(...e))},start:(...e)=>{console.log(te(`◐`),q(...e))},success:(...e)=>{console.log(x(`✔`),q(...e))}};var Y=class e{baselinePath;constructor(e=`.mejora/baseline.json`){this.baselinePath=e}static create(e){return{checks:e,version:2}}static getEntry(e,t){return e?.checks[t]}static update(t,n,r){let i=t??e.create({}),a=i.checks[n];return He(r,a)?i:{...i,checks:{...i.checks,[n]:r}}}async load(){try{let e=await l(this.baselinePath,`utf8`);if(e.includes(`<<<<<<<`)){J.start(`Merge conflict detected in baseline, auto-resolving...`);let t=V(e);return await this.save(t,!0),J.success(`Baseline conflict resolved`),t}return JSON.parse(e)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async save(e,t=!1){if(A&&!t)return;let n=`${JSON.stringify(e,null,2)}\n`,r=this.baselinePath.replace(`.json`,`.md`),i=Ve(e,s(this.baselinePath));await c(s(this.baselinePath),{recursive:!0}),await Promise.all([u(this.baselinePath,n,`utf8`),u(r,i,`utf8`)])}};function We(){return{hasImprovement:!1,hasRegression:!1,hasRelocation:!1,isInitial:!0,newItems:[],removedItems:[]}}function Ge(e,t,n){return{hasImprovement:t.length>0,hasRegression:e.length>0,hasRelocation:n,isInitial:!1,newItems:e.toSorted((e,t)=>e.id.localeCompare(t.id)),removedItems:t.toSorted((e,t)=>e.id.localeCompare(t.id))}}function X(e=[]){return new Map(e.map(e=>[e.id,e]))}function Z(e){return new Set(e.keys())}function Q(e,t){let n=[];for(let r of t){let t=e.get(r);n.push(t)}return n}function Ke(e,t){for(let[n,r]of e){let e=t.get(n);if(e&&(r.line!==e.line||r.column!==e.column))return!0}return!1}function qe(e,t){let n=X(e.items),r=X(t.items),i=Z(n),a=Z(r),o=i.difference(a),s=a.difference(i);return Ge(Q(n,o),Q(r,s),Ke(n,r))}function Je(e,t){return t?qe(e,t):We()}var Ye=class n{baselineManager;isCI;constructor(e,t=A){this.baselineManager=new Y(e),this.isCI=t}static filterChecks(e,t){let r=t.only?n.resolveRegex(t.only,`--only`):null,i=t.skip?n.resolveRegex(t.skip,`--skip`):null;return!r&&!i?e:Object.fromEntries(Object.entries(e).filter(([e])=>!(r&&!r.test(e)||i?.test(e))))}static resolveRegex(e,t){try{return new RegExp(e)}catch{throw Error(`Invalid regex pattern for ${t}: "${e}"`)}}static async runCheck(n){return n.type===`eslint`?(await t(),o(n)):(await e(),a(n))}async run(e,t={}){let r=performance.now(),i=await this.baselineManager.load(),a=[],o=!1,s=!1,c=!1,l=i,u=n.filterChecks(e.checks,t),d=!t.json&&!this.isCI&&process.stdout.isTTY;for(let[e,f]of Object.entries(u)){let u=d?new De(`Running ${e}...`):null;try{u?u.start():J.start(`Running ${e}...`);let r=performance.now(),d=await n.runCheck(f),p=performance.now()-r,m=Y.getEntry(i,e),h=Je(d,m),g={baseline:m,checkId:e,duration:p,hasImprovement:h.hasImprovement,hasRegression:h.hasRegression,hasRelocation:h.hasRelocation,isInitial:h.isInitial,newItems:h.newItems,removedItems:h.removedItems,snapshot:d};a.push(g),h.hasRegression&&(o=!0),h.hasImprovement&&(s=!0),h.isInitial&&(c=!0),(h.hasImprovement||h.hasRelocation||t.force||h.isInitial)&&(l=Y.update(l,e,{items:d.items,type:d.type})),u?u.succeed(`${e} complete`):J.success(`${e} complete`)}catch(t){return u?u.fail(`${e} failed`):J.error(`${e} failed`),J.error(`Error running check "${e}":`,t),{exitCode:2,hasImprovement:!1,hasRegression:!0,results:a,totalDuration:performance.now()-r}}}l&&l!==i&&(!o||t.force||c)&&await this.baselineManager.save(l,t.force);let f=0;o&&!t.force&&(f=1);let p=performance.now()-r;return{exitCode:f,hasImprovement:s,hasRegression:o,results:a,totalDuration:p}}};const{values:$}=p({allowPositionals:!1,options:{force:{default:!1,short:`f`,type:`boolean`},help:{short:`h`,type:`boolean`},json:{default:!1,type:`boolean`},only:{type:`string`},skip:{type:`string`}},strict:!0});$.help&&(J.log(`
19
+ `)}function K(...e){return e.map(e=>typeof e==`string`?e:e instanceof Error?De(e):d(e,{colors:!1,depth:10})).join(` `)}const q={error:(...e)=>{console.error(S(`✖`),K(...e))},log:(...e)=>{console.log(K(...e))},start:(...e)=>{console.log(y(`◐`),K(...e))},success:(...e)=>{console.log(x(`✔`),K(...e))}};var J=class e{baselinePath;constructor(e=`.mejora/baseline.json`){this.baselinePath=e}static create(e){return{checks:e,version:2}}static getEntry(e,t){return e?.checks[t]}static update(t,n,r){let i=t??e.create({}),a=i.checks[n];return Ee(r,a)?i:{...i,checks:{...i.checks,[n]:r}}}async load(){try{let e=await l(this.baselinePath,`utf8`);if(e.includes(`<<<<<<<`)){q.start(`Merge conflict detected in baseline, auto-resolving...`);let t=ve(e);return await this.save(t,!0),q.success(`Baseline conflict resolved`),t}return JSON.parse(e)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async save(e,t=!1){if(M&&!t)return;let n=`${JSON.stringify(e,null,2)}\n`,r=this.baselinePath.replace(`.json`,`.md`),i=Te(e,s(this.baselinePath));await c(s(this.baselinePath),{recursive:!0}),await Promise.all([u(this.baselinePath,n,`utf8`),u(r,i,`utf8`)])}};function Y(){return{hasImprovement:!1,hasRegression:!1,hasRelocation:!1,isInitial:!0,newItems:[],removedItems:[]}}function Oe(e,t,n){return{hasImprovement:t.length>0,hasRegression:e.length>0,hasRelocation:n,isInitial:!1,newItems:e.toSorted((e,t)=>e.id.localeCompare(t.id)),removedItems:t.toSorted((e,t)=>e.id.localeCompare(t.id))}}function X(e=[]){return new Map(e.map(e=>[e.id,e]))}function Z(e){return new Set(e.keys())}function Q(e,t){let n=[];for(let r of t){let t=e.get(r);n.push(t)}return n}function ke(e,t){for(let[n,r]of e){let e=t.get(n);if(e&&(r.line!==e.line||r.column!==e.column))return!0}return!1}function Ae(e,t){let n=X(e.items),r=X(t.items),i=Z(n),a=Z(r),o=i.difference(a),s=a.difference(i);return Oe(Q(n,o),Q(r,s),ke(n,r))}function je(e,t){return t?Ae(e,t):Y()}var Me=class n{baselineManager;constructor(e){this.baselineManager=new J(e)}static filterChecks(e,t){let r=t.only?n.resolveRegex(t.only,`--only`):null,i=t.skip?n.resolveRegex(t.skip,`--skip`):null;return!r&&!i?e:Object.fromEntries(Object.entries(e).filter(([e])=>!(r&&!r.test(e)||i?.test(e))))}static resolveRegex(e,t){try{return new RegExp(e)}catch{throw Error(`Invalid regex pattern for ${t}: "${e}"`)}}static async runCheck(e){return e.type===`eslint`?o(e):a(e)}static async validateAllDeps(n){let r=new Set(Object.values(n).map(e=>e.type)),i=[];r.has(`eslint`)&&i.push(t()),r.has(`typescript`)&&i.push(e()),await Promise.all(i)}async run(e,t={}){let r=performance.now(),i=await this.baselineManager.load(),a=n.filterChecks(e.checks,t);try{await n.validateAllDeps(a)}catch(e){return q.error(`Dependency validation failed:`,e),{exitCode:2,hasImprovement:!1,hasRegression:!0,results:[],totalDuration:performance.now()-r}}let o=Object.keys(a).length;q.start(`Running ${o} check${o===1?``:`s`}...`);let s=await this.executeChecks(a,i);if(!s)return{exitCode:2,hasImprovement:!1,hasRegression:!0,results:[],totalDuration:performance.now()-r};let{flags:c,results:l,updatedBaseline:u}=this.buildResults(s,i,t);return u&&u!==i&&(!c.hasAnyRegression||t.force||c.hasAnyInitial)&&await this.baselineManager.save(u,t.force),{exitCode:c.hasAnyRegression&&!t.force?1:0,hasImprovement:c.hasAnyImprovement,hasRegression:c.hasAnyRegression,results:l,totalDuration:performance.now()-r}}buildResults(e,t,n){let r=[],i=t,a=!1,o=!1,s=!1;for(let{baselineEntry:t,checkId:c,comparison:l,duration:u,snapshot:d}of e)r.push({baseline:t,checkId:c,duration:u,hasImprovement:l.hasImprovement,hasRegression:l.hasRegression,hasRelocation:l.hasRelocation,isInitial:l.isInitial,newItems:l.newItems,removedItems:l.removedItems,snapshot:d}),l.hasRegression&&(a=!0),l.hasImprovement&&(o=!0),l.isInitial&&(s=!0),(l.hasImprovement||l.hasRelocation||n.force||l.isInitial)&&(i=J.update(i,c,{items:d.items,type:d.type}));return{flags:{hasAnyImprovement:o,hasAnyInitial:s,hasAnyRegression:a},results:r,updatedBaseline:i}}async executeChecks(e,t){let r=Object.entries(e).map(async([e,r])=>{try{let i=performance.now(),a=await n.runCheck(r),o=performance.now()-i,s=J.getEntry(t,e);return{baselineEntry:s,checkId:e,comparison:je(a,s),duration:o,snapshot:a}}catch(t){throw q.error(`Error running check "${e}":`,t),t}});try{return await Promise.all(r)}catch{return null}}};const{values:$}=f({allowPositionals:!1,options:{force:{default:!1,short:`f`,type:`boolean`},help:{short:`h`,type:`boolean`},json:{default:!1,type:`boolean`},only:{type:`string`},skip:{type:`string`}},strict:!0});$.help&&(q.log(`
23
20
  mejora - Prevent regressions by allowing only improvement
24
21
 
25
22
  Usage:
@@ -38,4 +35,4 @@ Examples:
38
35
  mejora --json
39
36
  mejora --only "eslint > *"
40
37
  mejora --skip typescript
41
- `),process.exit(0));try{let e=new Ye,t=await i(),n=await e.run(t,{force:$.force,json:$.json,only:$.only,skip:$.skip});$.json?J.log(ee(n)):(J.log(``),J.log(ve(n))),process.exit(n.exitCode)}catch(e){e instanceof Error?J.error(e.message):J.error(e),process.exit(2)}export{};
38
+ `),process.exit(0));try{let e=new Me,t=await i(),n=await e.run(t,{force:$.force,json:$.json,only:$.only,skip:$.skip});$.json?q.log(ee(n)):(q.log(``),q.log(A(n))),process.exit(n.exitCode)}catch(e){e instanceof Error?q.error(e.message):q.error(e),process.exit(2)}export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mejora",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Prevent regressions. Allow improvement.",
5
5
  "keywords": [
6
6
  "regression",