From 8f42e85f9ae2465d538db11d6b9004cc5d00d81e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Wi=C4=99cek?= Date: Tue, 4 Mar 2025 12:25:40 +0100 Subject: [PATCH] feat: integrate Joi tests --- README.md | 1 + cases/index.ts | 1 + cases/joi.ts | 67 +++++++++++++++++++++++++ download-packages-popularity.ts | 4 ++ package-lock.json | 87 +++++++++++++++++++++++++++++++++ package.json | 1 + test/benchmarks.test.ts | 1 + 7 files changed, 162 insertions(+) create mode 100644 cases/joi.ts diff --git a/README.md b/README.md index b5c8af7f2..c75b0105c 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ * [@effect/schema](https://github.com/Effect-TS/effect/blob/main/packages/schema/README.md) * [io-ts](https://github.com/gcanti/io-ts) * [jet-schema](https://github.com/seanpmaxwell/jet-schema) +* [joi] (https://github.com/hapijs/joi) * [jointz](https://github.com/moodysalem/jointz) * [json-decoder](https://github.com/venil7/json-decoder) * [@mojotech/json-type-validaton](https://github.com/mojotech/json-type-validation) diff --git a/cases/index.ts b/cases/index.ts index 19eedaba3..40d8635e9 100644 --- a/cases/index.ts +++ b/cases/index.ts @@ -10,6 +10,7 @@ export const cases = [ 'computed-types', 'decoders', 'io-ts', + 'joi', 'jointz', 'json-decoder', 'mol_data', diff --git a/cases/joi.ts b/cases/joi.ts new file mode 100644 index 000000000..41b42ebd8 --- /dev/null +++ b/cases/joi.ts @@ -0,0 +1,67 @@ +import Joi from 'joi'; +import { createCase } from '../benchmarks'; + +const schema = Joi.object({ + number: Joi.number().required(), + negNumber: Joi.number().required(), + maxNumber: Joi.number().unsafe().required(), + string: Joi.string().required(), + longString: Joi.string().required(), + boolean: Joi.boolean().required(), + deeplyNested: Joi.object({ + foo: Joi.string().required(), + num: Joi.number().required(), + bool: Joi.boolean().required(), + }).required(), +}); + +createCase('joi', 'parseSafe', () => { + return data => { + const { value, error } = schema.validate(data, { + stripUnknown: true, + allowUnknown: true, + convert: false, + }); + + if (error) throw error; + + return value; + }; +}); + +createCase('joi', 'parseStrict', () => { + return data => { + const { value, error } = schema.validate(data, { + allowUnknown: false, + convert: false, + }); + + if (error) throw error; + + return value; + }; +}); + +createCase('joi', 'assertLoose', () => { + return data => { + const { error } = schema.validate(data, { + stripUnknown: false, + convert: false, + allowUnknown: true, + }); + if (error) throw error; + return true; + }; +}); + +createCase('joi', 'assertStrict', () => { + const strictSchema = schema.options({ convert: false }); + return data => { + const { error } = strictSchema.validate(data, { + convert: false, + allowUnknown: false, + }); + if (error) throw error; + return true; + }; +}); diff --git a/download-packages-popularity.ts b/download-packages-popularity.ts index f3c51c7b3..221fc1d93 100644 --- a/download-packages-popularity.ts +++ b/download-packages-popularity.ts @@ -214,6 +214,10 @@ export const packages = [ name: 'type-predicate-generator', packageName: 'type-predicate-generator', }, + { + name: 'joi', + packageName: 'joi', + }, ] as const; interface BodyWeeklyDownloads { diff --git a/package-lock.json b/package-lock.json index 25eedd28b..f1a319940 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,6 +42,7 @@ "fp-ts": "2.16.9", "io-ts": "2.2.22", "jet-schema": "1.4.3", + "joi": "17.13.3", "jointz": "7.0.4", "json-decoder": "1.4.1", "mol_data_all": "1.1.1386", @@ -2504,6 +2505,19 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -3097,6 +3111,24 @@ "node": ">=v16" } }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, "node_modules/@sinclair/typebox": { "version": "0.34.28", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.28.tgz", @@ -6811,6 +6843,18 @@ "resolved": "https://registry.npmjs.org/jet-schema/-/jet-schema-1.4.3.tgz", "integrity": "sha512-BDA5Z8Kkk1SppmV9KOuTwY3OExHGt37tTZumsoKwNfp+0XXsEXPfk9oZfVqM7na0EUsMB/zcvsjQBU7Qu6YQ0A==" }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, "node_modules/jointz": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/jointz/-/jointz-7.0.4.tgz", @@ -12657,6 +12701,19 @@ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true }, + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, "@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -13033,6 +13090,24 @@ "lodash": "^4.17.21" } }, + "@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, "@sinclair/typebox": { "version": "0.34.28", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.28.tgz", @@ -15591,6 +15666,18 @@ "resolved": "https://registry.npmjs.org/jet-schema/-/jet-schema-1.4.3.tgz", "integrity": "sha512-BDA5Z8Kkk1SppmV9KOuTwY3OExHGt37tTZumsoKwNfp+0XXsEXPfk9oZfVqM7na0EUsMB/zcvsjQBU7Qu6YQ0A==" }, + "joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "requires": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, "jointz": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/jointz/-/jointz-7.0.4.tgz", diff --git a/package.json b/package.json index 9dc736013..edb95f04e 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,7 @@ "fp-ts": "2.16.9", "io-ts": "2.2.22", "jet-schema": "1.4.3", + "joi": "17.13.3", "jointz": "7.0.4", "json-decoder": "1.4.1", "mol_data_all": "1.1.1386", diff --git a/test/benchmarks.test.ts b/test/benchmarks.test.ts index 5f152b89e..bcff5a319 100644 --- a/test/benchmarks.test.ts +++ b/test/benchmarks.test.ts @@ -15,6 +15,7 @@ import '../cases/cleaners'; import '../cases/computed-types'; import '../cases/decoders'; import '../cases/io-ts'; +import '../cases/joi'; import '../cases/jointz'; import '../cases/json-decoder'; import '../cases/mol_data';