Upgrade to React 16 and Enzyme 3
This commit is contained in:
Родитель
d0ded682d8
Коммит
7f319a5ed4
21
package.json
21
package.json
|
@ -180,24 +180,25 @@
|
|||
"normalize.css": "7.0.0",
|
||||
"normalizr": "3.2.2",
|
||||
"prop-types": "15.6.0",
|
||||
"raf": "3.4.0",
|
||||
"raven": "2.2.1",
|
||||
"raven-js": "3.20.1",
|
||||
"rc-tooltip": "3.7.0",
|
||||
"react": "15.6.2",
|
||||
"react-addons-css-transition-group": "15.6.2",
|
||||
"react": "16.1.1",
|
||||
"react-autosuggest": "9.3.2",
|
||||
"react-cookie": "1.0.5",
|
||||
"react-dom": "15.6.2",
|
||||
"react-dom": "16.1.1",
|
||||
"react-helmet": "5.2.0",
|
||||
"react-nested-status": "0.1.2",
|
||||
"react-nested-status": "0.2.1",
|
||||
"react-onclickoutside": "6.7.0",
|
||||
"react-photoswipe": "1.3.0",
|
||||
"react-redux": "5.0.6",
|
||||
"react-router": "2.8.1",
|
||||
"react-router": "3.2.0",
|
||||
"react-router-redux": "4.0.8",
|
||||
"react-router-scroll": "0.4.4",
|
||||
"react-super-responsive-table": "0.3.0",
|
||||
"react-textarea-autosize": "5.2.1",
|
||||
"react-transition-group": "1.x",
|
||||
"redux": "3.7.2",
|
||||
"redux-logger": "3.0.6",
|
||||
"redux-saga": "0.16.0",
|
||||
|
@ -238,7 +239,8 @@
|
|||
"cookie": "^0.3.1",
|
||||
"css-loader": "^0.28.3",
|
||||
"deepcopy": "^0.6.3",
|
||||
"enzyme": "^2.8.2",
|
||||
"enzyme": "^3.2.0",
|
||||
"enzyme-adapter-react-16": "^1.1.0",
|
||||
"eslint": "^4.5.0",
|
||||
"eslint-config-amo": "^0.2.0",
|
||||
"eslint-plugin-promise": "^3.5.0",
|
||||
|
@ -251,7 +253,7 @@
|
|||
"intl": "^1.2.5",
|
||||
"intl-locales-supported": "^1.0.0",
|
||||
"jest": "^21.0.2",
|
||||
"jest-enzyme": "^3.8.3",
|
||||
"jest-enzyme": "^4.0.1",
|
||||
"json-loader": "^0.5.4",
|
||||
"mock-express-request": "^0.2.0",
|
||||
"mock-express-response": "^0.2.0",
|
||||
|
@ -263,11 +265,10 @@
|
|||
"po2json": "^0.4.5",
|
||||
"postcss-loader": "^2.0.6",
|
||||
"potools": "^0.1.0",
|
||||
"react-addons-test-utils": "^15.5.1",
|
||||
"react-hot-loader": "^3.1.1",
|
||||
"react-test-renderer": "^15.5.4",
|
||||
"react-test-renderer": "^16.1.1",
|
||||
"react-transform-hmr": "^1.0.4",
|
||||
"redux-devtools": "^3.3.2",
|
||||
"redux-devtools": "^3.4.1",
|
||||
"redux-saga-tester": "^1.0.372",
|
||||
"require-uncached": "^1.0.3",
|
||||
"rimraf": "^2.6.1",
|
||||
|
|
|
@ -324,8 +324,8 @@ export const extractId = (ownProps: Props) => {
|
|||
};
|
||||
|
||||
export default compose(
|
||||
connect(mapStateToProps),
|
||||
translate({ withRef: true }),
|
||||
withFixedErrorHandler({ fileName: __filename, extractId }),
|
||||
withRouter,
|
||||
connect(mapStateToProps),
|
||||
translate(),
|
||||
withFixedErrorHandler({ fileName: __filename, extractId }),
|
||||
)(AddonReviewListBase);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import React, { PropTypes } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import { compose } from 'redux';
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* global document */
|
||||
|
||||
import 'babel-polyfill';
|
||||
import 'raf/polyfill';
|
||||
import { oneLine } from 'common-tags';
|
||||
import config from 'config';
|
||||
import FastClick from 'fastclick';
|
||||
|
|
|
@ -2,6 +2,7 @@ import fs from 'fs';
|
|||
import path from 'path';
|
||||
|
||||
import 'babel-polyfill';
|
||||
import 'raf/polyfill';
|
||||
import { oneLine } from 'common-tags';
|
||||
import defaultConfig from 'config';
|
||||
import Express from 'express';
|
||||
|
|
|
@ -4,7 +4,7 @@ import classNames from 'classnames';
|
|||
import { sprintf } from 'jed';
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import ReactCSSTransitionGroup from 'react-addons-css-transition-group';
|
||||
import ReactCSSTransitionGroup from 'react-transition-group/CSSTransitionGroup';
|
||||
import { connect } from 'react-redux';
|
||||
import { compose } from 'redux';
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* eslint-disable react/no-danger */
|
||||
import React, { PropTypes } from 'react';
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { compose } from 'redux';
|
||||
import { connect } from 'react-redux';
|
||||
|
||||
|
|
|
@ -2,6 +2,8 @@ import sinon from 'sinon';
|
|||
import config from 'config';
|
||||
import areIntlLocalesSupported from 'intl-locales-supported';
|
||||
import values from 'object.values';
|
||||
import Enzyme from 'enzyme';
|
||||
import Adapter from 'enzyme-adapter-react-16';
|
||||
|
||||
// Side-effects from imports are quite unfortunate but this is required
|
||||
// to get all of the cool jest + enzyme integration for calls like:
|
||||
|
@ -9,6 +11,7 @@ import values from 'object.values';
|
|||
// See: github.com/mozilla/addons-frontend/pull/2540#discussion_r120926107
|
||||
import 'jest-enzyme';
|
||||
|
||||
Enzyme.configure({ adapter: new Adapter() });
|
||||
|
||||
if (!Object.values) {
|
||||
values.shim();
|
||||
|
|
|
@ -5,7 +5,7 @@ import {
|
|||
scryRenderedComponentsWithType,
|
||||
findRenderedComponentWithType,
|
||||
renderIntoDocument,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
import { Provider } from 'react-redux';
|
||||
import { match } from 'react-router';
|
||||
|
||||
|
|
|
@ -585,9 +585,14 @@ describe(__filename, () => {
|
|||
|
||||
it('resets the page after submitting a review', () => {
|
||||
const router = { push: sinon.stub() };
|
||||
dispatchAddon({ ...fakeAddon });
|
||||
const location = { query: { page: 2 } };
|
||||
const root = render({ reviews: null, router, location });
|
||||
|
||||
dispatchAddon({ ...fakeAddon });
|
||||
|
||||
const root = render({ reviews: null, location });
|
||||
// This makes sure the router is passed to the base component in order to
|
||||
// test it because Enzyme v3 does not let us pass it via `render()`.
|
||||
root.setProps({ router });
|
||||
|
||||
const manager = root.find(RatingManager);
|
||||
expect(manager).toHaveProp('onReviewSubmitted');
|
||||
|
|
|
@ -105,7 +105,11 @@ describe(__filename, () => {
|
|||
function render(props = {}, options = {}) {
|
||||
return shallowUntilTarget(
|
||||
<Category {...renderProps(props, options)} />,
|
||||
CategoryBase
|
||||
CategoryBase,
|
||||
// TODO: ideally, we would like to enable the lifecycle methods, but it
|
||||
// produces unexpected errors, related to Enzyme 3.
|
||||
// See: http://airbnb.io/enzyme/docs/guides/migration-from-2-to-3.html#lifecycle-methods.
|
||||
{ shallowOptions: { disableLifecycleMethods: true } }
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ describe(__filename, () => {
|
|||
const root = render();
|
||||
expect(root.find(Button)).toHaveLength(1);
|
||||
expect(root.find(Button)).toHaveProp('href', 'https://paypal.me/babar');
|
||||
expect(root.find(Button).children()).toContain('Contribute now');
|
||||
expect(root.find(Button).children().at(1)).toHaveText('Contribute now');
|
||||
expect(root.find(Button)).toHaveProp('target', '_blank');
|
||||
expect(root.find(Button)).toHaveProp('rel', 'noopener noreferrer');
|
||||
});
|
||||
|
|
|
@ -43,7 +43,7 @@ describe(__filename, () => {
|
|||
expect(root.find('.Header-title-wrapper')).toHaveTagName('h1');
|
||||
expect(root.find('.Header-title').type()).toEqual(Link);
|
||||
expect(root.find('.Header-title .visually-hidden').childAt(0))
|
||||
.toContain('Firefox Add-ons');
|
||||
.toHaveText('Firefox Add-ons');
|
||||
});
|
||||
|
||||
it('always renders a link in the header when not on homepage', () => {
|
||||
|
@ -54,7 +54,7 @@ describe(__filename, () => {
|
|||
expect(root.find('h1')).toHaveLength(0);
|
||||
expect(root.find('.Header-title').type()).toEqual(Link);
|
||||
expect(root.find('.Header-title .visually-hidden').childAt(0))
|
||||
.toContain('Firefox Add-ons');
|
||||
.toHaveText('Firefox Add-ons');
|
||||
});
|
||||
|
||||
it('displays `login` text when user is not signed in', () => {
|
||||
|
|
|
@ -3,7 +3,7 @@ import {
|
|||
Simulate,
|
||||
renderIntoDocument,
|
||||
findRenderedComponentWithType,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
import { Provider } from 'react-redux';
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ import React from 'react';
|
|||
import {
|
||||
findRenderedComponentWithType,
|
||||
renderIntoDocument,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
import { Link as ReactRouterLink } from 'react-router';
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ import React from 'react';
|
|||
import {
|
||||
renderIntoDocument,
|
||||
findRenderedComponentWithType,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
import { Provider } from 'react-redux';
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ import React from 'react';
|
|||
import {
|
||||
findRenderedComponentWithType,
|
||||
renderIntoDocument,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
|
||||
import translate from 'core/i18n/translate';
|
||||
import { setAuthToken } from 'core/actions';
|
||||
|
|
|
@ -82,7 +82,8 @@ describe(__filename, () => {
|
|||
// this case, the textarea.)
|
||||
const root = renderMount();
|
||||
|
||||
root.find('.ReportAbuseButton-show-more').simulate('click', fakeEvent);
|
||||
root.find('button.ReportAbuseButton-show-more')
|
||||
.simulate('click', fakeEvent);
|
||||
|
||||
sinon.assert.called(fakeEvent.preventDefault);
|
||||
expect(root.find('.ReportAbuseButton--is-expanded')).toHaveLength(1);
|
||||
|
@ -94,7 +95,8 @@ describe(__filename, () => {
|
|||
// this case, the textarea.)
|
||||
const root = renderMount();
|
||||
|
||||
root.find('.ReportAbuseButton-show-more').simulate('click', fakeEvent);
|
||||
root.find('button.ReportAbuseButton-show-more')
|
||||
.simulate('click', fakeEvent);
|
||||
|
||||
root.find('.ReportAbuseButton-dismiss-report')
|
||||
.simulate('click', fakeEvent);
|
||||
|
@ -106,24 +108,25 @@ describe(__filename, () => {
|
|||
it('disables the submit button if there is no abuse report', () => {
|
||||
const root = renderShallow();
|
||||
|
||||
expect(root.find('.ReportAbuseButton-send-report')).toHaveProp('disabled');
|
||||
expect(root.find('.ReportAbuseButton-send-report').first())
|
||||
.toHaveProp('disabled');
|
||||
});
|
||||
|
||||
it('disables the submit button if text in the textarea is removed', () => {
|
||||
const root = renderMount();
|
||||
|
||||
// This simulates entering text into the textarea.
|
||||
const textarea = root.find('.ReportAbuseButton-textarea textarea');
|
||||
textarea.node.value = 'add-on ate my homework!';
|
||||
const textarea = root.find('.ReportAbuseButton-textarea > textarea');
|
||||
textarea.instance().value = 'add-on ate my homework!';
|
||||
textarea.simulate('change');
|
||||
|
||||
expect(root.find('.ReportAbuseButton-send-report').prop('disabled'))
|
||||
expect(root.find('.ReportAbuseButton-send-report').first().prop('disabled'))
|
||||
.toEqual(false);
|
||||
|
||||
textarea.node.value = '';
|
||||
textarea.instance().value = '';
|
||||
textarea.simulate('change');
|
||||
|
||||
expect(root.find('.ReportAbuseButton-send-report').prop('disabled'))
|
||||
expect(root.find('.ReportAbuseButton-send-report').first().prop('disabled'))
|
||||
.toEqual(true);
|
||||
});
|
||||
|
||||
|
@ -140,11 +143,12 @@ describe(__filename, () => {
|
|||
|
||||
// Expand the view so we can test that it wasn't contracted when
|
||||
// clicking on the disabled "dismiss" link.
|
||||
root.find('.ReportAbuseButton-show-more').simulate('click', fakeEvent);
|
||||
root.find('button.ReportAbuseButton-show-more')
|
||||
.simulate('click', fakeEvent);
|
||||
expect(root.find('.ReportAbuseButton--is-expanded')).toHaveLength(1);
|
||||
|
||||
const dismissButton = root.find('.ReportAbuseButton-dismiss-report');
|
||||
const sendButton = root.find('.ReportAbuseButton-send-report');
|
||||
const sendButton = root.find('button.ReportAbuseButton-send-report');
|
||||
|
||||
expect(dismissButton)
|
||||
.toHaveClassName('ReportAbuseButton-dismiss-report--disabled');
|
||||
|
@ -168,7 +172,7 @@ describe(__filename, () => {
|
|||
|
||||
expect(root.find('.ReportAbuseButton--report-sent')).toHaveLength(1);
|
||||
expect(root.find('.ReportAbuseButton-show-more')).toHaveLength(0);
|
||||
expect(root.find('.ReportAbuseButton-send-report')).toHaveLength(0);
|
||||
expect(root.find('button.ReportAbuseButton-send-report')).toHaveLength(0);
|
||||
});
|
||||
|
||||
it('dispatches when the send button is clicked if textarea has text', () => {
|
||||
|
@ -179,11 +183,11 @@ describe(__filename, () => {
|
|||
const root = renderMount({ addon, store });
|
||||
|
||||
// This simulates entering text into the textarea.
|
||||
const textarea = root.find('.ReportAbuseButton-textarea textarea');
|
||||
textarea.node.value = 'Opera did it first!';
|
||||
const textarea = root.find('.ReportAbuseButton-textarea > textarea');
|
||||
textarea.instance().value = 'Opera did it first!';
|
||||
textarea.simulate('change');
|
||||
|
||||
root.find('.ReportAbuseButton-send-report').simulate('click', fakeEvent);
|
||||
root.find('button.ReportAbuseButton-send-report').simulate('click', fakeEvent);
|
||||
sinon.assert.calledWith(dispatchSpy, sendAddonAbuseReport({
|
||||
addonSlug: addon.slug,
|
||||
errorHandlerId: 'create-stub-error-handler-id',
|
||||
|
@ -199,16 +203,16 @@ describe(__filename, () => {
|
|||
const root = renderMount({ addon, store });
|
||||
|
||||
// Make sure it's disabled by default.
|
||||
expect(root.find('.ReportAbuseButton-send-report').prop('disabled'))
|
||||
expect(root.find('button.ReportAbuseButton-send-report').prop('disabled'))
|
||||
.toEqual(true);
|
||||
|
||||
// This simulates entering text into the textarea.
|
||||
const textarea = root.find('.ReportAbuseButton-textarea textarea');
|
||||
textarea.node.value = 'Opera did it first!';
|
||||
const textarea = root.find('.ReportAbuseButton-textarea > textarea');
|
||||
textarea.instance().value = 'Opera did it first!';
|
||||
textarea.simulate('change');
|
||||
|
||||
sinon.assert.calledWith(dispatchSpy, enableAbuseButtonUI({ addon }));
|
||||
expect(root.find('.ReportAbuseButton-send-report').prop('disabled'))
|
||||
expect(root.find('button.ReportAbuseButton-send-report').prop('disabled'))
|
||||
.toEqual(false);
|
||||
});
|
||||
|
||||
|
@ -219,8 +223,8 @@ describe(__filename, () => {
|
|||
const root = renderMount({ addon, store });
|
||||
|
||||
// This simulates entering text into the textarea.
|
||||
const textarea = root.find('.ReportAbuseButton-textarea textarea');
|
||||
textarea.node.value = 'Opera did it first!';
|
||||
const textarea = root.find('.ReportAbuseButton-textarea > textarea');
|
||||
textarea.instance().value = 'Opera did it first!';
|
||||
textarea.simulate('change');
|
||||
|
||||
sinon.assert.calledWith(dispatchSpy, enableAbuseButtonUI({ addon }));
|
||||
|
@ -229,7 +233,7 @@ describe(__filename, () => {
|
|||
dispatchSpy.reset();
|
||||
|
||||
// This simulates entering text into the textarea.
|
||||
textarea.node.value = 'Opera did it first! Adding some text!';
|
||||
textarea.instance().value = 'Opera did it first! Adding some text!';
|
||||
textarea.simulate('change');
|
||||
|
||||
sinon.assert.neverCalledWith(dispatchSpy, enableAbuseButtonUI({ addon }));
|
||||
|
@ -242,12 +246,12 @@ describe(__filename, () => {
|
|||
const root = renderMount({ addon, store });
|
||||
|
||||
// This simulates entering text into the textarea.
|
||||
const textarea = root.find('.ReportAbuseButton-textarea textarea');
|
||||
textarea.node.value = ' ';
|
||||
const textarea = root.find('.ReportAbuseButton-textarea > textarea');
|
||||
textarea.instance().value = ' ';
|
||||
textarea.simulate('change');
|
||||
|
||||
sinon.assert.neverCalledWith(dispatchSpy, enableAbuseButtonUI({ addon }));
|
||||
expect(root.find('.ReportAbuseButton-send-report').prop('disabled'))
|
||||
expect(root.find('button.ReportAbuseButton-send-report').prop('disabled'))
|
||||
.toEqual(true);
|
||||
});
|
||||
|
||||
|
@ -258,15 +262,15 @@ describe(__filename, () => {
|
|||
const root = renderMount({ addon, store });
|
||||
|
||||
// This simulates entering text into the textarea.
|
||||
const textarea = root.find('.ReportAbuseButton-textarea textarea');
|
||||
textarea.node.value = 'Opera did it first!';
|
||||
const textarea = root.find('.ReportAbuseButton-textarea > textarea');
|
||||
textarea.instance().value = 'Opera did it first!';
|
||||
textarea.simulate('change');
|
||||
|
||||
textarea.node.value = '';
|
||||
textarea.instance().value = '';
|
||||
textarea.simulate('change');
|
||||
|
||||
sinon.assert.calledWith(dispatchSpy, disableAbuseButtonUI({ addon }));
|
||||
expect(root.find('.ReportAbuseButton-send-report').prop('disabled'))
|
||||
expect(root.find('button.ReportAbuseButton-send-report').prop('disabled'))
|
||||
.toEqual(true);
|
||||
});
|
||||
|
||||
|
@ -277,15 +281,15 @@ describe(__filename, () => {
|
|||
const root = renderMount({ addon, store });
|
||||
|
||||
// This simulates entering text into the textarea.
|
||||
const textarea = root.find('.ReportAbuseButton-textarea textarea');
|
||||
textarea.node.value = 'Opera did it first!';
|
||||
const textarea = root.find('.ReportAbuseButton-textarea > textarea');
|
||||
textarea.instance().value = 'Opera did it first!';
|
||||
textarea.simulate('change');
|
||||
|
||||
textarea.node.value = ' ';
|
||||
textarea.instance().value = ' ';
|
||||
textarea.simulate('change');
|
||||
|
||||
sinon.assert.calledWith(dispatchSpy, disableAbuseButtonUI({ addon }));
|
||||
expect(root.find('.ReportAbuseButton-send-report').prop('disabled'))
|
||||
expect(root.find('button.ReportAbuseButton-send-report').prop('disabled'))
|
||||
.toEqual(true);
|
||||
});
|
||||
|
||||
|
@ -296,7 +300,6 @@ describe(__filename, () => {
|
|||
const fakeEvent = createFakeEvent();
|
||||
const { store } = dispatchClientMetadata();
|
||||
const dispatchSpy = sinon.spy(store, 'dispatch');
|
||||
const root = renderMount({ addon, store });
|
||||
|
||||
// We enable the button with an empty textarea; this never happens
|
||||
// normally but we can force it here for testing.
|
||||
|
@ -304,10 +307,13 @@ describe(__filename, () => {
|
|||
dispatchSpy.reset();
|
||||
fakeEvent.preventDefault.reset();
|
||||
|
||||
const root = renderMount({ addon, store });
|
||||
|
||||
// Make sure the button isn't disabled.
|
||||
expect(root.find('.ReportAbuseButton-send-report').prop('disabled'))
|
||||
expect(root.find('.ReportAbuseButton-send-report').first().prop('disabled'))
|
||||
.toEqual(false);
|
||||
root.find('.ReportAbuseButton-send-report').simulate('click', fakeEvent);
|
||||
root.find('button.ReportAbuseButton-send-report')
|
||||
.simulate('click', fakeEvent);
|
||||
|
||||
sinon.assert.notCalled(dispatchSpy);
|
||||
// Make sure preventDefault was called; we then know the sendReport()
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { shallow } from 'enzyme';
|
||||
import React from 'react';
|
||||
import { renderIntoDocument } from 'react-addons-test-utils';
|
||||
import { renderIntoDocument } from 'react-dom/test-utils';
|
||||
import { PhotoSwipeGallery } from 'react-photoswipe';
|
||||
|
||||
import ScreenShots, {
|
||||
|
|
|
@ -121,7 +121,7 @@ describe(__filename, () => {
|
|||
it('blurs the form on submit', () => {
|
||||
const wrapper = mountComponent();
|
||||
const blurSpy = sinon.spy(
|
||||
wrapper.find(SearchFormBase).getNode().autosuggest.input, 'blur');
|
||||
wrapper.find(SearchFormBase).instance().autosuggest.input, 'blur');
|
||||
|
||||
sinon.assert.notCalled(blurSpy);
|
||||
wrapper.find('input').simulate('change', createFakeChangeEvent('something'));
|
||||
|
|
|
@ -72,7 +72,9 @@ describe(__filename, () => {
|
|||
it('localises the user count', () => {
|
||||
const root = render({ lang: 'fr' });
|
||||
|
||||
expect(root.find('.SearchResult-users-text')).toIncludeText('5 253');
|
||||
// `\xa0` is a non-breaking space.
|
||||
// See: https://github.com/airbnb/enzyme/issues/1349
|
||||
expect(root.find('.SearchResult-users-text')).toIncludeText('5\xa0253');
|
||||
});
|
||||
|
||||
it('renders the user count as singular', () => {
|
||||
|
|
|
@ -2,7 +2,7 @@ import React from 'react';
|
|||
import {
|
||||
renderIntoDocument as render,
|
||||
findRenderedComponentWithType,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
import { Provider } from 'react-redux';
|
||||
|
||||
import createStore from 'amo/store';
|
||||
|
|
|
@ -2,7 +2,7 @@ import React from 'react';
|
|||
import {
|
||||
renderIntoDocument,
|
||||
findRenderedComponentWithType,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
import { Provider } from 'react-redux';
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ import { findDOMNode } from 'react-dom';
|
|||
import {
|
||||
renderIntoDocument,
|
||||
findRenderedComponentWithType,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
import NestedStatus from 'react-nested-status';
|
||||
import { Provider } from 'react-redux';
|
||||
import Helmet from 'react-helmet';
|
||||
|
|
|
@ -62,7 +62,13 @@ const {
|
|||
mapStateToProps,
|
||||
withInstallHelpers,
|
||||
} = installAddon;
|
||||
const BaseComponent = () => <div />;
|
||||
|
||||
// See: https://github.com/airbnb/enzyme/issues/1232.
|
||||
class BaseComponent extends React.Component {
|
||||
render() {
|
||||
return <div />;
|
||||
}
|
||||
}
|
||||
|
||||
function componentWithInstallHelpers({ src = 'some-src' } = {}) {
|
||||
// This simulates how a component would typically apply
|
||||
|
@ -90,13 +96,22 @@ const defaultProps = (overrides = {}) => {
|
|||
};
|
||||
};
|
||||
|
||||
function render(Component, props) {
|
||||
return shallowUntilTarget(
|
||||
<Component {...props} />,
|
||||
BaseComponent,
|
||||
// If we do not disable these methods, `componentDidMount()` will be called
|
||||
// but in most cases we do not have a complete fakeAddonManager.
|
||||
// See: http://airbnb.io/enzyme/docs/guides/migration-from-2-to-3.html#lifecycle-methods.
|
||||
{ shallowOptions: { disableLifecycleMethods: true } }
|
||||
);
|
||||
}
|
||||
|
||||
function renderWithInstallHelpers({ src, ...customProps } = {}) {
|
||||
const Component = componentWithInstallHelpers({ src });
|
||||
|
||||
const props = defaultProps(customProps);
|
||||
const root = shallowUntilTarget(
|
||||
<Component {...props} />, BaseComponent
|
||||
);
|
||||
const root = render(Component, props);
|
||||
|
||||
return { root, dispatch: props.store.dispatch };
|
||||
}
|
||||
|
@ -184,7 +199,8 @@ describe(__filename, () => {
|
|||
_addonManager,
|
||||
store: createStore().store,
|
||||
};
|
||||
const root = shallowUntilTarget(<Component {...props} />, BaseComponent);
|
||||
|
||||
const root = render(Component, props);
|
||||
|
||||
// Update the component with the same props (i.e. same add-on guid)
|
||||
// and make sure the status is not set.
|
||||
|
@ -898,7 +914,9 @@ describe(`${__filename}: withInstallHelpers`, () => {
|
|||
|
||||
it('does not dispatch a FATAL_ERROR when setEnabled is missing', () => {
|
||||
const fakeAddonManager = {
|
||||
enable: sinon.stub().returns(Promise.reject(new Error(SET_ENABLE_NOT_AVAILABLE))),
|
||||
enable: sinon.stub().returns(Promise.reject(
|
||||
new Error(SET_ENABLE_NOT_AVAILABLE)
|
||||
)),
|
||||
};
|
||||
const { root, dispatch } = renderWithInstallHelpers({
|
||||
_addonManager: fakeAddonManager,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import React from 'react';
|
||||
import {
|
||||
Simulate, findRenderedComponentWithType, renderIntoDocument,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
import { Provider } from 'react-redux';
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ import React from 'react';
|
|||
import {
|
||||
renderIntoDocument,
|
||||
findRenderedComponentWithType,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
import { Provider } from 'react-redux';
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ import {
|
|||
findRenderedComponentWithType,
|
||||
renderIntoDocument,
|
||||
Simulate,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
import {
|
||||
findDOMNode,
|
||||
} from 'react-dom';
|
||||
|
|
|
@ -119,7 +119,7 @@ describe(__filename, () => {
|
|||
const button = root.childAt(1);
|
||||
|
||||
expect(button.type()).toEqual(Button);
|
||||
expect(button.children()).toContain('Install Theme');
|
||||
expect(button.children().at(1)).toHaveText('Install Theme');
|
||||
expect(button).toHaveProp(
|
||||
'data-browsertheme', JSON.stringify(themePreview.getThemeData(addon))
|
||||
);
|
||||
|
@ -133,7 +133,7 @@ describe(__filename, () => {
|
|||
const root = renderToDom({ addon, installTheme, status: UNKNOWN });
|
||||
|
||||
const preventDefault = sinon.spy();
|
||||
const button = root.find('.InstallButton-button');
|
||||
const button = root.find('button.InstallButton-button');
|
||||
button.simulate('click', createFakeEvent({ preventDefault }));
|
||||
|
||||
sinon.assert.called(preventDefault);
|
||||
|
@ -159,7 +159,7 @@ describe(__filename, () => {
|
|||
|
||||
expect(button.type()).toEqual(Button);
|
||||
|
||||
expect(button.children()).toContain('Add to Firefox');
|
||||
expect(button.children().at(1)).toHaveText('Add to Firefox');
|
||||
expect(button).toHaveClassName('InstallButton-button');
|
||||
expect(button).not.toHaveClassName('Button--small');
|
||||
expect(button).toHaveProp('href', installURL);
|
||||
|
@ -261,7 +261,7 @@ describe(__filename, () => {
|
|||
expect(button.type()).toEqual(Button);
|
||||
expect(button).toHaveClassName('Button--action');
|
||||
expect(button).toHaveClassName('InstallButton-button');
|
||||
expect(button.children()).toContain('Add to Firefox');
|
||||
expect(button.children().at(1)).toHaveText('Add to Firefox');
|
||||
});
|
||||
|
||||
it('renders a button for OpenSearch regardless of mozAddonManager', () => {
|
||||
|
@ -280,7 +280,7 @@ describe(__filename, () => {
|
|||
expect(button.type()).toEqual(Button);
|
||||
expect(button).toHaveClassName('Button--action');
|
||||
expect(button).toHaveClassName('InstallButton-button');
|
||||
expect(button.children()).toContain('Add to Firefox');
|
||||
expect(button.children().at(1)).toHaveText('Add to Firefox');
|
||||
});
|
||||
|
||||
it('disables the OpenSearch button if not compatible', () => {
|
||||
|
@ -297,7 +297,7 @@ describe(__filename, () => {
|
|||
|
||||
expect(button.type()).toEqual(Button);
|
||||
expect(button).toHaveClassName('InstallButton-button--disabled');
|
||||
expect(button.children()).toContain('Add to Firefox');
|
||||
expect(button.children().at(1)).toHaveText('Add to Firefox');
|
||||
});
|
||||
|
||||
it('disables install switch and uses button for OpenSearch plugins', () => {
|
||||
|
@ -315,7 +315,8 @@ describe(__filename, () => {
|
|||
});
|
||||
|
||||
const installButton = rootNode.find('.InstallButton-button');
|
||||
expect(installButton.children()).toContain('Add to Firefox');
|
||||
expect(installButton.children().at(1))
|
||||
.toHaveText('Add to Firefox');
|
||||
installButton.simulate('click', createFakeEvent());
|
||||
|
||||
sinon.assert.calledWith(fakeLog.info, 'Adding OpenSearch Provider');
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import React from 'react';
|
||||
import { Simulate, renderIntoDocument } from 'react-addons-test-utils';
|
||||
import { Simulate, renderIntoDocument } from 'react-dom/test-utils';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
|
||||
import {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import React from 'react';
|
||||
import { renderIntoDocument } from 'react-addons-test-utils';
|
||||
import { renderIntoDocument } from 'react-dom/test-utils';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
|
||||
import LoginPage from 'core/components/LoginPage';
|
||||
|
|
|
@ -6,7 +6,7 @@ import {
|
|||
renderIntoDocument,
|
||||
findRenderedComponentWithType,
|
||||
scryRenderedComponentsWithType,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
import { Route, Router, createMemoryHistory } from 'react-router';
|
||||
|
||||
import Paginate from 'core/components/Paginate';
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import React from 'react';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
import { renderIntoDocument } from 'react-addons-test-utils';
|
||||
import { renderIntoDocument } from 'react-dom/test-utils';
|
||||
|
||||
import PaginatorLink from 'core/components/PaginatorLink';
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* global document */
|
||||
import { shallow } from 'enzyme';
|
||||
import React from 'react';
|
||||
import { Simulate, renderIntoDocument } from 'react-addons-test-utils';
|
||||
import { Simulate, renderIntoDocument } from 'react-dom/test-utils';
|
||||
import ReactDOM, { findDOMNode } from 'react-dom';
|
||||
|
||||
import {
|
||||
|
|
|
@ -4,7 +4,7 @@ import { findDOMNode } from 'react-dom';
|
|||
import {
|
||||
findRenderedDOMComponentWithTag,
|
||||
renderIntoDocument,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
|
||||
import ServerHtml from 'core/containers/ServerHtml';
|
||||
import FakeApp, {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import React from 'react';
|
||||
import { renderIntoDocument } from 'react-addons-test-utils';
|
||||
import { renderIntoDocument } from 'react-dom/test-utils';
|
||||
|
||||
import { SimulateAsyncErrorBase } from
|
||||
'core/containers/error-simulation/SimulateAsyncError';
|
||||
|
|
|
@ -3,7 +3,7 @@ import { findDOMNode } from 'react-dom';
|
|||
import {
|
||||
Simulate,
|
||||
renderIntoDocument,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
|
||||
import { SimulateClientErrorBase } from
|
||||
'core/containers/error-simulation/SimulateClientError';
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import React from 'react';
|
||||
import { renderIntoDocument } from 'react-addons-test-utils';
|
||||
import { renderIntoDocument } from 'react-dom/test-utils';
|
||||
|
||||
import { SimulateSyncErrorBase } from
|
||||
'core/containers/error-simulation/SimulateSyncError';
|
||||
|
|
|
@ -2,7 +2,7 @@ import React from 'react';
|
|||
import PropTypes from 'prop-types';
|
||||
import {
|
||||
renderIntoDocument,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
|
||||
import I18nProvider from 'core/i18n/Provider';
|
||||
import { fakeI18n } from 'tests/unit/helpers';
|
||||
|
|
|
@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
|
|||
import {
|
||||
renderIntoDocument,
|
||||
findRenderedComponentWithType,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
|
||||
import I18nProvider from 'core/i18n/Provider';
|
||||
import translate from 'core/i18n/translate';
|
||||
|
|
|
@ -48,10 +48,14 @@ const stubRoutes = (
|
|||
export class ServerTestHelper {
|
||||
constructor() {
|
||||
this.helmetCanUseDOM = Helmet.canUseDOM;
|
||||
this.nestedStatusCanUseDOM = NestedStatus.canUseDOM;
|
||||
}
|
||||
|
||||
beforeEach() {
|
||||
Helmet.canUseDOM = false;
|
||||
// See: https://github.com/gaearon/react-side-effect/releases/tag/v1.0.0
|
||||
// (`react-side-effect` is a dependency of `react-nested-status`).
|
||||
NestedStatus.canUseDOM = false;
|
||||
global.webpackIsomorphicTools = {
|
||||
assets: () => fakeAssets,
|
||||
};
|
||||
|
@ -59,6 +63,7 @@ export class ServerTestHelper {
|
|||
|
||||
afterEach() {
|
||||
Helmet.canUseDOM = this.helmetCanUseDOM;
|
||||
NestedStatus.canUseDOM = this.nestedStatusCanUseDOM;
|
||||
delete global.webpackIsomorphicTools;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ import React from 'react';
|
|||
import PropTypes from 'prop-types';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
import { findRenderedComponentWithType, renderIntoDocument }
|
||||
from 'react-addons-test-utils';
|
||||
from 'react-dom/test-utils';
|
||||
import { createStore, combineReducers } from 'redux';
|
||||
import { shallow } from 'enzyme';
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ import { sprintf } from 'jed';
|
|||
import {
|
||||
renderIntoDocument,
|
||||
findRenderedComponentWithType,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
import { compose } from 'redux';
|
||||
|
||||
import * as api from 'core/api';
|
||||
|
|
|
@ -4,7 +4,7 @@ import { findDOMNode } from 'react-dom';
|
|||
import {
|
||||
findRenderedComponentWithType,
|
||||
renderIntoDocument,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
import NestedStatus from 'react-nested-status';
|
||||
import { Provider } from 'react-redux';
|
||||
|
||||
|
|
|
@ -293,7 +293,7 @@ export function shallowUntilTarget(componentInstance, TargetComponent, {
|
|||
return root.shallow(shallowOptions);
|
||||
}
|
||||
// Unwrap the next component in the hierarchy.
|
||||
root = root.first().shallow(shallowOptions);
|
||||
root = root.dive();
|
||||
}
|
||||
|
||||
throw new Error(oneLine`Could not find ${TargetComponent} in rendered
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import React from 'react';
|
||||
import { renderIntoDocument } from 'react-addons-test-utils';
|
||||
import { renderIntoDocument } from 'react-dom/test-utils';
|
||||
|
||||
import Card from 'ui/components/Card';
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import React from 'react';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
import { renderIntoDocument } from 'react-addons-test-utils';
|
||||
import { renderIntoDocument } from 'react-dom/test-utils';
|
||||
|
||||
import CardList from 'ui/components/CardList';
|
||||
|
||||
|
|
|
@ -90,7 +90,7 @@ describe(__filename, () => {
|
|||
const root = mountRender();
|
||||
// This checks that textarea.focus() was called.
|
||||
expect(
|
||||
root.find('.DismissibleTextForm-textarea')
|
||||
root.find('textarea.DismissibleTextForm-textarea')
|
||||
.matchesElement(document.activeElement)
|
||||
).toEqual(true);
|
||||
});
|
||||
|
@ -143,7 +143,7 @@ describe(__filename, () => {
|
|||
});
|
||||
|
||||
expect(root.find('.DismissibleTextForm-submit').childAt(0))
|
||||
.toContain('Submit the form');
|
||||
.toHaveText('Submit the form');
|
||||
});
|
||||
|
||||
it('lets you configure the in-progress submit button text', () => {
|
||||
|
@ -153,7 +153,7 @@ describe(__filename, () => {
|
|||
});
|
||||
|
||||
expect(root.find('.DismissibleTextForm-submit').childAt(0))
|
||||
.toContain('Submitting the form');
|
||||
.toHaveText('Submitting the form');
|
||||
});
|
||||
|
||||
it('disables the submit button while submitting the form', () => {
|
||||
|
|
|
@ -9,7 +9,12 @@ import { createFakeEvent, shallowUntilTarget } from 'tests/unit/helpers';
|
|||
|
||||
describe(__filename, () => {
|
||||
const renderComponent = (componentInstance) => {
|
||||
return shallowUntilTarget(componentInstance, DropdownMenuBase);
|
||||
return shallowUntilTarget(componentInstance, DropdownMenuBase, {
|
||||
// TODO: ideally, we would like to enable the lifecycle methods, but it
|
||||
// produces unexpected errors, related to Enzyme 3.
|
||||
// See: http://airbnb.io/enzyme/docs/guides/migration-from-2-to-3.html#lifecycle-methods.
|
||||
shallowOptions: { disableLifecycleMethods: true },
|
||||
});
|
||||
};
|
||||
|
||||
it('renders a menu', () => {
|
||||
|
@ -47,18 +52,24 @@ describe(__filename, () => {
|
|||
|
||||
it('resets the menu state on blur', () => {
|
||||
const root = mount(<DropdownMenu text="Menu" />);
|
||||
const menu = root.find('.DropdownMenu');
|
||||
// When using `mount`, Enzyme 3+ requires to `.find()` the elements all the
|
||||
// time, in case something has changed.
|
||||
const getMenu = () => root.find('.DropdownMenu');
|
||||
|
||||
// User clicks the menu main button.
|
||||
menu.find('.DropdownMenu-button').simulate('click', createFakeEvent());
|
||||
expect(menu).toHaveClassName('DropdownMenu--active');
|
||||
getMenu().find('.DropdownMenu-button').simulate('click', createFakeEvent());
|
||||
expect(getMenu()).toHaveClassName('DropdownMenu--active');
|
||||
|
||||
// User clicks somewhere else.
|
||||
// The first `instance()` call is Enzyme API, the second `getInstance()`
|
||||
// call is react-onclickoutside API. See:
|
||||
// https://github.com/Pomax/react-onclickoutside#but-how-can-i-access-my-component-it-has-an-api-that-i-rely-on
|
||||
root.instance().getInstance().handleClickOutside();
|
||||
expect(menu).not.toHaveClassName('DropdownMenu--active');
|
||||
// When using `mount`, Enzyme 3+ requires to `.update()` when we manually
|
||||
// make changes, like above.
|
||||
root.update();
|
||||
|
||||
expect(getMenu()).not.toHaveClassName('DropdownMenu--active');
|
||||
});
|
||||
|
||||
it('resets the menu state on click', () => {
|
||||
|
@ -70,57 +81,57 @@ describe(__filename, () => {
|
|||
</DropdownMenuItem>
|
||||
</DropdownMenu>
|
||||
);
|
||||
const menu = root.find('.DropdownMenu');
|
||||
const getMenu = () => root.find('.DropdownMenu');
|
||||
|
||||
// User clicks the menu main button to open it.
|
||||
menu.find('.DropdownMenu-button').simulate('click', createFakeEvent());
|
||||
expect(menu).toHaveClassName('DropdownMenu--active');
|
||||
getMenu().find('.DropdownMenu-button').simulate('click', createFakeEvent());
|
||||
expect(getMenu()).toHaveClassName('DropdownMenu--active');
|
||||
|
||||
// User clicks a link.
|
||||
menu.find('.TestLink').simulate('click', createFakeEvent());
|
||||
expect(menu).not.toHaveClassName('DropdownMenu--active');
|
||||
getMenu().find('.TestLink').simulate('click', createFakeEvent());
|
||||
expect(getMenu()).not.toHaveClassName('DropdownMenu--active');
|
||||
});
|
||||
|
||||
it('sets active on mouseEnter/clears on mouseLeave', () => {
|
||||
// We do this instead of a :hover with CSS to allow clearing the active
|
||||
// state after a click.
|
||||
const root = mount(<DropdownMenu text="Menu" />);
|
||||
const menu = root.find('.DropdownMenu');
|
||||
const getMenu = () => root.find('.DropdownMenu');
|
||||
|
||||
// User hovers on the menu.
|
||||
menu.simulate('mouseEnter', createFakeEvent());
|
||||
expect(menu).toHaveClassName('DropdownMenu--active');
|
||||
getMenu().simulate('mouseEnter', createFakeEvent());
|
||||
expect(getMenu()).toHaveClassName('DropdownMenu--active');
|
||||
|
||||
// User's mouse leaves the menu.
|
||||
menu.simulate('mouseLeave', createFakeEvent());
|
||||
expect(menu).not.toHaveClassName('DropdownMenu--active');
|
||||
getMenu().simulate('mouseLeave', createFakeEvent());
|
||||
expect(getMenu()).not.toHaveClassName('DropdownMenu--active');
|
||||
});
|
||||
|
||||
it('allows the user to hover then click without dismissing the menu', () => {
|
||||
const root = mount(<DropdownMenu text="Menu" />);
|
||||
const menu = root.find('.DropdownMenu');
|
||||
const getMenu = () => root.find('.DropdownMenu');
|
||||
|
||||
// User hovers on the menu.
|
||||
menu.simulate('mouseEnter', createFakeEvent());
|
||||
expect(menu).toHaveClassName('DropdownMenu--active');
|
||||
getMenu().simulate('mouseEnter', createFakeEvent());
|
||||
expect(getMenu()).toHaveClassName('DropdownMenu--active');
|
||||
|
||||
// User clicks the menu's main button once, which should not hide it.
|
||||
menu.find('.DropdownMenu-button').simulate('click', createFakeEvent());
|
||||
expect(menu).toHaveClassName('DropdownMenu--active');
|
||||
getMenu().find('.DropdownMenu-button').simulate('click', createFakeEvent());
|
||||
expect(getMenu()).toHaveClassName('DropdownMenu--active');
|
||||
});
|
||||
|
||||
it('allows the user to hover, then dismiss the menu with a click', () => {
|
||||
const root = mount(<DropdownMenu text="Menu" />);
|
||||
const menu = root.find('.DropdownMenu');
|
||||
const getMenu = () => root.find('.DropdownMenu');
|
||||
|
||||
// User hovers on the menu.
|
||||
menu.simulate('mouseEnter', createFakeEvent());
|
||||
expect(menu).toHaveClassName('DropdownMenu--active');
|
||||
getMenu().simulate('mouseEnter', createFakeEvent());
|
||||
expect(getMenu()).toHaveClassName('DropdownMenu--active');
|
||||
|
||||
// User clicks the menu's main button twice, which will dismiss it.
|
||||
menu.find('.DropdownMenu-button').simulate('click', createFakeEvent());
|
||||
menu.find('.DropdownMenu-button').simulate('click', createFakeEvent());
|
||||
expect(menu).not.toHaveClassName('DropdownMenu--active');
|
||||
getMenu().find('.DropdownMenu-button').simulate('click', createFakeEvent());
|
||||
getMenu().find('.DropdownMenu-button').simulate('click', createFakeEvent());
|
||||
expect(getMenu()).not.toHaveClassName('DropdownMenu--active');
|
||||
});
|
||||
|
||||
it('optionally takes a class name', () => {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import React from 'react';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
import { renderIntoDocument, Simulate } from 'react-addons-test-utils';
|
||||
import { renderIntoDocument, Simulate } from 'react-dom/test-utils';
|
||||
|
||||
import { API_ERROR_SIGNATURE_EXPIRED } from 'core/constants';
|
||||
import I18nProvider from 'core/i18n/Provider';
|
||||
|
|
|
@ -36,21 +36,21 @@ describe(__filename, () => {
|
|||
// We have to mount for this test because of the usage of `setState`
|
||||
// in this component.
|
||||
const root = mount(<ExpandableCard i18n={fakeI18n()} />);
|
||||
const card = root.find('.ExpandableCard');
|
||||
const card = () => root.find('.ExpandableCard');
|
||||
const fakeEvent = createFakeEvent();
|
||||
|
||||
// Clicking on the toggle should expand the card.
|
||||
root.find('.ExpandableCard-ToggleLink').simulate('click', fakeEvent);
|
||||
|
||||
sinon.assert.called(fakeEvent.preventDefault);
|
||||
expect(card).toHaveClassName('ExpandableCard--expanded');
|
||||
expect(card()).toHaveClassName('ExpandableCard--expanded');
|
||||
|
||||
// Clicking on the toggle again should set the card to be unexpanded.
|
||||
fakeEvent.preventDefault.reset();
|
||||
root.find('.ExpandableCard-ToggleLink').simulate('click', fakeEvent);
|
||||
|
||||
sinon.assert.called(fakeEvent.preventDefault);
|
||||
expect(card).not.toHaveClassName('ExpandableCard--expanded');
|
||||
expect(card()).not.toHaveClassName('ExpandableCard--expanded');
|
||||
});
|
||||
|
||||
it('renders className', () => {
|
||||
|
|
|
@ -33,8 +33,8 @@ describe(__filename, () => {
|
|||
|
||||
sinon.assert.calledWith(dispatchSpy,
|
||||
setHeroBannerOrder({ name, random: true, sections }));
|
||||
expect(root.find('.Hero')).toHaveLength(1);
|
||||
expect(root.find('.Hero-name-TestingPage')).toHaveLength(1);
|
||||
expect(root.find('.Card.Hero')).toHaveLength(1);
|
||||
expect(root.find('.Card.Hero-name-TestingPage')).toHaveLength(1);
|
||||
expect(root.find('.something')).toHaveLength(1);
|
||||
expect(root.find('.something-else')).toHaveLength(1);
|
||||
});
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import React from 'react';
|
||||
import { renderIntoDocument, Simulate } from 'react-addons-test-utils';
|
||||
import { renderIntoDocument, Simulate } from 'react-dom/test-utils';
|
||||
|
||||
import Overlay from 'ui/components/Overlay';
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import React from 'react';
|
||||
import {
|
||||
findRenderedComponentWithType, renderIntoDocument,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
|
||||
import Overlay from 'ui/components/Overlay';
|
||||
|
|
|
@ -3,7 +3,7 @@ import {
|
|||
findRenderedComponentWithType,
|
||||
renderIntoDocument,
|
||||
Simulate,
|
||||
} from 'react-addons-test-utils';
|
||||
} from 'react-dom/test-utils';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
|
||||
import { fakeI18n } from 'tests/unit/helpers';
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import React from 'react';
|
||||
import { mount } from 'enzyme';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
import { Simulate, renderIntoDocument } from 'react-addons-test-utils';
|
||||
import { Simulate, renderIntoDocument } from 'react-dom/test-utils';
|
||||
|
||||
import { ShowMoreCardBase, MAX_HEIGHT } from 'ui/components/ShowMoreCard';
|
||||
import { fakeI18n } from 'tests/unit/helpers';
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import React from 'react';
|
||||
import { Simulate, renderIntoDocument } from 'react-addons-test-utils';
|
||||
import { Simulate, renderIntoDocument } from 'react-dom/test-utils';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
|
||||
import Switch from 'ui/components/Switch';
|
||||
|
|
|
@ -76,9 +76,9 @@ export default Object.assign({}, webpackConfig, {
|
|||
// [Invariant](https://github.com/zertosh/invariant) which
|
||||
// hides error messages in the production build.
|
||||
new webpack.NormalModuleReplacementPlugin(
|
||||
/^react$/, 'react/dist/react.js'),
|
||||
/^react$/, 'react/umd/react.development.js'),
|
||||
new webpack.NormalModuleReplacementPlugin(
|
||||
/^react-dom$/, 'react-dom/dist/react-dom.js'),
|
||||
/^react-dom$/, 'react-dom/umd/react-dom.development.js'),
|
||||
new webpack.NormalModuleReplacementPlugin(
|
||||
/^redux$/, 'redux/dist/redux.js'),
|
||||
new webpack.HotModuleReplacementPlugin(),
|
||||
|
|
361
yarn.lock
361
yarn.lock
|
@ -6,10 +6,6 @@
|
|||
version "6.0.79"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.79.tgz#5efe7d4a6d8c453c7e9eaf55d931f4a22fac5169"
|
||||
|
||||
"@types/react@^15.0.22":
|
||||
version "15.0.34"
|
||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-15.0.34.tgz#c4f7235f3d245216a706887b7d1ffedaf5b1dc06"
|
||||
|
||||
JSONStream@^0.8.4:
|
||||
version "0.8.4"
|
||||
resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.8.4.tgz#91657dfe6ff857483066132b4618b62e8f4887bd"
|
||||
|
@ -1604,27 +1600,6 @@ chalk@~0.4.0:
|
|||
has-color "~0.1.0"
|
||||
strip-ansi "~0.1.0"
|
||||
|
||||
cheerio@^0.22.0:
|
||||
version "0.22.0"
|
||||
resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e"
|
||||
dependencies:
|
||||
css-select "~1.2.0"
|
||||
dom-serializer "~0.1.0"
|
||||
entities "~1.1.1"
|
||||
htmlparser2 "^3.9.1"
|
||||
lodash.assignin "^4.0.9"
|
||||
lodash.bind "^4.1.4"
|
||||
lodash.defaults "^4.0.1"
|
||||
lodash.filter "^4.4.0"
|
||||
lodash.flatten "^4.2.0"
|
||||
lodash.foreach "^4.3.0"
|
||||
lodash.map "^4.4.0"
|
||||
lodash.merge "^4.4.0"
|
||||
lodash.pick "^4.2.1"
|
||||
lodash.reduce "^4.4.0"
|
||||
lodash.reject "^4.4.0"
|
||||
lodash.some "^4.4.0"
|
||||
|
||||
cheerio@^1.0.0-rc.2:
|
||||
version "1.0.0-rc.2"
|
||||
resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db"
|
||||
|
@ -1829,6 +1804,10 @@ colormin@^1.0.5:
|
|||
css-color-names "0.0.4"
|
||||
has "^1.0.1"
|
||||
|
||||
colors@0.5.x:
|
||||
version "0.5.1"
|
||||
resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774"
|
||||
|
||||
colors@1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
|
||||
|
@ -2051,7 +2030,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
|
|||
safe-buffer "^5.0.1"
|
||||
sha.js "^2.4.8"
|
||||
|
||||
create-react-class@15.x:
|
||||
create-react-class@15.x, create-react-class@^15.5.1:
|
||||
version "15.6.2"
|
||||
resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.2.tgz#cf1ed15f12aad7f14ef5f2dfe05e6c42f91ef02a"
|
||||
dependencies:
|
||||
|
@ -2059,14 +2038,6 @@ create-react-class@15.x:
|
|||
loose-envify "^1.3.1"
|
||||
object-assign "^4.1.1"
|
||||
|
||||
create-react-class@^15.6.0:
|
||||
version "15.6.0"
|
||||
resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.0.tgz#ab448497c26566e1e29413e883207d57cfe7bed4"
|
||||
dependencies:
|
||||
fbjs "^0.8.9"
|
||||
loose-envify "^1.3.1"
|
||||
object-assign "^4.1.1"
|
||||
|
||||
cross-spawn@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
|
||||
|
@ -2347,7 +2318,7 @@ deep-equal-ident@^1.1.1:
|
|||
dependencies:
|
||||
lodash.isequal "^3.0"
|
||||
|
||||
deep-equal@^1.0.0, deep-equal@^1.0.1:
|
||||
deep-equal@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
|
||||
|
||||
|
@ -2460,6 +2431,10 @@ diffie-hellman@^5.0.0:
|
|||
miller-rabin "^4.0.0"
|
||||
randombytes "^2.0.0"
|
||||
|
||||
discontinuous-range@1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a"
|
||||
|
||||
dns-equal@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
|
||||
|
@ -2665,38 +2640,52 @@ entities@^1.1.1, entities@~1.1.1:
|
|||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
|
||||
|
||||
enzyme-matchers@^3.8.3:
|
||||
version "3.8.3"
|
||||
resolved "https://registry.yarnpkg.com/enzyme-matchers/-/enzyme-matchers-3.8.3.tgz#6269d47b0d81d5222745da503f27ac003ba208d2"
|
||||
enzyme-adapter-react-16@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.1.0.tgz#86c5db7c10f0be6ec25d54ca41b59f2abb397cf4"
|
||||
dependencies:
|
||||
enzyme-adapter-utils "^1.1.0"
|
||||
lodash "^4.17.4"
|
||||
object.assign "^4.0.4"
|
||||
object.values "^1.0.4"
|
||||
prop-types "^15.5.10"
|
||||
react-test-renderer "^16.0.0-0"
|
||||
|
||||
enzyme-adapter-utils@^1.1.0:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.1.1.tgz#689de8853f0751710590d6dfa730ff4056ea36b2"
|
||||
dependencies:
|
||||
lodash "^4.17.4"
|
||||
object.assign "^4.0.4"
|
||||
prop-types "^15.5.10"
|
||||
|
||||
enzyme-matchers@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/enzyme-matchers/-/enzyme-matchers-4.0.1.tgz#f3fb5e5e5e5ec9a19144d172605433fc7e9d9f5a"
|
||||
dependencies:
|
||||
deep-equal-ident "^1.1.1"
|
||||
|
||||
enzyme-to-json@^1.5.0:
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/enzyme-to-json/-/enzyme-to-json-1.5.1.tgz#e34f4d126bb3f4696ce3800b51f9ed83df708799"
|
||||
enzyme-to-json@^3.0.0:
|
||||
version "3.2.2"
|
||||
resolved "https://registry.yarnpkg.com/enzyme-to-json/-/enzyme-to-json-3.2.2.tgz#110047c68dda97aaeb7af3cee7d995fe3d17e82a"
|
||||
dependencies:
|
||||
lodash.filter "^4.6.0"
|
||||
lodash.isnil "^4.0.0"
|
||||
lodash.isplainobject "^4.0.6"
|
||||
lodash.omitby "^4.5.0"
|
||||
lodash.range "^3.2.0"
|
||||
object-values "^1.0.0"
|
||||
object.entries "^1.0.3"
|
||||
lodash "^4.17.4"
|
||||
|
||||
enzyme@^2.8.2:
|
||||
version "2.9.1"
|
||||
resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-2.9.1.tgz#07d5ce691241240fb817bf2c4b18d6e530240df6"
|
||||
enzyme@^3.2.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.2.0.tgz#998bdcda0fc71b8764a0017f7cc692c943f54a7a"
|
||||
dependencies:
|
||||
cheerio "^0.22.0"
|
||||
function.prototype.name "^1.0.0"
|
||||
cheerio "^1.0.0-rc.2"
|
||||
function.prototype.name "^1.0.3"
|
||||
has "^1.0.1"
|
||||
is-subset "^0.1.1"
|
||||
lodash "^4.17.4"
|
||||
object-is "^1.0.1"
|
||||
object.assign "^4.0.4"
|
||||
object.entries "^1.0.4"
|
||||
object.values "^1.0.4"
|
||||
prop-types "^15.5.10"
|
||||
uuid "^3.0.1"
|
||||
raf "^3.4.0"
|
||||
rst-selector-parser "^2.2.3"
|
||||
|
||||
errno@^0.1.3, errno@^0.1.4:
|
||||
version "0.1.4"
|
||||
|
@ -3288,14 +3277,6 @@ fb-watchman@^2.0.0:
|
|||
dependencies:
|
||||
bser "^2.0.0"
|
||||
|
||||
fbjs@0.1.0-alpha.10:
|
||||
version "0.1.0-alpha.10"
|
||||
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.1.0-alpha.10.tgz#46e457c09cbefb51fc752a3e030e7b67fcc384c8"
|
||||
dependencies:
|
||||
core-js "^1.0.0"
|
||||
promise "^7.0.3"
|
||||
whatwg-fetch "^0.9.0"
|
||||
|
||||
fbjs@^0.8.16:
|
||||
version "0.8.16"
|
||||
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db"
|
||||
|
@ -3578,13 +3559,13 @@ function-bind@^1.0.2, function-bind@^1.1.0:
|
|||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771"
|
||||
|
||||
function.prototype.name@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.0.0.tgz#5f523ca64e491a5f95aba80cc1e391080a14482e"
|
||||
function.prototype.name@^1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.0.3.tgz#0099ae5572e9dd6f03c97d023fd92bcc5e639eac"
|
||||
dependencies:
|
||||
define-properties "^1.1.2"
|
||||
function-bind "^1.1.0"
|
||||
is-callable "^1.1.2"
|
||||
is-callable "^1.1.3"
|
||||
|
||||
functional-red-black-tree@^1.0.1:
|
||||
version "1.0.1"
|
||||
|
@ -3889,14 +3870,14 @@ hide-powered-by@1.0.0:
|
|||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/hide-powered-by/-/hide-powered-by-1.0.0.tgz#4a85ad65881f62857fc70af7174a1184dccce32b"
|
||||
|
||||
history@^2.1.2:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/history/-/history-2.1.2.tgz#4aa2de897a0e4867e4539843be6ecdb2986bfdec"
|
||||
history@^3.0.0:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/history/-/history-3.3.0.tgz#fcedcce8f12975371545d735461033579a6dae9c"
|
||||
dependencies:
|
||||
deep-equal "^1.0.0"
|
||||
invariant "^2.0.0"
|
||||
query-string "^3.0.0"
|
||||
warning "^2.0.0"
|
||||
invariant "^2.2.1"
|
||||
loose-envify "^1.2.0"
|
||||
query-string "^4.2.2"
|
||||
warning "^3.0.0"
|
||||
|
||||
hmac-drbg@^1.0.0:
|
||||
version "1.0.1"
|
||||
|
@ -4256,7 +4237,7 @@ is-builtin-module@^1.0.0:
|
|||
dependencies:
|
||||
builtin-modules "^1.0.0"
|
||||
|
||||
is-callable@^1.1.1, is-callable@^1.1.2, is-callable@^1.1.3:
|
||||
is-callable@^1.1.1, is-callable@^1.1.3:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
|
||||
|
||||
|
@ -4612,13 +4593,12 @@ jest-environment-node@^21.0.2:
|
|||
jest-mock "^21.0.2"
|
||||
jest-util "^21.0.2"
|
||||
|
||||
jest-enzyme@^3.8.3:
|
||||
version "3.8.3"
|
||||
resolved "https://registry.yarnpkg.com/jest-enzyme/-/jest-enzyme-3.8.3.tgz#5112fcc77d12cb75c3e26c09733f1831f5e45bb7"
|
||||
jest-enzyme@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/jest-enzyme/-/jest-enzyme-4.0.1.tgz#9d13de2d194e09e12b71c9689afb2c066df30b0e"
|
||||
dependencies:
|
||||
"@types/react" "^15.0.22"
|
||||
enzyme-matchers "^3.8.3"
|
||||
enzyme-to-json "^1.5.0"
|
||||
enzyme-matchers "^4.0.1"
|
||||
enzyme-to-json "^3.0.0"
|
||||
|
||||
jest-get-type@^21.0.2:
|
||||
version "21.0.2"
|
||||
|
@ -5100,14 +5080,6 @@ lodash.assign@^4.2.0:
|
|||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
|
||||
|
||||
lodash.assignin@^4.0.9:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2"
|
||||
|
||||
lodash.bind@^4.1.4:
|
||||
version "4.2.1"
|
||||
resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
|
||||
|
||||
lodash.camelcase@^4.3.0:
|
||||
version "4.3.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
|
||||
|
@ -5124,25 +5096,13 @@ lodash.debounce@4.0.8:
|
|||
version "4.0.8"
|
||||
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
|
||||
|
||||
lodash.defaults@^4.0.1:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
|
||||
|
||||
lodash.filter@^4.4.0, lodash.filter@^4.6.0:
|
||||
version "4.6.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace"
|
||||
|
||||
lodash.find@^4.6.0:
|
||||
version "4.6.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1"
|
||||
|
||||
lodash.flatten@^4.2.0:
|
||||
lodash.flattendeep@^4.4.0:
|
||||
version "4.4.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
|
||||
|
||||
lodash.foreach@^4.3.0:
|
||||
version "4.5.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
|
||||
resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2"
|
||||
|
||||
lodash.get@^4.4.2:
|
||||
version "4.4.2"
|
||||
|
@ -5163,14 +5123,6 @@ lodash.isequal@^3.0:
|
|||
lodash._baseisequal "^3.0.0"
|
||||
lodash._bindcallback "^3.0.0"
|
||||
|
||||
lodash.isnil@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.isnil/-/lodash.isnil-4.0.0.tgz#49e28cd559013458c814c5479d3c663a21bfaa6c"
|
||||
|
||||
lodash.isplainobject@^4.0.6:
|
||||
version "4.0.6"
|
||||
resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
|
||||
|
||||
lodash.istypedarray@^3.0.0:
|
||||
version "3.0.6"
|
||||
resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62"
|
||||
|
@ -5183,46 +5135,22 @@ lodash.keys@^3.0.0, lodash.keys@^3.1.2:
|
|||
lodash.isarguments "^3.0.0"
|
||||
lodash.isarray "^3.0.0"
|
||||
|
||||
lodash.map@^4.4.0:
|
||||
version "4.6.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
|
||||
|
||||
lodash.memoize@^4.1.2:
|
||||
version "4.1.2"
|
||||
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
|
||||
|
||||
lodash.merge@^4.4.0:
|
||||
version "4.6.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5"
|
||||
|
||||
lodash.mergewith@^4.6.0:
|
||||
version "4.6.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55"
|
||||
|
||||
lodash.omitby@^4.5.0:
|
||||
version "4.6.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.omitby/-/lodash.omitby-4.6.0.tgz#5c15ff4754ad555016b53c041311e8f079204791"
|
||||
|
||||
lodash.pick@^4.2.1:
|
||||
version "4.4.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
|
||||
|
||||
lodash.range@^3.2.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.range/-/lodash.range-3.2.0.tgz#f461e588f66683f7eadeade513e38a69a565a15d"
|
||||
|
||||
lodash.reduce@4.6.0, lodash.reduce@^4.4.0:
|
||||
lodash.reduce@4.6.0:
|
||||
version "4.6.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b"
|
||||
|
||||
lodash.reject@^4.4.0:
|
||||
version "4.6.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415"
|
||||
|
||||
lodash.some@^4.4.0:
|
||||
version "4.6.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
|
||||
|
||||
lodash.sortby@^4.7.0:
|
||||
version "4.7.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
|
||||
|
@ -5581,6 +5509,14 @@ ncp@~2.0.0:
|
|||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3"
|
||||
|
||||
nearley@^2.7.10:
|
||||
version "2.11.0"
|
||||
resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.11.0.tgz#5e626c79a6cd2f6ab9e7e5d5805e7668967757ae"
|
||||
dependencies:
|
||||
nomnom "~1.6.2"
|
||||
railroad-diagrams "^1.0.0"
|
||||
randexp "^0.4.2"
|
||||
|
||||
negotiator@0.6.1:
|
||||
version "0.6.1"
|
||||
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
|
||||
|
@ -5730,6 +5666,13 @@ nomnom@1.8.1:
|
|||
chalk "~0.4.0"
|
||||
underscore "~1.6.0"
|
||||
|
||||
nomnom@~1.6.2:
|
||||
version "1.6.2"
|
||||
resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.6.2.tgz#84a66a260174408fc5b77a18f888eccc44fb6971"
|
||||
dependencies:
|
||||
colors "0.5.x"
|
||||
underscore "~1.4.4"
|
||||
|
||||
"nopt@2 || 3":
|
||||
version "3.0.6"
|
||||
resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
|
||||
|
@ -5856,10 +5799,6 @@ object-keys@^1.0.10, object-keys@^1.0.6, object-keys@^1.0.8:
|
|||
version "1.0.11"
|
||||
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
|
||||
|
||||
object-values@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/object-values/-/object-values-1.0.0.tgz#72af839630119e5b98c3b02bb8c27e3237158105"
|
||||
|
||||
object.assign@^4.0.4:
|
||||
version "4.0.4"
|
||||
resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.0.4.tgz#b1c9cc044ef1b9fe63606fc141abbb32e14730cc"
|
||||
|
@ -5868,7 +5807,7 @@ object.assign@^4.0.4:
|
|||
function-bind "^1.1.0"
|
||||
object-keys "^1.0.10"
|
||||
|
||||
object.entries@^1.0.3, object.entries@^1.0.4:
|
||||
object.entries@^1.0.4:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f"
|
||||
dependencies:
|
||||
|
@ -6652,7 +6591,7 @@ progress@^2.0.0:
|
|||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
|
||||
|
||||
promise@^7.0.3, promise@^7.1.1:
|
||||
promise@^7.1.1:
|
||||
version "7.3.1"
|
||||
resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
|
||||
dependencies:
|
||||
|
@ -6665,7 +6604,7 @@ promisify-node@^0.4.0:
|
|||
nodegit-promise "~4.0.0"
|
||||
object-assign "^4.0.1"
|
||||
|
||||
prop-types@15.6.0, prop-types@15.x, prop-types@^15.6.0:
|
||||
prop-types@15.6.0, prop-types@15.x, prop-types@^15.5.6, prop-types@^15.6.0:
|
||||
version "15.6.0"
|
||||
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856"
|
||||
dependencies:
|
||||
|
@ -6673,7 +6612,7 @@ prop-types@15.6.0, prop-types@15.x, prop-types@^15.6.0:
|
|||
loose-envify "^1.3.1"
|
||||
object-assign "^4.1.1"
|
||||
|
||||
prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8:
|
||||
prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.7, prop-types@^15.5.8:
|
||||
version "15.5.10"
|
||||
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154"
|
||||
dependencies:
|
||||
|
@ -6744,13 +6683,7 @@ qs@^6.1.0:
|
|||
version "6.5.0"
|
||||
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49"
|
||||
|
||||
query-string@^3.0.0:
|
||||
version "3.0.3"
|
||||
resolved "https://registry.yarnpkg.com/query-string/-/query-string-3.0.3.tgz#ae2e14b4d05071d4e9b9eb4873c35b0dcd42e638"
|
||||
dependencies:
|
||||
strict-uri-encode "^1.0.0"
|
||||
|
||||
query-string@^4.1.0:
|
||||
query-string@^4.1.0, query-string@^4.2.2:
|
||||
version "4.3.4"
|
||||
resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
|
||||
dependencies:
|
||||
|
@ -6773,6 +6706,23 @@ querystringify@~1.0.0:
|
|||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb"
|
||||
|
||||
raf@3.4.0, raf@^3.4.0:
|
||||
version "3.4.0"
|
||||
resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575"
|
||||
dependencies:
|
||||
performance-now "^2.1.0"
|
||||
|
||||
railroad-diagrams@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e"
|
||||
|
||||
randexp@^0.4.2:
|
||||
version "0.4.6"
|
||||
resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3"
|
||||
dependencies:
|
||||
discontinuous-range "1.0.0"
|
||||
ret "~0.1.10"
|
||||
|
||||
randomatic@^1.1.3:
|
||||
version "1.1.7"
|
||||
resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
|
||||
|
@ -6879,16 +6829,6 @@ rc@^1.1.2, rc@^1.1.7:
|
|||
minimist "^1.2.0"
|
||||
strip-json-comments "~2.0.1"
|
||||
|
||||
react-addons-css-transition-group@15.6.2:
|
||||
version "15.6.2"
|
||||
resolved "https://registry.yarnpkg.com/react-addons-css-transition-group/-/react-addons-css-transition-group-15.6.2.tgz#9e4376bcf40b5217d14ec68553081cee4b08a6d6"
|
||||
dependencies:
|
||||
react-transition-group "^1.2.0"
|
||||
|
||||
react-addons-test-utils@^15.5.1:
|
||||
version "15.6.0"
|
||||
resolved "https://registry.yarnpkg.com/react-addons-test-utils/-/react-addons-test-utils-15.6.0.tgz#062d36117fe8d18f3ba5e06eb33383b0b85ea5b9"
|
||||
|
||||
react-autosuggest@9.3.2:
|
||||
version "9.3.2"
|
||||
resolved "https://registry.yarnpkg.com/react-autosuggest/-/react-autosuggest-9.3.2.tgz#dd8c0fbe9c25aa94afe296180353647f6ecc10a7"
|
||||
|
@ -6921,14 +6861,14 @@ react-deep-force-update@^2.1.1:
|
|||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-2.1.1.tgz#8ea4263cd6455a050b37445b3f08fd839d86e909"
|
||||
|
||||
react-dom@15.6.2:
|
||||
version "15.6.2"
|
||||
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.2.tgz#41cfadf693b757faf2708443a1d1fd5a02bef730"
|
||||
react-dom@16.1.1:
|
||||
version "16.1.1"
|
||||
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.1.1.tgz#b2e331b6d752faf1a2d31399969399a41d8d45f8"
|
||||
dependencies:
|
||||
fbjs "^0.8.9"
|
||||
fbjs "^0.8.16"
|
||||
loose-envify "^1.1.0"
|
||||
object-assign "^4.1.0"
|
||||
prop-types "^15.5.10"
|
||||
object-assign "^4.1.1"
|
||||
prop-types "^15.6.0"
|
||||
|
||||
react-helmet@5.2.0:
|
||||
version "5.2.0"
|
||||
|
@ -6949,11 +6889,11 @@ react-hot-loader@^3.1.1:
|
|||
redbox-react "^1.3.6"
|
||||
source-map "^0.6.1"
|
||||
|
||||
react-nested-status@0.1.2:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/react-nested-status/-/react-nested-status-0.1.2.tgz#41bceca75a2897632df6f2fc60b9b2de97b461ad"
|
||||
react-nested-status@0.2.1:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/react-nested-status/-/react-nested-status-0.2.1.tgz#0ba94b76c41cf8cba14d76b345a0f0165f1da366"
|
||||
dependencies:
|
||||
react-side-effect "~0.3.0"
|
||||
react-side-effect "^1.1.0"
|
||||
|
||||
react-onclickoutside@6.7.0:
|
||||
version "6.7.0"
|
||||
|
@ -7004,14 +6944,16 @@ react-router-scroll@0.4.4:
|
|||
scroll-behavior "^0.9.5"
|
||||
warning "^3.0.0"
|
||||
|
||||
react-router@2.8.1:
|
||||
version "2.8.1"
|
||||
resolved "https://registry.yarnpkg.com/react-router/-/react-router-2.8.1.tgz#73e9491f6ceb316d0f779829081863e378ee4ed7"
|
||||
react-router@3.2.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/react-router/-/react-router-3.2.0.tgz#62b6279d589b70b34e265113e4c0a9261a02ed36"
|
||||
dependencies:
|
||||
history "^2.1.2"
|
||||
create-react-class "^15.5.1"
|
||||
history "^3.0.0"
|
||||
hoist-non-react-statics "^1.2.0"
|
||||
invariant "^2.2.1"
|
||||
loose-envify "^1.2.0"
|
||||
prop-types "^15.5.6"
|
||||
warning "^3.0.0"
|
||||
|
||||
react-side-effect@^1.1.0:
|
||||
|
@ -7021,24 +6963,19 @@ react-side-effect@^1.1.0:
|
|||
exenv "^1.2.1"
|
||||
shallowequal "^1.0.1"
|
||||
|
||||
react-side-effect@~0.3.0:
|
||||
version "0.3.2"
|
||||
resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-0.3.2.tgz#0daff9af35a3ec98db2036dc1683d63fbe147710"
|
||||
dependencies:
|
||||
fbjs "0.1.0-alpha.10"
|
||||
|
||||
react-super-responsive-table@0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/react-super-responsive-table/-/react-super-responsive-table-0.3.0.tgz#7d025781d2b9deb16d3b300363ccf6a6ffc2d124"
|
||||
dependencies:
|
||||
classnames "^2.1.2"
|
||||
|
||||
react-test-renderer@^15.5.4:
|
||||
version "15.6.1"
|
||||
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-15.6.1.tgz#026f4a5bb5552661fd2cc4bbcd0d4bc8a35ebf7e"
|
||||
react-test-renderer@^16.0.0-0, react-test-renderer@^16.1.1:
|
||||
version "16.1.1"
|
||||
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.1.1.tgz#a05184688d564be799f212449262525d1e350537"
|
||||
dependencies:
|
||||
fbjs "^0.8.9"
|
||||
object-assign "^4.1.0"
|
||||
fbjs "^0.8.16"
|
||||
object-assign "^4.1.1"
|
||||
prop-types "^15.6.0"
|
||||
|
||||
react-textarea-autosize@5.2.1:
|
||||
version "5.2.1"
|
||||
|
@ -7059,9 +6996,9 @@ react-transform-hmr@^1.0.4:
|
|||
global "^4.3.0"
|
||||
react-proxy "^1.1.7"
|
||||
|
||||
react-transition-group@^1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.0.tgz#b51fc921b0c3835a7ef7c571c79fc82c73e9204f"
|
||||
react-transition-group@1.x:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.1.tgz#e11f72b257f921b213229a774df46612346c7ca6"
|
||||
dependencies:
|
||||
chain-function "^1.0.0"
|
||||
dom-helpers "^3.2.0"
|
||||
|
@ -7069,15 +7006,14 @@ react-transition-group@^1.2.0:
|
|||
prop-types "^15.5.6"
|
||||
warning "^3.0.0"
|
||||
|
||||
react@15.6.2:
|
||||
version "15.6.2"
|
||||
resolved "https://registry.yarnpkg.com/react/-/react-15.6.2.tgz#dba0434ab439cfe82f108f0f511663908179aa72"
|
||||
react@16.1.1:
|
||||
version "16.1.1"
|
||||
resolved "https://registry.yarnpkg.com/react/-/react-16.1.1.tgz#d5c4ef795507e3012282dd51261ff9c0e824fe1f"
|
||||
dependencies:
|
||||
create-react-class "^15.6.0"
|
||||
fbjs "^0.8.9"
|
||||
fbjs "^0.8.16"
|
||||
loose-envify "^1.1.0"
|
||||
object-assign "^4.1.0"
|
||||
prop-types "^15.5.10"
|
||||
object-assign "^4.1.1"
|
||||
prop-types "^15.6.0"
|
||||
|
||||
read-file-stdin@^0.2.1:
|
||||
version "0.2.1"
|
||||
|
@ -7206,9 +7142,9 @@ redux-devtools-instrument@^1.0.1:
|
|||
lodash "^4.2.0"
|
||||
symbol-observable "^1.0.2"
|
||||
|
||||
redux-devtools@^3.3.2:
|
||||
version "3.4.0"
|
||||
resolved "https://registry.yarnpkg.com/redux-devtools/-/redux-devtools-3.4.0.tgz#9bf8415154301f56906f26a36f5bc1f5ca913bb5"
|
||||
redux-devtools@^3.4.1:
|
||||
version "3.4.1"
|
||||
resolved "https://registry.yarnpkg.com/redux-devtools/-/redux-devtools-3.4.1.tgz#09d342ce0ab6087be679e953a1d7c530efa1138e"
|
||||
dependencies:
|
||||
lodash "^4.2.0"
|
||||
prop-types "^15.5.7"
|
||||
|
@ -7444,6 +7380,10 @@ restore-cursor@^2.0.0:
|
|||
onetime "^2.0.0"
|
||||
signal-exit "^3.0.2"
|
||||
|
||||
ret@~0.1.10:
|
||||
version "0.1.15"
|
||||
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
|
||||
|
||||
right-align@^0.1.1:
|
||||
version "0.1.3"
|
||||
resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
|
||||
|
@ -7469,6 +7409,13 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
|
|||
hash-base "^2.0.0"
|
||||
inherits "^2.0.1"
|
||||
|
||||
rst-selector-parser@^2.2.3:
|
||||
version "2.2.3"
|
||||
resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91"
|
||||
dependencies:
|
||||
lodash.flattendeep "^4.4.0"
|
||||
nearley "^2.7.10"
|
||||
|
||||
run-async@^2.2.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
|
||||
|
@ -8651,6 +8598,10 @@ uid-number@^0.0.6:
|
|||
version "0.0.6"
|
||||
resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
|
||||
|
||||
underscore@~1.4.4:
|
||||
version "1.4.4"
|
||||
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604"
|
||||
|
||||
underscore@~1.6.0:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8"
|
||||
|
@ -8744,7 +8695,7 @@ uuid@^2.0.2:
|
|||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
|
||||
|
||||
uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0:
|
||||
uuid@^3.0.0, uuid@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
|
||||
|
||||
|
@ -8785,12 +8736,6 @@ walker@~1.0.5:
|
|||
dependencies:
|
||||
makeerror "1.0.x"
|
||||
|
||||
warning@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/warning/-/warning-2.1.0.tgz#21220d9c63afc77a8c92111e011af705ce0c6901"
|
||||
dependencies:
|
||||
loose-envify "^1.0.0"
|
||||
|
||||
warning@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c"
|
||||
|
@ -8951,10 +8896,6 @@ whatwg-fetch@>=0.10.0:
|
|||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84"
|
||||
|
||||
whatwg-fetch@^0.9.0:
|
||||
version "0.9.0"
|
||||
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-0.9.0.tgz#0e3684c6cb9995b43efc9df03e4c365d95fd9cc0"
|
||||
|
||||
whatwg-url@^4.3.0:
|
||||
version "4.8.0"
|
||||
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0"
|
||||
|
|
Загрузка…
Ссылка в новой задаче