UNPKG

rwsdk

Version:

Build fast, server-driven webapps on Cloudflare with SSR, RSC, and realtime

28 lines (27 loc) 2.19 kB
import { Kysely } from "kysely"; import { AlterTableBuilder } from "./builders/alterTable"; import { CreateTableBuilder } from "./builders/createTable"; import { DropTableBuilder } from "./builders/dropTable"; import { SchemaBuilder } from "./builders/schema"; import { ExecutedBuilder, Prettify, ProcessAlteredTable, UnionToTuple } from "./utils"; export interface InferenceBuilder { schema: SchemaBuilder; } export type MigrationBuilder = InferenceBuilder & Kysely<any>; export interface Migration<TUpReturn = unknown> { up(db: MigrationBuilder): TUpReturn; down?(db: Kysely<any>): any; } export type Migrations = Record<string, Migration>; type GetBuilder<T> = T extends ExecutedBuilder<infer B> ? B : never; type BuildersFromMigration<TMigration extends Migration> = TMigration extends Migration<infer TUpReturn> ? Awaited<TUpReturn> extends Array<infer Item> ? GetBuilder<Item> : GetBuilder<Awaited<TUpReturn>> : never; type ApplyBuilder<TSchema, TBuilder> = TBuilder extends CreateTableBuilder<infer TName, infer TSch> ? Prettify<TSchema & Record<TName, TSch>> : TBuilder extends DropTableBuilder<infer TName> ? Omit<TSchema, TName> : TBuilder extends AlterTableBuilder<infer TName, infer TOps> ? TBuilder extends { __renamedFrom: infer From extends string; } ? From extends keyof TSchema ? Prettify<Omit<TSchema, From> & Record<TName, ProcessAlteredTable<TSchema[From], TOps>>> : TSchema : TName extends keyof TSchema ? Prettify<Omit<TSchema, TName> & Record<TName, ProcessAlteredTable<TSchema[TName], TOps>>> : TSchema : TSchema; type ApplyBuilders<TSchema, TBuildersTuple> = TBuildersTuple extends [ infer THead, ...infer TRest ] ? ApplyBuilders<ApplyBuilder<TSchema, THead>, TRest> : TSchema; type ProcessMigrations<TMigrations extends Migrations, TKeys, TSchema = {}> = TKeys extends [infer THeadKey, ...infer TRestKeys] ? THeadKey extends keyof TMigrations ? ProcessMigrations<TMigrations, TRestKeys, ApplyBuilders<TSchema, UnionToTuple<BuildersFromMigration<TMigrations[THeadKey]>>>> : TSchema : TSchema; export type Database<TMigrations extends Migrations = Migrations> = ProcessMigrations<TMigrations, UnionToTuple<keyof TMigrations>>; export {};