import { AxiosAdapter } from 'axios';
import { GmXhrRequest } from 'vite-plugin-monkey/dist/client';

type SelectorOptions = {
    timeout?: number;
};
declare function querySelector<K extends keyof HTMLElementTagNameMap>(root: ParentNode, selectors: K, options?: SelectorOptions): Promise<HTMLElementTagNameMap[K] | null>;
declare function querySelector<K extends keyof SVGElementTagNameMap>(root: ParentNode, selectors: K, options?: SelectorOptions): Promise<SVGElementTagNameMap[K] | null>;
declare function querySelectorAll<K extends keyof HTMLElementTagNameMap>(root: ParentNode, selectors: K, options?: SelectorOptions): Promise<NodeListOf<HTMLElementTagNameMap[K]>>;
declare function querySelectorAll<K extends keyof SVGElementTagNameMap>(root: ParentNode, selectors: K, options?: SelectorOptions): Promise<NodeListOf<SVGElementTagNameMap[K]>>;

declare const gmAxiosAdapter: AxiosAdapter;

/**
 * simulate window.fetch with GM_xmlhttpRequest
 *
 * because [Request](https://developer.mozilla.org/en-US/docs/Web/API/Request) will delete [Forbidden_header_name](https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name)
 *
 * so you must manually modify these headers by set the second parameter of gmFetch
 * @example
 * gmFetch(
 *   new Request('https://www.pixiv.net/', {
 *     headers: { referer: 'https://www.pixiv.net/' }, // it will not work !!!
 *   }),
 * );
 * gmFetch(new Request('https://www.pixiv.net/'), {
 *   headers: { referer: 'https://www.pixiv.net/' }, // it will work
 *   headers: new Headers({ referer: 'https://www.pixiv.net/' }), // it will also work
 * });
 */
declare const gmFetch: (input: RequestInfo | URL, init?: RequestInit, xhrDetails?: Partial<GmXhrRequest<unknown, "blob">> | ((arg: GmXhrRequest<unknown, 'blob'>) => GmXhrRequest<unknown, 'blob'>)) => Promise<Response>;

declare const _TODO: undefined;

type FetchType = typeof fetch;
type IPromise<T = unknown> = Promise<T> | T;

type InterceptorChain = {
    request: Request;
    /**
     * @param request if not set, use chain.request
     */
    proceed: (request?: Request) => IPromise<Response>;
};
type FetchNetInterceptor = (chain: InterceptorChain) => IPromise<Response>;
type FetchInterceptorManager = {
    originalFetch: FetchType;
    fakeFetch: FetchType;
    use: (interceptor: FetchNetInterceptor) => number;
    eject: (id: number) => void;
    clear: () => void;
};
declare const buildFetchInterceptorManager: (originalFetch: FetchType) => FetchInterceptorManager;
declare const UnsafeWindowInterceptorManager: FetchInterceptorManager;

declare const buildXhrInterceptorManager: () => void;

export { FetchInterceptorManager, FetchNetInterceptor, InterceptorChain, SelectorOptions, UnsafeWindowInterceptorManager, _TODO, buildFetchInterceptorManager, buildXhrInterceptorManager, gmAxiosAdapter, gmFetch, querySelector, querySelectorAll };
