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
			| 
											2 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(); | ||
|  |         } | ||
|  |       }); | ||
|  |     })(); | ||
|  |   }); | ||
|  | }; |