kibana-riya
Version:
Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic
184 lines (143 loc) • 6.68 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', {
value: true
});
var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
/**
* Returns an array of package objects. There will be one for each of
* package.json files in the archive
* @param {object} settings - a plugin installer settings object
*/
var listPackages = _asyncToGenerator(function* (settings) {
var regExp = new RegExp('(kibana/([^/]+))/package.json', 'i');
var archiveFiles = yield (0, _zip.listFiles)(settings.tempArchiveFile);
return (0, _lodash2['default'])(archiveFiles).map(function (file) {
return file.replace(/\\/g, '/');
}).map(function (file) {
return file.match(regExp);
}).compact().map(function (_ref) {
var _ref2 = _slicedToArray(_ref, 3);
var file = _ref2[0];
var _ = _ref2[1];
var folder = _ref2[2];
return { file: file, folder: folder };
}).uniq().value();
}
/**
* Extracts the package.json files into the workingPath
* @param {object} settings - a plugin installer settings object
* @param {array} packages - array of package objects from listPackages()
*/
);
var extractPackageFiles = _asyncToGenerator(function* (settings, packages) {
var filter = {
files: packages.map(function (pkg) {
return pkg.file;
})
};
yield (0, _zip.extractFiles)(settings.tempArchiveFile, settings.workingPath, 0, filter);
}
/**
* Deletes the package.json files created by extractPackageFiles()
* @param {object} settings - a plugin installer settings object
*/
);
/**
* Examine each package.json file to determine the plugin name,
* version, kibanaVersion, and platform. Mutates the package objects
* in the packages array
* @param {object} settings - a plugin installer settings object
* @param {array} packages - array of package objects from listPackages()
*/
var mergePackageData = _asyncToGenerator(function* (settings, packages) {
return packages.map(function (pkg) {
var fullPath = (0, _path.resolve)(settings.workingPath, pkg.file);
var packageInfo = require(fullPath);
pkg.version = _lodash2['default'].get(packageInfo, 'version');
pkg.name = _lodash2['default'].get(packageInfo, 'name');
pkg.path = (0, _path.resolve)(settings.pluginDir, pkg.name);
// Plugins must specify their version, and by default that version should match
// the version of kibana down to the patch level. If these two versions need
// to diverge, they can specify a kibana.version to indicate the version of
// kibana the plugin is intended to work with.
pkg.kibanaVersion = _lodash2['default'].get(packageInfo, 'kibana.version', pkg.version);
var regExp = new RegExp(pkg.name + '-(.+)', 'i');
var matches = pkg.folder.match(regExp);
pkg.platform = matches ? matches[1] : undefined;
return pkg;
});
}
/**
* Extracts the first plugin in the archive.
* NOTE: This will need to be changed in later versions of the pack installer
* that allow for the installation of more than one plugin at once.
* @param {object} settings - a plugin installer settings object
*/
);
var extractArchive = _asyncToGenerator(function* (settings) {
var filter = {
paths: ['kibana/' + settings.plugins[0].folder]
};
yield (0, _zip.extractFiles)(settings.tempArchiveFile, settings.workingPath, 2, filter);
}
/**
* Returns the detailed information about each kibana plugin in the pack.
* TODO: If there are platform specific folders, determine which one to use.
* @param {object} settings - a plugin installer settings object
* @param {object} logger - a plugin installer logger object
*/
);
var getPackData = _asyncToGenerator(function* (settings, logger) {
var packages = undefined;
try {
logger.log('Retrieving metadata from plugin archive');
packages = yield listPackages(settings);
yield extractPackageFiles(settings, packages);
yield mergePackageData(settings, packages);
yield deletePackageFiles(settings);
} catch (err) {
logger.error(err);
throw new Error('Error retrieving metadata from plugin archive');
}
if (packages.length === 0) {
throw new Error('No kibana plugins found in archive');
}
packages.forEach(assertValidPackageName);
settings.plugins = packages;
});
exports.getPackData = getPackData;
var extract = _asyncToGenerator(function* (settings, logger) {
try {
logger.log('Extracting plugin archive');
yield extractArchive(settings);
logger.log('Extraction complete');
} catch (err) {
logger.error(err);
throw new Error('Error extracting plugin archive');
}
});
exports.extract = extract;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { var callNext = step.bind(null, 'next'); var callThrow = step.bind(null, 'throw'); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(callNext, callThrow); } } callNext(); }); }; }
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _zip = require('./zip');
var _path = require('path');
var _rimraf = require('rimraf');
var _validateNpmPackageName = require('validate-npm-package-name');
var _validateNpmPackageName2 = _interopRequireDefault(_validateNpmPackageName);
function deletePackageFiles(settings) {
var fullPath = (0, _path.resolve)(settings.workingPath, 'kibana');
(0, _rimraf.sync)(fullPath);
}
/**
* Checks the plugin name. Will throw an exception if it does not meet
* npm package naming conventions
* @param {object} plugin - a package object from listPackages()
*/
function assertValidPackageName(plugin) {
var validation = (0, _validateNpmPackageName2['default'])(plugin.name);
if (!validation.validForNewPackages) {
throw new Error('Invalid plugin name [' + plugin.name + '] in package.json');
}
};