prototoy
Version:
Lightweight JavaScript object generator for your node REPL (or elsewhere, I suppose)
157 lines (126 loc) • 3.09 kB
JavaScript
;
// Make a property name of length n
function makePropertyName(n) {
const base = 26;
let r, err, result = '';
do {
r = n % base;
n = Math.floor(n / base);
// After 9 you'd have 10, not 00.
// This means after 'z' you'd have 'ba', but we want 'aa'.
err = (r === 1 && result.length ? 0 : r);
result = String.fromCharCode(97 + err) + result;
} while(n > 0);
return result;
}
function array(count, generator) {
count = count || _defaultLength;
switch(generator) {
case Boolean:
generator = n => n % 2 ? true : false;
break;
case Date:
let d = new Date();
// Advance one day per call
generator = n => new Date(d.getTime() + n * 1000 * 60 * 60 * 24);
break;
case Number:
case undefined:
case null:
generator = n => n + 1;
break;
case Object:
generator = n => object(1);
break;
case String:
generator = n => string();
break;
}
let result = [];
for(let i = 1; i <= count; i++)
result.push(generator(i-1));
return result;
}
function cycle(list) {
return iterator(list, true);
}
function json(properties) {
return JSON.stringify(object(properties));
}
function map(properties, keyType, valType) {
let result, keys, max = properties || _defaultLength;
if(Number.isInteger(max)) {
keys = array(max, keyType || (n => makePropertyName(n)) );
}
else {
keys = properties;
max = keys.length;
valType = keyType;
}
result = new Map();
array(max, valType || Number).forEach((val, i) => result.set(keys[i], val));
return result;
}
function object (properties) {
let object = {}, count = 0, max = properties || _defaultLength, propName = makePropertyName;
if(!Number.isInteger(max)) {
max = properties.length;
propName = n => properties[n % max];
}
do {
object[propName(count++)] = count;
} while(count < max);
return object;
}
function iterator(list, cycle = false) {
let generator, i = 0;
list = list || _defaultLength;
if(Number.isInteger(list)) {
let count = list;
generator = function* () {
while(cycle || i < count) yield (i++ % count) + 1;
};
}
else {
generator = function* () {
while(cycle || i < list.length) yield list[i++ % list.length];
}
}
return generator();
}
function set() {
return new Set(array(...arguments));
}
function string(count) {
const random = (max) => Math.floor( Math.random()* Math.floor(max) + 1);
let word, str = [];
count = count || _defaultLength;
while(count-- > 0) {
word = String.fromCharCode(96 + random(26));
str.push(word.repeat(random(8)));
}
return str.join(' ');
}
let _defaultLength = 10, obj = {
array: array,
a: array,
cycle: cycle,
iter: iterator,
iterator: iterator,
i: iterator,
map: map,
m: map,
json: json,
j: json,
object: object,
obj: object,
o: object,
set: set,
string: string,
str: string
};
Object.defineProperty(obj, 'defaultLength', {
set: (n) => _defaultLength = n || _defaultLength,
get: () => _defaultLength
});
module.exports = obj;