@meteor-community/meteor-desktop
Version:
Build a Meteor's desktop client with hot code push.
129 lines (122 loc) • 17.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime"));
var _fs = _interopRequireDefault(require("fs"));
var _crossSpawn = _interopRequireDefault(require("cross-spawn"));
var _log = _interopRequireDefault(require("./log"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
// eslint-disable-next-line no-unused-vars
/**
* Utility class designed for managing Meteor packages.
*
* @property {MeteorDesktop} $
* @class
*/
class MeteorManager {
/**
* @param {MeteorDesktop} $ - context
* @constructor
*/
constructor($) {
this.log = new _log.default('meteorManager');
this.$ = $;
}
/**
* Looks for specified packages in .meteor/packages. In other words checks if the project has
* specified packages added.
* @param {Array} packages
* @returns {boolean}
*/
checkPackages(packages) {
const usedPackages = _fs.default.readFileSync(this.$.env.paths.meteorApp.packages, 'UTF-8').replace(/\r/gm, '').split('\n').filter(line => !line.trim().startsWith('#'));
return !packages.some(packageToFind => !usedPackages.some(meteorPackage => ~meteorPackage.indexOf(packageToFind)));
}
/**
* Looks for specified packages in .meteor/packages. In other words checks if the project has
* specified packages added.
* @param {Array} packages
* @returns {boolean}
*/
checkPackagesVersion(packages) {
const usedPackages = _fs.default.readFileSync(this.$.env.paths.meteorApp.versions, 'UTF-8').replace(/\r/gm, '').split('\n');
return !packages.some(packageToFind => !usedPackages.some(meteorPackage => meteorPackage === packageToFind));
}
/**
* Ensures certain packages are added to meteor project and in correct version.
* @param {Array} packages
* @param {Array} packagesWithVersion
* @param {string} who - name of the entity that requests presence of thos packages (can be the
* integration itself or a plugin)
* @returns {Promise.<void>}
*/
async ensurePackages(packages, packagesWithVersion, who) {
if (!this.checkPackages(packages)) {
this.log.warn(`${who} requires some packages that are not added to project, will try to add them now`);
try {
await this.addPackages(packages, packagesWithVersion);
} catch (e) {
throw new Error(e);
}
}
if (!this.checkPackagesVersion(packagesWithVersion)) {
this.log.warn(`${who} required packages version is different, fixing it`);
try {
await this.addPackages(packages, packagesWithVersion);
} catch (e) {
throw new Error(e);
}
}
}
/**
* Removes packages from the meteor app.
* @param {Array} packages - array with names of the packages to remove
*/
deletePackages(packages) {
this.log.warn('removing packages from meteor project', ...packages);
return new Promise((resolve, reject) => {
(0, _crossSpawn.default)('meteor', ['remove'].concat(packages), {
cwd: this.$.env.paths.meteorApp.root,
stdio: ['pipe', 'pipe', process.stderr],
env: Object.assign({
METEOR_PRETTY_OUTPUT: 0,
METEOR_NO_RELEASE_CHECK: 1
}, process.env)
}).on('exit', code => {
if (code !== 0 || this.checkPackages(packages)) {
reject('removing packages failed');
} else {
resolve();
}
});
});
}
/**
* Adds packages to the meteor app.
* @param {Array} packages - array with names of the packages to add
* @param {Array} packagesWithVersion - array with names and versions of the packages to add
*/
addPackages(packages, packagesWithVersion) {
this.log.info('adding packages to meteor project', ...packagesWithVersion);
return new Promise((resolve, reject) => {
(0, _crossSpawn.default)('meteor', ['add'].concat(packagesWithVersion.map(packageName => packageName.replace('@', '@='))), {
cwd: this.$.env.paths.meteorApp.root,
stdio: ['pipe', 'pipe', process.stderr],
env: Object.assign({
METEOR_PRETTY_OUTPUT: 0,
METEOR_NO_RELEASE_CHECK: 1
}, process.env)
}).on('exit', code => {
if (code !== 0 || !this.checkPackages(packages)) {
reject('adding packages failed');
} else {
resolve();
}
});
});
}
}
exports.default = MeteorManager;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcnVudGltZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2ZzIiwiX2Nyb3NzU3Bhd24iLCJfbG9nIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiTWV0ZW9yTWFuYWdlciIsImNvbnN0cnVjdG9yIiwiJCIsImxvZyIsIkxvZyIsImNoZWNrUGFja2FnZXMiLCJwYWNrYWdlcyIsInVzZWRQYWNrYWdlcyIsImZzIiwicmVhZEZpbGVTeW5jIiwiZW52IiwicGF0aHMiLCJtZXRlb3JBcHAiLCJyZXBsYWNlIiwic3BsaXQiLCJmaWx0ZXIiLCJsaW5lIiwidHJpbSIsInN0YXJ0c1dpdGgiLCJzb21lIiwicGFja2FnZVRvRmluZCIsIm1ldGVvclBhY2thZ2UiLCJpbmRleE9mIiwiY2hlY2tQYWNrYWdlc1ZlcnNpb24iLCJ2ZXJzaW9ucyIsImVuc3VyZVBhY2thZ2VzIiwicGFja2FnZXNXaXRoVmVyc2lvbiIsIndobyIsIndhcm4iLCJhZGRQYWNrYWdlcyIsIkVycm9yIiwiZGVsZXRlUGFja2FnZXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNwYXduIiwiY29uY2F0IiwiY3dkIiwicm9vdCIsInN0ZGlvIiwicHJvY2VzcyIsInN0ZGVyciIsIk9iamVjdCIsImFzc2lnbiIsIk1FVEVPUl9QUkVUVFlfT1VUUFVUIiwiTUVURU9SX05PX1JFTEVBU0VfQ0hFQ0siLCJvbiIsImNvZGUiLCJpbmZvIiwibWFwIiwicGFja2FnZU5hbWUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vbGliL21ldGVvck1hbmFnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5pbXBvcnQgcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZSc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHNwYXduIGZyb20gJ2Nyb3NzLXNwYXduJztcblxuaW1wb3J0IExvZyBmcm9tICcuL2xvZyc7XG5cbi8qKlxuICogVXRpbGl0eSBjbGFzcyBkZXNpZ25lZCBmb3IgbWFuYWdpbmcgTWV0ZW9yIHBhY2thZ2VzLlxuICpcbiAqIEBwcm9wZXJ0eSB7TWV0ZW9yRGVza3RvcH0gJFxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGVvck1hbmFnZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TWV0ZW9yRGVza3RvcH0gJCAtIGNvbnRleHRcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigkKSB7XG4gICAgICAgIHRoaXMubG9nID0gbmV3IExvZygnbWV0ZW9yTWFuYWdlcicpO1xuICAgICAgICB0aGlzLiQgPSAkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvb2tzIGZvciBzcGVjaWZpZWQgcGFja2FnZXMgaW4gLm1ldGVvci9wYWNrYWdlcy4gSW4gb3RoZXIgd29yZHMgY2hlY2tzIGlmIHRoZSBwcm9qZWN0IGhhc1xuICAgICAqIHNwZWNpZmllZCBwYWNrYWdlcyBhZGRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWNrYWdlc1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGNoZWNrUGFja2FnZXMocGFja2FnZXMpIHtcbiAgICAgICAgY29uc3QgdXNlZFBhY2thZ2VzID0gZnNcbiAgICAgICAgICAgIC5yZWFkRmlsZVN5bmModGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAucGFja2FnZXMsICdVVEYtOCcpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxyL2dtLCAnJylcbiAgICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiAhbGluZS50cmltKCkuc3RhcnRzV2l0aCgnIycpKTtcbiAgICAgICAgcmV0dXJuICFwYWNrYWdlcy5zb21lKFxuICAgICAgICAgICAgcGFja2FnZVRvRmluZCA9PlxuICAgICAgICAgICAgICAgICF1c2VkUGFja2FnZXMuc29tZShtZXRlb3JQYWNrYWdlID0+IH5tZXRlb3JQYWNrYWdlLmluZGV4T2YocGFja2FnZVRvRmluZCkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9va3MgZm9yIHNwZWNpZmllZCBwYWNrYWdlcyBpbiAubWV0ZW9yL3BhY2thZ2VzLiBJbiBvdGhlciB3b3JkcyBjaGVja3MgaWYgdGhlIHByb2plY3QgaGFzXG4gICAgICogc3BlY2lmaWVkIHBhY2thZ2VzIGFkZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2thZ2VzXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgY2hlY2tQYWNrYWdlc1ZlcnNpb24ocGFja2FnZXMpIHtcbiAgICAgICAgY29uc3QgdXNlZFBhY2thZ2VzID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLnZlcnNpb25zLCAnVVRGLTgnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcci9nbSwgJycpXG4gICAgICAgICAgICAuc3BsaXQoJ1xcbicpO1xuICAgICAgICByZXR1cm4gIXBhY2thZ2VzLnNvbWUoXG4gICAgICAgICAgICBwYWNrYWdlVG9GaW5kID0+ICF1c2VkUGFja2FnZXMuc29tZShtZXRlb3JQYWNrYWdlID0+IG1ldGVvclBhY2thZ2UgPT09IHBhY2thZ2VUb0ZpbmQpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5zdXJlcyBjZXJ0YWluIHBhY2thZ2VzIGFyZSBhZGRlZCB0byBtZXRlb3IgcHJvamVjdCBhbmQgaW4gY29ycmVjdCB2ZXJzaW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2thZ2VzXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2FnZXNXaXRoVmVyc2lvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB3aG8gLSBuYW1lIG9mIHRoZSBlbnRpdHkgdGhhdCByZXF1ZXN0cyBwcmVzZW5jZSBvZiB0aG9zIHBhY2thZ2VzIChjYW4gYmUgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgIGludGVncmF0aW9uIGl0c2VsZiBvciBhIHBsdWdpbilcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZS48dm9pZD59XG4gICAgICovXG4gICAgYXN5bmMgZW5zdXJlUGFja2FnZXMocGFja2FnZXMsIHBhY2thZ2VzV2l0aFZlcnNpb24sIHdobykge1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tQYWNrYWdlcyhwYWNrYWdlcykpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYCR7d2hvfSByZXF1aXJlcyBzb21lIHBhY2thZ2VzIHRoYXQgYXJlIG5vdCBhZGRlZCB0byBwcm9qZWN0LCB3aWxsIHRyeSB0byBhZGQgdGhlbSBub3dgKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRQYWNrYWdlcyhwYWNrYWdlcywgcGFja2FnZXNXaXRoVmVyc2lvbik7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jaGVja1BhY2thZ2VzVmVyc2lvbihwYWNrYWdlc1dpdGhWZXJzaW9uKSkge1xuICAgICAgICAgICAgdGhpcy5sb2cud2FybihgJHt3aG99IHJlcXVpcmVkIHBhY2thZ2VzIHZlcnNpb24gaXMgZGlmZmVyZW50LCBmaXhpbmcgaXRgKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRQYWNrYWdlcyhwYWNrYWdlcywgcGFja2FnZXNXaXRoVmVyc2lvbik7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBwYWNrYWdlcyBmcm9tIHRoZSBtZXRlb3IgYXBwLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2thZ2VzICAgICAgICAgICAgLSBhcnJheSB3aXRoIG5hbWVzIG9mIHRoZSBwYWNrYWdlcyB0byByZW1vdmVcbiAgICAgKi9cbiAgICBkZWxldGVQYWNrYWdlcyhwYWNrYWdlcykge1xuICAgICAgICB0aGlzLmxvZy53YXJuKCdyZW1vdmluZyBwYWNrYWdlcyBmcm9tIG1ldGVvciBwcm9qZWN0JywgLi4ucGFja2FnZXMpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc3Bhd24oXG4gICAgICAgICAgICAgICAgJ21ldGVvcicsXG4gICAgICAgICAgICAgICAgWydyZW1vdmUnXS5jb25jYXQocGFja2FnZXMpLCB7XG4gICAgICAgICAgICAgICAgICAgIGN3ZDogdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgc3RkaW86IFsncGlwZScsICdwaXBlJywgcHJvY2Vzcy5zdGRlcnJdLFxuICAgICAgICAgICAgICAgICAgICBlbnY6IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAgICAgICAgICB7IE1FVEVPUl9QUkVUVFlfT1VUUFVUOiAwLCBNRVRFT1JfTk9fUkVMRUFTRV9DSEVDSzogMSB9LCBwcm9jZXNzLmVudlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgIT09IDAgfHwgdGhpcy5jaGVja1BhY2thZ2VzKHBhY2thZ2VzKSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ3JlbW92aW5nIHBhY2thZ2VzIGZhaWxlZCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBwYWNrYWdlcyB0byB0aGUgbWV0ZW9yIGFwcC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWNrYWdlcyAgICAgICAgICAgIC0gYXJyYXkgd2l0aCBuYW1lcyBvZiB0aGUgcGFja2FnZXMgdG8gYWRkXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2FnZXNXaXRoVmVyc2lvbiAtIGFycmF5IHdpdGggbmFtZXMgYW5kIHZlcnNpb25zIG9mIHRoZSBwYWNrYWdlcyB0byBhZGRcbiAgICAgKi9cbiAgICBhZGRQYWNrYWdlcyhwYWNrYWdlcywgcGFja2FnZXNXaXRoVmVyc2lvbikge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdhZGRpbmcgcGFja2FnZXMgdG8gbWV0ZW9yIHByb2plY3QnLCAuLi5wYWNrYWdlc1dpdGhWZXJzaW9uKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHNwYXduKFxuICAgICAgICAgICAgICAgICdtZXRlb3InLFxuICAgICAgICAgICAgICAgIFsnYWRkJ10uY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICBwYWNrYWdlc1dpdGhWZXJzaW9uLm1hcChwYWNrYWdlTmFtZSA9PiBwYWNrYWdlTmFtZS5yZXBsYWNlKCdAJywgJ0A9JykpXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGN3ZDogdGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgc3RkaW86IFsncGlwZScsICdwaXBlJywgcHJvY2Vzcy5zdGRlcnJdLFxuICAgICAgICAgICAgICAgICAgICBlbnY6IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAgICAgICAgICB7IE1FVEVPUl9QUkVUVFlfT1VUUFVUOiAwLCBNRVRFT1JfTk9fUkVMRUFTRV9DSEVDSzogMSB9LCBwcm9jZXNzLmVudlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgIT09IDAgfHwgIXRoaXMuY2hlY2tQYWNrYWdlcyhwYWNrYWdlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdhZGRpbmcgcGFja2FnZXMgZmFpbGVkJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLElBQUFBLFFBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEdBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFdBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFHLElBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUF3QixTQUFBRCx1QkFBQUssQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUx4Qjs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZSxNQUFNRyxhQUFhLENBQUM7RUFDL0I7QUFDSjtBQUNBO0FBQ0E7RUFDSUMsV0FBV0EsQ0FBQ0MsQ0FBQyxFQUFFO0lBQ1gsSUFBSSxDQUFDQyxHQUFHLEdBQUcsSUFBSUMsWUFBRyxDQUFDLGVBQWUsQ0FBQztJQUNuQyxJQUFJLENBQUNGLENBQUMsR0FBR0EsQ0FBQztFQUNkOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJRyxhQUFhQSxD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