@aetherall/react-router-relative-link
Version:
A wrapper around react-router's Link that allows relative paths.
72 lines (54 loc) • 3.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: 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; };
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; };
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _resolvePathname = require('resolve-pathname');
var _resolvePathname2 = _interopRequireDefault(_resolvePathname);
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 ensureLeadingAndTrailingSlashes = function ensureLeadingAndTrailingSlashes(path) {
return path.replace(/^\/?/, '/').replace(/\/?$/, '/');
};
var removeTrailingSlash = function removeTrailingSlash(path) {
return path.replace(/\/$/, '') || '/';
};
var removeQuery = function removeQuery(path) {
return path.split('?')[0];
};
var resolvePathnameNoTrailingSlash = function resolvePathnameNoTrailingSlash(path, currentPath) {
return removeTrailingSlash((0, _resolvePathname2.default)('' + path, currentPath));
};
var extractCurrentPath = function extractCurrentPath(currentPath) {
return ensureLeadingAndTrailingSlashes(removeQuery(currentPath));
};
var CoreLink = function CoreLink(_ref) {
var BaseComponent = _ref.BaseComponent,
match = _ref.match,
relativeTo = _ref.to,
staticContext = _ref.staticContext,
others = _objectWithoutProperties(_ref, ['BaseComponent', 'match', 'to', 'staticContext']);
var currentPath = extractCurrentPath(match.url);
var to = (typeof relativeTo === 'undefined' ? 'undefined' : _typeof(relativeTo)) === 'object' ? _extends({}, relativeTo, {
pathname: resolvePathnameNoTrailingSlash(relativeTo.pathname, currentPath)
}) : resolvePathnameNoTrailingSlash(relativeTo, currentPath);
return _react2.default.createElement(BaseComponent, _extends({ to: to }, others));
};
CoreLink.propTypes = {
BaseComponent: _propTypes2.default.func.isRequired,
staticContext: _propTypes2.default.object,
match: _propTypes2.default.shape({
url: _propTypes2.default.string
}).isRequired,
to: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.shape({
pathname: _propTypes2.default.string,
search: _propTypes2.default.string,
hash: _propTypes2.default.string
})]).isRequired
};
exports.default = CoreLink;