mejora 2.0.2 → 2.0.3

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 (2) hide show
  1. package/dist/run.mjs +6 -2
  2. package/package.json +1 -1
package/dist/run.mjs CHANGED
@@ -10,10 +10,14 @@ import{c as e,l as t,n,o as r,r as i,s as a,u as o}from"./config-CtJOKpPZ.mjs";i
10
10
  ${P(e)}
11
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 he(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 ge(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 _e(e){let t=he(e),n=[];for(let{ours:e,theirs:r}of t)n.push(B(e),B(r));return ge(n)}const V=`__unparsable__`;function H(e){return e.replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`[`,`&#91;`).replaceAll(`]`,`&#93;`)}function U(e,n){return t(n,e)}function W(e,n,r){let i=t(n,e);return r?`${i}#L${r}`:i}function G(e,t){return`[${e}](${t})`}function ve(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 ye(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 be(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 xe(e,t,n){if(e.filePath===V)return be(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+=ve(i,t,n);return`${r}\n`}function Se(e,t,n,r){let i=t.length,a=`\n## ${e} (${i} ${T(i,`issue`)})\n\n`;if(t.length===0)return`${a}No issues\n`;let o=ye(t);for(let e of o)a+=xe(e,n,r);return a}function Ce(e){return`${e.replaceAll(/\n{3,}/g,`
12
12
 
13
- `).trimEnd()}\n`}function we(e,t){let n=process.cwd(),r=`# Mejora Baseline
13
+ `).trimEnd()}\n`}function we(e,t){let n=process.cwd(),r=`<!-- prettier-ignore-start -->
14
+
15
+ # Mejora Baseline
14
16
 
15
17
  This file represents the current accepted state of the codebase.
16
- `;for(let[i,{items:a=[]}]of Object.entries(e.checks))r+=Se(i,a,n,t);return Ce(r)}const Te=(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 Ee(e){let t=[e.message];if(e.stack){let n=e.stack.split(`
18
+ `;for(let[i,{items:a=[]}]of Object.entries(e.checks))r+=Se(i,a,n,t);return r+=`
19
+ <!-- prettier-ignore-end -->
20
+ `,Ce(r)}const Te=(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 Ee(e){let t=[e.message];if(e.stack){let n=e.stack.split(`
17
21
  `).slice(1).map(e=>y(e.trim())).join(`
18
22
  `);t.push(n)}return t.join(`
19
23
  `)}function K(...e){return e.map(e=>typeof e==`string`?e:e instanceof Error?Ee(e):s(e,{colors:!1,depth:10})).join(` `)}const q={error:(...e)=>{console.error(x(`✖`),K(...e))},log:(...e)=>{console.log(K(...e))},start:(...e)=>{console.log(ee(`◐`),K(...e))},success:(...e)=>{console.log(b(`✔`),K(...e))}};var J=class t{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(e,n,r){let i=e??t.create({}),a=i.checks[n];return Te(r,a)?i:{...i,checks:{...i.checks,[n]:r}}}async load(){try{let e=await d(this.baselinePath,`utf8`);if(e.includes(`<<<<<<<`)){q.start(`Merge conflict detected in baseline, auto-resolving...`);let t=_e(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(t,n=!1){if(M&&!n)return;let r=`${JSON.stringify(t,null,2)}\n`,i=this.baselinePath.replace(`.json`,`.md`),a=we(t,e(this.baselinePath));await u(e(this.baselinePath),{recursive:!0}),await Promise.all([f(this.baselinePath,r,`utf8`),f(i,a,`utf8`)])}};function De(){return{hasImprovement:!1,hasRegression:!1,hasRelocation:!1,isInitial:!0,newItems:[],removedItems:[]}}function Y(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 Oe(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 ke(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 Y(Q(n,o),Q(r,s),Oe(n,r))}function Ae(e,t){return t?ke(e,t):De()}var je=class e{baselineManager;constructor(e){this.baselineManager=new J(e)}static filterChecks(t,n){let r=n.only?e.resolveRegex(n.only,`--only`):null,i=n.skip?e.resolveRegex(n.skip,`--skip`):null;return!r&&!i?t:Object.fromEntries(Object.entries(t).filter(([e])=>!(r&&!r.test(e)||i?.test(e))))}static getRequiredCheckTypes(e){return new Set(Object.values(e).map(e=>e.type))}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`?r(e):i(e)}static async setupInfrastructure(t){let n=o(process.cwd(),`node_modules`,`.cache`,`mejora`),r=[n,...[...e.getRequiredCheckTypes(t)].map(e=>o(n,e))];await Promise.all(r.map(e=>u(e,{recursive:!0})))}static async validateAllDeps(t){let n=e.getRequiredCheckTypes(t),r=[];n.has(`eslint`)&&r.push(import(`eslint`)),n.has(`typescript`)&&r.push(import(`typescript`)),await Promise.all(r)}async run(t,n={}){let r=performance.now(),i=await this.baselineManager.load(),a=e.filterChecks(t.checks,n);try{await Promise.all([e.setupInfrastructure(a),e.validateAllDeps(a)])}catch(e){return q.error(`Setup 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,n);return u&&u!==i&&(!c.hasAnyRegression||n.force||c.hasAnyInitial)&&await this.baselineManager.save(u,n.force),{exitCode:c.hasAnyRegression&&!n.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(t,n){let r=Object.entries(t).map(async([t,r])=>{try{let i=performance.now(),a=await e.runCheck(r),o=performance.now()-i,s=J.getEntry(n,t);return{baselineEntry:s,checkId:t,comparison:Ae(a,s),duration:o,snapshot:a}}catch(e){throw q.error(`Error running check "${t}":`,e),e}});try{return await Promise.all(r)}catch{return null}}};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&&(q.log(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mejora",
3
- "version": "2.0.2",
3
+ "version": "2.0.3",
4
4
  "description": "Prevent regressions. Allow improvement.",
5
5
  "keywords": [
6
6
  "regression",