@mjcctech/meteor-desktop
Version:
Build a Meteor's desktop client with hot code push.
147 lines (122 loc) • 16.4 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 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9tZXRlb3JNYW5hZ2VyLmpzIl0sIm5hbWVzIjpbIk1ldGVvck1hbmFnZXIiLCJjb25zdHJ1Y3RvciIsIiQiLCJsb2ciLCJMb2ciLCJjaGVja1BhY2thZ2VzIiwicGFja2FnZXMiLCJ1c2VkUGFja2FnZXMiLCJmcyIsInJlYWRGaWxlU3luYyIsImVudiIsInBhdGhzIiwibWV0ZW9yQXBwIiwicmVwbGFjZSIsInNwbGl0IiwiZmlsdGVyIiwibGluZSIsInRyaW0iLCJzdGFydHNXaXRoIiwic29tZSIsInBhY2thZ2VUb0ZpbmQiLCJtZXRlb3JQYWNrYWdlIiwiaW5kZXhPZiIsImNoZWNrUGFja2FnZXNWZXJzaW9uIiwidmVyc2lvbnMiLCJlbnN1cmVQYWNrYWdlcyIsInBhY2thZ2VzV2l0aFZlcnNpb24iLCJ3aG8iLCJ3YXJuIiwiYWRkUGFja2FnZXMiLCJlIiwiRXJyb3IiLCJkZWxldGVQYWNrYWdlcyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiY29uY2F0IiwiY3dkIiwicm9vdCIsInN0ZGlvIiwicHJvY2VzcyIsInN0ZGVyciIsIk9iamVjdCIsImFzc2lnbiIsIk1FVEVPUl9QUkVUVFlfT1VUUFVUIiwiTUVURU9SX05PX1JFTEVBU0VfQ0hFQ0siLCJvbiIsImNvZGUiLCJpbmZvIiwibWFwIiwicGFja2FnZU5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7OztBQUxBOztBQU9BOzs7Ozs7QUFNZSxNQUFNQSxhQUFOLENBQW9CO0FBQy9COzs7O0FBSUFDLEVBQUFBLFdBQVcsQ0FBQ0MsQ0FBRCxFQUFJO0FBQ1gsU0FBS0MsR0FBTCxHQUFXLElBQUlDLFlBQUosQ0FBUSxlQUFSLENBQVg7QUFDQSxTQUFLRixDQUFMLEdBQVNBLENBQVQ7QUFDSDtBQUVEOzs7Ozs7OztBQU1BRyxFQUFBQSxhQUFhLENBQUNDLFFBQUQsRUFBVztBQUNwQixVQUFNQyxZQUFZLEdBQUdDLFlBQ2hCQyxZQURnQixDQUNI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SUFBSSxLQUFLLENBQVQsSUFBYyxDQUFDLEtBQUsxQyxhQUFMLENBQW1CQyxRQUFuQixDQUFuQixFQUFpRDtBQUM3QzZCLFVBQUFBLE1BQU0sQ0FBQyx3QkFBRCxDQUFOO0FBQ0gsU0FGRCxNQUVPO0FBQ0hELFVBQUFBLE9BQU87QUFDVjtBQUNKLE9BbEJEO0FBbUJILEtBcEJNLENBQVA7QUFxQkg7O0FBNUg4QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuaW1wb3J0IHJlZ2VuZXJhdG9yUnVudGltZSBmcm9tICdyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBzcGF3biBmcm9tICdjcm9zcy1zcGF3bic7XG5cbmltcG9ydCBMb2cgZnJvbSAnLi9sb2cnO1xuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgZGVzaWduZWQgZm9yIG1hbmFnaW5nIE1ldGVvciBwYWNrYWdlcy5cbiAqXG4gKiBAcHJvcGVydHkge01ldGVvckRlc2t0b3B9ICRcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNZXRlb3JNYW5hZ2VyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge01ldGVvckRlc2t0b3B9ICQgLSBjb250ZXh0XG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoJCkge1xuICAgICAgICB0aGlzLmxvZyA9IG5ldyBMb2coJ21ldGVvck1hbmFnZXInKTtcbiAgICAgICAgdGhpcy4kID0gJDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb29rcyBmb3Igc3BlY2lmaWVkIHBhY2thZ2VzIGluIC5tZXRlb3IvcGFja2FnZXMuIEluIG90aGVyIHdvcmRzIGNoZWNrcyBpZiB0aGUgcHJvamVjdCBoYXNcbiAgICAgKiBzcGVjaWZpZWQgcGFja2FnZXMgYWRkZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2FnZXNcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBjaGVja1BhY2thZ2VzKHBhY2thZ2VzKSB7XG4gICAgICAgIGNvbnN0IHVzZWRQYWNrYWdlcyA9IGZzXG4gICAgICAgICAgICAucmVhZEZpbGVTeW5jKHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLnBhY2thZ2VzLCAnVVRGLTgnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcci9nbSwgJycpXG4gICAgICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgICAuZmlsdGVyKGxpbmUgPT4gIWxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoJyMnKSk7XG4gICAgICAgIHJldHVybiAhcGFja2FnZXMuc29tZShcbiAgICAgICAgICAgIHBhY2thZ2VUb0ZpbmQgPT5cbiAgICAgICAgICAgICAgICAhdXNlZFBhY2thZ2VzLnNvbWUobWV0ZW9yUGFja2FnZSA9PiB+bWV0ZW9yUGFja2FnZS5pbmRleE9mKHBhY2thZ2VUb0ZpbmQpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvb2tzIGZvciBzcGVjaWZpZWQgcGFja2FnZXMgaW4gLm1ldGVvci9wYWNrYWdlcy4gSW4gb3RoZXIgd29yZHMgY2hlY2tzIGlmIHRoZSBwcm9qZWN0IGhhc1xuICAgICAqIHNwZWNpZmllZCBwYWNrYWdlcyBhZGRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWNrYWdlc1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGNoZWNrUGFja2FnZXNWZXJzaW9uKHBhY2thZ2VzKSB7XG4gICAgICAgIGNvbnN0IHVzZWRQYWNrYWdlcyA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLiQuZW52LnBhdGhzLm1ldGVvckFwcC52ZXJzaW9ucywgJ1VURi04JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXHIvZ20sICcnKVxuICAgICAgICAgICAgLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgcmV0dXJuICFwYWNrYWdlcy5zb21lKFxuICAgICAgICAgICAgcGFja2FnZVRvRmluZCA9PiAhdXNlZFBhY2thZ2VzLnNvbWUobWV0ZW9yUGFja2FnZSA9PiBtZXRlb3JQYWNrYWdlID09PSBwYWNrYWdlVG9GaW5kKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgY2VydGFpbiBwYWNrYWdlcyBhcmUgYWRkZWQgdG8gbWV0ZW9yIHByb2plY3QgYW5kIGluIGNvcnJlY3QgdmVyc2lvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWNrYWdlc1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2thZ2VzV2l0aFZlcnNpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gd2hvIC0gbmFtZSBvZiB0aGUgZW50aXR5IHRoYXQgcmVxdWVzdHMgcHJlc2VuY2Ugb2YgdGhvcyBwYWNrYWdlcyAoY2FuIGJlIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGlvbiBpdHNlbGYgb3IgYSBwbHVnaW4pXG4gICAgICogQHJldHVybnMge1Byb21pc2UuPHZvaWQ+fVxuICAgICAqL1xuICAgIGFzeW5jIGVuc3VyZVBhY2thZ2VzKHBhY2thZ2VzLCBwYWNrYWdlc1dpdGhWZXJzaW9uLCB3aG8pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrUGFja2FnZXMocGFja2FnZXMpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGAke3dob30gcmVxdWlyZXMgc29tZSBwYWNrYWdlcyB0aGF0IGFyZSBub3QgYWRkZWQgdG8gcHJvamVjdCwgd2lsbCB0cnkgdG8gYWRkIHRoZW0gbm93YCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkUGFja2FnZXMocGFja2FnZXMsIHBhY2thZ2VzV2l0aFZlcnNpb24pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tQYWNrYWdlc1ZlcnNpb24ocGFja2FnZXNXaXRoVmVyc2lvbikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYCR7d2hvfSByZXF1aXJlZCBwYWNrYWdlcyB2ZXJzaW9uIGlzIGRpZmZlcmVudCwgZml4aW5nIGl0YCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkUGFja2FnZXMocGFja2FnZXMsIHBhY2thZ2VzV2l0aFZlcnNpb24pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgcGFja2FnZXMgZnJvbSB0aGUgbWV0ZW9yIGFwcC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWNrYWdlcyAgICAgICAgICAgIC0gYXJyYXkgd2l0aCBuYW1lcyBvZiB0aGUgcGFja2FnZXMgdG8gcmVtb3ZlXG4gICAgICovXG4gICAgZGVsZXRlUGFja2FnZXMocGFja2FnZXMpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybigncmVtb3ZpbmcgcGFja2FnZXMgZnJvbSBtZXRlb3IgcHJvamVjdCcsIC4uLnBhY2thZ2VzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHNwYXduKFxuICAgICAgICAgICAgICAgICdtZXRlb3InLFxuICAgICAgICAgICAgICAgIFsncmVtb3ZlJ10uY29uY2F0KHBhY2thZ2VzKSwge1xuICAgICAgICAgICAgICAgICAgICBjd2Q6IHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgIHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsIHByb2Nlc3Muc3RkZXJyXSxcbiAgICAgICAgICAgICAgICAgICAgZW52OiBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBNRVRFT1JfUFJFVFRZX09VVFBVVDogMCwgTUVURU9SX05PX1JFTEVBU0VfQ0hFQ0s6IDEgfSwgcHJvY2Vzcy5lbnZcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICkub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb2RlICE9PSAwIHx8IHRoaXMuY2hlY2tQYWNrYWdlcyhwYWNrYWdlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdyZW1vdmluZyBwYWNrYWdlcyBmYWlsZWQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgcGFja2FnZXMgdG8gdGhlIG1ldGVvciBhcHAuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2FnZXMgICAgICAgICAgICAtIGFycmF5IHdpdGggbmFtZXMgb2YgdGhlIHBhY2thZ2VzIHRvIGFkZFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2thZ2VzV2l0aFZlcnNpb24gLSBhcnJheSB3aXRoIG5hbWVzIGFuZCB2ZXJzaW9ucyBvZiB0aGUgcGFja2FnZXMgdG8gYWRkXG4gICAgICovXG4gICAgYWRkUGFja2FnZXMocGFja2FnZXMsIHBhY2thZ2VzV2l0aFZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnYWRkaW5nIHBhY2thZ2VzIHRvIG1ldGVvciBwcm9qZWN0JywgLi4ucGFja2FnZXNXaXRoVmVyc2lvbik7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzcGF3bihcbiAgICAgICAgICAgICAgICAnbWV0ZW9yJyxcbiAgICAgICAgICAgICAgICBbJ2FkZCddLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgcGFja2FnZXNXaXRoVmVyc2lvbi5tYXAocGFja2FnZU5hbWUgPT4gcGFja2FnZU5hbWUucmVwbGFjZSgnQCcsICdAPScpKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjd2Q6IHRoaXMuJC5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgIHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsIHByb2Nlc3Muc3RkZXJyXSxcbiAgICAgICAgICAgICAgICAgICAgZW52OiBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBNRVRFT1JfUFJFVFRZX09VVFBVVDogMCwgTUVURU9SX05PX1JFTEVBU0VfQ0hFQ0s6IDEgfSwgcHJvY2Vzcy5lbnZcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICkub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb2RlICE9PSAwIHx8ICF0aGlzLmNoZWNrUGFja2FnZXMocGFja2FnZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgnYWRkaW5nIHBhY2thZ2VzIGZhaWxlZCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19