astro-ghostcms/.pnpm-store/v3/files/58/09000e2fd1777c4a74a6accdbba...

79 lines
1.8 KiB
Plaintext
Raw Normal View History

2024-02-14 14:10:47 +00:00
/// <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
* 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.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'