12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- import {isUrl} from './minurl.shared.js'
- export {isUrl} from './minurl.shared.js'
- // See: <https://github.com/nodejs/node/blob/6a3403c/lib/internal/url.js>
- /**
- * @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)
- }
|