bananas-commerce
Version:
A client for bananas-commerce with support for TypeScript
27 lines (26 loc) • 1.3 kB
TypeScript
import { Extension } from "./extension.js";
import { FetchConfig, OpenapiPaths } from "./deps/deno.land/x/openapi_ts_fetch@2.1.0/types.js";
interface FixedLengthArray<T extends unknown, L extends number> extends Array<T> {
0: T;
length: L;
}
type ConvertToTuple<T extends Extension<string, unknown, Record<string, unknown>>> = T extends {
name: infer Name;
} ? Name extends PropertyKey ? [Name, T] : never : never;
export type Client<T extends Extension<string, unknown, Record<string, unknown>>[]> = {
[K in ConvertToTuple<T[number]> as K[0]]: Omit<K[1], "name" | "load">;
};
type SpreadTuple<T extends readonly unknown[]> = T extends [
Extension<string, unknown, infer F>
] ? F : T extends [Extension<string, unknown, infer F>, ...infer R] ? F & SpreadTuple<R> : never;
export declare function generateClient<P, Paths extends OpenapiPaths<P>, N extends number, T extends FixedLengthArray<Extension<string, Paths, Record<string, unknown>>, N>>(options: {
config: SpreadTuple<T>;
} & FetchConfig & {
extensions: T;
}): Client<T>;
/**
* Middleware for `generateClient({ use: [ ...middleware ]})`.
* Must `return await next(url, init)` to properly wrap the request.
*/
export type Middleware = NonNullable<Parameters<typeof generateClient>[0]["use"]>[number];
export {};