UNPKG

@sharekey/meteor-desktop

Version:

Build a Meteor's desktop client with hot code push.

118 lines (113 loc) 16.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime")); var _assignIn = _interopRequireDefault(require("lodash/assignIn")); var _path = _interopRequireDefault(require("path")); var _fs = _interopRequireDefault(require("fs")); var _shelljs = _interopRequireDefault(require("shelljs")); var _log = _interopRequireDefault(require("./log")); var _defaultDependencies = _interopRequireDefault(require("./defaultDependencies")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // eslint-disable-next-line no-unused-vars const { join } = _path.default; /** * Wrapper around electron-packager. * @class */ class ElectronPackager { constructor($) { this.log = new _log.default('electron-packager'); this.$ = $; } async init() { this.packager = (await this.$.getDependency('electron-packager', _defaultDependencies.default['electron-packager'])).dependency; } /** * Runs the packager with provided arguments. * * @param {Object} args * @returns {Promise} */ runPackager(args) { return new Promise((resolve, reject) => { this.packager(args, err => { if (err) { reject(err); } else { this.log.info(`wrote packaged app to ${this.$.env.paths.packageDir}`); resolve(); } }); }); } async packageApp() { const { version } = JSON.parse(_fs.default.readFileSync(join(this.$.env.paths.meteorApp.root, 'node_modules', 'electron', 'package.json'), 'UTF-8')); const settings = this.$.desktop.getSettings(); const { name } = settings; if (!name) { this.log.error('`name` field in settings.json not set'); process.exit(1); } const arch = this.$.env.options.ia32 ? 'ia32' : 'x64'; this.log.info(`packaging '${name}' for platform '${this.$.env.sys.platform}-${arch}'` + ` using electron v${version}`); try { await this.$.utils.rmWithRetries('-rf', _path.default.join(this.$.env.options.output, this.$.env.paths.packageDir)); } catch (e) { throw new Error(e); } const args = { name, arch, prune: false, electronVersion: version, platform: this.$.env.sys.platform, dir: this.$.env.paths.electronApp.root, out: _path.default.join(this.$.env.options.output, this.$.env.paths.packageDir) }; if ('packagerOptions' in settings) { const { packagerOptions } = settings; ['windows', 'linux', 'osx'].forEach(system => { if (this.$.env.os[`is${system[0].toUpperCase()}${system.substring(1)}`] && `_${system}` in packagerOptions) { (0, _assignIn.default)(packagerOptions, packagerOptions[`_${system}`]); } }); Object.keys(packagerOptions).forEach(field => { if (packagerOptions[field] === '@version') { packagerOptions[field] = settings.version; } }); (0, _assignIn.default)(args, packagerOptions); } // Move node_modules away. We do not want to delete it, just temporarily remove it from // our way. _fs.default.renameSync(this.$.env.paths.electronApp.nodeModules, this.$.env.paths.electronApp.tmpNodeModules); let extracted = false; if (this.$.utils.exists(this.$.env.paths.electronApp.extractedNodeModules)) { _fs.default.renameSync(this.$.env.paths.electronApp.extractedNodeModules, this.$.env.paths.electronApp.nodeModules); extracted = true; } try { await this.runPackager(args); } finally { if (extracted) { _shelljs.default.rm('-rf', this.$.env.paths.electronApp.extractedNodeModules); _shelljs.default.rm('-rf', this.$.env.paths.electronApp.nodeModules); } // Move node_modules back. _fs.default.renameSync(this.$.env.paths.electronApp.tmpNodeModules, this.$.env.paths.electronApp.nodeModules); } } } exports.default = ElectronPackager; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcnVudGltZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2Fzc2lnbkluIiwiX3BhdGgiLCJfZnMiLCJfc2hlbGxqcyIsIl9sb2ciLCJfZGVmYXVsdERlcGVuZGVuY2llcyIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0Iiwiam9pbiIsInBhdGgiLCJFbGVjdHJvblBhY2thZ2VyIiwiY29uc3RydWN0b3IiLCIkIiwibG9nIiwiTG9nIiwiaW5pdCIsInBhY2thZ2VyIiwiZ2V0RGVwZW5kZW5jeSIsImRlZmF1bHREZXBlbmRlbmNpZXMiLCJkZXBlbmRlbmN5IiwicnVuUGFja2FnZXIiLCJhcmdzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJlcnIiLCJpbmZvIiwiZW52IiwicGF0aHMiLCJwYWNrYWdlRGlyIiwicGFja2FnZUFwcCIsInZlcnNpb24iLCJKU09OIiwicGFyc2UiLCJmcyIsInJlYWRGaWxlU3luYyIsIm1ldGVvckFwcCIsInJvb3QiLCJzZXR0aW5ncyIsImRlc2t0b3AiLCJnZXRTZXR0aW5ncyIsIm5hbWUiLCJlcnJvciIsInByb2Nlc3MiLCJleGl0IiwiYXJjaCIsIm9wdGlvbnMiLCJpYTMyIiwic3lzIiwicGxhdGZvcm0iLCJ1dGlscyIsInJtV2l0aFJldHJpZXMiLCJvdXRwdXQiLCJlIiwiRXJyb3IiLCJwcnVuZSIsImVsZWN0cm9uVmVyc2lvbiIsImRpciIsImVsZWN0cm9uQXBwIiwib3V0IiwicGFja2FnZXJPcHRpb25zIiwiZm9yRWFjaCIsInN5c3RlbSIsIm9zIiwidG9VcHBlckNhc2UiLCJzdWJzdHJpbmciLCJhc3NpZ25JbiIsIk9iamVjdCIsImtleXMiLCJmaWVsZCIsInJlbmFtZVN5bmMiLCJub2RlTW9kdWxlcyIsInRtcE5vZGVNb2R1bGVzIiwiZXh0cmFjdGVkIiwiZXhpc3RzIiwiZXh0cmFjdGVkTm9kZU1vZHVsZXMiLCJzaGVsbCIsInJtIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL2xpYi9wYWNrYWdlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmltcG9ydCByZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSAncmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lJztcbmltcG9ydCBhc3NpZ25JbiBmcm9tICdsb2Rhc2gvYXNzaWduSW4nO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHNoZWxsIGZyb20gJ3NoZWxsanMnO1xuXG5pbXBvcnQgTG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCBkZWZhdWx0RGVwZW5kZW5jaWVzIGZyb20gJy4vZGVmYXVsdERlcGVuZGVuY2llcyc7XG5cbmNvbnN0IHsgam9pbiB9ID0gcGF0aDtcblxuLyoqXG4gKiBXcmFwcGVyIGFyb3VuZCBlbGVjdHJvbi1wYWNrYWdlci5cbiAqIEBjbGFzc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbGVjdHJvblBhY2thZ2VyIHtcbiAgICBjb25zdHJ1Y3RvcigkKSB7XG4gICAgICAgIHRoaXMubG9nID0gbmV3IExvZygnZWxlY3Ryb24tcGFja2FnZXInKTtcbiAgICAgICAgdGhpcy4kID0gJDtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCkge1xuICAgICAgICB0aGlzLnBhY2thZ2VyID0gKGF3YWl0IHRoaXMuJC5nZXREZXBlbmRlbmN5KCdlbGVjdHJvbi1wYWNrYWdlcicsIGRlZmF1bHREZXBlbmRlbmNpZXNbJ2VsZWN0cm9uLXBhY2thZ2VyJ10pKS5kZXBlbmRlbmN5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgdGhlIHBhY2thZ2VyIHdpdGggcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFyZ3NcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBydW5QYWNrYWdlcihhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBhY2thZ2VyKGFyZ3MsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oYHdyb3RlIHBhY2thZ2VkIGFwcCB0byAke3RoaXMuJC5lbnYucGF0aHMucGFja2FnZURpcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBwYWNrYWdlQXBwKCkge1xuICAgICAgICBjb25zdCB7IHZlcnNpb24gfSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgam9pbihcbiAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC5yb290LFxuICAgICAgICAgICAgICAgICdub2RlX21vZHVsZXMnLFxuICAgICAgICAgICAgICAgICdlbGVjdHJvbicsXG4gICAgICAgICAgICAgICAgJ3BhY2thZ2UuanNvbidcbiAgICAgICAgICAgICksICdVVEYtOCdcbiAgICAgICAgKSk7XG5cbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLiQuZGVza3RvcC5nZXRTZXR0aW5ncygpO1xuICAgICAgICBjb25zdCB7IG5hbWUgfSA9IHNldHRpbmdzO1xuICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdgbmFtZWAgZmllbGQgaW4gc2V0dGluZ3MuanNvbiBub3Qgc2V0Jyk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmNoID0gdGhpcy4kLmVudi5vcHRpb25zLmlhMzIgPyAnaWEzMicgOiAneDY0JztcblxuICAgICAgICB0aGlzLmxvZy5pbmZvKFxuICAgICAgICAgICAgYHBhY2thZ2luZyAnJHtuYW1lfScgZm9yIHBsYXRmb3JtICcke3RoaXMuJC5lbnYuc3lzLnBsYXRmb3JtfS0ke2FyY2h9J2AgK1xuICAgICAgICAgICAgYCB1c2luZyBlbGVjdHJvbiB2JHt2ZXJzaW9ufWBcbiAgICAgICAgKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4kLnV0aWxzLnJtV2l0aFJldHJpZXMoXG4gICAgICAgICAgICAgICAgJy1yZicsIHBhdGguam9pbih0aGlzLiQuZW52Lm9wdGlvbnMub3V0cHV0LCB0aGlzLiQuZW52LnBhdGhzLnBhY2thZ2VEaXIpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGFyY2gsXG4gICAgICAgICAgICBwcnVuZTogZmFsc2UsXG4gICAgICAgICAgICBlbGVjdHJvblZlcnNpb246IHZlcnNpb24sXG4gICAgICAgICAgICBwbGF0Zm9ybTogdGhpcy4kLmVudi5zeXMucGxhdGZvcm0sXG4gICAgICAgICAgICBkaXI6IHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAucm9vdCxcbiAgICAgICAgICAgIG91dDogcGF0aC5qb2luKHRoaXMuJC5lbnYub3B0aW9ucy5vdXRwdXQsIHRoaXMuJC5lbnYucGF0aHMucGFja2FnZURpcilcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoJ3BhY2thZ2VyT3B0aW9ucycgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcGFja2FnZXJPcHRpb25zIH0gPSBzZXR0aW5ncztcblxuICAgICAgICAgICAgWyd3aW5kb3dzJywgJ2xpbnV4JywgJ29zeCddLmZvckVhY2goKHN5c3RlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kLmVudi5vc1tgaXMke3N5c3RlbVswXS50b1VwcGVyQ2FzZSgpfSR7c3lzdGVtLnN1YnN0cmluZygxKX1gXSAmJlxuICAgICAgICAgICAgICAgICAgICAoYF8ke3N5c3RlbX1gKSBpbiBwYWNrYWdlck9wdGlvbnNcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgYXNzaWduSW4ocGFja2FnZXJPcHRpb25zLCBwYWNrYWdlck9wdGlvbnNbYF8ke3N5c3RlbX1gXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHBhY2thZ2VyT3B0aW9ucykuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGFja2FnZXJPcHRpb25zW2ZpZWxkXSA9PT0gJ0B2ZXJzaW9uJykge1xuICAgICAgICAgICAgICAgICAgICBwYWNrYWdlck9wdGlvbnNbZmllbGRdID0gc2V0dGluZ3MudmVyc2lvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXNzaWduSW4oYXJncywgcGFja2FnZXJPcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vdmUgbm9kZV9tb2R1bGVzIGF3YXkuIFdlIGRvIG5vdCB3YW50IHRvIGRlbGV0ZSBpdCwganVzdCB0ZW1wb3JhcmlseSByZW1vdmUgaXQgZnJvbVxuICAgICAgICAvLyBvdXIgd2F5LlxuICAgICAgICBmcy5yZW5hbWVTeW5jKFxuICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5ub2RlTW9kdWxlcyxcbiAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAudG1wTm9kZU1vZHVsZXNcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgZXh0cmFjdGVkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuJC51dGlscy5leGlzdHModGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWROb2RlTW9kdWxlcykpIHtcbiAgICAgICAgICAgIGZzLnJlbmFtZVN5bmMoXG4gICAgICAgICAgICAgICAgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWROb2RlTW9kdWxlcyxcbiAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLm5vZGVNb2R1bGVzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZXh0cmFjdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJ1blBhY2thZ2VyKGFyZ3MpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKGV4dHJhY3RlZCkge1xuICAgICAgICAgICAgICAgIHNoZWxsLnJtKCctcmYnLCB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLmV4dHJhY3RlZE5vZGVNb2R1bGVzKTtcbiAgICAgICAgICAgICAgICBzaGVsbC5ybSgnLXJmJywgdGhpcy4kLmVudi5wYXRocy5lbGVjdHJvbkFwcC5ub2RlTW9kdWxlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNb3ZlIG5vZGVfbW9kdWxlcyBiYWNrLlxuICAgICAgICAgICAgZnMucmVuYW1lU3luYyhcbiAgICAgICAgICAgICAgICB0aGlzLiQuZW52LnBhdGhzLmVsZWN0cm9uQXBwLnRtcE5vZGVNb2R1bGVzLFxuICAgICAgICAgICAgICAgIHRoaXMuJC5lbnYucGF0aHMuZWxlY3Ryb25BcHAubm9kZU1vZHVsZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLElBQUFBLFFBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNB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