@jedmao/location

A Location class that implements the Location interface of the Web API.

Usage no npm install needed!

<script type="module">
  import jedmaoLocation from 'https://cdn.skypack.dev/@jedmao/location';
</script>

README

@jedmao/location

GitHub Actions NPM version npm license codecov BundlePhobia Minified BundlePhobia Minified + gzip code style: prettier Unicorn Approved

A LocationMock class that extends URL and implements the Location interface of the Web API. As always, with first-class TypeScript support!

Installation

npm i --save-dev @jedmao/location

Usage

import { LocationMock } from '@jedmao/location'

const loc = new LocationMock('http://foo.com/')
loc.assign('http://bar.com/')
loc.replace('http://baz.com/')
loc.reload()

Because this package extends URL, many features are provided for free. This means you can do this:

new LocationMock('http://jed:secret@test:42/foo?bar=baz#qux')

Which returns the following object:

LocationMock {
  href: 'http://jed:secret@test:42/foo?bar=baz#qux',
  origin: 'http://test:42',
  protocol: 'http:',
  username: 'jed',
  password: 'secret',
  host: 'test:42',
  hostname: 'test',
  port: '42',
  pathname: '/foo',
  search: '?bar=baz',
  searchParams: URLSearchParams { 'bar' => 'baz' },
  hash: '#qux' }

Mocking

A common use for this package is to mock the window.location, which you can do in Jest like so:

const { location: savedLocation } = window

beforeAll(() => {
  delete window.location
})

beforeEach(() => {
  window.location = new LocationMock('http://test/')
})

afterAll(() => {
  window.location = savedLocation
})

it('assigns /login', () => {
  const assign = jest
    .spyOn(window.location, 'assign')
    .mockImplementationOnce(() => {})

  window.location.assign('/login')

  expect(assign).toHaveBeenCalledWith('/login')
})