scratch-parser/lib/unpack.js
Andrew Sliwinski e8369be7f5 refactor: Refactor library to use latest scratch eslint rules and update all dependencies
Refactors library to use latest scratch eslint rules. Updates all dependencies to latest versions
which requires minor changes to the JSON schema, tests, and supported engine (8+)

BREAKING CHANGE: Module no longer supports less than Node 8
2018-03-24 11:09:43 -04:00

49 lines
1.7 KiB
JavaScript

var JSZip = require('jszip');
/**
* If input a buffer, transforms buffer into a UTF-8 string.
* If input is encoded in ZIP format, the input will be extracted and decoded.
* If input is a string, passes that string along to the given callback.
* @param {Buffer | string} input Project data
* @param {Function} callback Error or stringified project data
* @return {void}
*/
module.exports = function (input, callback) {
if (typeof input === 'string') {
// Pass string to callback
return callback(null, input);
}
// Validate input type
var typeError = 'Input must be a Buffer or a string.';
if (!Buffer.isBuffer(input)) {
return callback(typeError);
}
// Determine format
// We don't use the file suffix as this is unreliable and mine-type
// information is unavailable from Scratch's project CDN. Instead, we look
// at the first few bytes from the provided buffer (byte signature).
// https://en.wikipedia.org/wiki/List_of_file_signatures
var signature = input.slice(0, 3).join(' ');
var isLegacy = false;
var isZip = false;
if (signature.indexOf('83 99 114') === 0) isLegacy = true;
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'));
// 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);
});
});
};