From 45d4b232b7aa14c8dccfb949e38b19542f6da271 Mon Sep 17 00:00:00 2001 From: ZKulbeda Date: Sun, 13 Aug 2023 22:58:58 +0000 Subject: [PATCH 1/5] initial support of vitest bench --- library/package.json | 3 +- ...typescript-runtime-type-benchmark.bench.ts | 82 +++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 library/src/benchmarks/typescript-runtime-type-benchmark.bench.ts diff --git a/library/package.json b/library/package.json index db598ad9c..1050169a8 100644 --- a/library/package.json +++ b/library/package.json @@ -49,7 +49,8 @@ "format": "prettier --write ./src", "format.check": "prettier --check ./src", "build": "tsup", - "publish": "npm publish" + "publish": "npm publish", + "bench": "vitest bench" }, "devDependencies": { "@types/eslint": "^8.40.2", diff --git a/library/src/benchmarks/typescript-runtime-type-benchmark.bench.ts b/library/src/benchmarks/typescript-runtime-type-benchmark.bench.ts new file mode 100644 index 000000000..5ecdb4064 --- /dev/null +++ b/library/src/benchmarks/typescript-runtime-type-benchmark.bench.ts @@ -0,0 +1,82 @@ +import { bench, describe } from 'vitest'; +import { parse } from '../methods/index.js'; +import { boolean, number, object, string } from '../schemas/index.js'; + +describe('sort', () => { + const dataType = object({ + number: number(), + negNumber: number(), + maxNumber: number(), + string: string(), + longString: string(), + boolean: boolean(), + deeplyNested: object({ + foo: string(), + num: number(), + bool: boolean(), + }), + }); + + bench('normal', () => { + parse(dataType, { + number: 1, + negNumber: -1, + maxNumber: Number.MAX_VALUE, + string: 'string', + longString: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Vivendum intellegat et qui, ei denique consequuntur vix. Semper aeterno percipit ut his, sea ex utinam referrentur repudiandae. No epicuri hendrerit consetetur sit, sit dicta adipiscing ex, in facete detracto deterruisset duo. Quot populo ad qui. Sit fugit nostrum et. Ad per diam dicant interesset, lorem iusto sensibus ut sed. No dicam aperiam vis. Pri posse graeco definitiones cu, id eam populo quaestio adipiscing, usu quod malorum te. Ex nam agam veri, dicunt efficiantur ad qui, ad legere adversarium sit. Commune platonem mel id, brute adipiscing duo an. Vivendum intellegat et qui, ei denique consequuntur vix. Offendit eleifend moderatius ex vix, quem odio mazim et qui, purto expetendis cotidieque quo cu, veri persius vituperata ei nec. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.', + boolean: true, + deeplyNested: { + foo: 'bar', + num: 1, + bool: false, + }, + }); + }); + + bench('abortEarly', () => { + parse( + dataType, + { + number: 1, + negNumber: -1, + maxNumber: Number.MAX_VALUE, + string: 'string', + longString: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Vivendum intellegat et qui, ei denique consequuntur vix. Semper aeterno percipit ut his, sea ex utinam referrentur repudiandae. No epicuri hendrerit consetetur sit, sit dicta adipiscing ex, in facete detracto deterruisset duo. Quot populo ad qui. Sit fugit nostrum et. Ad per diam dicant interesset, lorem iusto sensibus ut sed. No dicam aperiam vis. Pri posse graeco definitiones cu, id eam populo quaestio adipiscing, usu quod malorum te. Ex nam agam veri, dicunt efficiantur ad qui, ad legere adversarium sit. Commune platonem mel id, brute adipiscing duo an. Vivendum intellegat et qui, ei denique consequuntur vix. Offendit eleifend moderatius ex vix, quem odio mazim et qui, purto expetendis cotidieque quo cu, veri persius vituperata ei nec. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.', + boolean: true, + deeplyNested: { + foo: 'bar', + num: 1, + bool: false, + }, + }, + { + abortEarly: true, + } + ); + }); + + describe('abortPipeEarly', () => { + parse( + dataType, + { + number: 1, + negNumber: -1, + maxNumber: Number.MAX_VALUE, + string: 'string', + longString: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Vivendum intellegat et qui, ei denique consequuntur vix. Semper aeterno percipit ut his, sea ex utinam referrentur repudiandae. No epicuri hendrerit consetetur sit, sit dicta adipiscing ex, in facete detracto deterruisset duo. Quot populo ad qui. Sit fugit nostrum et. Ad per diam dicant interesset, lorem iusto sensibus ut sed. No dicam aperiam vis. Pri posse graeco definitiones cu, id eam populo quaestio adipiscing, usu quod malorum te. Ex nam agam veri, dicunt efficiantur ad qui, ad legere adversarium sit. Commune platonem mel id, brute adipiscing duo an. Vivendum intellegat et qui, ei denique consequuntur vix. Offendit eleifend moderatius ex vix, quem odio mazim et qui, purto expetendis cotidieque quo cu, veri persius vituperata ei nec. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.', + boolean: true, + deeplyNested: { + foo: 'bar', + num: 1, + bool: false, + }, + }, + { + abortPipeEarly: true, + } + ); + }); +}); From 30d02bd3baa522427c84b0a9d518d96f7812930e Mon Sep 17 00:00:00 2001 From: ZKulbeda Date: Sun, 13 Aug 2023 23:08:33 +0000 Subject: [PATCH 2/5] fix describe to bench --- .../src/benchmarks/typescript-runtime-type-benchmark.bench.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/benchmarks/typescript-runtime-type-benchmark.bench.ts b/library/src/benchmarks/typescript-runtime-type-benchmark.bench.ts index 5ecdb4064..729b97ea6 100644 --- a/library/src/benchmarks/typescript-runtime-type-benchmark.bench.ts +++ b/library/src/benchmarks/typescript-runtime-type-benchmark.bench.ts @@ -57,7 +57,7 @@ describe('sort', () => { ); }); - describe('abortPipeEarly', () => { + bench('abortPipeEarly', () => { parse( dataType, { From b99b19167ea43b9f7df9bbdb5e2e193885d8eda3 Mon Sep 17 00:00:00 2001 From: ZKulbeda Date: Mon, 21 Aug 2023 10:10:14 +0000 Subject: [PATCH 3/5] add valibot dev dependency --- .npmrc | 1 + library/package.json | 3 ++- pnpm-lock.yaml | 9 +++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 .npmrc diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..4c679147a --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +link-workspace-packages=false \ No newline at end of file diff --git a/library/package.json b/library/package.json index 1050169a8..6ad348b7c 100644 --- a/library/package.json +++ b/library/package.json @@ -62,6 +62,7 @@ "tsup": "^7.1.0", "typescript": "^5.1.3", "vite": "^4.4.6", - "vitest": "^0.33.0" + "vitest": "^0.33.0", + "valibot": "^0.12.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 52ae9f88b..bbaa1dc5f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,6 +44,9 @@ importers: typescript: specifier: ^5.1.3 version: 5.1.3 + valibot: + specifier: ^0.12.0 + version: 0.12.0 vite: specifier: ^4.4.6 version: 4.4.6(@types/node@20.4.2) @@ -5520,6 +5523,7 @@ packages: /file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + requiresBuild: true dev: true /filename-reserved-regex@2.0.0: @@ -8607,6 +8611,7 @@ packages: /nan@2.17.0: resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} + requiresBuild: true dev: true optional: true @@ -12203,6 +12208,10 @@ packages: convert-source-map: 1.9.0 dev: true + /valibot@0.12.0: + resolution: {integrity: sha512-EGx/uDUpRa9wB9NkD7fsktc02rvXWlJzDTC/ihbE+NybhzAsMhns2OOdNv2R4BtdGnDvaCEGi/DbgR5RvgCS8A==} + dev: true + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: From 6ec3fb0da8e00df66b64b70debb5f91a5484ef3f Mon Sep 17 00:00:00 2001 From: ZKulbeda Date: Mon, 21 Aug 2023 10:10:39 +0000 Subject: [PATCH 4/5] change tests to compare with latest npm package --- ...typescript-runtime-type-benchmark.bench.ts | 165 ++++++++++++++++-- 1 file changed, 149 insertions(+), 16 deletions(-) diff --git a/library/src/benchmarks/typescript-runtime-type-benchmark.bench.ts b/library/src/benchmarks/typescript-runtime-type-benchmark.bench.ts index 729b97ea6..03967441f 100644 --- a/library/src/benchmarks/typescript-runtime-type-benchmark.bench.ts +++ b/library/src/benchmarks/typescript-runtime-type-benchmark.bench.ts @@ -1,23 +1,54 @@ +import * as v from 'valibot'; import { bench, describe } from 'vitest'; import { parse } from '../methods/index.js'; import { boolean, number, object, string } from '../schemas/index.js'; -describe('sort', () => { - const dataType = object({ - number: number(), - negNumber: number(), - maxNumber: number(), - string: string(), - longString: string(), - boolean: boolean(), - deeplyNested: object({ - foo: string(), - num: number(), - bool: boolean(), - }), +describe('just parse', () => { + bench('valibot', () => { + const dataType = v.object({ + number: v.number(), + negNumber: v.number(), + maxNumber: v.number(), + string: v.string(), + longString: v.string(), + boolean: v.boolean(), + deeplyNested: v.object({ + foo: v.string(), + num: v.number(), + bool: v.boolean(), + }), + }); + + v.parse(dataType, { + number: 1, + negNumber: -1, + maxNumber: Number.MAX_VALUE, + string: 'string', + longString: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Vivendum intellegat et qui, ei denique consequuntur vix. Semper aeterno percipit ut his, sea ex utinam referrentur repudiandae. No epicuri hendrerit consetetur sit, sit dicta adipiscing ex, in facete detracto deterruisset duo. Quot populo ad qui. Sit fugit nostrum et. Ad per diam dicant interesset, lorem iusto sensibus ut sed. No dicam aperiam vis. Pri posse graeco definitiones cu, id eam populo quaestio adipiscing, usu quod malorum te. Ex nam agam veri, dicunt efficiantur ad qui, ad legere adversarium sit. Commune platonem mel id, brute adipiscing duo an. Vivendum intellegat et qui, ei denique consequuntur vix. Offendit eleifend moderatius ex vix, quem odio mazim et qui, purto expetendis cotidieque quo cu, veri persius vituperata ei nec. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.', + boolean: true, + deeplyNested: { + foo: 'bar', + num: 1, + bool: false, + }, + }); }); - bench('normal', () => { + bench('current', () => { + const dataType = object({ + number: number(), + negNumber: number(), + maxNumber: number(), + string: string(), + longString: string(), + boolean: boolean(), + deeplyNested: object({ + foo: string(), + num: number(), + bool: boolean(), + }), + }); parse(dataType, { number: 1, negNumber: -1, @@ -33,8 +64,59 @@ describe('sort', () => { }, }); }); +}); + +describe('parse with abortEarly', () => { + bench('valibot', () => { + const dataType = v.object({ + number: v.number(), + negNumber: v.number(), + maxNumber: v.number(), + string: v.string(), + longString: v.string(), + boolean: v.boolean(), + deeplyNested: v.object({ + foo: v.string(), + num: v.number(), + bool: v.boolean(), + }), + }); - bench('abortEarly', () => { + v.parse( + dataType, + { + number: 1, + negNumber: -1, + maxNumber: Number.MAX_VALUE, + string: 'string', + longString: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Vivendum intellegat et qui, ei denique consequuntur vix. Semper aeterno percipit ut his, sea ex utinam referrentur repudiandae. No epicuri hendrerit consetetur sit, sit dicta adipiscing ex, in facete detracto deterruisset duo. Quot populo ad qui. Sit fugit nostrum et. Ad per diam dicant interesset, lorem iusto sensibus ut sed. No dicam aperiam vis. Pri posse graeco definitiones cu, id eam populo quaestio adipiscing, usu quod malorum te. Ex nam agam veri, dicunt efficiantur ad qui, ad legere adversarium sit. Commune platonem mel id, brute adipiscing duo an. Vivendum intellegat et qui, ei denique consequuntur vix. Offendit eleifend moderatius ex vix, quem odio mazim et qui, purto expetendis cotidieque quo cu, veri persius vituperata ei nec. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.', + boolean: true, + deeplyNested: { + foo: 'bar', + num: 1, + bool: false, + }, + }, + { + abortEarly: true, + } + ); + }); + bench('current', () => { + const dataType = object({ + number: number(), + negNumber: number(), + maxNumber: number(), + string: string(), + longString: string(), + boolean: boolean(), + deeplyNested: object({ + foo: string(), + num: number(), + bool: boolean(), + }), + }); parse( dataType, { @@ -56,8 +138,59 @@ describe('sort', () => { } ); }); +}); + +describe('parse with abortPipeEarly', () => { + bench('valibot', () => { + const dataType = v.object({ + number: v.number(), + negNumber: v.number(), + maxNumber: v.number(), + string: v.string(), + longString: v.string(), + boolean: v.boolean(), + deeplyNested: v.object({ + foo: v.string(), + num: v.number(), + bool: v.boolean(), + }), + }); - bench('abortPipeEarly', () => { + v.parse( + dataType, + { + number: 1, + negNumber: -1, + maxNumber: Number.MAX_VALUE, + string: 'string', + longString: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Vivendum intellegat et qui, ei denique consequuntur vix. Semper aeterno percipit ut his, sea ex utinam referrentur repudiandae. No epicuri hendrerit consetetur sit, sit dicta adipiscing ex, in facete detracto deterruisset duo. Quot populo ad qui. Sit fugit nostrum et. Ad per diam dicant interesset, lorem iusto sensibus ut sed. No dicam aperiam vis. Pri posse graeco definitiones cu, id eam populo quaestio adipiscing, usu quod malorum te. Ex nam agam veri, dicunt efficiantur ad qui, ad legere adversarium sit. Commune platonem mel id, brute adipiscing duo an. Vivendum intellegat et qui, ei denique consequuntur vix. Offendit eleifend moderatius ex vix, quem odio mazim et qui, purto expetendis cotidieque quo cu, veri persius vituperata ei nec. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.', + boolean: true, + deeplyNested: { + foo: 'bar', + num: 1, + bool: false, + }, + }, + { + abortPipeEarly: true, + } + ); + }); + bench('current', () => { + const dataType = object({ + number: number(), + negNumber: number(), + maxNumber: number(), + string: string(), + longString: string(), + boolean: boolean(), + deeplyNested: object({ + foo: string(), + num: number(), + bool: boolean(), + }), + }); parse( dataType, { From 8baa0c0b0d1481a194e0a4b64d22d658396704f9 Mon Sep 17 00:00:00 2001 From: ZKulbeda Date: Mon, 21 Aug 2023 10:13:03 +0000 Subject: [PATCH 5/5] add trailing enter at the end of .npmrc --- .npmrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.npmrc b/.npmrc index 4c679147a..00e0914e4 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1 @@ -link-workspace-packages=false \ No newline at end of file +link-workspace-packages=false