fast-extract
Version:
Extract contents from various archive types (tar, tar.bz2, tar.gz, tar.xz, tgz, zip)
37 lines (36 loc) • 1.36 kB
JavaScript
import fs from 'fs';
import mkdirp from 'mkdirp-classic';
import path from 'path';
import Queue from 'queue-cb';
import rimraf2 from 'rimraf2';
import tempSuffix from 'temp-suffix';
import writer from '../../compat/flush-write-stream.js';
import writeTruncateFile from '../../writeTruncateFile.js';
export default function createFilePipeline(dest, options) {
const tempDest = tempSuffix(dest);
options._tempPaths.push(tempDest);
let wroteSomething = false;
return writer(function write(chunk, _encoding, callback) {
wroteSomething = true;
const appendFile = fs.appendFile.bind(fs, tempDest, chunk, callback);
if (this.pathMade) return appendFile();
mkdirp(path.dirname(tempDest), ()=>{
this.pathMade = true;
appendFile();
});
}, function flush(callback) {
const queue = new Queue(1);
queue.defer((callback)=>{
mkdirp(path.dirname(dest), (err)=>{
err && err.code !== 'EEXIST' ? callback(err) : callback();
});
});
if (wroteSomething) {
queue.defer(rimraf2.bind(null, dest, {
disableGlob: true
}));
queue.defer(fs.rename.bind(fs, tempDest, dest));
} else queue.defer(writeTruncateFile.bind(null, dest));
queue.await(callback);
});
}