redux-first-router
Version:
think of your app in states not routes (and, yes, while keeping the address bar in sync)
46 lines (36 loc) • 1.77 kB
JavaScript
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
import { compileParamsToPath } from 'rudy-match-path';
export default (function (action, routesMap, serializer) {
var route = routesMap[action.type];
var routePath = (typeof route === 'undefined' ? 'undefined' : _typeof(route)) === 'object' ? route.path : route;
var params = _payloadToParams(route, action.payload);
var path = compileParamsToPath(routePath, params) || '/';
var query = action.query || action.meta && action.meta.query || action.payload && action.payload.query;
var search = query && serializer && serializer.stringify(query);
return search ? path + '?' + search : path;
});
var _payloadToParams = function _payloadToParams(route) {
var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
return Object.keys(params).reduce(function (sluggifedParams, key) {
var segment = params[key];
// $FlowFixMe
sluggifedParams[key] = transformSegment(segment, route, key);
return sluggifedParams;
}, {});
};
var transformSegment = function transformSegment(segment, route, key) {
if (typeof route.toPath === 'function') {
return route.toPath(segment, key);
} else if (typeof segment === 'string') {
// Ask James "should it return arrays?"
if (segment.includes('/')) {
return segment.split('/');
}
if (route.capitalizedWords === true) {
return segment.replace(/ /g, '-').toLowerCase();
}
return segment;
} else if (typeof segment === 'number') {
return segment;
}
};