Install using npm or yarn:
npm i ufo
# or
yarn add ufo
Import:
// CommonJS
const { normalizeURL, joinURL } = require('ufo')
// ESM
import { normalizeURL, joinURL } from 'ufo'
// Deno
import { parseURL } from 'https://unpkg.com/ufo/dist/index.mjs'
undefinedNotice: You may need to transpile package and add URL polyfill for legacy environments
normalizeURL
// Result: test?query=123%20123#hash,%20test
normalizeURL('test?query=123 123#hash, test')
// Result: http://localhost:3000/
normalizeURL('http://localhost:3000')
joinURL// Result: a/b/c
joinURL('a', '/b', '/c')
resolveURL// Result: http://foo.com/foo/bar/baz?test=123#token
resolveURL('http://foo.com/foo?test=123#token', 'bar', 'baz')
parseURL// Result: { protocol: 'http:', auth: '', host: 'foo.com', pathname: '/foo', search: '?test=123', hash: '#token' }
parseURL('http://foo.com/foo?test=123#token')
// Result: { pathname: 'foo.com/foo', search: '?test=123', hash: '#token' }
parseURL('foo.com/foo?test=123#token')
// Result: { protocol: 'https:', auth: '', host: 'foo.com', pathname: '/foo', search: '?test=123', hash: '#token' }
parseURL('foo.com/foo?test=123#token', 'https://')
withQuery// Result: /foo?page=a&token=secret
withQuery('/foo?page=a', { token: 'secret' })
getQuery// Result: { test: '123', unicode: '好' }
getQuery('http://foo.com/foo?test=123&unicode=%E5%A5%BD')
$URLImplementing URL interface with some improvements:
protocol, host, auth, pathname, query, hash)withTrailingSlashEnsures url ends with a trailing slash
// Result: /foo/
withTrailingSlash('/foo')
// Result: /path/?query=true
withTrailingSlash('/path?query=true', true)
withoutTrailingSlashEnsures url does not ends with a trailing slash
// Result: /foo
withoutTrailingSlash('/foo/')
// Result: /path?query=true
withoutTrailingSlash('/path/?query=true', true)
cleanDoubleSlashesEnsures url does not have double slash (except for protocol)
// Result: /foo/bar/
cleanDoubleSlashes('//foo//bar//')
// Result: http://example.com/analyze/http://localhost:3000/
cleanDoubleSlashes('http://example.com/analyze//http://localhost:3000//')
isSamePathCheck two paths are equal or not. Trailing slash and encoding are normalized before comparation.
// Result: true
isSamePath('/foo', '/foo/')
isRelativeCheck if a path starts with ./ or ../.
// Result: true
isRelative('./foo')
withHttpEnsures url protocol is http
// Result: http://example.com
withHttp('https://example.com')
withHttpsEnsures url protocol is https
// Result: https://example.com
withHttps('http://example.com')
withProtocolChanges url protocol passed as second argument
// Result: ftp://example.com
withProtocol('http://example.com', 'ftp://')
withoutProtocolRemoves url protocol
// Result: example.com
withoutProtocol('http://example.com')
isEqualCompare two URLs regardless of their slash condition or encoding:
// Result: true
isEqual('/foo', 'foo')
isEqual('foo/', 'foo')
isEqual('/foo bar', '/foo%20bar')
// Strict compare
// Result: false
isEqual('/foo', 'foo', { leadingSlash: true })
isEqual('foo/', 'foo', { trailingSlash: true })
isEqual('/foo bar', '/foo%20bar', { encoding: true })
Special thanks to Eduardo San Martin Morote (posva) for encoding utlities
We use cookies
We use cookies to analyze traffic and improve your experience. You can accept or reject analytics cookies.