From 791e6bc530a3b0261620613abb99925350737d8a Mon Sep 17 00:00:00 2001 From: Ido Bouskila Date: Sun, 18 Aug 2024 00:18:38 +0300 Subject: [PATCH] feat(schema): support object schema validations --- src/index.ts | 25 ++++++++++++++++++++++++- src/validations.ts | 8 ++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index e85ee53..9cae8ff 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,30 @@ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ -import { ensureNumber, ensureString, ensureNumberSize, ensureStringLength } from './validations'; +import type { ReadableObjectType } from './utils/types'; +import { ensureNumber, ensureString, ensureNumberSize, ensureStringLength, ensureObject } from './validations'; + +type AnySchemaObject = { + parse: (value: unknown) => TReturn; +} & Record; const i = { + object: >>(schema: T) => { + type ParsedSchema = ReadableObjectType<{ + [K in keyof T]: ReturnType + }>; + + return { + parse: (value: unknown) => { + const parsedValue = ensureObject(value); + + return (Object.keys(schema) as Array).reduce((acc, key) => { + acc[key] = schema[key]?.parse(parsedValue[key as string]); + + return acc; + // eslint-disable-next-line @typescript-eslint/prefer-reduce-type-parameter + }, {} as ParsedSchema) + } + } + }, number: function () { const parsers = new Set<(value: unknown) => number>(); diff --git a/src/validations.ts b/src/validations.ts index 061b768..0d81a5c 100644 --- a/src/validations.ts +++ b/src/validations.ts @@ -1,5 +1,13 @@ import { throwSizeError, throwTypeError } from './validationExceptions'; +export const ensureObject = (value: unknown): Record => { + if (typeof value === "object" && ! Array.isArray(value) && value !== null) { + return value; + } + + return throwTypeError(value, 'object'); +}; + export const ensureNumber = (value: unknown): number => { if (typeof value !== 'number') { return throwTypeError(value, 'number');