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