0.1.1 #2

Merged
Thilawyn merged 47 commits from next into master 2024-01-17 20:47:13 +01:00
4 changed files with 52 additions and 26 deletions
Showing only changes of commit a68376485b - Show all commits

View File

@@ -1,36 +1,55 @@
import { AbstractClass } from "type-fest" import { AbstractClass, Class as ConcreteClass } from "type-fest"
import { z } from "zod" import { z } from "zod"
export type ClassType = "AbstractClass" | "Class"
type Class<
Type extends ClassType,
T,
Arguments extends unknown[] = any[],
> = (
Type extends "AbstractClass"
? AbstractClass<T, Arguments>
: Type extends "Class"
? ConcreteClass<T, Arguments>
: never
)
export type SchemableClass< export type SchemableClass<
SchemaT extends z.ZodRawShape, SchemaT extends z.ZodRawShape,
SchemaUnknownKeys extends z.UnknownKeysParam, SchemaUnknownKeys extends z.UnknownKeysParam,
SchemaCatchall extends z.ZodTypeAny, SchemaCatchall extends z.ZodTypeAny,
SchemaValues extends {},
DefaultValues extends Partial<SchemaValues>, Values extends {},
DefaultValues extends Partial<Values>,
Type extends ClassType = "AbstractClass"
> = ( > = (
AbstractClass< Class<
Type,
{ {
readonly schema: z.ZodObject< readonly schema: z.ZodObject<
SchemaT, SchemaT,
SchemaUnknownKeys, SchemaUnknownKeys,
SchemaCatchall, SchemaCatchall,
SchemaValues, Values,
SchemaValues Values
> >
readonly defaultValues: DefaultValues readonly defaultValues: DefaultValues
} & SchemaValues, } & Values,
Parameters<(values: SchemaValues) => void> Parameters<(values: Values) => never>
> & { > & {
readonly schema: z.ZodObject< readonly schema: z.ZodObject<
SchemaT, SchemaT,
SchemaUnknownKeys, SchemaUnknownKeys,
SchemaCatchall, SchemaCatchall,
SchemaValues, Values,
SchemaValues Values
> >
readonly defaultValues: DefaultValues readonly defaultValues: DefaultValues
@@ -39,12 +58,12 @@ export type SchemableClass<
export type SchemableClassInput< export type SchemableClassInput<
SchemaValues extends {}, Values extends {},
DefaultValues extends Partial<SchemaValues>, DefaultValues extends Partial<Values>,
> = { > = {
[Key in Exclude<keyof SchemaValues, keyof DefaultValues>]: SchemaValues[Key] [Key in Exclude<keyof Values, keyof DefaultValues>]: Values[Key]
} & { } & {
[Key in keyof DefaultValues]?: Key extends keyof SchemaValues [Key in keyof DefaultValues]?: Key extends keyof Values
? SchemaValues[Key] ? Values[Key]
: never : never
} }

View File

@@ -1,3 +1,4 @@
export * from "./SchemableClass" export * from "./SchemableClass"
export * from "./extendSchemableClass" export * from "./extendSchemableClass"
export * from "./makeSchemableClass" export * from "./makeSchemableClass"
export * from "./newSchemable"

View File

@@ -18,29 +18,34 @@ export const newSchemable = <
SchemaT, SchemaT,
SchemaUnknownKeys, SchemaUnknownKeys,
SchemaCatchall, SchemaCatchall,
SchemaValues, Values,
DefaultValues DefaultValues,
"Class"
>, >,
SchemaT extends z.ZodRawShape, SchemaT extends z.ZodRawShape,
SchemaUnknownKeys extends z.UnknownKeysParam, SchemaUnknownKeys extends z.UnknownKeysParam,
SchemaCatchall extends z.ZodTypeAny, SchemaCatchall extends z.ZodTypeAny,
SchemaValues extends {},
DefaultValues extends Partial<SchemaValues>, Values extends {},
DefaultValues extends Partial<Values>,
>( >(
class_: C | SchemableClass< class_: C | SchemableClass<
SchemaT, SchemaT,
SchemaUnknownKeys, SchemaUnknownKeys,
SchemaCatchall, SchemaCatchall,
SchemaValues, Values,
DefaultValues DefaultValues,
"Class"
>, >,
...[values, params]: NewSchemableArgs< ...[values, params]: NewSchemableArgs<
SchemableClassInput<SchemaValues, DefaultValues> SchemableClassInput<Values, DefaultValues>
> >
) => ) =>
new class_() new class_(
class_.schema.parse({ ...class_.defaultValues, ...values }, params)
) as InstanceType<C>
// export const newSchemablePromise = async < // export const newSchemablePromise = async <

View File

@@ -1,5 +1,5 @@
import { z } from "zod" import { z } from "zod"
import { SchemableClassInput, extendSchemableClass, makeSchemableClass, makeSchemableClassFrom } from "." import { SchemableClassInput, extendSchemableClass, makeSchemableClass, makeSchemableClassFrom, newSchemable } from "."
// class Test1 { // class Test1 {
@@ -33,7 +33,8 @@ new Test2({ prout: "ruquier", ruquier: 69 })
class Test3 extends Test2 { class Test3 extends Test2 {
} }
console.log(new Test3({ prout: "ruquier", ruquier: 69 }))
type Test = SchemableClassInput<z.output<typeof Test3.schema>, typeof Test3.defaultValues> type Test = SchemableClassInput<z.output<typeof Test3.schema>, typeof Test3.defaultValues>
const test3inst = newSchemable(Test3, { ruquier: 48 })
console.log(test3inst)