Urara-Blog/node_modules/.pnpm-store/v3/files/29/5936635be0dd02a125baf5c610e698755174dff4c093581ed88e380076eabe6efb07823a9eecd4aa4588bad7d0be493a402ca1db034462d4d2ffdc44b5e7a2
2022-08-14 01:14:53 +08:00

70 lines
1.7 KiB
Text

/// <reference lib="dom" />
import {isUrl} from './minurl.shared.js'
// 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)
}
export {isUrl} from './minurl.shared.js'