You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					157 lines
				
				3.6 KiB
			
		
		
			
		
	
	
					157 lines
				
				3.6 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * 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 defaults = require('lodash.defaults');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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(...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();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    })();
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								};
							 |