From 07b397edee4fe43751559b48e6c9411e3e01a2dd Mon Sep 17 00:00:00 2001 From: Sigurd Spieckermann Date: Fri, 21 Jan 2022 19:37:27 +0100 Subject: [PATCH] add runtime type-checker for bigint --- CHANGELOG.md | 2 ++ .../src/types/primitiveBased/primitives.ts | 27 +++++++++++++++++++ packages/lib/src/types/schemas.ts | 4 +++ packages/lib/src/types/types.ts | 4 +++ packages/lib/test/types/typeChecking.test.ts | 21 +++++++++++++++ packages/site/docs/runtimeTypeChecking.mdx | 4 +++ 6 files changed, 62 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78fc61da..598a24be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Change Log +- Added runtime type-checker for BigInt. + ## 0.64.1 - Fixed a typing issue related to models that use generics at multiple levels. diff --git a/packages/lib/src/types/primitiveBased/primitives.ts b/packages/lib/src/types/primitiveBased/primitives.ts index d084dcb7..d7195fe9 100644 --- a/packages/lib/src/types/primitiveBased/primitives.ts +++ b/packages/lib/src/types/primitiveBased/primitives.ts @@ -140,6 +140,33 @@ registerStandardTypeResolver((v) => (v === Number ? typesNumber : undefined)) */ export class NumberTypeInfo extends TypeInfo {} +/** + * A type that represents any BigInt value. + * + * ```ts + * types.bigint + * ``` + */ + export const typesBigInt: IdentityType = new TypeChecker( + TypeCheckerBaseType.Primitive, + + (value, path) => (typeof value === "bigint" ? null : new TypeCheckError(path, "bigint", value)), + + () => "bigint", + (t) => new BigIntTypeInfo(t), + + (value) => (typeof value === "bigint" ? (typesBigInt as any) : null), + identityFn, + identityFn +) as any + +registerStandardTypeResolver((v) => (v === BigInt ? typesBigInt : undefined)) + +/** + * `types.bigint` type info. + */ +export class BigIntTypeInfo extends TypeInfo {} + /** * A type that represents any string value. * diff --git a/packages/lib/src/types/schemas.ts b/packages/lib/src/types/schemas.ts index 2b0117ae..4e0c1324 100644 --- a/packages/lib/src/types/schemas.ts +++ b/packages/lib/src/types/schemas.ts @@ -74,6 +74,7 @@ export type AnyNonValueType = | ModelClass | StringConstructor | NumberConstructor + | BigIntConstructor | BooleanConstructor | AnyStandardType @@ -94,6 +95,9 @@ export type TypeToData = S extends ObjectTypeFunction : // Number S extends NumberConstructor ? number + : // BigInt + S extends BigIntConstructor + ? bigint : // Boolean S extends BooleanConstructor ? boolean diff --git a/packages/lib/src/types/types.ts b/packages/lib/src/types/types.ts index f78bb341..15878462 100644 --- a/packages/lib/src/types/types.ts +++ b/packages/lib/src/types/types.ts @@ -15,10 +15,12 @@ import { RecordTypeInfo, typesRecord } from "./objectBased/record" import { RefTypeInfo, typesRef } from "./objectBased/ref" import { typesEnum } from "./primitiveBased/enum" import { + BigIntTypeInfo, BooleanTypeInfo, LiteralTypeInfo, NumberTypeInfo, StringTypeInfo, + typesBigInt, typesBoolean, typesLiteral, typesNull, @@ -36,6 +38,7 @@ export { getTypeInfo } from "./getTypeInfo" export { TypeInfo } from "./TypeChecker" export type { ObjectTypeInfoProps, ModelTypeInfoProps } export { + BigIntTypeInfo, BooleanTypeInfo, LiteralTypeInfo, NumberTypeInfo, @@ -60,6 +63,7 @@ export const types = { null: typesNull, boolean: typesBoolean, number: typesNumber, + bigint: typesBigInt, string: typesString, or: typesOr, maybe: typesMaybe, diff --git a/packages/lib/test/types/typeChecking.test.ts b/packages/lib/test/types/typeChecking.test.ts index 7b49db16..447c143d 100644 --- a/packages/lib/test/types/typeChecking.test.ts +++ b/packages/lib/test/types/typeChecking.test.ts @@ -8,6 +8,7 @@ import { arraySet, ArraySetTypeInfo, ArrayTypeInfo, + BigIntTypeInfo, BooleanTypeInfo, customRef, Frozen, @@ -222,6 +223,26 @@ test("simple number", () => { expectValidTypeInfo(type, NumberTypeInfo) }) +test("bigint", () => { + const type = types.bigint + assert(_ as TypeToData, _ as bigint) + + expectTypeCheckOk(type, 6n) + expectTypeCheckFail(type, "ho", [], "bigint") + + expectValidTypeInfo(type, BigIntTypeInfo) +}) + +test("simple bigint", () => { + const type = BigInt + assert(_ as TypeToData, _ as bigint) + + expectTypeCheckOk(type, 6n) + expectTypeCheckFail(type, "ho", [], "bigint") + + expectValidTypeInfo(type, BigIntTypeInfo) +}) + test("string", () => { const type = types.string assert(_ as TypeToData, _ as string) diff --git a/packages/site/docs/runtimeTypeChecking.mdx b/packages/site/docs/runtimeTypeChecking.mdx index feb30d0b..1bd429b5 100644 --- a/packages/site/docs/runtimeTypeChecking.mdx +++ b/packages/site/docs/runtimeTypeChecking.mdx @@ -99,6 +99,10 @@ A type that represents any number value. A type that represents any integer number value. +### `types.bigint` / `BigInt` + +A type that represents any BigInt value. + ### `types.string` / `String` A type that represents any string value.