File: //var/www/zaklada/html/node_modules/history/lib/useQueries.js
'use strict';
exports.__esModule = true;
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; };
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
var _warning = require('warning');
var _warning2 = _interopRequireDefault(_warning);
var _queryString = require('query-string');
var _runTransitionHook = require('./runTransitionHook');
var _runTransitionHook2 = _interopRequireDefault(_runTransitionHook);
var _parsePath = require('./parsePath');
var _parsePath2 = _interopRequireDefault(_parsePath);
var _deprecate = require('./deprecate');
var _deprecate2 = _interopRequireDefault(_deprecate);
var SEARCH_BASE_KEY = '$searchBase';
function defaultStringifyQuery(query) {
  return _queryString.stringify(query).replace(/%20/g, '+');
}
var defaultParseQueryString = _queryString.parse;
function isNestedObject(object) {
  for (var p in object) {
    if (object.hasOwnProperty(p) && typeof object[p] === 'object' && !Array.isArray(object[p]) && object[p] !== null) return true;
  }return false;
}
/**
 * Returns a new createHistory function that may be used to create
 * history objects that know how to handle URL queries.
 */
function useQueries(createHistory) {
  return function () {
    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
    var stringifyQuery = options.stringifyQuery;
    var parseQueryString = options.parseQueryString;
    var historyOptions = _objectWithoutProperties(options, ['stringifyQuery', 'parseQueryString']);
    var history = createHistory(historyOptions);
    if (typeof stringifyQuery !== 'function') stringifyQuery = defaultStringifyQuery;
    if (typeof parseQueryString !== 'function') parseQueryString = defaultParseQueryString;
    function addQuery(location) {
      if (location.query == null) {
        var search = location.search;
        location.query = parseQueryString(search.substring(1));
        location[SEARCH_BASE_KEY] = { search: search, searchBase: '' };
      }
      // TODO: Instead of all the book-keeping here, this should just strip the
      // stringified query from the search.
      return location;
    }
    function appendQuery(location, query) {
      var _extends2;
      var queryString = undefined;
      if (!query || (queryString = stringifyQuery(query)) === '') return location;
      process.env.NODE_ENV !== 'production' ? _warning2['default'](stringifyQuery !== defaultStringifyQuery || !isNestedObject(query), 'useQueries does not stringify nested query objects by default; ' + 'use a custom stringifyQuery function') : undefined;
      if (typeof location === 'string') location = _parsePath2['default'](location);
      var searchBaseSpec = location[SEARCH_BASE_KEY];
      var searchBase = undefined;
      if (searchBaseSpec && location.search === searchBaseSpec.search) {
        searchBase = searchBaseSpec.searchBase;
      } else {
        searchBase = location.search || '';
      }
      var search = searchBase + (searchBase ? '&' : '?') + queryString;
      return _extends({}, location, (_extends2 = {
        search: search
      }, _extends2[SEARCH_BASE_KEY] = { search: search, searchBase: searchBase }, _extends2));
    }
    // Override all read methods with query-aware versions.
    function listenBefore(hook) {
      return history.listenBefore(function (location, callback) {
        _runTransitionHook2['default'](hook, addQuery(location), callback);
      });
    }
    function listen(listener) {
      return history.listen(function (location) {
        listener(addQuery(location));
      });
    }
    // Override all write methods with query-aware versions.
    function push(location) {
      history.push(appendQuery(location, location.query));
    }
    function replace(location) {
      history.replace(appendQuery(location, location.query));
    }
    function createPath(location, query) {
      //warning(
      //  !query,
      //  'the query argument to createPath is deprecated; use a location descriptor instead'
      //)
      return history.createPath(appendQuery(location, query || location.query));
    }
    function createHref(location, query) {
      //warning(
      //  !query,
      //  'the query argument to createHref is deprecated; use a location descriptor instead'
      //)
      return history.createHref(appendQuery(location, query || location.query));
    }
    function createLocation() {
      return addQuery(history.createLocation.apply(history, arguments));
    }
    // deprecated
    function pushState(state, path, query) {
      if (typeof path === 'string') path = _parsePath2['default'](path);
      push(_extends({ state: state }, path, { query: query }));
    }
    // deprecated
    function replaceState(state, path, query) {
      if (typeof path === 'string') path = _parsePath2['default'](path);
      replace(_extends({ state: state }, path, { query: query }));
    }
    return _extends({}, history, {
      listenBefore: listenBefore,
      listen: listen,
      push: push,
      replace: replace,
      createPath: createPath,
      createHref: createHref,
      createLocation: createLocation,
      pushState: _deprecate2['default'](pushState, 'pushState is deprecated; use push instead'),
      replaceState: _deprecate2['default'](replaceState, 'replaceState is deprecated; use replace instead')
    });
  };
}
exports['default'] = useQueries;
module.exports = exports['default'];