From cc100d632c21f4fb1d63ba3f8d6d230b1b548d22 Mon Sep 17 00:00:00 2001 From: topchetoeu <36534413+TopchetoEU@users.noreply.github.com> Date: Thu, 29 Jun 2023 17:25:45 +0300 Subject: [PATCH] feat: add literals to schema converter --- src/server/decorators/schema.ts | 55 ++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/src/server/decorators/schema.ts b/src/server/decorators/schema.ts index 050cd5a..8ad8f1a 100644 --- a/src/server/decorators/schema.ts +++ b/src/server/decorators/schema.ts @@ -3,11 +3,15 @@ import { UUID } from "https://deno.land/x/mongo@v0.31.2/mod.ts"; import HttpError from "../HttpError.ts"; import { makeParameterModifier } from "../Router.ts"; -export type PrimitiveSchema = 'string' | 'number' | 'boolean' | 'uuid' | 'object'; -export type OptionalSchema = `${T}?`; +export type PrimitiveSchema = number | 'any' | 'undefined' | 'null' | 'string' | 'number' | 'boolean' | 'true' | 'false' | 'uuid' | 'object'; +export type OptionalSchema = `${T}?`; +export type LiteralSchema = `:${T}`; +export type OptionalLiteralSchema = `:${T}?`; export type ObjectSchema = { $optional?: boolean; } & { [key: string]: Schema }; export type OrSchema = [] | [Schema] | [Schema, Schema] | [Schema, Schema, Schema]; -export type Schema = 'any' | 'null' | PrimitiveSchema | OptionalSchema | OrSchema | ObjectSchema; +export type Schema = + PrimitiveSchema | OptionalSchema | OrSchema | ObjectSchema | + LiteralSchema | OptionalLiteralSchema; export type ObjectSchemaType = ({ [x in keyof T]: SchemaType }) | @@ -15,11 +19,17 @@ export type ObjectSchemaType = export type SchemaType = T extends 'any' ? any : T extends 'null' ? null : + T extends 'undefined' ? undefined : T extends 'string' ? string : T extends 'number' ? number : T extends 'boolean' ? boolean : T extends 'uuid' ? UUID : + T extends 'true' ? true : + T extends 'false' ? false : + T extends number ? T : T extends OptionalSchema ? SchemaType | undefined : + T extends LiteralSchema ? T : + T extends OptionalLiteralSchema ? T | undefined : T extends [] ? never : T extends [Schema] ? SchemaType : T extends [Schema, Schema] ? SchemaType | SchemaType : @@ -29,6 +39,7 @@ export type SchemaType = function stringify(desc: Schema): string { if (typeof desc === 'string') return desc; + if (typeof desc === 'number') return desc.toString(); if (desc instanceof Array) return desc.map(stringify).join(' | '); let res = '{ '; @@ -66,18 +77,28 @@ async function _convert(path: string[], val: unknown, desc: Schema): Promise