I created parseUri v1 17 years ago, but never hosted it on GitHub/npm because it's older than both of those tools. Nevertheless, it’s been used very widely ever since due to it being tiny and predating JavaScript’s built-in URL constructor. After this short gap, I just released v2: github.com/slevithan/parseuri. It’s still tiny (nothing similar comes close, even with libraries that support far fewer URI parts, types, and edge cases), and it includes several advantages over URL:
parseUrigives you many additional properties (authority,userinfo,subdomain,domain,tld,resource,directory,filename,suffix) that are not available fromURL.URLthrows e.g. if not given a protocol, and in many other cases of valid (but not supported) and invalid URIs.parseUrimakes a best case effort even with partial or invalid URIs and is extremely good with edge cases.URL’s rules don’t allow correctly handling many non-web protocols. For example,URLdoesn’t throw on any of'git://localhost:1234','ssh://myid@192.168.1.101', or't2ab:///path/entry', but it also doesn’t get their details correct since it treats everything afterup to: ?or#as part of the pathname.parseUriincludes a “friendly” parsing mode (in addition to its default mode) that handles human-friendly URLs like'example.com/index.html'as expected.parseUriincludes partial/extensible support for second-level domains like in'//example.co.uk'.
Conversely, parseUri is single-purpose and doesn’t do normalization. But of course you can pass URIs through a normalizer separately, if you need that. Or, if you wanted to create an exceptionally lightweight URI normalizer, parseUri would be a great base to build on top of. 😊
So although it’s needed less often these days because of the built-in URL, if URL is ever not enough for your needs, this is an extremely accurate, flexible, and lightweight option.
Check it out!
- parseUri on GitHub
- The demo page lets you easily test and compare results
- Changelog
- Tests