fast-extract
Version:
Extract contents from various archive types (tar, tar.bz2, tar.gz, tar.xz, tgz, zip)
44 lines (43 loc) • 1.91 kB
JavaScript
import zlib from 'zlib';
import bz2 from './compat/unbzip2-stream.js';
import optionalRequire from './optionalRequire.js';
// lzma-native module compatiblity starts at Node 6
const major = +process.versions.node.split('.')[0];
const lzmaNative = major >= 10 ? optionalRequire('lzma-native') : null;
const TRANSORMS = {
bz2: bz2,
tgz: zlib.createUnzip.bind(zlib),
gz: zlib.createUnzip.bind(zlib),
xz: lzmaNative && lzmaNative.createDecompressor ? lzmaNative.createDecompressor.bind(lzmaNative) : undefined
};
import create7ZPipeline from './streams/pipelines/7z.js';
import createFilePipeline from './streams/pipelines/file.js';
import createTarPipeline from './streams/pipelines/tar.js';
import createZipPipeline from './streams/pipelines/zip.js';
const WRITERS = {
zip: createZipPipeline,
tar: createTarPipeline,
tgz: createTarPipeline,
'7z': create7ZPipeline
};
import extname from './extname.js';
import statsBasename from './sourceStats/basename.js';
import DestinationNotExists from './streams/transforms/DestinationNotExists.js';
import DestinationRemove from './streams/transforms/DestinationRemove.js';
export default function createPipeline(dest, options) {
const type = options.type === undefined ? extname(statsBasename(options.source, options) || '') : options.type;
const parts = type.split('.');
const streams = [
options.force ? new DestinationRemove(dest) : new DestinationNotExists(dest)
];
for(let index = parts.length - 1; index >= 0; index--){
// append transform
const transform = TRANSORMS[parts[index]];
if (transform) streams.push(transform());
// finish with a write stream
const writer = WRITERS[parts[index]];
if (writer) return writer(dest, streams, options);
}
// default is to write the result to a file
return createFilePipeline(dest, streams, options);
}