/** * archiver-utils * * Copyright (c) 2015 Chris Talkington. * Licensed under the MIT license. * https://github.com/archiverjs/archiver-utils/blob/master/LICENSE */ var fs = require('graceful-fs'); var path = require('path'); var nutil = require('util'); var lazystream = require('lazystream'); var normalizePath = require('normalize-path'); var _ = require('lodash'); var Stream = require('stream').Stream; var PassThrough = require('readable-stream').PassThrough; var utils = module.exports = {}; utils.file = require('./file.js'); function assertPath(path) { if (typeof path !== 'string') { throw new TypeError('Path must be a string. Received ' + nutils.inspect(path)); } } utils.collectStream = function(source, callback) { var collection = []; var size = 0; source.on('error', callback); source.on('data', function(chunk) { collection.push(chunk); size += chunk.length; }); source.on('end', function() { var buf = new Buffer(size); var offset = 0; collection.forEach(function(data) { data.copy(buf, offset); offset += data.length; }); callback(null, buf); }); }; utils.dateify = function(dateish) { dateish = dateish || new Date(); if (dateish instanceof Date) { dateish = dateish; } else if (typeof dateish === 'string') { dateish = new Date(dateish); } else { dateish = new Date(); } return dateish; }; // this is slightly different from lodash version utils.defaults = function(object, source, guard) { var args = arguments; args[0] = args[0] || {}; return _.defaults.apply(_, args); }; utils.isStream = function(source) { return source instanceof Stream; }; utils.lazyReadStream = function(filepath) { return new lazystream.Readable(function() { return fs.createReadStream(filepath); }); }; utils.normalizeInputSource = function(source) { if (source === null) { return new Buffer(0); } else if (typeof source === 'string') { return new Buffer(source); } else if (utils.isStream(source) && !source._readableState) { var normalized = new PassThrough(); source.pipe(normalized); return normalized; } return source; }; utils.sanitizePath = function(filepath) { return normalizePath(filepath, false).replace(/^\w+:/, '').replace(/^(\.\.\/|\/)+/, ''); }; utils.trailingSlashIt = function(str) { return str.slice(-1) !== '/' ? str + '/' : str; }; utils.unixifyPath = function(filepath) { return normalizePath(filepath, false).replace(/^\w+:/, ''); }; utils.walkdir = function(dirpath, base, callback) { var results = []; if (typeof base === 'function') { callback = base; base = dirpath; } fs.readdir(dirpath, function(err, list) { var i = 0; var file; var filepath; if (err) { return callback(err); } (function next() { file = list[i++]; if (!file) { return callback(null, results); } filepath = path.join(dirpath, file); fs.stat(filepath, function(err, stats) { results.push({ path: filepath, relative: path.relative(base, filepath).replace(/\\/g, '/'), stats: stats }); if (stats && stats.isDirectory()) { utils.walkdir(filepath, base, function(err, res) { res.forEach(function(dirEntry) { results.push(dirEntry); }); next(); }); } else { next(); } }); })(); }); };