///
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