diff --git a/index.js b/index.js index e93ea85..41c68d5 100644 --- a/index.js +++ b/index.js @@ -14,12 +14,21 @@ var analyze = require('./lib/analyze'); * @return {Object} */ module.exports = function (input, callback) { - async.waterfall([ - function (cb) { - unpack(input, cb); - }, - parse, - validate, - analyze - ], callback); + unpack(input, function(err, unpackedProject) { + if (err) { + return callback(err); + } + async.waterfall([ + function (cb) { + parse(unpackedProject[0], cb); + }, + validate, + analyze + ], function(err2, validatedInput) { + if (err2) { + return callback(err2); + } + callback(null, [validatedInput, unpackedProject[1]]); + }); + }); }; diff --git a/lib/unpack.js b/lib/unpack.js index b4d4746..85b2b74 100644 --- a/lib/unpack.js +++ b/lib/unpack.js @@ -1,4 +1,4 @@ -var JSZip = require('jszip'); +var zip = require('./zip'); /** * If input a buffer, transforms buffer into a UTF-8 string. @@ -12,13 +12,17 @@ var JSZip = require('jszip'); module.exports = function (input, callback) { if (typeof input === 'string') { // Pass string to callback - return callback(null, input); + return callback(null, [input, null]); } // Validate input type var typeError = 'Input must be a Buffer or a string.'; if (!Buffer.isBuffer(input)) { - return callback(typeError); + try { + input = new Buffer(input); + } catch (e) { + return callback(typeError); + } } // Determine format @@ -34,17 +38,12 @@ module.exports = function (input, callback) { if (signature.indexOf('80 75') === 0) isZip = true; // If not legacy or zip, convert buffer to UTF-8 string and return - if (!isZip && !isLegacy) return callback(null, input.toString('utf-8')); + if (!isZip && !isLegacy) { + return callback(null, [input.toString('utf-8'), null]); + } // Return error if legacy encoding detected if (isLegacy) return callback('Parser only supports Scratch 2.X'); - // Handle zip - // @todo Handle error - JSZip.loadAsync(input).then(function (zip) { - zip.file('project.json').async('string') - .then(function (project) { - callback(null, project); - }); - }); + zip(input, callback); }; diff --git a/lib/zip.js b/lib/zip.js new file mode 100644 index 0000000..55c9e99 --- /dev/null +++ b/lib/zip.js @@ -0,0 +1,20 @@ +var JSZip = require('jszip'); + +/** + * Unpacks a zip + * + * @param {String} Input + * + * @return {Object} + */ +module.exports = function (input, callback) { + JSZip.loadAsync(input).then(function (zip) { + zip.file('project.json').async('string') + .then(function (project) { + callback(null, [project, zip]); + }) + .catch(function (err) { + callback(err); + }); + }); +};