structed-garbage
Version:
Garbage and test data generator with no dependencies that can generate random objects and arrays by defined structure
362 lines (321 loc) • 8.48 kB
JavaScript
var words = require('./food-data/words'),
domains = require('./food-data/domains'),
firstNames = require('./food-data/first-names'),
lastNames = require('./food-data/last-names');
function isObject(obj) {
return obj === Object(obj);
}
function isStructLeaf(leaf) {
if (leaf && leaf.generator && Object.keys(generators).indexOf(leaf.generator) != -1) {
return true;
} else {
return false;
}
}
var generators = {};
/**
* just set defined static value
*/
generators.value = function(val) {
return val;
}
/**
* random char
*/
generators.char = function () {
var charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ 'abcdefghijklmnopqrstuvwxyz'
+ '0123456789`~!@#$%^&*()-_=+[]{}|\\:;'
+ '\'",.<>?/ \t\n'
;
return charset.charAt(Math.floor(Math.random() * charset.length));
};
/**
* random string
* params:
* min - min size of string
* max - max size of string
*/
generators.string = function (params) {
var min = 2,
max = 20;
if (params && params.min !== undefined)
min = params.min;
if (params && params.max !== undefined)
max = params.max;
if (params && params.len !== undefined)
max = min = params.len;
var len = generators.int({min: min, max: max});
var res = '';
for (var i = 0; i < len; i++) {
res += generators.char();
}
return res;
};
/**
* random integer
* params:
* min - min value
* max - max value
*/
generators.int = function(params) {
var min = 0,
max = 500;
if (params && params.min !== undefined)
min = params.min;
if (params && params.max !== undefined)
max = params.max;
return Math.floor(Math.random() * (max - min)) + min;
}
/**
* random bool
*/
generators.bool = function() {
return generators.int({min: 0, max: 2})?true:false;
}
/**
* random float from 0 to 1
*/
generators.float = function() {
return Math.random();
}
/**
* random key of the object or array
*/
generators.key = function(obj = []) {
var keys = Object.keys(obj);
return keys[generators.int({min: 0, max: keys.length})];
}
/**
* random element of the object or array
*/
generators.element = function(obj = []) {
return obj[generators.key(obj)];
}
/**
* random string with collocation
*/
generators.collocation = function() {
var first = generators.element(words.adjectives);
var last = generators.element(words.nouns);
return [first, last].join(' ');
}
/**
* random string with first and last name
*/
generators.name = function() {
var first = generators.element(firstNames);
var last = generators.element(lastNames);
return [first, last].join(' ');
}
/**
* random string with first name
*/
generators.firstName = function() {
return generators.element(firstNames);
}
/**
* random string with last name
*/
generators.lastName = function() {
return generators.element(lastNames);
}
/**
* random string with email
*/
generators.email = function() {
var first = generators.element(firstNames);
var domain = generators.element(domains);
return [first, domain].join('@');
}
/**
* random string with something like phone number
* params:
* len - length of the phone string without + at the start
*/
generators.phone = function(params) {
var len = 10;
if (params && params.len !== undefined)
len = params.len;
var phone = '+';
for (let i = 0; i < len + 1; i++) {
phone += generators.int({min: 0, max: 10});
}
return phone;
}
/**
* random string with domain
*/
generators.site = function() {
var domain = generators.element(domains);
return domain;
}
/**
* random error object
* params:
* min - min length in words of the text
* max - max length in words of the text
*/
generators.error = function(params) {
if (params === undefined)
params = { min: 2, max: generators.int({min: 2, max:5}) };
return new Error(generators.text(params));
}
// Возвращает объект Date с 1970 по настоящее время
/**
* random date object
* params:
* min - min timestamp
* max - max timestamp
*/
generators.date = function(params) {
var min = 0,
max = Date.now();
if (params && params.min !== undefined)
min = params.min;
if (params && params.max !== undefined)
max = params.max;
return new Date(generators.int({min: min, max: max}));
}
/**
* random image url from picsum
* params:
* heigth - heigth of the image
* width - width of the image
*/
generators.imagePicsum = function(params) {
var heigth = 200,
width = 300;
if (params && params.heigth !== undefined)
heigth = params.heigth;
if (params && params.width !== undefined)
width = params.width;
return `https://picsum.photos/${heigth}/${width}`;
}
/**
* random image url from lorempixel
* params:
* heigth - heigth of the image
* width - width of the image
*/
generators.imageLorempixel = function(params) {
var heigth = 200,
width = 300;
if (params && params.heigth !== undefined)
heigth = params.heigth;
if (params && params.width !== undefined)
width = params.width;
return `http://lorempixel.com/${heigth}/${width}`;
}
/**
* random text
* params:
* min - min length in words of the text
* max - max length in words of the text
* len - fixed length of the text in words
*/
generators.text = function(params) {
var loremWords = words.lorem.split(" ");
var min = 1;
var max = loremWords.length;
if (params && params.min !== undefined)
min = params.min;
if (params && params.max !== undefined)
max = params.max;
if (params && params.len !== undefined)
max = min = params.len;
return loremWords.slice(0, generators.int({min: min, max: max})).join(" ");
}
/**
* Generates random array
* params:
* len - fixed length of the array
* max - max length
* min - min length
* struct - structure of array element
*/
generators.array = function(params) {
var generatorsNames = Object.keys(generators).filter(name => {
return (['struct', 'value', 'element', 'key'].indexOf(name) == -1);
});
var min = 0;
var max = 10;
if (params) {
if (params.min !== undefined)
min = params.min;
if (params.max !== undefined)
max = params.max;
if (params.len !== undefined) {
max = min = params.len;
}
}
var len = generators.int({min: min, max: max});
var arr = [];
for (let i = 0; i < len; i++) {
let structure;
if (params && params.struct) {
structure = params.struct;
} else {
structure = {generator: generators.element(generatorsNames)};
}
arr.push(generators.struct(structure));
}
return arr;
}
/**
* Generates random object
* params:
* len - fixed number of properties
* max - max number of properties
* min - min number of properties
* struct - structure of element
*/
generators.object = function(params) {
var generatorsNames = Object.keys(generators).filter(name => {
return (['struct', 'value', 'element', 'key'].indexOf(name) == -1);
});
var min = 0;
var max = 10;
if (params) {
if (params.min !== undefined)
min = params.min;
if (params.max !== undefined)
max = params.max;
if (params.len !== undefined) {
max = min = params.len;
}
}
var len = generators.int({min: min, max: max});
var obj = {};
for (let i = 0; i < len; i++) {
let structure;
if (params && params.struct) {
structure = params.struct;
} else {
structure = {generator: generators.element(generatorsNames)};
}
obj[generators.string()] = generators.struct(structure);
}
return obj;
}
/**
* Generates random data with defined structure
*/
generators.struct = function(structure) {
if (isStructLeaf(structure)) {
return generators[structure.generator](structure.params);
}
var data;
if (Array.isArray(structure)) {
data = [];
} else if (isObject(structure)){
data = {};
} else {
return structure;
}
for (let key in structure) {
data[key] = generators.struct(structure[key]);
}
return data;
}
module.exports = generators;