Merge branch 'master' of github.com:elastic/kibana into update/lodash

This commit is contained in:
Spencer Alger 2015-06-16 18:02:30 -07:00
commit 701d2dedfb
29 changed files with 446 additions and 65 deletions

View file

@ -8,6 +8,8 @@ cache:
- esvm
- node_modules
- src/kibana/bower_components
before_cache:
- rm -rf esvm/*/logs esvm/data_dir
notifications:
email:
- rashid.khan@elastic.co

View file

@ -34,7 +34,6 @@
"FileSaver": "babc6d9d8f",
"font-awesome": "4.2.0",
"gridster": "0.5.6",
"inflection": "1.3.8",
"jquery": "2.1.4",
"leaflet": "0.7.3",
"Leaflet.heat": "Leaflet/Leaflet.heat#627ede7c11bbe43",

View file

@ -112,8 +112,7 @@
"rjs-build-analysis": "0.0.3",
"simple-git": "^1.3.0",
"sinon": "^1.12.2",
"sinon-as-promised": "^2.0.3",
"tar": "^1.0.1"
"tar": "^2.1.1"
},
"engines": {
"node": "~0.10 || ~0.12",

View file

@ -39,13 +39,19 @@ define(function () {
description: 'The index to access if no index is set',
},
'metaFields': {
value: ['_source', '_id', '_type', '_index'],
value: ['_source', '_id', '_type', '_index', '_score'],
description: 'Fields that exist outside of _source to merge into our document when displaying it',
},
'discover:sampleSize': {
value: 500,
description: 'The number of rows to show in the table',
},
'courier:maxSegmentCount': {
value: 30,
description: 'Requests in discover are split into segments to prevent massive requests from being sent to ' +
'elasticsearch. This setting attempts to prevent the list of segments from getting too long, which might ' +
'cause requests to take much longer to process.'
},
'fields:popularLimit': {
value: 10,
description: 'The top N most popular fields to show',

View file

@ -13,6 +13,7 @@ define(function (require) {
var DocSource = Private(require('components/courier/data_source/doc_source'));
var SearchSource = Private(require('components/courier/data_source/search_source'));
var searchStrategy = Private(require('components/courier/fetch/strategy/search'));
var requestQueue = Private(require('components/courier/_request_queue'));
var errorHandlers = Private(require('components/courier/_error_handlers'));
@ -59,7 +60,7 @@ define(function (require) {
* individual errors are routed to their respective requests.
*/
self.fetch = function () {
fetch.searches().then(function () {
fetch.fetchQueued(searchStrategy).then(function () {
searchLooper.restart();
});
};

View file

@ -7,7 +7,7 @@ define(function (require) {
var errorHandlers = Private(require('components/courier/_error_handlers'));
var courierFetch = Private(require('components/courier/fetch/fetch'));
function SourceAbstract(initialState) {
function SourceAbstract(initialState, strategy) {
var self = this;
self._instanceid = _.uniqueId('data_source');
@ -38,7 +38,7 @@ define(function (require) {
});
self.history = [];
self._fetchStrategy = courierFetch.strategies[self._getType()];
self._fetchStrategy = strategy;
}
/*****

View file

@ -5,10 +5,11 @@ define(function (require) {
var sendToEs = Private(require('components/courier/data_source/_doc_send_to_es'));
var SourceAbstract = Private(require('components/courier/data_source/_abstract'));
var DocRequest = Private(require('components/courier/fetch/request/doc'));
var docStrategy = Private(require('components/courier/fetch/strategy/doc'));
_.class(DocSource).inherits(SourceAbstract);
function DocSource(initialState) {
DocSource.Super.call(this, initialState);
DocSource.Super.call(this, initialState, docStrategy);
}
DocSource.prototype.onUpdate = SourceAbstract.prototype.onResults;

View file

@ -1,16 +1,15 @@
define(function (require) {
return function SearchSourceFactory(Promise, Private) {
var _ = require('lodash');
var SourceAbstract = Private(require('components/courier/data_source/_abstract'));
var SearchRequest = Private(require('components/courier/fetch/request/search'));
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'));
_.class(SearchSource).inherits(SourceAbstract);
function SearchSource(initialState) {
SearchSource.Super.call(this, initialState);
SearchSource.Super.call(this, initialState, searchStrategy);
}
// expose a ready state for the route setup to read

View file

@ -2,11 +2,6 @@ define(function (require) {
return function fetchService(Private, Promise) {
var _ = require('lodash');
var strategies = this.strategies = {
doc: Private(require('components/courier/fetch/strategy/doc')),
search: Private(require('components/courier/fetch/strategy/search'))
};
var requestQueue = Private(require('components/courier/_request_queue'));
var fetchThese = Private(require('components/courier/fetch/_fetch_these'));
@ -19,21 +14,9 @@ define(function (require) {
else return fetchThese(requests);
}
/**
* Fetch all pending docs that are ready to be fetched
* @async
*/
this.docs = _.partial(fetchQueued, strategies.doc);
/**
* Fetch all pending search requests
* @async
*/
this.searches = _.partial(fetchQueued, strategies.search);
this.fetchQueued = fetchQueued;
function fetchASource(source, strategy) {
strategy = strategy || strategies[source._getType()];
var defer = Promise.defer();
fetchThese([
@ -89,4 +72,4 @@ define(function (require) {
});
};
};
});
});

View file

@ -1,5 +1,5 @@
define(function (require) {
return function CourierSegmentedReqProvider(es, Private, Promise, Notifier, timefilter) {
return function CourierSegmentedReqProvider(es, Private, Promise, Notifier, timefilter, config) {
var _ = require('lodash');
var SearchReq = Private(require('components/courier/fetch/request/search'));
var requestQueue = Private(require('components/courier/_request_queue'));
@ -18,6 +18,7 @@ define(function (require) {
// segmented request specific state
this._initFn = initFn;
this._desiredSize = false;
this._maxSegments = config.get('courier:maxSegmentCount');
this._hitsReceived = 0;
this._direction = 'desc';
this._handle = new SegmentedHandle(this);
@ -67,9 +68,16 @@ define(function (require) {
return self._getFlattenedSource()
.then(function (flatSource) {
var params = _.cloneDeep(flatSource);
var index = self._active = self._queue.shift();
params.index = index;
// calculate the number of indices to fetch in this request in order to prevent
// more than self._maxSegments requests. We use Math.max(1, n) to ensure that each request
// has at least one index pattern, and Math.floor() to make sure that if the
// number of indices does not round out evenly the extra index is tacked onto the last
// request, making sure the first request returns faster.
var remainingSegments = self._maxSegments - self._segments.length;
var indexCount = Math.max(1, Math.floor(self._queue.length / remainingSegments));
params.index = self._active = self._queue.splice(0, indexCount);
if (self._desiredSize !== false) {
params.body.size = Math.max(self._desiredSize - self._hitsReceived, 0);
}
@ -155,7 +163,6 @@ define(function (require) {
total: this._all.length,
complete: this._complete.length,
remaining: this._queue.length,
active: this._active,
hitCount: this._mergedResp.hits.hits.length
});
};

View file

@ -2,15 +2,16 @@ define(function (require) {
return function DocLooperService(Private) {
var fetch = Private(require('components/courier/fetch/fetch'));
var Looper = Private(require('components/courier/looper/_looper'));
var docStrategy = Private(require('components/courier/fetch/strategy/doc'));
/**
* The Looper which will manage the doc fetch interval
* @type {Looper}
*/
var docLooper = new Looper(1500, function () {
fetch.docs();
fetch.fetchQueued(docStrategy);
});
return docLooper;
};
});
});

View file

@ -23,4 +23,4 @@ define(function (require) {
return searchLooper;
};
});
});

View file

@ -23,4 +23,4 @@ doc-table {
z-index: 20;
opacity: @loading-opacity;
}
}
}

View file

@ -31,10 +31,10 @@ define(function (require) {
* @return {String} - the most specific type that we care for
*/
function castMappingType(name) {
var match = castMappingType.types.byName[name];
if (!name) return 'unknown';
if (match) return match.type;
return 'string';
var match = castMappingType.types.byName[name];
return match ? match.type : 'string';
}
return castMappingType;

View file

@ -38,8 +38,7 @@ define(function (require) {
var indexed = !!spec.indexed;
var scripted = !!spec.scripted;
var sortable = (indexed || scripted) && type.sortable;
var sortable = spec.name === '_score' || ((indexed || scripted) && type.sortable);
var bucketable = indexed || scripted;
var filterable = spec.name === '_id' || scripted || (indexed && type.filterable);

View file

@ -18,14 +18,18 @@ define(function (require) {
// Override the mapping, even if elasticsearch says otherwise
var mappingOverrides = {
_timestamp: {
indexed: true,
type: 'date'
},
_source: { type: '_source' },
_index: { type: 'string' },
_type: { type: 'string' },
_id: { type: 'string' }
_id: { type: 'string' },
_timestamp: {
type: 'date',
indexed: true
},
_score: {
type: 'number',
indexed: false
}
};
if (!mapping.index || mapping.index === 'no') {

View file

@ -36,6 +36,14 @@ define(function (require) {
});
});
config.get('metaFields').forEach(function (meta) {
if (fields[meta]) return;
var field = { mapping: {} };
field.mapping[meta] = {};
fields[meta] = mapField(field, meta);
});
return _.map(fields, function (mapping, name) {
mapping.name = name;
return mapping;

View file

@ -17,7 +17,7 @@ define(function (require) {
return {
savedObj: savedSearch,
panel: panel,
edit: '#discover'
editUrl: savedSearches.urlFor(panel.id)
};
});
};

View file

@ -13,7 +13,7 @@ define(function (require) {
return {
savedObj: savedVis,
panel: panel,
edit: '#visualize/edit'
editUrl: savedVisualizations.urlFor(panel.id)
};
});
};

View file

@ -2,8 +2,12 @@
<div class="panel-heading">
<span class="panel-title">{{savedObj.title}}</span>
<div class="btn-group">
<a aria-label="Edit" ng-show="!appEmbedded" ng-href="{{edit}}/{{panel.id | uriescape}}"><i aria-hidden="true" class="fa fa-pencil"></i></a>
<a aria-label="Remove" ng-show="!appEmbedded" ng-click="remove()"><i aria-hidden="true" class="fa fa-times"></i></a>
<a aria-label="Edit" ng-show="!appEmbedded && editUrl" ng-href="{{editUrl}}">
<i aria-hidden="true" class="fa fa-pencil"></i>
</a>
<a aria-label="Remove" ng-show="!appEmbedded" ng-click="remove()">
<i aria-hidden="true" class="fa fa-times"></i>
</a>
</div>
<div class="clearfix"></div>
</div>
@ -26,4 +30,4 @@
class="panel-content"
filter="filter">
</doc-table>
</div>
</div>

View file

@ -3,12 +3,20 @@ define(function (require) {
var $ = require('jquery');
require('modules')
.get('app/dashboard')
.directive('dashboardPanel', function (savedVisualizations, savedSearches, Notifier, Private, $compile) {
.directive('dashboardPanel', function (savedVisualizations, savedSearches, Notifier, Private, $injector) {
var _ = require('lodash');
var loadPanel = Private(require('plugins/dashboard/components/panel/lib/load_panel'));
var filterManager = Private(require('components/filter_manager/filter_manager'));
var notify = new Notifier();
var services = require('plugins/settings/saved_object_registry').all().map(function (serviceObj) {
var service = $injector.get(serviceObj.service);
return {
type: service.type,
name: serviceObj.service
};
});
require('components/visualize/visualize');
require('components/doc_table/doc_table');
@ -29,7 +37,7 @@ define(function (require) {
loadPanel($scope.panel, $scope).then(function (panelConfig) {
// These could be done in loadPanel, putting them here to make them more explicit
$scope.savedObj = panelConfig.savedObj;
$scope.edit = panelConfig.edit;
$scope.editUrl = panelConfig.editUrl;
$scope.$on('$destroy', panelConfig.savedObj.destroy);
$scope.filter = function (field, value, operator) {
@ -38,6 +46,19 @@ define(function (require) {
};
}).catch(function (e) {
$scope.error = e.message;
// If the savedObjectType matches the panel type, this means the object itself has been deleted,
// so we shouldn't even have an edit link. If they don't match, it means something else is wrong
// with the object (but the object still exists), so we link to the object editor instead.
var objectItselfDeleted = e.savedObjectType === $scope.panel.type;
if (objectItselfDeleted) return;
var type = $scope.panel.type;
var id = $scope.panel.id;
var service = _.find(services, { type: type });
if (!service) return;
$scope.editUrl = '#settings/objects/' + service.name + '/' + id + '?notFound=' + e.savedObjectType;
});
});

View file

@ -331,7 +331,6 @@ define(function (require) {
}
$scope.updateTime();
segmented.setDirection(sortBy === 'time' ? (sort[1] || 'desc') : 'desc');
segmented.setSize(sortBy === 'time' ? $scope.opts.sampleSize : false);

View file

@ -46,6 +46,10 @@ define(function (require) {
});
};
$scope.$watch('state.tab', function (tab) {
if (!tab) $scope.changeTab($scope.services[0]);
});
$scope.toggleAll = function () {
if ($scope.selectedItems.length === $scope.currentTab.data.length) {
$scope.selectedItems.length = 0;

View file

@ -10,6 +10,7 @@
<p ng-if="notFound === 'search'">The saved search associated with this object no longer exists.</p>
<p ng-if="notFound === 'index-pattern'">The index pattern associated with this object no longer exists.</p>
<p ng-if="notFound === 'index-pattern-field'">A field associated with this object no longer exists in the index pattern.</p>
<p>If you know what this error means, go ahead and fix it - otherwise click the delete button above.</p>
</div>

View file

@ -1,7 +1,6 @@
define(function (require) {
var _ = require('lodash');
var angular = require('angular');
var inflection = require('inflection');
var rison = require('utils/rison');
var registry = require('plugins/settings/saved_object_registry');
var objectViewHTML = require('text!plugins/settings/sections/objects/_view.html');
@ -101,7 +100,7 @@ define(function (require) {
$scope.notFound = $routeParams.notFound;
$scope.title = inflection.singularize(serviceObj.title);
$scope.title = service.type;
es.get({
index: config.file.kibana_index,

View file

@ -26,7 +26,6 @@ require.config({
file_saver: 'bower_components/FileSaver/FileSaver',
gridster: 'bower_components/gridster/dist/jquery.gridster',
'leaflet-heat': 'bower_components/Leaflet.heat/dist/leaflet-heat',
inflection: 'bower_components/inflection/lib/inflection',
jquery: 'bower_components/jquery/dist/jquery',
leaflet: 'bower_components/leaflet/dist/leaflet',
'leaflet-draw': 'bower_components/leaflet-draw/dist/leaflet.draw',
@ -54,9 +53,6 @@ require.config({
'leaflet-heat': {
deps: ['leaflet']
},
inflection: {
exports: 'inflection'
},
file_saver: {
exports: 'saveAs'
},

View file

@ -5,7 +5,15 @@ module.exports = {
options: {
log: true,
logErrors: true,
run: false
run: false,
page: {
settings: {
viewportSize: {
width: 2400,
height: 1250
}
}
}
},
unit: {
options: {

View file

@ -6,14 +6,24 @@
<link rel="stylesheet" href="/node_modules/mocha/mocha.css" />
<script src="/node_modules/expect.js/index.js"></script>
<script src="/node_modules/mocha/mocha.js"></script>
<script src="/test/utils/Nonsense.js"></script>
<script src="/src/kibana/bower_components/requirejs/require.js"></script>
<script src="/src/kibana/require.config.js"></script>
<script>(function () {
/* globals mocha */
/* globals mocha,Nonsense */
var COVERAGE = window.COVERAGE = !!(/coverage/i.test(window.location.search));
var DISABLE_RESIZE_CHECKER = window.DISABLE_RESIZE_CHECKER = true;
var SEED = parseFloat((window.location.search.match(/[&?]SEED=([^&]+)(?:&|$)/) || [])[1]);
if (isNaN(SEED)) SEED = Date.now();
console.log('Random-ness seed: ' + SEED);
Math.nonsense = new Nonsense(SEED);
Math.random = function () {
return Math.nonsense.frac();
};
require.config({
baseUrl: '/',
paths: {
@ -130,7 +140,7 @@
(suite.tests || [])
.filter(function (test) {
return test.state !== 'passed' && test.state !== 'pending';
return test.state && test.state !== 'passed' && test.state !== 'pending';
})
.forEach(function (test) {
fails.push({

330
test/utils/Nonsense.js Normal file
View file

@ -0,0 +1,330 @@
(function() {
// random number generator from http://baagoe.org/en/wiki/Better_random_numbers_for_javascript
var DATA;
function hash (data) {
var h, i, n;
n = 0xefc8249d;
data = data.toString();
for (i = 0; i < data.length; i++) {
n += data.charCodeAt(i);
h = 0.02519603282416938 * n;
n = h >>> 0;
h -= n;
h *= n;
n = h >>> 0;
h -= n;
n += h * 0x100000000; // 2^32
}
return (n >>> 0) * 2.3283064365386963e-10; // 2^-32
}
// private random helper
function rnd () {
var t = 2091639 * this.s0 + this.c * 2.3283064365386963e-10; // 2^-32
this.c = t | 0;
this.s0 = this.s1;
this.s1 = this.s2;
this.s2 = t - this.c;
return this.s2;
}
function Nonsense () {
this.sow.apply(this, arguments);
}
Nonsense.prototype.sow = function () {
var i, seeds, seed;
this.s0 = hash(' ');
this.s1 = hash(this.s0);
this.s2 = hash(this.s1);
this.c = 1;
seeds = Array.prototype.slice.call(arguments);
for (i = 0; seed = seeds[i++];) {
this.s0 -= hash(seed);
this.s0 += ~~(this.s0 < 0);
this.s1 -= hash(seed);
this.s1 += ~~(this.s1 < 0);
this.s2 -= hash(seed);
this.s2 += ~~(this.s2 < 0);
}
};
Nonsense.prototype.uint32 = function () {
return rnd.apply(this) * 0x100000000; // 2^32
};
Nonsense.prototype.fract32 = function () {
return rnd.apply(this) + (rnd.apply(this) * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53
};
Nonsense.prototype.bool = function () {
return this.uint32() & 0x1 ? true : false;
};
Nonsense.prototype.integer = function() {
return this.uint32();
};
Nonsense.prototype.frac = function() {
return this.fract32();
};
Nonsense.prototype.real = function() {
return this.uint32() + this.fract32();
};
Nonsense.prototype.integerInRange = function(min, max) {
return Math.floor(this.realInRange(min, max));
};
Nonsense.prototype.realInRange = function(min, max) {
min = min || 0;
max = max || 0;
return this.frac() * (max - min) + min;
};
Nonsense.prototype.normal = function() {
return 1 - 2 * this.frac();
};
Nonsense.prototype.uuid = function() {
// from https://gist.github.com/1308368
var a, b;
for (
b=a='';
a++<36;
b+=~a%5|a*3&4?(a^15?8^this.frac()*(a^20?16:4):4).toString(16):'-'
);
return b;
};
Nonsense.prototype.pick = function(ary) {
return ary[this.integerInRange(0, ary.length)];
};
Nonsense.prototype.weightedPick = function(ary) {
return ary[~~(Math.pow(this.frac(), 2) * ary.length)];
};
// Language ----------------------------------------------------------------
Nonsense.prototype.word = function() {
return this.pick(DATA.lipsum);
};
Nonsense.prototype.words = function(num) {
num = num || 3;
var ret = [];
for (var i = 0; i < num; i++) {
ret.push(this.pick(DATA.lipsum));
}
return ret.join(' ');
};
Nonsense.prototype.sentence = function() {
var ret;
ret = this.words(this.integerInRange(2, 16)).replace(/[a-z]/, function(m) {
return m.toUpperCase();
});
return ret + '.';
};
Nonsense.prototype.sentences = function(num) {
num = num || 3;
var ret = [];
for (var i = 0; i < num; i++) {
ret.push(this.sentence());
}
return ret.join(' ');
};
// Time --------------------------------------------------------------------
Nonsense.prototype.timestamp = function(a, b) {
return this.realInRange(a || 946684800000, b || 1577862000000);
};
// People ------------------------------------------------------------------
Nonsense.prototype.gender = function () {
return this.bool() ? 'male' : 'female';
};
Nonsense.prototype.firstName = function(gender) {
gender = gender || this.gender();
return "" + (this.pick(DATA.names.first[gender]));
};
Nonsense.prototype.lastName = function() {
return "" + (this.pick(DATA.names.last));
};
Nonsense.prototype.name = function(gender) {
return "" + (this.firstName(gender)) + " " + (this.lastName());
};
Nonsense.prototype.jobTitle = function() {
return "" + (this.pick(DATA.departments)) + " " + (this.pick(DATA.positions));
};
Nonsense.prototype.buzzPhrase = function() {
return "" + (this.pick(DATA.buzz.verbs)) + " " + (this.pick(DATA.buzz.adjectives)) + " " + (this.pick(DATA.buzz.nouns));
};
// Dataset -----------------------------------------------------------------
DATA = {
lipsum: [
"lorem", "ipsum", "dolor", "sit", "amet", "consectetur",
"adipiscing", "elit", "nunc", "sagittis", "tortor", "ac", "mi",
"pretium", "sed", "convallis", "massa", "pulvinar", "curabitur",
"non", "turpis", "velit", "vitae", "rutrum", "odio", "aliquam",
"sapien", "orci", "tempor", "sed", "elementum", "sit", "amet",
"tincidunt", "sed", "risus", "etiam", "nec", "lacus", "id", "ante",
"hendrerit", "malesuada", "donec", "porttitor", "magna", "eget",
"libero", "pharetra", "sollicitudin", "aliquam", "mattis", "mattis",
"massa", "et", "porta", "morbi", "vitae", "magna", "augue",
"vestibulum", "at", "lectus", "sed", "tellus", "facilisis",
"tincidunt", "suspendisse", "eros", "magna", "consequat", "at",
"sollicitudin", "ac", "vestibulum", "vel", "dolor", "in", "egestas",
"lacus", "quis", "lacus", "placerat", "et", "molestie", "ipsum",
"scelerisque", "nullam", "sit", "amet", "tortor", "dui", "aenean",
"pulvinar", "odio", "nec", "placerat", "fringilla", "neque", "dolor"
],
names: {
first: {
// Top names from 1913-2012
// Data from http://www.ssa.gov/OACT/babynames/decades/century.html
male: [
"James", "John", "Robert", "Michael", "William", "David", "Richard",
"Joseph", "Charles", "Thomas", "Christopher", "Daniel", "Matthew",
"Donald", "Anthony", "Paul", "Mark", "George", "Steven", "Kenneth",
"Andrew", "Edward", "Brian", "Joshua", "Kevin", "Ronald", "Timothy",
"Jason", "Jeffrey", "Gary", "Ryan", "Nicholas", "Eric", "Stephen",
"Jacob", "Larry", "Frank", "Jonathan", "Scott", "Justin", "Raymond",
"Brandon", "Gregory", "Samuel", "Patrick", "Benjamin", "Jack",
"Dennis", "Jerry", "Alexander", "Tyler", "Douglas", "Henry", "Peter",
"Walter", "Aaron", "Jose", "Adam", "Harold", "Zachary", "Nathan",
"Carl", "Kyle", "Arthur", "Gerald", "Lawrence", "Roger", "Albert",
"Keith", "Jeremy", "Terry", "Joe", "Sean", "Willie", "Jesse",
"Ralph", "Billy", "Austin", "Bruce", "Christian", "Roy", "Bryan",
"Eugene", "Louis", "Harry", "Wayne", "Ethan", "Jordan", "Russell",
"Alan", "Philip", "Randy", "Juan", "Howard", "Vincent", "Bobby",
"Dylan", "Johnny", "Phillip", "Craig"
],
female: [
"Mary", "Patricia", "Elizabeth", "Jennifer", "Linda", "Barbara",
"Susan", "Margaret", "Jessica", "Dorothy", "Sarah", "Karen", "Nancy",
"Betty", "Lisa", "Sandra", "Helen", "Donna", "Ashley", "Kimberly",
"Carol", "Michelle", "Amanda", "Emily", "Melissa", "Laura", "Deborah",
"Stephanie", "Rebecca", "Sharon", "Cynthia", "Ruth", "Kathleen",
"Anna", "Shirley", "Amy", "Angela", "Virginia", "Brenda", "Pamela",
"Catherine", "Katherine", "Nicole", "Christine", "Janet", "Debra",
"Carolyn", "Samantha", "Rachel", "Heather", "Maria", "Diane",
"Frances", "Joyce", "Julie", "Martha", "Joan", "Evelyn", "Kelly",
"Christina", "Emma", "Lauren", "Alice", "Judith", "Marie", "Doris",
"Ann", "Jean", "Victoria", "Cheryl", "Megan", "Kathryn", "Andrea",
"Jacqueline", "Gloria", "Teresa", "Janice", "Sara", "Rose", "Julia",
"Hannah", "Theresa", "Judy", "Mildred", "Grace", "Beverly", "Denise",
"Marilyn", "Amber", "Danielle", "Brittany", "Diana", "Jane", "Lori",
"Olivia", "Tiffany", "Kathy", "Tammy", "Crystal", "Madison"
]
},
last: [
"Smith", "Johnson", "Williams", "Jones", "Brown", "Davis",
"Miller", "Wilson", "Moore", "Taylor", "Anderson", "Thomas",
"Jackson", "White", "Harris", "Martin", "Thompson", "Garcia",
"Martinez", "Robinson", "Clark", "Rodriguez", "Lewis", "Lee",
"Walker", "Hall", "Allen", "Young", "Hernandez", "King",
"Wright", "Lopez", "Hill", "Scott", "Green", "Adams", "Baker",
"Gonzalez", "Nelson", "Carter", "Mitchell", "Perez", "Roberts",
"Turner", "Phillips", "Campbell", "Parker", "Evans", "Edwards",
"Collins", "Stewart", "Sanchez", "Morris", "Rogers", "Reed",
"Cook", "Morgan", "Bell", "Murphy", "Bailey", "Rivera",
"Cooper", "Richardson", "Cox", "Howard", "Ward", "Torres",
"Peterson", "Gray", "Ramirez", "James", "Watson", "Brooks",
"Kelly", "Sanders", "Price", "Bennett", "Wood", "Barnes",
"Ross", "Henderson", "Coleman", "Jenkins", "Perry", "Powell",
"Long", "Patterson", "Hughes", "Flores", "Washington", "Butler",
"Simmons", "Foster", "Gonzales", "Bryant", "Alexander",
"Russell", "Griffin", "Diaz", "Hayes"
]
},
departments: ['HR', 'IT', 'Marketing', 'Engineering', 'Sales'],
positions: ['Director', 'Manager', 'Team Lead', 'Team Member'],
internet: {
tlds: ['.com', '.net', '.org', '.edu', '.co.uk']
},
buzz: {
nouns: [
"action-items", "applications", "architectures", "bandwidth",
"channels", "communities", "content", "convergence",
"deliverables", "e-business", "e-commerce", "e-markets",
"e-services", "e-tailers", "experiences", "eyeballs",
"functionalities", "infomediaries", "infrastructures",
"initiatives", "interfaces", "markets", "methodologies",
"metrics", "mindshare", "models", "networks", "niches",
"paradigms", "partnerships", "platforms", "portals",
"relationships", "ROI", "schemas", "solutions", "supply-chains",
"synergies", "systems", "technologies", "users", "vortals",
"web services", "web-readiness"
],
adjectives: [
"24/365", "24/7", "B2B", "B2C", "back-end", "best-of-breed",
"bleeding-edge", "bricks-and-clicks", "clicks-and-mortar",
"collaborative", "compelling", "cross-media", "cross-platform",
"customized", "cutting-edge", "distributed", "dot-com",
"dynamic", "e-business", "efficient", "end-to-end",
"enterprise", "extensible", "frictionless", "front-end",
"global", "granular", "holistic", "impactful", "innovative",
"integrated", "interactive", "intuitive", "killer",
"leading-edge", "magnetic", "mission-critical", "multiplatform",
"next-generation", "one-to-one", "open-source",
"out-of-the-box", "plug-and-play", "proactive", "real-time",
"revolutionary", "rich", "robust", "scalable", "seamless",
"sexy", "sticky", "strategic", "synergistic", "transparent",
"turn-key", "ubiquitous", "user-centric", "value-added",
"vertical", "viral", "virtual", "visionary", "web-enabled",
"wireless", "world-class"
],
verbs: [
"aggregate", "architect", "benchmark", "brand", "cultivate",
"deliver", "deploy", "disintermediate", "drive", "e-enable",
"embrace", "empower", "enable", "engage", "engineer", "enhance",
"envisioneer", "evolve", "expedite", "exploit", "extend",
"facilitate", "generate", "grow", "harness", "implement",
"incentivize", "incubate", "innovate", "integrate", "iterate",
"leverage", "matrix", "maximize", "mesh", "monetize", "morph",
"optimize", "orchestrate", "productize", "recontextualize",
"redefine", "reintermediate", "reinvent", "repurpose",
"revolutionize", "scale", "seize", "strategize", "streamline",
"syndicate", "synergize", "synthesize", "target", "transform",
"transition", "unleash", "utilize", "visualize", "whiteboard"
]
}
};
if (typeof module !== 'undefined') {
module.exports = Nonsense;
} else if (typeof define == 'function') {
define(function () {
return Nonsense;
});
} else {
this.Nonsense = Nonsense;
}
}).call(this);