text: /// <reference lib="dom" />
  
  import {isUrl} from './minurl.shared.js'
  
  export {isUrl}
  
  // See: <https://github.com/nodejs/node/blob/fcf8ba4/lib/internal/url.js>
  
  /**
   * @param {string|URL} path
   */
  export function urlToPath(path) {
    if (typeof path === 'string') {
      path = new URL(path)
    } else if (!isUrl(path)) {
      /** @type {NodeJS.ErrnoException} */
      const error = new TypeError(
        'The "path" argument must be of type string or an instance of URL. Received `' +
          path +
          '`'
      )
      error.code = 'ERR_INVALID_ARG_TYPE'
      throw error
    }
  
    if (path.protocol !== 'file:') {
      /** @type {NodeJS.ErrnoException} */
      const error = new TypeError('The URL must be of scheme file')
      error.code = 'ERR_INVALID_URL_SCHEME'
      throw error
    }
  
    return getPathFromURLPosix(path)
  }
  
  /**
   * @param {URL} url
   */
  function getPathFromURLPosix(url) {
    if (url.hostname !== '') {
      /** @type {NodeJS.ErrnoException} */
      const error = new TypeError(
        'File URL host must be "localhost" or empty on darwin'
      )
      error.code = 'ERR_INVALID_FILE_URL_HOST'
      throw error
    }
  
    const pathname = url.pathname
    let index = -1
  
    while (++index < pathname.length) {
      if (
        pathname.charCodeAt(index) === 37 /* `%` */ &&
        pathname.charCodeAt(index + 1) === 50 /* `2` */
      ) {
        const third = pathname.charCodeAt(index + 2)
        if (third === 70 /* `F` */ || third === 102 /* `f` */) {
          /** @type {NodeJS.ErrnoException} */
          const error = new TypeError(
            'File URL path must not include encoded / characters'
          )
          error.code = 'ERR_INVALID_FILE_URL_PATH'
          throw error
        }
      }
    }
  
    return decodeURIComponent(pathname)
  }
  