1declare module "url" {
2    import { ParsedUrlQuery, ParsedUrlQueryInput } from 'querystring';
3
4    // Input to `url.format`
5    interface UrlObject {
6        auth?: string | null;
7        hash?: string | null;
8        host?: string | null;
9        hostname?: string | null;
10        href?: string | null;
11        path?: string | null;
12        pathname?: string | null;
13        protocol?: string | null;
14        search?: string | null;
15        slashes?: boolean | null;
16        port?: string | number | null;
17        query?: string | null | ParsedUrlQueryInput;
18    }
19
20    // Output of `url.parse`
21    interface Url {
22        auth: string | null;
23        hash: string | null;
24        host: string | null;
25        hostname: string | null;
26        href: string;
27        path: string | null;
28        pathname: string | null;
29        protocol: string | null;
30        search: string | null;
31        slashes: boolean | null;
32        port: string | null;
33        query: string | null | ParsedUrlQuery;
34    }
35
36    interface UrlWithParsedQuery extends Url {
37        query: ParsedUrlQuery;
38    }
39
40    interface UrlWithStringQuery extends Url {
41        query: string | null;
42    }
43
44    function parse(urlStr: string): UrlWithStringQuery;
45    function parse(urlStr: string, parseQueryString: false | undefined, slashesDenoteHost?: boolean): UrlWithStringQuery;
46    function parse(urlStr: string, parseQueryString: true, slashesDenoteHost?: boolean): UrlWithParsedQuery;
47    function parse(urlStr: string, parseQueryString: boolean, slashesDenoteHost?: boolean): Url;
48
49    function format(URL: URL, options?: URLFormatOptions): string;
50    function format(urlObject: UrlObject | string): string;
51    function resolve(from: string, to: string): string;
52
53    function domainToASCII(domain: string): string;
54    function domainToUnicode(domain: string): string;
55
56    /**
57     * This function ensures the correct decodings of percent-encoded characters as
58     * well as ensuring a cross-platform valid absolute path string.
59     * @param url The file URL string or URL object to convert to a path.
60     */
61    function fileURLToPath(url: string | URL): string;
62
63    /**
64     * This function ensures that path is resolved absolutely, and that the URL
65     * control characters are correctly encoded when converting into a File URL.
66     * @param url The path to convert to a File URL.
67     */
68    function pathToFileURL(url: string): URL;
69
70    interface URLFormatOptions {
71        auth?: boolean;
72        fragment?: boolean;
73        search?: boolean;
74        unicode?: boolean;
75    }
76
77    class URL {
78        constructor(input: string, base?: string | URL);
79        hash: string;
80        host: string;
81        hostname: string;
82        href: string;
83        readonly origin: string;
84        password: string;
85        pathname: string;
86        port: string;
87        protocol: string;
88        search: string;
89        readonly searchParams: URLSearchParams;
90        username: string;
91        toString(): string;
92        toJSON(): string;
93    }
94
95    class URLSearchParams implements Iterable<[string, string]> {
96        constructor(init?: URLSearchParams | string | { [key: string]: string | string[] | undefined } | Iterable<[string, string]> | Array<[string, string]>);
97        append(name: string, value: string): void;
98        delete(name: string): void;
99        entries(): IterableIterator<[string, string]>;
100        forEach(callback: (value: string, name: string, searchParams: this) => void): void;
101        get(name: string): string | null;
102        getAll(name: string): string[];
103        has(name: string): boolean;
104        keys(): IterableIterator<string>;
105        set(name: string, value: string): void;
106        sort(): void;
107        toString(): string;
108        values(): IterableIterator<string>;
109        [Symbol.iterator](): IterableIterator<[string, string]>;
110    }
111}
112