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) 3.21 kB
"use strict";var C=Object.create;var g=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var $=Object.getPrototypeOf,v=Object.prototype.hasOwnProperty;var D=(t,r)=>{for(var e in r)g(t,e,{get:r[e],enumerable:!0})},k=(t,r,e,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of M(r))!v.call(t,i)&&i!==e&&g(t,i,{get:()=>r[i],enumerable:!(s=E(r,i))||s.enumerable});return t};var P=(t,r,e)=>(e=t!=null?C($(t)):{},k(r||!t||!t.__esModule?g(e,"default",{value:t,enumerable:!0}):e,t)),_=t=>k(g({},"__esModule",{value:!0}),t);var A={};D(A,{DEFAULT_BACKUP_DIR:()=>m,DROP:()=>N,StrategyStatus_CONTINUE:()=>O,StrategyStatus_FAIL:()=>z,StrategyStatus_OK:()=>j,StrategyStatus_SKIP:()=>I,backupFile:()=>T,createSkipDirectoryMatcher:()=>b,hasConflict:()=>x,listMatchingFiles:()=>R,restoreBackups:()=>U});module.exports=_(A);var l=P(require("fs/promises")),a=P(require("path")),N=Symbol("MERGE_DROP"),m=".merge-backups",j=0,O=1,z=2,I=3,x=t=>t.includes("<<<<<<<")&&t.includes("=======")&&t.includes(">>>>>>>"),R=async({root:t=process.cwd(),include:r,exclude:e,matcher:s,includeNonConflicted:i,debug:o,backupDir:n=m})=>{try{await l.default.rm(n,{recursive:!0,force:!0})}catch{}for(let c of[...r,...e]){if(c.startsWith("!"))throw new Error(`Negation not allowed in include/exclude: ${c}`);c.includes("\\")&&console.warn(`Use '/' as path separator: ${c}`)}e.push(`${n}/**`);let f=c=>{let h=c.replace(/\\/g,"/");return s.isMatch(h,r)&&!s.isMatch(h,e)},u=b(r,n?[...e,n]:e,s),d=[],F=async c=>{let h=await l.default.readdir(c,{withFileTypes:!0});for(let y of h){let p=a.default.join(c,y.name),w=a.default.relative(t,p).replace(/\\+/g,"/");if(y.isDirectory())!/node_modules|\.git/.test(y.name)&&!u(w)&&await F(p);else if(f(w))try{let S=await l.default.readFile(p,"utf8");i||x(S)?d.push({filePath:w,content:S}):o&&console.info(`Skipped (no conflicts): ${p}`)}catch{console.warn(`Skipped (unreadable): ${p}`)}}};return await F(t),d},b=(t,r,e)=>{if(t.length>0&&t.every(o=>!o.includes("/")&&!o.includes("**")))return()=>!1;let s=new Set,i=new Set;for(let o of t)if(o.includes("/")){let n=o.split("/").slice(0,-1).join("/");n&&s.add(n)}s.has("**")&&s.clear();for(let o of r)if(o.endsWith("/**")){let n=o.slice(0,-3);n&&i.add(n)}return o=>e.isMatch(o,[...i])||s.size>0&&!e.isMatch(o,[...s])},T=async(t,r=m)=>{let e=a.default.relative(process.cwd(),t),s=a.default.join(r,e);return await l.default.mkdir(a.default.dirname(s),{recursive:!0}),await l.default.copyFile(t,s),s},U=async(t=".merge-backups")=>{let r=async(e,s="")=>{try{let i=await l.default.readdir(e,{withFileTypes:!0});for(let o of i){let n=a.default.join(e,o.name),f=a.default.join(s,o.name),u=a.default.join(process.cwd(),f);if(o.isDirectory())await r(n,f);else try{await l.default.mkdir(a.default.dirname(u),{recursive:!0}),await l.default.copyFile(n,u)}catch(d){console.warn(`Failed to restore ${n.replace(/[\r\n\t]/g,"")}: ${d}`)}}}catch(i){console.warn(`Failed to read backup directory ${e}: ${i}`)}};await r(t)};0&&(module.exports={DEFAULT_BACKUP_DIR,DROP,StrategyStatus_CONTINUE,StrategyStatus_FAIL,StrategyStatus_OK,StrategyStatus_SKIP,backupFile,createSkipDirectoryMatcher,hasConflict,listMatchingFiles,restoreBackups});