UNPKG

@aetherall/react-router-relative-link

Version:

A wrapper around react-router's Link that allows relative paths.

72 lines (54 loc) 3.05 kB
'use strict'; 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;