brackets-npm-registry
Version:
Install your extensions into Brackets using npm
176 lines (147 loc) • 5.83 kB
JavaScript
define(function (require, exports, module) {
'use strict';
var _ = brackets.getModule('thirdparty/lodash');
var EventEmitter = require('eventemitter');
var ExtensionManager = brackets.getModule('extensibility/ExtensionManager');
var Promise = require('bluebird');
var semver = require('semver');
var NpmDomain = require('../npm-domain');
var Logger = require('../utils/logger');
var registryUrl = 'https://brackets-npm-registry.herokuapp.com/registry';
var progressDialog = require('./react-components/progress-dialog');
var Utils = require('../utils/index');
var toolbarIcon = require('./toolbar-icon');
var RegistryUtils = new EventEmitter();
var downloadRegistryPromise = null;
var installedExtensions = null;
var npmRegistry = null;
var getInstalledExtensions = function getInstalledExtensions() {
if (installedExtensions) {
return installedExtensions;
}
installedExtensions = _.filter(ExtensionManager.extensions, function (ext) {
return ext && ext.installInfo && ext.installInfo.locationType === 'user';
}).map(function (obj) {
return obj.installInfo.metadata;
});
return installedExtensions;
};
var registrySort = function registrySort() {
npmRegistry.sort(function (a, b) {
var result = 0;
// first sort by update available
if (a._updateAvailable) {
result -= 1;
}
if (b._updateAvailable) {
result += 1;
}
if (result !== 0) {
return result;
}
// default sort by name
return a.sortName.localeCompare(b.sortName);
});
};
var afterRegistryDownloaded = function afterRegistryDownloaded() {
var updatesAvailable = false;
npmRegistry.forEach(function (entry) {
entry.displayName = entry.title ? entry.title + ' (' + entry.name + ')' : entry.name;
entry.sortName = entry.displayName.toLowerCase();
});
getInstalledExtensions().forEach(function (insExt) {
var npmInfo = _.find(npmRegistry, function (npmExt) {
return npmExt.name === insExt.name;
});
// extension was not found in the npm
if (!npmInfo) {
return;
}
npmInfo._currentlyInstalled = true;
if (npmInfo.version && insExt.version) {
npmInfo._updateAvailable = semver.gt(npmInfo.version, insExt.version);
} else {
npmInfo._updateAvailable = true;
}
if (npmInfo._updateAvailable) {
updatesAvailable = true;
}
});
toolbarIcon.toggle(updatesAvailable);
registrySort();
};
var markInstalled = function markInstalled(extName) {
var installedObj = _.find(installedExtensions, { name: extName });
var registryObj = _.find(npmRegistry, { name: extName });
if (!installedObj) {
// install
installedExtensions.push(registryObj);
} else {
// update/reinstall
installedObj.version = registryObj.version;
}
afterRegistryDownloaded();
};
var markRemoved = function markRemoved(extName) {
var installedObj = _.find(installedExtensions, { name: extName });
var registryObj = _.find(npmRegistry, { name: extName });
installedExtensions = _.without(installedExtensions, installedObj);
delete registryObj._currentlyInstalled;
delete registryObj._updateAvailable;
afterRegistryDownloaded();
};
var _downloadRegistry = function _downloadRegistry() {
return Promise.resolve($.get(registryUrl))['catch'](function (err) {
Logger.error(err);
// error downloading? heroku isn't 100% stable, we try to build our own
return Promise.resolve(NpmDomain.exec('buildRegistry')
// TODO: only log progress in DEBUG mode
.progress(function (msg) {
return Logger.log('buildRegistry progress => ' + msg);
}));
}).then(function (response) {
return typeof response === 'string' ? JSON.parse(response) : response;
}).then(function (_npmRegistry) {
npmRegistry = _npmRegistry;
afterRegistryDownloaded();
return npmRegistry;
});
};
var getRegistry = function getRegistry() {
return downloadRegistryPromise || (downloadRegistryPromise = _downloadRegistry());
};
var install = function install(extensionName) {
var targetFolder = brackets.app.getApplicationSupportDirectory() + '/extensions/user';
Logger.log('installing ' + extensionName + ' into ' + targetFolder);
var p = Promise.resolve(NpmDomain.exec('installExtension', targetFolder, extensionName));
progressDialog.show(p);
p.then(function () {
markInstalled(extensionName);
Logger.log(extensionName + ' successfully installed');
})['catch'](function (err) {
Logger.log(extensionName + ' failed to install:\n', Utils.errToString(err));
})['finally'](function () {
RegistryUtils.emit('change', npmRegistry);
});
};
var remove = function remove(extensionName) {
var targetFolder = brackets.app.getApplicationSupportDirectory() + '/extensions/user';
Logger.log('removing ' + extensionName + ' from ' + targetFolder);
var p = Promise.resolve(NpmDomain.exec('removeExtension', targetFolder, extensionName));
progressDialog.show(p);
p.then(function () {
markRemoved(extensionName);
Logger.log(extensionName + ' successfully removed');
})['catch'](function (err) {
Logger.log(extensionName + ' failed to remove:\n', Utils.errToString(err));
})['finally'](function () {
RegistryUtils.emit('change', npmRegistry);
});
};
// exports
RegistryUtils.getRegistry = getRegistry;
RegistryUtils.install = install;
RegistryUtils.remove = remove;
module.exports = RegistryUtils;
});
//# sourceMappingURL=C:\Users\Zaggi\AppData\Roaming\Brackets-Electron\extensions\user\brackets-npm-registry\dist//ui/registry-utils.js.map