shinkansen-gears 1.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4 @@
1
+ #!/bin/sh
2
+ . "$(dirname "$0")/_/husky.sh"
3
+
4
+ npm run pre-commit
package/README.md ADDED
@@ -0,0 +1,43 @@
1
+ ## `shinkansen-gears`
2
+
3
+ # Shinkansen Gears
4
+
5
+ *Gears* implements *React* + *React Router* navigation components for *Zashiki Karakuri*.
6
+
7
+ ## Usage
8
+
9
+ ```javascript
10
+ import {
11
+ Gears
12
+ } from 'shinkansen-gears'
13
+ ```
14
+
15
+ *Gears* exposes the props `reverse`, `forward`, and `pattern`.
16
+
17
+ These props are _optional_. If no props are given then *Gears* will render `null`.
18
+
19
+ *Gears* depends on a peer of *[Shinkansen Rails](https://github.com/modernpoacher/shinkansen-rails)* to transform the props `reverse` and `forward` into `<Link />` components for *React Router*. (The prop `pattern` describes how `reverse` and `forward` should be transformed.)
20
+
21
+ ```javascript
22
+ import React from 'react'
23
+ import PropTypes from 'prop-types'
24
+
25
+ export class Gears extends React.Component { }
26
+
27
+ Gears.propTypes = {
28
+ reverse: PropTypes.shape({
29
+ alpha: PropTypes.string,
30
+ omega: PropTypes.string
31
+ }),
32
+ forward: PropTypes.shape({
33
+ alpha: PropTypes.string,
34
+ omega: PropTypes.string
35
+ }),
36
+ pattern: PropTypes.string
37
+ }
38
+ ```
39
+
40
+ ## See also
41
+
42
+ - [Shinkansen Rails](https://github.com/modernpoacher/shinkansen-rails)
43
+ - [Shinkansen Pantograph](https://github.com/modernpoacher/shinkansen-pantograph)
@@ -0,0 +1,71 @@
1
+ const debug = require('debug')
2
+
3
+ const log = debug('shinkansen-gears')
4
+
5
+ const {
6
+ env: {
7
+ NODE_ENV = 'development'
8
+ }
9
+ } = process
10
+
11
+ log('`shinkansen` is awake')
12
+
13
+ function env () {
14
+ log({ NODE_ENV })
15
+
16
+ return (
17
+ NODE_ENV === 'production'
18
+ )
19
+ }
20
+
21
+ const presets = [
22
+ [
23
+ '@babel/env', {
24
+ targets: {
25
+ node: '12.19.0',
26
+ browsers: [
27
+ 'last 4 versions',
28
+ 'safari >= 9',
29
+ 'ios >= 8',
30
+ 'ie >= 9',
31
+ '> 2%'
32
+ ]
33
+ },
34
+ useBuiltIns: 'usage',
35
+ corejs: 3
36
+ }
37
+ ],
38
+ '@babel/react'
39
+ ]
40
+
41
+ const plugins = [
42
+ '@babel/proposal-export-default-from',
43
+ [
44
+ '@babel/proposal-class-properties',
45
+ {
46
+ loose: false
47
+ }
48
+ ],
49
+ [
50
+ 'module-resolver', {
51
+ root: ['./src'],
52
+ cwd: 'babelrc',
53
+ alias: {
54
+ 'shinkansen-gears': './src',
55
+ build: './build',
56
+ stories: './stories'
57
+ }
58
+ }
59
+ ]
60
+ ]
61
+
62
+ module.exports = (api) => {
63
+ if (api) api.cache.using(env)
64
+
65
+ return {
66
+ compact: true,
67
+ comments: false,
68
+ presets,
69
+ plugins
70
+ }
71
+ }
package/gulp.sh ADDED
@@ -0,0 +1,42 @@
1
+ #!/bin/bash
2
+
3
+
4
+ NVM=~/.nvm
5
+
6
+ if [[ -f "$NVM/nvm.sh" ]];
7
+ then
8
+ unset npm_package_scripts_nvm
9
+ unset npm_config_prefix
10
+ unset npm_lifecycle_script
11
+
12
+ source $NVM/nvm.sh
13
+ fi
14
+
15
+ VERSION=$(nvm --version)
16
+
17
+ if [[ -z "$VERSION" ]];
18
+ then
19
+ echo NVM not installed
20
+ else
21
+ echo NVM version $VERSION installed
22
+
23
+ set -e
24
+
25
+ nvm use &> /dev/null
26
+
27
+ if [[ $? != 0 ]];
28
+ then
29
+ echo NVM not configured
30
+ else
31
+ echo NVM configured
32
+ fi
33
+ fi
34
+
35
+ if [[ $# -gt 0 ]];
36
+ then
37
+ npx gulp "$@"
38
+ else
39
+ npx gulp
40
+ fi
41
+
42
+ exit 0
package/index.js ADDED
@@ -0,0 +1,7 @@
1
+ const debug = require('debug')
2
+
3
+ const log = debug('shinkansen-gears')
4
+
5
+ log('`gears` is awake')
6
+
7
+ module.exports = require('./lib')
@@ -0,0 +1 @@
1
+ "use strict";require("core-js/modules/es.object.define-property.js");Object.defineProperty(exports,"__esModule",{value:true});exports["default"]=void 0;require("core-js/modules/es.array.concat.js");var _react=_interopRequireDefault(require("react"));var _propTypes=_interopRequireDefault(require("prop-types"));var _reactRouterDom=require("react-router-dom");function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj};}function Forward(_ref){var pathname=_ref.pathname;var key=pathname.concat('-forward');var to={pathname:pathname};return _react["default"].createElement("li",{key:key,className:"shinkansen-gears-forward"},_react["default"].createElement(_reactRouterDom.Link,{to:to},"Forward"));}Forward.propTypes={pathname:_propTypes["default"].string.isRequired};var _default=Forward;exports["default"]=_default;
@@ -0,0 +1 @@
1
+ "use strict";function _typeof(obj){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){_typeof=function _typeof(obj){return typeof obj;};}else{_typeof=function _typeof(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};}return _typeof(obj);}require("core-js/modules/es.object.set-prototype-of.js");require("core-js/modules/es.object.get-prototype-of.js");require("core-js/modules/es.reflect.construct.js");require("core-js/modules/es.object.create.js");require("core-js/modules/es.array.iterator.js");require("core-js/modules/es.object.to-string.js");require("core-js/modules/es.string.iterator.js");require("core-js/modules/es.weak-map.js");require("core-js/modules/web.dom-collections.iterator.js");require("core-js/modules/es.object.get-own-property-descriptor.js");require("core-js/modules/es.symbol.js");require("core-js/modules/es.symbol.description.js");require("core-js/modules/es.symbol.iterator.js");Object.defineProperty(exports,"__esModule",{value:true});exports.renderReverse=renderReverse;exports.renderForward=renderForward;exports["default"]=void 0;require("core-js/modules/es.array.concat.js");require("core-js/modules/es.array.reverse.js");require("core-js/modules/es.object.define-property.js");var _react=_interopRequireWildcard(require("react"));var _propTypes=_interopRequireDefault(require("prop-types"));var _immutable=_interopRequireDefault(require("immutable"));var _shinkansenRails=require("shinkansen-rails");var _reverse=_interopRequireDefault(require("./reverse"));var _forward=_interopRequireDefault(require("./forward"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj};}function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap();var cacheNodeInterop=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj;}if(obj===null||_typeof(obj)!=="object"&&typeof obj!=="function"){return{"default":obj};}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj);}var newObj={};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc);}else{newObj[key]=obj[key];}}}newObj["default"]=obj;if(cache){cache.set(obj,newObj);}return newObj;}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}function _createClass(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor;}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function");}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,writable:true,configurable:true}});if(superClass)_setPrototypeOf(subClass,superClass);}function _setPrototypeOf(o,p){_setPrototypeOf=Object.setPrototypeOf||function _setPrototypeOf(o,p){o.__proto__=p;return o;};return _setPrototypeOf(o,p);}function _createSuper(Derived){var hasNativeReflectConstruct=_isNativeReflectConstruct();return function _createSuperInternal(){var Super=_getPrototypeOf(Derived),result;if(hasNativeReflectConstruct){var NewTarget=_getPrototypeOf(this).constructor;result=Reflect.construct(Super,arguments,NewTarget);}else{result=Super.apply(this,arguments);}return _possibleConstructorReturn(this,result);};}function _possibleConstructorReturn(self,call){if(call&&(_typeof(call)==="object"||typeof call==="function")){return call;}else if(call!==void 0){throw new TypeError("Derived constructors may only return object or undefined");}return _assertThisInitialized(self);}function _assertThisInitialized(self){if(self===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called");}return self;}function _isNativeReflectConstruct(){if(typeof Reflect==="undefined"||!Reflect.construct)return false;if(Reflect.construct.sham)return false;if(typeof Proxy==="function")return true;try{Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}));return true;}catch(e){return false;}}function _getPrototypeOf(o){_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function _getPrototypeOf(o){return o.__proto__||Object.getPrototypeOf(o);};return _getPrototypeOf(o);}function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}function renderReverse(reverse,pattern){if(_shinkansenRails.Rails.go(reverse,pattern)){var pathname=_shinkansenRails.Rails.to(reverse,pattern);return _react["default"].createElement(_reverse["default"],{pathname:pathname});}return null;}function renderForward(forward,pattern){if(_shinkansenRails.Rails.go(forward,pattern)){var pathname=_shinkansenRails.Rails.to(forward,pattern);return _react["default"].createElement(_forward["default"],{pathname:pathname});}return null;}var Gears=function(_Component){_inherits(Gears,_Component);var _super=_createSuper(Gears);function Gears(){var _this;_classCallCheck(this,Gears);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_defineProperty(_assertThisInitialized(_this),"state",{});return _this;}_createClass(Gears,[{key:"shouldComponentUpdate",value:function shouldComponentUpdate(_ref,state){var pattern=_ref.pattern;var PATTERN=this.props.pattern;if(pattern!==PATTERN)return true;var reverse=state.reverse,forward=state.forward;var _this$state=this.state,REVERSE=_this$state.reverse,FORWARD=_this$state.forward;return reverse!==REVERSE||forward!==FORWARD;}},{key:"render",value:function render(){var _this$props=this.props,reverse=_this$props.reverse,forward=_this$props.forward,pattern=_this$props.pattern;var reverseGear=renderReverse(reverse,pattern);var forwardGear=renderForward(forward,pattern);if(reverseGear||forwardGear){return _react["default"].createElement("ul",{className:"shinkansen-gears"},reverseGear,forwardGear);}return null;}}],[{key:"getDerivedStateFromProps",value:function getDerivedStateFromProps(_ref2,_ref3){var reverse=_ref2.reverse,forward=_ref2.forward;var R=_ref3.reverse,F=_ref3.forward;var r=_immutable["default"].Map(reverse);var f=_immutable["default"].Map(forward);return{reverse:_immutable["default"].is(R,r)?R:r,forward:_immutable["default"].is(F,f)?F:f};}}]);return Gears;}(_react.Component);exports["default"]=Gears;Gears.defaultProps={reverse:{},forward:{},pattern:_shinkansenRails.Rails.pattern()};Gears.propTypes={reverse:_propTypes["default"].object,forward:_propTypes["default"].object,pattern:_propTypes["default"].string};
@@ -0,0 +1 @@
1
+ "use strict";require("core-js/modules/es.object.define-property.js");Object.defineProperty(exports,"__esModule",{value:true});exports["default"]=void 0;require("core-js/modules/es.array.concat.js");var _react=_interopRequireDefault(require("react"));var _propTypes=_interopRequireDefault(require("prop-types"));var _reactRouterDom=require("react-router-dom");function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj};}function Reverse(_ref){var pathname=_ref.pathname;var key=pathname.concat('-reverse');var to={pathname:pathname};return _react["default"].createElement("li",{key:key,className:"shinkansen-gears-reverse"},_react["default"].createElement(_reactRouterDom.Link,{to:to},"Reverse"));}Reverse.propTypes={pathname:_propTypes["default"].string.isRequired};var _default=Reverse;exports["default"]=_default;
package/lib/index.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";require("core-js/modules/es.object.define-property.js");Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Gears",{enumerable:true,get:function get(){return _gears["default"];}});var _gears=_interopRequireDefault(require("./gears"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj};}
package/package.json ADDED
@@ -0,0 +1,104 @@
1
+ {
2
+ "name": "shinkansen-gears",
3
+ "version": "1.0.23",
4
+ "description": "Shinkansen Gears",
5
+ "keywords": [
6
+ "Shinkansen",
7
+ "Gears",
8
+ "Zashiki Karakuri",
9
+ "Zashiki",
10
+ "Karakuri",
11
+ "React",
12
+ "React Router"
13
+ ],
14
+ "main": "./index.js",
15
+ "author": "Jonathan Perry for Modern Poacher Limited <modernpoacher@modernpoacher.com>",
16
+ "license": "MIT",
17
+ "engines": {
18
+ "node": ">=12.19.0"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git@github.com/modernpoacher/shinkansen-gears.git"
23
+ },
24
+ "scripts": {
25
+ "prepublishOnly": "cross-env NODE_ENV=production npm run build",
26
+ "prebuild": "npm run clean",
27
+ "build": "cross-env DEBUG=shinkansen-gears npm run babel -- --ignore \"**/__tests__/**\" && npm run gulp",
28
+ "build:watch": "npm run gulp -- build:watch",
29
+ "watch": "cross-env DEBUG=shinkansen-gears concurrently -r \"npm run babel:watch\" \"npm run build:watch\"",
30
+ "clean": "rimraf lib",
31
+ "transform": "npm run gulp -- transform",
32
+ "transform:watch": "npm run gulp -- transform:watch",
33
+ "babel": "babel src -d lib",
34
+ "babel:watch": "npm run babel -- -w",
35
+ "gulp": "bash gulp.sh --color",
36
+ "lint": "eslint .",
37
+ "lint:fix": "npm run lint -- --fix",
38
+ "test": "cross-env NODE_ENV=test jest --collect-coverage false --verbose --run-in-band",
39
+ "storybook": "npm run build && npm run transform && start-storybook -p 6006",
40
+ "build-storybook": "build-storybook",
41
+ "pre-commit": "npm run lint && npm test && npm run build && npm run transform && git add lib .storybook"
42
+ },
43
+ "dependencies": {
44
+ "debug": "^4.3.2",
45
+ "immutable": "3.8.2"
46
+ },
47
+ "devDependencies": {
48
+ "@babel/cli": "^7.15.4",
49
+ "@babel/core": "^7.15.5",
50
+ "@babel/eslint-parser": "^7.15.4",
51
+ "@babel/plugin-proposal-class-properties": "^7.14.5",
52
+ "@babel/plugin-proposal-export-default-from": "^7.14.5",
53
+ "@babel/preset-env": "^7.15.6",
54
+ "@babel/preset-react": "^7.14.5",
55
+ "@babel/register": "^7.15.3",
56
+ "@modernpoacher/design-system": "0.0.383",
57
+ "autoprefixer": "^10.3.4",
58
+ "babel-jest": "^27.2.0",
59
+ "babel-plugin-module-resolver": "^4.1.0",
60
+ "babel-plugin-transform-react-jsx": "^6.24.1",
61
+ "babel-preset-react": "^6.24.1",
62
+ "concurrently": "^6.2.1",
63
+ "core-js": "^3.17.3",
64
+ "cross-env": "^7.0.3",
65
+ "cssnano": "^5.0.8",
66
+ "dart-sass": "^1.25.0",
67
+ "del": "^6.0.0",
68
+ "enzyme": "^3.11.0",
69
+ "enzyme-adapter-react-16": "^1.15.6",
70
+ "eslint": "^7.32.0",
71
+ "eslint-config-standard": "^16.0.3",
72
+ "eslint-import-resolver-babel-module": "^5.3.1",
73
+ "eslint-plugin-import": "^2.24.2",
74
+ "eslint-plugin-node": "^11.1.0",
75
+ "eslint-plugin-promise": "^5.1.0",
76
+ "eslint-plugin-react": "^7.25.2",
77
+ "glob-all": "^3.2.1",
78
+ "gulp": "^4.0.2",
79
+ "gulp-clean-css": "^4.3.0",
80
+ "gulp-css-purge": "^3.0.9",
81
+ "gulp-debug": "^4.0.0",
82
+ "gulp-postcss": "^9.0.1",
83
+ "gulp-rename": "^2.0.0",
84
+ "gulp-sass": "^5.0.0",
85
+ "gulp-sourcemaps": "^3.0.0",
86
+ "husky": "^7.0.2",
87
+ "jest": "^27.2.0",
88
+ "postcss": "^8.3.6",
89
+ "postcss-easy-import": "^3.0.0",
90
+ "postcss-map": "^0.11.0",
91
+ "postcss-normalize": "^10.0.1",
92
+ "postcss-scss": "^4.0.0",
93
+ "prop-types": "15.7.2",
94
+ "react": "16.14.0",
95
+ "react-dom": "16.14.0",
96
+ "react-router": "5.2.0",
97
+ "react-router-dom": "5.2.0",
98
+ "react-test-renderer": "16.14.0",
99
+ "regenerator-runtime": "^0.13.9",
100
+ "rimraf": "^3.0.2",
101
+ "shinkansen-rails": "1.0.18",
102
+ "vinyl-paths": "3.0.1"
103
+ }
104
+ }
@@ -0,0 +1,27 @@
1
+ import React from 'react'
2
+ import PropTypes from 'prop-types'
3
+
4
+ import {
5
+ Link
6
+ } from 'react-router-dom'
7
+
8
+ function Forward ({ pathname }) {
9
+ const key = pathname.concat('-forward')
10
+ const to = {
11
+ pathname
12
+ }
13
+
14
+ return (
15
+ <li key={key} className='shinkansen-gears-forward'>
16
+ <Link to={to}>
17
+ Forward
18
+ </Link>
19
+ </li>
20
+ )
21
+ }
22
+
23
+ Forward.propTypes = {
24
+ pathname: PropTypes.string.isRequired
25
+ }
26
+
27
+ export default Forward
@@ -0,0 +1,120 @@
1
+ import React, { Component } from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import Immutable from 'immutable'
4
+
5
+ import {
6
+ Rails
7
+ } from 'shinkansen-rails'
8
+
9
+ import Reverse from './reverse'
10
+ import Forward from './forward'
11
+
12
+ export function renderReverse (reverse, pattern) {
13
+ if (Rails.go(reverse, pattern)) {
14
+ const pathname = Rails.to(reverse, pattern)
15
+
16
+ return (
17
+ <Reverse
18
+ pathname={pathname}
19
+ />
20
+ )
21
+ }
22
+
23
+ return null
24
+ }
25
+
26
+ export function renderForward (forward, pattern) {
27
+ if (Rails.go(forward, pattern)) {
28
+ const pathname = Rails.to(forward, pattern)
29
+
30
+ return (
31
+ <Forward
32
+ pathname={pathname}
33
+ />
34
+ )
35
+ }
36
+
37
+ return null
38
+ }
39
+
40
+ export default class Gears extends Component {
41
+ state = {} // define state
42
+
43
+ /**
44
+ * Convert latest 'props' to an Immutable.Map() and store in 'state'
45
+ *
46
+ * @param {Object} props Latest props
47
+ * @param {Object} state Current state
48
+ */
49
+ static getDerivedStateFromProps ({ reverse, forward }, { reverse: R, forward: F }) { // console.log('[Gears]getDerivedStateFromProps()')
50
+ const r = Immutable.Map(reverse)
51
+ const f = Immutable.Map(forward)
52
+
53
+ return {
54
+ reverse: Immutable.is(R, r) ? R : r,
55
+ forward: Immutable.is(F, f) ? F : f
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Compare latest 'props' and 'state' for changes to 'pattern', 'reverse' or 'forward'
61
+ *
62
+ * @param {Object} props Latest props
63
+ */
64
+ shouldComponentUpdate ({ pattern }, state) { // console.log('(Gears)shouldComponentUpdate()', { pattern }, state)
65
+ const {
66
+ pattern: PATTERN
67
+ } = this.props
68
+
69
+ if (pattern !== PATTERN) return true
70
+
71
+ const {
72
+ reverse,
73
+ forward
74
+ } = state
75
+
76
+ const {
77
+ reverse: REVERSE,
78
+ forward: FORWARD
79
+ } = this.state // state must be defined
80
+
81
+ return (
82
+ reverse !== REVERSE ||
83
+ forward !== FORWARD
84
+ )
85
+ }
86
+
87
+ render () { // console.log('(Gears)render()')
88
+ const {
89
+ reverse,
90
+ forward,
91
+ pattern
92
+ } = this.props
93
+
94
+ const reverseGear = renderReverse(reverse, pattern)
95
+ const forwardGear = renderForward(forward, pattern)
96
+
97
+ if (reverseGear || forwardGear) {
98
+ return (
99
+ <ul className='shinkansen-gears'>
100
+ {reverseGear}
101
+ {forwardGear}
102
+ </ul>
103
+ )
104
+ }
105
+
106
+ return null
107
+ }
108
+ }
109
+
110
+ Gears.defaultProps = {
111
+ reverse: {},
112
+ forward: {},
113
+ pattern: Rails.pattern()
114
+ }
115
+
116
+ Gears.propTypes = {
117
+ reverse: PropTypes.object,
118
+ forward: PropTypes.object,
119
+ pattern: PropTypes.string
120
+ }
@@ -0,0 +1,27 @@
1
+ import React from 'react'
2
+ import PropTypes from 'prop-types'
3
+
4
+ import {
5
+ Link
6
+ } from 'react-router-dom'
7
+
8
+ function Reverse ({ pathname }) {
9
+ const key = pathname.concat('-reverse')
10
+ const to = {
11
+ pathname
12
+ }
13
+
14
+ return (
15
+ <li key={key} className='shinkansen-gears-reverse'>
16
+ <Link to={to}>
17
+ Reverse
18
+ </Link>
19
+ </li>
20
+ )
21
+ }
22
+
23
+ Reverse.propTypes = {
24
+ pathname: PropTypes.string.isRequired
25
+ }
26
+
27
+ export default Reverse
package/src/index.js ADDED
@@ -0,0 +1 @@
1
+ export Gears from './gears'