import {isUrl} from './minurl.shared.js' export {isUrl} from './minurl.shared.js' // See: /** * @param {URL | string} path * File URL. * @returns {string} * File URL. */ 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) } /** * Get a path from a POSIX URL. * * @param {URL} url * URL. * @returns {string} * File path. */ 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.codePointAt(index) === 37 /* `%` */ && pathname.codePointAt(index + 1) === 50 /* `2` */ ) { const third = pathname.codePointAt(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) }