UNPKG

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

216 lines (178 loc) 9.92 kB
'use strict'; var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 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(); }); }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _joi = require('joi'); var _joi2 = _interopRequireDefault(_joi); var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); var _path = require('path'); var _util = require('util'); var extendInitFns = Symbol('extend plugin initialization'); var defaultConfigSchema = _joi2['default'].object({ enabled: _joi2['default'].boolean()['default'](true) })['default'](); /** * The server plugin class, used to extend the server * and add custom behavior. A "scoped" plugin class is * created by the PluginApi class and provided to plugin * providers that automatically binds all but the `opts` * arguments. * * @class Plugin * @param {KbnServer} kbnServer - the KbnServer this plugin * belongs to. * @param {String} path - the path from which the plugin hails * @param {Object} pkg - the value of package.json for the plugin * @param {Objects} opts - the options for this plugin * @param {String} [opts.id=pkg.name] - the id for this plugin. * @param {Object} [opts.uiExports] - a mapping of UiExport types * to UI modules or metadata about * the UI module * @param {Array} [opts.require] - the other plugins that this plugin * requires. These plugins must exist and * be enabled for this plugin to function. * The require'd plugins will also be * initialized first, in order to make sure * that dependencies provided by these plugins * are available * @param {String} [opts.version=pkg.version] - the version of this plugin * @param {Function} [opts.init] - A function that will be called to initialize * this plugin at the appropriate time. * @param {Function} [opts.configPrefix=this.id] - The prefix to use for configuration * values in the main configuration service * @param {Function} [opts.config] - A function that produces a configuration * schema using Joi, which is passed as its * first argument. * @param {String|False} [opts.publicDir=path + '/public'] * - the public directory for this plugin. The final directory must * have the name "public", though it can be located somewhere besides * the root of the plugin. Set this to false to disable exposure of a * public directory */ module.exports = (function () { function Plugin(kbnServer, path, pkg, opts) { _classCallCheck(this, Plugin); this.kbnServer = kbnServer; this.pkg = pkg; this.path = path; this.id = opts.id || pkg.name; this.uiExportsSpecs = opts.uiExports || {}; this.requiredIds = opts.require || []; this.version = opts.version || pkg.version; // 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 in the package to indicate the // version of kibana the plugin is intended to work with. this.kibanaVersion = opts.kibanaVersion || _lodash2['default'].get(pkg, 'kibana.version', this.version); this.externalPreInit = opts.preInit || _lodash2['default'].noop; this.externalInit = opts.init || _lodash2['default'].noop; this.configPrefix = opts.configPrefix || this.id; this.getExternalConfigSchema = opts.config || _lodash2['default'].noop; this.preInit = _lodash2['default'].once(this.preInit); this.init = _lodash2['default'].once(this.init); this[extendInitFns] = []; if (opts.publicDir === false) { this.publicDir = null; } else if (!opts.publicDir) { this.publicDir = (0, _path.resolve)(this.path, 'public'); } else { this.publicDir = opts.publicDir; if ((0, _path.basename)(this.publicDir) !== 'public') { throw new Error('publicDir for plugin ' + this.id + ' must end with a "public" directory.'); } } } _createClass(Plugin, [{ key: 'getConfigSchema', value: _asyncToGenerator(function* () { var schema = yield this.getExternalConfigSchema(_joi2['default']); return schema || defaultConfigSchema; }) }, { key: 'preInit', value: _asyncToGenerator(function* () { return yield this.externalPreInit(this.kbnServer.server); }) }, { key: 'init', value: _asyncToGenerator(function* () { var _this = this; var id = this.id; var version = this.version; var kbnServer = this.kbnServer; var configPrefix = this.configPrefix; var config = kbnServer.config; // setup the hapi register function and get on with it var asyncRegister = _asyncToGenerator(function* (server, options) { _this.server = server; yield Promise.all(_this[extendInitFns].map(_asyncToGenerator(function* (fn) { yield fn.call(_this, server, options); }))); server.log(['plugins', 'debug'], { tmpl: 'Initializing plugin <%= plugin.toString() %>', plugin: _this }); if (_this.publicDir) { server.exposeStaticDir('/plugins/' + id + '/{path*}', _this.publicDir); } // Many of the plugins are simply adding static assets to the server and we don't need // to track their "status". Since plugins must have an init() function to even set its status // we shouldn't even create a status unless the plugin can use it. if (_this.externalInit !== _lodash2['default'].noop) { _this.status = kbnServer.status.createForPlugin(_this); server.expose('status', _this.status); } return yield (0, _bluebird.attempt)(_this.externalInit, [server, options], _this); }); var register = function register(server, options, next) { _bluebird2['default'].resolve(asyncRegister(server, options)).nodeify(next); }; register.attributes = { name: id, version: version }; yield (0, _bluebird.fromNode)(function (cb) { kbnServer.server.register({ register: register, options: config.has(configPrefix) ? config.get(configPrefix) : null }, cb); }); // Only change the plugin status to green if the // intial status has not been changed if (this.status && this.status.state === 'uninitialized') { this.status.green('Ready'); } }) }, { key: 'extendInit', value: function extendInit(fn) { this[extendInitFns].push(fn); } }, { key: 'toJSON', value: function toJSON() { return this.pkg; } }, { key: 'toString', value: function toString() { return this.id + '@' + this.version; } }], [{ key: 'scoped', value: function scoped(kbnServer, path, pkg) { return (function (_Plugin) { _inherits(ScopedPlugin, _Plugin); function ScopedPlugin(opts) { _classCallCheck(this, ScopedPlugin); _get(Object.getPrototypeOf(ScopedPlugin.prototype), 'constructor', this).call(this, kbnServer, path, pkg, opts || {}); } return ScopedPlugin; })(Plugin); } }]); return Plugin; })();