json-conflict-resolver
Version:
A rules-based JSON conflict resolver that parses Git conflict markers, reconstructs ours/theirs, and merges with deterministic strategies — beyond line-based merges.
2 lines (1 loc) • 4.64 kB
JavaScript
var W=Object.create;var m=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var _=Object.getPrototypeOf,v=Object.prototype.hasOwnProperty;var U=(t,e)=>{for(var r in e)m(t,r,{get:e[r],enumerable:!0})},M=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of D(e))!v.call(t,n)&&n!==r&&m(t,n,{get:()=>e[n],enumerable:!(s=j(e,n))||s.enumerable});return t};var b=(t,e,r)=>(r=t!=null?W(_(t)):{},M(e||!t||!t.__esModule?m(r,"default",{value:t,enumerable:!0}):r,t)),H=t=>M(m({},"__esModule",{value:!0}),t);var J={};U(J,{DEFAULT_CONFIG:()=>$,normalizeConfig:()=>k});module.exports=H(J);var T={isMatch:(t,e)=>{let r=g(t);return e.some(s=>K(r,g(s)))}},R=async t=>{if(t==="micromatch"){let e;try{e=await import("micromatch")}catch{throw new Error("micromatch is not installed. Please add it as a dependency if you want to use it.")}return{isMatch:(r,s)=>{try{return e.isMatch(g(r),s.map(g))}catch(n){throw new Error(`micromatch failed to run isMatch: ${n.message}`)}}}}if(t==="picomatch"){let e;try{e=(await import("picomatch")).default}catch{throw new Error("picomatch is not installed. Please add it as a dependency if you want to use it.")}return{isMatch:(r,s)=>{try{return e(s.map(g))(g(r))}catch(n){throw new Error(`picomatch failed to run isMatch: ${n.message}`)}}}}throw new Error(`Unknown matcher name: ${t}`)},g=t=>t.replace(/\\[./]|\./g,e=>e==="\\."?"\0":e==="\\/"?"":"/"),G=t=>{let e=t.startsWith("!"),r=e?t.slice(1):t,s=[],n="",i=!1;for(let a of r)i?(n+="\\"+a,i=!1):a==="\\"?i=!0:a==="/"?(s.push(n),n=""):n+=a;return i&&(n+="\\"),s.push(n),e&&(s.negated=!0),s},K=(t,e)=>{let r=t.split("/"),s=G(e),n=s.negated===!0,i=A(r,s);return n?!i:i},A=(t,e)=>{let r=0,s=0;for(;r<t.length&&s<e.length;){let n=e[s];if(n==="**"){if(s===e.length-1)return!0;for(let i=0;r+i<=t.length;i++)if(A(t.slice(r+i),e.slice(s+1)))return!0;return!1}if(!V(t[r],n))return!1;r++,s++}for(;s<e.length&&e[s]==="**";)s++;return r===t.length&&s===e.length},V=(t,e)=>{let r=!1,s=!1,n="",i="";for(let c=0;c<e.length;c++){let l=e[c];if(r){i+=l,r=!1;continue}if(l==="\\"){r=!0;continue}if(l==="*"){if(!s){s=!0,n=i,i="";continue}i+="*";continue}i+=l}if(r&&(i+="\\"),!s){let c=i.replace(/\\(.)/g,"$1");return t===c}let a=i.replace(/\\(.)/g,"$1"),o=n.replace(/\\(.)/g,"$1");return t.startsWith(o)&&t.endsWith(a)};var $={defaultStrategy:["merge","ours"],include:["**/*.json","**/*.yaml","**/*.yml","**/*.xml","**/*.toml"],exclude:["**/node_modules/**","**/dist/**"],debug:!1,writeConflictSidecar:!1},k=async t=>{let{rules:e,byStrategy:r,defaultStrategy:s,matcher:n,plugins:i,pluginConfig:a,customStrategies:o,...c}={...$,...t},l=await B(i,a),N={...o,...l},p={exact:Object.create(null),exactFields:Object.create(null),patterns:Object.create(null),default:q(s)},L=typeof n=="string"?await R(n):n!=null?n:T,E=0;if(r)for(let[y,u]of Object.entries(r)){if(!u)continue;let{name:d,important:S}=C(y);for(let w of u){let{key:f,important:x}=I(w);P(p,f,{strategies:[{name:d,important:S||x}],order:E++,source:f})}}return e&&O(e,[],(y,u)=>{let{key:d,important:S}=I(y),w=u.map(f=>{let{name:x,important:z}=C(f);return{name:x,important:z||S}});P(p,d,{strategies:w,order:E++,source:d})}),{...c,rules:p,matcher:L,customStrategies:N}},q=t=>(Array.isArray(t)?t:[t]).map(r=>{let s=r.endsWith("!");return F(r.slice(0,-1)),{name:s?r.slice(0,-1):r,important:s}}),C=t=>{let e=t.endsWith("!"),r=e?t.slice(0,-1):t;return F(r),{name:r,important:e}},F=t=>{if(t.endsWith("!"))throw new Error(`Strategy name "${t}" must not end with "!". Use "!" on field/glob to mark rule importance.`)},I=t=>{let e=t.endsWith("!"),r=e?t.slice(0,-1):t;if(!r)throw new Error(`Invalid rule key "${t}".`);return{key:r,important:e}},P=(t,e,r)=>{if(/^\[.*\]$/.test(e)){let n=e.slice(1,-1);if(n.replace(/\\\./g,"").includes(".")||n.trim()==="")throw new Error(`Invalid bracket form "${e}". Use a single bare key like "[id]".`);let i=`**.${n}.**`;h(t.patterns,i,r);return}if(/[*?[\]]/.test(e)){h(t.patterns,e,r);return}e.includes(".")?h(t.exact,e,r):h(t.exactFields,e,r)},O=(t,e,r)=>{for(let[s,n]of Object.entries(t)){let i=[...e,s];Array.isArray(n)?r(i.join("."),n):O(n,i,r)}},h=(t,e,r)=>{var n;((n=t[e])!=null?n:t[e]=[]).push(r)},B=async(t,e)=>{if(!(t!=null&&t.length))return{};let r={};for(let s of t)try{let n=await import(s),i=n.default||n,a=e==null?void 0:e[s],o=i instanceof Function?await i(a):i;if(!o.strategies)throw new Error(`Plugin "${s}" does not export strategies`);o.init&&await o.init(a),Object.assign(r,o.strategies)}catch(n){throw new Error(`Failed to load plugin "${s}": ${n}`)}return r};0&&(module.exports={DEFAULT_CONFIG,normalizeConfig});
;