Skip to content

Commit

Permalink
Merge pull request #246 from samchon/v3.3
Browse files Browse the repository at this point in the history
Close #243 and Fix #244 - enhance json schema
  • Loading branch information
samchon authored Oct 18, 2022
2 parents bc22959 + 070b58d commit ac7e4d9
Show file tree
Hide file tree
Showing 151 changed files with 10,785 additions and 1,256 deletions.
24 changes: 24 additions & 0 deletions benchmark/features/benchmark_is.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import Ajv from "ajv";
import * as tr from "class-transformer";
import * as cv from "class-validator";
import "reflect-metadata";

import TSON from "../../src";
// PURE TYPESCRIPT TYPES
Expand All @@ -12,6 +15,10 @@ import { ObjectUnionImplicit } from "../../test/structures/ObjectUnionImplicit";
import { UltimateUnion } from "../../test/structures/UltimateUnion";
// BENCHMARK PROGRAM
import { IsBenchmarker } from "../internal/IsBenchmarker";
// CLASS-VALIDATOR
import { CvArrayRecursive } from "../structures/class-validator/CvArrayRecursive";
import { CvObjectHierarchical } from "../structures/class-validator/CvObjectHierarchical";
import { CvObjectRecursive } from "../structures/class-validator/CvObjectRecursive";
// IO-TS TYPES
import { IoTsArrayRecursive } from "../structures/io-ts/IoTsArrayRecursive";
import { IoTsArrayRecursiveUnionExplicit } from "../structures/io-ts/IoTsArrayRecursiveUnionExplicit";
Expand Down Expand Up @@ -77,6 +84,10 @@ const is = () => [
"io-ts": wrap(ObjectHierarchical.generate(), (input) =>
IoTsObjectHierarchical.is(input),
),
"class-validator": (input) => {
const cla = tr.plainToInstance(CvObjectHierarchical, input);
return cv.validateSync(cla).length === 0;
},
zod: wrap(
ObjectHierarchical.generate(),
(input) => ZodObjectHierarchical.safeParse(input).success,
Expand All @@ -95,6 +106,10 @@ const is = () => [
"io-ts": wrap(ObjectRecursive.generate(), (input) =>
IoTsObjectRecursive.is(input),
),
"class-validator": (input) => {
const cla = tr.plainToInstance(CvObjectRecursive, input);
return cv.validateSync(cla).length === 0;
},
zod: wrap(
ObjectRecursive.generate(),
(input) => ZodObjectRecursive.safeParse(input).success,
Expand All @@ -113,6 +128,7 @@ const is = () => [
"io-ts": wrap(ObjectUnionExplicit.generate(), (input) =>
IoTsObjectUnionExplicit.is(input),
),
"class-validator": null,
zod: wrap(
ObjectUnionExplicit.generate(),
(input) => ZodObjectUnionExplicit.safeParse(input).success,
Expand All @@ -131,6 +147,7 @@ const is = () => [
"io-ts": wrap(ObjectUnionImplicit.generate(), (input) =>
IoTsObjectUnionImplicit.is(input),
),
"class-validator": null,
zod: wrap(
ObjectUnionImplicit.generate(),
(input) => ZodObjectUnionImplicit.safeParse(input).success,
Expand All @@ -149,6 +166,10 @@ const is = () => [
"io-ts": wrap(ArrayRecursive.generate(), (input) =>
IoTsArrayRecursive.is(input),
),
"class-validator": (input) => {
const cla = tr.plainToInstance(CvArrayRecursive, input);
return cv.validateSync(cla).length === 0;
},
zod: wrap(
ArrayRecursive.generate(),
(input) => ZodArrayRecursive.safeParse(input).success,
Expand All @@ -167,6 +188,7 @@ const is = () => [
"io-ts": wrap(ArrayRecursiveUnionExplicit.generate(), (input) =>
IoTsArrayRecursiveUnionExplicit.is(input),
),
"class-validator": null,
zod: wrap(
ArrayRecursiveUnionExplicit.generate(),
(input) =>
Expand All @@ -186,6 +208,7 @@ const is = () => [
"io-ts": wrap(ArrayRecursiveUnionImplicit.generate(), (input) =>
IoTsArrayRecursiveUnionImplicit.is(input),
),
"class-validator": null,
zod: wrap(
ArrayRecursiveUnionImplicit.generate(),
(input) =>
Expand All @@ -202,6 +225,7 @@ const is = () => [
"io-ts": wrap(UltimateUnion.generate(), (input) =>
IoTsUltimateUnion.is(input),
),
"class-validator": null,
zod: wrap(
UltimateUnion.generate(),
(input) => ZodUltimateUnion.safeParse(input).success,
Expand Down
27 changes: 25 additions & 2 deletions benchmark/features/benchmark_validate.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import * as tr from "class-transformer";
import * as cv from "class-validator";
import "reflect-metadata";

import TSON from "../../src";
// PURE TYPESCRIPT TYPES
import { ArrayRecursive } from "../../test/structures/ArrayRecursive";
Expand All @@ -10,6 +14,10 @@ import { ObjectUnionImplicit } from "../../test/structures/ObjectUnionImplicit";
import { UltimateUnion } from "../../test/structures/UltimateUnion";
// BENCHMARK PROGRAM
import { ValidateBenchmarker } from "../internal/ValidateBenchmarker";
// CLASS-VALIDATOR
import { CvArrayRecursive } from "../structures/class-validator/CvArrayRecursive";
import { CvObjectHierarchical } from "../structures/class-validator/CvObjectHierarchical";
import { CvObjectRecursive } from "../structures/class-validator/CvObjectRecursive";
// IO-TS TYPES
import { IoTsArrayRecursive } from "../structures/io-ts/IoTsArrayRecursive";
import { IoTsArrayRecursiveUnionExplicit } from "../structures/io-ts/IoTsArrayRecursiveUnionExplicit";
Expand All @@ -18,7 +26,6 @@ import { IoTsObjectHierarchical } from "../structures/io-ts/IoTsObjectHierarchic
import { IoTsObjectRecursive } from "../structures/io-ts/IoTsObjectRecursive";
import { IoTsObjectUnionExplicit } from "../structures/io-ts/IoTsObjectUnionExplicit";
import { IoTsObjectUnionImplicit } from "../structures/io-ts/IoTsObjectUnionImplicit";
import { IoTsUltimateUnion } from "../structures/io-ts/IoTsUltimateUnion";
// ZOD TYPES
import { ZodArrayRecursive } from "../structures/zod/ZodArrayRecursive";
import { ZodArrayRecursiveUnionExplicit } from "../structures/zod/ZodArrayRecursiveUnionExplicit";
Expand All @@ -27,7 +34,6 @@ import { ZodObjectHierarchical } from "../structures/zod/ZodObjectHierarchical";
import { ZodObjectRecursive } from "../structures/zod/ZodObjectRecursive";
import { ZodObjectUnionExplicit } from "../structures/zod/ZodObjectUnionExplicit";
import { ZodObjectUnionImplicit } from "../structures/zod/ZodObjectUnionImplicit";
import { ZodUltimateUnion } from "../structures/zod/ZodUltimateUnion";

const valiadate = () => [
ValidateBenchmarker.prepare(
Expand All @@ -36,6 +42,10 @@ const valiadate = () => [
{
"typescript-json": (input) => TSON.validate(input),
"io-ts": (input) => IoTsObjectHierarchical.decode(input),
"class-validator": (input) => {
const cla = tr.plainToInstance(CvObjectHierarchical, input);
return cv.validateSync(cla);
},
zod: (input) => ZodObjectHierarchical.safeParse(input),
},
),
Expand All @@ -45,6 +55,10 @@ const valiadate = () => [
{
"typescript-json": (input) => TSON.validate(input),
"io-ts": (input) => IoTsObjectRecursive.decode(input),
"class-validator": (input) => {
const cla = tr.plainToInstance(CvObjectRecursive, input);
return cv.validateSync(cla);
},
zod: (input) => ZodObjectRecursive.safeParse(input),
},
),
Expand All @@ -54,6 +68,7 @@ const valiadate = () => [
{
"typescript-json": (input) => TSON.validate(input),
"io-ts": (input) => IoTsObjectUnionExplicit.decode(input),
"class-validator": null,
zod: (input) => ZodObjectUnionExplicit.safeParse(input),
},
),
Expand All @@ -63,6 +78,7 @@ const valiadate = () => [
{
"typescript-json": (input) => TSON.validate(input),
"io-ts": (input) => IoTsObjectUnionImplicit.decode(input),
"class-validator": null,
zod: (input) => ZodObjectUnionImplicit.safeParse(input),
},
),
Expand All @@ -72,6 +88,10 @@ const valiadate = () => [
{
"typescript-json": (input) => TSON.validate(input),
"io-ts": (input) => IoTsArrayRecursive.decode(input),
"class-validator": (input) => {
const cla = tr.plainToInstance(CvArrayRecursive, input);
return cv.validateSync(cla);
},
zod: (input) => ZodArrayRecursive.safeParse(input),
},
),
Expand All @@ -81,6 +101,7 @@ const valiadate = () => [
{
"typescript-json": (input) => TSON.validate(input),
"io-ts": (input) => IoTsArrayRecursiveUnionExplicit.decode(input),
"class-validator": null,
zod: (input) => ZodArrayRecursiveUnionExplicit.safeParse(input),
},
),
Expand All @@ -90,6 +111,7 @@ const valiadate = () => [
{
"typescript-json": (input) => TSON.validate(input),
"io-ts": (input) => IoTsArrayRecursiveUnionImplicit.decode(input),
"class-validator": null,
zod: (input) => ZodArrayRecursiveUnionImplicit.safeParse(input),
},
),
Expand All @@ -99,6 +121,7 @@ const valiadate = () => [
{
"typescript-json": (input) => TSON.validate(input),
"io-ts": null,
"class-validator": null,
zod: null,
},
),
Expand Down
4 changes: 2 additions & 2 deletions benchmark/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,15 +81,15 @@ async function measure<T extends Output>(
}

async function main(): Promise<void> {
const cpu: string = os.cpus()[0].model;
const cpu: string = os.cpus()[0].model.trim();
const memory: number = os.totalmem();

console.log(`Benchmark ${cpu}`);

const stream = new WriteStream(`${__dirname}/results/${cpu}.md`);
const functors = [
benchmark_validate,
benchmark_is,
benchmark_validate,
benchmark_optimizer,
benchmark_stringify,
];
Expand Down
7 changes: 7 additions & 0 deletions benchmark/internal/IsBenchmarker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@ export namespace IsBenchmarker {
"typescript-json": number;
"io-ts": number | null;
zod: number | null;
"class-validator": number | null;
ajv: number | null;
}
export interface IParameters<T> {
"typescript-json": (input: T) => any;
"io-ts": null | ((input: T) => any);
"class-validator": null | ((input: T) => any);
zod: null | ((input: T) => any);
ajv: null | ((input: T) => any);
}
Expand All @@ -29,13 +31,18 @@ export namespace IsBenchmarker {
suite.add("io-ts", () => parameters["io-ts"]!(data));
if (parameters.zod !== null)
suite.add("zod", () => parameters.zod!(data));
if (parameters["class-validator"] !== null)
suite.add("class-validator", () =>
parameters["class-validator"]!(data),
);
suite.add("typescript-json", () => parameters["typescript-json"](data));

return () => {
const output: IOutput = {
name,
"typescript-json": 0,
"io-ts": null,
"class-validator": null,
zod: null,
ajv: null,
};
Expand Down
7 changes: 7 additions & 0 deletions benchmark/internal/ValidateBenchmarker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@ export namespace ValidateBenchmarker {
name: string;
"typescript-json": number;
"io-ts": number | null;
"class-validator": number | null;
zod: number | null;
}
export interface IParameters<T> {
"typescript-json": (input: T) => any;
"io-ts": null | ((input: T) => any);
"class-validator": null | ((input: T) => any);
zod: null | ((input: T) => any);
}

Expand All @@ -25,12 +27,17 @@ export namespace ValidateBenchmarker {
suite.add("io-ts", () => parameters["io-ts"]!(data));
if (parameters["zod"] !== null)
suite.add("zod", () => parameters["zod"]!(data));
if (parameters["class-validator"] !== null)
suite.add("class-validator", () =>
parameters["class-validator"]!(data),
);
suite.add("typescript-json", () => parameters["typescript-json"](data));

return () => {
const output: IOutput = {
name,
"typescript-json": 0,
"class-validator": null,
"io-ts": null,
zod: null,
};
Expand Down
Loading

0 comments on commit ac7e4d9

Please sign in to comment.