UNPKG

kibana-123

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

138 lines (116 loc) 3.33 kB
import _ from 'lodash'; function ObjDefine(defaults, prototype) { this.obj; // created by this.create() this.descs = {}; this.defaults = defaults || {}; this.prototype = prototype || Object.prototype; } ObjDefine.REDEFINE_SUPPORTED = (function () { let a = Object.create(Object.prototype, { prop: { configurable: true, value: 1 } }); Object.defineProperty(a, 'prop', { configurable: true, value: 2 }); return a.prop === 2; }()); /** * normal value, writable and exported in JSON * * @param {any} v - value * @return {object} - property descriptor */ ObjDefine.prototype.writ = function (name, val) { this._define(name, val, true, true); }; /** * known value, exported in JSON, not changeable * * @param {any} v - value * @return {object} - property descriptor */ ObjDefine.prototype.fact = function (name, val) { this._define(name, val, true); }; /** * computed fact, not exported or changeable * * @param {any} v - value * @return {object} - property descriptor */ ObjDefine.prototype.comp = function (name, val) { this._define(name, val); }; /** * Creates an object, decorated by the property descriptors * created by other ObjDefine methods and inheritting form the * prototype * * # note: * If a value is writable, but the value is undefined, the property will * be created by not exported to JSON unless the property is written to * * @return {object} - created object */ ObjDefine.prototype.create = function () { let self = this; self.obj = Object.create(this.prototype, self.descs); if (!ObjDefine.REDEFINE_SUPPORTED && !self.prototype.toJSON) { // since we can't redefine properties as enumerable we will // clone the object on serialization and choose which properties // to include or trim manually. This is currently only in use in PhantomJS // due to https://github.com/ariya/phantomjs/issues/11856 self.obj.toJSON = function () { return _.transform(self.obj, function (json, val, key) { let desc = self.descs[key]; if (desc && desc.enumerable && val == null) return; json[key] = val; }, {}); }; } return self.obj; }; /** * Private APIS */ ObjDefine.prototype._define = function (name, val, exported, changeable) { val = val != null ? val : this.defaults[name]; this.descs[name] = this._describe(name, val, !!exported, !!changeable); }; ObjDefine.prototype._describe = function (name, val, exported, changeable) { let self = this; let exists = val != null; if (exported && ObjDefine.REDEFINE_SUPPORTED) { return { enumerable: exists, configurable: true, get: _.constant(val), set: function (update) { if (!changeable) return false; // change the descriptor, since the value now exists. self.descs[name] = self._describe(name, update, exported, changeable); // apply the updated descriptor Object.defineProperty(self.obj, name, self.descs[name]); } }; } if (exported && !ObjDefine.REDEFINE_SUPPORTED) { return { enumerable: true, configurable: true, writable: changeable, value: val }; } return { enumerable: false, writable: changeable, configurable: true, value: val }; }; export default ObjDefine;