From 84d3a3f1b8f0e8e0073cfa69ad3863a567fc7066 Mon Sep 17 00:00:00 2001 From: Johannes Lindgren <14206504+johannes-lindgren@users.noreply.github.com> Date: Sun, 15 Sep 2024 22:06:14 +0200 Subject: [PATCH 1/9] feat: add pure-parse --- README.md | 1 + cases/index.ts | 1 + cases/pure-parse.ts | 66 +++++++++++++++++++++++++++++++++++++++++ package-lock.json | 14 +++++++++ package.json | 1 + test/benchmarks.test.ts | 1 + 6 files changed, 84 insertions(+) create mode 100644 cases/pure-parse.ts diff --git a/README.md b/README.md index 4ac1390ec..8505c65cb 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ * [@mondrian-framework/model](https://mondrianframework.com) * [myzod](https://github.com/davidmdm/myzod) * [ok-computer](https://github.com/richardscarrott/ok-computer) +* [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) * [r-assign](https://github.com/micnic/r-assign) diff --git a/cases/index.ts b/cases/index.ts index 09c6e2a61..5a4dd8171 100644 --- a/cases/index.ts +++ b/cases/index.ts @@ -14,6 +14,7 @@ export const cases = [ 'myzod', 'ok-computer', 'parse-dont-validate', + 'pure-parse', 'purify-ts', 'r-assign', 'rescript-schema', diff --git a/cases/pure-parse.ts b/cases/pure-parse.ts new file mode 100644 index 000000000..654eee970 --- /dev/null +++ b/cases/pure-parse.ts @@ -0,0 +1,66 @@ +import { createCase } from '../benchmarks'; +import { object, isString, isNumber, isBoolean } from 'pure-parse'; + +createCase('pure-parse', 'parseSafe', () => + object({ + number: isNumber, + negNumber: isNumber, + maxNumber: isNumber, + string: isString, + longString: isString, + boolean: isBoolean, + deeplyNested: object({ + foo: isString, + num: isNumber, + bool: isBoolean, + }), + }) +); + +createCase('pure-parse', 'parseStrict', () => + object({ + number: isNumber, + negNumber: isNumber, + maxNumber: isNumber, + string: isString, + longString: isString, + boolean: isBoolean, + deeplyNested: object({ + foo: isString, + num: isNumber, + bool: isBoolean, + }), + }) +); + +createCase('pure-parse', 'assertLoose', () => + object({ + number: isNumber, + negNumber: isNumber, + maxNumber: isNumber, + string: isString, + longString: isString, + boolean: isBoolean, + deeplyNested: object({ + foo: isString, + num: isNumber, + bool: isBoolean, + }), + }) +); + +createCase('pure-parse', 'assertStrict', () => + object({ + number: isNumber, + negNumber: isNumber, + maxNumber: isNumber, + string: isString, + longString: isString, + boolean: isBoolean, + deeplyNested: object({ + foo: isString, + num: isNumber, + bool: isBoolean, + }), + }) +); diff --git a/package-lock.json b/package-lock.json index 0d3f38e41..6d25c2f0e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,6 +43,7 @@ "ok-computer": "1.0.4", "parse-dont-validate": "4.0.0", "preact": "10.23.1", + "pure-parse": "^0.0.0-beta.4", "purify-ts": "2.1.0", "r-assign": "1.9.0", "reflect-metadata": "0.2.2", @@ -8612,6 +8613,14 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, + "node_modules/pure-parse": { + "version": "0.0.0-beta.4", + "resolved": "https://registry.npmjs.org/pure-parse/-/pure-parse-0.0.0-beta.4.tgz", + "integrity": "sha512-CvBxyudjt706T+HEYjfysiqlCWi9sAsFLy4f+Tu1IN1qnn3vy13coqVP9063c0UYF95D5Wdq3uei635OK+pk+g==", + "workspaces": [ + "packages/*" + ] + }, "node_modules/pure-rand": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", @@ -17239,6 +17248,11 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, + "pure-parse": { + "version": "0.0.0-beta.4", + "resolved": "https://registry.npmjs.org/pure-parse/-/pure-parse-0.0.0-beta.4.tgz", + "integrity": "sha512-CvBxyudjt706T+HEYjfysiqlCWi9sAsFLy4f+Tu1IN1qnn3vy13coqVP9063c0UYF95D5Wdq3uei635OK+pk+g==" + }, "pure-rand": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", diff --git a/package.json b/package.json index a4fd4baa3..52ed5c53d 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "prepare": "ts-patch install" }, "dependencies": { + "pure-parse": "^0.0.0-beta.4", "@ailabs/ts-utils": "1.4.0", "@badrap/valita": "0.3.9", "@deepkit/core": "1.0.1-alpha.147", diff --git a/test/benchmarks.test.ts b/test/benchmarks.test.ts index 56ab8fcf6..b9ed35c39 100644 --- a/test/benchmarks.test.ts +++ b/test/benchmarks.test.ts @@ -18,6 +18,7 @@ import '../cases/mondrian-framework'; import '../cases/myzod'; import '../cases/ok-computer'; import '../cases/parse-dont-validate'; +import '../cases/pure-parse'; import '../cases/purify-ts'; import '../cases/r-assign'; import '../cases/rescript-schema'; From 33502667ec8410fede8c6f80c0c97a7eb5438cc2 Mon Sep 17 00:00:00 2001 From: Johannes Lindgren <14206504+johannes-lindgren@users.noreply.github.com> Date: Sun, 6 Oct 2024 02:16:44 +0200 Subject: [PATCH 2/9] feat: add pure-parse --- cases/pure-parse.ts | 104 ++++++++++++++++++-------------------------- 1 file changed, 43 insertions(+), 61 deletions(-) diff --git a/cases/pure-parse.ts b/cases/pure-parse.ts index 654eee970..c272243b1 100644 --- a/cases/pure-parse.ts +++ b/cases/pure-parse.ts @@ -1,66 +1,48 @@ import { createCase } from '../benchmarks'; -import { object, isString, isNumber, isBoolean } from 'pure-parse'; +import { object, parseString, parseNumber, parseBoolean } from 'pure-parse'; +// import { +// object as v_object, +// isString, +// isNumber, +// isBoolean, +// } from 'pure-parse/validate'; -createCase('pure-parse', 'parseSafe', () => - object({ - number: isNumber, - negNumber: isNumber, - maxNumber: isNumber, - string: isString, - longString: isString, - boolean: isBoolean, +createCase('pure-parse', 'parseSafe', () => { + const parseData = object({ + number: parseNumber, + negNumber: parseNumber, + maxNumber: parseNumber, + string: parseString, + longString: parseString, + boolean: parseBoolean, deeplyNested: object({ - foo: isString, - num: isNumber, - bool: isBoolean, + foo: parseString, + num: parseNumber, + bool: parseBoolean, }), - }) -); + }); + return (data: unknown) => { + const res = parseData(data); + if (res.tag === 'failure') { + throw new Error('parsing failed'); + } else { + return res.value; + } + }; +}); -createCase('pure-parse', 'parseStrict', () => - object({ - number: isNumber, - negNumber: isNumber, - maxNumber: isNumber, - string: isString, - longString: isString, - boolean: isBoolean, - deeplyNested: object({ - foo: isString, - num: isNumber, - bool: isBoolean, - }), - }) -); - -createCase('pure-parse', 'assertLoose', () => - object({ - number: isNumber, - negNumber: isNumber, - maxNumber: isNumber, - string: isString, - longString: isString, - boolean: isBoolean, - deeplyNested: object({ - foo: isString, - num: isNumber, - bool: isBoolean, - }), - }) -); - -createCase('pure-parse', 'assertStrict', () => - object({ - number: isNumber, - negNumber: isNumber, - maxNumber: isNumber, - string: isString, - longString: isString, - boolean: isBoolean, - deeplyNested: object({ - foo: isString, - num: isNumber, - bool: isBoolean, - }), - }) -); +// createCase('pure-parse', 'assertLoose', () => +// v_object({ +// number: isNumber, +// negNumber: isNumber, +// maxNumber: isNumber, +// string: isString, +// longString: isString, +// boolean: isBoolean, +// deeplyNested: v_object({ +// foo: isString, +// num: isNumber, +// bool: isBoolean, +// }), +// }) +// ); From dc2b4b3766ed51595b5537113ebb36b960a4dd84 Mon Sep 17 00:00:00 2001 From: Johannes Lindgren <14206504+johannes-lindgren@users.noreply.github.com> Date: Sat, 12 Oct 2024 22:34:39 +0200 Subject: [PATCH 3/9] feat: add unsafe assertion --- cases/pure-parse.ts | 93 ++++++++++++++++++++++++++------------------- 1 file changed, 54 insertions(+), 39 deletions(-) diff --git a/cases/pure-parse.ts b/cases/pure-parse.ts index c272243b1..c74baa00e 100644 --- a/cases/pure-parse.ts +++ b/cases/pure-parse.ts @@ -1,48 +1,63 @@ import { createCase } from '../benchmarks'; -import { object, parseString, parseNumber, parseBoolean } from 'pure-parse'; -// import { -// object as v_object, -// isString, -// isNumber, -// isBoolean, -// } from 'pure-parse/validate'; +import { + object, + objectGuard, + parseString, + parseNumber, + parseBoolean, + Parser, + memo, + isNumber, + isString, + isBoolean, +} from 'pure-parse'; -createCase('pure-parse', 'parseSafe', () => { - const parseData = object({ - number: parseNumber, - negNumber: parseNumber, - maxNumber: parseNumber, - string: parseString, - longString: parseString, - boolean: parseBoolean, - deeplyNested: object({ - foo: parseString, - num: parseNumber, - bool: parseBoolean, - }), - }); - return (data: unknown) => { - const res = parseData(data); +/** + * Given a PureParse parser, return a new parser that throws an error if parsing fails, and returns the value if parsing succeeds. + * @param parse + * @returns a parser that is compatible with `createCase` + */ +const tryParse = + (parse: Parser) => + (data: unknown): T => { + const res = parse(data); if (res.tag === 'failure') { throw new Error('parsing failed'); } else { return res.value; } }; -}); -// createCase('pure-parse', 'assertLoose', () => -// v_object({ -// number: isNumber, -// negNumber: isNumber, -// maxNumber: isNumber, -// string: isString, -// longString: isString, -// boolean: isBoolean, -// deeplyNested: v_object({ -// foo: isString, -// num: isNumber, -// bool: isBoolean, -// }), -// }) -// ); +createCase('pure-parse', 'parseSafe', () => + tryParse( + object({ + number: parseNumber, + negNumber: parseNumber, + maxNumber: parseNumber, + string: parseString, + longString: parseString, + boolean: parseBoolean, + deeplyNested: object({ + foo: parseString, + num: parseNumber, + bool: parseBoolean, + }), + }) + ) +); + +createCase('pure-parse', 'assertLoose', () => + objectGuard({ + number: isNumber, + negNumber: isNumber, + maxNumber: isNumber, + string: isString, + longString: isString, + boolean: isBoolean, + deeplyNested: objectGuard({ + foo: isString, + num: isNumber, + bool: isBoolean, + }), + }) +); From 63db401ad9a643e96c7f2a089b6186ec23681754 Mon Sep 17 00:00:00 2001 From: Johannes Lindgren <14206504+johannes-lindgren@users.noreply.github.com> Date: Sun, 13 Oct 2024 12:56:36 +0200 Subject: [PATCH 4/9] feat: differentiate between JIT and dynamic --- cases/pure-parse.ts | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/cases/pure-parse.ts b/cases/pure-parse.ts index c74baa00e..3324c9768 100644 --- a/cases/pure-parse.ts +++ b/cases/pure-parse.ts @@ -1,12 +1,13 @@ import { createCase } from '../benchmarks'; import { object, + objectNoEval, objectGuard, + objectGuardNoEval, parseString, parseNumber, parseBoolean, Parser, - memo, isNumber, isString, isBoolean, @@ -28,7 +29,7 @@ const tryParse = } }; -createCase('pure-parse', 'parseSafe', () => +createCase('pure-parse-(JIT)', 'parseSafe', () => tryParse( object({ number: parseNumber, @@ -46,7 +47,25 @@ createCase('pure-parse', 'parseSafe', () => ) ); -createCase('pure-parse', 'assertLoose', () => +createCase('pure-parse-(dynamic)', 'parseSafe', () => + tryParse( + objectNoEval({ + number: parseNumber, + negNumber: parseNumber, + maxNumber: parseNumber, + string: parseString, + longString: parseString, + boolean: parseBoolean, + deeplyNested: objectNoEval({ + foo: parseString, + num: parseNumber, + bool: parseBoolean, + }), + }) + ) +); + +createCase('pure-parse-(JIT)', 'assertLoose', () => objectGuard({ number: isNumber, negNumber: isNumber, @@ -61,3 +80,19 @@ createCase('pure-parse', 'assertLoose', () => }), }) ); + +createCase('pure-parse-(dynamic)', 'assertLoose', () => + objectGuardNoEval({ + number: isNumber, + negNumber: isNumber, + maxNumber: isNumber, + string: isString, + longString: isString, + boolean: isBoolean, + deeplyNested: objectGuardNoEval({ + foo: isString, + num: isNumber, + bool: isBoolean, + }), + }) +); From f0063816bd6671f809ee66ed0069d8f50542842e Mon Sep 17 00:00:00 2001 From: Johannes Lindgren <14206504+johannes-lindgren@users.noreply.github.com> Date: Sun, 13 Oct 2024 17:21:59 +0200 Subject: [PATCH 5/9] refactor: rename --- cases/pure-parse.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cases/pure-parse.ts b/cases/pure-parse.ts index 3324c9768..bada531ec 100644 --- a/cases/pure-parse.ts +++ b/cases/pure-parse.ts @@ -1,9 +1,9 @@ import { createCase } from '../benchmarks'; import { object, - objectNoEval, + objectNoJit, objectGuard, - objectGuardNoEval, + objectGuardNoJit, parseString, parseNumber, parseBoolean, @@ -49,14 +49,14 @@ createCase('pure-parse-(JIT)', 'parseSafe', () => createCase('pure-parse-(dynamic)', 'parseSafe', () => tryParse( - objectNoEval({ + objectNoJit({ number: parseNumber, negNumber: parseNumber, maxNumber: parseNumber, string: parseString, longString: parseString, boolean: parseBoolean, - deeplyNested: objectNoEval({ + deeplyNested: objectNoJit({ foo: parseString, num: parseNumber, bool: parseBoolean, @@ -82,14 +82,14 @@ createCase('pure-parse-(JIT)', 'assertLoose', () => ); createCase('pure-parse-(dynamic)', 'assertLoose', () => - objectGuardNoEval({ + objectGuardNoJit({ number: isNumber, negNumber: isNumber, maxNumber: isNumber, string: isString, longString: isString, boolean: isBoolean, - deeplyNested: objectGuardNoEval({ + deeplyNested: objectGuardNoJit({ foo: isString, num: isNumber, bool: isBoolean, From b84cc4ec737a242e9bfc7df8568610ef74fa482f Mon Sep 17 00:00:00 2001 From: Johannes Lindgren <14206504+johannes-lindgren@users.noreply.github.com> Date: Tue, 19 Nov 2024 17:43:41 +0100 Subject: [PATCH 6/9] fix: new version of pure-parse --- cases/pure-parse.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/cases/pure-parse.ts b/cases/pure-parse.ts index bada531ec..875f4e2f0 100644 --- a/cases/pure-parse.ts +++ b/cases/pure-parse.ts @@ -1,9 +1,9 @@ import { createCase } from '../benchmarks'; import { object, - objectNoJit, + objectCompiled, objectGuard, - objectGuardNoJit, + objectGuardCompiled, parseString, parseNumber, parseBoolean, @@ -31,14 +31,14 @@ const tryParse = createCase('pure-parse-(JIT)', 'parseSafe', () => tryParse( - object({ + objectCompiled({ number: parseNumber, negNumber: parseNumber, maxNumber: parseNumber, string: parseString, longString: parseString, boolean: parseBoolean, - deeplyNested: object({ + deeplyNested: objectCompiled({ foo: parseString, num: parseNumber, bool: parseBoolean, @@ -49,14 +49,14 @@ createCase('pure-parse-(JIT)', 'parseSafe', () => createCase('pure-parse-(dynamic)', 'parseSafe', () => tryParse( - objectNoJit({ + object({ number: parseNumber, negNumber: parseNumber, maxNumber: parseNumber, string: parseString, longString: parseString, boolean: parseBoolean, - deeplyNested: objectNoJit({ + deeplyNested: object({ foo: parseString, num: parseNumber, bool: parseBoolean, @@ -66,14 +66,14 @@ createCase('pure-parse-(dynamic)', 'parseSafe', () => ); createCase('pure-parse-(JIT)', 'assertLoose', () => - objectGuard({ + objectGuardCompiled({ number: isNumber, negNumber: isNumber, maxNumber: isNumber, string: isString, longString: isString, boolean: isBoolean, - deeplyNested: objectGuard({ + deeplyNested: objectGuardCompiled({ foo: isString, num: isNumber, bool: isBoolean, @@ -82,14 +82,14 @@ createCase('pure-parse-(JIT)', 'assertLoose', () => ); createCase('pure-parse-(dynamic)', 'assertLoose', () => - objectGuardNoJit({ + objectGuard({ number: isNumber, negNumber: isNumber, maxNumber: isNumber, string: isString, longString: isString, boolean: isBoolean, - deeplyNested: objectGuardNoJit({ + deeplyNested: objectGuard({ foo: isString, num: isNumber, bool: isBoolean, From def57b80335b72b7656e1441974cbe1f2ec5907c Mon Sep 17 00:00:00 2001 From: Johannes Lindgren <14206504+johannes-lindgren@users.noreply.github.com> Date: Sun, 24 Nov 2024 12:15:54 +0100 Subject: [PATCH 7/9] fix: pin version and include stric parsers --- cases/pure-parse.ts | 46 +++++++++++++++++++++++++++++++++++++++++---- package-lock.json | 15 ++++++++------- package.json | 2 +- 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/cases/pure-parse.ts b/cases/pure-parse.ts index 875f4e2f0..d167a86e8 100644 --- a/cases/pure-parse.ts +++ b/cases/pure-parse.ts @@ -11,6 +11,8 @@ import { isNumber, isString, isBoolean, + objectStrict, + objectStrictCompiled, } from 'pure-parse'; /** @@ -29,7 +31,7 @@ const tryParse = } }; -createCase('pure-parse-(JIT)', 'parseSafe', () => +createCase('pure-parse (JIT compiled)', 'parseSafe', () => tryParse( objectCompiled({ number: parseNumber, @@ -47,7 +49,7 @@ createCase('pure-parse-(JIT)', 'parseSafe', () => ) ); -createCase('pure-parse-(dynamic)', 'parseSafe', () => +createCase('pure-parse', 'parseSafe', () => tryParse( object({ number: parseNumber, @@ -65,7 +67,43 @@ createCase('pure-parse-(dynamic)', 'parseSafe', () => ) ); -createCase('pure-parse-(JIT)', 'assertLoose', () => +createCase('pure-parse', 'parseStrict', () => + tryParse( + objectStrict({ + number: parseNumber, + negNumber: parseNumber, + maxNumber: parseNumber, + string: parseString, + longString: parseString, + boolean: parseBoolean, + deeplyNested: objectStrict({ + foo: parseString, + num: parseNumber, + bool: parseBoolean, + }), + }) + ) +); + +createCase('pure-parse (JIT compiled)', 'parseStrict', () => + tryParse( + objectStrictCompiled({ + number: parseNumber, + negNumber: parseNumber, + maxNumber: parseNumber, + string: parseString, + longString: parseString, + boolean: parseBoolean, + deeplyNested: objectStrictCompiled({ + foo: parseString, + num: parseNumber, + bool: parseBoolean, + }), + }) + ) +); + +createCase('pure-parse (JIT compiled)', 'assertLoose', () => objectGuardCompiled({ number: isNumber, negNumber: isNumber, @@ -81,7 +119,7 @@ createCase('pure-parse-(JIT)', 'assertLoose', () => }) ); -createCase('pure-parse-(dynamic)', 'assertLoose', () => +createCase('pure-parse', 'assertLoose', () => objectGuard({ number: isNumber, negNumber: isNumber, diff --git a/package-lock.json b/package-lock.json index 6d25c2f0e..0f0e564c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "ok-computer": "1.0.4", "parse-dont-validate": "4.0.0", "preact": "10.23.1", - "pure-parse": "^0.0.0-beta.4", + "pure-parse": "0.0.0-beta.7", "purify-ts": "2.1.0", "r-assign": "1.9.0", "reflect-metadata": "0.2.2", @@ -8614,9 +8614,10 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "node_modules/pure-parse": { - "version": "0.0.0-beta.4", - "resolved": "https://registry.npmjs.org/pure-parse/-/pure-parse-0.0.0-beta.4.tgz", - "integrity": "sha512-CvBxyudjt706T+HEYjfysiqlCWi9sAsFLy4f+Tu1IN1qnn3vy13coqVP9063c0UYF95D5Wdq3uei635OK+pk+g==", + "version": "0.0.0-beta.7", + "resolved": "https://registry.npmjs.org/pure-parse/-/pure-parse-0.0.0-beta.7.tgz", + "integrity": "sha512-N4oek21bYr6ruPFYX3KFkFqJwVbr5SFpia0mItuEMQCZQFomMfp8t2tmtVYjzK/3sauUPNSKCwomtHdK6wKnow==", + "license": "MIT", "workspaces": [ "packages/*" ] @@ -17249,9 +17250,9 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "pure-parse": { - "version": "0.0.0-beta.4", - "resolved": "https://registry.npmjs.org/pure-parse/-/pure-parse-0.0.0-beta.4.tgz", - "integrity": "sha512-CvBxyudjt706T+HEYjfysiqlCWi9sAsFLy4f+Tu1IN1qnn3vy13coqVP9063c0UYF95D5Wdq3uei635OK+pk+g==" + "version": "0.0.0-beta.7", + "resolved": "https://registry.npmjs.org/pure-parse/-/pure-parse-0.0.0-beta.7.tgz", + "integrity": "sha512-N4oek21bYr6ruPFYX3KFkFqJwVbr5SFpia0mItuEMQCZQFomMfp8t2tmtVYjzK/3sauUPNSKCwomtHdK6wKnow==" }, "pure-rand": { "version": "6.1.0", diff --git a/package.json b/package.json index 52ed5c53d..4daf7f636 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "prepare": "ts-patch install" }, "dependencies": { - "pure-parse": "^0.0.0-beta.4", "@ailabs/ts-utils": "1.4.0", "@badrap/valita": "0.3.9", "@deepkit/core": "1.0.1-alpha.147", @@ -60,6 +59,7 @@ "ok-computer": "1.0.4", "parse-dont-validate": "4.0.0", "preact": "10.23.1", + "pure-parse": "0.0.0-beta.7", "purify-ts": "2.1.0", "r-assign": "1.9.0", "reflect-metadata": "0.2.2", From 28d2da25d2de3f3b349e40dd54aace445c41cb9f Mon Sep 17 00:00:00 2001 From: Johannes Lindgren <14206504+johannes-lindgren@users.noreply.github.com> Date: Sun, 24 Nov 2024 12:24:35 +0100 Subject: [PATCH 8/9] fix: linting --- cases/pure-parse.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cases/pure-parse.ts b/cases/pure-parse.ts index d167a86e8..e10084342 100644 --- a/cases/pure-parse.ts +++ b/cases/pure-parse.ts @@ -7,7 +7,7 @@ import { parseString, parseNumber, parseBoolean, - Parser, + type Parser, isNumber, isString, isBoolean, @@ -45,8 +45,8 @@ createCase('pure-parse (JIT compiled)', 'parseSafe', () => num: parseNumber, bool: parseBoolean, }), - }) - ) + }), + ), ); createCase('pure-parse', 'parseSafe', () => @@ -63,8 +63,8 @@ createCase('pure-parse', 'parseSafe', () => num: parseNumber, bool: parseBoolean, }), - }) - ) + }), + ), ); createCase('pure-parse', 'parseStrict', () => @@ -81,8 +81,8 @@ createCase('pure-parse', 'parseStrict', () => num: parseNumber, bool: parseBoolean, }), - }) - ) + }), + ), ); createCase('pure-parse (JIT compiled)', 'parseStrict', () => @@ -99,8 +99,8 @@ createCase('pure-parse (JIT compiled)', 'parseStrict', () => num: parseNumber, bool: parseBoolean, }), - }) - ) + }), + ), ); createCase('pure-parse (JIT compiled)', 'assertLoose', () => @@ -116,7 +116,7 @@ createCase('pure-parse (JIT compiled)', 'assertLoose', () => num: isNumber, bool: isBoolean, }), - }) + }), ); createCase('pure-parse', 'assertLoose', () => @@ -132,5 +132,5 @@ createCase('pure-parse', 'assertLoose', () => num: isNumber, bool: isBoolean, }), - }) + }), ); From 112f55519024f1744462b92e0c9b2ee88b47282b Mon Sep 17 00:00:00 2001 From: Johannes Lindgren <14206504+johannes-lindgren@users.noreply.github.com> Date: Sun, 24 Nov 2024 12:31:36 +0100 Subject: [PATCH 9/9] fix: tests --- cases/pure-parse.ts | 69 +++++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 24 deletions(-) diff --git a/cases/pure-parse.ts b/cases/pure-parse.ts index e10084342..6b7fb135b 100644 --- a/cases/pure-parse.ts +++ b/cases/pure-parse.ts @@ -8,6 +8,7 @@ import { parseNumber, parseBoolean, type Parser, + type Guard, isNumber, isString, isBoolean, @@ -31,6 +32,22 @@ const tryParse = } }; +/** + * Given a PureParse guard, return a new guard that throws an error if parsing fails, and returns the value if parsing succeeds. + * @param guard + * @returns a parser that is compatible with `createCase` + */ +const tryGuard = + (guard: Guard) => + (data: unknown): true => { + const isT = guard(data); + if (!isT) { + throw new Error('validation failed'); + } else { + return true; + } + }; + createCase('pure-parse (JIT compiled)', 'parseSafe', () => tryParse( objectCompiled({ @@ -104,33 +121,37 @@ createCase('pure-parse (JIT compiled)', 'parseStrict', () => ); createCase('pure-parse (JIT compiled)', 'assertLoose', () => - objectGuardCompiled({ - number: isNumber, - negNumber: isNumber, - maxNumber: isNumber, - string: isString, - longString: isString, - boolean: isBoolean, - deeplyNested: objectGuardCompiled({ - foo: isString, - num: isNumber, - bool: isBoolean, + tryGuard( + objectGuardCompiled({ + number: isNumber, + negNumber: isNumber, + maxNumber: isNumber, + string: isString, + longString: isString, + boolean: isBoolean, + deeplyNested: objectGuardCompiled({ + foo: isString, + num: isNumber, + bool: isBoolean, + }), }), - }), + ), ); createCase('pure-parse', 'assertLoose', () => - objectGuard({ - number: isNumber, - negNumber: isNumber, - maxNumber: isNumber, - string: isString, - longString: isString, - boolean: isBoolean, - deeplyNested: objectGuard({ - foo: isString, - num: isNumber, - bool: isBoolean, + tryGuard( + objectGuard({ + number: isNumber, + negNumber: isNumber, + maxNumber: isNumber, + string: isString, + longString: isString, + boolean: isBoolean, + deeplyNested: objectGuard({ + foo: isString, + num: isNumber, + bool: isBoolean, + }), }), - }), + ), );