"use strict";module.exports=input=>{if(!input)return[];if(typeofinput!=="string"||input.match(/^\s+$/))return[];constlines=input.split("\n");if(lines.length===0)return[];constfiles=[];letcurrentFile=null;letcurrentChunk=null;letdeletedLineCounter=0;letaddedLineCounter=0;letcurrentFileChanges=null;constnormal=line=>{var_currentChunk;(_currentChunk=currentChunk)===null||_currentChunk===void0?void0:_currentChunk.changes.push({type:"normal",normal:true,ln1:deletedLineCounter++,ln2:addedLineCounter++,content:line});currentFileChanges.oldLines--;currentFileChanges.newLines--};conststart=line=>{const[fromFileName,toFileName]=parseFiles(line)??[];currentFile={chunks:[],deletions:0,additions:0,from:fromFileName,to:toFileName};files.push(currentFile)};constrestart=()=>{if(!currentFile||currentFile.chunks.length)start()};constnewFile=()=>{restart();currentFile.new=true;currentFile.from="/dev/null"};constdeletedFile=()=>{restart();currentFile.deleted=true;currentFile.to="/dev/null"};constindex=line=>{restart();currentFile.index=line.split(" ").slice(1)};constfromFile=line=>{restart();currentFile.from=parseOldOrNewFile(line)};consttoFile=line=>{restart();currentFile.to=parseOldOrNewFile(line)};consttoNumOfLines=number=>+(number||1);constchunk=(line,match)=>{if(!currentFile)return;const[oldStart,oldNumLines,newStart,newNumLines]=match.slice(1);deletedLineCounter=+oldStart;addedLineCounter=+newStart;currentChunk={content:line,changes:[],oldStart:+oldStart,oldLines:toNumOfLines(oldNumLines),newStart:+newStart,newLines:toNumOfLines(newNumLines)};currentFileChanges={oldLines:toNumOfLines(oldNumLines),newLines:toNumOfLines(newNumLines)};currentFile.chunks.push(currentChunk)};constdel=line=>{if(!currentChunk)return;currentChunk.changes.push({type:"del",del:true,ln:deletedLineCounter++,content:line});currentFile.deletions++;currentFileChanges.oldLines--};constadd=line=>{if(!currentChunk)return;currentChunk.changes.push({type:"add",add:true,ln:addedLineCounter++,content:line});currentFile.additions++;currentFileChanges.newLines--};consteof=line=>{if(!currentChunk)return;const[mostRecentChange]=currentChunk.changes.slice(-1);currentChunk.changes.push({type:mostRecentChange.type,[mostRecentChange.type]:true,ln1:mostRecentChange.ln1,ln2:mostRecentChange.ln2,ln:mostRecentChange.ln,content:line})};constschemaHeaders=[[/^diff\s/,start],[/^new file mode \d+$/,newFile],[/^deleted file mode \d+$/,deletedFile],[/^index\s[\da-zA-Z]+\.\.[\da-zA-Z]+(\s(\d+))?$/,index],[/^---\s/,fromFile],[/^\+\+\+\s/,toFile],[/^@@\s+-(\d+),?(\d+)?\s+\+(\d+),?(\d+)?\s@@/,chunk],[/^\\ No newline at end of file$/,eof]];constschemaContent=[[/^-/,del],[/^\+/,add],[/^\s+/,normal]];constparseContentLine=line=>{for(const[pattern,handler]ofschemaContent){constmatch=line.match(pattern);if(match){handler(line,match);break}}if(currentFileChanges.oldLines===0&¤tFileChanges.newLines===0){currentFileChanges=null}};constparseHeaderLine=line=>{for(const[pattern,handler]ofschemaHeaders){constmatch=line.match(pattern);if(match){handler(line,match);break}}};constparseLine=line=>{if(currentFileChanges){parseContentLine(line)}else{parseHeaderLine(line)}return};for(constlineoflines)parseLine(line);returnfiles};constfileNameDiffRegex=/a\/.*(?=["']?["']?b\/)|b\/.*$/g;constgitFileHeaderRegex=/^(a|b)\//;constparseFiles=line=>{letfileNames=line===null||line===void0?void0:line.match(fileNameDiffRegex);returnfileNames===null||fileNames===void0?void0:fileNames.map(fileName=>fileName.replace(gitFileHeaderRegex,"").replace(/("|')$/,""))};constqoutedFileNameRegex=/^\\?['"]|\\?['"]$/g;constparseOldOrNewFile=line=>{letfileName=leftTrimChars(line,"-+").trim();fileName=removeTimeStamp(fileName);returnfileName.replace(qoutedFileNameRegex,"").replace(gitFileHeaderRegex,"")};constleftTrimChars=(string,trimmingChars)=>{string=makeString(string);if(!trimmingChars&&String.prototype.trimLeft)returnstring.trimLeft();lettrimmingString=formTrimmingString(trimmingChars);returnstring.replace(newRegExp(`^${trimmingString}+`),"")};consttimeStampRegex=/\t.*|\d{4}-\d\d-\d\d\s\d\d:\d\d:\d\d(.\d+)?\s(\+|-)\d\d\d\d/;constremoveTimeStamp=string=>{consttimeStamp=timeStampRegex.exec(string);if(timeStamp){string=string.substring(0,timeStamp.index).trim()}returnstring};constformTrimmingString=trimmingChars=>{if(trimmingChars===null||trimmingChars===undefined)return"\\s";elseif(trimmingCharsinstanceofRegExp)returntrimmingChars.source;return`[${makeString(trimmingChars).replace(/([.*+?^=!:${}()|[\]/\\])/g,"\\$1")}]`};constmakeString=itemToConvert=>(itemToConvert??"")+"";