@sharekey/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(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// 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 those 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcnVudGltZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2ZzIiwiX2Nyb3NzU3Bhd24iLCJfbG9nIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJNZXRlb3JNYW5hZ2VyIiwiY29uc3RydWN0b3IiLCIkIiwibG9nIiwiTG9nIiwiY2hlY2tQYWNrYWdlcyIsInBhY2thZ2VzIiwidXNlZFBhY2thZ2VzIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJlbnYiLCJwYXRocyIsIm1ldGVvckFwcCIsInJlcGxhY2UiLCJzcGxpdCIsImZpbHRlciIsImxpbmUiLCJ0cmltIiwic3RhcnRzV2l0aCIsInNvbWUiLCJwYWNrYWdlVG9GaW5kIiwibWV0ZW9yUGFja2FnZSIsImluZGV4T2YiLCJjaGVja1BhY2thZ2VzVmVyc2lvbiIsInZlcnNpb25zIiwiZW5zdXJlUGFja2FnZXMiLCJwYWNrYWdlc1dpdGhWZXJzaW9uIiwid2hvIiwid2FybiIsImFkZFBhY2thZ2VzIiwiZSIsIkVycm9yIiwiZGVsZXRlUGFja2FnZXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNwYXduIiwiY29uY2F0IiwiY3dkIiwicm9vdCIsInN0ZGlvIiwicHJvY2VzcyIsInN0ZGVyciIsIk9iamVjdCIsImFzc2lnbiIsIk1FVEVPUl9QUkVUVFlfT1VUUFVUIiwiTUVURU9SX05PX1JFTEVBU0VfQ0hFQ0siLCJvbiIsImNvZGUiLCJpbmZvIiwibWFwIiwicGFja2FnZU5hbWUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vbGliL21ldGVvck1hbmFnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5pbXBvcnQgcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZSc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHNwYXduIGZyb20gJ2Nyb3NzLXNwYXduJztcblxuaW1wb3J0IExvZyBmcm9tICcuL2xvZyc7XG5cbi8qKlxuICogVXRpbGl0eSBjbGFzcyBkZXNpZ25lZCBmb3IgbWFuYWdpbmcgTWV0ZW9yIHBhY2thZ2VzLlxuICpcbiAqIEBwcm9wZXJ0eSB7TWV0ZW9yRGVza3RvcH0gJFxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGVvck1hbmFnZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TWV0ZW9yRGVza3RvcH0gJCAtIGNvbnRleHRcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigkKSB7XG4gICAgICAgIHRoaXMubG9nID0gbmV3IExvZygnbWV0ZW9yTWFuYWdlcicpO1xuICAgICAgICB0aGlzLiQgPSAkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvb2tzIGZvciBzcGVjaWZpZWQgcGFja2FnZXMgaW4gLm1ldGVvci9wYWNrYWdlcy4gSW4gb3RoZXIgd29yZHMgY2hlY2tzIGlmIHRoZSBwcm9qZWN0IGhhc1xuICAgICAqIHNwZWNpZmllZCBwYWNrYWdlcyBhZGRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWNrYWdlc1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGNoZWNrUGFja2FnZXMocGFja2FnZXMpIHtcbiAgICAgICAgY29uc3QgdXNlZFBhY2thZ2VzID0gZnNcbiAgICAgICAgICAgIC5yZWFkRmlsZVN5bmModGhpcy4kLmVudi5wYXRocy5tZXRlb3JBcHAucGFja2FnZXMsICdVVEYtOCcpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxyL2dtLCAnJylcbiAgICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiAhbGluZS50cmltKCkuc3RhcnRzV2l0aCgnIycpKTtcbiAgICAgICAgcmV0dXJuICFwYWNrYWdlcy5zb21lKFxuICAgICAgICAgICAgcGFja2FnZVRvRmluZCA9PlxuICAgICAgICAgICAgICAgICF1c2VkUGFja2FnZXMuc29tZShtZXRlb3JQYWNrYWdlID0+IH5tZXRlb3JQYWNrYWdlLmluZGV4T2YocGFja2FnZVRvRmluZCkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9va3MgZm9yIHNwZWNpZmllZCBwYWNrYWdlcyBpbiAubWV0ZW9yL3BhY2thZ2VzLiBJbiBvdGhlciB3b3JkcyBjaGVja3MgaWYgdGhlIHByb2plY3QgaGFzXG4gICAgICogc3BlY2lmaWVkIHBhY2thZ2VzIGFkZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2thZ2VzXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgY2hlY2tQYWNrYWdlc1ZlcnNpb24ocGFja2FnZXMpIHtcbiAgICAgICAgY29uc3QgdXNlZFBhY2thZ2VzID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLnZlcnNpb25zLCAnVVRGLTgnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcci9nbSwgJycpXG4gICAgICAgICAgICAuc3BsaXQoJ1xcbicpO1xuICAgICAgICByZXR1cm4gIXBhY2thZ2VzLnNvbWUoXG4gICAgICAgICAgICBwYWNrYWdlVG9GaW5kID0+ICF1c2VkUGFja2FnZXMuc29tZShtZXRlb3JQYWNrYWdlID0+IG1ldGVvclBhY2thZ2UgPT09IHBhY2thZ2VUb0ZpbmQpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5zdXJlcyBjZXJ0YWluIHBhY2thZ2VzIGFyZSBhZGRlZCB0byBtZXRlb3IgcHJvamVjdCBhbmQgaW4gY29ycmVjdCB2ZXJzaW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2thZ2VzXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2FnZXNXaXRoVmVyc2lvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB3aG8gLSBuYW1lIG9mIHRoZSBlbnRpdHkgdGhhdCByZXF1ZXN0cyBwcmVzZW5jZSBvZiB0aG9zZSBwYWNrYWdlcyAoY2FuIGJlIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGlvbiBpdHNlbGYgb3IgYSBwbHVnaW4pXG4gICAgICogQHJldHVybnMge1Byb21pc2UuPHZvaWQ+fVxuICAgICAqL1xuICAgIGFzeW5jIGVuc3VyZVBhY2thZ2VzKHBhY2thZ2VzLCBwYWNrYWdlc1dpdGhWZXJzaW9uLCB3aG8pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrUGFja2FnZXMocGFja2FnZXMpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGAke3dob30gcmVxdWlyZXMgc29tZSBwYWNrYWdlcyB0aGF0IGFyZSBub3QgYWRkZWQgdG8gcHJvamVjdCwgd2lsbCB0cnkgdG8gYWRkIHRoZW0gbm93YCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkUGFja2FnZXMocGFja2FnZXMsIHBhY2thZ2VzV2l0aFZlcnNpb24pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tQYWNrYWdlc1ZlcnNpb24ocGFja2FnZXNXaXRoVmVyc2lvbikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYCR7d2hvfSByZXF1aXJlZCBwYWNrYWdlcyB2ZXJzaW9uIGlzIGRpZmZlcmVudCwgZml4aW5nIGl0YCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkUGFja2FnZXMocGFja2FnZXMsIHBhY2thZ2VzV2l0aFZlcnNpb24pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgcGFja2FnZXMgZnJvbSB0aGUgbWV0ZW9yIGFwcC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWNrYWdlcyAgICAgICAgICAgIC0gYXJyYXkgd2l0aCBuYW1lcyBvZiB0aGUgcGFja2FnZXMgdG8gcmVtb3ZlXG4gICAgICovXG4gICAgZGVsZXRlUGFja2FnZXMocGFja2FnZXMpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybigncmVtb3ZpbmcgcGFja2FnZXMgZnJvbSBtZXRlb3IgcHJvamVjdCcsIC4uLnBhY2thZ2VzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHNwYXduKFxuICAgICAgICAgICAgICAgICdtZXRlb3InLFxuICAgICAgICAgICAgICAgIFsncmVtb3ZlJ10uY29uY2F0KHBhY2thZ2VzKSwge1xuICAgICAgICAgICAgICAgICAgICBjd2Q6IHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgIHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsIHByb2Nlc3Muc3RkZXJyXSxcbiAgICAgICAgICAgICAgICAgICAgZW52OiBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBNRVRFT1JfUFJFVFRZX09VVFBVVDogMCwgTUVURU9SX05PX1JFTEVBU0VfQ0hFQ0s6IDEgfSwgcHJvY2Vzcy5lbnZcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICkub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb2RlICE9PSAwIHx8IHRoaXMuY2hlY2tQYWNrYWdlcyhwYWNrYWdlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdyZW1vdmluZyBwYWNrYWdlcyBmYWlsZWQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgcGFja2FnZXMgdG8gdGhlIG1ldGVvciBhcHAuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2FnZXMgICAgICAgICAgICAtIGFycmF5IHdpdGggbmFtZXMgb2YgdGhlIHBhY2thZ2VzIHRvIGFkZFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2thZ2VzV2l0aFZlcnNpb24gLSBhcnJheSB3aXRoIG5hbWVzIGFuZCB2ZXJzaW9ucyBvZiB0aGUgcGFja2FnZXMgdG8gYWRkXG4gICAgICovXG4gICAgYWRkUGFja2FnZXMocGFja2FnZXMsIHBhY2thZ2VzV2l0aFZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnYWRkaW5nIHBhY2thZ2VzIHRvIG1ldGVvciBwcm9qZWN0JywgLi4ucGFja2FnZXNXaXRoVmVyc2lvbik7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzcGF3bihcbiAgICAgICAgICAgICAgICAnbWV0ZW9yJyxcbiAgICAgICAgICAgICAgICBbJ2FkZCddLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgcGFja2FnZXNXaXRoVmVyc2lvbi5tYXAocGFja2FnZU5hbWUgPT4gcGFja2FnZU5hbWUucmVwbGFjZSgnQCcsICdAPScpKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjd2Q6IHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgIHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsIHByb2Nlc3Muc3RkZXJyXSxcbiAgICAgICAgICAgICAgICAgICAgZW52OiBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBNRVRFT1JfUFJFVFRZX09VVFBVVDogMCwgTUVURU9SX05PX1JFTEVBU0VfQ0hFQ0s6IDEgfSwgcHJvY2Vzcy5lbnZcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICkub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb2RlICE9PSAwIHx8ICF0aGlzLmNoZWNrUGFja2FnZXMocGFja2FnZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgnYWRkaW5nIHBhY2thZ2VzIGZhaWxlZCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxJQUFBQSxRQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxHQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxXQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBRyxJQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFBd0IsU0FBQUQsdUJBQUFLLEdBQUEsV0FBQUEsR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsR0FBQUQsR0FBQSxLQUFBRSxPQUFBLEVBQUFGLEdBQUE7QUFMeEI7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsTUFBTUcsYUFBYSxDQUFDO0VBQy9CO0FBQ0o7QUFDQTtBQUNBO0VBQ0lDLFdBQVdBLENBQUNDLENBQUMsRUFBRTtJQUNYLElBQUksQ0FBQ0MsR0FBRyxHQUFHLElBQUlDLFlBQUcsQ0FBQyxlQUFlLENBQUM7SUFDbkMsSUFBSSxDQUFDRixDQUFDLEdBQUdBLENBQUM7RUFDZDs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUcs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