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.
		
		
		
		
		
			
		
			
				
					111 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					111 lines
				
				2.0 KiB
			| 
											2 years ago
										 | /** | ||
|  |  * JSON Format Plugin | ||
|  |  * | ||
|  |  * @module plugins/json | ||
|  |  * @license [MIT]{@link https://github.com/archiverjs/node-archiver/blob/master/LICENSE}
 | ||
|  |  * @copyright (c) 2012-2014 Chris Talkington, contributors. | ||
|  |  */ | ||
|  | var inherits = require('util').inherits; | ||
|  | var Transform = require('readable-stream').Transform; | ||
|  | 
 | ||
|  | var crc32 = require('buffer-crc32'); | ||
|  | var util = require('archiver-utils'); | ||
|  | 
 | ||
|  | /** | ||
|  |  * @constructor | ||
|  |  * @param {(JsonOptions|TransformOptions)} options | ||
|  |  */ | ||
|  | var Json = function(options) { | ||
|  |   if (!(this instanceof Json)) { | ||
|  |     return new Json(options); | ||
|  |   } | ||
|  | 
 | ||
|  |   options = this.options = util.defaults(options, {}); | ||
|  | 
 | ||
|  |   Transform.call(this, options); | ||
|  | 
 | ||
|  |   this.supports = { | ||
|  |     directory: true, | ||
|  |     symlink: true | ||
|  |   }; | ||
|  | 
 | ||
|  |   this.files = []; | ||
|  | }; | ||
|  | 
 | ||
|  | inherits(Json, Transform); | ||
|  | 
 | ||
|  | /** | ||
|  |  * [_transform description] | ||
|  |  * | ||
|  |  * @private | ||
|  |  * @param  {Buffer}   chunk | ||
|  |  * @param  {String}   encoding | ||
|  |  * @param  {Function} callback | ||
|  |  * @return void | ||
|  |  */ | ||
|  | Json.prototype._transform = function(chunk, encoding, callback) { | ||
|  |   callback(null, chunk); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * [_writeStringified description] | ||
|  |  * | ||
|  |  * @private | ||
|  |  * @return void | ||
|  |  */ | ||
|  | Json.prototype._writeStringified = function() { | ||
|  |   var fileString = JSON.stringify(this.files); | ||
|  |   this.write(fileString); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * [append description] | ||
|  |  * | ||
|  |  * @param  {(Buffer|Stream)}   source | ||
|  |  * @param  {EntryData}   data | ||
|  |  * @param  {Function} callback | ||
|  |  * @return void | ||
|  |  */ | ||
|  | Json.prototype.append = function(source, data, callback) { | ||
|  |   var self = this; | ||
|  | 
 | ||
|  |   data.crc32 = 0; | ||
|  | 
 | ||
|  |   function onend(err, sourceBuffer) { | ||
|  |     if (err) { | ||
|  |       callback(err); | ||
|  |       return; | ||
|  |     } | ||
|  | 
 | ||
|  |     data.size = sourceBuffer.length || 0; | ||
|  |     data.crc32 = crc32.unsigned(sourceBuffer); | ||
|  | 
 | ||
|  |     self.files.push(data); | ||
|  | 
 | ||
|  |     callback(null, data); | ||
|  |   } | ||
|  | 
 | ||
|  |   if (data.sourceType === 'buffer') { | ||
|  |     onend(null, source); | ||
|  |   } else if (data.sourceType === 'stream') { | ||
|  |     util.collectStream(source, onend); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * [finalize description] | ||
|  |  * | ||
|  |  * @return void | ||
|  |  */ | ||
|  | Json.prototype.finalize = function() { | ||
|  |   this._writeStringified(); | ||
|  |   this.end(); | ||
|  | }; | ||
|  | 
 | ||
|  | module.exports = Json; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @typedef {Object} JsonOptions | ||
|  |  * @global | ||
|  |  */ |