From 8ecb915d42e119943b03479af9987090c9fda8dc Mon Sep 17 00:00:00 2001 From: Vitaly Budovski Date: Mon, 23 Dec 2024 12:40:20 +1100 Subject: [PATCH] feat: Add Paseri to benchmarks --- .eslintignore | 3 +- .gitignore | 5 +- .npmrc | 3 +- .prettierrc.js => .prettierrc.cjs | 0 README.md | 1 + benchmarks/assertLoose.ts | 4 +- benchmarks/assertStrict.ts | 4 +- benchmarks/helpers/graph.ts | 7 +- benchmarks/helpers/main.ts | 9 +- benchmarks/helpers/register.ts | 10 +- benchmarks/index.ts | 6 +- benchmarks/parseSafe.ts | 2 +- benchmarks/parseStrict.ts | 4 +- bun.lockb | Bin 390989 -> 400494 bytes cases/aeria/index.ts | 2 +- cases/ajv.ts | 2 +- cases/arktype.ts | 2 +- cases/banditypes.ts | 2 +- cases/bueno.ts | 2 +- cases/caketype.ts | 2 +- cases/class-validator.ts | 2 +- cases/computed-types.ts | 4 +- cases/decoders.ts | 2 +- cases/deepkit/build/index.js | 20 +- cases/deepkit/build/index.js.map | 2 +- cases/deepkit/index.ts | 4 +- cases/deepkit/tsconfig.json | 5 +- cases/effect-schema.ts | 2 +- cases/index.ts | 11 +- cases/io-ts.ts | 6 +- cases/jet-schema.ts | 6 +- cases/{jointz.ts => jointz/index.ts} | 4 +- cases/jointz/src/index.ts | 3 + cases/jointz/tsconfig.json | 12 + cases/json-decoder.ts | 2 +- cases/mojotech-json-type-validation.ts | 2 +- cases/mol_data.ts | 2 +- cases/mondrian-framework.ts | 2 +- cases/myzod.ts | 2 +- cases/ok-computer.ts | 2 +- cases/parse-dont-validate.ts | 2 +- cases/paseri.ts | 76 +++ cases/pure-parse.ts | 2 +- cases/purify-ts.ts | 2 +- cases/r-assign.ts | 13 +- cases/rescript-schema.ts | 2 +- cases/rulr.ts | 8 +- cases/runtypes.ts | 2 +- cases/sapphire-shapeshift.ts | 2 +- cases/simple-runtypes.ts | 2 +- cases/sinclair-typebox-ahead-of-time.ts | 6 +- cases/sinclair-typebox-dynamic.ts | 4 +- cases/sinclair-typebox-just-in-time.ts | 4 +- cases/spectypes/.babelrc | 14 +- cases/spectypes/index.ts | 4 +- cases/spectypes/src/index.ts | 9 +- cases/spectypes/src/tsconfig.json | 1 + cases/succulent.ts | 2 +- cases/superstruct.ts | 2 +- cases/suretype.ts | 2 +- cases/tiny-schema-validator.ts | 2 +- cases/to-typed.ts | 2 +- cases/toi.ts | 2 +- cases/ts-auto-guard/index.ts | 4 +- cases/ts-auto-guard/tsconfig.json | 4 +- cases/ts-interface-checker.ts | 2 +- cases/ts-json-validator.ts | 2 +- cases/ts-runtime-checks/index.ts | 4 +- cases/ts-runtime-checks/src/tsconfig.json | 5 +- cases/ts-utils.ts | 9 +- cases/tson.ts | 2 +- cases/typebox/index.ts | 2 +- cases/typeofweb-schema.ts | 2 +- cases/typia/index.ts | 4 +- cases/typia/tsconfig.json | 5 +- cases/unknownutil.ts | 2 +- cases/valibot.ts | 2 +- cases/valita.ts | 2 +- cases/vality.ts | 2 +- cases/yup.ts | 2 +- cases/zod.ts | 2 +- index.ts | 9 +- package-lock.json | 716 +++++++++++++++++++++- package.json | 10 +- test/benchmarks.test.ts | 1 + tsconfig.json | 5 +- 86 files changed, 981 insertions(+), 147 deletions(-) rename .prettierrc.js => .prettierrc.cjs (100%) rename cases/{jointz.ts => jointz/index.ts} (94%) create mode 100644 cases/jointz/src/index.ts create mode 100644 cases/jointz/tsconfig.json create mode 100644 cases/paseri.ts diff --git a/.eslintignore b/.eslintignore index c81183b29..2341b186e 100644 --- a/.eslintignore +++ b/.eslintignore @@ -6,4 +6,5 @@ cases/typia/build cases/deepkit/build cases/ts-auto-guard/build cases/ts-auto-guard/src/index.guard.ts -jest.config.js \ No newline at end of file +cases/jointz/build +jest.config.js diff --git a/.gitignore b/.gitignore index 2f9c9d893..d81de9b5c 100644 --- a/.gitignore +++ b/.gitignore @@ -164,4 +164,7 @@ cases/typia/build # ts-auto-guard build artifacts cases/ts-auto-guard/build -cases/ts-auto-guard/src/index.guard.ts \ No newline at end of file +cases/ts-auto-guard/src/index.guard.ts + +# jointz build artifacts +cases/jointz/build diff --git a/.npmrc b/.npmrc index 449691b70..ff06c0688 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ -save-exact=true \ No newline at end of file +save-exact=true +@jsr:registry=https://npm.jsr.io diff --git a/.prettierrc.js b/.prettierrc.cjs similarity index 100% rename from .prettierrc.js rename to .prettierrc.cjs diff --git a/README.md b/README.md index 6c0b2ef4a..9c40d8d9b 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ * [pure-parse](https://github.com/johannes-lindgren/pure-parse) * [purify-ts](https://github.com/gigobyte/purify) * [parse-dont-validate](https://github.com/Packer-Man/parse-dont-validate) +* [Paseri](https://github.com/vbudovski/paseri) * [r-assign](https://github.com/micnic/r-assign) * [rescript-schema](https://github.com/DZakh/rescript-schema) * [rulr](https://github.com/ryansmith94/rulr) diff --git a/benchmarks/assertLoose.ts b/benchmarks/assertLoose.ts index 10843370e..884b5ea8a 100644 --- a/benchmarks/assertLoose.ts +++ b/benchmarks/assertLoose.ts @@ -1,5 +1,5 @@ -import { Benchmark } from './helpers/types'; -import { validateData } from './parseSafe'; +import { Benchmark } from './helpers/types.ts'; +import { validateData } from './parseSafe.ts'; type Fn = (data: unknown) => boolean; diff --git a/benchmarks/assertStrict.ts b/benchmarks/assertStrict.ts index a04db5b79..1755b8dab 100644 --- a/benchmarks/assertStrict.ts +++ b/benchmarks/assertStrict.ts @@ -1,5 +1,5 @@ -import { Benchmark } from './helpers/types'; -import { validateData } from './parseSafe'; +import { Benchmark } from './helpers/types.ts'; +import { validateData } from './parseSafe.ts'; type Fn = (data: unknown) => boolean; diff --git a/benchmarks/helpers/graph.ts b/benchmarks/helpers/graph.ts index 42513c191..26c29f6c2 100644 --- a/benchmarks/helpers/graph.ts +++ b/benchmarks/helpers/graph.ts @@ -2,8 +2,11 @@ import { writeFileSync } from 'fs'; import { optimize } from 'svgo'; import { parse, View } from 'vega'; import { compile } from 'vega-lite'; -import { availableBenchmarks, type AvailableBenchmarksIds } from './register'; -import type { BenchmarkResult } from './types'; +import { + availableBenchmarks, + type AvailableBenchmarksIds, +} from './register.ts'; +import type { BenchmarkResult } from './types.ts'; interface PreviewGraphParams { values: BenchmarkResult[]; diff --git a/benchmarks/helpers/main.ts b/benchmarks/helpers/main.ts index 6dc77dbe9..d797f407d 100644 --- a/benchmarks/helpers/main.ts +++ b/benchmarks/helpers/main.ts @@ -1,11 +1,12 @@ import { add, complete, cycle, suite } from 'benny'; import { readFileSync, writeFileSync, existsSync, unlinkSync } from 'fs'; import { join } from 'path'; -import { writePreviewGraph } from './graph'; -import { getRegisteredBenchmarks } from './register'; -import type { BenchmarkCase, BenchmarkResult } from './types'; +import { fileURLToPath } from 'url'; +import { writePreviewGraph } from './graph.ts'; +import { getRegisteredBenchmarks } from './register.ts'; +import type { BenchmarkCase, BenchmarkResult } from './types.ts'; -const DOCS_DIR = join(__dirname, '../../docs'); +const DOCS_DIR = join(fileURLToPath(import.meta.url), '../../../docs'); const RUNTIME = process.env.RUNTIME || 'node'; const RUNTIME_VERSION = process.env.RUNTIME_VERSION || process.version; const RUNTIME_FOR_PREVIEW = 'node'; diff --git a/benchmarks/helpers/register.ts b/benchmarks/helpers/register.ts index 741d8e7bc..2a51a54ab 100644 --- a/benchmarks/helpers/register.ts +++ b/benchmarks/helpers/register.ts @@ -1,8 +1,8 @@ -import { AssertLoose } from '../assertLoose'; -import { AssertStrict } from '../assertStrict'; -import { ParseSafe } from '../parseSafe'; -import { ParseStrict } from '../parseStrict'; -import type { BenchmarkCase } from './types'; +import { AssertLoose } from '../assertLoose.ts'; +import { AssertStrict } from '../assertStrict.ts'; +import { ParseSafe } from '../parseSafe.ts'; +import { ParseStrict } from '../parseStrict.ts'; +import type { BenchmarkCase } from './types.ts'; /** * Map of all benchmarks. diff --git a/benchmarks/index.ts b/benchmarks/index.ts index 004f2df19..d5d49cc30 100644 --- a/benchmarks/index.ts +++ b/benchmarks/index.ts @@ -2,11 +2,11 @@ export { runAllBenchmarks, createPreviewGraph, deleteResults, -} from './helpers/main'; +} from './helpers/main.ts'; export { addCase, type AvailableBenchmarksIds, createCase, getRegisteredBenchmarks, -} from './helpers/register'; -export { type UnknownData } from './helpers/types'; +} from './helpers/register.ts'; +export { type UnknownData } from './helpers/types.ts'; diff --git a/benchmarks/parseSafe.ts b/benchmarks/parseSafe.ts index 120a91a6d..a112157d7 100644 --- a/benchmarks/parseSafe.ts +++ b/benchmarks/parseSafe.ts @@ -1,4 +1,4 @@ -import { Benchmark } from './helpers/types'; +import { Benchmark } from './helpers/types.ts'; export const validateData = Object.freeze({ number: 1, diff --git a/benchmarks/parseStrict.ts b/benchmarks/parseStrict.ts index d3523ac1b..3336c0710 100644 --- a/benchmarks/parseStrict.ts +++ b/benchmarks/parseStrict.ts @@ -1,5 +1,5 @@ -import { Benchmark } from './helpers/types'; -import { validateData } from './parseSafe'; +import { Benchmark } from './helpers/types.ts'; +import { validateData } from './parseSafe.ts'; type Fn = (data: unknown) => typeof validateData; diff --git a/bun.lockb b/bun.lockb index 9c8322e0fd72941e5fae9b96e1efec10ec7d7f4b..af46bb4b9622d3fd5f3c7bff358968c05fd9997b 100755 GIT binary patch delta 78272 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 z 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 diff --git a/cases/aeria/index.ts b/cases/aeria/index.ts index 2c72cfd09..025d1f09b 100644 --- a/cases/aeria/index.ts +++ b/cases/aeria/index.ts @@ -1,5 +1,5 @@ import { validate } from '@aeriajs/validation'; -import { createCase } from '../../benchmarks'; +import { createCase } from '../../benchmarks/index.ts'; const schema = { type: 'object', diff --git a/cases/ajv.ts b/cases/ajv.ts index 3e6ceb261..bcea5a6f7 100644 --- a/cases/ajv.ts +++ b/cases/ajv.ts @@ -1,5 +1,5 @@ import Ajv from 'ajv'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('ajv', 'assertLoose', () => { const ajv = new Ajv(); diff --git a/cases/arktype.ts b/cases/arktype.ts index be39e59f8..9031a6fc7 100644 --- a/cases/arktype.ts +++ b/cases/arktype.ts @@ -1,5 +1,5 @@ import { type } from 'arktype'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; const t = type({ number: 'number', diff --git a/cases/banditypes.ts b/cases/banditypes.ts index 36ed1785f..891fbf5e8 100644 --- a/cases/banditypes.ts +++ b/cases/banditypes.ts @@ -1,5 +1,5 @@ import { boolean, number, object, string } from 'banditypes'; -import { addCase } from '../benchmarks'; +import { addCase } from '../benchmarks/index.ts'; const dataTypeSafe = object({ number: number(), diff --git a/cases/bueno.ts b/cases/bueno.ts index ac97e5e0b..1823f9158 100644 --- a/cases/bueno.ts +++ b/cases/bueno.ts @@ -9,7 +9,7 @@ import { result, string, } from 'bueno'; -import { type UnknownData, addCase } from '../benchmarks'; +import { type UnknownData, addCase } from '../benchmarks/index.ts'; const dataType = object({ number: number, diff --git a/cases/caketype.ts b/cases/caketype.ts index b6767e4f5..7be07b8b5 100644 --- a/cases/caketype.ts +++ b/cases/caketype.ts @@ -1,5 +1,5 @@ import { bake, boolean, number, string } from 'caketype'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; const cake = bake({ number: number, diff --git a/cases/class-validator.ts b/cases/class-validator.ts index fd105e4d8..350ea8572 100644 --- a/cases/class-validator.ts +++ b/cases/class-validator.ts @@ -8,7 +8,7 @@ import { ValidateNested, } from 'class-validator'; import 'reflect-metadata'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('class-transformer-validator-sync', 'assertLoose', () => { class DeeplyNestedType { diff --git a/cases/computed-types.ts b/cases/computed-types.ts index 8e676c9ec..386788b81 100644 --- a/cases/computed-types.ts +++ b/cases/computed-types.ts @@ -1,5 +1,7 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore import Schema, { boolean, number, string } from 'computed-types'; -import { type UnknownData, addCase } from '../benchmarks'; +import { type UnknownData, addCase } from '../benchmarks/index.ts'; const validator = Schema({ number: number, diff --git a/cases/decoders.ts b/cases/decoders.ts index d5f4b6983..83b6d33a3 100644 --- a/cases/decoders.ts +++ b/cases/decoders.ts @@ -1,5 +1,5 @@ import { boolean, exact, guard, number, object, string } from 'decoders'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('decoders', 'parseSafe', () => { const dataType = object({ diff --git a/cases/deepkit/build/index.js b/cases/deepkit/build/index.js index b659b738f..f80c78825 100644 --- a/cases/deepkit/build/index.js +++ b/cases/deepkit/build/index.js @@ -1,13 +1,7 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.assertLoose = assertLoose; -exports.assertStrict = assertStrict; -exports.parseStrict = parseStrict; -exports.parseSafe = parseSafe; -const type_1 = require("@deepkit/type"); +import { castFunction, getValidatorFunction } from '@deepkit/type'; const __ΩToBeChecked = ['number', 'negNumber', 'maxNumber', 'string', 'longString', 'boolean', 'foo', 'num', 'bool', 'deeplyNested', 'ToBeChecked', 'P\'4!\'4"\'4#&4$&4%)4&P&4\'\'4()4)M4*Mw+y']; -const isToBeChecked = (type_1.getValidatorFunction.Ω = [[() => __ΩToBeChecked, 'n!']], (0, type_1.getValidatorFunction)()); -const safeToBeChecked = (type_1.castFunction.Ω = [[() => __ΩToBeChecked, 'n!']], (0, type_1.castFunction)()); +const isToBeChecked = (getValidatorFunction.Ω = [[() => __ΩToBeChecked, 'n!']], getValidatorFunction()); +const safeToBeChecked = (castFunction.Ω = [[() => __ΩToBeChecked, 'n!']], castFunction()); /** * Check that an object conforms to the schema. * @@ -18,7 +12,7 @@ const safeToBeChecked = (type_1.castFunction.Ω = [[() => __ΩToBeChecked, 'n!'] * But not checking for unknown/extra keys in records may provide massive * speedups and may suffice in certain scenarios. */ -function assertLoose(input) { +export function assertLoose(input) { if (!isToBeChecked(input)) throw new Error('wrong type.'); return true; @@ -29,14 +23,14 @@ assertLoose.__type = ['input', 'assertLoose', 'P#2!)/"']; * * Raise errors if any extra keys not present in the schema are found. */ -function assertStrict() { +export function assertStrict() { throw new Error('not supported.'); } assertStrict.__type = ['assertStrict', 'P)/!']; /** * Like parseSafe but throw on unknown (extra) keys in objects. */ -function parseStrict() { +export function parseStrict() { throw new Error('not supported.'); } parseStrict.__type = [() => __ΩToBeChecked, 'parseStrict', 'Pn!/"']; @@ -47,7 +41,7 @@ parseStrict.__type = [() => __ΩToBeChecked, 'parseStrict', 'Pn!/"']; * not result in unwanted parameters or the `__proto__` attribute being * maliciously passed to internal functions. */ -function parseSafe(input) { +export function parseSafe(input) { return safeToBeChecked(input); } parseSafe.__type = ['input', () => __ΩToBeChecked, 'parseSafe', 'P#2!n"/#']; diff --git a/cases/deepkit/build/index.js.map b/cases/deepkit/build/index.js.map index bafc22b2f..8ee2e7596 100644 --- a/cases/deepkit/build/index.js.map +++ b/cases/deepkit/build/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AA6BA,kCAGC;AAOD,oCAEC;AAKD,kCAEC;AASD,8BAEC;AA3DD,wCAAmE;;AAgBnE,MAAM,aAAa,IAAG,2BAAoB,qCAApB,IAAA,2BAAoB,GAAe,CAAA,CAAC;AAC1D,MAAM,eAAe,IAAG,mBAAY,qCAAZ,IAAA,mBAAY,GAAe,CAAA,CAAC;AAEpD;;;;;;;;;GASG;AACH,SAAgB,WAAW,CAAC,KAAc;IACxC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAY;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC;;AAED;;;;GAIG;AACH,SAAgB,YAAY;IAC1B,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;AACpC,CAAC;;AAED;;GAEG;AACH,SAAgB,WAAW;IACzB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;AACpC,CAAC;;AAED;;;;;;GAMG;AACH,SAAgB,SAAS,CAAC,KAAc;IACtC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;;AAgBnE,MAAM,aAAa,IAAG,oBAAoB,qCAApB,oBAAoB,EAAe,CAAA,CAAC;AAC1D,MAAM,eAAe,IAAG,YAAY,qCAAZ,YAAY,EAAe,CAAA,CAAC;AAEpD;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAY;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC;;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;AACpC,CAAC;;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;AACpC,CAAC;;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC"} \ No newline at end of file diff --git a/cases/deepkit/index.ts b/cases/deepkit/index.ts index 6bd357890..f13dd6f94 100644 --- a/cases/deepkit/index.ts +++ b/cases/deepkit/index.ts @@ -1,5 +1,5 @@ -import { parseSafe, assertLoose } from './build'; -import { addCase } from '../../benchmarks'; +import { parseSafe, assertLoose } from './build/index.js'; +import { addCase } from '../../benchmarks/index.ts'; addCase('deepkit', 'parseSafe', data => { return parseSafe(data); diff --git a/cases/deepkit/tsconfig.json b/cases/deepkit/tsconfig.json index b604947aa..f81a9432f 100644 --- a/cases/deepkit/tsconfig.json +++ b/cases/deepkit/tsconfig.json @@ -1,8 +1,9 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "module": "commonjs", - "outDir": "build" + "module": "ESNext", + "outDir": "build", + "allowImportingTsExtensions": false }, "include": ["src/index.ts"], "reflection": true diff --git a/cases/effect-schema.ts b/cases/effect-schema.ts index 7d8601bff..4fae575cc 100644 --- a/cases/effect-schema.ts +++ b/cases/effect-schema.ts @@ -1,5 +1,5 @@ import { Schema } from '@effect/schema'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('effect-schema', 'parseSafe', () => { const dataType = Schema.Struct({ diff --git a/cases/index.ts b/cases/index.ts index b0878e07d..5960182a9 100644 --- a/cases/index.ts +++ b/cases/index.ts @@ -19,6 +19,7 @@ export const cases = [ 'parse-dont-validate', 'pure-parse', 'purify-ts', + 'paseri', 'r-assign', 'rescript-schema', 'rulr', @@ -57,5 +58,13 @@ export const cases = [ export type CaseName = (typeof cases)[number]; export async function importCase(caseName: CaseName) { - await import('./' + caseName); + try { + await import(`./${caseName}.ts`); + } catch { + try { + await import(`./${caseName}/index.ts`); + } catch (e) { + console.error(`Could not import ${caseName}.`, e); + } + } } diff --git a/cases/io-ts.ts b/cases/io-ts.ts index d2f445379..8bca052da 100644 --- a/cases/io-ts.ts +++ b/cases/io-ts.ts @@ -1,7 +1,7 @@ -import { fold } from 'fp-ts/Either'; -import { pipe } from 'fp-ts/function'; +import { fold } from 'fp-ts/lib/Either.js'; +import { pipe } from 'fp-ts/lib/function.js'; import * as t from 'io-ts'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('io-ts', 'assertLoose', () => { const dataType = t.type({ diff --git a/cases/jet-schema.ts b/cases/jet-schema.ts index 272e55ff0..d80353f46 100644 --- a/cases/jet-schema.ts +++ b/cases/jet-schema.ts @@ -1,5 +1,7 @@ -import jetSchema from 'jet-schema'; -import { createCase } from '../benchmarks'; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import jetSchema from 'jet-schema/dist/index.min.mjs'; +import { createCase } from '../benchmarks/index.ts'; // **** Init Schema **** // diff --git a/cases/jointz.ts b/cases/jointz/index.ts similarity index 94% rename from cases/jointz.ts rename to cases/jointz/index.ts index 5713f3f39..5444bba21 100644 --- a/cases/jointz.ts +++ b/cases/jointz/index.ts @@ -1,5 +1,5 @@ -import jointz from 'jointz'; -import { addCase } from '../benchmarks'; +import jointz from './build/index.js'; +import { addCase } from '../../benchmarks/index.js'; const dataTypeLoose = jointz .object({ diff --git a/cases/jointz/src/index.ts b/cases/jointz/src/index.ts new file mode 100644 index 000000000..58530677f --- /dev/null +++ b/cases/jointz/src/index.ts @@ -0,0 +1,3 @@ +import { default as jointz } from 'jointz/src/index'; + +export default jointz; diff --git a/cases/jointz/tsconfig.json b/cases/jointz/tsconfig.json new file mode 100644 index 000000000..b2d45b979 --- /dev/null +++ b/cases/jointz/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "module": "CommonJS", + "moduleResolution": "Node", + "outDir": "build", + "strict": true, + "declaration": true, + "emitDeclarationOnly": true + }, + "include": ["src/index.ts"] + } diff --git a/cases/json-decoder.ts b/cases/json-decoder.ts index 47e583f46..3abf46bea 100644 --- a/cases/json-decoder.ts +++ b/cases/json-decoder.ts @@ -4,7 +4,7 @@ import { numberDecoder, boolDecoder, } from 'json-decoder'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('json-decoder', 'parseSafe', () => { const dataType = objectDecoder({ diff --git a/cases/mojotech-json-type-validation.ts b/cases/mojotech-json-type-validation.ts index 2cf1ac020..77fcaba48 100644 --- a/cases/mojotech-json-type-validation.ts +++ b/cases/mojotech-json-type-validation.ts @@ -4,7 +4,7 @@ import { object, boolean, } from '@mojotech/json-type-validation'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('@mojotech/json-type-validation', 'parseSafe', () => { const dataType = object({ diff --git a/cases/mol_data.ts b/cases/mol_data.ts index fe1460dce..7b4aef65d 100644 --- a/cases/mol_data.ts +++ b/cases/mol_data.ts @@ -7,7 +7,7 @@ const { $mol_data_boolean: Bool, } = $; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('$mol_data', 'parseSafe', () => { const dataType = Rec({ diff --git a/cases/mondrian-framework.ts b/cases/mondrian-framework.ts index a991bf677..4caeab72a 100644 --- a/cases/mondrian-framework.ts +++ b/cases/mondrian-framework.ts @@ -1,4 +1,4 @@ -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; import { model } from '@mondrian-framework/model'; const dataType = model.object({ diff --git a/cases/myzod.ts b/cases/myzod.ts index 5653b3ed9..6c0b50024 100644 --- a/cases/myzod.ts +++ b/cases/myzod.ts @@ -1,5 +1,5 @@ import myzod from 'myzod'; -import { addCase, createCase } from '../benchmarks'; +import { addCase, createCase } from '../benchmarks/index.ts'; createCase('myzod', 'parseSafe', () => { const dataType = myzod.object( diff --git a/cases/ok-computer.ts b/cases/ok-computer.ts index 17c2ce91b..d5d452421 100644 --- a/cases/ok-computer.ts +++ b/cases/ok-computer.ts @@ -1,5 +1,5 @@ import { boolean, number, object, string, assert } from 'ok-computer'; -import { type UnknownData, addCase } from '../benchmarks'; +import { type UnknownData, addCase } from '../benchmarks/index.ts'; const dataType = object({ number: number, diff --git a/cases/parse-dont-validate.ts b/cases/parse-dont-validate.ts index 51a1433d3..2f027ef39 100644 --- a/cases/parse-dont-validate.ts +++ b/cases/parse-dont-validate.ts @@ -4,7 +4,7 @@ import parse, { parseAsNumber, parseAsString, } from 'parse-dont-validate'; -import { addCase } from '../benchmarks'; +import { addCase } from '../benchmarks/index.ts'; addCase('parse-dont-validate (chained function)', 'parseSafe', data => parse(data) diff --git a/cases/paseri.ts b/cases/paseri.ts new file mode 100644 index 000000000..645ad9391 --- /dev/null +++ b/cases/paseri.ts @@ -0,0 +1,76 @@ +import * as p from '@vbudovski/paseri'; +import { addCase } from '../benchmarks/index.ts'; + +const dataTypeStrip = p + .object({ + number: p.number(), + negNumber: p.number(), + maxNumber: p.number(), + string: p.string(), + longString: p.string(), + boolean: p.boolean(), + deeplyNested: p + .object({ + foo: p.string(), + num: p.number(), + bool: p.boolean(), + }) + .strip(), + }) + .strip(); + +const dataTypeStrict = p + .object({ + number: p.number(), + negNumber: p.number(), + maxNumber: p.number(), + string: p.string(), + longString: p.string(), + boolean: p.boolean(), + deeplyNested: p + .object({ + foo: p.string(), + num: p.number(), + bool: p.boolean(), + }) + .strict(), + }) + .strict(); + +const dataTypePassthrough = p + .object({ + number: p.number(), + negNumber: p.number(), + maxNumber: p.number(), + string: p.string(), + longString: p.string(), + boolean: p.boolean(), + deeplyNested: p + .object({ + foo: p.string(), + num: p.number(), + bool: p.boolean(), + }) + .passthrough(), + }) + .passthrough(); + +addCase('paseri', 'parseSafe', data => { + return dataTypeStrip.parse(data); +}); + +addCase('paseri', 'parseStrict', data => { + return dataTypeStrict.parse(data); +}); + +addCase('paseri', 'assertLoose', data => { + dataTypePassthrough.parse(data); + + return true; +}); + +addCase('paseri', 'assertStrict', data => { + dataTypeStrict.parse(data); + + return true; +}); diff --git a/cases/pure-parse.ts b/cases/pure-parse.ts index 6b7fb135b..4cb26d7b4 100644 --- a/cases/pure-parse.ts +++ b/cases/pure-parse.ts @@ -1,4 +1,4 @@ -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; import { object, objectCompiled, diff --git a/cases/purify-ts.ts b/cases/purify-ts.ts index e82b7cfb2..a19fe59d7 100644 --- a/cases/purify-ts.ts +++ b/cases/purify-ts.ts @@ -1,5 +1,5 @@ import { Codec, string, number, boolean } from 'purify-ts'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('purify-ts', 'parseSafe', () => { const dataType = Codec.interface({ diff --git a/cases/r-assign.ts b/cases/r-assign.ts index 70a1ca92b..c1e2f5513 100644 --- a/cases/r-assign.ts +++ b/cases/r-assign.ts @@ -1,12 +1,7 @@ -import { - boolean, - number, - object, - strictObject, - string, - parseType, -} from 'r-assign/lib'; -import { createCase } from '../benchmarks'; +import pkg from 'r-assign/lib/index.js'; +const { boolean, number, object, strictObject, string, parseType } = pkg; + +import { createCase } from '../benchmarks/index.ts'; createCase('r-assign', 'parseSafe', () => { const dataType = object({ diff --git a/cases/rescript-schema.ts b/cases/rescript-schema.ts index 03bc1ad68..0a73d6978 100644 --- a/cases/rescript-schema.ts +++ b/cases/rescript-schema.ts @@ -1,6 +1,6 @@ import * as S from 'rescript-schema'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; S.setGlobalConfig({ disableNanNumberValidation: true, diff --git a/cases/rulr.ts b/cases/rulr.ts index da41cd2ad..9693d43e4 100644 --- a/cases/rulr.ts +++ b/cases/rulr.ts @@ -1,5 +1,9 @@ -import { object, number, string, boolean } from 'rulr'; -import { createCase } from '../benchmarks'; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import * as pkg from 'rulr'; +const { object, number, string, boolean } = pkg; + +import { createCase } from '../benchmarks/index.ts'; createCase('rulr', 'parseSafe', () => { const dataType = object({ diff --git a/cases/runtypes.ts b/cases/runtypes.ts index 9c8df2dc7..739de7a91 100644 --- a/cases/runtypes.ts +++ b/cases/runtypes.ts @@ -1,5 +1,5 @@ import { Boolean, Number, String, Record } from 'runtypes'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('runtypes', 'assertLoose', () => { const dataType = Record({ diff --git a/cases/sapphire-shapeshift.ts b/cases/sapphire-shapeshift.ts index 5646fd65f..76b614f2e 100644 --- a/cases/sapphire-shapeshift.ts +++ b/cases/sapphire-shapeshift.ts @@ -1,5 +1,5 @@ import { s } from '@sapphire/shapeshift'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('@sapphire/shapeshift', 'parseSafe', () => { const dataType = s.object({ diff --git a/cases/simple-runtypes.ts b/cases/simple-runtypes.ts index 0b5990560..5bc369daa 100644 --- a/cases/simple-runtypes.ts +++ b/cases/simple-runtypes.ts @@ -1,5 +1,5 @@ import * as rt from 'simple-runtypes'; -import { addCase } from '../benchmarks'; +import { addCase } from '../benchmarks/index.ts'; const checkDataSafe = rt.sloppyRecord({ number: rt.integer(), diff --git a/cases/sinclair-typebox-ahead-of-time.ts b/cases/sinclair-typebox-ahead-of-time.ts index d1db470ce..52f455056 100644 --- a/cases/sinclair-typebox-ahead-of-time.ts +++ b/cases/sinclair-typebox-ahead-of-time.ts @@ -1,6 +1,6 @@ -import { createCase } from '../benchmarks'; -import { CheckLoose } from './typebox/build/check-loose'; -import { CheckStrict } from './typebox/build/check-strict'; +import { createCase } from '../benchmarks/index.ts'; +import { CheckLoose } from './typebox/build/check-loose.ts'; +import { CheckStrict } from './typebox/build/check-strict.ts'; createCase('@sinclair/typebox-(ahead-of-time)', 'assertLoose', () => { return data => { diff --git a/cases/sinclair-typebox-dynamic.ts b/cases/sinclair-typebox-dynamic.ts index 8779a4bbb..482ce8d72 100644 --- a/cases/sinclair-typebox-dynamic.ts +++ b/cases/sinclair-typebox-dynamic.ts @@ -1,6 +1,6 @@ -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; import { Value } from '@sinclair/typebox/value'; -import { Loose, Strict } from './sinclair-typebox'; +import { Loose, Strict } from './sinclair-typebox.ts'; createCase('@sinclair/typebox-(dynamic)', 'assertLoose', () => { return data => { diff --git a/cases/sinclair-typebox-just-in-time.ts b/cases/sinclair-typebox-just-in-time.ts index 9c117ffa0..a2aeda8f6 100644 --- a/cases/sinclair-typebox-just-in-time.ts +++ b/cases/sinclair-typebox-just-in-time.ts @@ -1,6 +1,6 @@ -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; import { TypeCompiler } from '@sinclair/typebox/compiler'; -import { Loose, Strict } from './sinclair-typebox'; +import { Loose, Strict } from './sinclair-typebox.ts'; const CheckLoose = TypeCompiler.Compile(Loose); const CheckStrict = TypeCompiler.Compile(Strict); diff --git a/cases/spectypes/.babelrc b/cases/spectypes/.babelrc index 8f6804e0f..f8f08f986 100644 --- a/cases/spectypes/.babelrc +++ b/cases/spectypes/.babelrc @@ -1,6 +1,16 @@ { - "presets": ["@babel/preset-env", "@babel/preset-typescript"], - "plugins": ["babel-plugin-spectypes"], + "presets": [ + [ + "@babel/preset-env", + { + "modules": false + } + ], + "@babel/preset-typescript" + ], + "plugins": [ + "babel-plugin-spectypes" + ], "targets": { "node": 16 } diff --git a/cases/spectypes/index.ts b/cases/spectypes/index.ts index 1fcfad4c0..bb4d72ae2 100644 --- a/cases/spectypes/index.ts +++ b/cases/spectypes/index.ts @@ -1,5 +1,5 @@ -import { parseSafe, parseStrict, assertLoose } from './build'; -import { addCase } from '../../benchmarks'; +import { parseSafe, parseStrict, assertLoose } from './build/index.js'; +import { addCase } from '../../benchmarks/index.ts'; addCase('spectypes', 'parseSafe', data => { const parsed = parseSafe(data); diff --git a/cases/spectypes/src/index.ts b/cases/spectypes/src/index.ts index e45dcfe9b..43b5b686f 100644 --- a/cases/spectypes/src/index.ts +++ b/cases/spectypes/src/index.ts @@ -9,7 +9,8 @@ import { unknown, } from 'spectypes'; -export const parseStrict = object({ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const parseStrict: any = object({ number, negNumber: number, maxNumber: number, @@ -23,7 +24,8 @@ export const parseStrict = object({ }), }); -export const parseSafe = struct({ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const parseSafe: any = struct({ number, negNumber: number, maxNumber: number, @@ -37,7 +39,8 @@ export const parseSafe = struct({ }), }); -export const assertLoose = merge( +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const assertLoose: any = merge( object({ number, negNumber: number, diff --git a/cases/spectypes/src/tsconfig.json b/cases/spectypes/src/tsconfig.json index 07fa5fb28..1488039a8 100644 --- a/cases/spectypes/src/tsconfig.json +++ b/cases/spectypes/src/tsconfig.json @@ -2,6 +2,7 @@ "extends": "../../../tsconfig.json", "compilerOptions": { "module": "commonjs", + "moduleResolution": "Node", "outDir": "../build", "declaration": true, "emitDeclarationOnly": true diff --git a/cases/succulent.ts b/cases/succulent.ts index a4237c270..c95b735b3 100644 --- a/cases/succulent.ts +++ b/cases/succulent.ts @@ -7,7 +7,7 @@ import { $number, $string, } from 'succulent'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; const $LooseType = $interface({ number: $number, diff --git a/cases/superstruct.ts b/cases/superstruct.ts index 75d517d26..773c14a7c 100644 --- a/cases/superstruct.ts +++ b/cases/superstruct.ts @@ -7,7 +7,7 @@ import { string, type, } from 'superstruct'; -import { addCase } from '../benchmarks'; +import { addCase } from '../benchmarks/index.ts'; const dataTypeSafe = type({ number: number(), diff --git a/cases/suretype.ts b/cases/suretype.ts index c9660cc3d..797676a31 100644 --- a/cases/suretype.ts +++ b/cases/suretype.ts @@ -1,5 +1,5 @@ import { v, compile } from 'suretype'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('suretype', 'assertLoose', () => { const dataSchema = v.object({ diff --git a/cases/tiny-schema-validator.ts b/cases/tiny-schema-validator.ts index 902dc87de..61981d6ce 100644 --- a/cases/tiny-schema-validator.ts +++ b/cases/tiny-schema-validator.ts @@ -1,5 +1,5 @@ import { createSchema, _ } from 'tiny-schema-validator'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; // Define the Strict schema with additional property constraints export const Strict = createSchema({ diff --git a/cases/to-typed.ts b/cases/to-typed.ts index a0bf400b1..1030d198d 100644 --- a/cases/to-typed.ts +++ b/cases/to-typed.ts @@ -1,4 +1,4 @@ -import { addCase } from '../benchmarks'; +import { addCase } from '../benchmarks/index.ts'; import { Guard, Cast } from 'to-typed'; const model = { diff --git a/cases/toi.ts b/cases/toi.ts index 390cfd40b..12198abd2 100644 --- a/cases/toi.ts +++ b/cases/toi.ts @@ -1,5 +1,5 @@ import * as toi from '@toi/toi'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('toi', 'parseStrict', () => { const obj = () => toi.required().and(toi.obj.isplain()); diff --git a/cases/ts-auto-guard/index.ts b/cases/ts-auto-guard/index.ts index fd23b988a..fd125df8b 100644 --- a/cases/ts-auto-guard/index.ts +++ b/cases/ts-auto-guard/index.ts @@ -1,5 +1,5 @@ -import { isLoose } from './build/index.guard'; -import { addCase } from '../../benchmarks'; +import { isLoose } from './build/index.guard.js'; +import { addCase } from '../../benchmarks/index.ts'; addCase('ts-auto-guard', 'assertLoose', data => { if (!isLoose(data)) throw new Error('wrong type.'); diff --git a/cases/ts-auto-guard/tsconfig.json b/cases/ts-auto-guard/tsconfig.json index db972bfd4..a1766a83c 100644 --- a/cases/ts-auto-guard/tsconfig.json +++ b/cases/ts-auto-guard/tsconfig.json @@ -1,11 +1,11 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "module": "commonjs", + "module": "ESNext", "outDir": "build", "strict": true, "strictNullChecks": true, + "allowImportingTsExtensions": false }, "include": ["src/index.ts", "src/index.guard.ts"] } - \ No newline at end of file diff --git a/cases/ts-interface-checker.ts b/cases/ts-interface-checker.ts index 839a08334..b4852ccdd 100644 --- a/cases/ts-interface-checker.ts +++ b/cases/ts-interface-checker.ts @@ -1,5 +1,5 @@ import * as t from 'ts-interface-checker'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('ts-interface-checker', 'assertLoose', () => { const dataType = t.iface([], { diff --git a/cases/ts-json-validator.ts b/cases/ts-json-validator.ts index bc9d615cf..42837ff51 100644 --- a/cases/ts-json-validator.ts +++ b/cases/ts-json-validator.ts @@ -1,5 +1,5 @@ import { createSchema as S, TsjsonParser } from 'ts-json-validator'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('ts-json-validator', 'assertLoose', () => { const parser = new TsjsonParser( diff --git a/cases/ts-runtime-checks/index.ts b/cases/ts-runtime-checks/index.ts index d4eb817c9..8f15467f1 100644 --- a/cases/ts-runtime-checks/index.ts +++ b/cases/ts-runtime-checks/index.ts @@ -1,5 +1,5 @@ -import { assertStrict, assertLoose, parseStrict } from './build'; -import { addCase } from '../../benchmarks'; +import { assertStrict, assertLoose, parseStrict } from './build/index.js'; +import { addCase } from '../../benchmarks/index.ts'; addCase('ts-runtime-checks', 'parseStrict', data => { // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/cases/ts-runtime-checks/src/tsconfig.json b/cases/ts-runtime-checks/src/tsconfig.json index 8a40747a2..07579d093 100644 --- a/cases/ts-runtime-checks/src/tsconfig.json +++ b/cases/ts-runtime-checks/src/tsconfig.json @@ -1,9 +1,10 @@ { "extends": "../../../tsconfig.json", "compilerOptions": { - "module": "commonjs", + "module": "ESNext", "outDir": "../build", - "plugins": [{ "transform": "ts-runtime-checks" }] + "plugins": [{ "transform": "ts-runtime-checks" }], + "allowImportingTsExtensions": false }, "include": ["index.ts"] } diff --git a/cases/ts-utils.ts b/cases/ts-utils.ts index ea6ecaaf2..f9608faa7 100644 --- a/cases/ts-utils.ts +++ b/cases/ts-utils.ts @@ -1,5 +1,10 @@ -import { object, number, boolean, string } from '@ailabs/ts-utils/dist/decoder'; -import { createCase } from '../benchmarks'; +import { + object, + number, + boolean, + string, +} from '@ailabs/ts-utils/dist/decoder.js'; +import { createCase } from '../benchmarks/index.ts'; createCase('ts-utils', 'parseSafe', () => { const dataType = object('Data', { diff --git a/cases/tson.ts b/cases/tson.ts index 38944d04c..7d7e03d26 100644 --- a/cases/tson.ts +++ b/cases/tson.ts @@ -1,5 +1,5 @@ import { t } from '@skarab/tson'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('tson', 'parseSafe', () => { const dataType = t diff --git a/cases/typebox/index.ts b/cases/typebox/index.ts index 8c32d306a..4768e2a9b 100644 --- a/cases/typebox/index.ts +++ b/cases/typebox/index.ts @@ -1,6 +1,6 @@ import { TypeCompiler } from '@sinclair/typebox/compiler'; import type { TSchema } from '@sinclair/typebox'; -import { Loose, Strict } from '../sinclair-typebox'; +import { Loose, Strict } from '../sinclair-typebox.ts'; import { writeFileSync } from 'node:fs'; // typebox assertion routines require a named shim before writing as modules diff --git a/cases/typeofweb-schema.ts b/cases/typeofweb-schema.ts index a832ae553..1385898de 100644 --- a/cases/typeofweb-schema.ts +++ b/cases/typeofweb-schema.ts @@ -1,5 +1,5 @@ import { object, number, string, validate, boolean } from '@typeofweb/schema'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('@typeofweb/schema', 'assertLoose', () => { const dataType = object( diff --git a/cases/typia/index.ts b/cases/typia/index.ts index 55ab85b67..aa71addad 100644 --- a/cases/typia/index.ts +++ b/cases/typia/index.ts @@ -1,5 +1,5 @@ -import { is, equals, clone } from './build'; -import { addCase } from '../../benchmarks'; +import { is, equals, clone } from './build/index.js'; +import { addCase } from '../../benchmarks/index.ts'; addCase('typia', 'parseSafe', data => { if (!is(data)) throw new Error('wrong type.'); diff --git a/cases/typia/tsconfig.json b/cases/typia/tsconfig.json index 8aa00ec5d..24f0298f3 100644 --- a/cases/typia/tsconfig.json +++ b/cases/typia/tsconfig.json @@ -1,9 +1,11 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "module": "commonjs", + "module": "ESNext", + "moduleResolution": "Node", "outDir": "build", "strict": true, + "allowImportingTsExtensions": false, "plugins": [ { "transform": "typia/lib/transform", @@ -13,4 +15,3 @@ }, "include": ["src/index.ts"] } - \ No newline at end of file diff --git a/cases/unknownutil.ts b/cases/unknownutil.ts index f37eb7d48..dd9e874d4 100644 --- a/cases/unknownutil.ts +++ b/cases/unknownutil.ts @@ -1,5 +1,5 @@ import { is, ensure, assert } from 'unknownutil'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; const dataTypeLoose = is.ObjectOf({ number: is.Number, diff --git a/cases/valibot.ts b/cases/valibot.ts index ab4f4c430..921275e82 100644 --- a/cases/valibot.ts +++ b/cases/valibot.ts @@ -1,5 +1,5 @@ import { object, number, string, boolean, parse, strictObject } from 'valibot'; -import { addCase } from '../benchmarks'; +import { addCase } from '../benchmarks/index.ts'; const LooseSchema = object({ number: number(), diff --git a/cases/valita.ts b/cases/valita.ts index 7ec4e174b..3fa429455 100644 --- a/cases/valita.ts +++ b/cases/valita.ts @@ -1,5 +1,5 @@ import * as v from '@badrap/valita'; -import { addCase } from '../benchmarks'; +import { addCase } from '../benchmarks/index.ts'; const dataType = v.object({ number: v.number(), diff --git a/cases/vality.ts b/cases/vality.ts index 3f2d52258..16f71f606 100644 --- a/cases/vality.ts +++ b/cases/vality.ts @@ -1,5 +1,5 @@ import { v, validate } from 'vality'; -import { addCase } from '../benchmarks'; +import { addCase } from '../benchmarks/index.ts'; const dataType = v.object({ number: v.number, diff --git a/cases/yup.ts b/cases/yup.ts index 0889c4e05..bc0390c02 100644 --- a/cases/yup.ts +++ b/cases/yup.ts @@ -1,5 +1,5 @@ import * as yup from 'yup'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('yup', 'assertLoose', () => { const dataType = yup.object({ diff --git a/cases/zod.ts b/cases/zod.ts index e7c24101e..41fc2006d 100644 --- a/cases/zod.ts +++ b/cases/zod.ts @@ -1,5 +1,5 @@ import * as z from 'zod'; -import { createCase } from '../benchmarks'; +import { createCase } from '../benchmarks/index.ts'; createCase('zod', 'parseSafe', () => { const dataType = z.object({ diff --git a/index.ts b/index.ts index 19602d056..79874f86a 100644 --- a/index.ts +++ b/index.ts @@ -1,6 +1,6 @@ import * as childProcess from 'child_process'; -import * as benchmarks from './benchmarks'; -import * as cases from './cases'; +import * as benchmarks from './benchmarks/index.ts'; +import * as cases from './cases/index.ts'; async function main() { // a runtype lib would be handy here to check the passed command names ;) @@ -46,6 +46,11 @@ async function main() { stdio: 'inherit', }); } + if (c === 'jointz') { + childProcess.execSync('npm run compile:jointz', { + stdio: 'inherit', + }); + } const cmd = [...process.argv.slice(0, 2), 'run-internal', c]; diff --git a/package-lock.json b/package-lock.json index 8a6f29bda..ed11190ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,7 @@ "@toi/toi": "1.3.0", "@typeofweb/schema": "0.7.3", "@types/benchmark": "2.1.5", + "@vbudovski/paseri": "npm:@jsr/vbudovski__paseri@0.1.16", "ajv": "8.17.1", "arktype": "2.0.0-dev.12-cjs", "banditypes": "0.2.5", @@ -37,6 +38,7 @@ "computed-types": "1.11.2", "csv-stringify": "6.5.2", "decoders": "1.25.5", + "esbuild": "0.24.2", "fp-ts": "2.16.9", "io-ts": "2.2.22", "jet-schema": "1.4.3", @@ -2221,6 +2223,406 @@ "effect": "^3.9.2" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -3586,6 +3988,28 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/@vbudovski/paseri": { + "name": "@jsr/vbudovski__paseri", + "version": "0.1.16", + "resolved": "https://npm.jsr.io/~/11/@jsr/vbudovski__paseri/0.1.16.tgz", + "integrity": "sha512-sAI+zFjipl0UvmNO6r/UACCt0tDJwZyOC0KkjiIK0hpWk88udK0hTy1TrjBFnv+EXhz9OUqK8ZuP+Uy7YAV8SQ==", + "dependencies": { + "regex": "^5.1.1", + "type-fest": "4.30.0" + } + }, + "node_modules/@vbudovski/paseri/node_modules/type-fest": { + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.30.0.tgz", + "integrity": "sha512-G6zXWS1dLj6eagy6sVhOMQiLtJdxQBHIA9Z6HFUNLOlr6MFOgzV8wvmidtPONfPtEUv0uZsy77XJNzTAfwPDaA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@zeit/schemas": { "version": "2.36.0", "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz", @@ -5509,6 +5933,46 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -6339,11 +6803,12 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -6396,9 +6861,10 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -9222,6 +9688,21 @@ "@babel/runtime": "^7.8.4" } }, + "node_modules/regex": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz", + "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -12997,6 +13478,156 @@ "fast-check": "^3.21.0" } }, + "@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "optional": true + }, + "@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "optional": true + }, + "@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "optional": true + }, "@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -14057,6 +14688,22 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "@vbudovski/paseri": { + "version": "npm:@jsr/vbudovski__paseri@0.1.16", + "resolved": "https://npm.jsr.io/~/11/@jsr/vbudovski__paseri/0.1.16.tgz", + "integrity": "sha512-sAI+zFjipl0UvmNO6r/UACCt0tDJwZyOC0KkjiIK0hpWk88udK0hTy1TrjBFnv+EXhz9OUqK8ZuP+Uy7YAV8SQ==", + "requires": { + "regex": "^5.1.1", + "type-fest": "4.30.0" + }, + "dependencies": { + "type-fest": { + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.30.0.tgz", + "integrity": "sha512-G6zXWS1dLj6eagy6sVhOMQiLtJdxQBHIA9Z6HFUNLOlr6MFOgzV8wvmidtPONfPtEUv0uZsy77XJNzTAfwPDaA==" + } + } + }, "@zeit/schemas": { "version": "2.36.0", "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz", @@ -15381,6 +16028,38 @@ "is-arrayish": "^0.2.1" } }, + "esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "requires": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, "escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -15960,9 +16639,9 @@ "dev": true }, "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "optional": true }, @@ -15995,9 +16674,9 @@ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" }, "get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", "requires": { "resolve-pkg-maps": "^1.0.0" } @@ -18047,6 +18726,19 @@ "@babel/runtime": "^7.8.4" } }, + "regex": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz", + "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==", + "requires": { + "regex-utilities": "^2.3.0" + } + }, + "regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==" + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", diff --git a/package.json b/package.json index 18c4e9f0f..888bafff0 100644 --- a/package.json +++ b/package.json @@ -8,11 +8,12 @@ "email": "rf@romanfilippov.com" }, "version": "1.0.0", + "type": "module", "scripts": { "lint": "gts check", "lint:fix": "gts fix", - "start": "ts-node index.ts", - "test:build": "npm run compile:spectypes && npm run compile:ts-runtime-checks && npm run compile:typebox && npm run compile:typia && npm run compile:deepkit && npm run compile:ts-auto-guard && tsc --noEmit", + "start": "NODE_OPTIONS=\"--loader=ts-node/esm\" ts-node index.ts", + "test:build": "npm run compile:spectypes && npm run compile:ts-runtime-checks && npm run compile:typebox && npm run compile:typia && npm run compile:deepkit && npm run compile:ts-auto-guard && npm run compile:jointz && tsc --noEmit", "test": "npm run compile:spectypes && npm run compile:ts-runtime-checks && npm run compile:typebox && npm run compile:typia && npm run compile:deepkit && npm run compile:ts-auto-guard && jest", "docs:serve": "serve docs", "docs:watch": "tsc --project tsconfig.docs.json --watch --preserveWatchOutput & serve docs", @@ -20,9 +21,10 @@ "compile:deepkit": "deepkit-type-install && rimraf cases/deepkit/build && tsc -p cases/deepkit/tsconfig.json", "compile:spectypes": "rimraf cases/spectypes/build && tsc -p cases/spectypes/src && babel cases/spectypes/src --out-dir cases/spectypes/build --extensions \".ts\"", "compile:ts-runtime-checks": "rimraf cases/ts-runtime-checks/build && tsc -p cases/ts-runtime-checks/src", - "compile:typebox": "ts-node cases/typebox/index.ts cases/typebox/build", + "compile:typebox": "NODE_OPTIONS=\"--loader=ts-node/esm\" ts-node cases/typebox/index.ts cases/typebox/build", "compile:typia": "rimraf cases/typia/build && tsc -p cases/typia/tsconfig.json", "compile:ts-auto-guard": "rimraf cases/ts-auto-guard/build && ts-auto-guard --project cases/ts-auto-guard/tsconfig.json && tsc -p cases/ts-auto-guard/tsconfig.json", + "compile:jointz": "rimraf cases/jointz/build && tsc -p cases/jointz/tsconfig.json && esbuild cases/jointz/src/index.ts --bundle --outfile=cases/jointz/build/index.js --platform=neutral", "prepare": "ts-patch install", "download-packages-popularity": "ts-node download-packages-popularity.ts" }, @@ -42,6 +44,7 @@ "@toi/toi": "1.3.0", "@typeofweb/schema": "0.7.3", "@types/benchmark": "2.1.5", + "@vbudovski/paseri": "npm:@jsr/vbudovski__paseri@0.1.16", "ajv": "8.17.1", "arktype": "2.0.0-dev.12-cjs", "banditypes": "0.2.5", @@ -55,6 +58,7 @@ "computed-types": "1.11.2", "csv-stringify": "6.5.2", "decoders": "1.25.5", + "esbuild": "0.24.2", "fp-ts": "2.16.9", "io-ts": "2.2.22", "jet-schema": "1.4.3", diff --git a/test/benchmarks.test.ts b/test/benchmarks.test.ts index 18bec2ee5..cf6800912 100644 --- a/test/benchmarks.test.ts +++ b/test/benchmarks.test.ts @@ -23,6 +23,7 @@ import '../cases/ok-computer'; import '../cases/parse-dont-validate'; import '../cases/pure-parse'; import '../cases/purify-ts'; +import '../cases/paseri'; import '../cases/r-assign'; import '../cases/rescript-schema'; import '../cases/rulr'; diff --git a/tsconfig.json b/tsconfig.json index 289a1ee89..f4c058339 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,15 @@ { "extends": "tsconfigs/nodejs-module", "compilerOptions": { + "moduleResolution": "Bundler", + "module": "ESNext", "lib": ["ES2021", "DOM"], "target": "ES2021", "experimentalDecorators": true, "emitDecoratorMetadata": true, "resolveJsonModule": true, - "skipLibCheck": true + "skipLibCheck": true, + "allowImportingTsExtensions": true }, "include": ["**/*.ts"] }