| import type { ParsedUrlQuery } from 'querystring' | |
| import { searchParamsToUrlQuery } from './querystring' | |
| import { parseRelativeUrl } from './parse-relative-url' | |
| export interface ParsedUrl { | |
| auth: string | null | |
| hash: string | |
| hostname: string | null | |
| href: string | |
| origin?: string | null | |
| pathname: string | |
| port: string | null | |
| protocol: string | null | |
| query: ParsedUrlQuery | |
| search: string | |
| slashes: boolean | null | |
| } | |
| export function parseUrl(url: string): ParsedUrl { | |
| if (url.startsWith('/')) { | |
| return parseRelativeUrl(url) | |
| } | |
| const parsedURL = new URL(url) | |
| const username = parsedURL.username | |
| const password = parsedURL.password | |
| const auth = username | |
| ? password | |
| ? `${username}:${password}` | |
| : username | |
| : null | |
| const pathname = parsedURL.pathname | |
| const search = parsedURL.search | |
| return { | |
| auth, | |
| hash: parsedURL.hash, | |
| hostname: parsedURL.hostname, | |
| href: parsedURL.href, | |
| pathname, | |
| port: parsedURL.port, | |
| protocol: parsedURL.protocol, | |
| query: searchParamsToUrlQuery(parsedURL.searchParams), | |
| search, | |
| origin: parsedURL.origin, | |
| slashes: | |
| parsedURL.href.slice( | |
| parsedURL.protocol.length, | |
| parsedURL.protocol.length + 2 | |
| ) === '//', | |
| } | |
| } | |