UNPKG

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.09 kB
import l from"fs/promises";import a from"path";var b=Symbol("MERGE_DROP"),F=".merge-backups",C=0,E=1,M=2,$=3,S=e=>e.includes("<<<<<<<")&&e.includes("=======")&&e.includes(">>>>>>>"),v=async({root:e=process.cwd(),include:i,exclude:s,matcher:r,includeNonConflicted:c,debug:t,backupDir:o=F})=>{try{await l.rm(o,{recursive:!0,force:!0})}catch{}for(let n of[...i,...s]){if(n.startsWith("!"))throw new Error(`Negation not allowed in include/exclude: ${n}`);n.includes("\\")&&console.warn(`Use '/' as path separator: ${n}`)}s.push(`${o}/**`);let f=n=>{let h=n.replace(/\\/g,"/");return r.isMatch(h,i)&&!r.isMatch(h,s)},u=k(i,o?[...s,o]:s,r),d=[],w=async n=>{let h=await l.readdir(n,{withFileTypes:!0});for(let g of h){let p=a.join(n,g.name),y=a.relative(e,p).replace(/\\+/g,"/");if(g.isDirectory())!/node_modules|\.git/.test(g.name)&&!u(y)&&await w(p);else if(f(y))try{let m=await l.readFile(p,"utf8");c||S(m)?d.push({filePath:y,content:m}):t&&console.info(`Skipped (no conflicts): ${p}`)}catch{console.warn(`Skipped (unreadable): ${p}`)}}};return await w(e),d},k=(e,i,s)=>{if(e.length>0&&e.every(t=>!t.includes("/")&&!t.includes("**")))return()=>!1;let r=new Set,c=new Set;for(let t of e)if(t.includes("/")){let o=t.split("/").slice(0,-1).join("/");o&&r.add(o)}r.has("**")&&r.clear();for(let t of i)if(t.endsWith("/**")){let o=t.slice(0,-3);o&&c.add(o)}return t=>s.isMatch(t,[...c])||r.size>0&&!s.isMatch(t,[...r])},D=async(e,i=F)=>{let s=a.relative(process.cwd(),e),r=a.join(i,s);return await l.mkdir(a.dirname(r),{recursive:!0}),await l.copyFile(e,r),r},_=async(e=".merge-backups")=>{let i=async(s,r="")=>{try{let c=await l.readdir(s,{withFileTypes:!0});for(let t of c){let o=a.join(s,t.name),f=a.join(r,t.name),u=a.join(process.cwd(),f);if(t.isDirectory())await i(o,f);else try{await l.mkdir(a.dirname(u),{recursive:!0}),await l.copyFile(o,u)}catch(d){console.warn(`Failed to restore ${o.replace(/[\r\n\t]/g,"")}: ${d}`)}}}catch(c){console.warn(`Failed to read backup directory ${s}: ${c}`)}};await i(e)};export{b as a,F as b,C as c,E as d,M as e,$ as f,S as g,v as h,k as i,D as j,_ as k};