npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

url-ops

v0.0.4

Published

🔗 Powerful and easy-to-use URL operations for Node.js developers with url-ops.

Downloads

35

Readme

cover npm version npm downloads bundle JSDocs License

🧑‍🤝‍🧑URL utils for humans. 🔗🚀 Powerful and easy-to-use URL operations for Node.js developers with url-ops. Simplify your URL manipulation with a collection of functions that ensures URLs are properly encoded, has consistent encoding, and supports relative URLs. The package provides a consistent URL parser, encoding, and decoding independent of environment and offers punycode support for host encoding. Normalize, resolve, and parse URLs with ease using url-ops.

Install

Install:

# nyxi
nyxi url-ops

# pnpm
pnpm add url-ops

# npm
npm i url-ops

# yarn
yarn add url-ops

Import:

// CommonJS
const { normalizeURL, joinURL } = require('url-ops')

// ESM
import { normalizeURL, joinURL } from 'url-ops'

// Deno
import { parseURL } from 'https://unpkg.com/url-ops/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
normalizeURL('test?query=123 123#hash, test')
// test?query=123%20123#hash,%20test

normalizeURL('http://localhost:3000')
// http://localhost:3000/

joinURL

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

resolveURL

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

parseURL

parseURL('http://foo.com/foo?test=123#token')
// { protocol: 'http:', auth: '', host: 'foo.com', pathname: '/foo', search: '?test=123', hash: '#token' }

parseURL('foo.com/foo?test=123#token')
// { pathname: 'foo.com/foo', search: '?test=123', hash: '#token' }

parseURL('foo.com/foo?test=123#token', 'https://')
// { protocol: 'https:', auth: '', host: 'foo.com', pathname: '/foo', search: '?test=123', hash: '#token' }

stringifyParsedURL

const obj = parseURL('http://foo.com/foo?test=123#token')
obj.host = 'bar.com'

stringifyParsedURL(obj)
// http://bar.com/foo?test=123#token

withQuery

withQuery('/foo?page=a', { token: 'secret' })
// /foo?page=a&token=secret

getQuery

getQuery('http://foo.com/foo?test=123&unicode=%E5%A5%BD')
// { test: '123', unicode: '好' }

$URL

Implementing URL interface with improvements:

  • Supporting schemeless and hostless URLs
  • Supporting relative URLs
  • Preserving trailing-slash status
  • Decoded and mutable class properties (protocol, host, auth, pathname, query, hash)
  • Consistent URL parser independent of environment
  • Consistent encoding independent of environment
  • Punycode support for host encoding
new $URL('http://localhost:3000/hello?world=true')
// { protocol: 'http:', host: 'localhost:3000', auth: '', pathname: '/hello', query: { world: 'true' }, hash: '' }

withTrailingSlash

Ensures url ends with a trailing slash.

withTrailingSlash('/foo')
// /foo/

Set the second option to true to support query parameters:

withTrailingSlash('/path?query=true', true)
// /path/?query=true

withoutTrailingSlash

Ensures url does not ends with a trailing slash.

withoutTrailingSlash('/foo/')
// /foo

Set the second option to true to support query parameters:

withoutTrailingSlash('/path/?query=true', true)
// /path?query=true

cleanDoubleSlashes

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

cleanDoubleSlashes('//foo//bar//')
// /foo/bar/

cleanDoubleSlashes('http://example.com/analyze//http://localhost:3000//')
// http://example.com/analyze/http://localhost:3000/

isSamePath

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

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

isRelative

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

isRelative('./foo')
// true

withHttp

Ensures url protocol is http

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

withHttps

Ensures url protocol is https

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

withProtocol

Changes url protocol passed as second argument

withProtocol('http://example.com', 'ftp://')
// ftp://example.com

withoutProtocol

Removes url protocol

withoutProtocol('http://example.com')
// example.com

isEqual

Compare two URLs regardless of their slash condition or encoding:

isEqual('/foo', 'foo')
// true
isEqual('foo/', 'foo')
// true
isEqual('/foo bar', '/foo%20bar')
// true

// Strict compare
isEqual('/foo', 'foo', { leadingSlash: true })
// false
isEqual('foo/', 'foo', { trailingSlash: true })
// false
isEqual('/foo bar', '/foo%20bar', { encoding: true })
// false

License

MIT - Made with 💞