Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/balazsbotond/urlcat
A URL builder library for JavaScript.
https://github.com/balazsbotond/urlcat
builder query-string querystring url
Last synced: 30 days ago
JSON representation
A URL builder library for JavaScript.
- Host: GitHub
- URL: https://github.com/balazsbotond/urlcat
- Owner: balazsbotond
- License: mit
- Created: 2020-09-15T20:55:10.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2024-04-13T01:19:44.000Z (7 months ago)
- Last Synced: 2024-04-14T15:24:36.243Z (7 months ago)
- Topics: builder, query-string, querystring, url
- Language: TypeScript
- Homepage: https://urlcat.org
- Size: 1.55 MB
- Stars: 1,806
- Watchers: 10
- Forks: 55
- Open Issues: 19
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
- awesome-list - urlcat
README
urlcat
Build correct URLs easily.
What? •
Why? •
How? •
TypeScript •
API •
Help •
Contribute## What?
*urlcat* is a tiny JavaScript library that makes building URLs very convenient and prevents common mistakes.
### Features
v3
v2
Latest version
Actively supported
legacy version
The same friendly API
Only one dependency
No dependencies
10.5KB minified and gzipped
0.8KB minified and gzipped
TypeScript types provided
## Why?
When I call an HTTP API, I usually need to add dynamic parameters to the URL:
~~~js
const API_URL = 'https://api.example.com/';function getUserPosts(id, blogId, limit, offset) {
const requestUrl = `${API_URL}/users/${id}/blogs/${blogId}/posts?limit=${limit}&offset=${offset}`;
// send HTTP request
}
~~~As you can see, this minimal example is already rather hard to read. It is also incorrect:
- I forgot that there was a trailing slash at the end of the `API_URL` constant so this resulted in a URL containing duplicate slashes (`https://api.example.com//users`).
- The embedded values need to be escaped using `encodeURIComponent`I can use the built-in `URL` class to prevent duplicate slashes and `URLSearchParams` to escape the query string. But I still need to escape all path parameters manually.
~~~js
const API_URL = 'https://api.example.com/';function getUserPosts(id, blogId, limit, offset) {
const escapedId = encodeURIComponent(id);
const escapedBlogId = encodeURIComponent(blogId);
const path = `/users/${escapedId}/blogs/${escapedBlogId}`;
const url = new URL(path, API_URL);
url.search = new URLSearchParams({ limit, offset });
const requestUrl = url.href;
// send HTTP request
}
~~~Such a simple task and yet very hard to read and tedious to write! This is where this tiny library can help you:
~~~js
const API_URL = 'https://api.example.com/';function getUserPosts(id, limit, offset) {
const requestUrl = urlcat(API_URL, '/users/:id/posts', { id, limit, offset });
// send HTTP request
}
~~~The library handles:
- escaping all parameters
- concatenating all parts (there will always be exactly one / and ? character between them)## How?
### Install
Currently, the package is distributed via npm. Zip downloads are also available since v3.0.0 (A CDN is coming soon).
```bash
npm install --save urlcat
```### Usage with Node (CommonJS/CJS)
Node 14 and above are officially supported, though you may have luck using it with an earlier Node version.
Since the code uses the `URL` and `URLSearchParams` classes internally, which aren't available below Node v10, the library is known not to work with those versions.To build full URLs (most common use case):
```ts
const urlcat = require('urlcat').default;
```To use any of the utility functions:
```ts
const { query, subst, join } = require('urlcat');
```To use all exported functions:
```ts
const { default: urlcat, query, subst, join } = require('urlcat');
```### Usage with Node (ES Module)
Starting with v3.1.0, urlcat supports ESM!
To build full URLs (most common use case):
```ts
import urlcat from 'urlcat';
```To use any of the utility functions:
```ts
import { query, subst, join } from 'urlcat';
```To use all exported functions:
```ts
import urlcat, { query, subst, join } from 'urlcat';
```### Usage with TypeScript
TypeScript 2.1 and above are officially supported.
To build full URLs (most common use case):
```ts
import urlcat from 'urlcat';
```To use any of the utility functions:
```ts
import { query, subst, join } from 'urlcat';
```To use all exported functions:
```ts
import urlcat, { query, subst, join } from 'urlcat';
```## TypeScript
This library provides its own type definitions. "It just works", no need to install anything from `@types`.
## API
### `ParamMap`: an object with string keys
```ts
type ParamMap = Record;
```For example, `{ firstParam: 1, 'second-param': 2 }` is a valid `ParamMap`.
### `urlcat`: build full URLs
```ts
function urlcat(baseUrl: string, pathTemplate: string, params: ParamMap): string
function urlcat(baseUrl: string, pathTemplate: string): string
function urlcat(baseTemplate: string, params: ParamMap): string
```#### Examples
-
urlcat('https://api.example.com', '/users/:id/posts', { id: 123, limit: 10, offset: 120 })
→'https://api.example.com/users/123/posts?limit=10&offset=120'
-
urlcat('http://example.com/', '/posts/:title', { title: 'Letters & "Special" Characters' })
→'http://example.com/posts/Letters%20%26%20%22Special%22%20Characters'
-
urlcat('https://api.example.com', '/users')
→'https://api.example.com/users'
-
urlcat('https://api.example.com/', '/users')
→'https://api.example.com/users'
-
urlcat('http://example.com/', '/users/:userId/posts/:postId/comments', { userId: 123, postId: 987, authorId: 456, limit: 10, offset: 120 })
→'http://example.com/users/123/posts/987/comments?authorId=456&limit=10&offset=120'
**NOTE about empty path segments:**
[RFC 3986](https://tools.ietf.org/html/rfc3986) allows empty path segments in URLs (for example, `https://example.com//users////2`). *urlcat* keeps any empty path segments that aren't at the concatenation boundary between `baseUrl` and `pathTemplate`. To include an empty path segment there are two options:
- use a double slash: `urlcat('https://example.com/', '//users', { q: 1 })` → `https://example.com//users?q=1`
- use the `baseTemplate` overload: `urlcat('https://example.com//users', { q: 1 })` → `https://example.com//users?q=1`
### `query`: build query strings
```ts
function query(params: ParamMap): string
```
Builds a query string using the key-value pairs specified. Keys and values are escaped, then joined by the `'&'` character.
#### Examples
params
result
{}
''
{ query: 'some text' }
'query=some%20text'
{ id: 42, 'comment-id': 86 }
'id=42&comment-id=86'
{ id: 42, 'a name': 'a value' }
'id=42&a%20name=a%20value'
### `subst`: substitute path parameters
```ts
function subst(template: string, params: ParamMap): string
```
Substitutes parameters with values in a template string. `template` may contain 0 or more parameter placeholders. Placeholders start with a colon (`:`), followed by a parameter name that can only contain uppercase or lowercase letters. Any placeholders found in the template are replaced with the value under the corresponding key in `params`.
#### Examples
template
params
result
':id'
{ id: 42 }
'42'
'/users/:id'
{ id: 42 }
'/users/42'
'/users/:id/comments/:commentId'
{ id: 42, commentId: 86 }
'/users/42/comments/86'
'/users/:id'
{ id: 42, foo: 'bar' }
'/users/42'
### `join`: join two strings using exactly one separator
```ts
function join(part1: string, separator: string, part2: string): string
```
Joins the two parts using exactly one separator. If a separator is present at the end of `part1` or the beginning of `part2`, it is removed, then the two parts are joined using `separator`.
#### Examples
part1
separator
part2
result
'first'
','
'second'
'first,second'
'first,'
','
'second'
'first'
','
',second'
'first,'
','
',second'
## Help
Thank you for using *urlcat*!
If you need any help using this library, feel free to [create a GitHub issue](https://github.com/balazsbotond/urlcat/issues/new/choose), and ask your questions. I'll try to answer as quickly as possible.
## Contribute
Contributions of any kind (pull requests, bug reports, feature requests, documentation, design) are more than welcome! If you like this project and want to help, but feel like you are stuck, feel free to contact the maintainer (Botond Balázs <[email protected]>).
### Building from source
Building the project should be quick and easy. If it isn't, it's the maintainer's fault. Please report any problems with building in a GitHub issue.
You need to have a reasonably recent version of node.js to build *urlcat*.
Tested on node version 12.18.3 and npm version 6.14.6.
First, clone the git repository:
```
git clone [email protected]:balazsbotond/urlcat.git
```
Then switch to the newly created urlcat directory and install the dependencies:
```
cd urlcat
npm install
```
You can then run the unit tests to verify that everything works correctly:
```
npm test
```
And finally, build the library:
```
npm run build
```
The output will appear in the `dist` directory.
Happy hacking!
## Contributors ✨
[![All Contributors](https://img.shields.io/badge/all_contributors-19-orange.svg?style=flat-square)](#contributors-)
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
3zk1m0
🤔
Alexander Tesfamichael
🐛
Aryan Gupta
📖
Botond Balázs
💻 ⚠️ 📖 🚇 🐛 🚧
Christian Rackerseder
📖
David Joseph Guzsik
👀
Drishit Mitra
🚇
Gabriel Schmitt
🤔 💻
Harshil Parmar
💻
Jason Kohles
🐛 💻
Ken Powers
📦 📓
Khizar Iqbal
🤔 🚇
Kim Kyudeok
🤔
Luyu Cheng
📖
Praveen K B
🤔 📖
Sakshi Vattikuti
📖
Simon Jang
🤔 💻
Tiago Santos Da Silva
💻
Tom
💻 🚇
kako-jun
🐛 🤔
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!