remix-run / history

Manage session history with JavaScript
MIT License
8.29k stars 961 forks source link

Support URL instance as `to` parameter. #963

Open tomalec opened 1 year ago

tomalec commented 1 year ago

The issue to be addressed

push, replace, and createPath methods accept to parameter which is string or Partial<Path>. The Path seems to be a partial to the native URL which also contains pathname: string, search: string, hash: string.

Also, given the library is used to work with URLs it's tempting to provide the actual URL instances. I often use URL, and its .searchParams to construct, change and manipulate URLs.

Currently, createURL works fine if given an URL instance, however push and replace takes new URL('/foo?bar=biz', 'http://my.base/path') as {}.

What's changed

This PR makes getNextLocation normalize given to to be always a plain object. (Plus, it makes getNextLocation a bit DRYier)

Possible improvements

If this library aims to support environments without URL, we could add typeof URL === 'function', then assume the given to object is just a Path literal.