UNPKG

@fine-dev/fine-js

Version:

Javascript client for Fine BaaS

95 lines 5.14 kB
import { Fetch } from "./types"; /** Utility types for extracting stuff from the schema */ type Trim<S extends string> = S extends ` ${infer R}` | `${infer R} ` ? Trim<R> : S; type Split<S extends string, D extends string = ","> = S extends `${infer T}${D}${infer U}` ? [Trim<T>, ...Split<U, D>] : [Trim<S>]; type FilterKeys<T, L extends string[]> = L[number] extends keyof T ? L : never; type ExtractInvalidKeys<T, S extends string> = Exclude<Split<S>[number], keyof T>; type ExtractKeys<T, S extends string> = FilterKeys<T, Split<S>>[number]; type ExtractValues<T, S extends string> = ExtractKeys<T, S> extends never ? ParserError<`Invalid columns provided: ${ExtractInvalidKeys<T, S>}`> : { [K in Extract<ExtractKeys<T, S>, keyof T>]: T[K]; }; type ParserError<Message extends string> = { error: true; } & Message; type Table = Record<string, any>; export type GenericSchema = Record<string, Table>; type NotProvided = "NOT_PROVIDED"; type RTFromQuery<Query extends string, T extends Table> = Query extends NotProvided ? void : Query extends "*" ? T : ExtractValues<T, Query>; type ListOrSingle<T> = T | T[]; type QueryFilterBuilder<T extends Table, RT> = (builder: D1FilterBuilder<T, T>) => D1FilterBuilder<T, RT>; type MutationBuilderFn<T extends Table, RT = ParserError<"You must chain `select` to your query to receive results">> = (builder: D1FilterBuilder<T>) => D1FilterBuilder<T, RT>; export default class D1RestClient<Schema extends GenericSchema = GenericSchema> { private baseUrl; private headers; fetch: Fetch; constructor({ baseUrl, headers, fetch: customFetch }: { baseUrl: string; headers?: HeadersInit; fetch?: Fetch; }); table<TableName extends keyof Schema>(tableName: TableName): D1QueryBuilder<Schema[TableName]>; useQuery<TableName extends keyof Schema, RT = Schema[TableName]>(tableName: TableName, builderFn?: QueryFilterBuilder<Schema[TableName], RT>): { refetch: () => Promise<void>; data: Required<RT>[] | null; error: Error | null; isLoading: boolean; }; useInsert<TableName extends keyof Schema>(tableName: TableName): { insert: <Query extends string = "NOT_PROVIDED", RT = RTFromQuery<Query, Schema[TableName]>>(values: ListOrSingle<Schema[TableName]>, returns?: Query) => Promise<Error | (Query extends "NOT_PROVIDED" ? Promise<ParserError<"You must chain `select` to your query to receive results">> : RT[])>; error: Error | null; isLoading: boolean; }; useUpdate<TableName extends keyof Schema>(tableName: TableName): { update: <RT>(values: Partial<Schema[TableName]>, builderFn?: MutationBuilderFn<Schema[TableName], RT>) => Promise<Error | Required<RT>[] | undefined>; error: Error | null; isLoading: boolean; }; useDelete<TableName extends keyof Schema>(tableName: TableName): { deleteRecord: <RT>(builderFn: MutationBuilderFn<Schema[TableName], RT>) => Promise<Error | Required<RT>[] | undefined>; error: Error | null; isLoading: boolean; }; private useMutationState; } declare class D1QueryBuilder<T extends Table> { url: URL; headers: HeadersInit; fetch: Fetch; constructor(url: URL, { headers, fetch }: { headers?: HeadersInit; fetch: Fetch; }); select<Query extends string = "*", ResultType = Query extends "*" ? T : ExtractValues<T, Query>>(query?: Query): Omit<D1FilterBuilder<T, ResultType>, "select">; insert(values: T | T[]): D1FilterBuilder<T, ParserError<"You must chain `select` to your query to receive results">>; update(values: Partial<T>): D1FilterBuilder<T, ParserError<"You must chain `select` to your query to receive results">>; delete(): D1FilterBuilder<T, ParserError<"You must chain `select` to your query to receive results">>; } declare class D1FilterBuilder<T extends Table, ResultType = ParserError<"You must chain `select` to your query to receive results">> { url: URL; headers: HeadersInit; fetch: Fetch; method: "GET" | "POST" | "PATCH" | "DELETE"; body?: any; constructor({ url, headers, fetch, method, body }: { url: URL; headers: HeadersInit; fetch: Fetch; method: "GET" | "POST" | "PATCH" | "DELETE"; body?: any; }); eq<Col extends keyof T>(column: Col, value: T[Col]): this; neq<Col extends keyof T>(column: Col, value: T[Col]): this; gt<Col extends keyof T>(column: Col, value: T[Col]): this; lt<Col extends keyof T>(column: Col, value: T[Col]): this; like<Col extends keyof T>(column: Col, pattern: string): this; in<Col extends keyof T>(column: Col, values: T[Col][]): this; order(column: keyof T, { ascending }?: { ascending?: boolean | undefined; }): this; limit(count: number): this; offset(count: number): this; select<Query extends string = "*", RT = Query extends "*" ? T : ExtractValues<T, Query>>(query?: Query): D1FilterBuilder<T, RT>; then(resolve: (value: Required<ResultType>[]) => void, reject?: (reason?: any) => void): Promise<void>; } export {}; //# sourceMappingURL=d1.d.ts.map