267 lines
6.3 KiB
JavaScript
267 lines
6.3 KiB
JavaScript
|
"use strict";
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
exports.RandomJson = void 0;
|
|||
|
const defaultOpts = {
|
|||
|
rootNode: 'object',
|
|||
|
nodeCount: 32,
|
|||
|
odds: {
|
|||
|
null: 1,
|
|||
|
boolean: 2,
|
|||
|
number: 10,
|
|||
|
string: 8,
|
|||
|
binary: 0,
|
|||
|
array: 2,
|
|||
|
object: 2,
|
|||
|
},
|
|||
|
};
|
|||
|
const ascii = () => {
|
|||
|
return String.fromCharCode(Math.floor(32 + Math.random() * (126 - 32)));
|
|||
|
};
|
|||
|
const alphabet = [
|
|||
|
'a',
|
|||
|
'b',
|
|||
|
'c',
|
|||
|
'd',
|
|||
|
'e',
|
|||
|
'f',
|
|||
|
'g',
|
|||
|
'h',
|
|||
|
'i',
|
|||
|
'j',
|
|||
|
'k',
|
|||
|
'l',
|
|||
|
'm',
|
|||
|
'n',
|
|||
|
'o',
|
|||
|
'p',
|
|||
|
'q',
|
|||
|
'r',
|
|||
|
's',
|
|||
|
't',
|
|||
|
'u',
|
|||
|
'v',
|
|||
|
'w',
|
|||
|
'x',
|
|||
|
'y',
|
|||
|
'z',
|
|||
|
'A',
|
|||
|
'B',
|
|||
|
'C',
|
|||
|
'D',
|
|||
|
'E',
|
|||
|
'F',
|
|||
|
'G',
|
|||
|
'H',
|
|||
|
'I',
|
|||
|
'J',
|
|||
|
'K',
|
|||
|
'L',
|
|||
|
'M',
|
|||
|
'N',
|
|||
|
'O',
|
|||
|
'P',
|
|||
|
'Q',
|
|||
|
'R',
|
|||
|
'S',
|
|||
|
'T',
|
|||
|
'U',
|
|||
|
'V',
|
|||
|
'W',
|
|||
|
'X',
|
|||
|
'Y',
|
|||
|
'Z',
|
|||
|
'0',
|
|||
|
'1',
|
|||
|
'2',
|
|||
|
'3',
|
|||
|
'4',
|
|||
|
'5',
|
|||
|
'6',
|
|||
|
'7',
|
|||
|
'8',
|
|||
|
'9',
|
|||
|
'-',
|
|||
|
'_',
|
|||
|
'.',
|
|||
|
',',
|
|||
|
';',
|
|||
|
'!',
|
|||
|
'@',
|
|||
|
'#',
|
|||
|
'$',
|
|||
|
'%',
|
|||
|
'^',
|
|||
|
'&',
|
|||
|
'*',
|
|||
|
'\\',
|
|||
|
'/',
|
|||
|
'(',
|
|||
|
')',
|
|||
|
'+',
|
|||
|
'=',
|
|||
|
'\n',
|
|||
|
'👍',
|
|||
|
'🏻',
|
|||
|
'😛',
|
|||
|
'ä',
|
|||
|
'ö',
|
|||
|
'ü',
|
|||
|
'ß',
|
|||
|
'а',
|
|||
|
'б',
|
|||
|
'в',
|
|||
|
'г',
|
|||
|
'诶',
|
|||
|
'必',
|
|||
|
'西',
|
|||
|
];
|
|||
|
const utf16 = () => {
|
|||
|
return alphabet[Math.floor(Math.random() * alphabet.length)];
|
|||
|
};
|
|||
|
class RandomJson {
|
|||
|
static generate(opts) {
|
|||
|
const rnd = new RandomJson(opts);
|
|||
|
return rnd.create();
|
|||
|
}
|
|||
|
static genBoolean() {
|
|||
|
return Math.random() > 0.5;
|
|||
|
}
|
|||
|
static genNumber() {
|
|||
|
const num = Math.random() > 0.2
|
|||
|
? Math.random() * 1e9
|
|||
|
: Math.random() < 0.2
|
|||
|
? Math.round(0xff * (2 * Math.random() - 1))
|
|||
|
: Math.random() < 0.2
|
|||
|
? Math.round(0xffff * (2 * Math.random() - 1))
|
|||
|
: Math.round(Number.MAX_SAFE_INTEGER * (2 * Math.random() - 1));
|
|||
|
if (num === -0)
|
|||
|
return 0;
|
|||
|
return num;
|
|||
|
}
|
|||
|
static genString(length = Math.ceil(Math.random() * 16)) {
|
|||
|
let str = '';
|
|||
|
if (Math.random() < 0.1)
|
|||
|
for (let i = 0; i < length; i++)
|
|||
|
str += utf16();
|
|||
|
else
|
|||
|
for (let i = 0; i < length; i++)
|
|||
|
str += ascii();
|
|||
|
if (str.length !== length)
|
|||
|
return ascii().repeat(length);
|
|||
|
return str;
|
|||
|
}
|
|||
|
static genBinary(length = Math.ceil(Math.random() * 16)) {
|
|||
|
const buf = new Uint8Array(length);
|
|||
|
for (let i = 0; i < length; i++)
|
|||
|
buf[i] = Math.floor(Math.random() * 256);
|
|||
|
return buf;
|
|||
|
}
|
|||
|
static genArray(options = { odds: defaultOpts.odds }) {
|
|||
|
return RandomJson.generate({
|
|||
|
nodeCount: 6,
|
|||
|
...options,
|
|||
|
rootNode: 'array',
|
|||
|
});
|
|||
|
}
|
|||
|
static genObject(options = { odds: defaultOpts.odds }) {
|
|||
|
return RandomJson.generate({
|
|||
|
nodeCount: 6,
|
|||
|
...options,
|
|||
|
rootNode: 'object',
|
|||
|
});
|
|||
|
}
|
|||
|
constructor(opts = {}) {
|
|||
|
this.containers = [];
|
|||
|
this.opts = { ...defaultOpts, ...opts };
|
|||
|
this.oddTotals = {};
|
|||
|
this.oddTotals.null = this.opts.odds.null;
|
|||
|
this.oddTotals.boolean = this.oddTotals.null + this.opts.odds.boolean;
|
|||
|
this.oddTotals.number = this.oddTotals.boolean + this.opts.odds.number;
|
|||
|
this.oddTotals.string = this.oddTotals.number + this.opts.odds.string;
|
|||
|
this.oddTotals.binary = this.oddTotals.string + this.opts.odds.binary;
|
|||
|
this.oddTotals.array = this.oddTotals.string + this.opts.odds.array;
|
|||
|
this.oddTotals.object = this.oddTotals.array + this.opts.odds.object;
|
|||
|
this.totalOdds =
|
|||
|
this.opts.odds.null +
|
|||
|
this.opts.odds.boolean +
|
|||
|
this.opts.odds.number +
|
|||
|
this.opts.odds.string +
|
|||
|
this.opts.odds.binary +
|
|||
|
this.opts.odds.array +
|
|||
|
this.opts.odds.object;
|
|||
|
this.root =
|
|||
|
this.opts.rootNode === 'object'
|
|||
|
? {}
|
|||
|
: this.opts.rootNode === 'array'
|
|||
|
? []
|
|||
|
: this.pickContainerType() === 'object'
|
|||
|
? {}
|
|||
|
: [];
|
|||
|
this.containers.push(this.root);
|
|||
|
}
|
|||
|
create() {
|
|||
|
for (let i = 0; i < this.opts.nodeCount; i++)
|
|||
|
this.addNode();
|
|||
|
return this.root;
|
|||
|
}
|
|||
|
addNode() {
|
|||
|
const container = this.pickContainer();
|
|||
|
const newNodeType = this.pickNodeType();
|
|||
|
const node = this.generate(newNodeType);
|
|||
|
if (node && typeof node === 'object')
|
|||
|
this.containers.push(node);
|
|||
|
if (Array.isArray(container)) {
|
|||
|
const index = Math.floor(Math.random() * (container.length + 1));
|
|||
|
container.splice(index, 0, node);
|
|||
|
}
|
|||
|
else {
|
|||
|
const key = RandomJson.genString();
|
|||
|
container[key] = node;
|
|||
|
}
|
|||
|
}
|
|||
|
generate(type) {
|
|||
|
switch (type) {
|
|||
|
case 'null':
|
|||
|
return null;
|
|||
|
case 'boolean':
|
|||
|
return RandomJson.genBoolean();
|
|||
|
case 'number':
|
|||
|
return RandomJson.genNumber();
|
|||
|
case 'string':
|
|||
|
return RandomJson.genString();
|
|||
|
case 'binary':
|
|||
|
return RandomJson.genBinary();
|
|||
|
case 'array':
|
|||
|
return [];
|
|||
|
case 'object':
|
|||
|
return {};
|
|||
|
}
|
|||
|
}
|
|||
|
pickNodeType() {
|
|||
|
const odd = Math.random() * this.totalOdds;
|
|||
|
if (odd <= this.oddTotals.null)
|
|||
|
return 'null';
|
|||
|
if (odd <= this.oddTotals.boolean)
|
|||
|
return 'boolean';
|
|||
|
if (odd <= this.oddTotals.number)
|
|||
|
return 'number';
|
|||
|
if (odd <= this.oddTotals.string)
|
|||
|
return 'string';
|
|||
|
if (odd <= this.oddTotals.binary)
|
|||
|
return 'binary';
|
|||
|
if (odd <= this.oddTotals.array)
|
|||
|
return 'array';
|
|||
|
return 'object';
|
|||
|
}
|
|||
|
pickContainerType() {
|
|||
|
const sum = this.opts.odds.array + this.opts.odds.object;
|
|||
|
if (Math.random() < this.opts.odds.array / sum)
|
|||
|
return 'array';
|
|||
|
return 'object';
|
|||
|
}
|
|||
|
pickContainer() {
|
|||
|
return this.containers[Math.floor(Math.random() * this.containers.length)];
|
|||
|
}
|
|||
|
}
|
|||
|
exports.RandomJson = RandomJson;
|
|||
|
//# sourceMappingURL=RandomJson.js.map
|