123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- "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
|