const fs = require('fs');
const JSZip = require('jszip');
const Sketch = require('./src/Sketch');
(function(lib) {
/**
* Load the source content of a sketch file and return a promise with
* a Sketch instance
* @alias load
* @param {String} source - Content of a sketch file
*
* @return {Promise}
*/
lib.load = function(source) {
return JSZip.loadAsync(source)
.then(zip => {
return Promise.all([
zip.file('document.json').async('string'),
zip.file('meta.json').async('string'),
zip.file('user.json').async('string')
]).then(result => {
return {
repo: zip,
document: JSON.parse(result[0]),
meta: JSON.parse(result[1]),
user: JSON.parse(result[2])
};
});
})
.then(data => {
return Promise.all(
data.document.pages.map(page => {
return data.repo.file(`${page._ref}.json`).async('string');
})
).then(pages => {
data.pages = pages.map(page => JSON.parse(page));
return data;
});
})
.then(data => {
return new Sketch(data.repo, data.document, data.meta, data.user, data.pages);
});
};
/**
* Read a sketch file and returns a promise with a Sketch instance
* @alias read
* @param {Array|String} file - Can be a path or an array of paths
*
* @example
* //Load a file
* nodeSketch.read('design.sketch').then(sketch => {
* console.log(sketch);
* }).catch(err => {
* console.error('Error reading the file');
* });
*
* //Load an array of files
* nodeSketch.read(['design.sketch', 'other-design.sketch']).then(files => {
* let [design, other] = files;
*
* console.log(design);
* console.log(other);
* }).catch(err => {
* console.error('Error reading some files');
* })
*
* @return {Promise}
*/
lib.read = function(file) {
if (Array.isArray(file)) {
return Promise.all(file.map(each => lib.read(each)));
}
return lib.load(fs.readFileSync(file));
};
const Node = require('./src/Node');
const classes = {
style: require('./src/Style'),
symbolInstance: require('./src/SymbolInstance'),
MSJSONFileReference: require('./src/FileReference')
};
/**
* Creates a new Node elements
*
* @ignore
* @param {Node|Sketch} parent - The node parent
* @param {Object} - The json with the raw data
*
* @return {Node}
*/
lib.create = function(parent, data) {
if (data._class in classes) {
return new classes[data._class](parent, data);
}
return new Node(parent, data);
};
})(require('./index'));