Created
March 15, 2021 15:57
-
-
Save wallergoble/39988b6715122e2147ead31e2221d5da to your computer and use it in GitHub Desktop.
Mockydoodle
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { Primitive } from 'type-fest'; | |
type Resolver<T> = (...args: any) => T; | |
type AnyFunc = (...args: any[]) => any; | |
type ArrayType<T> = T extends Array<infer U> ? U : never; | |
export type Schema<T> = { | |
[P in keyof T]: P extends Primitive | |
? Resolver<T[P]> | |
: P extends Array<infer U> | |
? U extends Primitive | |
? Resolver<U> | |
: Schema<ArrayType<U>> | |
: Schema<T[P]>; | |
}; | |
export function builderBuilder<T extends { [key: string]: any }>( | |
schema: Schema<T>, | |
) { | |
return (seed?: Partial<T>) => { | |
if (seed) { | |
let res: Partial<T> = {}; | |
for (let key of Object.keys(schema)) { | |
// this not being seemless may be my least favorite thing about typescript | |
// @ts-ignore | |
res[key] = Object.keys(seed).includes(key) ? seed[key] : schema[key](); | |
} | |
return res as T; | |
} else { | |
return Object.entries(schema).reduce( | |
(acc, [key, resolver]) => ({ | |
...acc, | |
...{ [key]: resolver() }, | |
}), | |
{}, | |
) as T; | |
} | |
}; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { builderBuilder } from './builder' | |
type User = { | |
id: number; | |
name: string; | |
}; | |
let userSchema: Schema<User> = { | |
id: () => Math.floor(100000000 + Math.random() * 900000000), | |
name: () => ["Alex", "Waller", "Kyle"][Math.floor(Math.random() * 3)], | |
}; | |
let userBuilder = BuilderBuilder(userSchema); | |
let liz = userBuilder({ name: "Liz" }); | |
let randomUser = userBuilder(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment