UNPKG

brackets-npm-registry

Version:

Install your extensions into Brackets using npm

176 lines (147 loc) 5.83 kB
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