hd-utils
Version:
A handy utils for modern JS developers
63 lines (59 loc) • 2.02 kB
JavaScript
import getHashFromString from '../string/getHashFromString';
import extractQueryFromUrl from './extractQueryFromUrl';
import parse from './parse';
import removeHashFromUrl from './removeHashFromUrl';
import { encodeFragmentIdentifier, stringify } from './routeHelpers';
/**
* @description Stringify an object into a URL with a query string and sorting the keys. The inverse of .parseUrl();
* @example
```
stringifyUrl({url: 'https://foo.bar', query: {foo: 'bar'}});
//=> 'https://foo.bar?foo=bar'
stringifyUrl({url: 'https://foo.bar?foo=baz', query: {foo: 'bar'}});
//=> 'https://foo.bar?foo=bar'
stringifyUrl({
url: 'https://foo.bar',
query: {
top: 'foo'
},
fragmentIdentifier: 'bar'
});
//=> 'https://foo.bar?top=foo#bar'
stringifyUrl({
url: 'https://foo.bar',
params: [1,"foo"]
}); //=> 'https://foo.bar/1/foo
``` */
export default function stringifyUrl(object, options) {
options = {
encode: true,
strict: true,
//@ts-ignore
[encodeFragmentIdentifier]: true,
...options,
};
let url = removeHashFromUrl(object.url).split('?')[0] || '';
if (options?.params?.length) {
const joinedParams = options.params.join('/');
url = url.endsWith('/') ? url + joinedParams : `${url}/${joinedParams}`;
}
const queryFromUrl = extractQueryFromUrl(object.url);
const query = {
...parse(queryFromUrl, { sort: false }),
...object.query,
};
let queryString = stringify(query, options);
if (queryString) {
queryString = `?${queryString}`;
}
let hash = getHashFromString(object.url);
if (object.fragmentIdentifier) {
const urlObjectForFragmentEncode = new URL(url);
urlObjectForFragmentEncode.hash = object.fragmentIdentifier;
options ?? (options = {});
hash = options[encodeFragmentIdentifier]
? urlObjectForFragmentEncode.hash
: `#${object.fragmentIdentifier}`;
}
return `${url}${queryString}${hash}`;
}