json-merge-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.
5 lines (4 loc) • 1.72 kB
JavaScript
import C,{promises as f}from"fs";import w from"path";var k=async(n={},u)=>{var d,L,h,b,S,v,F;let y=(d=n.mode)!=null?d:"memory",c=(L=n.logDir)!=null?L:".logs",p=(h=n.singleFile)!=null?h:!1,$={stdout:(S=(b=n.levels)==null?void 0:b.stdout)!=null?S:u?["debug","info","warn","error"]:["warn","error"],file:(F=(v=n.levels)==null?void 0:v.file)!=null?F:u?["info","debug","warn","error"]:["error"]};try{await f.mkdir(c,{recursive:!0})}catch(e){console.warn(`Failed to create log directory: ${e}`)}let i=new Map,a=new Map,P=e=>{let r=p?"all":e;if(!a.has(r)){let s=w.join(c,p?"combined.log":`${e}.log`);a.set(r,C.createWriteStream(s,{flags:"a"}))}return a.get(r)},g=(e,r,s)=>{var o,m;let t={timestamp:new Date().toISOString(),level:r,message:s};$.stdout.includes(r)&&(r==="error"?console.error:console.log)(`[${e}] [${t.timestamp}] [${r.toUpperCase()}] ${t.message}`),$.file.includes(r)&&(y==="memory"?(i.has(e)||i.set(e,[]),(o=i.get(e))==null||o.push(t)):(m=P(e))==null||m.write(`[${t.timestamp}] [${r.toUpperCase()}] ${t.message}
`))};return{info:(e,r)=>g(e,"info",r),warn:(e,r)=>g(e,"warn",r),error:(e,r)=>g(e,"error",r),debug:(e,r)=>g(e,"debug",r),flush:async()=>{if(y==="memory"){let e=new Date().toISOString().replace(/:/g,"-"),r=Array.from(i.entries()).map(async([s,t])=>{try{let o=w.join(c,p?`combined-${e}.log`:`${s}-${e}.log`),m=t.map(l=>`[${l.timestamp}] [${l.level.toUpperCase()}] ${l.message}`);await f.mkdir(w.dirname(o),{recursive:!0}),await f.appendFile(o,`${m.join(`
`)}
`)}catch(o){console.warn(`Failed to write log file for ${s}: ${o}`)}});await Promise.all(r)}for(let e of a.values())try{e.end()}catch(r){console.warn(`Failed to close log stream: ${r}`)}await new Promise(e=>setTimeout(e,10))}}};export{k as a};