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) • 2.38 kB
JavaScript
import{a as d}from"./chunk-JD45QQDD.mjs";import{a as A,b as w}from"./chunk-NHG7C4LQ.mjs";import{a as T,c as r,d as c,e as p,f}from"./chunk-HB6Q755Y.mjs";var v=t=>{switch(t){case r:return"OK";case c:return"CONTINUE";case p:return"FAIL";case f:return"SKIP";default:return`UNKNOWN(${t})`}},x=t=>typeof t=="object"&&t!==null&&!Array.isArray(t),k={ours:({ours:t})=>({status:r,value:t}),theirs:({theirs:t})=>({status:r,value:t}),base:({base:t})=>({status:r,value:t}),drop:t=>({status:r,value:T}),skip:({path:t})=>({status:f,reason:`Skip strategy applied at ${t}`}),"non-empty":({ours:t,theirs:e,base:n})=>t!=null&&t!==""?{status:r,value:t}:e!=null&&e!==""?{status:r,value:e}:n!=null&&n!==""?{status:r,value:n}:{status:c},update:({ours:t,theirs:e})=>t!==void 0?{status:r,value:e}:{status:r,value:T},merge:async t=>{let{ours:e,theirs:n,base:s,path:a,filePath:o,ctx:l,conflicts:C,logger:u}=t;if(x(e)&&x(n)){let S=new Set([...Object.keys(e),...Object.keys(n)]),y={};for(let g of S){let i=g.replace(/\./g,"\0").replace(/\\/g,"");y[g]=await m({ours:e[g],theirs:n[g],base:x(s)?s[g]:void 0,path:a?`${a}.${i}`:i,filePath:o,ctx:l,conflicts:C,logger:u})}return{status:r,value:y}}return{status:c,reason:"Unmergeable type"}},concat:({ours:t,theirs:e,path:n})=>Array.isArray(t)&&Array.isArray(e)?{status:r,value:[...t,...e]}:{status:c,reason:`Cannot concat at ${n}`},unique:({ours:t,theirs:e,path:n})=>Array.isArray(t)&&Array.isArray(e)?{status:r,value:[...new Set([...t,...e])]}:{status:c,reason:`Cannot concat at ${n}`}},m=async({ours:t,theirs:e,base:n,path:s,filePath:a,ctx:o,conflicts:l,logger:C})=>{var S;if(t===e)return t;o._strategyCache||(o._strategyCache=new Map);let u=o._strategyCache.get(s);u||(u=d(s,o.config),o._strategyCache.set(s,u)),C.debug(a!=null?a:"all",`path: ${s}, strategies: ${u.join(", ")||"none"}`);for(let y of u){C.debug(a!=null?a:"all",`Applying strategy '${y}' at ${s}`);let g=(S=k[y])!=null?S:o.strategies[y];if(!g)continue;let i=await g({ours:t,theirs:e,base:n,path:s,filePath:a,ctx:o,conflicts:l,logger:C});switch(i.status){case r:return i.value;case c:continue;case f:l.push({path:s,reason:i.reason});return;case p:throw l.push({path:s,reason:i.reason}),new Error(`Merge failed at ${s}: ${i.reason}`)}}l.push({path:s,reason:`All strategies failed (tried: ${u.join(", ")||"none"})`,...o.config.debug?{ours:t,theirs:e,base:n}:{}})};export{v as a,k as b,m as c};