Skip to content

ivanryndyuk/ufo

 
 

Repository files navigation

npm version npm downloads Github Actions Codecov bundle

👽 ufo

Install

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'

Notice: You may need to transpile package and add URL polyfill for legacy environments

Usage

normalizeURL

  • Ensures URL is properly encoded
  • Ensures pathname starts with slash
  • Preserves protocol/host if provided
// Result: test?query=123%20123#hash,%20test
normalizeURL('test?query=123 123#hash, test')

// Result: https://localhost:3000/
normalizeURL('https://localhost:3000')

joinURL

// Result: a/b/c
joinURL('a', '/b', '/c')

resolveURL

// Result: https://foo.com/foo/bar/baz?test=123#token
resolveURL('https://foo.com/foo?test=123#token', 'bar', 'baz')

parseURL

// Result: { protocol: 'http:', auth: '', host: 'foo.com', pathname: '/foo', search: '?test=123', hash: '#token' }
parseURL('https://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('https://foo.com/foo?test=123&unicode=%E5%A5%BD')

$URL

Implementing URL interface with some improvements:

  • Supporting schemeless and hostless URLs
  • Supporting relative URLs
  • Preserving trailing-slash status
  • Decoded and mutable classs properties (protocol, host, auth, pathname, query, hash)
  • Consistent URL parser independent of environment
  • Consistent encoding independent of environment
  • Punycode support for host encoding

withTrailingSlash

Ensures url ends with a trailing slash

// Result: /foo/
withTrailingSlash('/foo')
// Result: /path/?query=true
withTrailingSlash('/path?query=true', true)

withoutTrailingSlash

Ensures url does not ends with a trailing slash

// Result: /foo
withoutTrailingSlash('/foo/')
// Result: /path?query=true
withoutTrailingSlash('/path/?query=true', true)

cleanDoubleSlashes

Ensures url does not have double slash (except for protocol)

// Result: /foo/bar/
cleanDoubleSlashes('//foo//bar//')
// Result: https://example.com/analyze/https://localhost:3000/
cleanDoubleSlashes('https://example.com/analyze//https://localhost:3000//')

isSamePath

Check two paths are equal or not. Trailing slash and encoding are normalized before comparation.

// Result: true
isSamePath('/foo', '/foo/')

isRelative

Check if a path starts with ./ or ../.

// Result: true
isRelative('./foo')

withHttp

Ensures url protocol is http

// Result: https://example.com
withHttp('https://example.com')

withHttps

Ensures url protocol is https

// Result: https://example.com
withHttps('https://example.com')

withProtocol

Changes url protocol passed as second argument

// Result: ftp:https://example.com
withProtocol('https://example.com', 'ftp:https://')

withoutProtocol

Removes url protocol

// Result: example.com
withoutProtocol('https://example.com')

isEqual

Compare 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 })

License

MIT

Special thanks to Eduardo San Martin Morote (posva) for encoding utlities

About

URL utils for humans

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 100.0%