import { type AsyncWritable } from '../utilities/asyncWritable.js'; type AsyncLoader = { loadAsync: (url: string, onProgress?: (event: ProgressEvent) => void) => Promise; }; type SyncLoader = { load: (url: string, onLoad: (data: any) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: unknown) => void) => unknown; }; export type Loader = AsyncLoader | SyncLoader; type LoaderProtoWithoutArgs = { new (): Loader; }; type LoaderProtoWithArgs = { new (...args: any[]): Loader; }; export type UseLoaderLoadInput = string | string[] | Record; type LoaderResultType = TLoader extends AsyncLoader ? Awaited> : TLoader extends SyncLoader ? Parameters[1] extends (data: infer Result) => void ? Result : never : never; export type UseLoaderLoadResult> = Input extends string ? AsyncWritable : Input extends string[] ? AsyncWritable : AsyncWritable>; type UseLoaderLoadTransform = (result: LoaderResultType) => any; export type UseLoaderLoadOptions = { onProgress?: (event: ProgressEvent) => void; transform?: UseLoaderLoadTransform; }; type ThrelteUseLoader = { loader: TLoader; load: | undefined, ResultType = Options extends UseLoaderLoadOptions ? Options['transform'] extends UseLoaderLoadTransform ? ReturnType : LoaderResultType : LoaderResultType>(input: Input, options?: Options) => UseLoaderLoadResult; clear: >(input: Input) => void; }; type UseLoaderOptionsWithoutArgs = { /** * A loader can be extended to add custom * functionality, e.g. add DRACO support. */ extend?: (loader: InstanceType) => void; /** * Arguments to pass to the loader. */ args?: ConstructorParameters; }; type UseLoaderOptionsWithArgs = { /** * A loader can be extended to add custom * functionality, e.g. add DRACO support. */ extend?: (loader: InstanceType) => void; /** * Arguments to pass to the loader. */ args: ConstructorParameters; }; export type UseLoaderOptions = ConstructorParameters extends [] ? UseLoaderOptionsWithoutArgs : undefined extends ConstructorParameters[0] ? UseLoaderOptionsWithoutArgs : UseLoaderOptionsWithArgs; export declare function useLoader(Proto: Proto, options?: UseLoaderOptions): ThrelteUseLoader>; export declare function useLoader(Proto: Proto, options: UseLoaderOptions): ThrelteUseLoader>; export {};