fix styles, time to begin finding bugs

This commit is contained in:
Spencer Alger 2015-07-07 19:32:48 -07:00
parent c95e315f46
commit f621a42368
37 changed files with 161 additions and 138 deletions

1
kibana.js.map Normal file

File diff suppressed because one or more lines are too long

View file

@ -54,7 +54,9 @@
"debug": "^2.1.1",
"elasticsearch": "^5.0.0",
"exports-loader": "^0.6.2",
"expose-loader": "^0.7.0",
"express": "^4.10.6",
"extract-text-webpack-plugin": "^0.8.2",
"file-loader": "^0.8.4",
"font-awesome": "^4.3.0",
"glob": "^4.3.2",

1
sense.js.map Normal file

File diff suppressed because one or more lines are too long

View file

@ -38,26 +38,6 @@ function kibanaPlugin(kibana) {
handler: amdWrapper({ root: ROOT })
});
server.route({
path: '/src/{paths*}',
method: 'GET',
handler: {
directory: {
path: SRC
}
}
});
server.route({
path: '/node_modules/{paths*}',
method: 'GET',
handler: {
directory: {
path: NODE_MODULES
}
}
});
server.route({
path: '/specs',
method: 'GET',
@ -83,8 +63,6 @@ function kibanaPlugin(kibana) {
function run(port, quiet) {
return (new KbnServer({
'env': 'development',
'logging.quiet': quiet,
'kibana.server.port': port || 5601,
'plugins.paths': [ __dirname ],
'plugins.scanDirs': [ resolve('src/plugins') ],

View file

@ -0,0 +1,5 @@
{
"name": "devServer",
"main": "devServer.js",
"version": "1.0.0"
}

View file

@ -1,4 +0,0 @@
{
"name": "dev_server",
"version": "1.0.0"
}

View file

@ -50,7 +50,10 @@ module.exports = function (kibana) {
'file_saver': ['bower_components/FileSaver/FileSaver', null, 'saveAs'],
'gridster': ['bower_components/gridster/dist/jquery.gridster', 'jquery,gs=gridster-styles'],
'gridster-styles': ['bower_components/gridster/dist/jquery.gridster.css'],
'jquery': ['bower_components/jquery/dist/jquery'],
'jquery':{
path: 'bower_components/jquery/dist/jquery',
expose: 'jQuery'
},
'leaflet': ['bower_components/leaflet/dist/leaflet', 'ls=leaflet-styles'],
'leaflet-styles': ['bower_components/leaflet-draw/dist/leaflet.draw.css'],
'leaflet-heat': ['bower_components/Leaflet.heat/dist/leaflet-heat', 'leaflet'],

View file

@ -9,7 +9,10 @@ define(function (require, module, exports) {
redirectTo: '/settings/indices'
});
require('modules').get('apps/settings')
var sections = require('plugins/kibana/settings/sections/index');
require('modules')
.get('apps/settings')
.directive('kbnSettingsApp', function (Private, $route, timefilter) {
return {
restrict: 'E',
@ -20,7 +23,7 @@ define(function (require, module, exports) {
},
link: function ($scope, $el) {
timefilter.enabled = false;
$scope.sections = require('plugins/kibana/settings/sections/index');
$scope.sections = sections;
$scope.section = _.find($scope.sections, { name: $scope.sectionName });
$scope.sections.forEach(function (section) {

View file

@ -65,7 +65,7 @@ KbnServer.prototype.listen = function () {
})
.then(
function () {
server.log('server', 'Server running at ' + server.info.uri);
server.log('info', 'Server running at ' + server.info.uri);
return server;
},
function (err) {

View file

@ -10,6 +10,7 @@ program.option('-e, --elasticsearch <uri>', 'Elasticsearch instance');
program.option('-c, --config <path>', 'Path to the config file');
program.option('-p, --port <port>', 'The port to bind to', parseInt);
program.option('-q, --quiet', 'Turns off logging');
program.option('--verbose', 'Turns on verbose logging');
program.option('-H, --host <host>', 'The host to bind to');
program.option('-l, --log-file <path>', 'The file to log to');
program.option(
@ -46,7 +47,7 @@ if (program.quiet) {
}
if (program.logFile) {
settings['logging.file'] = program.logFile;
settings['logging.dest'] = program.logFile;
}
if (program.plugins || program.pluginDir) {

View file

@ -49,27 +49,29 @@ module.exports = Joi.object({
minimumVerison: Joi.string().default('1.4.4')
}).default(),
logging: Joi.object({
quiet: Joi.boolean().default(false),
logging: Joi.object().keys({
silent: Joi.boolean().default(false),
// not nested under a kbnLogger key so that we can ref "quiet"
kbnLogger: Joi.boolean().default(true),
kbnLoggerConfig: Joi.object({
dest: Joi.string().default('stdout'),
json: Joi.boolean().default(Joi.ref('$prod'))
}).default(),
kbnLoggerEvents: Joi.when('quiet', {
quiet: Joi.boolean()
.when('silent', {
is: true,
then: Joi.object({
error: Joi.string().default('*')
}).default(),
otherwise: Joi.object({
log: Joi.string().default('*'),
response: Joi.string().default('*'),
error: Joi.string().default('*')
}).default()
})
}).default(),
then: Joi.default(true).valid(true),
otherwise: Joi.default(false)
}),
verbose: Joi.boolean()
.when('quiet', {
is: true,
then: Joi.valid(false).default(false),
otherwise: Joi.default(true)
}),
dest: Joi.string().default('stdout'),
json: Joi.boolean().default(Joi.ref('$prod')),
events: Joi.any().default({})
})
.default(),
plugins: Joi.object({
paths: Joi.array().items(Joi.string()).default([]),

View file

@ -121,9 +121,10 @@ module.exports = class TransformObjStream extends Stream.Transform {
data.message = event.data.message;
data.error = serializeError(event.data);
}
else if (_.isPlainObject(event.data) && event.data.message) {
else if (_.isPlainObject(event.data) && event.data.tmpl) {
_.assign(data, event.data);
data.message = _.template(event.data.message)(event.data);
data.tmpl = undefined;
data.message = _.template(event.data.tmpl)(event.data);
}
else {
data.message = _.isString(event.data) ? event.data : inspect(event.data);

View file

@ -12,9 +12,11 @@ let typeColors = {
res: 'green',
ops: 'cyan',
err: 'red',
info: 'blue',
info: 'green',
error: 'red',
fatal: 'magenta'
fatal: 'magenta',
plugins: 'yellow',
debug: 'brightBlack'
};
let color = _.memoize(function (name) {
@ -23,14 +25,18 @@ let color = _.memoize(function (name) {
module.exports = class KbnLoggerJsonFormat extends LogFormat {
format(data) {
let type = color(data.type)(_.padLeft(data.type, 6));
let type = _.chain(data.type).padLeft(6).trunc(6).thru(color(data.type)).value();
let time = color('time')(moment(data.timestamp).format());
let msg = data.error ? color('error')(data.error.stack) : color('message')(data.message);
let tags = data.tags.reduce(function (s, t) {
let tags = _(data.tags)
.sortBy(function (tag) {
return color(tag) === _.identity ? `1${tag}` : `0${tag}`;
})
.reduce(function (s, t) {
return s + `[${ color(t)(t) }]`;
}, '');
return `${type}: [ ${time} ] ${tags} ${msg}`;
return `${type}: [${time}] ${tags} ${msg}`;
}
};

View file

@ -1,9 +1,27 @@
var fromNode = require('bluebird').fromNode;
'use strict';
let _ = require('lodash');
let fromNode = require('bluebird').fromNode;
module.exports = function (kbnServer, server, config) {
if (!config.get('logging.kbnLogger')) return;
return fromNode(function (cb) {
let events = config.get('logging.events');
if (config.get('logging.quiet')) {
_.defaults(events, {
log: ['error', 'fatal'],
error: '*'
});
}
if (config.get('logging.verbose')) {
_.defaults(events, {
log: ['info', 'warning', 'error', 'fatal'],
response: '*',
error: '*'
});
}
server.register({
register: require('good'),
options: {
@ -11,8 +29,11 @@ module.exports = function (kbnServer, server, config) {
reporters: [
{
reporter: require('./LogReporter'),
config: config.get('logging.kbnLoggerConfig'),
events: config.get('logging.kbnLoggerEvents'),
config: {
json: config.get('logging.json'),
dest: config.get('logging.dest')
},
events: events,
}
]
}

View file

@ -12,11 +12,13 @@ var fromRoot = require('../utils/fromRoot');
var OptmzBundles = require('./OptmzBundles');
var OptmzUiModules = require('./OptmzUiModules');
var DirectoryNameAsDefaultFile = require('./DirectoryNameAsDefaultFile');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
class Optimizer extends EventEmitter {
constructor(opts) {
super();
this.verbose = opts.verbose;
this.watch = opts.watch || false;
this.sourceMaps = opts.sourceMaps || false;
this.modules = new OptmzUiModules(opts.plugins);
@ -35,26 +37,37 @@ class Optimizer extends EventEmitter {
var compiler = webpack({
entry: bundles.getEntriesToCompile(),
devtool: this.sourceMaps ? 'inline-source-map' : false,
devtool: this.sourceMaps ? '#source-map' : false,
output: {
path: this.bundles.dir,
filename: '[name].js',
sourceMapFilename: '[file].map',
publicPath: '/bundles/',
filename: '[name].js'
devtoolModuleFilenameTemplate: '[resource-path]'
},
plugins: [
new webpack.ResolverPlugin([
new DirectoryNameAsDefaultFile()
]),
new webpack.NoErrorsPlugin(),
new webpack.optimize.DedupePlugin(),
new webpack.optimize.OccurenceOrderPlugin(),
new webpack.ResolverPlugin([
new DirectoryNameAsDefaultFile()
])
new ExtractTextPlugin('[name].style.css', {
allChunks: true
})
],
module: {
loaders: [
{ test: /\.less$/, loader: ExtractTextPlugin.extract('style', 'css?sourceMap!less?sourceMap') },
{ test: /\.css$/, loader: ExtractTextPlugin.extract('style', 'css?sourceMap') },
{ test: /\.html$/, loader: 'raw' },
{ test: /\.png$/, loader: 'url?limit=2048!file?name=[path][name].[ext]' },
{ test: /\.(woff|woff2|ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/, loader: 'file?name=[path][name].[ext]' },
].concat(modules.loaders),
noParse: modules.noParse,
loaders: modules.loaders
},
resolve: {
@ -74,8 +87,11 @@ class Optimizer extends EventEmitter {
compiler.plugin('done', function (stats) {
var errCount = _.size(stats.compilation.errors);
if (errCount || self.verbose) {
console.log(`\n${ stats.toString({ colors: true }) }`);
}
if (errCount) {
console.log(stats.toString({ colors: true }));
self.emit('error', new Error('Failed to compile bundle'));
return;
}

View file

@ -54,7 +54,7 @@ class OptmzBundles {
init(fresh) {
return resolve()
.then(fresh && this.cleanBundles)
.then(fresh ? this.cleanBundles : _.noop)
.then(this.ensureBundleDir)
.then(this.syncBundleDir);
}
@ -113,7 +113,7 @@ class OptmzBundles {
return readdir(dir).map(function (name) {
// skip '.', '..', and dot-prefixed files
if (name.charAt(0) === '.') return false;
if (name.charAt(0) === '.' || name === 'sourcemaps') return false;
return join(dir, name);
})
.then(_.compact);

View file

@ -18,16 +18,7 @@ function OptmzUiExports(plugins) {
var aliases = this.aliases = {};
// webpack loaders map loader configuration to regexps
var loaders = this.loaders = [
{ test: /\.less$/, loader: 'style/url!file!less' },
{ test: /\.css$/, loader: 'style/url!file' },
{ test: /\.html$/, loader: 'raw' },
{
test: /\.(woff|woff2|png)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
loader: 'url-loader?limit=10000&minetype=application/font-woff'
},
{ test: /\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/, loader: 'file-loader' },
];
var loaders = this.loaders = [];
var claimedModuleIds = {};
_.each(plugins, function (plugin) {
@ -51,6 +42,7 @@ function OptmzUiExports(plugins) {
var parse = true;
var imports = null;
var exports = null;
var expose = null;
// basic style, just a path
if (_.isString(spec)) path = spec;
@ -66,6 +58,7 @@ function OptmzUiExports(plugins) {
parse = _.get(spec, 'parse', parse);
imports = _.get(spec, 'imports', imports);
exports = _.get(spec, 'exports', exports);
expose = _.get(spec, 'expose', expose);
}
if (!path) {
@ -80,6 +73,7 @@ function OptmzUiExports(plugins) {
}
if (exports) loader.push(`exports?${exports}`);
if (expose) loader.push(`expose?${expose}`);
if (loader.length) loaders.push({ test: asRegExp(path), loader: loader.join('!') });
if (!parse) noParse.push(asRegExp(path));

View file

@ -1,15 +1,20 @@
module.exports = function (kbnServer, server, config) {
var _ = require('lodash');
var resolve = require('path').resolve;
var join = require('path').join;
var fromRoot = require('../utils/fromRoot');
var Optimizer = require('./Optimizer');
var bundleDir = resolve(config.get('optimize.bundleDir'));
var status = kbnServer.status.create('optimize');
server.exposeStaticDir('/bundles/{path*}', bundleDir);
if (config.get('optimize.sourceMaps')) {
server.exposeStaticDir('/src/{path*}', fromRoot('src'));
server.exposeStaticDir('/node_modules/{paths*}', fromRoot('node_modules'));
}
return (new Optimizer({
verbose: config.get('logging.verbose'),
watch: config.get('optimize.watch'),
sourceMaps: config.get('optimize.sourceMaps'),
bundleDir: bundleDir,

View file

@ -15,8 +15,8 @@ module.exports = Promise.method(function (kibana) {
.catch(function (err) {
if (err.code !== 'EEXIST') throw err;
server.log(['pid', 'warn'], {
message: 'pid file already exists at <%= path %>',
server.log(['pid', 'warning'], {
tmpl: 'pid file already exists at <%= path %>',
path: path,
pid: pid
});
@ -26,7 +26,7 @@ module.exports = Promise.method(function (kibana) {
.then(function () {
server.log(['pid', 'debug'], {
message: 'wrote pid file to <%= path %>',
tmpl: 'wrote pid file to <%= path %>',
path: path,
pid: pid
});

View file

@ -38,14 +38,9 @@ module.exports = class Plugin {
let server = self.kbnServer.server;
let status = self.kbnServer.status;
let basetags = ['plugin', id];
let log = function (tags, data, timestamp) {
};
let config = server.config();
server.log(['plugin', 'debug', 'init'], {
message: 'Initializing plugin',
server.log(['plugins', 'debug'], {
tmpl: 'Initializing plugin <%= plugin.id %>',
plugin: self
});

View file

@ -7,9 +7,10 @@ module.exports = function (kbnServer, server, config) {
var scanDirs = [].concat(config.get('plugins.scanDirs'));
var absolutePaths = [].concat(config.get('plugins.paths'));
var debug = _.bindKey(server, 'log', ['plugins', 'debug']);
return Promise.map(scanDirs, function (dir) {
server.log('plugin-scan', 'Scanning ' + dir + ' for plugins');
debug({ tmpl: 'Scanning `<%= dir %>` for plugins', dir: dir });
return readdir(dir).map(function (file) {
if (file === '.' || file === '..') return false;
@ -31,10 +32,10 @@ module.exports = function (kbnServer, server, config) {
.filter(function (dir) {
try {
require(dir);
server.log('plugin-scan', 'Found plugin at ' + dir);
debug({ tmpl: 'Found plugin at <%= dir %>', dir: dir });
return true;
} catch (e) {
server.log('plugin-scan', 'Skipping non-plugin directory at ' + dir);
debug({ tmpl: 'Skipping non-plugin directory at <%= dir %>', dir: dir });
return false;
}
})

View file

@ -10,8 +10,8 @@ function Status(name, server) {
this.message = 'uninitialized';
this.on('change', function (current, previous) {
server.log(['plugin', name, 'status'], {
message: 'Change status from <%= prev %> to <%= cur %> - <%= curMsg %>',
server.log(['plugins', name, 'info'], {
tmpl: 'Change status from <%= prev %> to <%= cur %> - <%= curMsg %>',
name: name,
prev: previous.state,
cur: current.state,

View file

@ -26,7 +26,6 @@ module.exports = function (kbnServer) {
responseTimeMax: _.get(event, ['responseTimes', port, 'max']),
requests: _.get(event, ['requests', port, 'total'], 0)
});
});
server.route({

View file

@ -8,6 +8,7 @@ html(lang='en')
meta(name='viewport', content='width=device-width')
link(rel='shortcut icon', href='/images/elk.ico')
title Kibana
link(rel='stylesheet', href='/bundles/#{app.id}.style.css')
body(kbn-chrome)
script window.__KBN__ = !{j(kibanaPayload)};
script(src='/bundles/#{app.id}.js')

View file

@ -34,7 +34,7 @@
class="logo-small visible-sm hidden-xs"
></li>
<li ng-if="chrome.getAppCount() > 1 && chrome.getAppId() !== 'appSwitcher'">
<li ng-if="chrome.getAppCount() > 1 && chrome.getAppId() !== 'switcher'">
<a href="/apps"><i class="fa fa-th" alt="Go to app switcher"></i></a>
</li>

View file

@ -6,6 +6,7 @@ define(function (require) {
var SegmentedRequest = Private(require('components/courier/fetch/request/segmented'));
var searchStrategy = Private(require('components/courier/fetch/strategy/search'));
var normalizeSortRequest = Private(require('components/courier/data_source/_normalize_sort_request'));
var rootSearchSource = require('components/courier/data_source/_root_search_source');
_.class(SearchSource).inherits(SourceAbstract);
function SearchSource(initialState) {
@ -13,13 +14,6 @@ define(function (require) {
}
// expose a ready state for the route setup to read
var rootSearchSource;
SearchSource.ready = new Promise(function (resolve) {
require(['components/courier/data_source/_root_search_source'], function (PromiseModule) {
rootSearchSource = Private(PromiseModule);
resolve();
});
});
/*****
* PUBLIC API
@ -76,7 +70,7 @@ define(function (require) {
var self = this;
if (self._parent === false) return;
if (self._parent) return self._parent;
return onlyHardLinked ? undefined : rootSearchSource.get();
return onlyHardLinked ? undefined : Private(rootSearchSource).get();
};
/**

View file

@ -3,7 +3,7 @@
.control-group {
display: flex;
flex: 0, 0, auto;
flex: 0 0 auto;
flex-direction: row;
flex-wrap: wrap;
align-items: stretch;
@ -16,7 +16,7 @@
> * {
padding-right: @padding-base-horizontal;
flex: 0, 0, auto;
flex: 0 0 auto;
&:last-child {
padding-right: 0;
@ -25,7 +25,7 @@
// the element should take up an even share of available space
> .fill {
flex: 1, 1, 1%;
flex: 1 1 1%;
}
button {
@ -87,7 +87,7 @@
> .input-group {
display: flex;
flex: 1, 0, auto;
flex: 1 0 auto;
> * {
float: none;

View file

@ -2,7 +2,7 @@
@import (reference) "~bootstrap/less/mixins";
.flex-parent(@grow: 1, @shrink: 1, @basis: auto) {
flex: @grow, @shrink, @basis;
flex: @grow @shrink @basis;
display: flex;
flex-direction: column;

View file

@ -78,7 +78,7 @@ navbar {
// tablets/phones
@media (max-width: @screen-md-min) {
> .fill {
flex: 1, 1, @screen-md;
flex: 1 1 @screen-md;
}
}

View file

@ -11,12 +11,12 @@ paginate {
text-align: center;
.pagination-other-pages {
flex: 1, 0, auto;
flex: 1 0 auto;
display: flex;
justify-content: center;
&-list {
flex: 0, 0, auto;
flex: 0 0 auto;
display: flex;
justify-content: center;
padding: 0;
@ -24,7 +24,7 @@ paginate {
list-style: none;
> li {
flex: 0, 0, auto;
flex: 0 0 auto;
user-select: none;
a {
@ -45,7 +45,7 @@ paginate {
}
.pagination-size {
flex: 0, 0, auto;
flex: 0 0 auto;
input[type=number] {
width: 3em;

View file

@ -4,11 +4,12 @@
//@import url("//fonts.googleapis.com/css?family=Lato:400,700,400italic");
@import (reference) "~ui-styles/theme/bootstrap.less";
@import (reference) "~ui-styles/theme/font-awesome.less";
@import (reference) "~ui-styles/mixins";
@import (reference) "~ui-styles/variables";
@import "~ui-styles/theme/bootstrap.less";
@import "~ui-styles/theme/font-awesome.less";
// Navbar =====================================================================

1
switcher.js.map Normal file

File diff suppressed because one or more lines are too long

View file

@ -16,4 +16,19 @@ module.exports = function (grunt) {
grunt.task.run(tasks);
});
grunt.registerTask('devServer', function (keepalive) {
var port = grunt.option('port');
var quiet = !(grunt.option('debug') || grunt.option('verbose'));
require('../src/devServer').run(port, quiet)
.then(function (server) {
grunt.log.ok('Server started: ' + server.info.uri);
if (keepalive) {
// return a never resolving promise
return new Promise(_.noop);
}
})
.nodeify(this.async());
});
};

View file

@ -1,19 +0,0 @@
module.exports = function (grunt) {
var _ = require('lodash');
grunt.registerTask('devServer', function (keepalive) {
var quiet = !(grunt.option('debug') || grunt.option('verbose'));
var port = grunt.option('port');
require('../src/dev_server').run(port, quiet)
.then(function (server) {
grunt.log.ok('Server started: ' + server.info.uri);
if (keepalive) {
// return a never resolving promise
return new Promise(_.noop);
}
})
.nodeify(this.async());
});
};