import { z } from 'zod'; import type { Logger } from '.'; import type { T_IO_RENDER_INPUT, T_IO_RESPONSE, T_IO_Schema, T_IO_METHOD_NAMES } from './ioSchema'; import { AnyComponentType, ComponentType, ComponentReturnValue } from './component'; export declare type IOPromiseConstructor> = (c: ComponentType) => IOPromise; export declare type IOComponentFunction> = (label: string, props?: z.input) => IOPromise; export declare type ExclusiveIOComponentFunction> = (label: string, props?: z.input) => ExclusiveIOPromise; export interface IOPromise> { component: ComponentType; then: Executor; getValue: (response: ComponentReturnValue) => Output; optional: () => OptionalIOPromise; groupable: true; } export interface OptionalIOPromise> extends Omit, 'optional' | 'then' | 'getValue'> { isOptional: true; getValue: (response: ComponentReturnValue | undefined) => Output | undefined; then: OptionalExecutor; } export declare type ExclusiveIOPromise> = Omit, 'groupable'>; interface ClientConfig { logger: Logger; send: (ioToRender: T_IO_RENDER_INPUT) => Promise; } export declare type IOErrorKind = 'CANCELED' | 'TRANSACTION_CLOSED'; export declare class IOError extends Error { kind: IOErrorKind; constructor(kind: IOErrorKind, message?: string); } export declare type Executor> = (resolve: (output: Output) => void, reject?: (err: IOError) => void) => void; export declare type OptionalExecutor> = (resolve: (output: Output | undefined) => void, reject?: (err: IOError) => void) => void; export declare type IOPromiseMap = { [MethodName in T_IO_METHOD_NAMES]: IOPromise; }; export declare type AnyIOPromise = IOPromiseMap[T_IO_METHOD_NAMES]; /** * Map of IOPromises that can be rendered in a group. */ declare type GroupIOPromiseMap = { [MethodName in T_IO_METHOD_NAMES]: T_IO_Schema[MethodName] extends { exclusive: z.ZodLiteral; } ? never : IOPromise; }; declare type GroupIOPromise = GroupIOPromiseMap[T_IO_METHOD_NAMES]; declare type OptionalGroupIOPromiseMap = { [MethodName in T_IO_METHOD_NAMES]: T_IO_Schema[MethodName] extends { exclusive: z.ZodLiteral; } ? never : OptionalIOPromise; }; declare type OptionalGroupIOPromise = OptionalGroupIOPromiseMap[T_IO_METHOD_NAMES]; declare type MaybeOptionalGroupIOPromise = GroupIOPromise | OptionalGroupIOPromise; export default function createIOClient(clientConfig: ClientConfig): { io: { group: (promiseInstances: PromiseInstances) => Promise<{ -readonly [Idx in keyof PromiseInstances]: PromiseInstances[Idx] extends GroupIOPromise ? ReturnType : PromiseInstances[Idx] extends OptionalGroupIOPromise ? ReturnType : PromiseInstances[Idx]; }>; confirm: ExclusiveIOComponentFunction<"CONFIRM", boolean>; input: { text: IOComponentFunction<"INPUT_TEXT", string>; boolean: IOComponentFunction<"INPUT_BOOLEAN", boolean>; number: IOComponentFunction<"INPUT_NUMBER", number>; email: IOComponentFunction<"INPUT_EMAIL", string>; richText: IOComponentFunction<"INPUT_RICH_TEXT", string>; }; select: { single: (label: string, props: Props) => IOPromise<"SELECT_SINGLE", Props["options"][0]>; multiple: (label: string, props: Props_1) => IOPromise<"SELECT_MULTIPLE", Props_1["options"]>; table: | undefined; href?: string | undefined; label: string; } | null | undefined> | {} | { data: Record | undefined; href?: string | undefined; label: string; } | null | undefined> | {}; key: string; })[]; }, "data" | "columns"> & { columns?: { label: string; render: (args_0: any, ...args_1: unknown[]) => string | number | boolean | Date | ({ value?: string | number | boolean | Date | null | undefined; label?: string | null | undefined; } & ({ href?: string | undefined; } | { action: string; params: Record; href: never; })) | null | undefined; }[] | undefined; data: (Record | undefined; href?: string | undefined; label: string; } | null | undefined> | {})[]; }>(label: string, props: Props_2) => IOPromise<"SELECT_TABLE", Props_2["data"]>; }; display: { heading: IOComponentFunction<"DISPLAY_HEADING", null>; markdown: IOComponentFunction<"DISPLAY_MARKDOWN", null>; link: IOComponentFunction<"DISPLAY_LINK", null>; object: IOComponentFunction<"DISPLAY_OBJECT", null>; table: | undefined; href?: string | undefined; label: string; } | null | undefined> | {} | { data: Record | undefined; href?: string | undefined; label: string; } | null | undefined> | {}; key: string; })[]; }, "data" | "columns"> & { columns?: { label: string; render: (args_0: any, ...args_1: unknown[]) => string | number | boolean | Date | ({ value?: string | number | boolean | Date | null | undefined; label?: string | null | undefined; } & ({ href?: string | undefined; } | { action: string; params: Record; href: never; })) | null | undefined; }[] | undefined; data: (Record | undefined; href?: string | undefined; label: string; } | null | undefined> | {})[]; }>(label: string, props: Props_3) => IOPromise<"DISPLAY_TABLE", null>; }; experimental: { progressThroughList: (label: string, items: T[], eachItemFn: (item: T) => Promise) => IOPromise<"DISPLAY_PROGRESS_THROUGH_LIST", null>; spreadsheet: ; }>(label: string, props: Props_4) => IOPromise<"INPUT_SPREADSHEET", { [key in keyof Props_4["columns"]]: z.TypeOf<{ number: z.ZodNumber; 'number?': z.ZodNullable; string: z.ZodString; 'string?': z.ZodNullable; boolean: z.ZodBoolean; 'boolean?': z.ZodNullable; }[Props_4["columns"][key]]>; }[]>; findAndSelectUser: (label: string, props: { userList: { email?: string | undefined; imageUrl?: string | undefined; id: string | number; name: string; }[]; } & { onSearch: (query: string) => Promise<{ email?: string | undefined; imageUrl?: string | undefined; id: string | number; name: string; }[]>; }) => IOPromise<"SELECT_USER", { email?: string | undefined; imageUrl?: string | undefined; id: string | number; name: string; }>; findAndSelect: & { initialOptions?: InputOptions | undefined; onSearch: (query: string) => Promise; }, OptionsLike extends { description?: string | null | undefined; imageUrl?: string | null | undefined; value: string; label: string; }[], InputOptions extends Awaited>>(label: string, props: Props_5) => IOPromise<"SELECT_SINGLE", Awaited>[0]>; date: (label: string, props?: Props_6 | undefined) => IOPromise<"INPUT_DATE", { year: number; month: number; day: number; jsDate: Date; }>; time: IOComponentFunction<"INPUT_TIME", { hour: number; minute: number; }>; datetime: (label: string, props?: Props_7 | undefined) => IOPromise<"INPUT_DATETIME", { year: number; month: number; day: number; hour: number; minute: number; jsDate: Date; }>; progress: { steps: IOComponentFunction<"DISPLAY_PROGRESS_STEPS", null>; indeterminate: IOComponentFunction<"DISPLAY_PROGRESS_INDETERMINATE", null>; }; }; }; isCanceled: () => boolean; onResponse: (result: T_IO_RESPONSE) => void; }; export declare type IOClient = ReturnType; export {};