@elysiajs/eden
Version:
Fully type-safe Elysia client
115 lines (111 loc) • 5.41 kB
text/typescript
import { Elysia, InputSchema } from 'elysia';
import { P as Prettify, I as IsUnknown, M as MapError, a as IsNever, E as EdenFetchError } from './types-C41kuZ-K.mjs';
type Files = File | FileList;
type Replace<RecordType, TargetType, GenericType> = {
[K in keyof RecordType]: RecordType[K] extends TargetType ? GenericType : RecordType[K];
};
type MaybeArray$1<T> = T | T[];
declare namespace EdenTreaty {
export type Create<App extends Elysia<any, any, any, any, any, any, any>> = App extends {
_routes: infer Schema extends Record<string, unknown>;
} ? Prettify<Sign<Schema>> : 'Please install Elysia before using Eden';
export type Sign<Route extends Record<string, any>> = {
[K in keyof Route as K extends `:${string}` ? (string & {}) | number | K : K extends '' | '/' ? 'index' : K]: Route[K] extends {
body: infer Body;
headers: infer Headers;
query: infer Query;
params: unknown;
response: infer Response;
} ? K extends 'subscribe' ? undefined extends Route['query'] ? (params?: {
$query?: Record<string, string>;
}) => EdenWS<Route> : (params: {
$query: Route['query'];
}) => EdenWS<Route['subscribe']> : ((params: Prettify<{
$fetch?: RequestInit;
getRaw?: boolean;
$transform?: Transform;
} & (IsUnknown<Body> extends false ? Replace<Body, Blob | Blob[], Files> : {}) & (undefined extends Query ? {
$query?: Record<string, string>;
} : {
$query: Query;
}) & (undefined extends Headers ? {
$headers?: Record<string, unknown>;
} : {
$headers: Headers;
})>) => Promise<({
data: Response extends {
200: infer ReturnedType;
} ? Awaited<ReturnedType> : unknown;
error: null;
} | {
data: null;
error: Response extends Record<number, unknown> ? MapError<Response> extends infer Errors ? IsNever<Errors> extends true ? EdenFetchError<number, string> : Errors : EdenFetchError<number, string> : EdenFetchError<number, unknown>;
}) & {
status: number;
response: Response;
headers: Record<string, string>;
}>) extends (params: infer Params) => infer Response ? {
$params: undefined;
$headers: undefined;
$query: undefined;
} extends Params ? (params?: Params, options?: {
fetch?: RequestInit;
transform?: EdenTreaty.Transform<Response>;
query?: Params['query'];
headers?: Params['headers'];
}) => Response : (params: Params, options?: {
fetch?: RequestInit;
transform?: EdenTreaty.Transform<Response>;
query?: Params['query'];
headers?: Params['headers'];
}) => Response : never : Prettify<Sign<Route[K]>>;
};
type UnwrapPromise<T> = T extends Promise<infer A> ? A : T;
export type Transform<T = unknown> = MaybeArray$1<(response: unknown extends T ? {
data: any;
error: any;
response: Response;
status: number;
headers: Headers;
} : UnwrapPromise<T>) => UnwrapPromise<T> | void>;
export interface Config {
/**
* Default options to pass to fetch
*/
$fetch?: RequestInit;
fetcher?: typeof fetch;
transform?: Transform;
}
export type DetailedResponse = {
data: any;
error: any;
response: Response;
status: number;
headers: Headers;
};
export interface OnMessage<Data = unknown> extends MessageEvent {
data: Data;
rawData: MessageEvent['data'];
}
export type ExecuteOptions = {
getRaw?: boolean;
};
export type ExecuteReturnType<T extends ExecuteOptions> = T['getRaw'] extends true ? Response : DetailedResponse;
export type WSEvent<K extends keyof WebSocketEventMap, Data = unknown> = K extends 'message' ? OnMessage<Data> : WebSocketEventMap[K];
export { };
}
type MaybeArray<T> = T | T[];
declare class EdenWS<Schema extends InputSchema<any> = InputSchema> {
ws: WebSocket;
url: string;
constructor(url: string);
send(data: MaybeArray<Schema['body']>): this;
on<K extends keyof WebSocketEventMap>(type: K, listener: (event: EdenTreaty.WSEvent<K, Schema['response']>) => void, options?: boolean | AddEventListenerOptions): this;
off<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, options?: boolean | EventListenerOptions): this;
subscribe(onMessage: (event: EdenTreaty.WSEvent<'message', Schema['response']>) => void, options?: boolean | AddEventListenerOptions): this;
addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (event: EdenTreaty.WSEvent<K, Schema['response']>) => void, options?: boolean | AddEventListenerOptions): this;
removeEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, options?: boolean | EventListenerOptions): this;
close(): this;
}
declare const edenTreaty: <App extends Elysia<any, any, any, any, any, any, any>>(domain: string, config?: EdenTreaty.Config) => EdenTreaty.Create<App>;
export { EdenTreaty, EdenWS, edenTreaty };