mirror of
https://github.com/kingomarnajjar/flex-template-web.git
synced 2026-07-31 02:26:50 +10:00
commit
36ee21ea91
67 changed files with 327 additions and 380 deletions
10
package.json
10
package.json
|
|
@ -6,7 +6,7 @@
|
|||
"basic-auth": "^1.1.0",
|
||||
"classnames": "^2.2.5",
|
||||
"compression": "^1.6.2",
|
||||
"express": "^4.14.0",
|
||||
"express": "^4.14.1",
|
||||
"helmet": "^3.3.0",
|
||||
"lodash": "^4.17.4",
|
||||
"path-to-regexp": "^1.5.3",
|
||||
|
|
@ -19,20 +19,20 @@
|
|||
"react-router": "4.0.0-alpha.6",
|
||||
"react-test-renderer": "^15.4.2",
|
||||
"redux": "^3.6.0",
|
||||
"redux-form": "^6.4.3",
|
||||
"redux-form": "^6.5.0",
|
||||
"sanitize.css": "^4.1.0",
|
||||
"sharetribe-scripts": "0.8.6",
|
||||
"source-map-support": "^0.4.10"
|
||||
"source-map-support": "^0.4.11"
|
||||
},
|
||||
"devDependencies": {
|
||||
"nodemon": "^1.11.0",
|
||||
"prettier": "^0.0.8"
|
||||
"prettier": "^0.13.1"
|
||||
},
|
||||
"scripts": {
|
||||
"clean": "rm -rf build/*",
|
||||
"dev": "sharetribe-scripts start",
|
||||
"build": "sharetribe-scripts build",
|
||||
"prettier": "prettier --write --print-width 100 --single-quote --trailing-comma server/*.js src/*.js src/**/*.js src/**/**/*.js",
|
||||
"format": "prettier --write --print-width 100 --single-quote --trailing-comma 'server/**/*.js' 'src/**/*.js'",
|
||||
"test": "sharetribe-scripts test --env=jsdom",
|
||||
"test-ci": "sharetribe-scripts test --env=jsdom --runInBand",
|
||||
"eject": "sharetribe-scripts eject",
|
||||
|
|
|
|||
|
|
@ -36,19 +36,15 @@ const MatchWithSubRoutes = props => {
|
|||
<Match
|
||||
{...rest}
|
||||
render={matchProps => {
|
||||
return canShowComponent
|
||||
? <Component {...matchProps} />
|
||||
: (
|
||||
<Redirect
|
||||
to={
|
||||
{
|
||||
pathname: pathByRouteName('LogInPage', routesConfiguration, {}),
|
||||
state: { from: matchProps.location },
|
||||
}
|
||||
}
|
||||
/>
|
||||
);
|
||||
}}
|
||||
return canShowComponent
|
||||
? <Component {...matchProps} />
|
||||
: <Redirect
|
||||
to={{
|
||||
pathname: pathByRouteName('LogInPage', routesConfiguration, {}),
|
||||
state: { from: matchProps.location },
|
||||
}}
|
||||
/>;
|
||||
}}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
|
@ -62,7 +58,7 @@ MatchWithSubRoutes.propTypes = {
|
|||
auth: bool,
|
||||
exactly: bool,
|
||||
name: string.isRequired,
|
||||
component: oneOfType([ func, node ]).isRequired,
|
||||
component: oneOfType([func, node]).isRequired,
|
||||
};
|
||||
|
||||
const Routes = props => {
|
||||
|
|
|
|||
20
src/app.js
20
src/app.js
|
|
@ -12,15 +12,15 @@ import localeData from './translations/en.json';
|
|||
|
||||
export const ClientApp = props => {
|
||||
const { store } = props;
|
||||
addLocaleData([ ...en ]);
|
||||
addLocaleData([...en]);
|
||||
return (
|
||||
<IntlProvider locale="en" messages={localeData}>
|
||||
<BrowserRouter>
|
||||
{({ router }) => (
|
||||
<Provider store={store}>
|
||||
<Routes router={router} routes={routesConfiguration} />
|
||||
</Provider>
|
||||
)}
|
||||
<Provider store={store}>
|
||||
<Routes router={router} routes={routesConfiguration} />
|
||||
</Provider>
|
||||
)}
|
||||
</BrowserRouter>
|
||||
</IntlProvider>
|
||||
);
|
||||
|
|
@ -32,15 +32,15 @@ ClientApp.propTypes = { store: any.isRequired };
|
|||
|
||||
export const ServerApp = props => {
|
||||
const { url, context, store } = props;
|
||||
addLocaleData([ ...en ]);
|
||||
addLocaleData([...en]);
|
||||
return (
|
||||
<IntlProvider locale="en" messages={localeData}>
|
||||
<ServerRouter location={url} context={context}>
|
||||
{({ router }) => (
|
||||
<Provider store={store}>
|
||||
<Routes router={router} routes={routesConfiguration} />
|
||||
</Provider>
|
||||
)}
|
||||
<Provider store={store}>
|
||||
<Routes router={router} routes={routesConfiguration} />
|
||||
</Provider>
|
||||
)}
|
||||
</ServerRouter>
|
||||
</IntlProvider>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -5,14 +5,12 @@ import BookingInfo from './BookingInfo';
|
|||
describe('BookingInfo', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<BookingInfo
|
||||
pricePerDay="55\\u20AC"
|
||||
bookingPeriod="Jan 2nd - Jan 4th"
|
||||
bookingDuration="3 days"
|
||||
total="165\u20AC"
|
||||
/>
|
||||
),
|
||||
<BookingInfo
|
||||
pricePerDay="55\\u20AC"
|
||||
bookingPeriod="Jan 2nd - Jan 4th"
|
||||
bookingDuration="3 days"
|
||||
total="165\u20AC"
|
||||
/>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -50,8 +50,8 @@ class Discussion extends Component {
|
|||
autoFocus
|
||||
type="text"
|
||||
ref={input => {
|
||||
this.input = input;
|
||||
}}
|
||||
this.input = input;
|
||||
}}
|
||||
value={this.state.message}
|
||||
onChange={this.handleOnChange}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -8,13 +8,11 @@ import FilterPanel from './FilterPanel';
|
|||
describe('FilterPanel', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<FilterPanel />
|
||||
</RoutesProvider>
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<FilterPanel />
|
||||
</RoutesProvider>
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -6,13 +6,11 @@ import HeroSection from './HeroSection';
|
|||
describe('HeroSection', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<HeroSection params={{ displayName: 'most-awesome-shop' }}>
|
||||
test
|
||||
</HeroSection>
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<HeroSection params={{ displayName: 'most-awesome-shop' }}>
|
||||
test
|
||||
</HeroSection>
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ const ListingCard = props => {
|
|||
{location}
|
||||
</div>
|
||||
<div className={css.reviews}>
|
||||
(<span>{review.rating}</span><span>/5</span>){' '}
|
||||
(<span>{review.rating}</span><span>/5</span>){' '}
|
||||
<span>{review.count}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -41,7 +41,7 @@ const ListingCard = props => {
|
|||
<div className={css.authorDetails}>
|
||||
<span className={css.authorName}>{author.name}</span>
|
||||
<div className={css.authorReview}>
|
||||
review: <span>{author.review.rating}</span><span>/5</span>
|
||||
review: <span>{author.review.rating}</span><span>/5</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -21,13 +21,11 @@ describe('ListingCard', () => {
|
|||
},
|
||||
};
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<ListingCard {...listing} />
|
||||
</RoutesProvider>
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<ListingCard {...listing} />
|
||||
</RoutesProvider>
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ const ListingCardSmall = props => {
|
|||
{title}
|
||||
</NamedLink>
|
||||
<div className={css.reviews}>
|
||||
(<span>{review.rating}</span><span>/5</span>){' '}
|
||||
(<span>{review.rating}</span><span>/5</span>){' '}
|
||||
<span>{review.count}</span>
|
||||
</div>
|
||||
<div className={css.price}>
|
||||
|
|
|
|||
|
|
@ -21,13 +21,11 @@ describe('ListingCardSmall', () => {
|
|||
},
|
||||
};
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<ListingCardSmall {...listing} />
|
||||
</RoutesProvider>
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<ListingCardSmall {...listing} />
|
||||
</RoutesProvider>
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -8,13 +8,11 @@ import MapPanel from './MapPanel';
|
|||
describe('MapPanel', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<MapPanel />
|
||||
</RoutesProvider>
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<MapPanel />
|
||||
</RoutesProvider>
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import css from './Menu.css';
|
|||
|
||||
const Menu = () => (
|
||||
<div className={css.container}>
|
||||
New York, Jan 2nd – Jan 4th <span className={css.openIndicator}>▼</span>
|
||||
New York, Jan 2nd – Jan 4th <span className={css.openIndicator}>▼</span>
|
||||
</div>
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -12,17 +12,15 @@ describe('NamedLink', () => {
|
|||
{ pattern: '/somepage/:id', name: 'SomePage', component: () => <div>blaa</div> },
|
||||
];
|
||||
const component = renderer.create(
|
||||
(
|
||||
<BrowserRouter>
|
||||
<RoutesProvider routes={routesConf}>
|
||||
<NamedLink name="SomePage" params={{ id }}>to SomePage</NamedLink>
|
||||
</RoutesProvider>
|
||||
</BrowserRouter>
|
||||
),
|
||||
<BrowserRouter>
|
||||
<RoutesProvider routes={routesConf}>
|
||||
<NamedLink name="SomePage" params={{ id }}>to SomePage</NamedLink>
|
||||
</RoutesProvider>
|
||||
</BrowserRouter>,
|
||||
);
|
||||
const json = component.toJSON();
|
||||
expect(json.type).toEqual('a');
|
||||
expect(json.props.href).toEqual(`/somepage/${id}`);
|
||||
expect(json.children).toEqual([ 'to SomePage' ]);
|
||||
expect(json.children).toEqual(['to SomePage']);
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ OrderDetailsPanel.defaultProps = { className: null };
|
|||
|
||||
OrderDetailsPanel.propTypes = {
|
||||
className: string,
|
||||
orderId: oneOfType([ string, number ]).isRequired,
|
||||
orderId: oneOfType([string, number]).isRequired,
|
||||
title: string.isRequired,
|
||||
imageUrl: string.isRequired,
|
||||
info: object.isRequired,
|
||||
|
|
|
|||
|
|
@ -25,13 +25,11 @@ describe('OrderDetailsPanel', () => {
|
|||
confirmationCode: 'some-test-confirmation-code',
|
||||
};
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<OrderDetailsPanel {...props} />
|
||||
</RoutesProvider>
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<OrderDetailsPanel {...props} />
|
||||
</RoutesProvider>
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -8,13 +8,11 @@ import routesConfiguration from '../../routesConfiguration';
|
|||
describe('OrderDiscussionPanel', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<OrderDiscussionPanel />
|
||||
</RoutesProvider>
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<OrderDiscussionPanel />
|
||||
</RoutesProvider>
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import renderer from 'react-test-renderer';
|
|||
|
||||
describe('RoutesProvider', () => {
|
||||
it('should contain routes from context', () => {
|
||||
const routesConf = [ { name: 'SomePage' } ];
|
||||
const routesConf = [{ name: 'SomePage' }];
|
||||
const Child = (props, context) => {
|
||||
return <div>{context.routes[0].name}</div>;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -8,13 +8,11 @@ import SearchResultsPanel from './SearchResultsPanel';
|
|||
describe('SearchResultsPanel', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<SearchResultsPanel />
|
||||
</RoutesProvider>
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<SearchResultsPanel />
|
||||
</RoutesProvider>
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -45,12 +45,12 @@ class AuthenticationPage extends Component {
|
|||
? <LoginForm onSubmit={this.handleLogIn} />
|
||||
: <SignUpForm onSubmit={this.handleSignUp} />;
|
||||
|
||||
const fromLoginMsg = from && from.pathname ? (
|
||||
<p>
|
||||
const fromLoginMsg = from && from.pathname
|
||||
? <p>
|
||||
You must log in to view the page at
|
||||
<code>{from.pathname}</code>
|
||||
</p>
|
||||
) : null;
|
||||
: null;
|
||||
|
||||
return (
|
||||
<PageLayout title={`Authentication page: ${this.props.tab} tab`}>
|
||||
|
|
@ -69,7 +69,7 @@ const { any, oneOf, shape } = PropTypes;
|
|||
|
||||
AuthenticationPage.propTypes = {
|
||||
location: shape({ state: shape({ from: any }) }),
|
||||
tab: oneOf([ 'login', 'signup' ]),
|
||||
tab: oneOf(['login', 'signup']),
|
||||
};
|
||||
|
||||
export default AuthenticationPage;
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ import AuthenticationPage from './AuthenticationPage';
|
|||
describe('AuthenticationPage', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<AuthenticationPage location={{ state: { from: '/protected' } }} />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<AuthenticationPage location={{ state: { from: '/protected' } }} />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -19,4 +19,4 @@ const ChangeAccountPasswordForm = props => {
|
|||
|
||||
ChangeAccountPasswordForm.propTypes = { ...formPropTypes };
|
||||
|
||||
export default reduxForm({ form: 'changeAccountPassword' })(ChangeAccountPasswordForm)
|
||||
export default reduxForm({ form: 'changeAccountPassword' })(ChangeAccountPasswordForm);
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ import ChangeAccountPasswordForm from './ChangeAccountPasswordForm';
|
|||
describe('ChangeAccountPasswordForm', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<ChangeAccountPasswordForm />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<ChangeAccountPasswordForm />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -16,4 +16,4 @@ const ChangePasswordForm = props => {
|
|||
|
||||
ChangePasswordForm.propTypes = { ...formPropTypes };
|
||||
|
||||
export default reduxForm({ form: 'changePassword' })(ChangePasswordForm)
|
||||
export default reduxForm({ form: 'changePassword' })(ChangePasswordForm);
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ import ChangePasswordForm from './ChangePasswordForm';
|
|||
describe('ChangePasswordForm', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<ChangePasswordForm />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<ChangePasswordForm />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -8,13 +8,11 @@ import routesConfiguration from '../../routesConfiguration';
|
|||
describe('CheckoutPage', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<CheckoutPage params={{ listingId: 'some-listing-id' }} />
|
||||
</RoutesProvider>
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<CheckoutPage params={{ listingId: 'some-listing-id' }} />
|
||||
</RoutesProvider>
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import React from 'react';
|
||||
import { PageLayout } from '../../components';
|
||||
|
||||
export default () => <PageLayout title="Contact details" />
|
||||
export default () => <PageLayout title="Contact details" />;
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ import ContactDetailsPage from './ContactDetailsPage';
|
|||
describe('ContactDetailsPage', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<ContactDetailsPage params={{ displayName: 'my-shop' }} />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<ContactDetailsPage params={{ displayName: 'my-shop' }} />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ import EditProfilePage from './EditProfilePage';
|
|||
describe('EditProfilePage', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<EditProfilePage params={{ displayName: 'my-shop' }} />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<EditProfilePage params={{ displayName: 'my-shop' }} />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -29,4 +29,4 @@ const HeroSearchForm = props => {
|
|||
|
||||
HeroSearchForm.propTypes = { ...formPropTypes, intl: intlShape.isRequired };
|
||||
|
||||
export default reduxForm({ form: 'herosearchform' })(injectIntl(HeroSearchForm))
|
||||
export default reduxForm({ form: 'herosearchform' })(injectIntl(HeroSearchForm));
|
||||
|
|
|
|||
|
|
@ -10,11 +10,9 @@ describe('HeroSearchForm', () => {
|
|||
it('matches snapshot', () => {
|
||||
const store = configureStore();
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<HeroSearchForm />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<HeroSearchForm />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -28,6 +28,6 @@ InboxPage.defaultProps = { filter: 'conversation' };
|
|||
|
||||
const { oneOf } = PropTypes;
|
||||
|
||||
InboxPage.propTypes = { filter: oneOf([ 'orders', 'sales', 'inbox' ]) };
|
||||
InboxPage.propTypes = { filter: oneOf(['orders', 'sales', 'inbox']) };
|
||||
|
||||
export default InboxPage;
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ import InboxPage from './InboxPage';
|
|||
describe('InboxPage', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<InboxPage filter="inbox" />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<InboxPage filter="inbox" />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -13,13 +13,11 @@ export const LandingPageComponent = props => {
|
|||
const handleSubmit = createSubmitHandler(props.onLocationChanged);
|
||||
const componentOrRedirect = props.LocationFilter && props.LocationFilter.length > 0
|
||||
? <NamedRedirect name="SearchPage" query={{ location: props.LocationFilter }} />
|
||||
: (
|
||||
<PageLayout title="Landing page">
|
||||
: <PageLayout title="Landing page">
|
||||
<HeroSection>
|
||||
<HeroSearchForm className={css.form} onSubmit={handleSubmit} />
|
||||
</HeroSection>
|
||||
</PageLayout>
|
||||
);
|
||||
</PageLayout>;
|
||||
|
||||
return componentOrRedirect;
|
||||
};
|
||||
|
|
@ -43,4 +41,4 @@ const mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
|||
return { onLocationChanged: v => dispatch(changeLocationFilter(v)) };
|
||||
};
|
||||
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(LandingPageComponent)
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(LandingPageComponent);
|
||||
|
|
|
|||
|
|
@ -8,13 +8,11 @@ import routesConfiguration from '../../routesConfiguration';
|
|||
describe('LandingPage', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<LandingPageComponent onLocationChanged={v => v} />
|
||||
</RoutesProvider>
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<LandingPageComponent onLocationChanged={v => v} />
|
||||
</RoutesProvider>
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -13,7 +13,8 @@ const info = {
|
|||
{ id: 4, title: 'img4', imageUrl: 'http://placehold.it/750x470' },
|
||||
{ id: 5, title: 'img5', imageUrl: 'http://placehold.it/750x470' },
|
||||
],
|
||||
description: `
|
||||
description: (
|
||||
`
|
||||
<p>
|
||||
Organic Music Production in a Sustainable, Ethical and Professional Studio.
|
||||
</p>
|
||||
|
|
@ -24,17 +25,20 @@ const info = {
|
|||
Banyan Studios is a comfortable, conscious, inspiring and creative retreat for musicians trying to convey their message through state of the art Audio & Video.
|
||||
</p>
|
||||
<a href="https://vimeo.com/168106603" alt="video">https://vimeo.com/168106603</a>
|
||||
`,
|
||||
`
|
||||
),
|
||||
reviews: [
|
||||
{
|
||||
id: 1,
|
||||
reviewer: { avatar: 'http://placehold.it/44x44', name: 'Vesa L.', date: 'January 2017' },
|
||||
rating: 4,
|
||||
review: `
|
||||
review: (
|
||||
`
|
||||
Great studio in the New York for music professionals. Everything you need
|
||||
can be found from here and John was helpful with the right settings -
|
||||
we even got some tips for our songs! :)
|
||||
`,
|
||||
`
|
||||
),
|
||||
},
|
||||
],
|
||||
};
|
||||
|
|
@ -46,12 +50,12 @@ const ListingPage = () => (
|
|||
<img className={css.mainImage} alt={info.images[0].title} src={info.images[0].imageUrl} />
|
||||
<div className={css.thumbnailContainer}>
|
||||
{info.images.slice(1).map(image => (
|
||||
<div key={image.id} className={css.squareWrapper}>
|
||||
<div className={css.aspectWrapper}>
|
||||
<img className={css.thumbnail} alt={image.title} src={image.imageUrl} />
|
||||
</div>
|
||||
<div key={image.id} className={css.squareWrapper}>
|
||||
<div className={css.aspectWrapper}>
|
||||
<img className={css.thumbnail} alt={image.title} src={image.imageUrl} />
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
{/* eslint-disable react/no-danger */}
|
||||
|
|
@ -71,34 +75,34 @@ const ListingPage = () => (
|
|||
<h2>Studio reviews (1)</h2>
|
||||
<div className={css.reviews}>
|
||||
{info.reviews.map(review => (
|
||||
<div key={review.id} className={css.review}>
|
||||
<p>{review.review}</p>
|
||||
<div key={review.id} className={css.review}>
|
||||
<p>{review.review}</p>
|
||||
<div className={css.reviewDetails}>
|
||||
<div className={css.avatarWrapper}>
|
||||
<img
|
||||
className={css.avatar}
|
||||
src={review.reviewer.avatar}
|
||||
alt={review.reviewer.name}
|
||||
/>
|
||||
</div>
|
||||
<div className={css.reviewDetails}>
|
||||
<div className={css.avatarWrapper}>
|
||||
<img
|
||||
className={css.avatar}
|
||||
src={review.reviewer.avatar}
|
||||
alt={review.reviewer.name}
|
||||
/>
|
||||
</div>
|
||||
<div className={css.reviewDetails}>
|
||||
<span className={css.authorName}>{review.reviewer.name}</span><span
|
||||
className={css.date}
|
||||
>
|
||||
{review.reviewer.date}
|
||||
</span>
|
||||
</div>
|
||||
<div className={css.rating}>
|
||||
review: <span>{review.rating}</span><span>/5</span>
|
||||
</div>
|
||||
<span className={css.authorName}>{review.reviewer.name}</span><span
|
||||
className={css.date}
|
||||
>
|
||||
{review.reviewer.date}
|
||||
</span>
|
||||
</div>
|
||||
<div className={css.rating}>
|
||||
review: <span>{review.rating}</span><span>/5</span>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<div className={css.map}>Map</div>
|
||||
<NamedLink className={css.buttonLink} name="OrderDetailsPage" params={{ id: 12345 }}>
|
||||
{`Book ${info.title}`}
|
||||
{`Book ${info.title}`}
|
||||
</NamedLink>
|
||||
</PageLayout>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -8,13 +8,11 @@ import ListingPage from './ListingPage';
|
|||
describe('ListingPage', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<ListingPage params={{ slug: 'banyan-studios', id: 1234 }} />
|
||||
</RoutesProvider>
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<ListingPage params={{ slug: 'banyan-studios', id: 1234 }} />
|
||||
</RoutesProvider>
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -17,4 +17,4 @@ const LoginForm = props => {
|
|||
|
||||
LoginForm.propTypes = { ...formPropTypes };
|
||||
|
||||
export default reduxForm({ form: 'login' })(LoginForm)
|
||||
export default reduxForm({ form: 'login' })(LoginForm);
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ import LoginForm from './LoginForm';
|
|||
describe('LoginForm', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<LoginForm />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<LoginForm />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -8,4 +8,4 @@ export default () => (
|
|||
<li><Link to="/l/1234">Listing 1234</Link></li>
|
||||
</ul>
|
||||
</PageLayout>
|
||||
)
|
||||
);
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ import ManageListingsPage from './ManageListingsPage';
|
|||
describe('ManageListingsPage', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<ManageListingsPage />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<ManageListingsPage />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -6,4 +6,4 @@ export default () => (
|
|||
<PageLayout title="Page not found">
|
||||
<Link to="/">Index page</Link>
|
||||
</PageLayout>
|
||||
)
|
||||
);
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ import NotFoundPage from './NotFoundPage';
|
|||
describe('NotFoundPage', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<NotFoundPage />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<NotFoundPage />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -58,8 +58,8 @@ const OrderPage = props => {
|
|||
const { string, shape, oneOfType, number, oneOf } = PropTypes;
|
||||
|
||||
OrderPage.propTypes = {
|
||||
params: shape({ id: oneOfType([ number, string ]).isRequired }).isRequired,
|
||||
tab: oneOf([ 'details', 'discussion' ]).isRequired,
|
||||
params: shape({ id: oneOfType([number, string]).isRequired }).isRequired,
|
||||
tab: oneOf(['details', 'discussion']).isRequired,
|
||||
};
|
||||
|
||||
export default OrderPage;
|
||||
|
|
|
|||
|
|
@ -8,13 +8,11 @@ import routesConfiguration from '../../routesConfiguration';
|
|||
describe('OrderPage', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<OrderPage params={{ id: 1234 }} tab="details" />
|
||||
</RoutesProvider>
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<OrderPage params={{ id: 1234 }} tab="details" />
|
||||
</RoutesProvider>
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ import PasswordChangePage from './PasswordChangePage';
|
|||
describe('PasswordChangePage', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<PasswordChangePage />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<PasswordChangePage />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -15,4 +15,4 @@ const PasswordForgottenForm = props => {
|
|||
|
||||
PasswordForgottenForm.propTypes = { ...formPropTypes };
|
||||
|
||||
export default reduxForm({ form: 'passwordForgotten' })(PasswordForgottenForm)
|
||||
export default reduxForm({ form: 'passwordForgotten' })(PasswordForgottenForm);
|
||||
|
|
|
|||
|
|
@ -8,11 +8,9 @@ describe('PasswordForgottenForm', () => {
|
|||
it('matches snapshot', () => {
|
||||
const store = configureStore();
|
||||
const component = renderer.create(
|
||||
(
|
||||
<Provider store={store}>
|
||||
<PasswordForgottenForm />
|
||||
</Provider>
|
||||
),
|
||||
<Provider store={store}>
|
||||
<PasswordForgottenForm />
|
||||
</Provider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ import PasswordForgottenPage from './PasswordForgottenPage';
|
|||
describe('PasswordForgottenPage', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<PasswordForgottenPage />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<PasswordForgottenPage />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import React from 'react';
|
||||
import { PageLayout } from '../../components';
|
||||
|
||||
export default () => <PageLayout title="Payout preferences" />
|
||||
export default () => <PageLayout title="Payout preferences" />;
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ import PayoutPreferencesPage from './PayoutPreferencesPage';
|
|||
describe('PayoutPreferencesPage', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<PayoutPreferencesPage />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<PayoutPreferencesPage />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ import ProfilePage from './ProfilePage';
|
|||
describe('ProfilePage', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<ProfilePage params={{ displayName: 'most-awesome-shop' }} />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<ProfilePage params={{ displayName: 'most-awesome-shop' }} />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ const SalesConversationPage = props => {
|
|||
<Link to={`/sale/${params.id}/details`}>Details tab</Link>
|
||||
<p>Mobile layout needs different views for discussion and details.</p>
|
||||
<p>
|
||||
Discussion view is the default if route doesn't specify mobile tab (e.g. <i>
|
||||
Discussion view is the default if route doesn't specify mobile tab (e.g. <i>
|
||||
/order/1234
|
||||
</i>)
|
||||
</p>
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ import SalesConversationPage from './SalesConversationPage';
|
|||
describe('SalesConversationPage', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<SalesConversationPage params={{ id: 12345 }} />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<SalesConversationPage params={{ id: 12345 }} />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ export default function reducer(state = {}, action = {}) {
|
|||
switch (type) {
|
||||
case ADD_FILTER: {
|
||||
const stateFilters = state.filters || [];
|
||||
return { ...state, ...{ filters: unionWith(stateFilters, [ payload ], isEqual) } };
|
||||
return { ...state, ...{ filters: unionWith(stateFilters, [payload], isEqual) } };
|
||||
}
|
||||
default:
|
||||
return state;
|
||||
|
|
|
|||
|
|
@ -109,4 +109,4 @@ const mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
|||
};
|
||||
};
|
||||
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(SearchPageComponent)
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(SearchPageComponent);
|
||||
|
|
|
|||
|
|
@ -9,13 +9,11 @@ import routesConfiguration from '../../routesConfiguration';
|
|||
describe('SearchPageComponent', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<SearchPageComponent />
|
||||
</RoutesProvider>
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<RoutesProvider routes={routesConfiguration}>
|
||||
<SearchPageComponent />
|
||||
</RoutesProvider>
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
@ -40,18 +38,18 @@ describe('SearchPageDucs', () => {
|
|||
const addFilter1 = addFilter('location', 'helsinki');
|
||||
const addFilter2 = addFilter('gears', 3);
|
||||
const reduced = reducer([], addFilter1);
|
||||
const reducedWithInitialContent = reducer({ filters: [ addFilter1.payload ] }, addFilter2);
|
||||
expect(reduced).toEqual({ filters: [ addFilter1.payload ] });
|
||||
expect(
|
||||
reducedWithInitialContent,
|
||||
).toEqual({ filters: [ addFilter1.payload, addFilter2.payload ] });
|
||||
const reducedWithInitialContent = reducer({ filters: [addFilter1.payload] }, addFilter2);
|
||||
expect(reduced).toEqual({ filters: [addFilter1.payload] });
|
||||
expect(reducedWithInitialContent).toEqual({
|
||||
filters: [addFilter1.payload, addFilter2.payload],
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle duplicates ADD_FILTER', () => {
|
||||
const filter = { location: 'helsinki' };
|
||||
const addFilter = { type: ADD_FILTER, payload: filter };
|
||||
const reducedWithInitialContent = reducer({ filters: [ filter ] }, addFilter);
|
||||
expect(reducedWithInitialContent).toEqual({ filters: [ filter ] });
|
||||
const reducedWithInitialContent = reducer({ filters: [filter] }, addFilter);
|
||||
expect(reducedWithInitialContent).toEqual({ filters: [filter] });
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -11,4 +11,4 @@ export default () => (
|
|||
<PageLayout title="Security">
|
||||
<ChangeAccountPasswordForm onSubmit={changePassword} />
|
||||
</PageLayout>
|
||||
)
|
||||
);
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ import SecurityPage from './SecurityPage';
|
|||
describe('SecurityPage', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<SecurityPage />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<SecurityPage />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -21,4 +21,4 @@ const SignUpForm = props => {
|
|||
|
||||
SignUpForm.propTypes = { ...formPropTypes };
|
||||
|
||||
export default reduxForm({ form: 'signup' })(SignUpForm)
|
||||
export default reduxForm({ form: 'signup' })(SignUpForm);
|
||||
|
|
|
|||
|
|
@ -6,11 +6,9 @@ import SignUpForm from './SignUpForm';
|
|||
describe('SignUpForm', () => {
|
||||
it('matches snapshot', () => {
|
||||
const component = renderer.create(
|
||||
(
|
||||
<TestProvider>
|
||||
<SignUpForm />
|
||||
</TestProvider>
|
||||
),
|
||||
<TestProvider>
|
||||
<SignUpForm />
|
||||
</TestProvider>,
|
||||
);
|
||||
const tree = component.toJSON();
|
||||
expect(tree).toMatchSnapshot();
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ Example.defaultProps = { description: null, props: {} };
|
|||
Example.propTypes = {
|
||||
componentName: string.isRequired,
|
||||
exampleName: string.isRequired,
|
||||
component: oneOfType([ func, node ]).isRequired,
|
||||
component: oneOfType([func, node]).isRequired,
|
||||
description: string,
|
||||
props: object,
|
||||
};
|
||||
|
|
@ -48,11 +48,9 @@ const Examples = props => {
|
|||
const toExamples = (exmpls, name) => (
|
||||
<li key={name}>
|
||||
<ul>
|
||||
{
|
||||
map(exmpls, (exmpl, exampleName) => (
|
||||
<Example key={exampleName} componentName={name} exampleName={exampleName} {...exmpl} />
|
||||
))
|
||||
}
|
||||
{map(exmpls, (exmpl, exampleName) => (
|
||||
<Example key={exampleName} componentName={name} exampleName={exampleName} {...exmpl} />
|
||||
))}
|
||||
</ul>
|
||||
</li>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -26,15 +26,13 @@ export default (state = initialState, action) => {
|
|||
return state;
|
||||
|
||||
case REMOVE_FLASH_NOTIFICATION:
|
||||
return state.map(
|
||||
findIndex(state, msg => msg.id === payload.id),
|
||||
msg => msg.set('isRead', true),
|
||||
);
|
||||
return state.map(findIndex(state, msg => msg.id === payload.id), msg =>
|
||||
msg.set('isRead', true));
|
||||
|
||||
default:
|
||||
return state;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Action Creators
|
||||
let nextMessageId = 1;
|
||||
|
|
|
|||
|
|
@ -35,15 +35,15 @@ describe('FlashNotification', () => {
|
|||
const addFlashNote1 = addFlashNotification('error', 'Run the tests');
|
||||
const addFlashNote2 = addFlashNotification('error', 'Run the tests again');
|
||||
const reduced = reducer([], addFlashNote1);
|
||||
const reducedWithInitialContent = reducer([ addFlashNote1.payload ], addFlashNote2);
|
||||
expect(reduced).toEqual([ addFlashNote1.payload ]);
|
||||
expect(reducedWithInitialContent).toEqual([ addFlashNote1.payload, addFlashNote2.payload ]);
|
||||
const reducedWithInitialContent = reducer([addFlashNote1.payload], addFlashNote2);
|
||||
expect(reduced).toEqual([addFlashNote1.payload]);
|
||||
expect(reducedWithInitialContent).toEqual([addFlashNote1.payload, addFlashNote2.payload]);
|
||||
});
|
||||
|
||||
it('should handle duplicates ADD_FILTER', () => {
|
||||
const addFlashNote = addFlashNotification('error', 'Run the tests');
|
||||
const reducedWithInitialContent = reducer([ addFlashNote.payload ], addFlashNote);
|
||||
expect(reducedWithInitialContent).toEqual([ addFlashNote.payload ]);
|
||||
const reducedWithInitialContent = reducer([addFlashNote.payload], addFlashNote);
|
||||
expect(reducedWithInitialContent).toEqual([addFlashNote.payload]);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -244,7 +244,7 @@ const routesConfiguration = [
|
|||
];
|
||||
|
||||
const flattenRoutes = routesArray =>
|
||||
routesArray.reduce((a, b) => a.concat(b.routes ? [ b ].concat(flattenRoutes(b.routes)) : b), []);
|
||||
routesArray.reduce((a, b) => a.concat(b.routes ? [b].concat(flattenRoutes(b.routes)) : b), []);
|
||||
|
||||
const findRouteByName = (nameToFind, routes) => {
|
||||
const flattenedRoutes = flattenRoutes(routes);
|
||||
|
|
|
|||
|
|
@ -7,7 +7,8 @@ import createReducer from './reducers';
|
|||
* (like redux-saga or redux-thunk middleware)
|
||||
*/
|
||||
export default function configureStore(initialState) {
|
||||
const useReduxDevTools = process.env.NODE_ENV !== 'production' && typeof window !== 'undefined' &&
|
||||
const useReduxDevTools = process.env.NODE_ENV !== 'production' &&
|
||||
typeof window !== 'undefined' &&
|
||||
window.__REDUX_DEVTOOLS_EXTENSION__;
|
||||
|
||||
if (useReduxDevTools) {
|
||||
|
|
|
|||
148
yarn.lock
148
yarn.lock
|
|
@ -136,10 +136,6 @@ array-equal@^1.0.0:
|
|||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
|
||||
|
||||
array-findindex-polyfill@^0.1.0:
|
||||
version "0.1.0"
|
||||
resolved "https://registry.yarnpkg.com/array-findindex-polyfill/-/array-findindex-polyfill-0.1.0.tgz#c362665bec7645f22d7a3c3aac9793f71c3622ef"
|
||||
|
||||
array-flatten@1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
|
||||
|
|
@ -195,9 +191,9 @@ ast-types@0.8.18:
|
|||
version "0.8.18"
|
||||
resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.18.tgz#c8b98574898e8914e9d8de74b947564a9fe929af"
|
||||
|
||||
"ast-types@git+https://github.com/jlongster/ast-types.git":
|
||||
version "0.9.3"
|
||||
resolved "git+https://github.com/jlongster/ast-types.git#4b373d7e710105b07b22a12389ef2d8e1bcf2412"
|
||||
ast-types@0.9.4:
|
||||
version "0.9.4"
|
||||
resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.4.tgz#410d1f81890aeb8e0a38621558ba5869ae53c91b"
|
||||
|
||||
async-each@^1.0.0:
|
||||
version "1.0.1"
|
||||
|
|
@ -244,7 +240,7 @@ aws4@^1.2.1:
|
|||
version "1.5.0"
|
||||
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755"
|
||||
|
||||
babel-code-frame@^6.11.0, babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
|
||||
babel-code-frame@6.22.0, babel-code-frame@^6.11.0, babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
|
||||
version "6.22.0"
|
||||
resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
|
||||
dependencies:
|
||||
|
|
@ -960,7 +956,7 @@ babel-types@^6.15.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19
|
|||
lodash "^4.2.0"
|
||||
to-fast-properties "^1.0.1"
|
||||
|
||||
babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0:
|
||||
babylon@6.15.0, babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0:
|
||||
version "6.15.0"
|
||||
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.15.0.tgz#ba65cfa1a80e1759b0e89fb562e27dccae70348e"
|
||||
|
||||
|
|
@ -1419,9 +1415,9 @@ contains-path@^0.1.0:
|
|||
version "0.1.0"
|
||||
resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
|
||||
|
||||
content-disposition@0.5.1:
|
||||
version "0.5.1"
|
||||
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.1.tgz#87476c6a67c8daa87e32e87616df883ba7fb071b"
|
||||
content-disposition@0.5.2:
|
||||
version "0.5.2"
|
||||
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
|
||||
|
||||
content-security-policy-builder@1.1.0:
|
||||
version "1.1.0"
|
||||
|
|
@ -2104,7 +2100,7 @@ estraverse@~4.1.0:
|
|||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2"
|
||||
|
||||
esutils@^2.0.0, esutils@^2.0.2:
|
||||
esutils@2.0.2, esutils@^2.0.0, esutils@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
|
||||
|
||||
|
|
@ -2171,13 +2167,13 @@ expand-range@^1.8.1:
|
|||
dependencies:
|
||||
fill-range "^2.1.0"
|
||||
|
||||
express@^4.13.3, express@^4.14.0:
|
||||
version "4.14.0"
|
||||
resolved "https://registry.yarnpkg.com/express/-/express-4.14.0.tgz#c1ee3f42cdc891fb3dc650a8922d51ec847d0d66"
|
||||
express@^4.13.3, express@^4.14.1:
|
||||
version "4.14.1"
|
||||
resolved "https://registry.yarnpkg.com/express/-/express-4.14.1.tgz#646c237f766f148c2120aff073817b9e4d7e0d33"
|
||||
dependencies:
|
||||
accepts "~1.3.3"
|
||||
array-flatten "1.1.1"
|
||||
content-disposition "0.5.1"
|
||||
content-disposition "0.5.2"
|
||||
content-type "~1.0.2"
|
||||
cookie "0.3.1"
|
||||
cookie-signature "1.0.6"
|
||||
|
|
@ -2186,19 +2182,19 @@ express@^4.13.3, express@^4.14.0:
|
|||
encodeurl "~1.0.1"
|
||||
escape-html "~1.0.3"
|
||||
etag "~1.7.0"
|
||||
finalhandler "0.5.0"
|
||||
finalhandler "0.5.1"
|
||||
fresh "0.3.0"
|
||||
merge-descriptors "1.0.1"
|
||||
methods "~1.1.2"
|
||||
on-finished "~2.3.0"
|
||||
parseurl "~1.3.1"
|
||||
path-to-regexp "0.1.7"
|
||||
proxy-addr "~1.1.2"
|
||||
proxy-addr "~1.1.3"
|
||||
qs "6.2.0"
|
||||
range-parser "~1.2.0"
|
||||
send "0.14.1"
|
||||
serve-static "~1.11.1"
|
||||
type-is "~1.6.13"
|
||||
send "0.14.2"
|
||||
serve-static "~1.11.2"
|
||||
type-is "~1.6.14"
|
||||
utils-merge "1.0.0"
|
||||
vary "~1.1.0"
|
||||
|
||||
|
|
@ -2317,6 +2313,16 @@ finalhandler@0.5.0:
|
|||
statuses "~1.3.0"
|
||||
unpipe "~1.0.0"
|
||||
|
||||
finalhandler@0.5.1:
|
||||
version "0.5.1"
|
||||
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.1.tgz#2c400d8d4530935bc232549c5fa385ec07de6fcd"
|
||||
dependencies:
|
||||
debug "~2.2.0"
|
||||
escape-html "~1.0.3"
|
||||
on-finished "~2.3.0"
|
||||
statuses "~1.3.1"
|
||||
unpipe "~1.0.0"
|
||||
|
||||
find-cache-dir@^0.1.1:
|
||||
version "0.1.1"
|
||||
resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9"
|
||||
|
|
@ -2345,9 +2351,9 @@ flatten@^1.0.2:
|
|||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
|
||||
|
||||
flow-parser@^0.37.0:
|
||||
version "0.37.0"
|
||||
resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.37.0.tgz#1065c612a30f037ac3ee60053f6e797a6d9be8d6"
|
||||
flow-parser@0.38.0:
|
||||
version "0.38.0"
|
||||
resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.38.0.tgz#a631c46170c5b42400d905a75cfc83ce8db29424"
|
||||
dependencies:
|
||||
ast-types "0.8.18"
|
||||
colors ">=0.6.2"
|
||||
|
|
@ -2465,7 +2471,7 @@ get-caller-file@^1.0.1:
|
|||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
|
||||
|
||||
get-stdin@^5.0.1:
|
||||
get-stdin@5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398"
|
||||
|
||||
|
|
@ -2488,7 +2494,7 @@ glob-parent@^2.0.0:
|
|||
dependencies:
|
||||
is-glob "^2.0.0"
|
||||
|
||||
glob@^7.0.0, glob@^7.0.3, glob@^7.0.5:
|
||||
glob@7.1.1, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5:
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
|
||||
dependencies:
|
||||
|
|
@ -2716,7 +2722,7 @@ htmlparser2@~3.3.0:
|
|||
domutils "1.1"
|
||||
readable-stream "1.0"
|
||||
|
||||
http-errors@~1.5.0:
|
||||
http-errors@~1.5.0, http-errors@~1.5.1:
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750"
|
||||
dependencies:
|
||||
|
|
@ -3327,6 +3333,15 @@ jest-util@^18.1.0:
|
|||
jest-mock "^18.0.0"
|
||||
mkdirp "^0.5.1"
|
||||
|
||||
jest-validate@18.2.0:
|
||||
version "18.2.0"
|
||||
resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-18.2.0.tgz#01f93ac78f23901cf9889808e2bbb931ffc58d86"
|
||||
dependencies:
|
||||
chalk "^1.1.1"
|
||||
jest-matcher-utils "^18.1.0"
|
||||
leven "^2.0.0"
|
||||
pretty-format "^18.1.0"
|
||||
|
||||
jest@18.0.0:
|
||||
version "18.0.0"
|
||||
resolved "https://registry.yarnpkg.com/jest/-/jest-18.0.0.tgz#ef12f70befe0fcb30f1c61c0ae58748706267d4b"
|
||||
|
|
@ -3394,10 +3409,6 @@ jsesc@^1.3.0:
|
|||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
|
||||
|
||||
jsesc@^2.4.0:
|
||||
version "2.4.0"
|
||||
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.4.0.tgz#8568d223ff69c0b5e081b4f8edf5a23d978c9867"
|
||||
|
||||
jsesc@~0.5.0:
|
||||
version "0.5.0"
|
||||
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
|
||||
|
|
@ -3489,6 +3500,10 @@ lcid@^1.0.0:
|
|||
dependencies:
|
||||
invert-kv "^1.0.0"
|
||||
|
||||
leven@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/leven/-/leven-2.0.0.tgz#74c45744439550da185801912829f61d22071bc1"
|
||||
|
||||
levn@^0.3.0, levn@~0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
|
||||
|
|
@ -3813,7 +3828,7 @@ minimist@0.0.8, minimist@~0.0.1:
|
|||
version "0.0.8"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
||||
|
||||
minimist@>=0.2.0, minimist@^1.1.1, minimist@^1.2.0:
|
||||
minimist@1.2.0, minimist@>=0.2.0, minimist@^1.1.1, minimist@^1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
|
||||
|
||||
|
|
@ -3827,6 +3842,10 @@ ms@0.7.1:
|
|||
version "0.7.1"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
|
||||
|
||||
ms@0.7.2:
|
||||
version "0.7.2"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
|
||||
|
||||
mute-stream@0.0.5:
|
||||
version "0.0.5"
|
||||
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
|
||||
|
|
@ -4769,18 +4788,19 @@ preserve@^0.2.0:
|
|||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
|
||||
|
||||
prettier@^0.0.8:
|
||||
version "0.0.8"
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-0.0.8.tgz#4b5f97d68ff2a7aaf1a062d2c3f0c0adad3a247e"
|
||||
prettier@^0.13.1:
|
||||
version "0.13.1"
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-0.13.1.tgz#2c96cbdc15d098709f874e59efef48cb0c47c615"
|
||||
dependencies:
|
||||
ast-types "git+https://github.com/jlongster/ast-types.git"
|
||||
babylon "^6.15.0"
|
||||
esutils "^2.0.2"
|
||||
flow-parser "^0.37.0"
|
||||
get-stdin "^5.0.1"
|
||||
jsesc "^2.4.0"
|
||||
minimist "^1.2.0"
|
||||
private "^0.1.6"
|
||||
ast-types "0.9.4"
|
||||
babel-code-frame "6.22.0"
|
||||
babylon "6.15.0"
|
||||
esutils "2.0.2"
|
||||
flow-parser "0.38.0"
|
||||
get-stdin "5.0.1"
|
||||
glob "7.1.1"
|
||||
jest-validate "18.2.0"
|
||||
minimist "1.2.0"
|
||||
|
||||
pretty-error@^2.0.2:
|
||||
version "2.0.2"
|
||||
|
|
@ -4823,7 +4843,7 @@ promise@7.1.1, promise@^7.1.1:
|
|||
dependencies:
|
||||
asap "~2.0.3"
|
||||
|
||||
proxy-addr@~1.1.2:
|
||||
proxy-addr@~1.1.3:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.3.tgz#dc97502f5722e888467b3fa2297a7b1ff47df074"
|
||||
dependencies:
|
||||
|
|
@ -5097,11 +5117,10 @@ reduce-function-call@^1.0.1:
|
|||
dependencies:
|
||||
balanced-match "^0.4.2"
|
||||
|
||||
redux-form@^6.4.3:
|
||||
version "6.4.3"
|
||||
resolved "https://registry.yarnpkg.com/redux-form/-/redux-form-6.4.3.tgz#bd83a77770d9805f7b595a4ff18f00fe4267d3c8"
|
||||
redux-form@^6.5.0:
|
||||
version "6.5.0"
|
||||
resolved "https://registry.yarnpkg.com/redux-form/-/redux-form-6.5.0.tgz#8c75ea77018afbabaa02f1389cf6b0e10787c5b8"
|
||||
dependencies:
|
||||
array-findindex-polyfill "^0.1.0"
|
||||
deep-equal "^1.0.1"
|
||||
es6-error "^4.0.0"
|
||||
hoist-non-react-statics "^1.2.0"
|
||||
|
|
@ -5109,7 +5128,6 @@ redux-form@^6.4.3:
|
|||
is-promise "^2.1.0"
|
||||
lodash "^4.17.3"
|
||||
lodash-es "^4.17.3"
|
||||
shallowequal "^0.2.2"
|
||||
|
||||
redux@^3.6.0:
|
||||
version "3.6.0"
|
||||
|
|
@ -5351,9 +5369,9 @@ semver-diff@^2.0.0:
|
|||
version "5.3.0"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
|
||||
|
||||
send@0.14.1:
|
||||
version "0.14.1"
|
||||
resolved "https://registry.yarnpkg.com/send/-/send-0.14.1.tgz#a954984325392f51532a7760760e459598c89f7a"
|
||||
send@0.14.2:
|
||||
version "0.14.2"
|
||||
resolved "https://registry.yarnpkg.com/send/-/send-0.14.2.tgz#39b0438b3f510be5dc6f667a11f71689368cdeef"
|
||||
dependencies:
|
||||
debug "~2.2.0"
|
||||
depd "~1.1.0"
|
||||
|
|
@ -5362,12 +5380,12 @@ send@0.14.1:
|
|||
escape-html "~1.0.3"
|
||||
etag "~1.7.0"
|
||||
fresh "0.3.0"
|
||||
http-errors "~1.5.0"
|
||||
http-errors "~1.5.1"
|
||||
mime "1.3.4"
|
||||
ms "0.7.1"
|
||||
ms "0.7.2"
|
||||
on-finished "~2.3.0"
|
||||
range-parser "~1.2.0"
|
||||
statuses "~1.3.0"
|
||||
statuses "~1.3.1"
|
||||
|
||||
serve-index@^1.7.2:
|
||||
version "1.8.0"
|
||||
|
|
@ -5381,14 +5399,14 @@ serve-index@^1.7.2:
|
|||
mime-types "~2.1.11"
|
||||
parseurl "~1.3.1"
|
||||
|
||||
serve-static@~1.11.1:
|
||||
version "1.11.1"
|
||||
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.1.tgz#d6cce7693505f733c759de57befc1af76c0f0805"
|
||||
serve-static@~1.11.2:
|
||||
version "1.11.2"
|
||||
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.2.tgz#2cf9889bd4435a320cc36895c9aa57bd662e6ac7"
|
||||
dependencies:
|
||||
encodeurl "~1.0.1"
|
||||
escape-html "~1.0.3"
|
||||
parseurl "~1.3.1"
|
||||
send "0.14.1"
|
||||
send "0.14.2"
|
||||
|
||||
set-blocking@^2.0.0, set-blocking@~2.0.0:
|
||||
version "2.0.0"
|
||||
|
|
@ -5531,9 +5549,9 @@ source-list-map@^0.1.4, source-list-map@~0.1.7:
|
|||
version "0.1.8"
|
||||
resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106"
|
||||
|
||||
source-map-support@^0.4.10, source-map-support@^0.4.2:
|
||||
version "0.4.10"
|
||||
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.10.tgz#d7b19038040a14c0837a18e630a196453952b378"
|
||||
source-map-support@^0.4.11, source-map-support@^0.4.2:
|
||||
version "0.4.11"
|
||||
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.11.tgz#647f939978b38535909530885303daf23279f322"
|
||||
dependencies:
|
||||
source-map "^0.5.3"
|
||||
|
||||
|
|
@ -5592,7 +5610,7 @@ sshpk@^1.7.0:
|
|||
jsbn "~0.1.0"
|
||||
tweetnacl "~0.14.0"
|
||||
|
||||
"statuses@>= 1.3.1 < 2", statuses@~1.3.0:
|
||||
"statuses@>= 1.3.1 < 2", statuses@~1.3.0, statuses@~1.3.1:
|
||||
version "1.3.1"
|
||||
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
|
||||
|
||||
|
|
@ -5850,7 +5868,7 @@ type-check@~0.3.2:
|
|||
dependencies:
|
||||
prelude-ls "~1.1.2"
|
||||
|
||||
type-is@~1.6.13:
|
||||
type-is@~1.6.14:
|
||||
version "1.6.14"
|
||||
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2"
|
||||
dependencies:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue