diff --git a/cases/marshal.ts b/cases/marshal.ts index aa2ee36e4..cd06292d3 100644 --- a/cases/marshal.ts +++ b/cases/marshal.ts @@ -1,7 +1,7 @@ import 'reflect-metadata'; import { f, - validatedPlainToClass + jitValidate } from '@marcj/marshal'; import { Data } from '../data'; import { Case } from './abstract'; @@ -43,10 +43,18 @@ class DataType implements Data { deeplyNested!: DeeplyNestedType; } +const validator = jitValidate(DataType); + export class MarshalCase extends Case implements Case { name = 'marshal'; validate() { - return validatedPlainToClass(DataType, this.data); + const errors = validator(this.data); + + if (errors.length === 0) { + return this.data; + } + + throw new Error('Invalid'); } } diff --git a/results/bar-graph-10.x.svg b/results/bar-graph-10.x.svg index 02ca71857..f9b6b122d 100644 --- a/results/bar-graph-10.x.svg +++ b/results/bar-graph-10.x.svg @@ -1,132 +1,126 @@ - - + + - + - + - + - + - + - + class-transformer-valid… - + class-transformer-valid… - + funval - + io-ts - + json-decoder - + marshal - + myzod - + purify-ts - + runtypes - + toi - + ts-json-validator - + ts-utils - + zod - - + + module - + - + - + 0 - + 2,000,000 - + 4,000,000 - + 6,000,000 - + 8,000,000 - + 10,000,000 - + 12,000,000 - + 14,000,000 - + 16,000,000 - + 18,000,000 - + 20,000,000 - + 22,000,000 - + 24,000,000 - + 26,000,000 - + 28,000,000 - + 30,000,000 - - 32,000,000 - - - 34,000,000 - - - + + operations / sec - + diff --git a/results/bar-graph-12.x.svg b/results/bar-graph-12.x.svg index 1d6e44da5..96d7ad2b5 100644 --- a/results/bar-graph-12.x.svg +++ b/results/bar-graph-12.x.svg @@ -126,7 +126,7 @@ - + diff --git a/results/benchmarks-10.x.csv b/results/benchmarks-10.x.csv index b1c188272..385ef6a3d 100644 --- a/results/benchmarks-10.x.csv +++ b/results/benchmarks-10.x.csv @@ -1,14 +1,14 @@ name,ops -class-transformer-validator-async,33391 -class-transformer-validator-sync,41807 -funval,759838 -io-ts,2140619 -json-decoder,640443 -marshal,3644059 -myzod,208622 -purify-ts,659513 -runtypes,667801 -toi,406045 -ts-json-validator,30320984 -ts-utils,135462 -zod,67298 +class-transformer-validator-async,29741 +class-transformer-validator-sync,35315 +funval,646985 +io-ts,1967082 +json-decoder,661895 +marshal,19848101 +myzod,204666 +purify-ts,687608 +runtypes,677697 +toi,406541 +ts-json-validator,28826031 +ts-utils,122970 +zod,58749 diff --git a/results/benchmarks-10.x.json b/results/benchmarks-10.x.json index 71e7f349a..1384ccc1e 100644 --- a/results/benchmarks-10.x.json +++ b/results/benchmarks-10.x.json @@ -1,85 +1,85 @@ { "name": "typescript-runtime-type-benchmarks", - "date": "2020-03-31T15:58:10.043Z", + "date": "2020-03-31T17:41:47.723Z", "version": "1.0.0", "results": [ { "name": "class-transformer-validator-async", - "ops": 33391, - "margin": 1.96, - "percentSlower": 99.89 + "ops": 29741, + "margin": 1.07, + "percentSlower": 99.9 }, { "name": "class-transformer-validator-sync", - "ops": 41807, - "margin": 1.35, - "percentSlower": 99.86 + "ops": 35315, + "margin": 1.82, + "percentSlower": 99.88 }, { "name": "funval", - "ops": 759838, - "margin": 1.03, - "percentSlower": 97.49 + "ops": 646985, + "margin": 1.46, + "percentSlower": 97.76 }, { "name": "io-ts", - "ops": 2140619, - "margin": 1.07, - "percentSlower": 92.94 + "ops": 1967082, + "margin": 1.2, + "percentSlower": 93.18 }, { "name": "json-decoder", - "ops": 640443, - "margin": 3.74, - "percentSlower": 97.89 + "ops": 661895, + "margin": 3.37, + "percentSlower": 97.7 }, { "name": "marshal", - "ops": 3644059, - "margin": 0.9, - "percentSlower": 87.98 + "ops": 19848101, + "margin": 1.1, + "percentSlower": 31.15 }, { "name": "myzod", - "ops": 208622, - "margin": 2.56, - "percentSlower": 99.31 + "ops": 204666, + "margin": 1.41, + "percentSlower": 99.29 }, { "name": "purify-ts", - "ops": 659513, - "margin": 1.01, - "percentSlower": 97.82 + "ops": 687608, + "margin": 5.32, + "percentSlower": 97.61 }, { "name": "runtypes", - "ops": 667801, - "margin": 0.55, - "percentSlower": 97.8 + "ops": 677697, + "margin": 1.05, + "percentSlower": 97.65 }, { "name": "toi", - "ops": 406045, - "margin": 2.98, - "percentSlower": 98.66 + "ops": 406541, + "margin": 0.72, + "percentSlower": 98.59 }, { "name": "ts-json-validator", - "ops": 30320984, - "margin": 1.03, + "ops": 28826031, + "margin": 0.76, "percentSlower": 0 }, { "name": "ts-utils", - "ops": 135462, - "margin": 9.13, - "percentSlower": 99.55 + "ops": 122970, + "margin": 3.24, + "percentSlower": 99.57 }, { "name": "zod", - "ops": 67298, - "margin": 2.82, - "percentSlower": 99.78 + "ops": 58749, + "margin": 1.5, + "percentSlower": 99.8 } ], "fastest": { diff --git a/results/benchmarks-12.x.csv b/results/benchmarks-12.x.csv index 387ad44c4..7976cc2e3 100644 --- a/results/benchmarks-12.x.csv +++ b/results/benchmarks-12.x.csv @@ -1,14 +1,14 @@ name,ops -class-transformer-validator-async,31179 -class-transformer-validator-sync,41350 -funval,773821 -io-ts,2715768 -json-decoder,678675 -marshal,3850958 -myzod,529370 -purify-ts,691559 -runtypes,491434 -toi,404215 -ts-json-validator,34036641 -ts-utils,115788 -zod,51952 +class-transformer-validator-async,29168 +class-transformer-validator-sync,39687 +funval,754198 +io-ts,2615888 +json-decoder,668138 +marshal,19080848 +myzod,503374 +purify-ts,686688 +runtypes,683354 +toi,409293 +ts-json-validator,34326708 +ts-utils,101928 +zod,52002 diff --git a/results/benchmarks-12.x.json b/results/benchmarks-12.x.json index 5ee08e42e..d35687afd 100644 --- a/results/benchmarks-12.x.json +++ b/results/benchmarks-12.x.json @@ -1,84 +1,84 @@ { "name": "typescript-runtime-type-benchmarks", - "date": "2020-03-31T16:00:35.496Z", + "date": "2020-03-31T17:44:17.027Z", "version": "1.0.0", "results": [ { "name": "class-transformer-validator-async", - "ops": 31179, - "margin": 16.02, - "percentSlower": 99.91 + "ops": 29168, + "margin": 17.89, + "percentSlower": 99.92 }, { "name": "class-transformer-validator-sync", - "ops": 41350, - "margin": 1.05, + "ops": 39687, + "margin": 1.3, "percentSlower": 99.88 }, { "name": "funval", - "ops": 773821, - "margin": 1.26, - "percentSlower": 97.73 + "ops": 754198, + "margin": 0.98, + "percentSlower": 97.8 }, { "name": "io-ts", - "ops": 2715768, - "margin": 0.6, - "percentSlower": 92.02 + "ops": 2615888, + "margin": 2.59, + "percentSlower": 92.38 }, { "name": "json-decoder", - "ops": 678675, - "margin": 0.71, - "percentSlower": 98.01 + "ops": 668138, + "margin": 0.98, + "percentSlower": 98.05 }, { "name": "marshal", - "ops": 3850958, - "margin": 0.9, - "percentSlower": 88.69 + "ops": 19080848, + "margin": 0.91, + "percentSlower": 44.41 }, { "name": "myzod", - "ops": 529370, - "margin": 3.54, - "percentSlower": 98.44 + "ops": 503374, + "margin": 3.18, + "percentSlower": 98.53 }, { "name": "purify-ts", - "ops": 691559, - "margin": 0.86, - "percentSlower": 97.97 + "ops": 686688, + "margin": 0.97, + "percentSlower": 98 }, { "name": "runtypes", - "ops": 491434, - "margin": 0.82, - "percentSlower": 98.56 + "ops": 683354, + "margin": 0.64, + "percentSlower": 98.01 }, { "name": "toi", - "ops": 404215, - "margin": 3.75, + "ops": 409293, + "margin": 0.87, "percentSlower": 98.81 }, { "name": "ts-json-validator", - "ops": 34036641, - "margin": 0.57, + "ops": 34326708, + "margin": 0.58, "percentSlower": 0 }, { "name": "ts-utils", - "ops": 115788, - "margin": 1.22, - "percentSlower": 99.66 + "ops": 101928, + "margin": 22.46, + "percentSlower": 99.7 }, { "name": "zod", - "ops": 51952, - "margin": 1.89, + "ops": 52002, + "margin": 2.52, "percentSlower": 99.85 } ], diff --git a/test/__snapshots__/abstract.test.ts.snap b/test/__snapshots__/abstract.test.ts.snap index 5439e212b..0a628a3ac 100644 --- a/test/__snapshots__/abstract.test.ts.snap +++ b/test/__snapshots__/abstract.test.ts.snap @@ -202,41 +202,11 @@ exports[`Case Class: json-decoder should fail validation when prop is missing 1` exports[`Case Class: json-decoder should fail validation when type is wrong 1`] = `[Error: boolean: expected boolean, got string]`; -exports[`Case Class: marshal should fail validation when deeply nested type is wrong 1`] = ` -ValidationFailed { - "errors": Array [ - ValidationError { - "code": "invalid_boolean", - "message": "No Boolean given", - "path": "deeplyNested.bool", - }, - ], -} -`; +exports[`Case Class: marshal should fail validation when deeply nested type is wrong 1`] = `[Error: Invalid]`; -exports[`Case Class: marshal should fail validation when prop is missing 1`] = ` -ValidationFailed { - "errors": Array [ - ValidationError { - "code": "required", - "message": "Required value is undefined or null", - "path": "boolean", - }, - ], -} -`; +exports[`Case Class: marshal should fail validation when prop is missing 1`] = `[Error: Invalid]`; -exports[`Case Class: marshal should fail validation when type is wrong 1`] = ` -ValidationFailed { - "errors": Array [ - ValidationError { - "code": "invalid_boolean", - "message": "No Boolean given", - "path": "boolean", - }, - ], -} -`; +exports[`Case Class: marshal should fail validation when type is wrong 1`] = `[Error: Invalid]`; exports[`Case Class: myzod should fail validation when deeply nested type is wrong 1`] = `[MyZodError: error parsing object at path: "deeplyNested.bool" - expected type to be boolean but got string]`;