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