pixel-buffer-diff-folders
Version:
Pbd-folders ( Pixel Buffer Diff folders ) recursively diff folders of images using pixel buffer diff
1 lines • 1.96 kB
JavaScript
Object.defineProperty(exports,"__esModule",{value:!0}),exports.diffFolders=void 0;const{Worker:e}=require("worker_threads"),n=require("./diffImageAsync"),s=require("fs"),r=require("path"),o=require("os"),d=(e,n=(e+r.sep).length)=>{const o=[],i=(e+r.sep).slice(n),a=s.readdirSync(e,{withFileTypes:!0});for(const s of a){const a=s.name,t=a.slice(a.lastIndexOf(".")+1).toLowerCase();s.isDirectory()?o.push.apply(o,d((0,r.join)(e,a),n)):!s.isFile()||"png"!==t&&"jpg"!==t&&"jpeg"!==t||o.push(i+a)}return o};exports.diffFolders=async(i,a,t,l,c,h=!1)=>{const p=Date.now(),f={changed:[],unchanged:[],added:[],removed:[],error:[]},g=d(i).sort(),u=d(a).sort();s.mkdirSync((0,r.dirname)(t),{recursive:!0});const m=g.length,y=u.length;let w=0,$=0;const F=[];for(;w+$<m+y;){const e=g[w]||"",n=u[$]||"";w===m?(f.added.push(n),$++):$===y||e<n?(f.removed.push(e),w++):n<e?(f.added.push(n),$++):e===n&&(F.push(e),w++,$++)}const v=o.cpus().length,q=h?Math.ceil(.75*v):1;if(console.log(`⚡ pixel-buffer-diff-folders\n${m+y} unique image relative paths\n${m} baseline\n${y} candidate\n-${f.removed.length}+${f.added.length}\n...diffing ${2*F.length} common images using ${q} worker(s)`),q>1){let n=0;const s=async()=>{const s=new e(`${__dirname}/diffImageAsync.js`),r={baselineFolder:i,candidateFolder:a,diffFolder:t,options:l,sideBySide:c,path:""};for(;r.path=F[n++];)await new Promise((e=>{s.once("message",(n=>{"error"in n?f.error.push(n):n.diff>0?f.changed.push(n):f.unchanged.push(n.path),e(void 0)})),s.postMessage(r)}));s.terminate()},r=new Array(q).fill(1);await Promise.all(r.map(s))}else{const e={baselineFolder:i,candidateFolder:a,diffFolder:t,options:l,sideBySide:c,path:""};for(let s=0;s<F.length;s++){e.path=F[s];const r=await(0,n.diffImage)(e);"error"in r?f.error.push(r):r.diff>0?f.changed.push(r):f.unchanged.push(e.path)}}const b=Date.now()-p;return console.log(`load, decode & diff ${2*F.length} images + encode & save ${f.changed.length} images in ${b/1e3}s`),f};