File: /var/www/zaklada/html/node_modules/history/es6/createHashHistory.js
'use strict';
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
import warning from 'warning';
import invariant from 'invariant';
import { PUSH, POP } from './Actions';
import { canUseDOM } from './ExecutionEnvironment';
import { addEventListener, removeEventListener, getHashPath, replaceHashPath, supportsGoWithoutReloadUsingHash } from './DOMUtils';
import { saveState, readState } from './DOMStateStorage';
import createDOMHistory from './createDOMHistory';
import parsePath from './parsePath';
function isAbsolutePath(path) {
  return typeof path === 'string' && path.charAt(0) === '/';
}
function ensureSlash() {
  var path = getHashPath();
  if (isAbsolutePath(path)) return true;
  replaceHashPath('/' + path);
  return false;
}
function addQueryStringValueToPath(path, key, value) {
  return path + (path.indexOf('?') === -1 ? '?' : '&') + (key + '=' + value);
}
function stripQueryStringValueFromPath(path, key) {
  return path.replace(new RegExp('[?&]?' + key + '=[a-zA-Z0-9]+'), '');
}
function getQueryStringValueFromPath(path, key) {
  var match = path.match(new RegExp('\\?.*?\\b' + key + '=(.+?)\\b'));
  return match && match[1];
}
var DefaultQueryKey = '_k';
function createHashHistory() {
  var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
  !canUseDOM ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Hash history needs a DOM') : invariant(false) : undefined;
  var queryKey = options.queryKey;
  if (queryKey === undefined || !!queryKey) queryKey = typeof queryKey === 'string' ? queryKey : DefaultQueryKey;
  function getCurrentLocation() {
    var path = getHashPath();
    var key = undefined,
        state = undefined;
    if (queryKey) {
      key = getQueryStringValueFromPath(path, queryKey);
      path = stripQueryStringValueFromPath(path, queryKey);
      if (key) {
        state = readState(key);
      } else {
        state = null;
        key = history.createKey();
        replaceHashPath(addQueryStringValueToPath(path, queryKey, key));
      }
    } else {
      key = state = null;
    }
    var location = parsePath(path);
    return history.createLocation(_extends({}, location, { state: state }), undefined, key);
  }
  function startHashChangeListener(_ref) {
    var transitionTo = _ref.transitionTo;
    function hashChangeListener() {
      if (!ensureSlash()) return; // Always make sure hashes are preceeded with a /.
      transitionTo(getCurrentLocation());
    }
    ensureSlash();
    addEventListener(window, 'hashchange', hashChangeListener);
    return function () {
      removeEventListener(window, 'hashchange', hashChangeListener);
    };
  }
  function finishTransition(location) {
    var basename = location.basename;
    var pathname = location.pathname;
    var search = location.search;
    var state = location.state;
    var action = location.action;
    var key = location.key;
    if (action === POP) return; // Nothing to do.
    var path = (basename || '') + pathname + search;
    if (queryKey) {
      path = addQueryStringValueToPath(path, queryKey, key);
      saveState(key, state);
    } else {
      // Drop key and state.
      location.key = location.state = null;
    }
    var currentHash = getHashPath();
    if (action === PUSH) {
      if (currentHash !== path) {
        window.location.hash = path;
      } else {
        process.env.NODE_ENV !== 'production' ? warning(false, 'You cannot PUSH the same path using hash history') : undefined;
      }
    } else if (currentHash !== path) {
      // REPLACE
      replaceHashPath(path);
    }
  }
  var history = createDOMHistory(_extends({}, options, {
    getCurrentLocation: getCurrentLocation,
    finishTransition: finishTransition,
    saveState: saveState
  }));
  var listenerCount = 0,
      stopHashChangeListener = undefined;
  function listenBefore(listener) {
    if (++listenerCount === 1) stopHashChangeListener = startHashChangeListener(history);
    var unlisten = history.listenBefore(listener);
    return function () {
      unlisten();
      if (--listenerCount === 0) stopHashChangeListener();
    };
  }
  function listen(listener) {
    if (++listenerCount === 1) stopHashChangeListener = startHashChangeListener(history);
    var unlisten = history.listen(listener);
    return function () {
      unlisten();
      if (--listenerCount === 0) stopHashChangeListener();
    };
  }
  function push(location) {
    process.env.NODE_ENV !== 'production' ? warning(queryKey || location.state == null, 'You cannot use state without a queryKey it will be dropped') : undefined;
    history.push(location);
  }
  function replace(location) {
    process.env.NODE_ENV !== 'production' ? warning(queryKey || location.state == null, 'You cannot use state without a queryKey it will be dropped') : undefined;
    history.replace(location);
  }
  var goIsSupportedWithoutReload = supportsGoWithoutReloadUsingHash();
  function go(n) {
    process.env.NODE_ENV !== 'production' ? warning(goIsSupportedWithoutReload, 'Hash history go(n) causes a full page reload in this browser') : undefined;
    history.go(n);
  }
  function createHref(path) {
    return '#' + history.createHref(path);
  }
  // deprecated
  function registerTransitionHook(hook) {
    if (++listenerCount === 1) stopHashChangeListener = startHashChangeListener(history);
    history.registerTransitionHook(hook);
  }
  // deprecated
  function unregisterTransitionHook(hook) {
    history.unregisterTransitionHook(hook);
    if (--listenerCount === 0) stopHashChangeListener();
  }
  // deprecated
  function pushState(state, path) {
    process.env.NODE_ENV !== 'production' ? warning(queryKey || state == null, 'You cannot use state without a queryKey it will be dropped') : undefined;
    history.pushState(state, path);
  }
  // deprecated
  function replaceState(state, path) {
    process.env.NODE_ENV !== 'production' ? warning(queryKey || state == null, 'You cannot use state without a queryKey it will be dropped') : undefined;
    history.replaceState(state, path);
  }
  return _extends({}, history, {
    listenBefore: listenBefore,
    listen: listen,
    push: push,
    replace: replace,
    go: go,
    createHref: createHref,
    registerTransitionHook: registerTransitionHook, // deprecated - warning is in createHistory
    unregisterTransitionHook: unregisterTransitionHook, // deprecated - warning is in createHistory
    pushState: pushState, // deprecated - warning is in createHistory
    replaceState: replaceState // deprecated - warning is in createHistory
  });
}
export default createHashHistory;