UNPKG

dilswer

Version:

Blazingly fast data validation library with TypeScript integration.

1,974 lines (1,931 loc) 59.4 kB
const fs = require("fs"); const path = require("path"); const ark = require("arktype"); const zod = require("zod"); const valibot = require("valibot"); const validOnly = process.argv.includes("--valid-only"); const Bench = require("benchmark"); /** * @type {import("../src/index")} */ const dilswer = require("../dist/cjs/index.cjs"); const { instance } = require("valibot"); const { compileFastValidator, Type, validator, } = dilswer; async function main() { await large(); await medium(); await small(); await mini(); await micro(); // await deeplyNestedRecord(); } const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); /** * Check if the given schemas are correct by validating the known correct data * * @param {{ dilswer: DilswerSchema; zod: ZodSchema; valibot: ValibotSchema; arkttype: ArkSchema; }} schemas * @param {any} correctData * @returns */ const checkSchemasCorrect = (schemas, correctData, incorrectData) => { const validate = validator(schemas.dilswer); const fastValidate = compileFastValidator(schemas.dilswer); const zodResult = schemas.zod.safeParse(correctData); const valibotResult = valibot.safeParse(schemas.valibot, correctData); const arktResult = schemas.arkttype(correctData); const dilswerResult = validate(correctData); const fastDilswerResult = fastValidate(correctData); if ( !dilswerResult || !fastDilswerResult || !zodResult.success || !valibotResult.success || (arktResult instanceof ark.type.errors) ) { console.log("Schemas are incorrect"); console.log("Dilswer:", dilswerResult); console.log("Fast Dilswer:", fastDilswerResult); console.log("Zod:", zodResult); console.log("Valibot:", valibotResult); console.log("ArkType:", arktResult); throw new Error("Schemas are incorrect"); } const zodInvalidResult = schemas.zod.safeParse(incorrectData); const valibotInvalidResult = valibot.safeParse( schemas.valibot, incorrectData, ); const arktInvalidResult = schemas.arkttype(incorrectData); const dilswerInvalidResult = validate(incorrectData); const fastDilswerInvalidResult = fastValidate(incorrectData); // console.log("arktInvalidResult", arktInvalidResult); if ( dilswerInvalidResult || fastDilswerInvalidResult || zodInvalidResult.success || valibotInvalidResult.success || !(arktInvalidResult instanceof ark.type.errors) ) { console.log("Schemas are incorrect"); console.log("Dilswer:", dilswerInvalidResult); console.log("Fast Dilswer:", fastDilswerInvalidResult); console.log("Zod:", zodInvalidResult); console.log("Valibot:", valibotInvalidResult); console.log("ArkType:", arktInvalidResult); throw new Error("Schemas are incorrect"); } return true; }; /** * @typedef {import("arktype").Type} ArkSchema */ /** * @typedef {import("valibot").AnySchema} ValibotSchema */ /** * @typedef {import("zod").AnyZodObject} ZodSchema */ /** * @typedef {import("../src/index").AnyDataType} DilswerSchema */ /** * @param {string} name * @param {() => any} getData * @param {{ dilswer: DilswerSchema; zod: ZodSchema; valibot: ValibotSchema; arkttype: ArkSchema; }} schemas * @returns */ const runSuiteForSample = (name, getData, schemas) => { if (validOnly && name.includes("invalid")) { return; } const validate = validator(schemas.dilswer); const fastValidate = compileFastValidator(schemas.dilswer); console.log(separator + "\n"); return new Promise((r) => { const suite = new Bench.Suite( `\u001b[1m\u001b[37mValidators benchmark, sample: \u001b[33m${name}\u001b[0m`, ); suite .add("Dilswer validator", function() { validate(getData()); }) .add("Dilswer compileFastValidator", function() { fastValidate(getData()); }) .add("Zod", () => { schemas.zod.safeParse(getData()); }) .add("Valibot", () => { valibot.safeParse(schemas.valibot, getData()); }) .add("ArkType", () => { schemas.arkttype(getData()); }) .on("start", function() { console.log("Running Suite: " + this.name); }) .on("error", function(e) { console.log("Error in Suite: " + this.name, e); }) .on("abort", function(e) { console.log("Aborting Suite: " + this.name, e); }) .on("complete", function() { const fastest = this.filter("fastest"); console.log(""); for (let j = 0; j < this.length; j++) { console.log( " ", this[j].toString(), "\u001b[94m" + ((this[j].hz / fastest[0].hz) * 100).toFixed(2) + "%\u001b[0m", ); } console.log( "\n\u001b[1m\u001b[37mFastest is \u001b[92m" + fastest.map("name"), "\u001b[0m", ); r(); }) // run async .run({ async: true }); }).then(() => sleep(5000)); }; const separator = "\u001b[35m" + "-".repeat(65) + "\u001b[0m"; const micro = async () => { await runSuiteForSample("micro - valid 1", () => "asdasd", { dilswer: Type.String, zod: zod.string(), valibot: valibot.string(), arkttype: ark.type("string"), }); await runSuiteForSample("micro - valid 2", () => 42, { dilswer: Type.Number, zod: zod.number(), valibot: valibot.number(), arkttype: ark.type("number"), }); await runSuiteForSample("micro - invalid 1", () => 42, { dilswer: Type.String, zod: zod.string(), valibot: valibot.string(), arkttype: ark.type("string"), }); await runSuiteForSample("micro - invalid 2", () => "asdasd", { dilswer: Type.Number, zod: zod.number(), valibot: valibot.number(), arkttype: ark.type("number"), }); }; const mini = async () => { const miniSchames = { dilswer: Type.Record({ foo: Type.String, bar: Type.Number, }), zod: zod.object({ foo: zod.string(), bar: zod.number() }), valibot: valibot.object({ foo: valibot.string(), bar: valibot.number() }), arkttype: ark.type({ foo: "string", bar: "number" }), }; const validData = () => ({ foo: "lorem ipsum dolor sit amet consectetur adipiscing elit", bar: 42, }); const invalidData = () => ({ foo: "abc", bar: "def", }); checkSchemasCorrect(miniSchames, validData(), invalidData()); await runSuiteForSample("mini - valid", validData, miniSchames); await runSuiteForSample("mini - invalid", invalidData, miniSchames); }; const small = async () => { const smallSchemas = { dilswer: Type.Record({ foo: Type.String, bar: Type.Number, baz: Type.Boolean, qux: Type.Array(Type.String), quux: Type.Null, }), zod: zod.object({ foo: zod.string(), bar: zod.number(), baz: zod.boolean(), qux: zod.array(zod.string()), quux: zod.null(), }), valibot: valibot.object({ foo: valibot.string(), bar: valibot.number(), baz: valibot.boolean(), qux: valibot.array(valibot.string()), quux: valibot.null(), }), arkttype: ark.type({ foo: "string", bar: "number", baz: "boolean", qux: "string[]", quux: "null", }), }; const validData = () => ({ foo: "lorem ipsum dolor sit amet consectetur adipiscing elit", bar: 42, baz: true, qux: ["lorem", "ipsum", "dolor", "sit", "amet", "consectetur"], quux: null, }); const invalidData1 = () => ({ foo: "lorem ipsum dolor sit amet consectetur adipiscing elit", bar: 42, baz: true, qux: ["lorem", "ipsum", "dolor", 1, "amet", "consectetur"], quux: null, }); const invalidData2 = () => ({ foo: "lorem ipsum dolor sit amet consectetur adipiscing elit", bar: 42, baz: "true", qux: ["lorem", "ipsum", "dolor", "sit", "amet", "consectetur"], quux: null, }); checkSchemasCorrect(smallSchemas, validData(), invalidData1()); await runSuiteForSample("small - valid", validData, smallSchemas); await runSuiteForSample("small - invalid 1", invalidData1, smallSchemas); await runSuiteForSample("small - invalid 2", invalidData2, smallSchemas); }; const medium = async () => { const mediumSchemas = { dilswer: Type.Record({ rangeError: Type.Option(Type.InstanceOf(RangeError)), foo: Type.String, bar: Type.Number, baz: Type.Boolean, qux: Type.Array( Type.Record({ quux: Type.String, quuz: Type.Number, corge: Type.Boolean, grault: Type.Array(Type.String), garply: Type.Null, }), ), waldo: Type.Null, }), zod: zod.object({ foo: zod.string(), bar: zod.number(), baz: zod.boolean(), qux: zod.array( zod.object({ quux: zod.string(), quuz: zod.number(), corge: zod.boolean(), grault: zod.array(zod.string()), garply: zod.null(), }), ), waldo: zod.null(), }), valibot: valibot.object({ foo: valibot.string(), bar: valibot.number(), baz: valibot.boolean(), qux: valibot.array(valibot.object({ quux: valibot.string(), quuz: valibot.number(), corge: valibot.boolean(), grault: valibot.array(valibot.string()), garply: valibot.null(), })), waldo: valibot.null(), }), arkttype: ark.type({ foo: "string", bar: "number", baz: "boolean", qux: ark.type({ quux: "string", quuz: "number", corge: "boolean", grault: "string[]", garply: "null", }).array(), waldo: "null", }), }; const validData = () => ({ foo: "lorem ipsum dolor sit amet consectetur adipiscing elit", bar: 42, baz: true, qux: [ { quux: "lorem ipsum dolor sit amet consectetur adipiscing elit", quuz: 42, corge: true, grault: [ "lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", ], garply: null, }, { quux: "lorem ipsum dolor sit amet consectetur adipiscing elit", quuz: 42, corge: true, grault: [ "lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", ], garply: null, }, { quux: "lorem ipsum dolor sit amet consectetur adipiscing elit", quuz: 42, corge: true, grault: [ "lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", ], garply: null, }, ], waldo: null, }); const invalidData1 = () => ({ foo: "lorem ipsum dolor sit amet consectetur adipiscing elit", bar: 42, baz: true, qux: [ { quux: "lorem ipsum dolor sit amet consectetur adipiscing elit", quuz: 42, corge: true, grault: [ "lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", ], garply: null, }, { quux: "lorem ipsum dolor sit amet consectetur adipiscing elit", quuz: 42, corge: true, grault: [ "lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", ], garply: null, }, { quux: "lorem ipsum dolor sit amet consectetur adipiscing elit", quuz: 42, corge: true, grault: [ "lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", ], garply: null, }, ], waldo: "null", }); checkSchemasCorrect(mediumSchemas, validData(), invalidData1()); await runSuiteForSample("medium - valid", validData, mediumSchemas); await runSuiteForSample("medium - invalid 1", invalidData1, mediumSchemas); }; const large = async () => { const largeSchemas = { dilswer: Type.Record({ foo: Type.String, bar: Type.Number, baz: Type.Boolean, qux: Type.Array( Type.Record({ quux: Type.StringInt, quuz: Type.Int, corge: Type.Boolean, grault: Type.Array( Type.Record({ garply: Type.String, waldo: Type.StringNumeral, fred: Type.Boolean, plugh: Type.Array(Type.String, Type.Number, Type.Boolean), xyzzy: Type.Null, }), ), thud: Type.Function, paparapr: Type.Dict(Type.String, Type.Number), regexp: Type.InstanceOf(RegExp), entries: Type.Array( Type.Tuple( Type.String, Type.Record({ value: Type.String, done: Type.Boolean, }), ), ), }), ), wibble: Type.Null, }), zod: zod.object({ foo: zod.string(), bar: zod.number(), baz: zod.boolean(), qux: zod.array( zod.object({ quux: zod.string(), quuz: zod.number(), corge: zod.boolean(), grault: zod.array( zod.object({ garply: zod.string(), waldo: zod.string(), fred: zod.boolean(), plugh: zod.array( zod.union([zod.string(), zod.number(), zod.boolean()]), ), xyzzy: zod.null(), }), ), thud: zod.function(), paparapr: zod.record(zod.union([zod.string(), zod.number()])), regexp: zod.instanceof(RegExp), entries: zod.array( zod.tuple([ zod.string(), zod.object({ value: zod.string(), done: zod.boolean() }), ]), ), }), ), wibble: zod.null(), }), valibot: valibot.object({ foo: valibot.string(), bar: valibot.number(), baz: valibot.boolean(), qux: valibot.array(valibot.object({ quux: valibot.string(), quuz: valibot.number(), corge: valibot.boolean(), grault: valibot.array(valibot.object({ garply: valibot.string(), waldo: valibot.string(), fred: valibot.boolean(), plugh: valibot.array( valibot.union([ valibot.string(), valibot.number(), valibot.boolean(), ]), ), xyzzy: valibot.null(), })), thud: valibot.function(), paparapr: valibot.record(valibot.string(), valibot.number()), regexp: valibot.instance(RegExp), entries: valibot.array( valibot.tuple([ valibot.string(), valibot.object({ value: valibot.string(), done: valibot.boolean(), }), ]), ), })), wibble: valibot.null(), }), arkttype: ark.type({ foo: "string", bar: "number", baz: "boolean", qux: ark.type({ quux: "string.integer", quuz: "number.integer", corge: "boolean", grault: ark.type({ garply: "string", waldo: "string.numeric", fred: "boolean", plugh: "(string | number | boolean)[]", xyzzy: "null", }).array(), thud: "Function", paparapr: ark.type({ "[string | symbol]": "number | string", }), regexp: "RegExp", entries: ark.type(["string", { value: "string", done: "boolean" }]) .array(), }).array(), wibble: "null", }), }; const validData = () => ({ foo: "lorem ipsum dolor sit amet consectetur adipiscing elit", bar: 42, baz: true, qux: [ { quux: "1234", quuz: 42, corge: true, grault: [ { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, ], thud: () => {}, paparapr: { foo: 42, bar: 421, baz: 4132, qux: 42352, quux: 13442, quuz: 42.123, corge: 0.42, grault: 42, garply: 42, waldo: 42, fred: 42, plugh: 42, xyzzy: 42, thud: 42, paparapr: 42, regexp: 42, entries: 42, circ: 42, }, regexp: /foo/, entries: [ ["foo", { value: "bar", done: false }], ["bar", { value: "baz", done: false }], ["baz", { value: "qux", done: false }], ["qux", { value: "quux", done: false }], ["quux", { value: "quuz", done: false }], ], circ: { quux: "012312342346545675686796123123523465", quuz: 42, corge: true, grault: [ { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, ], thud: () => {}, paparapr: { foo: 42, bar: 42, baz: 42, qux: 42, quux: 42, quuz: 42, corge: 42, grault: 42, garply: 42, }, regexp: /foo/, entries: [ ["foo", { value: "bar", done: false }], ["bar", { value: "baz", done: false }], ["baz", { value: "qux", done: false }], ["qux", { value: "quux", done: false }], ["quux", { value: "quuz", done: false }], ], }, }, { quux: "1234", quuz: 42, corge: true, grault: [ { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, ], thud: () => {}, paparapr: { foo: 42, bar: 421, baz: 4132, qux: 42352, quux: 13442, quuz: 42.123, corge: 0.42, grault: 42, garply: 42, waldo: 42, fred: 42, plugh: 42, xyzzy: 42, thud: 42, paparapr: 42, regexp: 42, entries: 42, circ: 42, }, regexp: /foo/, entries: [ ["foo", { value: "bar", done: false }], ["bar", { value: "baz", done: false }], ["baz", { value: "qux", done: false }], ["qux", { value: "quux", done: false }], ["quux", { value: "quuz", done: false }], ], circ: { quux: "01231235234", quuz: 42, corge: true, grault: [ { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, ], thud: () => {}, paparapr: { foo: 42, bar: 42, baz: 42, qux: 42, quux: 42, quuz: 42, corge: 42, grault: 42, garply: 42, }, regexp: /foo/, entries: [ ["foo", { value: "bar", done: false }], ["bar", { value: "baz", done: false }], ["baz", { value: "qux", done: false }], ["qux", { value: "quux", done: false }], ["quux", { value: "quuz", done: false }], ], }, }, { quux: "1234", quuz: 42, corge: true, grault: [ { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, ], thud: () => {}, paparapr: { foo: 42, bar: 421, baz: 4132, qux: 42352, quux: 13442, quuz: 42.123, corge: 0.42, grault: 42, garply: 42, waldo: 42, fred: 42, plugh: 42, xyzzy: 42, thud: 42, paparapr: 42, regexp: 42, entries: 42, circ: 42, }, regexp: /foo/, entries: [ ["foo", { value: "bar", done: false }], ["bar", { value: "baz", done: false }], ["baz", { value: "qux", done: false }], ["qux", { value: "quux", done: false }], ["quux", { value: "quuz", done: false }], ], circ: { quux: "12", quuz: 42, corge: true, grault: [ { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, ], thud: () => {}, paparapr: { foo: 42, bar: 42, baz: 42, qux: 42, quux: 42, quuz: 42, corge: 42, grault: 42, garply: 42, }, regexp: /foo/, entries: [ ["foo", { value: "bar", done: false }], ["bar", { value: "baz", done: false }], ["baz", { value: "qux", done: false }], ["qux", { value: "quux", done: false }], ["quux", { value: "quuz", done: false }], ], }, }, ], wibble: null, }); const invalidData1 = () => ({ foo: "lorem ipsum dolor sit amet consectetur adipiscing elit", bar: 42, baz: true, qux: [ { quux: "1234", quuz: 42, corge: true, grault: [ { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: 42, fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, ], thud: () => {}, paparapr: { foo: 42, bar: 421, baz: 4132, qux: 42352, quux: 13442, quuz: 42.123, corge: 0.42, grault: 42, garply: 42, waldo: 42, fred: 42, plugh: 42, xyzzy: 42, thud: 42, paparapr: 42, regexp: 42, entries: 42, circ: 42, }, regexp: /foo/, entries: [ ["foo", { value: "bar", done: false }], ["bar", { value: "baz", done: false }], ["baz", { value: "qux", done: false }], ["qux", { value: "quux", done: false }], ["quux", { value: "quuz", done: false }], ], circ: { quux: "0", quuz: 42, corge: true, grault: [ { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, ], thud: () => {}, paparapr: { foo: 42, bar: 42, baz: 42, qux: 42, quux: 42, quuz: 42, corge: 42, grault: 42, garply: 42, }, regexp: /foo/, entries: [ ["foo", { value: "bar", done: false }], ["bar", { value: "baz", done: false }], ["baz", { value: "qux", done: false }], ["qux", { value: "quux", done: false }], ["quux", { value: "quuz", done: false }], ], }, }, { quux: "1234", quuz: 42, corge: true, grault: [ { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, ], thud: () => {}, paparapr: { foo: 42, bar: 421, baz: 4132, qux: 42352, quux: 13442, quuz: 42.123, corge: 0.42, grault: 42, garply: 42, waldo: 42, fred: 42, plugh: 42, xyzzy: 42, thud: 42, paparapr: 42, regexp: 42, entries: 42, circ: 42, }, regexp: /foo/, entries: [ ["foo", { value: "bar", done: false }], ["bar", { value: "baz", done: false }], ["baz", { value: "qux", done: false }], ["qux", { value: "quux", done: false }], ["quux", { value: "quuz", done: false }], ], circ: { quux: "1", quuz: 42, corge: true, grault: [ { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, ], thud: () => {}, paparapr: { foo: 42, bar: 42, baz: 42, qux: 42, quux: 42, quuz: 42, corge: 42, grault: 42, garply: 42, }, regexp: /foo/, entries: [ ["foo", { value: "bar", done: false }], ["bar", { value: "baz", done: false }], ["baz", { value: "qux", done: false }], ["qux", { value: "quux", done: false }], ["quux", { value: "quuz", done: false }], ], }, }, { quux: "1234", quuz: 42, corge: true, grault: [ { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, ], thud: () => {}, paparapr: { foo: 42, bar: 421, baz: 4132, qux: 42352, quux: 13442, quuz: 42.123, corge: 0.42, grault: 42, garply: 42, waldo: 42, fred: 42, plugh: 42, xyzzy: 42, thud: 42, paparapr: 42, regexp: 42, entries: 42, circ: 42, }, regexp: /foo/, entries: [ ["foo", { value: "bar", done: false }], ["bar", { value: "baz", done: false }], ["baz", { value: "qux", done: false }], ["qux", { value: "quux", done: false }], ["quux", { value: "quuz", done: false }], ], circ: { quux: "1", quuz: 42, corge: true, grault: [ { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, ], thud: () => {}, paparapr: { foo: 42, bar: 42, baz: 42, qux: 42, quux: 42, quuz: 42, corge: 42, grault: 42, garply: 42, }, regexp: /foo/, entries: [ ["foo", { value: "bar", done: false }], ["bar", { value: "baz", done: false }], ["baz", { value: "qux", done: false }], ["qux", { value: "quux", done: false }], ["quux", { value: "quuz", done: false }], ], }, }, ], wibble: null, }); const invalidData2 = () => ({ foo: "lorem ipsum dolor sit amet consectetur adipiscing elit", bar: 42, baz: true, qux: [ { quux: "1234", quuz: 42, corge: true, grault: [ { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: 42, fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, ], thud: () => {}, paparapr: { foo: 42, bar: 421, baz: 4132, qux: 42352, quux: 13442, quuz: 42.123, corge: 0.42, grault: 42, garply: 42, waldo: 42, fred: 42, plugh: 42, xyzzy: 42, thud: 42, paparapr: 42, regexp: 42, entries: 42, circ: 42, }, regexp: /foo/, entries: [ ["foo", { value: "bar", done: false }], ["bar", { value: "baz", done: false }], ["baz", { value: "qux", done: false }], ["qux", { value: "quux", done: false }], ["quux", { value: "quuz", done: false }], ], circ: { quux: "0", quuz: 42, corge: true, grault: [ { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "sit", false, "amet", 123.123, "consectetur", "adipiscing", "elit", 0.111, ], xyzzy: null, }, ], thud: () => {}, paparapr: { foo: 42, bar: 42, baz: 42, qux: 42, quux: 42, quuz: 42, corge: 42, grault: 42, garply: 42, }, regexp: /foo/, entries: [ ["foo", { value: "bar", done: false }], ["bar", { value: "baz", done: false }], ["baz", { value: "qux", done: false }], ["qux", { value: "quux", done: false }], ["quux", { value: "quuz", done: false }], ], }, }, { quux: "1234", quuz: 42, corge: true, grault: [ { garply: "lorem ipsum dolor sit amet consectetur adipiscing elit", waldo: "42", fred: true, plugh: [ "lorem", "ipsum", 2, "dolor", true, "s