mejora 1.0.1 → 1.2.0

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/README.md CHANGED
@@ -79,11 +79,11 @@ Create one of:
79
79
  Example:
80
80
 
81
81
  ```ts
82
- import { defineConfig, eslintCheck, typescriptCheck } from "mejora";
82
+ import { defineConfig, eslint, typescript } from "mejora";
83
83
 
84
84
  export default defineConfig({
85
85
  checks: {
86
- "eslint > no-nested-ternary": eslintCheck({
86
+ "eslint > no-nested-ternary": eslint({
87
87
  files: ["src/**/*.{ts,tsx,js,jsx}"],
88
88
  overrides: {
89
89
  rules: {
@@ -91,7 +91,7 @@ export default defineConfig({
91
91
  },
92
92
  },
93
93
  }),
94
- "typescript": typescriptCheck({
94
+ "typescript": typescript({
95
95
  overrides: {
96
96
  compilerOptions: {
97
97
  noImplicitAny: true,
package/dist/index.d.mts CHANGED
@@ -156,4 +156,4 @@ declare function typescriptCheck(config: TypeScriptCheckConfig): {
156
156
  //#region src/config.d.ts
157
157
  declare const defineConfig: (config: Config) => Config;
158
158
  //#endregion
159
- export { type Config, defineConfig, eslintCheck, typescriptCheck };
159
+ export { type Config, defineConfig, eslintCheck as eslint, eslintCheck, typescriptCheck as typescript, typescriptCheck };
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{i as e,o as t,t as n}from"./config-c3IzQqLC.mjs";export{n as defineConfig,t as eslintCheck,e as typescriptCheck};
1
+ import{i as e,o as t,t as n}from"./config-c3IzQqLC.mjs";export{n as defineConfig,t as eslint,t as eslintCheck,e as typescript,e as typescriptCheck};
package/dist/run.mjs CHANGED
@@ -1,19 +1,22 @@
1
1
  #!/usr/bin/env node
2
- import{a as e,c as t,n,r,s as i}from"./config-c3IzQqLC.mjs";import{dirname as a,relative as o}from"node:path";import{inspect as s,parseArgs as c,styleText as l}from"node:util";import{mkdir as u,readFile as d,writeFile as f}from"node:fs/promises";import{env as p}from"node:process";const m=e=>l(`blue`,e),h=e=>l(`bold`,e),g=e=>l(`cyan`,e),_=e=>l(`dim`,e),v=e=>l(`green`,e),y=e=>l(`greenBright`,e),b=e=>l(`red`,e),x=e=>l(`bgRed`,e),S=e=>l(`yellow`,e),C=e=>l(`black`,e);function w(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);if(t<1)return _(`<1ms`);let n=w(t);return t<100?y(n):t<1e3?S(n):b(n)}function E(e){let t={checks:e.results.map(e=>({checkId:e.checkId,duration:e.duration,hasImprovement:e.hasImprovement,hasRegression:e.hasRegression,isInitial:e.isInitial,newItems:e.newItems,removedItems:e.removedItems,totalIssues:e.snapshot.items.length||0})),exitCode:e.exitCode,hasImprovement:e.hasImprovement,hasRegression:e.hasRegression,totalDuration:e.totalDuration};return JSON.stringify(t,null,2)}function D(e,t=10){let n=[],r=e.slice(0,t);for(let e of r)n.push(` ${_(e)}`);let i=e.length-t;return i>0&&n.push(` ${_(`... and ${i} more`)}`),n}function ee(e,t){let n=[`${t?``:`
3
- `}${h(e.checkId)}:`,` Initial baseline created with ${g(e.snapshot.items.length.toString())} issue(s)`];return e.snapshot.items.length>0&&n.push(...D(e.snapshot.items)),e.duration!==void 0&&n.push(` ${_(`Completed in`)} ${T(e.duration)}`),n}function O(e){return e.hasRegression?[` ${b(e.newItems.length.toString())} new issue(s) (regressions):`,...D(e.newItems)]:[]}function k(e){return e.hasImprovement?[` ${y(e.removedItems.length.toString())} issue(s) fixed (improvements):`,...D(e.removedItems)]:[]}function A(e,t){let n=[`${t?``:`
4
- `}${h(e.checkId)}:`,...O(e),...k(e)];return e.duration!==void 0&&n.push(` ${_(`Completed in`)} ${T(e.duration)}`),n}function j(e,t){return e.isInitial?ee(e,t):e.hasRegression||e.hasImprovement?A(e,t):[]}function M(e){let t=e.results.some(e=>e.isInitial),n=[];return t?n.push(m(`Initial baseline created successfully.`)):e.hasRegression?n.push(`${b(`Regressions detected.`)} Run failed.`):e.hasImprovement?n.push(`${y(`Improvements detected.`)} Baseline updated.`):n.push(y(`All checks passed.`)),e.totalDuration!==void 0&&n.push(`${_(`Completed in`)} ${T(e.totalDuration)}`),n.join(`
5
- `)}function N(e){let t=[];for(let n=0;n<e.results.length;n++){let r=e.results[n];t.push(...j(r,n===0))}return t.length>0&&t.push(``),t.push(M(e)),t.join(`
6
- `)}const P=e=>e in p&&p[e]!==`0`&&p[e]!==`false`;var F=P(`CI`)||P(`CONTINUOUS_INTEGRATION`);function I(e,t){let n=e;for(let e=0;e<t&&n.includes(`}`);e++){let e=n.lastIndexOf(`}`);n=n.slice(0,e)+n.slice(e+1)}return n}function L(e,t){return`${e}\n${` }`.repeat(t)}`}function R(e){let t=0,n=0;for(let r of e)r===`{`&&t++,r===`}`&&n++;if(t===n)return e;let r=Math.abs(t-n);return n>t?I(e,r):L(e,r)}function z(e){let t=e.trim();return R(t.endsWith(`,`)?t.slice(0,-1):t)}function B(e){return`{
2
+ import{a as e,c as t,n,r,s as i}from"./config-c3IzQqLC.mjs";import{dirname as a,relative as o}from"node:path";import*as s from"node:util";import{inspect as c,parseArgs as l,styleText as u}from"node:util";import{mkdir as d,readFile as f,writeFile as p}from"node:fs/promises";import{env as m}from"node:process";const h=e=>u(`blue`,e),g=e=>u(`bold`,e),_=e=>u(`cyan`,e),v=e=>u(`dim`,e),ee=e=>u(`green`,e),y=e=>u(`greenBright`,e),b=e=>u(`red`,e),te=e=>u(`bgRed`,e),x=e=>u(`yellow`,e),S=e=>u(`black`,e);function C(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 w(e){let t=Math.round(e);if(t<1)return v(`<1ms`);let n=C(t);return t<100?y(n):t<1e3?x(n):b(n)}function ne(e){let t={checks:e.results.map(e=>({checkId:e.checkId,duration:e.duration,hasImprovement:e.hasImprovement,hasRegression:e.hasRegression,isInitial:e.isInitial,newItems:e.newItems,removedItems:e.removedItems,totalIssues:e.snapshot.items.length||0})),exitCode:e.exitCode,hasImprovement:e.hasImprovement,hasRegression:e.hasRegression,totalDuration:e.totalDuration};return JSON.stringify(t,null,2)}function T(e,t=10){let n=[],r=e.slice(0,t);for(let e of r)n.push(` ${v(e)}`);let i=e.length-t;return i>0&&n.push(` ${v(`... and ${i} more`)}`),n}function re(e,t){let n=[`${t?``:`
3
+ `}${g(e.checkId)}:`,` Initial baseline created with ${_(e.snapshot.items.length.toString())} issue(s)`];return e.snapshot.items.length>0&&n.push(...T(e.snapshot.items)),e.duration!==void 0&&n.push(` ${v(`Completed in`)} ${w(e.duration)}`),n}function ie(e){return e.hasRegression?[` ${b(e.newItems.length.toString())} new issue(s) (regressions):`,...T(e.newItems)]:[]}function ae(e){return e.hasImprovement?[` ${y(e.removedItems.length.toString())} issue(s) fixed (improvements):`,...T(e.removedItems)]:[]}function oe(e,t){let n=[`${t?``:`
4
+ `}${g(e.checkId)}:`,...ie(e),...ae(e)];return e.duration!==void 0&&n.push(` ${v(`Completed in`)} ${w(e.duration)}`),n}function E(e,t){return e.isInitial?re(e,t):e.hasRegression||e.hasImprovement?oe(e,t):[]}function D(e){let t=e.results.some(e=>e.isInitial),n=[];return t?n.push(h(`Initial baseline created successfully.`)):e.hasRegression?n.push(`${b(`Regressions detected.`)} Run failed.`):e.hasImprovement?n.push(`${y(`Improvements detected.`)} Baseline updated.`):n.push(y(`All checks passed.`)),e.totalDuration!==void 0&&n.push(`${v(`Completed in`)} ${w(e.totalDuration)}`),n.join(`
5
+ `)}function O(e){let t=[];for(let n=0;n<e.results.length;n++){let r=e.results[n];t.push(...E(r,n===0))}return t.length>0&&t.push(``),t.push(D(e)),t.join(`
6
+ `)}const k=[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`],A=`\x1B[?25h`,j=`\r\x1B[K`,M={succeed:`✔`,fail:`✖`,warn:`!`,info:`ℹ`},N={succeed:`green`,fail:`red`,warn:`yellow`,info:`blue`,spinner:`cyan`},P=[[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]],F=/(?:\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,I=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/y,L=/\p{M}+/uy;function R(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 z(e){return e===0||e<32||e>=127&&e<160||R(e,P)?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 B(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(I.lastIndex=r,I.test(e)){r=I.lastIndex-1;continue}if(F.lastIndex=r,F.test(e)){r=F.lastIndex-1,t+=2;continue}if(L.lastIndex=r,L.test(e)){r=L.lastIndex-1;continue}t+=z(n)}return t}function V(e,t){let n=e.split(`
7
+ `).length;if(t===1/0)return n;for(let r of e.split(`
8
+ `))n+=Math.max(Math.ceil(B(r)/t)-1,0);return n}var H=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 U=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(A))}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(A),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?`
9
+ `:``),r.finished||(t=!1)}this.lastLinesAmt=V(e,this.terminalWidth),this.outputBuffer+=e,t&&(this._reset(),this.outputBuffer+=A),process.stdout.write(this.outputBuffer)}clear(){for(let e=0;e<this.lastLinesAmt-1;e++)this.outputBuffer+=j+`\x1B[1A`;this.outputBuffer+=j}_reset(){this.components=[],this.lastLinesAmt=0,this.terminalWidth=1/0,this.finishedComponents=0}};var W=class{running=!1;text=``;currentSymbol;symbolFormatter;interval;frameIndex=0;symbols;frames;component=new H(``);colors;constructor(e=``,{disableNewLineEnding:t,colors:n,frames:r=k,symbols:i={}}={}){this.symbols={...M,...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(),U.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():U.removeComponent(this.component),this.running=!1}format(e,t){if(this.colors===void 0)return e;let n=this.colors[t];return n&&s.styleText!==void 0?s.styleText(n,e):e}};const G=e=>e in m&&m[e]!==`0`&&m[e]!==`false`;var K=G(`CI`)||G(`CONTINUOUS_INTEGRATION`);function q(e,t){let n=e;for(let e=0;e<t&&n.includes(`}`);e++){let e=n.lastIndexOf(`}`);n=n.slice(0,e)+n.slice(e+1)}return n}function J(e,t){return`${e}\n${` }`.repeat(t)}`}function se(e){let t=0,n=0;for(let r of e)r===`{`&&t++,r===`}`&&n++;if(t===n)return e;let r=Math.abs(t-n);return n>t?q(e,r):J(e,r)}function ce(e){let t=e.trim();return se(t.endsWith(`,`)?t.slice(0,-1):t)}function le(e){return`{
7
10
  "version": 1,
8
11
  ${e}
9
- }`}function V(e){if(e.checks)return e;let t={};for(let[n,r]of Object.entries(e))n!==`version`&&(t[n]=r);return{checks:t,version:1}}function H(e){try{let t=B(z(e));return V(JSON.parse(t))}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to parse baseline during conflict resolution: ${t}`,{cause:e})}}function U(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 te(e){let t=new Set;for(let n of e)for(let e of Object.keys(n.checks))t.add(e);return t}function W(e,t){let n=new Set;for(let r of e){let e=r.checks[t];if(e?.items)for(let t of e.items)n.add(t)}return[...n].toSorted()}function G(e){let t={checks:{},version:1},n=te(e);for(let r of n)t.checks[r]={items:W(e,r),type:`items`};return t}function K(e){let t=U(e),n=[];for(let{ours:e,theirs:r}of t)n.push(H(e),H(r));return G(n)}function q(e,t){let n=`# Mejora Baseline
12
+ }`}function ue(e){if(e.checks)return e;let t={};for(let[n,r]of Object.entries(e))n!==`version`&&(t[n]=r);return{checks:t,version:1}}function Y(e){try{let t=le(ce(e));return ue(JSON.parse(t))}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to parse baseline during conflict resolution: ${t}`,{cause:e})}}function de(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 fe(e){let t=new Set;for(let n of e)for(let e of Object.keys(n.checks))t.add(e);return t}function pe(e,t){let n=new Set;for(let r of e){let e=r.checks[t];if(e?.items)for(let t of e.items)n.add(t)}return[...n].toSorted()}function me(e){let t={checks:{},version:1},n=fe(e);for(let r of n)t.checks[r]={items:pe(e,r),type:`items`};return t}function he(e){let t=de(e),n=[];for(let{ours:e,theirs:r}of t)n.push(Y(e),Y(r));return me(n)}function ge(e,t){let n=`# Mejora Baseline
10
13
 
11
14
  `,r=Object.entries(e.checks);for(let e=0;e<r.length;e++){let[i,{items:a=[]}]=r[e],s=e===r.length-1;if(n+=`## ${i}\n\n`,a.length===0)n+=`No issues
12
15
  `;else for(let e of a){let[r,...i]=e.split(` - `),a=r?.split(`:`),s=a?.[0],c=a?.[1];if(s){let e=o(t,s),a=c?`${e}#L${c}`:e,l=i.length>0?` - ${i.join(` - `)}`:``;n+=`- [${r}](${a})${l}\n`}}s||(n+=`
13
- `)}return n}const J=(e,t)=>{if(!t)return!1;let n=e.items??[],r=t.items??[];if(n.length!==r.length)return!1;let i=n.toSorted(),a=r.toSorted();return i.every((e,t)=>e===a[t])};function Y(e){let t=[e.message];if(e.stack){let n=e.stack.split(`
14
- `).slice(1).map(e=>_(e.trim())).join(`
16
+ `)}return n}const _e=(e,t)=>{if(!t)return!1;let n=e.items??[],r=t.items??[];if(n.length!==r.length)return!1;let i=n.toSorted(),a=r.toSorted();return i.every((e,t)=>e===a[t])};function ve(e){let t=[e.message];if(e.stack){let n=e.stack.split(`
17
+ `).slice(1).map(e=>v(e.trim())).join(`
15
18
  `);t.push(n)}return t.join(`
16
- `)}function X(...e){return e.map(e=>typeof e==`string`?e:e instanceof Error?Y(e):s(e,{colors:!1,depth:10})).join(` `)}const Z={error:(...e)=>{console.error(x(C(` ERROR `)),X(...e))},log:(...e)=>{console.log(X(...e))},start:(...e)=>{console.log(g(`◐`),X(...e))},success:(...e)=>{console.log(v(`✔`),X(...e))}};var Q=class e{baselinePath;constructor(e=`.mejora/baseline.json`){this.baselinePath=e}static create(e){return{checks:e,version:1}}static getEntry(e,t){return e?.checks[t]}static update(t,n,r){let i=t??e.create({}),a=i.checks[n];return J(r,a)?i:{...i,checks:{...i.checks,[n]:r}}}async load(){try{let e=await d(this.baselinePath,`utf8`);if(e.includes(`<<<<<<<`)){Z.start(`Merge conflict detected in baseline, auto-resolving...`);let t=K(e);return await this.save(t,!0),Z.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(F&&!t)return;let n=`${JSON.stringify(e,null,2)}\n`,r=this.baselinePath.replace(`.json`,`.md`),i=q(e,a(this.baselinePath));await u(a(this.baselinePath),{recursive:!0}),await Promise.all([f(this.baselinePath,n,`utf8`),f(r,i,`utf8`)])}};function ne(){return{hasImprovement:!1,hasRegression:!1,isInitial:!0,newItems:[],removedItems:[]}}function re(e,t){return{hasImprovement:t.length>0,hasRegression:e.length>0,isInitial:!1,newItems:e.toSorted(),removedItems:t.toSorted()}}function ie(e,t){let n=[];for(let r of e)t.has(r)||n.push(r);return n}function ae(e,t){let n=[];for(let r of t)e.has(r)||n.push(r);return n}function oe(e,t){let n=new Set(e.items),r=new Set(t.items);return re(ie(n,r),ae(n,r))}function se(e,t){return t?oe(e,t):ne()}var ce=class n{baselineManager;constructor(e){this.baselineManager=new Q(e)}static filterChecks(e,t){let r={...e};if(t.only){let e=n.resolveRegex(t.only,`--only`);r=Object.fromEntries(Object.entries(r).filter(([t])=>e.test(t)))}if(t.skip){let e=n.resolveRegex(t.skip,`--skip`);r=Object.fromEntries(Object.entries(r).filter(([t])=>!e.test(t)))}return r}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(),i(n)):(await e(),r(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);for(let[e,d]of Object.entries(u))try{let r=performance.now(),u=await n.runCheck(d),f=performance.now()-r,p=Q.getEntry(i,e),m=se(u,p),h={baseline:p,checkId:e,duration:f,hasImprovement:m.hasImprovement,hasRegression:m.hasRegression,isInitial:m.isInitial,newItems:m.newItems,removedItems:m.removedItems,snapshot:u};a.push(h),m.hasRegression&&(o=!0),m.hasImprovement&&(s=!0),m.isInitial&&(c=!0),(m.hasImprovement||t.force||m.isInitial)&&(l=Q.update(l,e,{items:u.items,type:u.type}))}catch(t){return Z.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 d=0;o&&!t.force&&(d=1);let f=performance.now()-r;return{exitCode:d,hasImprovement:s,hasRegression:o,results:a,totalDuration:f}}};const{values:$}=c({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&&(Z.log(`
19
+ `)}function X(...e){return e.map(e=>typeof e==`string`?e:e instanceof Error?ve(e):c(e,{colors:!1,depth:10})).join(` `)}const Z={error:(...e)=>{console.error(te(S(` ERROR `)),X(...e))},log:(...e)=>{console.log(X(...e))},start:(...e)=>{console.log(_(`◐`),X(...e))},success:(...e)=>{console.log(ee(`✔`),X(...e))}};var Q=class e{baselinePath;constructor(e=`.mejora/baseline.json`){this.baselinePath=e}static create(e){return{checks:e,version:1}}static getEntry(e,t){return e?.checks[t]}static update(t,n,r){let i=t??e.create({}),a=i.checks[n];return _e(r,a)?i:{...i,checks:{...i.checks,[n]:r}}}async load(){try{let e=await f(this.baselinePath,`utf8`);if(e.includes(`<<<<<<<`)){Z.start(`Merge conflict detected in baseline, auto-resolving...`);let t=he(e);return await this.save(t,!0),Z.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(K&&!t)return;let n=`${JSON.stringify(e,null,2)}\n`,r=this.baselinePath.replace(`.json`,`.md`),i=ge(e,a(this.baselinePath));await d(a(this.baselinePath),{recursive:!0}),await Promise.all([p(this.baselinePath,n,`utf8`),p(r,i,`utf8`)])}};function ye(){return{hasImprovement:!1,hasRegression:!1,isInitial:!0,newItems:[],removedItems:[]}}function be(e,t){return{hasImprovement:t.length>0,hasRegression:e.length>0,isInitial:!1,newItems:e.toSorted(),removedItems:t.toSorted()}}function xe(e,t){let n=[];for(let r of e)t.has(r)||n.push(r);return n}function Se(e,t){let n=[];for(let r of t)e.has(r)||n.push(r);return n}function Ce(e,t){let n=new Set(e.items),r=new Set(t.items);return be(xe(n,r),Se(n,r))}function we(e,t){return t?Ce(e,t):ye()}var Te=class n{baselineManager;constructor(e){this.baselineManager=new Q(e)}static filterChecks(e,t){let r={...e};if(t.only){let e=n.resolveRegex(t.only,`--only`);r=Object.fromEntries(Object.entries(r).filter(([t])=>e.test(t)))}if(t.skip){let e=n.resolveRegex(t.skip,`--skip`);r=Object.fromEntries(Object.entries(r).filter(([t])=>!e.test(t)))}return r}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(),i(n)):(await e(),r(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);for(let[e,d]of Object.entries(u)){let u=t.json?null:new W(`Running ${e}...`);try{u?.start();let r=performance.now(),f=await n.runCheck(d),p=performance.now()-r,m=Q.getEntry(i,e),h=we(f,m),g={baseline:m,checkId:e,duration:p,hasImprovement:h.hasImprovement,hasRegression:h.hasRegression,isInitial:h.isInitial,newItems:h.newItems,removedItems:h.removedItems,snapshot:f};a.push(g),h.hasRegression&&(o=!0),h.hasImprovement&&(s=!0),h.isInitial&&(c=!0),(h.hasImprovement||t.force||h.isInitial)&&(l=Q.update(l,e,{items:f.items,type:f.type})),u?.succeed(`${e} complete`)}catch(t){return u?.fail(`${e} failed`),Z.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 d=0;o&&!t.force&&(d=1);let f=performance.now()-r;return{exitCode:d,hasImprovement:s,hasRegression:o,results:a,totalDuration:f}}};const{values:$}=l({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&&(Z.log(`
17
20
  mejora - Prevent regressions by allowing only improvement
18
21
 
19
22
  Usage:
@@ -32,4 +35,4 @@ Examples:
32
35
  mejora --json
33
36
  mejora --only "eslint > *"
34
37
  mejora --skip typescript
35
- `),process.exit(0));try{let e=new ce,t=await n(),r=await e.run(t,{force:$.force,json:$.json,only:$.only,skip:$.skip});$.json?Z.log(E(r)):Z.log(N(r)),process.exit(r.exitCode)}catch(e){e instanceof Error?Z.error(e.message):Z.error(e),process.exit(2)}export{};
38
+ `),process.exit(0));try{let e=new Te,t=await n(),r=await e.run(t,{force:$.force,json:$.json,only:$.only,skip:$.skip});$.json?Z.log(ne(r)):Z.log(O(r)),process.exit(r.exitCode)}catch(e){e instanceof Error?Z.error(e.message):Z.error(e),process.exit(2)}export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mejora",
3
- "version": "1.0.1",
3
+ "version": "1.2.0",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "repository": {