diff --git a/bun.lock b/bun.lock index 68b945e51..a15f67146 100644 --- a/bun.lock +++ b/bun.lock @@ -35,6 +35,7 @@ "computed-types": "1.11.2", "csv-stringify": "6.6.0", "decoders": "1.25.5", + "dhi": "0.4.3", "fp-ts": "2.16.11", "io-ts": "2.2.22", "jet-schema": "1.4.3", @@ -812,6 +813,8 @@ "delaunator": ["delaunator@5.0.1", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw=="], + "dhi": ["dhi@0.4.3", "", { "peerDependencies": { "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-tzqyyV7XJj9CqMnkA1nX/hnEZc//HyY5ZsSQmQ4DpNRMF9ME70+igfknIy2WpEHZTuyr+PyHKElJpjCqWi6w6Q=="], + "diff": ["diff@4.0.2", "", {}, "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="], "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], diff --git a/cases/dhi.ts b/cases/dhi.ts new file mode 100644 index 000000000..b4ad69992 --- /dev/null +++ b/cases/dhi.ts @@ -0,0 +1,97 @@ +// @ts-expect-error - dhi uses package.json exports which require moduleResolution: "bundler" or "node16" +import { z } from 'dhi/schema'; +import { createCase } from '../benchmarks'; + +createCase('dhi', 'parseSafe', () => { + const dataType = z.object({ + number: z.number(), + negNumber: z.number(), + maxNumber: z.number(), + string: z.string(), + longString: z.string(), + boolean: z.boolean(), + deeplyNested: z.object({ + foo: z.string(), + num: z.number(), + bool: z.boolean(), + }), + }); // Default behavior: strips unknown keys + + return data => { + return dataType.parse(data); + }; +}); + +createCase('dhi', 'parseStrict', () => { + const dataType = z + .object({ + number: z.number(), + negNumber: z.number(), + maxNumber: z.number(), + string: z.string(), + longString: z.string(), + boolean: z.boolean(), + deeplyNested: z + .object({ + foo: z.string(), + num: z.number(), + bool: z.boolean(), + }) + .strict(), // Throw on unknown keys (nested) + }) + .strict(); // Throw on unknown keys (root) + + return data => { + return dataType.parse(data); + }; +}); + +createCase('dhi', 'assertLoose', () => { + const dataType = z + .object({ + number: z.number(), + negNumber: z.number(), + maxNumber: z.number(), + string: z.string(), + longString: z.string(), + boolean: z.boolean(), + deeplyNested: z + .object({ + foo: z.string(), + num: z.number(), + bool: z.boolean(), + }) + .passthrough(), // Allow unknown keys (nested) + }) + .passthrough(); // Allow unknown keys (root) + + return data => { + dataType.parse(data); + return true; + }; +}); + +createCase('dhi', 'assertStrict', () => { + const dataType = z + .object({ + number: z.number(), + negNumber: z.number(), + maxNumber: z.number(), + string: z.string(), + longString: z.string(), + boolean: z.boolean(), + deeplyNested: z + .object({ + foo: z.string(), + num: z.number(), + bool: z.boolean(), + }) + .strict(), // Throw on unknown keys (nested) + }) + .strict(); // Throw on unknown keys (root) + + return data => { + dataType.parse(data); + return true; + }; +}); diff --git a/package-lock.json b/package-lock.json index 19f547cce..50c01e40e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,6 +40,7 @@ "computed-types": "1.11.2", "csv-stringify": "6.6.0", "decoders": "1.25.5", + "dhi": "0.4.3", "fp-ts": "2.16.11", "io-ts": "2.2.22", "jet-schema": "1.4.3", @@ -4988,6 +4989,23 @@ "robust-predicates": "^3.0.2" } }, + "node_modules/dhi": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/dhi/-/dhi-0.4.3.tgz", + "integrity": "sha512-tzqyyV7XJj9CqMnkA1nX/hnEZc//HyY5ZsSQmQ4DpNRMF9ME70+igfknIy2WpEHZTuyr+PyHKElJpjCqWi6w6Q==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "typescript": "^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -14033,6 +14051,12 @@ "robust-predicates": "^3.0.2" } }, + "dhi": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/dhi/-/dhi-0.4.3.tgz", + "integrity": "sha512-tzqyyV7XJj9CqMnkA1nX/hnEZc//HyY5ZsSQmQ4DpNRMF9ME70+igfknIy2WpEHZTuyr+PyHKElJpjCqWi6w6Q==", + "requires": {} + }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", diff --git a/package.json b/package.json index 37ecbba80..3794d00ef 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "computed-types": "1.11.2", "csv-stringify": "6.6.0", "decoders": "1.25.5", + "dhi": "0.4.3", "fp-ts": "2.16.11", "io-ts": "2.2.22", "jet-schema": "1.4.3",