Remove demo dependency on connected-react-router (#1159)

* Remove connected-react-router from inspector demo

* test-tab
This commit is contained in:
Nathan Bierema 2022-05-15 16:16:18 -04:00 committed by GitHub
parent fe6419412b
commit ae0c295f4f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 53 additions and 151 deletions

View File

@ -15,15 +15,13 @@
"@redux-devtools/inspector-monitor": "^2.1.2",
"@redux-devtools/inspector-monitor-test-tab": "^0.8.6",
"@redux-devtools/ui": "^1.2.1",
"connected-react-router": "^6.9.2",
"history": "^4.10.1",
"immutable": "^4.0.0",
"lodash.shuffle": "^4.2.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-is": "^17.0.2",
"react-redux": "^7.2.8",
"react-router": "^5.3.1",
"react-router-dom": "^5.3.1",
"redux": "^4.2.0",
"redux-logger": "^3.0.6",
"styled-components": "^5.3.5"
@ -33,13 +31,12 @@
"@babel/preset-env": "^7.17.10",
"@babel/preset-react": "^7.16.7",
"@babel/preset-typescript": "^7.16.7",
"@types/history": "^4.7.11",
"@types/lodash.shuffle": "^4.2.7",
"@types/node": "^16.11.33",
"@types/react": "^17.0.45",
"@types/react-dom": "^17.0.16",
"@types/react-redux": "^7.1.24",
"@types/react-router": "^5.1.18",
"@types/react-router-dom": "^5.3.3",
"@types/redux-logger": "^3.0.9",
"@types/styled-components": "^5.1.25",
"@types/webpack-env": "^1.16.4",

View File

@ -1,8 +1,8 @@
import React, { CSSProperties } from 'react';
import { connect } from 'react-redux';
import { Button, Toolbar, Spacer } from '@redux-devtools/ui';
import { push as pushRoute } from 'connected-react-router';
import pkg from '@redux-devtools/inspector-monitor-test-tab/package.json';
import { RouteComponentProps, withRouter } from 'react-router-dom';
import getOptions from './getOptions';
import { DemoAppState } from './reducers';
import {
@ -69,11 +69,11 @@ interface Props
shuffleArray: () => void;
}
class DemoApp extends React.Component<Props> {
class DemoApp extends React.Component<Props & RouteComponentProps> {
timeout?: number;
render() {
const options = getOptions(this.props.router.location);
const options = getOptions(this.props.location);
return (
<div style={styles.wrapper}>
@ -180,5 +180,4 @@ export default connect((state: DemoAppState) => state, {
addFunction: (): AddFunctionAction => ({ type: 'ADD_FUNCTION' }),
addSymbol: (): AddSymbolAction => ({ type: 'ADD_SYMBOL' }),
shuffleArray: (): ShuffleArrayAction => ({ type: 'SHUFFLE_ARRAY' }),
pushRoute,
})(DemoApp);
})(withRouter(DemoApp));

View File

@ -1,5 +1,4 @@
import React from 'react';
import { connect } from 'react-redux';
import { createDevTools } from '@redux-devtools/core';
import {
InspectorMonitor,
@ -7,10 +6,9 @@ import {
Tab,
} from '@redux-devtools/inspector-monitor';
import { DockMonitor } from '@redux-devtools/dock-monitor';
import { Location } from 'history';
import { RouteComponentProps, withRouter } from 'react-router-dom';
import getOptions from './getOptions';
import { TestTab } from '@redux-devtools/inspector-monitor-test-tab';
import { DemoAppState } from './reducers';
import { Action } from 'redux';
export const getDevTools = (location: { search: string }) =>
@ -38,13 +36,9 @@ export const getDevTools = (location: { search: string }) =>
</DockMonitor>
);
const UnconnectedDevTools = ({ location }: { location: Location }) => {
const UnconnectedDevTools = ({ location }: RouteComponentProps) => {
const DevTools = getDevTools(location);
return <DevTools />;
};
const mapStateToProps = (state: DemoAppState) => ({
location: state.router.location,
});
export const ConnectedDevTools = connect(mapStateToProps)(UnconnectedDevTools);
export const ConnectedDevTools = withRouter(UnconnectedDevTools);

View File

@ -9,12 +9,12 @@ export default function getOptions(location: { search: string }) {
return {
useExtension: location.search.indexOf('ext') !== -1,
supportImmutable: location.search.indexOf('immutable') !== -1,
theme: getTheme(),
theme: getTheme(location),
dark: location.search.indexOf('dark') !== -1,
};
}
function getTheme() {
function getTheme(location: { search: string }) {
const match = /theme=([^&]+)/.exec(location.search);
return match ? match[1] : 'inspector';
}

View File

@ -10,12 +10,10 @@ import {
StoreEnhancerStoreCreator,
} from 'redux';
import logger from 'redux-logger';
import { Route } from 'react-router';
import { createBrowserHistory } from 'history';
import { ConnectedRouter, routerMiddleware } from 'connected-react-router';
import { BrowserRouter, Route } from 'react-router-dom';
import { persistState } from '@redux-devtools/core';
import DemoApp from './DemoApp';
import createRootReducer from './reducers';
import { rootReducer } from './reducers';
import getOptions from './getOptions';
import { ConnectedDevTools, getDevTools } from './DevTools';
@ -31,14 +29,12 @@ const ROOT =
const DevTools = getDevTools(window.location);
const history = createBrowserHistory();
const useDevtoolsExtension =
!!(window as unknown as { __REDUX_DEVTOOLS_EXTENSION__: unknown }) &&
getOptions(window.location).useExtension;
const enhancer = compose(
applyMiddleware(logger, routerMiddleware(history)),
applyMiddleware(logger),
(next: StoreEnhancerStoreCreator) => {
const instrument = useDevtoolsExtension
? (
@ -52,11 +48,11 @@ const enhancer = compose(
persistState(getDebugSessionKey())
);
const store = createStore(createRootReducer(history), enhancer);
const store = createStore(rootReducer, enhancer);
render(
<Provider store={store}>
<ConnectedRouter history={history}>
<BrowserRouter>
<Container
themeData={{
theme: 'default',
@ -69,7 +65,7 @@ render(
</Route>
{!useDevtoolsExtension && <ConnectedDevTools />}
</Container>
</ConnectedRouter>
</BrowserRouter>
</Provider>,
document.getElementById('root')
);

View File

@ -1,12 +1,6 @@
import Immutable from 'immutable';
import shuffle from 'lodash.shuffle';
import { combineReducers, Reducer } from 'redux';
import {
connectRouter,
LocationChangeAction,
RouterState,
} from 'connected-react-router';
import { History } from 'history';
type Nested = { long: { nested: { path: { to: { a: string } } }[] } };
@ -139,11 +133,9 @@ type DemoAppAction =
| HugePayloadAction
| AddFunctionAction
| AddSymbolAction
| ShuffleArrayAction
| LocationChangeAction;
| ShuffleArrayAction;
export interface DemoAppState {
router: RouterState;
timeoutUpdateEnabled: boolean;
store: number;
undefined: { val: undefined };
@ -162,11 +154,8 @@ export interface DemoAppState {
shuffleArray: unknown[];
}
const createRootReducer = (
history: History
): Reducer<DemoAppState, DemoAppAction> =>
export const rootReducer: Reducer<DemoAppState, DemoAppAction> =
combineReducers<DemoAppState, DemoAppAction>({
router: connectRouter(history) as Reducer<RouterState, DemoAppAction>,
timeoutUpdateEnabled: (state = false, action) =>
action.type === 'TOGGLE_TIMEOUT_UPDATE'
? action.timeoutUpdateEnabled
@ -231,5 +220,3 @@ const createRootReducer = (
shuffleArray: (state = DEFAULT_SHUFFLE_ARRAY, action) =>
action.type === 'SHUFFLE_ARRAY' ? shuffle(state) : state,
});
export default createRootReducer;

View File

@ -14,15 +14,13 @@
"@redux-devtools/dock-monitor": "^2.1.1",
"@redux-devtools/inspector-monitor": "^2.1.2",
"base16": "^1.0.0",
"connected-react-router": "^6.9.2",
"history": "^4.10.1",
"immutable": "^4.0.0",
"lodash.shuffle": "^4.2.0",
"react": "^17.0.2",
"react-bootstrap": "^2.3.1",
"react-dom": "^17.0.2",
"react-redux": "^7.2.8",
"react-router": "^5.3.1",
"react-router-dom": "^5.3.1",
"redux": "^4.2.0",
"redux-logger": "^3.0.6"
},
@ -32,13 +30,12 @@
"@babel/preset-react": "^7.16.7",
"@babel/preset-typescript": "^7.16.7",
"@types/base16": "^1.0.2",
"@types/history": "^4.7.11",
"@types/lodash.shuffle": "^4.2.7",
"@types/node": "^16.11.33",
"@types/react": "^17.0.45",
"@types/react-dom": "^17.0.16",
"@types/react-redux": "^7.1.24",
"@types/react-router": "^5.1.18",
"@types/react-router-dom": "^5.3.3",
"@types/redux-logger": "^3.0.9",
"@types/webpack-env": "^1.16.4",
"@typescript-eslint/eslint-plugin": "^5.22.0",

View File

@ -10,9 +10,8 @@ import Col from 'react-bootstrap/Col';
import InputGroup from 'react-bootstrap/InputGroup';
import Row from 'react-bootstrap/Row';
import * as base16 from 'base16';
import { push as pushRoute } from 'connected-react-router';
import { Path } from 'history';
import { inspectorThemes } from '@redux-devtools/inspector-monitor';
import { RouteComponentProps, withRouter } from 'react-router-dom';
import getOptions, { Options } from './getOptions';
import {
AddFunctionAction,
@ -140,14 +139,13 @@ interface Props
addFunction: () => void;
addSymbol: () => void;
shuffleArray: () => void;
pushRoute: (path: Path) => void;
}
class DemoApp extends React.Component<Props> {
class DemoApp extends React.Component<Props & RouteComponentProps> {
timeout?: number;
render() {
const options = getOptions(this.props.router.location);
const options = getOptions(this.props.location);
return (
<div style={styles.wrapper}>
@ -265,7 +263,7 @@ class DemoApp extends React.Component<Props> {
}
toggleExtension = () => {
const options = getOptions(this.props.router.location);
const options = getOptions(this.props.location);
window.location.href = buildUrl({
...options,
@ -274,21 +272,21 @@ class DemoApp extends React.Component<Props> {
};
toggleImmutableSupport = () => {
const options = getOptions(this.props.router.location);
const options = getOptions(this.props.location);
this.props.pushRoute(
this.props.history.push(
buildUrl({ ...options, supportImmutable: !options.supportImmutable })
);
};
toggleTheme = () => {
const options = getOptions(this.props.router.location);
const options = getOptions(this.props.location);
this.props.pushRoute(buildUrl({ ...options, dark: !options.dark }));
this.props.history.push(buildUrl({ ...options, dark: !options.dark }));
};
setTheme = (options: Options, theme: string) => {
this.props.pushRoute(buildUrl({ ...options, theme }));
this.props.history.push(buildUrl({ ...options, theme }));
};
toggleTimeoutUpdate = () => {
@ -332,5 +330,4 @@ export default connect((state: DemoAppState) => state, {
addFunction: (): AddFunctionAction => ({ type: 'ADD_FUNCTION' }),
addSymbol: (): AddSymbolAction => ({ type: 'ADD_SYMBOL' }),
shuffleArray: (): ShuffleArrayAction => ({ type: 'SHUFFLE_ARRAY' }),
pushRoute,
})(DemoApp);
})(withRouter(DemoApp));

View File

@ -1,14 +1,12 @@
import React from 'react';
import { connect } from 'react-redux';
import { createDevTools } from '@redux-devtools/core';
import { DockMonitor } from '@redux-devtools/dock-monitor';
import { Location } from 'history';
import {
InspectorMonitor,
base16Themes,
} from '@redux-devtools/inspector-monitor';
import { RouteComponentProps, withRouter } from 'react-router-dom';
import getOptions from './getOptions';
import { DemoAppState } from './reducers';
const CustomComponent = () => (
<div
@ -48,13 +46,9 @@ export const getDevTools = (location: { search: string }) =>
</DockMonitor>
);
const UnconnectedDevTools = ({ location }: { location: Location }) => {
const UnconnectedDevTools = ({ location }: RouteComponentProps) => {
const DevTools = getDevTools(location);
return <DevTools />;
};
const mapStateToProps = (state: DemoAppState) => ({
location: state.router.location,
});
export const ConnectedDevTools = connect(mapStateToProps)(UnconnectedDevTools);
export const ConnectedDevTools = withRouter(UnconnectedDevTools);

View File

@ -9,12 +9,12 @@ export default function getOptions(location: { search: string }) {
return {
useExtension: location.search.indexOf('ext') !== -1,
supportImmutable: location.search.indexOf('immutable') !== -1,
theme: getTheme(),
theme: getTheme(location),
dark: location.search.indexOf('dark') !== -1,
};
}
function getTheme() {
function getTheme(location: { search: string }) {
const match = /theme=([^&]+)/.exec(location.search);
return match ? match[1] : 'inspector';
}

View File

@ -9,12 +9,10 @@ import {
StoreEnhancer,
} from 'redux';
import logger from 'redux-logger';
import { Route } from 'react-router';
import { createBrowserHistory } from 'history';
import { ConnectedRouter, routerMiddleware } from 'connected-react-router';
import { BrowserRouter, Route } from 'react-router-dom';
import { persistState } from '@redux-devtools/core';
import DemoApp from './DemoApp';
import createRootReducer from './reducers';
import { rootReducer } from './reducers';
import getOptions from './getOptions';
import { ConnectedDevTools, getDevTools } from './DevTools';
@ -30,14 +28,12 @@ const ROOT =
const DevTools = getDevTools(window.location);
const history = createBrowserHistory();
const useDevtoolsExtension =
!!(window as unknown as { __REDUX_DEVTOOLS_EXTENSION__: unknown })
.__REDUX_DEVTOOLS_EXTENSION__ && getOptions(window.location).useExtension;
const enhancer = compose(
applyMiddleware(logger, routerMiddleware(history)),
applyMiddleware(logger),
(next: StoreEnhancerStoreCreator) => {
const instrument = useDevtoolsExtension
? (
@ -51,16 +47,16 @@ const enhancer = compose(
persistState(getDebugSessionKey())
);
const store = createStore(createRootReducer(history), enhancer);
const store = createStore(rootReducer, enhancer);
render(
<Provider store={store}>
<ConnectedRouter history={history}>
<BrowserRouter>
<Route path={ROOT}>
<DemoApp />
</Route>
{!useDevtoolsExtension && <ConnectedDevTools />}
</ConnectedRouter>
</BrowserRouter>
</Provider>,
document.getElementById('root')
);

View File

@ -1,12 +1,6 @@
import Immutable from 'immutable';
import shuffle from 'lodash.shuffle';
import { combineReducers, Reducer } from 'redux';
import {
connectRouter,
LocationChangeAction,
RouterState,
} from 'connected-react-router';
import { History } from 'history';
type Nested = { long: { nested: { path: { to: { a: string } } }[] } };
@ -168,11 +162,9 @@ type DemoAppAction =
| HugePayloadAction
| AddFunctionAction
| AddSymbolAction
| ShuffleArrayAction
| LocationChangeAction;
| ShuffleArrayAction;
export interface DemoAppState {
router: RouterState;
timeoutUpdateEnabled: boolean;
store: number;
undefined: { val: undefined };
@ -192,11 +184,8 @@ export interface DemoAppState {
shuffleArray: unknown[];
}
const createRootReducer = (
history: History
): Reducer<DemoAppState, DemoAppAction> =>
export const rootReducer: Reducer<DemoAppState, DemoAppAction> =
combineReducers<DemoAppState, DemoAppAction>({
router: connectRouter(history) as Reducer<RouterState, DemoAppAction>,
timeoutUpdateEnabled: (state = false, action) =>
action.type === 'TOGGLE_TIMEOUT_UPDATE'
? action.timeoutUpdateEnabled
@ -263,5 +252,3 @@ const createRootReducer = (
shuffleArray: (state = DEFAULT_SHUFFLE_ARRAY, action) =>
action.type === 'SHUFFLE_ARRAY' ? shuffle(state) : state,
});
export default createRootReducer;

View File

@ -1362,20 +1362,18 @@ importers:
'@redux-devtools/inspector-monitor': ^2.1.2
'@redux-devtools/inspector-monitor-test-tab': ^0.8.6
'@redux-devtools/ui': ^1.2.1
'@types/history': ^4.7.11
'@types/lodash.shuffle': ^4.2.7
'@types/node': ^16.11.33
'@types/react': ^17.0.45
'@types/react-dom': ^17.0.16
'@types/react-redux': ^7.1.24
'@types/react-router': ^5.1.18
'@types/react-router-dom': ^5.3.3
'@types/redux-logger': ^3.0.9
'@types/styled-components': ^5.1.25
'@types/webpack-env': ^1.16.4
'@typescript-eslint/eslint-plugin': ^5.22.0
'@typescript-eslint/parser': ^5.22.0
babel-loader: ^8.2.5
connected-react-router: ^6.9.2
cross-env: ^7.0.3
css-loader: ^6.7.1
eslint: ^8.15.0
@ -1383,7 +1381,6 @@ importers:
eslint-plugin-react: ~7.28.0
eslint-plugin-react-hooks: ^4.5.0
fork-ts-checker-webpack-plugin: ^7.2.11
history: ^4.10.1
html-webpack-plugin: ^5.5.0
immutable: ^4.0.0
lodash.shuffle: ^4.2.0
@ -1391,7 +1388,7 @@ importers:
react-dom: ^17.0.2
react-is: ^17.0.2
react-redux: ^7.2.8
react-router: ^5.3.1
react-router-dom: ^5.3.1
redux: ^4.2.0
redux-logger: ^3.0.6
style-loader: ^3.3.1
@ -1407,15 +1404,13 @@ importers:
'@redux-devtools/inspector-monitor': link:../../redux-devtools-inspector-monitor
'@redux-devtools/inspector-monitor-test-tab': link:..
'@redux-devtools/ui': link:../../redux-devtools-ui
connected-react-router: 6.9.2_00712eb8f791d7f1c28c0ddcca5e8608
history: 4.10.1
immutable: 4.0.0
lodash.shuffle: 4.2.0
react: 17.0.2
react-dom: 17.0.2_react@17.0.2
react-is: 17.0.2
react-redux: 7.2.8_react-dom@17.0.2+react@17.0.2
react-router: 5.3.1_react@17.0.2
react-router-dom: 5.3.1_react@17.0.2
redux: 4.2.0
redux-logger: 3.0.6
styled-components: 5.3.5_281a4fa50a045c9112baf635f3bc27a7
@ -1424,13 +1419,12 @@ importers:
'@babel/preset-env': 7.17.10_@babel+core@7.17.10
'@babel/preset-react': 7.16.7_@babel+core@7.17.10
'@babel/preset-typescript': 7.16.7_@babel+core@7.17.10
'@types/history': 4.7.11
'@types/lodash.shuffle': 4.2.7
'@types/node': 16.11.33
'@types/react': 17.0.45
'@types/react-dom': 17.0.16
'@types/react-redux': 7.1.24
'@types/react-router': 5.1.18
'@types/react-router-dom': 5.3.3
'@types/redux-logger': 3.0.9
'@types/styled-components': 5.1.25
'@types/webpack-env': 1.16.4
@ -1549,27 +1543,24 @@ importers:
'@redux-devtools/dock-monitor': ^2.1.1
'@redux-devtools/inspector-monitor': ^2.1.2
'@types/base16': ^1.0.2
'@types/history': ^4.7.11
'@types/lodash.shuffle': ^4.2.7
'@types/node': ^16.11.33
'@types/react': ^17.0.45
'@types/react-dom': ^17.0.16
'@types/react-redux': ^7.1.24
'@types/react-router': ^5.1.18
'@types/react-router-dom': ^5.3.3
'@types/redux-logger': ^3.0.9
'@types/webpack-env': ^1.16.4
'@typescript-eslint/eslint-plugin': ^5.22.0
'@typescript-eslint/parser': ^5.22.0
babel-loader: ^8.2.5
base16: ^1.0.0
connected-react-router: ^6.9.2
cross-env: ^7.0.3
eslint: ^8.15.0
eslint-config-prettier: ^8.5.0
eslint-plugin-react: ~7.28.0
eslint-plugin-react-hooks: ^4.5.0
fork-ts-checker-webpack-plugin: ^7.2.11
history: ^4.10.1
html-webpack-plugin: ^5.5.0
immutable: ^4.0.0
lodash.shuffle: ^4.2.0
@ -1577,7 +1568,7 @@ importers:
react-bootstrap: ^2.3.1
react-dom: ^17.0.2
react-redux: ^7.2.8
react-router: ^5.3.1
react-router-dom: ^5.3.1
redux: ^4.2.0
redux-logger: ^3.0.6
ts-node: ^10.7.0
@ -1590,15 +1581,13 @@ importers:
'@redux-devtools/dock-monitor': link:../../redux-devtools-dock-monitor
'@redux-devtools/inspector-monitor': link:..
base16: 1.0.0
connected-react-router: 6.9.2_00712eb8f791d7f1c28c0ddcca5e8608
history: 4.10.1
immutable: 4.0.0
lodash.shuffle: 4.2.0
react: 17.0.2
react-bootstrap: 2.3.1_569957a51d469c962fcce166a59b9f78
react-dom: 17.0.2_react@17.0.2
react-redux: 7.2.8_react-dom@17.0.2+react@17.0.2
react-router: 5.3.1_react@17.0.2
react-router-dom: 5.3.1_react@17.0.2
redux: 4.2.0
redux-logger: 3.0.6
devDependencies:
@ -1607,13 +1596,12 @@ importers:
'@babel/preset-react': 7.16.7_@babel+core@7.17.10
'@babel/preset-typescript': 7.16.7_@babel+core@7.17.10
'@types/base16': 1.0.2
'@types/history': 4.7.11
'@types/lodash.shuffle': 4.2.7
'@types/node': 16.11.33
'@types/react': 17.0.45
'@types/react-dom': 17.0.16
'@types/react-redux': 7.1.24
'@types/react-router': 5.1.18
'@types/react-router-dom': 5.3.3
'@types/redux-logger': 3.0.9
'@types/webpack-env': 1.16.4
'@typescript-eslint/eslint-plugin': 5.22.0_9817cbad956b8aa5d1e3d9ec99e4a1e4
@ -10979,27 +10967,6 @@ packages:
engines: {node: '>=0.8'}
dev: true
/connected-react-router/6.9.2_00712eb8f791d7f1c28c0ddcca5e8608:
resolution: {integrity: sha512-bE8kNBiZv9Mivp7pYn9JvLH5ItTjLl45kk1/Vha0rmAK9I/ETb5JPJrAm0h2KCG9qLfv7vqU3Jo4UUDo0oJnQg==}
peerDependencies:
history: ^4.7.2
react: ^16.4.0 || ^17.0.0
react-redux: ^6.0.0 || ^7.1.0
react-router: ^4.3.1 || ^5.0.0
redux: ^3.6.0 || ^4.0.0
dependencies:
history: 4.10.1
lodash.isequalwith: 4.4.0
prop-types: 15.8.1
react: 17.0.2
react-redux: 7.2.8_react-dom@17.0.2+react@17.0.2
react-router: 5.3.1_react@17.0.2
redux: 4.2.0
optionalDependencies:
immutable: 4.0.0
seamless-immutable: 7.1.4
dev: false
/console-browserify/1.2.0:
resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==}
dev: true
@ -15582,6 +15549,7 @@ packages:
chalk: 2.4.2
diff-match-patch: 1.0.5
dev: false
bundledDependencies: []
/jsonfile/2.4.0:
resolution: {integrity: sha1-NzaitCi4e72gzIO1P6PWM6NcKug=}
@ -16081,10 +16049,6 @@ packages:
resolution: {integrity: sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=}
dev: false
/lodash.isequalwith/4.4.0:
resolution: {integrity: sha1-Jmcm3dUo+FTyH06pigZWBuD7xrA=}
dev: false
/lodash.isinteger/4.0.4:
resolution: {integrity: sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=}
dev: false
@ -19418,12 +19382,6 @@ packages:
ajv-keywords: 5.1.0_ajv@8.11.0
dev: true
/seamless-immutable/7.1.4:
resolution: {integrity: sha512-XiUO1QP4ki4E2PHegiGAlu6r82o5A+6tRh7IkGGTVg/h+UoeX4nFBeCGPOhb4CYjvkqsfm/TUtvOMYC1xmV30A==}
requiresBuild: true
dev: false
optional: true
/select-hose/2.0.0:
resolution: {integrity: sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=}
dev: true