UNPKG

hd-utils

Version:

A handy utils for modern JS developers

63 lines (59 loc) 2.02 kB
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}`; }