@jsonjoy.com/json-type
Version:
High-performance JSON Pointer implementation
160 lines (159 loc) • 4.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.tup = exports.str = exports.ref = exports.or = exports.obj = exports.num = exports.map = exports.fn = exports.const_ = exports.bool = exports.bin = exports.arr = exports.any = void 0;
const json_random_1 = require("@jsonjoy.com/util/lib/json-random");
const json_clone_1 = require("@jsonjoy.com/util/lib/json-clone");
const any = (type) => {
return json_random_1.RandomJson.generate({ nodeCount: 5 });
};
exports.any = any;
const arr = (type) => {
let length = Math.round(Math.random() * 10);
const schema = type.getSchema();
const { min, max } = schema;
if (min !== undefined && length < min)
length = min + length;
if (max !== undefined && length > max)
length = max;
const result = [];
for (let i = 0; i < length; i++) {
result.push(type.type.random());
}
return result;
};
exports.arr = arr;
const bin = (type) => {
const octets = json_random_1.RandomJson.genString()
.split('')
.map((c) => c.charCodeAt(0));
return new Uint8Array(octets);
};
exports.bin = bin;
const bool = (type) => {
return json_random_1.RandomJson.genBoolean();
};
exports.bool = bool;
const const_ = (type) => {
return (0, json_clone_1.cloneBinary)(type.getSchema().value);
};
exports.const_ = const_;
const fn = (type) => {
return async () => type.res.random();
};
exports.fn = fn;
const map = (type) => {
const length = Math.round(Math.random() * 10);
const res = {};
for (let i = 0; i < length; i++) {
res[json_random_1.RandomJson.genString(length)] = type.valueType.random();
}
return res;
};
exports.map = map;
const num = (type) => {
let num = Math.random();
let min = Number.MIN_SAFE_INTEGER;
let max = Number.MAX_SAFE_INTEGER;
const schema = type.getSchema();
const { lt, lte, gt, gte } = schema;
if (gt !== undefined)
min = gt;
if (gte !== undefined)
if (gte === lte)
return gte;
else
min = gte + 0.000000000000001;
if (lt !== undefined)
max = lt;
if (lte !== undefined)
max = lte - 0.000000000000001;
if (min >= max)
return max;
if (schema.format) {
switch (schema.format) {
case 'i8':
min = Math.max(min, -0x80);
max = Math.min(max, 0x7f);
break;
case 'i16':
min = Math.max(min, -0x8000);
max = Math.min(max, 0x7fff);
break;
case 'i32':
min = Math.max(min, -0x80000000);
max = Math.min(max, 0x7fffffff);
break;
case 'i64':
case 'i':
min = Math.max(min, -0x8000000000);
max = Math.min(max, 0x7fffffffff);
break;
case 'u8':
min = Math.max(min, 0);
max = Math.min(max, 0xff);
break;
case 'u16':
min = Math.max(min, 0);
max = Math.min(max, 0xffff);
break;
case 'u32':
min = Math.max(min, 0);
max = Math.min(max, 0xffffffff);
break;
case 'u64':
case 'u':
min = Math.max(min, 0);
max = Math.min(max, 0xffffffffffff);
break;
}
return Math.round(num * (max - min)) + min;
}
num = num * (max - min) + min;
if (Math.random() > 0.7)
num = Math.round(num);
if (num === 0)
return 0;
return num;
};
exports.num = num;
const obj = (type) => {
const schema = type.getSchema();
const obj = schema.unknownFields ? json_random_1.RandomJson.genObject() : {};
// Use runtime check to avoid circular import with ObjectOptionalFieldType
for (const field of type.fields) {
if (field.constructor.name === 'ObjectOptionalFieldType')
if (Math.random() > 0.5)
continue;
obj[field.key] = field.value.random();
}
return obj;
};
exports.obj = obj;
const or = (type) => {
const types = type.types;
const index = Math.floor(Math.random() * types.length);
return types[index].random();
};
exports.or = or;
const ref = (type) => {
if (!type.system)
throw new Error('NO_SYSTEM');
const alias = type.system.resolve(type.getSchema().ref);
return alias.type.random();
};
exports.ref = ref;
const str = (type) => {
let length = Math.round(Math.random() * 10);
const schema = type.getSchema();
const { min, max } = schema;
if (min !== undefined && length < min)
length = min + length;
if (max !== undefined && length > max)
length = max;
return json_random_1.RandomJson.genString(length);
};
exports.str = str;
const tup = (type) => {
return type.types.map((subType) => subType.random());
};
exports.tup = tup;