From 2c131073a82cd5bbfc9250817c8cfaf7ab3f1150 Mon Sep 17 00:00:00 2001 From: Mingze Xiao Date: Fri, 13 Dec 2019 14:33:08 -0800 Subject: [PATCH] feat(archive-viewer): add archive loader, viewer, and archive explorer --- build/karma.conf.js | 2 + build/karma.setup.react.js | 10 + build/webpack.common.config.js | 6 +- build/webpack.config.js | 1 + build/webpack.karma.config.js | 10 +- package.json | 6 +- src/i18n/en-US.properties | 8 + src/lib/constants.js | 1 + src/lib/util.js | 2 +- src/lib/viewers/archive/Archive.scss | 8 + src/lib/viewers/archive/ArchiveExplorer.js | 170 +++++++ src/lib/viewers/archive/ArchiveLoader.js | 17 + src/lib/viewers/archive/ArchiveViewer.js | 82 ++++ src/lib/viewers/archive/BoxArchive.js | 32 ++ .../__tests__/ArchiveExplorer-test-react.js | 120 +++++ .../archive/__tests__/ArchiveLoader-test.js | 37 ++ .../archive/__tests__/ArchiveViewer-test.html | 7 + .../archive/__tests__/ArchiveViewer-test.js | 119 +++++ .../archive/__tests__/BoxArchive-test.html | 1 + .../archive/__tests__/BoxArchive-test.js | 53 ++ src/lib/viewers/archive/constants.js | 8 + yarn.lock | 457 +++++++++++++++++- 22 files changed, 1134 insertions(+), 23 deletions(-) create mode 100644 build/karma.setup.react.js create mode 100644 src/lib/viewers/archive/Archive.scss create mode 100644 src/lib/viewers/archive/ArchiveExplorer.js create mode 100644 src/lib/viewers/archive/ArchiveLoader.js create mode 100644 src/lib/viewers/archive/ArchiveViewer.js create mode 100644 src/lib/viewers/archive/BoxArchive.js create mode 100644 src/lib/viewers/archive/__tests__/ArchiveExplorer-test-react.js create mode 100644 src/lib/viewers/archive/__tests__/ArchiveLoader-test.js create mode 100644 src/lib/viewers/archive/__tests__/ArchiveViewer-test.html create mode 100644 src/lib/viewers/archive/__tests__/ArchiveViewer-test.js create mode 100644 src/lib/viewers/archive/__tests__/BoxArchive-test.html create mode 100644 src/lib/viewers/archive/__tests__/BoxArchive-test.js create mode 100644 src/lib/viewers/archive/constants.js diff --git a/build/karma.conf.js b/build/karma.conf.js index fc2642a38..60155dd3e 100644 --- a/build/karma.conf.js +++ b/build/karma.conf.js @@ -97,9 +97,11 @@ module.exports = config => `src/third-party/model3d/${MODEL3D_STATIC_ASSETS_VERSION}/**/*.js`, `src/third-party/swf/${SWF_STATIC_ASSETS_VERSION}/**/*.js`, `src/third-party/text/${TEXT_STATIC_ASSETS_VERSION}/**/*.js`, + 'build/karma.setup.react.js', ].concat(getTestFile(config.src)), preprocessors: { + 'build/karma.setup.react.js': ['webpack', 'sourcemap'], 'src/**/__tests__/**/*-test.js': ['webpack', 'sourcemap'], 'src/**/__tests__/**/*-test.html': ['html2js'], }, diff --git a/build/karma.setup.react.js b/build/karma.setup.react.js new file mode 100644 index 000000000..ba5b961a8 --- /dev/null +++ b/build/karma.setup.react.js @@ -0,0 +1,10 @@ +import { configure } from 'enzyme'; +import Adapter from 'enzyme-adapter-react-16'; + +configure({ adapter: new Adapter() }); + +function importAll(r) { + r.keys().forEach(r); +} + +importAll(require.context('../src/lib/viewers/archive/__tests__', true, /-test-react\.js$/)); diff --git a/build/webpack.common.config.js b/build/webpack.common.config.js index 38a64e74b..ee8c07e74 100644 --- a/build/webpack.common.config.js +++ b/build/webpack.common.config.js @@ -21,7 +21,11 @@ module.exports = language => { { test: /\.s?css$/, use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'sass-loader'], - include: [path.resolve('src/lib'), path.resolve('node_modules/box-annotations')], + include: [ + path.resolve('src/lib'), + path.resolve('node_modules/box-annotations'), + path.resolve('node_modules/box-ui-elements'), + ], }, { test: /\.(svg|html)$/, diff --git a/build/webpack.config.js b/build/webpack.config.js index 8aefb1a65..75d32380a 100644 --- a/build/webpack.config.js +++ b/build/webpack.config.js @@ -33,6 +33,7 @@ function updateConfig(conf, language, index) { annotations: ['box-annotations'], preview: [`${lib}/Preview.js`], csv: [`${lib}/viewers/text/BoxCSV.js`], + archive: [`${lib}/viewers/archive/BoxArchive.js`], }, mode: isProd ? 'production' : 'development', optimization: { diff --git a/build/webpack.karma.config.js b/build/webpack.karma.config.js index c5a061c6e..3df047b86 100644 --- a/build/webpack.karma.config.js +++ b/build/webpack.karma.config.js @@ -1,10 +1,5 @@ require('babel-polyfill'); -const { argv } = process; -const isDebug = argv.find(arg => { - return arg === '--auto-watch' || arg === '--no-single-run'; -}); - const { IgnorePlugin } = require('webpack'); const commonConfig = require('./webpack.common.config'); @@ -12,6 +7,7 @@ const baseConfig = commonConfig('en-US'); const config = { ...baseConfig, + devtool: 'inline-source-map', mode: 'development', resolve: { alias: { @@ -20,10 +16,6 @@ const config = { }, }; -if (isDebug) { - config.devtool = 'inline-source-map'; -} - config.plugins.push( new IgnorePlugin(/react\/addons/), new IgnorePlugin(/react\/lib\/ReactContext/), diff --git a/package.json b/package.json index f8fbcb38a..ffb60265f 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "babel-plugin-react-remove-properties": "^0.3.0", "babel-plugin-transform-require-ignore": "^0.1.1", "box-annotations": "^2.3.0", - "box-react-ui": "^22.7.0", + "box-ui-elements": "^11.1.0-beta.18", "chai": "^4.2.0", "chai-dom": "^1.8.1", "conventional-changelog-cli": "^2.0.23", @@ -36,6 +36,8 @@ "css-loader": "^3.1.0", "cssnano-cli": "^1.0.5", "cypress": "^3.4.1", + "enzyme": "^3.10.0", + "enzyme-adapter-react-16": "^1.15.1", "eslint": "^6.3.0", "eslint-config-airbnb": "^18.0.1", "eslint-config-prettier": "^6.2.0", @@ -89,6 +91,8 @@ "raw-loader": "^3.1.0", "react": "^16.7.0", "react-dom": "^16.7.0", + "react-intl": "^2.9.0", + "react-tether": "^1.0.0", "react-virtualized": "^9.13.0", "sass-loader": "^7.1.0", "sinon": "^7.4.2", diff --git a/src/i18n/en-US.properties b/src/i18n/en-US.properties index 5e16d0dd7..edc9f4699 100644 --- a/src/i18n/en-US.properties +++ b/src/i18n/en-US.properties @@ -79,6 +79,14 @@ error_not_downloadable=Oops! It looks like something is wrong with this file. We # Preview error message shown when flash is not enabled on their browser error_flash_not_enabled=We’re sorry, the preview didn’t load because Flash is not enabled on your browser. If possible, please enable Flash and refresh the page. +# Archive Preview +# Label for filename column name +filename=Filename +# Label for last modified date column name +last_modified_date=Last modified date +# Label for size column name +size=Size + # Media Preview # Label for autoplay in media player media_autoplay=Autoplay diff --git a/src/lib/constants.js b/src/lib/constants.js index bfe39e786..2218c5caf 100644 --- a/src/lib/constants.js +++ b/src/lib/constants.js @@ -93,6 +93,7 @@ export const STATUS_SUCCESS = 'success'; export const STATUS_VIEWABLE = 'viewable'; // X-Rep-Hints for Representations API +export const X_REP_HINT_ARCHIVE = '[json]'; export const X_REP_HINT_BASE = '[3d][pdf][text][mp3]'; export const X_REP_HINT_DOC_THUMBNAIL = '[jpg?dimensions=1024x1024&paged=false]'; export const X_REP_HINT_IMAGE = '[jpg?dimensions=2048x2048,png?dimensions=2048x2048]'; diff --git a/src/lib/util.js b/src/lib/util.js index c9b8f6cc9..1ea30260c 100644 --- a/src/lib/util.js +++ b/src/lib/util.js @@ -1,5 +1,5 @@ import Uri from 'jsuri'; -import { decode } from 'box-react-ui/lib/utils/keys'; +import { decode } from 'box-ui-elements/es/utils/keys'; import DownloadReachability from './DownloadReachability'; import Location from './Location'; import PreviewError from './PreviewError'; diff --git a/src/lib/viewers/archive/Archive.scss b/src/lib/viewers/archive/Archive.scss new file mode 100644 index 000000000..b16f08533 --- /dev/null +++ b/src/lib/viewers/archive/Archive.scss @@ -0,0 +1,8 @@ +@import '../../boxuiVariables'; + +.bp-archive { + display: flex; + width: 100%; + height: 100%; + background: $white; +} diff --git a/src/lib/viewers/archive/ArchiveExplorer.js b/src/lib/viewers/archive/ArchiveExplorer.js new file mode 100644 index 000000000..c265bd5a9 --- /dev/null +++ b/src/lib/viewers/archive/ArchiveExplorer.js @@ -0,0 +1,170 @@ +import * as React from 'react'; +import PropTypes from 'prop-types'; +import get from 'lodash/get'; +import Internationalize from 'box-ui-elements/es/elements/common/Internationalize'; +import { + readableTimeCellRenderer, + sizeCellRenderer, + itemNameCellRenderer, +} from 'box-ui-elements/es/features/virtualized-table-renderers'; +import VirtualizedTable from 'box-ui-elements/es/features/virtualized-table'; +import { Column } from 'react-virtualized/dist/es/Table/index'; +import { TABLE_COLUMNS } from './constants'; + +const { KEY_NAME, KEY_MODIFIED_AT, KEY_SIZE } = TABLE_COLUMNS; + +class ArchiveExplorer extends React.Component { + static propTypes = { + itemCollection: PropTypes.arrayOf( + PropTypes.shape({ + type: PropTypes.string.isRequired, + absolute_path: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + modified_at: PropTypes.string.isRequired, + size: PropTypes.number.isRequired, + path_collection: PropTypes.shape({ + total_count: PropTypes.number, + entries: PropTypes.arrayOf( + PropTypes.shape({ + type: PropTypes.string, + absolute_path: PropTypes.string, + name: PropTypes.string, + }), + ), + }), + parent: PropTypes.string, + item_collection: PropTypes.shape({ + total_count: PropTypes.number, + entries: PropTypes.arrayOf( + PropTypes.shape({ + type: PropTypes.string, + absolute_path: PropTypes.string.isRequired, + name: PropTypes.string, + }), + ).isRequired, + }).isRequired, + }), + ).isRequired, + }; + + /** + * [constructor] + * + * @param {Object} props - React element properties + */ + constructor(props) { + super(props); + + this.state = { + fullPath: props.itemCollection.find(info => !info.parent).absolute_path, + }; + } + + /** + * Filter itemlist for target folder + * + * @param {Array} itemCollection - raw data + * @param {string} fullPath - target folder path + * @return {Array} filtered itemlist for target folder + */ + getItemList = (itemCollection, fullPath) => { + const folderInfo = itemCollection.find(item => item.absolute_path === fullPath); + const subItems = get(folderInfo, 'item_collection.entries'); + if (!subItems) { + return []; + } + const subItemsPath = subItems.map(item => item.absolute_path); + + return itemCollection.filter(item => subItemsPath.includes(item.absolute_path)); + }; + + /** + * Prepare data to render + * Will be passed as row getter into VirtaulizedTable + * + * @param {Array} itemList - list of data object + * @param {number} index - row index of the data to selected + * @return {Object} formatted data + */ + getRowData = itemList => ({ index }) => { + const { modified_at: modifiedAt, name, size, type, ...rest } = itemList[index]; + + return { + [KEY_NAME]: { + isExternal: false, + name, + type, + }, + // TODO: fix when conversion changes it to standard date format + [KEY_MODIFIED_AT]: `20${modifiedAt}`, + [KEY_SIZE]: size, + ...rest, + }; + }; + + /** + * Handle click event, update fullPath state + * + * @param {Object} cellValue - the cell being clicked + * @return {void} + */ + handleClick = ({ name }) => { + const { fullPath } = this.state; + this.setState({ + fullPath: `${fullPath}${name}/`, + }); + }; + + /** + * render data + * + * @return {jsx} VirtualizedTable + */ + render() { + const { itemCollection } = this.props; + const { fullPath } = this.state; + const itemList = this.getItemList(itemCollection, fullPath); + + return ( + + + {intl => [ + , + , + , + ]} + + + ); + } +} + +export default ArchiveExplorer; diff --git a/src/lib/viewers/archive/ArchiveLoader.js b/src/lib/viewers/archive/ArchiveLoader.js new file mode 100644 index 000000000..bf46f338d --- /dev/null +++ b/src/lib/viewers/archive/ArchiveLoader.js @@ -0,0 +1,17 @@ +import AssetLoader from '../AssetLoader'; +import ArchiveViewer from './ArchiveViewer'; + +const VIEWERS = [ + { + NAME: 'Archive', + CONSTRUCTOR: ArchiveViewer, + REP: 'json', + EXT: ['jar', 'zip'], + }, +]; + +class ArchiveLoader extends AssetLoader { + viewers = VIEWERS; +} + +export default new ArchiveLoader(); diff --git a/src/lib/viewers/archive/ArchiveViewer.js b/src/lib/viewers/archive/ArchiveViewer.js new file mode 100644 index 000000000..d613a522a --- /dev/null +++ b/src/lib/viewers/archive/ArchiveViewer.js @@ -0,0 +1,82 @@ +/* eslint-disable no-unused-vars */ +import get from 'lodash/get'; +import './Archive.scss'; +import BaseViewer from '../BaseViewer'; +import { VIEWER_EVENT } from '../../events'; + +const JS = ['archive.js']; +const CSS = ['archive.css']; + +class ArchiveViewer extends BaseViewer { + /** + * @inheritdoc + */ + setup() { + if (this.isSetup) { + return; + } + + // Call super() first to set up common layout + super.setup(); + + this.archiveEl = this.createViewer(document.createElement('div')); + this.archiveEl.className = 'bp-archive'; + } + + /** + * [destructor] + * + * @return {void} + */ + destroy() { + if (this.archiveComponent) { + this.archiveComponent.destroy(); + } + super.destroy(); + } + + /** + * Loads a archive file. + * + * @return {void} + */ + load() { + super.load(); + + return Promise.all([this.loadAssets(JS, CSS), this.getRepStatus().getPromise()]) + .then(() => { + const { representation } = this.options; + const template = get(representation, 'content.url_template'); + const contentUrl = this.createContentUrlWithAuthParams(template); + this.startLoadTimer(); + + return this.api.get(contentUrl); + }) + .then(this.finishLoading) + .catch(this.handleAssetError); + } + + /** + * Finishes loading the archive data + * + * @private + * @param {Array} data - archive data collection + * @return {void} + */ + finishLoading = data => { + if (this.isDestroyed()) { + return; + } + + /* + global BoxArchive + The BoxArchive is loaded from archive.js + */ + this.archiveComponent = new BoxArchive(this.archiveEl, data); + + this.loaded = true; + this.emit(VIEWER_EVENT.load); + }; +} + +export default ArchiveViewer; diff --git a/src/lib/viewers/archive/BoxArchive.js b/src/lib/viewers/archive/BoxArchive.js new file mode 100644 index 000000000..e5fa8b317 --- /dev/null +++ b/src/lib/viewers/archive/BoxArchive.js @@ -0,0 +1,32 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import ArchiveExplorer from './ArchiveExplorer'; + +class BoxArchive { + /** + * [constructor] + * + * @param {HTMLElement} archiveEl - Archive element + * @param {Object} data - Archive data + * @return {BoxArchive} Instance + */ + constructor(archiveEl, data) { + this.archiveEl = archiveEl; + this.archiveExplorer = ReactDOM.render(, this.archiveEl); + } + + /** + * [destructor] + * + * @return {void} + */ + destroy() { + if (this.archiveExplorer) { + ReactDOM.unmountComponentAtNode(this.archiveEl); + this.archiveExplorer = null; + } + } +} + +global.BoxArchive = BoxArchive; +export default BoxArchive; diff --git a/src/lib/viewers/archive/__tests__/ArchiveExplorer-test-react.js b/src/lib/viewers/archive/__tests__/ArchiveExplorer-test-react.js new file mode 100644 index 000000000..9877d3c3f --- /dev/null +++ b/src/lib/viewers/archive/__tests__/ArchiveExplorer-test-react.js @@ -0,0 +1,120 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import sinon from 'sinon'; +import ArchiveExplorer from '../ArchiveExplorer'; +import { TABLE_COLUMNS } from '../constants'; + +const sandbox = sinon.sandbox.create(); +let data; + +describe('lib/viewers/archive/ArchiveExplorer', () => { + beforeEach(() => { + data = [ + { + type: 'folder', + absolute_path: 'test/', + name: 'test', + modified_at: '19-Dec-02 16:43', + size: 0, + path_collection: { total_count: 0, entries: [] }, + parent: null, + item_collection: { + total_count: 3, + entries: [ + { + type: 'file', + absolute_path: 'test/csv-level-1.csv', + name: 'csv-level-1.csv', + }, + { + type: 'file', + absolute_path: 'test/test-level-1.jpg', + name: 'test-level-1.jpg', + }, + ], + }, + }, + { + type: 'file', + absolute_path: 'test/csv-level-1.csv', + name: 'csv-level-1.csv', + modified_at: '19-Nov-04 16:11', + size: 133, + path_collection: { + total_count: 1, + entries: [{ type: 'folder', absolute_path: 'test/', name: 'test' }], + }, + parent: 'test', + item_collection: null, + }, + { + type: 'file', + absolute_path: 'test/test-level-1.jpg', + name: 'test-level-1.jpg', + modified_at: '19-Nov-08 15:08', + size: 57379, + path_collection: { + total_count: 1, + entries: [{ type: 'folder', absolute_path: 'test/', name: 'test' }], + }, + parent: 'test', + item_collection: null, + }, + ]; + }); + + afterEach(() => { + sandbox.verifyAndRestore(); + }); + + describe('render()', () => { + it('should render VirtualizedTable', () => { + const component = shallow(); + + expect(component.find('Internationalize').length).to.equal(1); + expect(component.find('InjectIntl(VirtualizedTable)').length).to.equal(1); + }); + }); + + describe('handleClick()', () => { + it('should set state when handleClick() is called', () => { + const component = shallow(); + + component.instance().handleClick({ name: 'subfolder' }); + + expect(component.state().fullPath).to.equal('test/subfolder/'); + }); + }); + + describe('getRowData()', () => { + it('should return correct row data', () => { + const component = shallow(); + + const rowData = component.instance().getRowData(data)({ index: 0 }); + + const { KEY_NAME, KEY_MODIFIED_AT, KEY_SIZE } = TABLE_COLUMNS; + const { modified_at: modifiedAt, name, size, type, ...rest } = data[0]; + + expect(rowData).to.eql({ + [KEY_NAME]: { + isExternal: false, + name, + type, + }, + [KEY_MODIFIED_AT]: `20${modifiedAt}`, + [KEY_SIZE]: size, + ...rest, + }); + }); + }); + + describe('getItemList()', () => { + it('should return correct item list', () => { + const component = shallow(); + + const itemList = component.instance().getItemList(data, 'test/'); + + expect(itemList).to.eql([data[1], data[2]]); + }); + }); +}); diff --git a/src/lib/viewers/archive/__tests__/ArchiveLoader-test.js b/src/lib/viewers/archive/__tests__/ArchiveLoader-test.js new file mode 100644 index 000000000..94c8d5b3f --- /dev/null +++ b/src/lib/viewers/archive/__tests__/ArchiveLoader-test.js @@ -0,0 +1,37 @@ +/* eslint-disable no-unused-expressions */ +import ArchiveLoader from '../ArchiveLoader'; + +let stubFile; +const sandbox = sinon.sandbox.create(); + +describe('lib/viewers/archive/ArchiveLoader', () => { + beforeEach(() => { + ArchiveLoader.viewers = [ + { + REP: 'json', + EXT: 'json', + }, + ]; + + stubFile = { + extension: 'json', + representations: { + entries: [ + { + representation: 'json', + }, + ], + }, + }; + }); + + afterEach(() => { + sandbox.verifyAndRestore(); + }); + + describe('determineViewer()', () => { + it('should return archive viewer', () => { + expect(ArchiveLoader.determineViewer(stubFile)).to.equal(ArchiveLoader.viewers[0]); + }); + }); +}); diff --git a/src/lib/viewers/archive/__tests__/ArchiveViewer-test.html b/src/lib/viewers/archive/__tests__/ArchiveViewer-test.html new file mode 100644 index 000000000..58be94f4d --- /dev/null +++ b/src/lib/viewers/archive/__tests__/ArchiveViewer-test.html @@ -0,0 +1,7 @@ +
+
+
+
+
+
+
diff --git a/src/lib/viewers/archive/__tests__/ArchiveViewer-test.js b/src/lib/viewers/archive/__tests__/ArchiveViewer-test.js new file mode 100644 index 000000000..015157038 --- /dev/null +++ b/src/lib/viewers/archive/__tests__/ArchiveViewer-test.js @@ -0,0 +1,119 @@ +/* eslint-disable no-unused-expressions */ +import createReactClass from 'create-react-class'; +import Api from '../../../api'; +import ArchiveViewer from '../ArchiveViewer'; +import BaseViewer from '../../BaseViewer'; +import { VIEWER_EVENT } from '../../../events'; + +let containerEl; +let options; +let archive; +const sandbox = sinon.sandbox.create(); +const stubs = {}; + +describe('lib/viewers/archive/ArchiveViewer', () => { + const setupFunc = BaseViewer.prototype.setup; + + before(() => { + fixture.setBase('src/lib'); + }); + + beforeEach(() => { + fixture.load('viewers/archive/__tests__/ArchiveViewer-test.html'); + containerEl = document.querySelector('.container'); + stubs.api = new Api(); + options = { + api: stubs.api, + container: containerEl, + file: { + id: 0, + }, + representation: { + content: { + url_template: 'archiveUrl{+asset_path}', + }, + }, + }; + + archive = new ArchiveViewer(options); + Object.defineProperty(BaseViewer.prototype, 'setup', { value: sandbox.mock() }); + archive.containerEl = containerEl; + archive.setup(); + }); + + afterEach(() => { + sandbox.verifyAndRestore(); + fixture.cleanup(); + + Object.defineProperty(BaseViewer.prototype, 'setup', { value: setupFunc }); + + if (typeof archive.destroy === 'function') { + archive.destroy(); + } + archive = null; + }); + + describe('setup()', () => { + it('should set up the container and DOM structure', () => { + expect(archive.archiveEl.parentNode).to.equal(archive.containerEl); + expect(archive.archiveEl).to.have.class('bp-archive'); + }); + }); + + describe('load()', () => { + const loadFunc = BaseViewer.prototype.load; + + beforeEach(() => { + sandbox.stub(archive, 'setup'); + sandbox.stub(archive, 'loadAssets').returns(Promise.resolve()); + sandbox.stub(archive, 'getRepStatus').returns({ getPromise: () => Promise.resolve() }); + sandbox.stub(archive, 'finishLoading'); + }); + + afterEach(() => { + Object.defineProperty(BaseViewer.prototype, 'load', { value: loadFunc }); + }); + + it('should call createContentUrlWithAuthParams with right template', () => { + Object.defineProperty(BaseViewer.prototype, 'load', { value: sandbox.mock() }); + + sandbox.stub(archive, 'createContentUrlWithAuthParams'); + + return archive.load().then(() => { + expect(archive.createContentUrlWithAuthParams).to.be.calledWith('archiveUrl{+asset_path}'); + }); + }); + + it('should invoke startLoadTimer()', () => { + Object.defineProperty(BaseViewer.prototype, 'load', { value: sandbox.stub() }); + archive.options.token = 'token'; + archive.options.sharedLink = 'sharedLink'; + archive.options.sharedLinkPassword = 'sharedLinkPassword'; + sandbox.stub(stubs.api, 'get').returns(Promise.resolve()); + sandbox.stub(archive, 'startLoadTimer'); + + return archive.load().then(() => { + expect(archive.startLoadTimer).to.be.called; + }); + }); + }); + + describe('finishLoading()', () => { + it('should render BoxArchive component and emit load event', () => { + /* eslint-disable react/prefer-es6-class */ + window.BoxArchive = createReactClass({ + destroy: sandbox.stub(), + render: () => { + return ''; + }, + }); + /* eslint-enable react/prefer-es6-class */ + sandbox.stub(archive, 'emit'); + + archive.finishLoading([]); + + expect(archive.loaded).to.be.true; + expect(archive.emit).to.be.calledWith(VIEWER_EVENT.load); + }); + }); +}); diff --git a/src/lib/viewers/archive/__tests__/BoxArchive-test.html b/src/lib/viewers/archive/__tests__/BoxArchive-test.html new file mode 100644 index 000000000..584204ed4 --- /dev/null +++ b/src/lib/viewers/archive/__tests__/BoxArchive-test.html @@ -0,0 +1 @@ +
diff --git a/src/lib/viewers/archive/__tests__/BoxArchive-test.js b/src/lib/viewers/archive/__tests__/BoxArchive-test.js new file mode 100644 index 000000000..75ceef53e --- /dev/null +++ b/src/lib/viewers/archive/__tests__/BoxArchive-test.js @@ -0,0 +1,53 @@ +/* eslint-disable no-unused-expressions */ +import ReactDOM from 'react-dom'; +import BoxArchive from '../BoxArchive'; + +const sandbox = sinon.sandbox.create(); +let archiveComponent; +let containerEl; + +describe('lib/viewers/archive/BoxArchive', () => { + before(() => { + fixture.setBase('src/lib'); + }); + + beforeEach(() => { + fixture.load('viewers/archive/__tests__/BoxArchive-test.html'); + containerEl = document.querySelector('.container'); + }); + + afterEach(() => { + sandbox.verifyAndRestore(); + fixture.cleanup(); + + if (archiveComponent && typeof archiveComponent.destroy === 'function') { + archiveComponent.destroy(); + } + archiveComponent = null; + }); + + describe('destroy()', () => { + it('should unmount the component', () => { + sandbox.stub(ReactDOM, 'render').returns({}); + sandbox.stub(ReactDOM, 'unmountComponentAtNode'); + archiveComponent = new BoxArchive(containerEl, []); + + archiveComponent.destroy(); + archiveComponent = null; + + expect(ReactDOM.unmountComponentAtNode).to.be.called; + }); + }); + + describe('constructor render', () => { + it('should render archive explorer with the right data', () => { + const renderStub = sandbox.stub(ReactDOM, 'render'); + const data = [{ name: 'test.json' }]; + + archiveComponent = new BoxArchive(containerEl, data); + + const archiveExplorer = renderStub.firstCall.args[0]; + expect(archiveExplorer.props.itemCollection).to.equal(data); + }); + }); +}); diff --git a/src/lib/viewers/archive/constants.js b/src/lib/viewers/archive/constants.js new file mode 100644 index 000000000..c5b2c697f --- /dev/null +++ b/src/lib/viewers/archive/constants.js @@ -0,0 +1,8 @@ +const TABLE_COLUMNS = { + KEY_MODIFIED_AT: 'key_modified_at', + KEY_NAME: 'key_name', + KEY_SIZE: 'key_size', +}; + +// eslint-disable-next-line import/prefer-default-export +export { TABLE_COLUMNS }; diff --git a/yarn.lock b/yarn.lock index 289bd22ab..32b2e624f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1355,6 +1355,22 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^3.2.0" +airbnb-prop-types@^2.15.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz#5287820043af1eb469f5b0af0d6f70da6c52aaef" + integrity sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA== + dependencies: + array.prototype.find "^2.1.0" + function.prototype.name "^1.1.1" + has "^1.0.3" + is-regex "^1.0.4" + object-is "^1.0.1" + object.assign "^4.1.0" + object.entries "^1.1.0" + prop-types "^15.7.2" + prop-types-exact "^1.2.0" + react-is "^16.9.0" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -1540,6 +1556,11 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-filter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" + integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= + array-filter@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" @@ -1620,6 +1641,23 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.find@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.1.0.tgz#630f2eaf70a39e608ac3573e45cf8ccd0ede9ad7" + integrity sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.13.0" + +array.prototype.flat@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.2.tgz#8f3c71d245ba349b6b64b4078f76f5576f1fd723" + integrity sha512-VXjh7lAL4KXKF2hY4FnEW9eRW6IhdvFW1sN/JwLbmECbCgACCnBHNyP3lFiYuttr0jxRN9Bsc5+G27dMseSWqQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.15.0" + function-bind "^1.1.1" + arraybuffer.slice@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" @@ -2055,10 +2093,10 @@ box-annotations@^2.3.0: resolved "https://registry.yarnpkg.com/box-annotations/-/box-annotations-2.3.0.tgz#5cac38171f7f8d9283659e2b243310f19d5ab7d3" integrity sha512-Ea7tPgyJjX7vcnmZIfCorbzHd6oYx/OHVMPnZVQL/dUHR5vRKhLM0610xqwmVlUpk627sqHw5x/APaa+kt4SXg== -box-react-ui@^22.7.0: - version "22.7.0" - resolved "https://registry.yarnpkg.com/box-react-ui/-/box-react-ui-22.7.0.tgz#14ff057cc7b76fcedda35765817ce83306d7058e" - integrity sha512-QT7udoL4YwQ0e//MnDGPQT0O1uZ2VSpVa9hjmZWnFrZjJdy5MYB437YaFa73TWgyVuFRXeziw2S0Dhd4Mx8veQ== +box-ui-elements@^11.1.0-beta.18: + version "11.1.0-beta.18" + resolved "https://registry.yarnpkg.com/box-ui-elements/-/box-ui-elements-11.1.0-beta.18.tgz#988e5dd2bfdde01676815e37962909126f5a04fc" + integrity sha512-XFY49xHpHJR0zJ+2jTaqETPHwFIQvwfFZavSRWGaEo2dAJpdTIvX60Q72QWbN6ohsr8Wq35BYpB2C5AXnt0fjg== brace-expansion@^1.1.7: version "1.1.11" @@ -2518,6 +2556,18 @@ check-types@^8.0.3: resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== +cheerio@^1.0.0-rc.2: + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" + integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.1" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash "^4.15.0" + parse5 "^3.0.1" + chokidar@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" @@ -2878,6 +2928,11 @@ commander@^2.18.0, commander@^2.20.0, commander@~2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== +commander@^2.19.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + common-tags@1.8.0, common-tags@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" @@ -3523,6 +3578,16 @@ css-select@^2.0.0: domutils "^1.7.0" nth-check "^1.0.2" +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + css-tree@1.0.0-alpha.29: version "1.0.0-alpha.29" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" @@ -3544,7 +3609,7 @@ css-unit-converter@^1.1.1: resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= -css-what@^2.1.2: +css-what@2.1, css-what@^2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== @@ -4028,6 +4093,11 @@ dir-glob@^3.0.1: dependencies: path-type "^4.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" + integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo= + dlv@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.1.tgz#c79d96bfe659a5568001250ed2aaf653992bdd3f" @@ -4098,6 +4168,14 @@ dom-serializer@0: domelementtype "~1.1.1" entities "~1.1.1" +dom-serializer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + dom-walk@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" @@ -4113,7 +4191,7 @@ domelementtype@1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" integrity sha1-sXrtguirWeUt2cGbF1bg/BhyBMI= -domelementtype@^1.3.1: +domelementtype@^1.3.0, domelementtype@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== @@ -4130,6 +4208,14 @@ domhandler@^2.3.0: dependencies: domelementtype "1" +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + domutils@^1.5.1, domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" @@ -4320,6 +4406,68 @@ entities@^1.1.1, entities@~1.1.1: resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" integrity sha1-blwtClYhtdra7O+AuQ7ftc13cvA= +enzyme-adapter-react-16@^1.15.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.1.tgz#8ad55332be7091dc53a25d7d38b3485fc2ba50d5" + integrity sha512-yMPxrP3vjJP+4wL/qqfkT6JAIctcwKF+zXO6utlGPgUJT2l4tzrdjMDWGd/Pp1BjHBcljhN24OzNEGRteibJhA== + dependencies: + enzyme-adapter-utils "^1.12.1" + enzyme-shallow-equal "^1.0.0" + has "^1.0.3" + object.assign "^4.1.0" + object.values "^1.1.0" + prop-types "^15.7.2" + react-is "^16.10.2" + react-test-renderer "^16.0.0-0" + semver "^5.7.0" + +enzyme-adapter-utils@^1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.1.tgz#e828e0d038e2b1efa4b9619ce896226f85c9dd88" + integrity sha512-KWiHzSjZaLEoDCOxY8Z1RAbUResbqKN5bZvenPbfKtWorJFVETUw754ebkuCQ3JKm0adx1kF8JaiR+PHPiP47g== + dependencies: + airbnb-prop-types "^2.15.0" + function.prototype.name "^1.1.1" + object.assign "^4.1.0" + object.fromentries "^2.0.1" + prop-types "^15.7.2" + semver "^5.7.0" + +enzyme-shallow-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.0.tgz#d8e4603495e6ea279038eef05a4bf4887b55dc69" + integrity sha512-VUf+q5o1EIv2ZaloNQQtWCJM9gpeux6vudGVH6vLmfPXFLRuxl5+Aq3U260wof9nn0b0i+P5OEUXm1vnxkRpXQ== + dependencies: + has "^1.0.3" + object-is "^1.0.1" + +enzyme@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.10.0.tgz#7218e347c4a7746e133f8e964aada4a3523452f6" + integrity sha512-p2yy9Y7t/PFbPoTvrWde7JIYB2ZyGC+NgTNbVEGvZ5/EyoYSr9aG/2rSbVvyNvMHEhw9/dmGUJHWtfQIEiX9pg== + dependencies: + array.prototype.flat "^1.2.1" + cheerio "^1.0.0-rc.2" + function.prototype.name "^1.1.0" + has "^1.0.3" + html-element-map "^1.0.0" + is-boolean-object "^1.0.0" + is-callable "^1.1.4" + is-number-object "^1.0.3" + is-regex "^1.0.4" + is-string "^1.0.4" + is-subset "^0.1.1" + lodash.escape "^4.0.1" + lodash.isequal "^4.5.0" + object-inspect "^1.6.0" + object-is "^1.0.1" + object.assign "^4.1.0" + object.entries "^1.0.4" + object.values "^1.0.4" + raf "^3.4.0" + rst-selector-parser "^2.2.3" + string.prototype.trim "^1.1.2" + errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" @@ -4353,6 +4501,22 @@ es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.4.3, es-abstract@^1.5.1 is-regex "^1.0.4" object-keys "^1.0.12" +es-abstract@^1.13.0, es-abstract@^1.15.0: + version "1.16.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.3.tgz#52490d978f96ff9f89ec15b5cf244304a5bca161" + integrity sha512-WtY7Fx5LiOnSYgF5eg/1T+GONaGmpvpPdCpSnYij+U2gDTL0UPfWrhDw7b2IYb+9NQJsYpCA0wOQvZfsd6YwRw== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-inspect "^1.7.0" + object-keys "^1.1.1" + string.prototype.trimleft "^2.1.0" + string.prototype.trimright "^2.1.0" + es-abstract@^1.7.0: version "1.10.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" @@ -4382,6 +4546,15 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + es6-promise@^4.0.3: version "4.2.4" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" @@ -5469,11 +5642,26 @@ function-bind@^1.0.2, function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.0, function.prototype.name@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.1.tgz#6d252350803085abc2ad423d4fe3be2f9cbda392" + integrity sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + functions-have-names "^1.1.1" + is-callable "^1.1.4" + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +functions-have-names@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.0.tgz#83da7583e4ea0c9ac5ff530f73394b033e0bf77d" + integrity sha512-zKXyzksTeaCSw5wIX79iCA40YAa6CJMJgNg9wdkU/ERBrIdPSimPICYiLp65lRbSBqtiHql/HZfS2DyI/AH6tQ== + gather-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gather-stream/-/gather-stream-1.0.0.tgz#b33994af457a8115700d410f317733cbe7a0904b" @@ -5983,6 +6171,11 @@ has-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + has-to-string-tag-x@^1.2.0: version "1.4.1" resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" @@ -6115,6 +6308,13 @@ hoek@6.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.2.tgz#99e6d070561839de74ee427b61aa476bd6bddfd6" integrity sha512-6qhh/wahGYZHFSFw12tBbJw5fsAhhwrrG/y3Cs0YMTv2WzMnL0oLPnQJjv1QJvEfylRSOFuP+xCu+tdx0tD16Q== +hoist-non-react-statics@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#101685d3aff3b23ea213163f6e8e12f4f111e19f" + integrity sha512-wbg3bpgA/ZqWrZuMOeJi8+SKMhr7X9TesL/rXMjTzh0p0JUBo3II8DHboYbuIXWRlttrUFxwcu/5kygrCw8fJw== + dependencies: + react-is "^16.7.0" + homedir-polyfill@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" @@ -6157,6 +6357,13 @@ html-comment-regex@^1.1.0: resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" integrity sha1-ZouTd26q5V696POtRkswekljYl4= +html-element-map@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/html-element-map/-/html-element-map-1.2.0.tgz#dfbb09efe882806af63d990cf6db37993f099f22" + integrity sha512-0uXq8HsuG1v2TmQ8QkIhzbrqeskE4kn52Q18QJ9iAA/SnHoEKXWiUxHQtclRsCFWEUD2So34X+0+pZZu862nnw== + dependencies: + array-filter "^1.0.0" + html-entities@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" @@ -6172,7 +6379,7 @@ html-tags@^3.0.0: resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== -htmlparser2@^3.10.0: +htmlparser2@^3.10.0, htmlparser2@^3.9.1: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== @@ -6490,6 +6697,30 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= +intl-format-cache@^2.0.5: + version "2.2.9" + resolved "https://registry.yarnpkg.com/intl-format-cache/-/intl-format-cache-2.2.9.tgz#fb560de20c549cda20b569cf1ffb6dc62b5b93b4" + integrity sha512-Zv/u8wRpekckv0cLkwpVdABYST4hZNTDaX7reFetrYTJwxExR2VyTqQm+l0WmL0Qo8Mjb9Tf33qnfj0T7pjxdQ== + +intl-messageformat-parser@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-1.4.0.tgz#b43d45a97468cadbe44331d74bb1e8dea44fc075" + integrity sha1-tD1FqXRoytvkQzHXS7Ho3qRPwHU= + +intl-messageformat@^2.0.0, intl-messageformat@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-2.2.0.tgz#345bcd46de630b7683330c2e52177ff5eab484fc" + integrity sha1-NFvNRt5jC3aDMwwuUhd/9eq0hPw= + dependencies: + intl-messageformat-parser "1.4.0" + +intl-relativeformat@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/intl-relativeformat/-/intl-relativeformat-2.2.0.tgz#6aca95d019ec8d30b6c5653b6629f9983ea5b6c5" + integrity sha512-4bV/7kSKaPEmu6ArxXf9xjv1ny74Zkwuey8Pm01NH4zggPP7JHwg2STk8Y3JdspCKRDriwIyLRfEXnj2ZLr4Bw== + dependencies: + intl-messageformat "^2.0.0" + into-stream@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" @@ -6498,6 +6729,13 @@ into-stream@^3.1.0: from2 "^2.1.1" p-is-promise "^1.1.0" +invariant@^2.1.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + invariant@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.3.tgz#1a827dfde7dcbd7c323f0ca826be8fa7c5e9d688" @@ -6596,6 +6834,11 @@ is-binary-path@^2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93" + integrity sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M= + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -6771,6 +7014,11 @@ is-installed-globally@0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" +is-number-object@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799" + integrity sha1-8mWrian0RQNO9q/xWo8AsA9VF5k= + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -6897,6 +7145,16 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-string@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.4.tgz#cc3a9b69857d621e963725a24caeec873b826e64" + integrity sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ= + +is-subset@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" + integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= + is-supported-regexp-flag@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz#21ee16518d2c1dd3edd3e9a0d57e50207ac364ca" @@ -7704,6 +7962,21 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.escape@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" + integrity sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg= + +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" @@ -7764,7 +8037,7 @@ lodash@4.17.14, lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.14: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== -lodash@4.17.15, lodash@^4.14.14, lodash@^4.17.12, lodash@^4.17.15, lodash@^4.2.1: +lodash@4.17.15, lodash@^4.14.14, lodash@^4.15.0, lodash@^4.17.12, lodash@^4.17.15, lodash@^4.2.1: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -8431,6 +8704,11 @@ moment@2.24.0: resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== +moo@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.4.3.tgz#3f847a26f31cf625a956a87f2b10fbc013bfd10e" + integrity sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw== + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -8504,6 +8782,17 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +nearley@^2.7.10: + version "2.19.0" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.19.0.tgz#37717781d0fd0f2bfc95e233ebd75678ca4bda46" + integrity sha512-2v52FTw7RPqieZr3Gth1luAXZR7Je6q3KaDHY5bjl/paDUdMu35fZ8ICNgiYJRr3tf3NMvIQQR1r27AvEr9CRA== + dependencies: + commander "^2.19.0" + moo "^0.4.3" + railroad-diagrams "^1.0.0" + randexp "0.4.6" + semver "^5.4.1" + needle@^2.2.1: version "2.2.4" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" @@ -8814,7 +9103,7 @@ npm-run-path@^3.0.0: gauge "~2.7.3" set-blocking "~2.0.0" -nth-check@^1.0.2: +nth-check@^1.0.2, nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== @@ -8865,6 +9154,16 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-inspect@^1.6.0, object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-is@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" + integrity sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY= + object-keys@^1.0.11, object-keys@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" @@ -8875,6 +9174,11 @@ object-keys@^1.0.8: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" integrity sha1-xUYBd4rVYPEULODgG8yotW0TQm0= +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -8892,7 +9196,7 @@ object.assign@4.1.0, object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.entries@^1.1.0: +object.entries@^1.0.4, object.entries@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== @@ -8912,6 +9216,16 @@ object.fromentries@^2.0.0: function-bind "^1.1.1" has "^1.0.1" +object.fromentries@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.1.tgz#050f077855c7af8ae6649f45c80b16ee2d31e704" + integrity sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.15.0" + function-bind "^1.1.1" + has "^1.0.3" + object.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" @@ -8927,7 +9241,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0: +object.values@^1.0.4, object.values@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== @@ -9285,6 +9599,13 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= +parse5@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== + dependencies: + "@types/node" "*" + parseqs@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" @@ -10347,6 +10668,15 @@ promise@^7.1.1: dependencies: asap "~2.0.3" +prop-types-exact@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869" + integrity sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA== + dependencies: + has "^1.0.3" + object.assign "^4.1.0" + reflect.ownkeys "^0.2.0" + prop-types@^15.6.0: version "15.6.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" @@ -10526,11 +10856,31 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +raf@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + 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" + integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234= + ramda@0.24.1: version "0.24.1" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857" integrity sha1-w7d1UZfzW43DUCIoJixMkd22uFc= +randexp@0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== + dependencies: + discontinuous-range "1.0.0" + ret "~0.1.10" + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" @@ -10604,11 +10954,45 @@ react-dom@^16.7.0: prop-types "^15.6.2" scheduler "^0.12.0" +react-intl@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-2.9.0.tgz#c97c5d17d4718f1575fdbd5a769f96018a3b1843" + integrity sha512-27jnDlb/d2A7mSJwrbOBnUgD+rPep+abmoJE511Tf8BnoONIAUehy/U1zZCHGO17mnOwMWxqN4qC0nW11cD6rA== + dependencies: + hoist-non-react-statics "^3.3.0" + intl-format-cache "^2.0.5" + intl-messageformat "^2.1.0" + intl-relativeformat "^2.1.0" + invariant "^2.1.1" + +react-is@^16.10.2, react-is@^16.7.0, react-is@^16.8.6, react-is@^16.9.0: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" + integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== + react-is@^16.8.1: version "16.8.6" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== +react-test-renderer@^16.0.0-0: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.12.0.tgz#11417ffda579306d4e841a794d32140f3da1b43f" + integrity sha512-Vj/teSqt2oayaWxkbhQ6gKis+t5JrknXfPVo+aIJ8QwYAqMPH77uptOdrlphyxl8eQI/rtkOYg86i/UWkpFu0w== + dependencies: + object-assign "^4.1.1" + prop-types "^15.6.2" + react-is "^16.8.6" + scheduler "^0.18.0" + +react-tether@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/react-tether/-/react-tether-1.0.5.tgz#6d106e0039b1aa0e14d1266925486cd9cff2d217" + integrity sha512-dehXHK82Xx0aXZldYiGR6dzlIAruAvnDvtp5O6AyT1EC1TTMYem/kIXNHsyjFNEA1hhhL7c98GmP6ANYVbq+GQ== + dependencies: + prop-types "^15.6.2" + tether "^1.4.5" + react-virtualized@^9.13.0: version "9.18.5" resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.18.5.tgz#42dd390ebaa7ea809bfcaf775d39872641679b89" @@ -10799,6 +11183,11 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^0.4.2" +reflect.ownkeys@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460" + integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA= + regenerate-unicode-properties@^8.0.2: version "8.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" @@ -11228,6 +11617,14 @@ 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" + integrity sha1-gbIw6i/MYGbInjRy3nlChdmwPZE= + 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" @@ -11328,6 +11725,14 @@ scheduler@^0.12.0: loose-envify "^1.1.0" object-assign "^4.1.1" +scheduler@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" + integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -12039,6 +12444,31 @@ string.prototype.padend@^3.0.0: es-abstract "^1.4.3" function-bind "^1.0.2" +string.prototype.trim@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz#75a729b10cfc1be439543dae442129459ce61e3d" + integrity sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.13.0" + function-bind "^1.1.1" + +string.prototype.trimleft@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" + integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" + integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + string_decoder@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.0.tgz#384f322ee8a848e500effde99901bba849c5d403" @@ -12495,6 +12925,11 @@ test-exclude@^5.2.3: read-pkg-up "^4.0.0" require-main-filename "^2.0.0" +tether@^1.4.5: + version "1.4.7" + resolved "https://registry.yarnpkg.com/tether/-/tether-1.4.7.tgz#d56a818590d8fe72e387f77a67f93ab96d8e1fb2" + integrity sha512-Z0J1aExjoFU8pybVkQAo/vD2wfSO63r+XOPfWQMC5qtf1bI7IWqNk4MiyBcgvvnY8kqnY06dVdvwTK2S3PU/Fw== + text-extensions@^1.0.0: version "1.9.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26"