/// import type { AnySpiceflow, Spiceflow } from '../spiceflow.ts' import { SpiceflowFetchError } from './errors.ts' export type Prettify = { [K in keyof T]: T[K] } & {} export type IsNever = [T] extends [never] ? true : false type Files = File | FileList type ReplaceBlobWithFiles> = { [K in keyof RecordType]: RecordType[K] extends any ? RecordType[K] : RecordType[K] extends | Blob | Blob[] | { arrayBuffer: () => Promise } ? Files : RecordType[K] } & {} type And = A extends true ? B extends true ? true : false : false export type ReplaceGeneratorWithAsyncGenerator< in out RecordType extends Record, > = { [K in keyof RecordType]: RecordType[K] extends any ? RecordType[K] : RecordType[K] extends Generator ? And>, void extends B ? true : false> extends true ? AsyncGenerator : And, void extends B ? false : true> extends true ? B : AsyncGenerator | B : RecordType[K] extends AsyncGenerator ? And>, void extends B ? true : false> extends true ? AsyncGenerator : And, void extends B ? false : true> extends true ? B : AsyncGenerator | B : RecordType[K] } & {} type MaybeArray = T | T[] type MaybePromise = T | Promise export namespace SpiceflowClient { interface ClientParam { fetch?: RequestInit } export type Create = App extends { _types: { ClientRoutes: infer Schema extends Record } } ? Prettify> : 'Install latest Spiceflow before using the client, make sure both client and server use the same version. Make sure you passed the App type generic if using createSpiceflowClient' export type Sign> = { [K in keyof Route as K extends `:${string}` ? never : K]: Route[K] extends { request: infer Body // headers: infer Headers params: any query: infer Query response: infer Response extends Record } ? { headers?: Record } & (undefined extends Query ? { query?: Record } : { query: Query }) extends infer Param ? {} extends Param ? undefined extends Body ? K extends 'get' | 'head' ? ( options?: Prettify, ) => Promise< ClientResponse> > : ( request?: Body, options?: Prettify, ) => Promise< ClientResponse> > : ( request: Body extends Record ? ReplaceBlobWithFiles : Body, options?: Prettify, ) => Promise< ClientResponse> > : K extends 'get' | 'head' ? ( options: Prettify, ) => Promise< ClientResponse> > : ( request: Body extends Record ? ReplaceBlobWithFiles : Body, options: Prettify, ) => Promise< ClientResponse> > : never : CreateParams } type CreateParams> = Extract extends infer Path extends string ? IsNever extends true ? Prettify> : // ! DO NOT USE PRETTIFY ON THIS LINE, OTHERWISE FUNCTION CALLING WILL BE OMITTED (((params: { [param in Path extends `:${infer Param}` ? Param extends `${infer Param}?` ? Param : Param : never]: string | number }) => Prettify> & CreateParams) & Prettify>) & (Path extends `:${string}?` ? CreateParams : {}) : never export interface Config { // fetch?: Omit fetch?: typeof fetch state?: Record headers?: MaybeArray< | RequestInit['headers'] | ((path: string, options: RequestInit) => RequestInit['headers'] | void) > onRequest?: MaybeArray< (path: string, options: RequestInit) => MaybePromise > onResponse?: MaybeArray<(response: Response) => MaybePromise> retries?: number // keepDomain?: boolean } // type UnwrapAwaited> = { // [K in keyof T]: Awaited // } export type ClientResponse> = | { data: Res[200] error: null response: Response status: number headers: RequestInit['headers'] url: string } | { data: null error: Exclude extends never ? SpiceflowFetchError : { [Status in keyof Res]: SpiceflowFetchError }[Exclude] response: Response status: number headers: RequestInit['headers'] url: string } export interface OnMessage extends MessageEvent { data: Data rawData: MessageEvent['data'] } export type WSEvent< K extends keyof WebSocketEventMap, Data = unknown, > = K extends 'message' ? OnMessage : WebSocketEventMap[K] } export type Not = T extends true ? false : true