next.js/packages/next/src/shared/lib/router/utils/parse-url.ts
parse-url.ts53 lines1.2 KB
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
      ) === '//',
  }
}
Quest for Codev2.0.0
/
SIGN IN