@meteor-community/meteor-desktop
Version:
Build a Meteor's desktop client with hot code push.
119 lines (110 loc) • 14.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime"));
var _fs = _interopRequireDefault(require("fs"));
var _del = _interopRequireDefault(require("del"));
var _shelljs = _interopRequireDefault(require("shelljs"));
var _path = _interopRequireDefault(require("path"));
var _log = _interopRequireDefault(require("./log"));
var _skeletonDependencies = _interopRequireDefault(require("./skeletonDependencies"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
// eslint-disable-next-line no-unused-vars
const {
join
} = _path.default;
_shelljs.default.config.fatal = true;
/**
* Represents the .desktop dir scaffold.
*/
class ElectronAppScaffold {
/**
* @param {MeteorDesktop} $ - context
* @constructor
*/
constructor($) {
this.log = new _log.default('electronAppScaffold');
this.$ = $;
this.packageJson = {
name: 'MyMeteorApp',
main: this.$.env.isProductionBuild() ? 'app.asar/index.js' : 'app/index.js',
dependencies: Object.assign({}, _skeletonDependencies.default)
};
if (!this.$.env.isProductionBuild() || this.$.env.options.prodDebug) {
this.packageJson.dependencies['electron-debug'] = '1.5.0';
}
}
/**
* Just a public getter from the default package.json object.
* @returns {Object}
*/
getDefaultPackageJson() {
return Object.assign({}, this.packageJson);
}
/**
* Clear the electron app. Removes everything except the node_modules which would be a waste
* to delete. Later `npm prune` will keep it clear.
*/
clear() {
if (!this.$.utils.exists(this.$.env.paths.electronApp.root)) {
this.log.verbose(`creating ${this.$.env.paths.electronApp.rootName}`);
_shelljs.default.mkdir(this.$.env.paths.electronApp.root);
}
return (0, _del.default)([`${this.$.env.paths.electronApp.root}${_path.default.sep}*`, `!${this.$.env.paths.electronApp.nodeModules}`], {
force: true
});
}
/**
* Just copies the Skeleton App into the electron app.
*/
copySkeletonApp() {
this.log.verbose('copying skeleton app');
try {
_shelljs.default.cp('-rf', join(this.$.env.paths.meteorDesktop.skeleton, '*'), this.$.env.paths.electronApp.appRoot + _path.default.sep);
} catch (e) {
this.log.error('error while copying skeleton app:', e);
process.exit(1);
}
}
/**
* After clearing the electron app path, copies a fresh skeleton.
*/
async make() {
try {
this.log.verbose(`clearing ${this.$.env.paths.electronApp.rootName}`);
await this.clear();
} catch (e) {
this.log.error(`error while removing ${this.$.env.paths.electronApp.root}: `, e);
process.exit(1);
}
this.createAppRoot();
this.copySkeletonApp();
// TODO: hey, wait, .gitignore is not needed - right?
/*
this.log.debug('creating .gitignore');
fs.writeFileSync(this.$.env.paths.electronApp.gitIgnore, [
'node_modules'
].join('\n'));
*/
this.log.verbose('writing package.json');
_fs.default.writeFileSync(this.$.env.paths.electronApp.packageJson, JSON.stringify(this.packageJson, null, 2));
}
/**
* Creates the app directory in the electron app.
*/
createAppRoot() {
try {
this.log.verbose(`creating ${this.$.env.paths.electronApp.appRoot}`);
_fs.default.mkdirSync(this.$.env.paths.electronApp.appRoot);
} catch (e) {
if (e.code !== 'EEXIST') {
this.log.error(`error while creating dir: ${this.$.env.paths.electronApp.appRoot}: `, e);
process.exit(1);
}
}
}
}
exports.default = ElectronAppScaffold;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcnVudGltZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2ZzIiwiX2RlbCIsIl9zaGVsbGpzIiwiX3BhdGgiLCJfbG9nIiwiX3NrZWxldG9uRGVwZW5kZW5jaWVzIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0Iiwiam9pbiIsInBhdGgiLCJzaGVsbCIsImNvbmZpZyIsImZhdGFsIiwiRWxlY3Ryb25BcHBTY2FmZm9sZCIsImNvbnN0cnVjdG9yIiwiJCIsImxvZyIsIkxvZyIsInBhY2thZ2VKc29uIiwibmFtZSIsIm1haW4iLCJlbnYiLCJpc1Byb2R1Y3Rpb25CdWlsZCIsImRlcGVuZGVuY2llcyIsIk9iamVjdCIsImFzc2lnbiIsIm9wdGlvbnMiLCJwcm9kRGVidWciLCJnZXREZWZhdWx0UGFja2FnZUpzb24iLCJjbGVhciIsInV0aWxzIiwiZXhpc3RzIiwicGF0aHMiLCJlbGVjdHJvbkFwcCIsInJvb3QiLCJ2ZXJib3NlIiwicm9vdE5hbWUiLCJta2RpciIsImRlbCIsInNlcCIsIm5vZGVNb2R1bGVzIiwiZm9yY2UiLCJjb3B5U2tlbGV0b25BcHAiLCJjcCIsIm1ldGVvckRlc2t0b3AiLCJza2VsZXRvbiIsImFwcFJvb3QiLCJlcnJvciIsInByb2Nlc3MiLCJleGl0IiwibWFrZSIsImNyZWF0ZUFwcFJvb3QiLCJmcyIsIndyaXRlRmlsZVN5bmMiLCJKU09OIiwic3RyaW5naWZ5IiwibWtkaXJTeW5jIiwiY29kZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9saWIvZWxlY3Ryb25BcHBTY2FmZm9sZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmltcG9ydCByZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSAncmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgZGVsIGZyb20gJ2RlbCc7XG5pbXBvcnQgc2hlbGwgZnJvbSAnc2hlbGxqcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IExvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQgZGVwZW5kZW5jaWVzIGZyb20gJy4vc2tlbGV0b25EZXBlbmRlbmNpZXMnO1xuXG5jb25zdCB7IGpvaW4gfSA9IHBhdGg7XG5zaGVsbC5jb25maWcuZmF0YWwgPSB0cnVlO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIC5kZXNrdG9wIGRpciBzY2FmZm9sZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWxlY3Ryb25BcHBTY2FmZm9sZCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNZXRlb3JEZXNrdG9wfSAkIC0gY29udGV4dFxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCQpIHtcbiAgICAgICAgdGhpcy5sb2cgPSBuZXcgTG9nKCdlbGVjdHJvbkFwcFNjYWZmb2xkJyk7XG4gICAgICAgIHRoaXMuJCA9ICQ7XG5cbiAgICAgICAgdGhpcy5wYWNrYWdlSnNvbiA9IHtcbiAgICAgICAgICAgIG5hbWU6ICdNeU1ldGVvckFwcCcsXG4gICAgICAgICAgICBtYWluOiAodGhpcy4kLmVudi5pc1Byb2R1Y3Rpb25CdWlsZCgpKSA/XG4gICAgICAgICAgICAgICAgJ2FwcC5hc2FyL2luZGV4LmpzJyA6ICdhcHAvaW5kZXguanMnLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiBPYmplY3QuYXNzaWduKHt9LCBkZXBlbmRlbmNpZXMpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCF0aGlzLiQuZW52LmlzUHJvZHVjdGlvbkJ1aWxkKCkgfHwgdGhpcy4kLmVudi5vcHRpb25zLnByb2REZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXNbJ2VsZWN0cm9uLWRlYnVnJ10gPSAnMS41LjAnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSnVzdCBhIHB1YmxpYyBnZXR0ZXIgZnJvbSB0aGUgZGVmYXVsdCBwYWNrYWdlLmpzb24gb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgZ2V0RGVmYXVsdFBhY2thZ2VKc29uKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIGVsZWN0cm9uIGFwcC4gUmVtb3ZlcyBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgbm9kZV9tb2R1bGVzIHdoaWNoIHdvdWxkIGJlIGEgd2FzdGVcbiAgICAgKiB0byBkZWxldGUuIExhdGVyIGBucG0gcHJ1bmVgIHdpbGwga2VlcCBpdCBjbGVhci5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiQudXRpbHMuZXhpc3RzKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAucm9vdCkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoYGNyZWF0aW5nICR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5yb290TmFtZX1gKTtcbiAgICAgICAgICAgIHNoZWxsLm1rZGlyKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAucm9vdCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVsKFtcbiAgICAgICAgICAgIGAke3RoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAucm9vdH0ke3BhdGguc2VwfSpgLFxuICAgICAgICAgICAgYCEke3RoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubm9kZU1vZHVsZXN9YFxuICAgICAgICBdLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEp1c3QgY29waWVzIHRoZSBTa2VsZXRvbiBBcHAgaW50byB0aGUgZWxlY3Ryb24gYXBwLlxuICAgICAqL1xuICAgIGNvcHlTa2VsZXRvbkFwcCgpIHtcbiAgICAgICAgdGhpcy5sb2cudmVyYm9zZSgnY29weWluZyBza2VsZXRvbiBhcHAnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNoZWxsLmNwKFxuICAgICAgICAgICAgICAgICctcmYnLFxuICAgICAgICAgICAgICAgIGpvaW4odGhpcy4kLmVudi5wYXRocy5tZXRlb3JEZXNrdG9wLnNrZWxldG9uLCAnKicpLFxuICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuYXBwUm9vdCArIHBhdGguc2VwXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignZXJyb3Igd2hpbGUgY29weWluZyBza2VsZXRvbiBhcHA6JywgZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZnRlciBjbGVhcmluZyB0aGUgZWxlY3Ryb24gYXBwIHBhdGgsIGNvcGllcyBhIGZyZXNoIHNrZWxldG9uLlxuICAgICAqL1xuICAgIGFzeW5jIG1ha2UoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmxvZy52ZXJib3NlKGBjbGVhcmluZyAke3RoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAucm9vdE5hbWV9YCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsZWFyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgICAgICAgIGBlcnJvciB3aGlsZSByZW1vdmluZyAke3RoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAucm9vdH06IGAsIGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNyZWF0ZUFwcFJvb3QoKTtcblxuICAgICAgICB0aGlzLmNvcHlTa2VsZXRvbkFwcCgpO1xuXG4gICAgICAgIC8vIFRPRE86IGhleSwgd2FpdCwgLmdpdGlnbm9yZSBpcyBub3QgbmVlZGVkIC0gcmlnaHQ/XG4gICAgICAgIC8qXG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdjcmVhdGluZyAuZ2l0aWdub3JlJyk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5naXRJZ25vcmUsIFtcbiAgICAgICAgICAgICdub2RlX21vZHVsZXMnXG4gICAgICAgIF0uam9pbignXFxuJykpO1xuICAgICAgICAqL1xuICAgICAgICB0aGlzLmxvZy52ZXJib3NlKCd3cml0aW5nIHBhY2thZ2UuanNvbicpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5wYWNrYWdlSnNvbiwgSlNPTi5zdHJpbmdpZnkodGhpcy5wYWNrYWdlSnNvbiwgbnVsbCwgMilcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBhcHAgZGlyZWN0b3J5IGluIHRoZSBlbGVjdHJvbiBhcHAuXG4gICAgICovXG4gICAgY3JlYXRlQXBwUm9vdCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMubG9nLnZlcmJvc2UoYGNyZWF0aW5nICR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290fWApO1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAuYXBwUm9vdCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlLmNvZGUgIT09ICdFRVhJU1QnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBlcnJvciB3aGlsZSBjcmVhdGluZyBkaXI6ICR7dGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290fTogYCwgZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxJQUFBQSxRQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxHQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxJQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxRQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxLQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBSyxJQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSxxQkFBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBQWtELFNBQUFELHVCQUFBUSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBUmxEOztBQVVBLE1BQU07RUFBRUc7QUFBSyxDQUFDLEdBQUdDLGFBQUk7QUFDckJDLGdCQUFLLENBQUNDLE1BQU0sQ0FBQ0MsS0FBSyxHQUFHLElBQUk7O0FBRXpCO0FBQ0E7QUFDQTtBQUNlLE1BQU1DLG1CQUFtQixDQUFDO0VBQ3JDO0FBQ0o7QUFDQTtBQUNBO0VBQ0lDLFdBQVdBLENBQUNDLENBQUMsRUFBRTtJQUNYLElBQUksQ0FBQ0MsR0FBRyxHQUFHLElBQUlDLFlBQUcsQ0FBQyxxQkFBcUIsQ0FBQztJQUN6QyxJQUFJLENBQUNGLENBQUMsR0FBR0EsQ0FBQztJQUVWLElBQUksQ0FBQ0csV0FBVyxHQUFHO01BQ2ZDLElBQUksRUFBRSxhQUFhO01BQ25CQyxJQUFJLEVBQUcsSUFBSSxDQUFDTCxDQUFDLENBQUNNLEdBQUcsQ0FBQ0MsaUJBQWlCLENBQUMsQ0FBQyxHQUNqQyxtQkFBbUIsR0FBRyxjQUFjO01BQ3hDQyxZQUFZLEVBQUVDLE1BQU0sQ0FB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