Compare commits

...

62 Commits

Author SHA1 Message Date
8c66fb0251 fix search results page for topics 2018-12-20 18:11:53 +05:30
Ahmed-Ayman
14d9c925f2 dispatch the loaded all results action. 2018-12-19 18:14:13 +02:00
Ahmed-Ayman
b5ae097872 create the results page action,reducer 2018-12-19 18:08:22 +02:00
Ahmed-Ayman
1779d04546 disable the results route 2018-12-19 15:05:03 +02:00
Ahmed-Ayman
fde16110cc results page first commit. 2018-12-13 19:04:55 +02:00
Ahmed-Ayman
ff519477ac fix #14 change the max-width of the topics list. 2018-12-13 18:30:24 +02:00
Ahmed-Ayman
ed1fffca88 fix #14 create the all topics page with the filter. 2018-12-13 18:19:33 +02:00
Ahmed-Ayman
3d20857fc1 change the cursor to pointer for the buttons 2018-12-13 16:35:02 +02:00
c4603b8e03 implement shuffle topics button functionality 2018-12-13 16:22:58 +02:00
9fe634dfd5 dont reload random topic on home view if random topic exists, fixes #10 2018-12-13 16:12:35 +02:00
Ahmed-Ayman
4c2a3361eb create all topics (button), shuffle (button), all videos (link) 2018-12-13 09:18:44 +02:00
Ahmed-Ayman
474000833c add more rules for the horizontal line around the title. 2018-12-12 20:12:56 +02:00
Ahmed-Ayman
06065dea6e set a max-height for the thumbnails 2018-12-12 20:08:43 +02:00
Ahmed-Ayman
09dc73a5c1 install font-awesome to use icons 2018-12-12 20:06:42 +02:00
Ahmed-Ayman
1be52cd27e set the images width to 100% 2018-12-12 20:04:15 +02:00
Ahmed-Ayman
53214b12ea add just one line around the random topics title 2018-12-12 20:02:13 +02:00
sanj
6ff0019b79 Merge branch 'feature/fix-thumbnails' of 858/frontend into develop 2018-12-12 16:41:09 +00:00
1eb6b8a1f4 fix thumbnail on videos 2018-12-12 18:37:34 +02:00
Ahmed-Ayman
34deaaeefe add borders to the topic/item name 2018-12-11 14:41:57 +02:00
Ahmed-Ayman
935c6d210c style the video item, title decoration, colors 2018-12-11 13:30:28 +02:00
Ahmed-Ayman
2bb636cb79 add link to the logo 2018-12-11 13:22:08 +02:00
Ahmed-Ayman
fcbfe7bc50 style the video player 2018-12-11 13:19:04 +02:00
Ahmed-Ayman
45da475ba6 add react-video 2018-12-11 13:01:02 +02:00
Ahmed-Ayman
45b435b201 refactor the project to use scss 2018-12-11 12:42:56 +02:00
Ahmed-Ayman
0b51135517 refactor the sass, section heading names 2018-12-11 12:25:35 +02:00
Ahmed-Ayman
a0489baae9 add sass 2018-12-11 12:25:05 +02:00
Ahmed-Ayman
3c7050bcdc resolved merge conflict 2018-12-08 20:35:46 +02:00
Ahmed-Ayman
9cccc32dfd style the video-items. 2018-12-08 20:32:45 +02:00
sanj
14adb5e86c Merge branch 'feature/connected-react-router' of 858/frontend into develop 2018-12-08 16:29:32 +00:00
6eb178ea39 fix connected-react-router 2018-12-08 18:27:19 +02:00
ee15c0150d failed attempt at setting up connected router 2018-12-08 18:01:20 +02:00
sanj
7d8778b51c Merge branch 'feature/video-player' of 858/frontend into develop 2018-12-07 22:43:41 +00:00
f1667af8de make link to video player work, fetch video data if not available in global state 2018-12-08 00:42:02 +02:00
86a90ca8da [wip] video player page 2018-12-08 00:04:04 +02:00
Ahmed-Ayman
f0dc1e4f35 Merge remote-tracking branch 'origin/develop' into develop 2018-12-07 20:22:15 +02:00
Ahmed-Ayman
204f1de024 create a basic layout for the video player. 2018-12-07 20:21:25 +02:00
sanj
71a14e79d9 Merge branch 'feature/add-topic-count' of 858/frontend into develop 2018-12-07 17:44:24 +00:00
2d755be6b8 add count for current topic in random topic component 2018-12-07 19:43:25 +02:00
69c2181afa add random topic items count to state 2018-12-07 19:38:24 +02:00
Ahmed-Ayman
5c048b2036 add the see all videos, topics links 2018-12-07 19:35:40 +02:00
f667e9ea8f really fix issues with random topic on first load 2018-12-07 19:33:42 +02:00
c9d1495c43 fix bug on random topic not loading on first page load 2018-12-07 19:25:43 +02:00
sanj
7d48fad50a Merge branch 'feature/topic-actions' of 858/frontend into develop 2018-12-07 17:03:22 +00:00
Ahmed-Ayman
d36d4e6c6e create a video container, component static defaults. 2018-12-07 19:02:27 +02:00
e7471420d2 fetch all topics, show random topic with 4 videos in home container 2018-12-07 18:59:16 +02:00
Ahmed-Ayman
461ed1af37 style the counter 2018-12-07 14:01:26 +02:00
Ahmed-Ayman
2dcd50d361 create the nav 2018-12-06 23:24:39 +02:00
Ahmed-Ayman
aef0af64b6 create the footer 2018-12-06 23:10:30 +02:00
Ahmed-Ayman
3a42fee6e2 create static homepage,
create VideoPlayer and Title Components
2018-12-06 20:33:29 +02:00
Ahmed-Ayman
34f39d0253 import util.getThumbnail in the video item. 2018-12-06 17:22:03 +02:00
Ahmed-Ayman
c2bce65dce install prop-types 2018-12-06 17:17:31 +02:00
7a3e025278 Merge branch 'develop' of code.with.camp:858/frontend into develop 2018-12-06 17:08:31 +02:00
d369c16540 add util to fetch video thumb / video 2018-12-06 17:08:12 +02:00
Ahmed-Ayman
bff021333f add the site-wide components to app.js 2018-12-06 16:26:19 +02:00
Ahmed-Ayman
53de0e1916 add css-grid to package.json 2018-12-06 16:19:03 +02:00
Ahmed-Ayman
396005c9fc fix #5 create a Random Location, Topic static content 2018-12-06 00:34:48 +02:00
Ahmed-Ayman
da380dff81 fix #4 create the search component. 2018-12-06 00:32:46 +02:00
Ahmed-Ayman
a3ed5426c5 fix #3 create a separate counter component 2018-12-06 00:02:33 +02:00
Ahmed-Ayman
4b90d1f895 add images and global css to be used later in the website 2018-12-05 23:56:22 +02:00
Ahmed-Ayman
ba0f08036e fix #3 add fonts to be used for the header and the rest of the website. 2018-12-05 23:51:53 +02:00
Ahmed-Ayman
c17e153fd3 fix #3 create the header, style the site-logo to have a max-width 2018-12-05 22:09:11 +02:00
Ahmed-Ayman
401de982c8 change subComponents to components 2018-12-05 21:48:08 +02:00
74 changed files with 1712 additions and 246 deletions

View File

@ -3,14 +3,22 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"connected-react-router": "^5.0.1",
"font-awesome": "^4.7.0",
"history": "^4.7.2",
"node-sass": "^4.11.0",
"prop-types": "^15.6.2",
"react": "^16.6.3",
"react-css-grid": "^2.0.0-0",
"react-dom": "^16.6.3",
"react-redux": "^5.1.1",
"react-router": "^4.3.1",
"react-router-dom": "^4.3.1",
"react-scripts": "2.1.1",
"redux": "^4.0.1",
"redux-logger": "^3.0.6",
"redux-thunk": "^2.3.0",
"video-react": "^0.13.1",
"whatwg-fetch": "^3.0.0"
},
"scripts": {

View File

@ -19,7 +19,7 @@
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>React App</title>
<title>858</title>
</head>
<body>
<noscript>

View File

@ -1,19 +1,38 @@
import React, { Component } from 'react';
import { Provider } from 'react-redux';
import React, {Component} from 'react';
import {Provider} from 'react-redux';
import { ConnectedRouter } from 'connected-react-router'
import './App.css';
import { Route } from 'react-router-dom';
import 'font-awesome/css/font-awesome.min.css';
import { Route, Switch } from 'react-router-dom';
import Home from './containers/Home';
import TopicsList from './containers/TopicsList';
import TopicsListContainer from './containers/TopicsListContainer';
import store from './store/configureStore';
import history from './history';
import Header from "./components/Header";
import Footer from "./components/Footer";
import Search from "./components/Search";
import Nav from "./components/Nav";
import Video from "./containers/Video";
import Results from "./containers/Results";
class App extends Component {
render() {
return (
<Provider store={ store }>
<div className="App">
<Route exact={ true } path="/" component={ Home } />
<Route path="/topics" component={ TopicsList } />
</div>
<Provider store={store}>
<ConnectedRouter history={ history }>
<div className="App">
<Header/>
<Search/>
<Switch>
<Route exact={true} path="/" component={Home}/>
<Route path="/topics" component={TopicsListContainer}/>
<Route path="/results/:categoryKey/:searchValue" component={Results}/>
<Route path="/videos/:videoId" component={Video}/>
</Switch>
<Nav/>
<Footer/>
</div>
</ConnectedRouter>
</Provider>
);
}

View File

@ -1,3 +1,15 @@
export const TEST_ACTION = 'TEST_ACTION';
export const START_LOADING_VIDEOS = 'START_LOADING_VIDEOS';
export const RECEIVE_VIDEOS = 'RECEIVE_VIDEOS';
// Topics Action Types
export const START_LOADING_ALL_TOPICS = 'START_LOADING_ALL_TOPICS';
export const LOADED_ALL_TOPICS = 'LOADED_ALL_TOPICS';
export const START_LOADING_RANDOM_TOPIC = 'START_LOADING_RANDOM_TOPIC';
export const LOADED_RANDOM_TOPIC = 'LOADED_RANDOM_TOPIC';
// Videos Action Types
export const ADD_VIDEOS_TO_STATE = 'ADD_VIDEOS_TO_STATE';
export const START_LOADING_VIDEO = 'START_LOADING_VIDEO';
export const LOADED_VIDEO = 'LOADED_VIDEO';
// Search Results Action Types
export const START_LOADING_ALL_RESULTS = 'START_LOADING_ALL_RESULTS';
export const LOADED_ALL_RESULTS = 'LOADED_ALL_RESULTS';

7
src/actions/errors.js Normal file
View File

@ -0,0 +1,7 @@
export function APIError(error) {
return {
type: 'ERROR',
payload: error
}
}

View File

@ -1,49 +0,0 @@
import config from '../config';
import { START_LOADING_VIDEOS, RECEIVE_VIDEOS } from './action_types';
function fetchVideos() {
console.log('fetchVideos called');
return dispatch => {
console.log('inside dispatch function');
dispatch(startLoadingVideos());
const params = {
"keys":["editable","modified","title","source","project","topic","language","duration","id"],
"query": {
"conditions":[],
"operator":"&"
},
"range":[0,100],
"sort": [{"key":"title","operator":"+"}]
};
let formData = new FormData();
formData.append('action', 'find');
formData.append('data', JSON.stringify(params));
fetch(config.apiUrl, {
method: 'POST',
// headers: {
// "Content-Type": "application/x-www-form-urlencoded"
// },
body: formData
})
.then(response => response.json())
.then(json => {
dispatch(receiveVideos(json.data.items));
});
}
}
function startLoadingVideos() {
return {
type: START_LOADING_VIDEOS
}
}
function receiveVideos(videos) {
return {
type: RECEIVE_VIDEOS,
payload: videos
}
}
export default fetchVideos;

43
src/actions/search.js Normal file
View File

@ -0,0 +1,43 @@
import {LOADED_ALL_RESULTS, LOADED_ALL_TOPICS, START_LOADING_ALL_RESULTS} from "./action_types";
import {fetchVideosByTopic} from "../utils/api";
import {APIError} from "./errors";
import {setItem} from "../utils/safe-storage";
export function getSearchResults(categoryKey, searchValue) {
// get the stuff from the api
// dispatch loaded
switch (categoryKey) {
case 'topic':
console.log('topic')
return dispatch => {
dispatch(loadingAllResults())
// this calls the API
fetchVideosByTopic(searchValue)
.then(videos => {
dispatch(loadedResults(videos));
}).catch(error => {
dispatch(APIError(error));
})
};
case 'date':
console.log('date')
case 'location':
console.log('location')
default:
console.log('none')
}
}
function loadingAllResults() {
return {
type: START_LOADING_ALL_RESULTS
}
}
function loadedResults(videos) {
return {
type: LOADED_ALL_RESULTS,
payload: videos
};
};

View File

@ -1,10 +0,0 @@
import { TEST_ACTION } from './action_types';
function testAction(data) {
return {
type: TEST_ACTION,
payload: data
}
}
export default testAction;

70
src/actions/topics.js Normal file
View File

@ -0,0 +1,70 @@
import { fetchAllTopics, fetchVideosByTopic } from '../utils/api';
import { APIError } from './errors';
import { getItem, setItem } from '../utils/safe-storage';
import getRandomTopic from '../utils/get-random-topic';
import { addVideosToState } from './videos';
import {
START_LOADING_ALL_TOPICS,
LOADED_ALL_TOPICS,
START_LOADING_RANDOM_TOPIC,
LOADED_RANDOM_TOPIC
} from './action_types';
export function getAllTopics() {
return dispatch => {
dispatch(startLoadingAllTopics());
// this calls the API
fetchAllTopics()
.then(topics => {
dispatch(loadedTopics(topics));
}).catch(error => {
dispatch(APIError(error));
})
};
};
function startLoadingAllTopics() {
return {
type: START_LOADING_ALL_TOPICS
};
};
function loadedTopics(topics) {
// cache
setItem('allTopics', JSON.stringify(topics));
setItem('topicsUpdatedAt', new Date());
return {
type: LOADED_ALL_TOPICS,
payload: topics
};
};
// actions :
// - async actions
// - simple: return action type and payload.
export function getRandomTopicVideos(allTopics, numVideos=4) {
return dispatch => {
const randomTopic = getRandomTopic(allTopics);
dispatch(loadingRandomTopicVideos());
fetchVideosByTopic(randomTopic.name, 0, 4)
.then(videos => {
dispatch(addVideosToState(videos));
dispatch(loadedRandomTopicVideos(randomTopic, videos));
});
};
};
function loadedRandomTopicVideos(topic, videos) {
return {
type: LOADED_RANDOM_TOPIC,
payload: {
topic: topic,
videos: videos
}
};
};
function loadingRandomTopicVideos() {
return {
type: START_LOADING_RANDOM_TOPIC
};
};

8
src/actions/videos.js Normal file
View File

@ -0,0 +1,8 @@
import { ADD_VIDEOS_TO_STATE } from './action_types';
export function addVideosToState(videos) {
return {
type: ADD_VIDEOS_TO_STATE,
payload: videos
};
}

View File

Binary file not shown.

View File

View File

View File

View File

BIN
src/assets/images/byline.ar.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
src/assets/images/counter.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
src/assets/images/img1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 992 KiB

BIN
src/assets/images/img2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
src/assets/images/img3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

BIN
src/assets/images/img4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 971 KiB

BIN
src/assets/images/img5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 551 KiB

View File

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
src/assets/images/video.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

13
src/components/Footer.js Normal file
View File

@ -0,0 +1,13 @@
import React from 'react';
class Footer extends React.Component{
render(){
return(
<footer>
<span className="arabic-text"> جميع الحقوق محفوظة لمؤسسة مٌصرين</span>
<span className="english-text"> all rights reserved</span>
</footer>
)
}
}
export default (Footer);

37
src/components/Header.js Normal file
View File

@ -0,0 +1,37 @@
import React from 'react';
import '../stylesheets/style.scss'
import {Link} from 'react-router-dom';
class Header extends React.Component {
render() {
const Logo = () => {
return (
<section className="logo-container">
<Link to="/">
<img className="site-logo" src={require('../assets/images/logo.png')} alt="logo 858 "/>
<br/>
<img className="site-logo" src={require('../assets/images/byline.ar.png')} alt="logo 858 "/>
<h1>An archive of resistance</h1>
</Link>
</section>
);
}
const Counter = () => {
return (
<div className="counter-container">
<span>967</span>
<br/>
<span> ساعة وبيزيدوا</span>
</div>
);
}
return (
<header>
<Logo/>
<Counter/>
</header>
)
}
}
export default (Header);

49
src/components/Nav.js Normal file
View File

@ -0,0 +1,49 @@
import React from 'react';
class Nav extends React.Component {
render() {
return (
<nav>
<ul>
<li>
<a href="">
<span className="arabic-text">اتصل بنا</span>
<br/>
<span className="english-text"> contact us</span>
</a>
</li>
<li>
<a href="">
<span className="arabic-text">دليل توجيهي</span>
<br/>
<span className="english-text"> tutorials</span>
</a>
</li>
<li>
<a href="">
<span className="arabic-text">الرئيسية</span>
<br/>
<span className="english-text"> main</span>
</a>
</li>
<li>
<a href="">
<span className="arabic-text">الأرشيف</span>
<br/>
<span className="english-text"> the archive</span>
</a>
</li>
<li>
<a href="">
<span className="arabic-text">ماهذا الشيء</span>
<br/>
<span className="english-text"> what is this</span>
</a>
</li>
</ul>
</nav>
)
}
}
export default (Nav);

View File

@ -0,0 +1,25 @@
import React from 'react';
import Grid from 'react-css-grid';
import VideoItem from "./VideoItem";
import SectionHeading from "./SectionHeading";
class RandomDate extends React.Component {
render() {
return (
<section>
<SectionHeading title="Random Date"/>
<Grid
width={220}
gap={12}>
<VideoItem/>
<VideoItem/>
<VideoItem/>
<VideoItem/>
</Grid>
</section>
)
}
}
export default (RandomDate);

View File

@ -0,0 +1,24 @@
import React from 'react';
import VideoItem from "./VideoItem";
import Grid from 'react-css-grid'
import SectionHeading from "./SectionHeading";
class RandomLocation extends React.Component {
render() {
return (
<section>
<SectionHeading title="Random Location"/>
<Grid
width={225}
gap={24}>
<VideoItem/>
<VideoItem/>
<VideoItem/>
</Grid>
</section>
)
}
}
export default (RandomLocation);

View File

@ -0,0 +1,61 @@
import Grid from 'react-css-grid'
import React from 'react';
import PropTypes from 'prop-types';
import VideoItem from "./VideoItem";
import RandomItemTitle from "./SectionHeading";
import {Link} from 'react-router-dom';
class RandomTopic extends React.Component {
shuffleTopic() {
this.props.getRandomTopicVideos(this.props.allTopics);
}
render() {
return (
<section>
<h2 className="section-heading">from the Archive Topics - من مواضيع الارشيف</h2>
<RandomItemTitle title={this.props.topicName}
count={this.props.topicCount}
src={'/topic/' + this.props.topicName}
/>
<Grid
width={450}
>
{/* View all topics button*/}
<Link to="/topics">
<button className="view-all-topics">
<span className="english-text">All Topics - </span>
<span className="arabic-text"> جميع المواضيع </span>
</button>
</Link>
{/* Shuffle button */}
<button className="shuffle-button" onClick={this.shuffleTopic.bind(this)}>
<span className="english-text">Shuffle Topics - </span>
<span className="arabic-text"> موضوع عشوائي </span>
<i className="fa fa-random"></i>
</button>
</Grid>
<Grid className="random-topics"
width={220}
gap={12}>
{this.props.videos.map(video =>
<VideoItem id={video.id} key={video.id} title={video.title}/>
)}
</Grid>
</section>
)
}
}
RandomTopic.propTypes = {
topicName: PropTypes.string,
allTopics: PropTypes.array,
videos: PropTypes.array,
loading: PropTypes.bool,
topicCount: PropTypes.number,
getRandomTopicVideos: PropTypes.func
};
export default (RandomTopic);

17
src/components/Search.js Normal file
View File

@ -0,0 +1,17 @@
import React from 'react';
class Search extends React.Component {
render() {
return (
<form action="">
<button className="search-button" type='submit'>
<img src={require('../assets/images/search.png')} alt=""/>
</button>
<input type="text" className="search-box" name="search-box" placeholder="search the Archive بحث في الأرشيف"/>
</form>
)
}
}
export default (Search);

View File

@ -0,0 +1,19 @@
import React from 'react';
/**
* a section heading is any heading that needs the style of having a horizontal line underneath it.
* it could be the Topics Heading/Title, Date..etc.
*/
class SectionHeading extends React.Component {
render() {
return (
<h3 className="section-title">
<span>{this.props.title}
<a className="normal-link" href={this.props.src}> ({this.props.count})</a>
</span>
</h3>
)
}
}
export default (SectionHeading);

View File

@ -0,0 +1,56 @@
import React from 'react';
import {Link} from 'react-router-dom';
class TopicsList extends React.Component {
constructor() {
super();
this.state = {
currentFilter: "",
filteredTopics: [],
}
}
componentDidMount() {
this.setState({
filteredTopics: this.props.allTopics
})
}
filterTopics(event) {
// find the topics that contain that string
// return filtered topics.
// this.
const input = event.target.value.toLowerCase();
this.setState({
filteredTopics: this.props.allTopics.filter(topic => topic.name.toLowerCase().indexOf(input) !== -1)
})
}
render() {
return (
<main className="topics-list">
<section className="filter-box">
<label className="label" htmlFor="search-topics">
<i className="fa fa-filter">&nbsp;</i>
Filter Topics : &nbsp;
<input type="text" id="search-topics" ref="filter-element" onChange={event => this.filterTopics(event)}/>
</label>
</section>
{this.state.filteredTopics.map(topic => {
return (
<section className="topic-item" key={topic.name}>
<Link to={"/results/topic/" + topic.name}>
<h3>{topic.name} ({topic.items} videos)</h3>
</Link>
</section>
)
}
)}
</main>
)
}
}
export default TopicsList;

View File

@ -0,0 +1,26 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Link } from 'react-router-dom';
import { getThumbnail } from '../utils/video';
class VideoItem extends React.Component {
render() {
const videoLink = `/videos/${this.props.id}`;
return (
<Link to={ videoLink }>
<section className="video-item">
<section className="video-thumbnail-container">
<img className="video-thumbnail" src={ getThumbnail(this.props.id) } alt=""/>
</section>
<h3 className="video-title">{ this.props.title }</h3>
</section>
</Link>
)
}
}
VideoItem.propTypes = {
id: PropTypes.string,
title: PropTypes.string,
}
export default (VideoItem);

View File

@ -0,0 +1,27 @@
import React from 'react';
import PropTypes from 'prop-types';
import {getVideo} from '../utils/video';
import { Player } from 'video-react';
class VideoPlayer extends React.Component {
render() {
return (
<section>
<Player src={getVideo(this.props.id)} controls>
</Player>
<h2 className='video-player-title'>{this.props.title}</h2>
<h3 className="video-player-date text-left">date {this.props.date} </h3>
<p className="text-left">{this.props.description}</p>
</section>
)
}
}
VideoPlayer.propTypes = {
title: PropTypes.string,
date: PropTypes.string,
description: PropTypes.string
};
export default VideoPlayer;

View File

@ -1,3 +1,5 @@
export default {
apiUrl: 'https://858.ma/api'
baseUrl: 'https://858.ma',
videoBase: 'https://video22.858.ma',
apiUrl: 'https://858.ma/api'
};

View File

@ -1,59 +1,57 @@
import React from 'react';
import {connect} from 'react-redux';
import testAction from '../actions/test';
import fetchVideos from '../actions/fetchVideos';
import Search from '../subComponents/Search';
import Footer from '../subComponents/Footer';
import RandomLocation from "../subComponents/RandomLocation";
import RandomDate from "../subComponents/RandomDate";
import RandomTopic from "../subComponents/RandomTopic";
import Header from "../subComponents/Header";
import { getAllTopics, getRandomTopicVideos } from '../actions/topics';
import RandomLocation from "../components/RandomLocation";
import RandomDate from "../components/RandomDate";
import RandomTopic from "../components/RandomTopic";
class Home extends React.Component {
clickBtn() {
this.props.testAction('some new value');
componentDidMount() {
if (this.props.allTopics && this.props.allTopics.length > 0 && !this.props.randomTopic) {
this.props.getRandomTopicVideos(this.props.allTopics);
} else {
this.props.getAllTopics();
}
}
componentWillReceiveProps(nextProps) {
// This is slightly awkward - we need to check that we have all topics,
// But don't have a random topic yet (or at not already loading a random topic)
if ((this.props.allTopics || nextProps.allTopics) && !this.props.loadingRandomTopic && !nextProps.loadingRandomTopic && !this.props.randomTopic) {
this.props.getRandomTopicVideos(nextProps.allTopics);
}
}
render() {
return (
<div>
<Header/>
<Search/>
<RandomTopic/>
<RandomTopic
topicName={ this.props.randomTopic || ''}
allTopics={ this.props.allTopics || [] }
topicCount={ this.props.randomTopicCount }
videos = { this.props.randomTopicVideos || [] }
loading = { this.props.loadingAllTopics || this.props.loadingRandomTopic }
getRandomTopicVideos={ this.props.getRandomTopicVideos }
/>
<RandomLocation/>
<RandomDate/>
<Footer/>
</div>
);
//
// <div>
// This is home. {this.props.test}
// <div>
// <Link to="/topics">Go to topics</Link>
// </div>
// <div>
// <button onClick={this.clickBtn.bind(this)}>Click me</button>
// <button onClick={this.props.fetchVideos}>Fetch videos</button>
// </div>
// <div>
// {this.props.loading && 'Loading...'}
// {this.props.videos.map(video => {
// return (<div key={video.id}>{video.title}</div>);
// })}
// </div>
// </div>
}
}
const mapStateToProps = state => ({
test: state.home.test,
loading: state.home.loading,
videos: state.home.videos
allTopics: state.topics.allTopics,
loadingAllTopics: state.topics.loadingAllTopics,
randomTopic: state.topics.randomTopic,
randomTopicCount: state.topics.randomTopicCount,
loadingRandomTopic: state.topics.loadingRandomTopic,
randomTopicVideos: state.topics.randomTopicVideos
});
const mapDispatchToProps = dispatch => ({
testAction: value => dispatch(testAction(value)),
fetchVideos: () => dispatch(fetchVideos())
getAllTopics: () => dispatch(getAllTopics()),
getRandomTopicVideos: allTopics => dispatch(getRandomTopicVideos(allTopics))
});
export default connect(mapStateToProps, mapDispatchToProps)(Home);

61
src/containers/Results.js Normal file
View File

@ -0,0 +1,61 @@
import React from 'react';
import Grid from "react-css-grid";
import VideoItem from "../components/VideoItem";
import PropTypes from "prop-types";
import {getSearchResults} from "../actions/search";
import connect from "react-redux/es/connect/connect";
class Results extends React.Component {
componentDidMount() {
// get params from url
const categoryKey = this.props.match.params.categoryKey;
const searchValue = this.props.match.params.searchValue;
//FIXME: first check if current key / value / results is already in state
this.props.getSearchResults(categoryKey, searchValue);
}
render() {
console.log('results', this.props.searchResults);
return (
<Grid className="random-topics"
width={220}
gap={12}>
{this.props.searchResults && this.props.searchResults.map(video =>
<VideoItem id={video.id} key={video.id} title={video.title}/>
)}
</Grid>
);
}
}
const mapStateToProps = state => ({
searchResults: state.results.currentItems,
currentKey: state.results.currentKey,
currentValue: state.results.currentValue,
currentQuery: state.results.queryParams
});
const mapDispatchToProps = dispatch => ({
// the category key is either {topic, date, date}
// the search value could be something like 25th-jan.
getSearchResults: (categoryKey, searchValue) => dispatch(getSearchResults(categoryKey, searchValue)),
});
// each result page has :
// - currentKey: 858.ma/{key}/ where key could be like 'topic'
// - currentValue: 858.ma/topic/{value} where value could be like 'alaa abd al fatah'
// - currentQuery: 858.ma/{query} ?? not getting this! @TODO: clarify this please.
// - currentItems: the list of items/videos.
Results.propTypes = {
// the category key is either a {topic, location, date}.
currentKey: PropTypes.string,
currentValue: PropTypes.string,
currentItems: PropTypes.array,
loading: PropTypes.bool,
categoryItemCount: PropTypes.number,
getSearchResults: PropTypes.func
};
export default connect(mapStateToProps, mapDispatchToProps)(Results);

View File

@ -1,13 +0,0 @@
import React, { Component } from 'react';
class TopicsList extends React.Component {
render() {
return (
<div>
This is topics list.
</div>
);
}
}
export default TopicsList;

View File

@ -0,0 +1,46 @@
import React from 'react';
import SectionHeading from "../components/SectionHeading";
import TopicsList from "../components/TopicsList";
import {getAllTopics} from "../actions/topics";
import {connect} from 'react-redux'
class TopicsListContainer extends React.Component {
componentDidMount(){
// if the data isn't there call the action.
if (!this.props.allTopics){
this.props.getAllTopics();
}
}
render() {
return (
<section>
<SectionHeading title="All Topics"/>
{/* TODO: get the topics objects*/}
<TopicsList allTopics={this.props.allTopics}/>
</section>
);
}
}
// function ->
// - recieves the global state.
// - maps the global state to the local props of the component.
// - maps the global actions to the local props of the component.
/**
*
* @param state
* @returns object
*/
const mapStateToProps = state => ({
allTopics: state.topics.allTopics,
loadingAllTopics: state.topics.loadingAllTopics,
});
/**
*
* @param dispatch: Redux's action dispatcher.
* @returns {{}}
*/
const mapDispatchToProps = dispatch => ({
getAllTopics: () => dispatch(getAllTopics()),
});
export default connect(mapStateToProps, mapDispatchToProps)(TopicsListContainer);

56
src/containers/Video.js Normal file
View File

@ -0,0 +1,56 @@
import React from 'react';
import {connect} from 'react-redux';
import VideoPlayer from "../components/VideoPlayer";
import { fetchVideoById } from '../utils/api';
class Video extends React.Component {
constructor() {
super();
this.state = {
currentVideo: null
};
}
componentDidMount() {
// get videoId from the URL
const videoId = this.props.match.params.videoId;
// if data for videoId is already part of allVideos, setState to currentVideo
if (this.props.allVideos && this.props.allVideos.hasOwnProperty(videoId)) {
const currentVideo = this.props.allVideos[videoId];
this.setState({currentVideo: currentVideo});
} else {
// video is not part of allVideos, fetch it from the API
fetchVideoById(videoId)
.then(video => {
this.setState({
currentVideo: video
});
});
}
}
render() {
const video = this.state.currentVideo;
return (
<section>
{ video &&
<VideoPlayer
id={ video.id }
title={ video.title }
date = { video.date }
description={ video.description }
/>
}
</section>
);
}
}
const mapStateToProps = state => ({
allVideos: state.videos.allVideos
});
export default connect(mapStateToProps)(Video);

5
src/history.js Normal file
View File

@ -0,0 +1,5 @@
import { createBrowserHistory } from 'history';
const history = createBrowserHistory();
export default history;

View File

@ -3,12 +3,9 @@ import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import { BrowserRouter } from 'react-router-dom';
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
<App />,
document.getElementById('root')
);

View File

@ -1,9 +1,13 @@
import { combineReducers } from 'redux';
import HomeReducer from './home'
import TopicsReducer from './topics';
import VideosReducer from './videos';
import SearchReducer from './search';
const rootReducer = combineReducers({
home: HomeReducer
import { connectRouter } from 'connected-react-router'
export default (history) => combineReducers({
router: connectRouter(history),
topics: TopicsReducer,
videos: VideosReducer,
results: SearchReducer,
});
export default rootReducer;

21
src/reducers/search.js Normal file
View File

@ -0,0 +1,21 @@
import {
START_LOADING_ALL_RESULTS,
LOADED_ALL_RESULTS
} from '../actions/action_types';
export default function(state={}, action) {
switch (action.type) {
case START_LOADING_ALL_RESULTS:
return Object.assign({}, state, { loadingAllTopics: true });
case LOADED_ALL_RESULTS:
return Object.assign({}, state, {
loadingAllTopics: false,
currentItems: action.payload
});
default:
return state;
}
};

36
src/reducers/topics.js Normal file
View File

@ -0,0 +1,36 @@
import {
START_LOADING_ALL_TOPICS,
LOADED_ALL_TOPICS,
START_LOADING_RANDOM_TOPIC,
LOADED_RANDOM_TOPIC
} from '../actions/action_types';
export default function(state={}, action) {
switch (action.type) {
case START_LOADING_ALL_TOPICS:
return Object.assign({}, state, { loadingAllTopics: true });
case LOADED_ALL_TOPICS:
return Object.assign({}, state, {
loadingAllTopics: false,
allTopics: action.payload
});
case START_LOADING_RANDOM_TOPIC:
return Object.assign({}, state, {
loadingRandomTopic: true
});
case LOADED_RANDOM_TOPIC:
return Object.assign({}, state, {
loadingRandomTopic: false,
randomTopic: action.payload.topic.name,
randomTopicCount: action.payload.topic.items,
randomTopicVideos: action.payload.videos
});
default:
return state;
}
};

22
src/reducers/videos.js Normal file
View File

@ -0,0 +1,22 @@
import {
ADD_VIDEOS_TO_STATE
} from '../actions/action_types';
export default function(state={}, action) {
switch (action.type) {
case ADD_VIDEOS_TO_STATE:
let clonedState = Object.assign({}, state);
if (!clonedState.allVideos) {
clonedState.allVideos = {};
}
const videosToAdd = action.payload;
videosToAdd.forEach(video => {
if (!clonedState.allVideos.hasOwnProperty(video.id)) {
clonedState.allVideos[video.id] = video;
}
});
return clonedState;
default:
return state;
}
}

View File

@ -1,20 +1,21 @@
import { createStore, applyMiddleware } from 'redux';
import { createStore, applyMiddleware, compose } from 'redux';
import thunk from 'redux-thunk';
import history from '../history';
import { routerMiddleware } from 'connected-react-router'
import rootReducer from '../reducers';
import getInitialState from '../utils/get-initial-state';
// Add initial state here
const initialState = {
'home': {
'test': 'foo',
'loading': false,
'videos': []
}
};
const initialState = getInitialState();
const store = createStore(
rootReducer,
rootReducer(history),
initialState,
applyMiddleware(thunk)
compose(
applyMiddleware(
routerMiddleware(history),
thunk
)
)
);
export default store;

View File

@ -1,4 +0,0 @@
.site-logo{
max-width: 300px;
}

View File

@ -0,0 +1,11 @@
@import "variables";
/* footer */
footer {
background: $light-gray-color;
position: absolute;
width: 100%;
left: 0;
margin-top: 1em;
padding: 1em;
font-weight: bold;
}

View File

@ -0,0 +1,83 @@
@import "variables";
/* globals */
* {
box-sizing: border-box;
margin: 0px;
border: 0px;
}
/* fonts */
@font-face {
font-family: 'Fedra Arabic';
src: url('../assets/fonts/Fedra Arabic Reg_beta.ttf') format('truetype');
}
@font-face {
font-family: 'bebas';
src: url('../assets/fonts/BEBAS___.ttf') format('truetype');
}
@font-face {
font-family: 'majalla';
src: url('../assets/fonts/majalla 2.ttf') format('truetype');
}
@font-face {
font-family: 'MyriadPro Regular';
src: url('../assets/fonts/MyriadPro-Regular.otf') format('otf');
}
@font-face {
font-family: 'interstate';
src: url('../assets/fonts/Interstate-Regular.bmap') format('bmap'),
url('../assets/fonts/Interstate-Bold.bmap') format('bmap');
}
.text-left {
text-align: left;
}
.arabic-text {
font-family: "Fedra Arabic", serif;
padding: .3em;
}
.english-text {
font-family: majalla, serif;
padding: .3em;
}
/* App */
.App {
max-width: 1200px;
margin: 0 auto;
}
// buttons
button {
padding: 1em;
font-weight: bold;
font-size: 1em;
max-width: 300px;
justify-self: center; // for the css grid
cursor: pointer;
}
// spans
span {
display: inline-block;
position: relative;
}
// links
a {
text-decoration: none;
font-size: 14px;
color: black;
}
.normal-link{
text-decoration: underline;
color: $normal-link-color;
}

View File

@ -0,0 +1,25 @@
@import "variables";
@import "globals";
/* header */
header {
padding-top: 1em;
}
.site-logo {
max-width: 300px;
text-align: center;
}
.counter-container {
position: absolute;
display: inline-block;
right: 0;
top: 0;
padding: 2em;
}
.counter {
position: relative;
right: 0;
}

View File

@ -0,0 +1,23 @@
@import "variables";
@import "globals";
#search-topics {
padding: 1em;
border: .5px solid gray;
}
.label {
font-size: 1.5em;
}
.topic-item {
h3 {
text-align: left;
padding: 1em;
font-size: 30px;
}
border-left: 2px solid black;
border-bottom: 6px solid black;
margin-bottom: 2em;
}

24
src/stylesheets/nav.scss Normal file
View File

@ -0,0 +1,24 @@
@import "variables";
@import "globals";
@import "header";
/* nav */
nav {
margin: 3em;
}
nav ul li {
display: inline-block;
list-style-type: none;
padding: 1em;
border-right: 1px solid black;
}
nav ul li:last-child {
border-right: none;
}
nav ul li a {
text-decoration: none;
color: black;
}

View File

@ -0,0 +1,35 @@
@import "variables";
@import "globals";
.section-heading {
padding-top: 1em;
}
.section-title{
line-height: 0.5;
text-align: center;
padding: 1em;
}
// --------------------------
// add horizontal lines around the section title.
//----------------------------
.section-title span:before,
.section-title span:after {
content: "";
position: absolute;
height: 8px;
border-bottom: 3px solid black;
top: 0;
width: 400px;
}
.section-title span:before {
right: 100%;
margin-right: 15px;
}
.section-title span:after {
left: 100%;
margin-left: 15px;
}
// Topics
.random-topics{
margin-top: 2em;
}

View File

@ -0,0 +1,48 @@
@import "variables";
@import "globals";
@import "header";
/* search */
.search-button {
background: white;
bottom: -18px;
position: relative;
}
.search-button img {
max-width: 50px;
}
.search-box {
padding: 1em;
width: 50%;
background: $light-gray-color;
}
.search-box::placeholder {
color: black;
text-align: center;
font-size: 1.5em;
color: gray;
}
@media screen and (max-width: 700px) {
.search-box::placeholder {
font-size: 1em;
}
}
@media screen and (max-width: 400px) {
.search-box::placeholder {
font-size: .75em;
}
}
// filter
.filter-box{
background: $light-gray-color;
padding: 1em;
margin-bottom: 2em;
text-align: left;
}

View File

@ -0,0 +1,11 @@
@import "variables";
@import "globals";
@import "header";
@import "nav";
@import "search";
@import "random-item";
@import "video-item";
@import "video-player";
@import "footer";
@import "items-list";
@import "~video-react/styles/scss/video-react";

View File

@ -0,0 +1,2 @@
$light-gray-color: #ebebeb;
$normal-link-color: blue;

View File

@ -0,0 +1,29 @@
@import "variables";
@import "globals";
@import "header";
/* Video item*/
.video-item {
background: $light-gray-color;
min-height: 300px;
padding: 1em;
}
.video-thumbnail {
width: 100%;
max-height: 150px;
transition: all .4s ease-in-out;
}
.video-thumbnail:hover {
transform: scale(1.1);
}
.video-thumbnail-container {
position: relative;
overflow: hidden;
}
.video-title {
padding-top: 1em;
}

View File

@ -0,0 +1,20 @@
@import "variables";
video{
margin-top: 3em;
}
.video-player-title
{
text-align: left;
padding: 1em 1em 0 1em;
background: $light-gray-color;
margin-top: 1em;
}
.video-player-date{
padding: 1em;
background: $light-gray-color;
text-align: left;
}
.video-react{
margin-top: 3em;
}

View File

@ -1,9 +0,0 @@
import React from 'react';
class Footer extends React.Component{
render(){
return(
'hello Footer!'
)
}
}
export default (Footer);

View File

@ -1,24 +0,0 @@
import React from 'react';
import logo from '../logo.png';
import '../styleSheets/style.css'
class Header extends React.Component {
render() {
const Logo = () => {
return (
<nav>
<img className="site-logo" src={logo} alt="logo 858 "/>
</nav>
);
}
return (
<header>
<section className="container">
<Logo/>
</section>
</header>
)
}
}
export default (Header);

View File

@ -1,9 +0,0 @@
import React from 'react';
class RandomDate extends React.Component{
render(){
return(
'hello Dandom Date!'
)
}
}
export default (RandomDate);

View File

@ -1,9 +0,0 @@
import React from 'react';
class RandomLocation extends React.Component{
render(){
return(
'hello Random Location!'
)
}
}
export default (RandomLocation);

View File

@ -1,9 +0,0 @@
import React from 'react';
class RandomTopic extends React.Component{
render(){
return(
'hello Random Topic!'
)
}
}
export default (RandomTopic);

View File

@ -1,9 +0,0 @@
import React from 'react';
class Search extends React.Component{
render(){
return(
'hello Search!'
)
}
}
export default (Search);

View File

@ -1,6 +1,16 @@
import config from '../config';
import 'whatwg-fetch';
const VIDEO_KEYS = [
"title",
"source",
"project",
"topic",
"language",
"duration",
"id",
"date"
];
/*
Base function to make API calls
@ -20,7 +30,7 @@ export function callApi(action, data) {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(response => response.json()) // convert the response to json (instead of response object).
.then(data => {
if (data.status.code === 200) {
return data.data;
@ -40,6 +50,7 @@ export function callApi(action, data) {
@returns {Promise<Array>} array of topic objects like: {'name': '<topicName>', 'items': <no_of_items>}
*/
export function fetchAllTopics(startRange=0, endRange=1000) {
// the object that we need to send to the api
const data = {
"query": {
"conditions": [],
@ -98,11 +109,11 @@ export function fetchAllDates(startRange=0, endRange=1000) {
*/
export function fetchVideosByX(key, value, startRange, endRange, sortKey='random') {
const data = {
"keys": ["editable", "modified", "title", "source", "project", "topic", "language", "duration", "id"],
"keys": VIDEO_KEYS,
"query": {
"conditions": [{
"key": key,
"value": encodeURIComponent(value),
"value": value,
"operator": "=="
}],
"operator": "&"
@ -199,10 +210,13 @@ export function fetchRandomPlace() {
"operator": "-"
}]
};
return callApi('findPlaces', data).then(data => data.items[0]);
return callApi('findPlaces', data).then(data => data.items[0]);
}
export function fetchVideosByPlace(placeId, startRange=0, endRange=100, sortKey='random') {
return fetchVideosByX('place', placeId, startRange, endRange, sortKey);
}
export function fetchVideoById(id) {
return callApi('get', {'id': id, keys: VIDEO_KEYS});
}

View File

@ -0,0 +1,14 @@
import { getItem } from './safe-storage';
export default function getInitialState() {
let initialState = {
topics: {}
};
const allTopics = getItem('allTopics');
if (allTopics) {
initialState.topics.allTopics = JSON.parse(allTopics);
initialState.topics.loadingAllTopics = false;
}
return initialState;
}

View File

@ -0,0 +1,5 @@
export default function getRandomTopic(allTopics, minVideos=4) {
const validTopics = allTopics.filter(topic => topic.items >= minVideos);
return validTopics[Math.floor(Math.random() * validTopics.length)];
}

40
src/utils/safe-storage.js Normal file
View File

@ -0,0 +1,40 @@
// Transparent wrapper over Window.localStorage
// Adheres to the Web Storage API:
// https://developer.mozilla.org/en-US/docs/Web/API/Storage
/**
* Wraps localStorage.getItem in a try/catch. Return null
* if the key does not exist or localStorage fails.
*/
function getItem(key) {
try {
return localStorage.getItem(key) || null;
} catch (err) {
console.warn('Could not read from localStorage.');
return null;
}
}
/**
* Wraps localStorage.setItem in a try/catch.
*/
function setItem(key, value) {
try {
localStorage.setItem(key, value);
} catch (err) {
console.warn('Could not write to localStorage.');
}
}
/**
* Wraps localStorage.removeItem in a try/catch.
*/
function removeItem(key) {
try {
localStorage.removeItem(key);
} catch (err) {
console.warn('Could not delete from localStorage.');
}
}
export { getItem, setItem, removeItem };

9
src/utils/video.js Normal file
View File

@ -0,0 +1,9 @@
import config from '../config';
export function getThumbnail(id, size='200') {
return `${config.baseUrl}/${id}/${size}p.jpg`
}
export function getVideo(id, size='480') {
return `${config.videoBase}/${id}/${size}p.mp4`;
}

498
yarn.lock
View File

@ -950,6 +950,11 @@ alphanum-sort@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
amdefine@>=0.0.4:
version "1.0.1"
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
ansi-colors@^3.0.0:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.1.tgz#9638047e4213f3428a11944a7d4b31cba0a3ff95"
@ -1043,6 +1048,11 @@ array-filter@~0.0.0:
version "0.0.1"
resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
array-find-index@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=
array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
@ -1088,7 +1098,7 @@ arrify@^1.0.0, arrify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
asap@~2.0.6:
asap@~2.0.3, asap@~2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
@ -1132,6 +1142,11 @@ async-each@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
async-foreach@^0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=
async-limiter@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
@ -1453,6 +1468,13 @@ binary-extensions@^1.0.0:
version "1.12.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14"
block-stream@*:
version "0.0.9"
resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=
dependencies:
inherits "~2.0.0"
bluebird@^3.5.1:
version "3.5.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a"
@ -1630,6 +1652,13 @@ buffer@^4.3.0:
ieee754 "^1.1.4"
isarray "^1.0.0"
buffer@^5.0.3:
version "5.2.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6"
dependencies:
base64-js "^1.0.2"
ieee754 "^1.1.4"
builtin-modules@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
@ -1718,6 +1747,24 @@ camel-case@3.0.x:
no-case "^2.2.0"
upper-case "^1.1.1"
camelcase-keys@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc=
dependencies:
camelcase "^2.0.0"
map-obj "^1.0.0"
camelcase@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
camelcase@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
camelcase@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
@ -1761,7 +1808,7 @@ chalk@2.4.1, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
chalk@^1.1.3:
chalk@^1.1.1, chalk@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
dependencies:
@ -1832,6 +1879,11 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
classnames@^2.2.3:
version "2.2.6"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce"
integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==
clean-css@4.2.x:
version "4.2.1"
resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17"
@ -1848,6 +1900,15 @@ cli-width@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
cliui@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
dependencies:
string-width "^1.0.1"
strip-ansi "^3.0.1"
wrap-ansi "^2.0.0"
cliui@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
@ -1997,6 +2058,13 @@ connect-history-api-fallback@^1.3.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a"
connected-react-router@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/connected-react-router/-/connected-react-router-5.0.1.tgz#8379854fad7e027b1e27652c00ad534f8ad244b3"
dependencies:
immutable "^3.8.1"
seamless-immutable "^7.1.3"
console-browserify@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
@ -2056,6 +2124,10 @@ core-js@2.5.7, core-js@^2.4.0, core-js@^2.5.0:
version "2.5.7"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
core-js@^1.0.0:
version "1.2.7"
resolved "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
core-util-is@1.0.2, core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
@ -2115,6 +2187,14 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5:
shebang-command "^1.2.0"
which "^1.2.9"
cross-spawn@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI=
dependencies:
lru-cache "^4.0.1"
which "^1.2.9"
cross-spawn@^5.0.1:
version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
@ -2139,6 +2219,10 @@ crypto-browserify@^3.11.0:
randombytes "^2.0.0"
randomfill "^1.0.3"
css-color-keywords@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05"
css-color-names@0.0.4, css-color-names@^0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
@ -2197,6 +2281,14 @@ css-selector-tokenizer@^0.7.0:
fastparse "^1.1.1"
regexpu-core "^1.0.0"
css-to-react-native@^2.0.3:
version "2.2.2"
resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-2.2.2.tgz#c077d0f7bf3e6c915a539e7325821c9dd01f9965"
dependencies:
css-color-keywords "^1.0.0"
fbjs "^0.8.5"
postcss-value-parser "^3.3.0"
css-tree@1.0.0-alpha.28:
version "1.0.0-alpha.28"
resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f"
@ -2313,6 +2405,13 @@ cssstyle@^1.0.0, cssstyle@^1.1.1:
dependencies:
cssom "0.3.x"
currently-unhandled@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
integrity sha1-mI3zP+qxke95mmE2nddsF635V+o=
dependencies:
array-find-index "^1.0.1"
cyclist@~0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
@ -2357,7 +2456,7 @@ debug@^3.1.0:
dependencies:
ms "^2.1.1"
decamelize@^1.1.1:
decamelize@^1.1.1, decamelize@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@ -2668,6 +2767,12 @@ encodeurl@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
encoding@^0.1.11:
version "0.1.12"
resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
dependencies:
iconv-lite "~0.4.13"
end-of-stream@^1.0.0, end-of-stream@^1.1.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
@ -3146,6 +3251,18 @@ fb-watchman@^2.0.0:
dependencies:
bser "^2.0.0"
fbjs@^0.8.5, fbjs@^0.8.9:
version "0.8.17"
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
dependencies:
core-js "^1.0.0"
isomorphic-fetch "^2.1.1"
loose-envify "^1.0.0"
object-assign "^4.1.0"
promise "^7.1.1"
setimmediate "^1.0.5"
ua-parser-js "^0.7.18"
figgy-pudding@^3.1.0, figgy-pudding@^3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
@ -3285,6 +3402,11 @@ follow-redirects@^1.0.0:
dependencies:
debug "=3.1.0"
font-awesome@^4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133"
integrity sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=
for-in@^0.1.3:
version "0.1.8"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
@ -3393,6 +3515,16 @@ fsevents@1.2.4, fsevents@^1.2.2, fsevents@^1.2.3:
nan "^2.9.2"
node-pre-gyp "^0.10.0"
fstream@^1.0.0, fstream@^1.0.2:
version "1.0.11"
resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=
dependencies:
graceful-fs "^4.1.2"
inherits "~2.0.0"
mkdirp ">=0.5 0"
rimraf "2"
function-bind@^1.1.0, function-bind@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
@ -3414,6 +3546,13 @@ gauge@~2.7.3:
strip-ansi "^3.0.1"
wide-align "^1.1.0"
gaze@^1.0.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
dependencies:
globule "^1.0.0"
get-caller-file@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
@ -3422,6 +3561,11 @@ get-own-enumerable-property-symbols@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203"
get-stdin@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
get-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
@ -3460,7 +3604,7 @@ glob-to-regexp@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2:
glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1:
version "7.1.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
dependencies:
@ -3530,6 +3674,15 @@ globby@^6.1.0:
pify "^2.0.0"
pinkie-promise "^2.0.0"
globule@^1.0.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d"
integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==
dependencies:
glob "~7.1.1"
lodash "~4.17.10"
minimatch "~3.0.2"
graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
version "4.1.11"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
@ -3710,6 +3863,10 @@ hoek@4.x.x:
version "4.2.1"
resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb"
hoist-non-react-statics@^1.2.0:
version "1.2.0"
resolved "http://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb"
hoist-non-react-statics@^2.5.0:
version "2.5.5"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47"
@ -3857,7 +4014,7 @@ iconv-lite@0.4.23:
dependencies:
safer-buffer ">= 2.1.2 < 3"
iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4:
iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
dependencies:
@ -3905,6 +4062,10 @@ immer@1.7.2:
version "1.7.2"
resolved "https://registry.yarnpkg.com/immer/-/immer-1.7.2.tgz#a51e9723c50b27e132f6566facbec1c85fc69547"
immutable@^3.8.1:
version "3.8.2"
resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3"
import-cwd@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
@ -3935,6 +4096,18 @@ imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
in-publish@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
integrity sha1-4g/146KvwmkDILbcVSaCqcf631E=
indent-string@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=
dependencies:
repeating "^2.0.0"
indexes-of@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
@ -3950,7 +4123,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
@ -4252,7 +4425,7 @@ is-root@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.0.0.tgz#838d1e82318144e5a6f77819d90207645acc7019"
is-stream@^1.1.0:
is-stream@^1.0.1, is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
@ -4312,6 +4485,13 @@ isobject@^3.0.0, isobject@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
isomorphic-fetch@^2.1.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
dependencies:
node-fetch "^1.0.1"
whatwg-fetch ">=0.10.0"
isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
@ -4681,6 +4861,11 @@ joi@^11.1.1:
isemail "3.x.x"
topo "2.x.x"
js-base64@^2.1.8:
version "2.4.9"
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03"
integrity sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==
js-levenshtein@^1.1.3:
version "1.1.4"
resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.4.tgz#3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e"
@ -4973,10 +5158,20 @@ lodash._reinterpolate@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
lodash.assign@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=
lodash.camelcase@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
lodash.clonedeep@^4.3.2:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
lodash.debounce@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
@ -4985,6 +5180,11 @@ lodash.memoize@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
lodash.mergewith@^4.6.0:
version "4.6.1"
resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927"
integrity sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==
lodash.sortby@^4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
@ -5006,11 +5206,16 @@ lodash.templatesettings@^4.0.0:
dependencies:
lodash._reinterpolate "~3.0.0"
lodash.throttle@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=
lodash.uniq@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
"lodash@>=3.5 <5", lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5:
"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.10:
version "4.17.11"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
@ -5024,6 +5229,14 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
loud-rejection@^1.0.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=
dependencies:
currently-unhandled "^0.4.1"
signal-exit "^3.0.0"
lower-case@^1.1.1:
version "1.1.4"
resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
@ -5061,6 +5274,11 @@ map-cache@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
map-obj@^1.0.0, map-obj@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
map-visit@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
@ -5108,6 +5326,22 @@ memory-fs@^0.4.0, memory-fs@~0.4.1:
errno "^0.1.3"
readable-stream "^2.0.1"
meow@^3.7.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=
dependencies:
camelcase-keys "^2.0.0"
decamelize "^1.1.2"
loud-rejection "^1.0.0"
map-obj "^1.0.1"
minimist "^1.1.3"
normalize-package-data "^2.3.4"
object-assign "^4.0.1"
read-pkg-up "^1.0.1"
redent "^1.0.0"
trim-newlines "^1.0.0"
merge-deep@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2"
@ -5219,7 +5453,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4:
minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
dependencies:
@ -5229,7 +5463,7 @@ minimist@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
minimist@^1.1.1, minimist@^1.2.0:
minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
@ -5294,7 +5528,7 @@ mixin-object@^2.0.1:
for-in "^0.1.3"
is-extendable "^0.1.1"
mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
dependencies:
@ -5334,7 +5568,7 @@ mute-stream@0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
nan@^2.9.2:
nan@^2.10.0, nan@^2.9.2:
version "2.11.1"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766"
@ -5384,10 +5618,35 @@ no-case@^2.2.0:
dependencies:
lower-case "^1.1.1"
node-fetch@^1.0.1:
version "1.7.3"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
dependencies:
encoding "^0.1.11"
is-stream "^1.0.1"
node-forge@0.7.5:
version "0.7.5"
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df"
node-gyp@^3.8.0:
version "3.8.0"
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c"
integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==
dependencies:
fstream "^1.0.0"
glob "^7.0.3"
graceful-fs "^4.1.2"
mkdirp "^0.5.0"
nopt "2 || 3"
npmlog "0 || 1 || 2 || 3 || 4"
osenv "0"
request "^2.87.0"
rimraf "2"
semver "~5.3.0"
tar "^2.0.0"
which "1"
node-int64@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
@ -5450,6 +5709,38 @@ node-releases@^1.0.0-alpha.11, node-releases@^1.0.1:
dependencies:
semver "^5.3.0"
node-sass@^4.11.0:
version "4.11.0"
resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.11.0.tgz#183faec398e9cbe93ba43362e2768ca988a6369a"
integrity sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==
dependencies:
async-foreach "^0.1.3"
chalk "^1.1.1"
cross-spawn "^3.0.0"
gaze "^1.0.0"
get-stdin "^4.0.1"
glob "^7.0.3"
in-publish "^2.0.0"
lodash.assign "^4.2.0"
lodash.clonedeep "^4.3.2"
lodash.mergewith "^4.6.0"
meow "^3.7.0"
mkdirp "^0.5.1"
nan "^2.10.0"
node-gyp "^3.8.0"
npmlog "^4.0.0"
request "^2.88.0"
sass-graph "^2.2.4"
stdout-stream "^1.4.0"
"true-case-path" "^1.0.2"
"nopt@2 || 3":
version "3.0.6"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
dependencies:
abbrev "1"
nopt@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
@ -5457,7 +5748,7 @@ nopt@^4.0.1:
abbrev "1"
osenv "^0.1.4"
normalize-package-data@^2.3.2:
normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
version "2.4.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
dependencies:
@ -5497,7 +5788,7 @@ npm-run-path@^2.0.0:
dependencies:
path-key "^2.0.0"
npmlog@^4.0.2:
"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
dependencies:
@ -5663,6 +5954,13 @@ os-homedir@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
os-locale@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
dependencies:
lcid "^1.0.0"
os-locale@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
@ -5683,7 +5981,7 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
osenv@^0.1.4:
osenv@0, osenv@^0.1.4:
version "0.1.5"
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
dependencies:
@ -6545,6 +6843,12 @@ promise@8.0.2:
dependencies:
asap "~2.0.6"
promise@^7.1.1:
version "7.3.1"
resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
dependencies:
asap "~2.0.3"
prompts@^0.1.9:
version "0.1.14"
resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2"
@ -6552,7 +6856,7 @@ prompts@^0.1.9:
kleur "^2.0.1"
sisteransi "^0.1.1"
prop-types@^15.6.1, prop-types@^15.6.2:
prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.6.2:
version "15.6.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102"
dependencies:
@ -6702,6 +7006,13 @@ react-app-polyfill@^0.1.3:
raf "3.4.0"
whatwg-fetch "3.0.0"
react-css-grid@^2.0.0-0:
version "2.0.0-0"
resolved "https://registry.yarnpkg.com/react-css-grid/-/react-css-grid-2.0.0-0.tgz#df89242decc1f072425f154f254f176bb60500a7"
dependencies:
prop-types "^15.5.10"
styled-components "^2.1.2"
react-dev-utils@^6.1.1:
version "6.1.1"
resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-6.1.1.tgz#a07e3e8923c4609d9f27e5af5207e3ca20724895"
@ -6734,7 +7045,6 @@ react-dev-utils@^6.1.1:
react-dom@^16.6.3:
version "16.6.3"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.6.3.tgz#8fa7ba6883c85211b8da2d0efeffc9d3825cccc0"
integrity sha512-8ugJWRCWLGXy+7PmNh8WJz3g1TaTUt1XyoIcFN+x0Zbkoz+KKdUyx1AQLYJdbFXjuF41Nmjn5+j//rxvhFjgSQ==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
@ -6845,7 +7155,6 @@ react-scripts@2.1.1:
react@^16.6.3:
version "16.6.3"
resolved "https://registry.yarnpkg.com/react/-/react-16.6.3.tgz#25d77c91911d6bbdd23db41e70fb094cc1e0871c"
integrity sha512-zCvmH2vbEolgKxtqXL2wmGCUxUyNheYn/C+PD1YAjfxHC54+MhdruyhO7QieQrYsYeTxrn93PM2y0jRH1zEExw==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
@ -6923,6 +7232,14 @@ recursive-readdir@2.2.2:
dependencies:
minimatch "3.0.4"
redent@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=
dependencies:
indent-string "^2.1.0"
strip-indent "^1.0.1"
redux-logger@^3.0.6:
version "3.0.6"
resolved "https://registry.yarnpkg.com/redux-logger/-/redux-logger-3.0.6.tgz#f7555966f3098f3c88604c449cf0baf5778274bf"
@ -6933,7 +7250,7 @@ redux-thunk@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"
redux@^4.0.1:
redux@^4.0.0, redux@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.1.tgz#436cae6cc40fbe4727689d7c8fae44808f1bfef5"
dependencies:
@ -7172,7 +7489,7 @@ rgba-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2:
rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2:
version "2.6.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
dependencies:
@ -7236,6 +7553,16 @@ sane@^2.0.0:
optionalDependencies:
fsevents "^1.2.3"
sass-graph@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"
integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=
dependencies:
glob "^7.0.0"
lodash "^4.0.0"
scss-tokenizer "^0.2.3"
yargs "^7.0.0"
sass-loader@7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d"
@ -7279,6 +7606,18 @@ schema-utils@^1.0.0:
ajv-errors "^1.0.0"
ajv-keywords "^3.1.0"
scss-tokenizer@^0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE=
dependencies:
js-base64 "^2.1.8"
source-map "^0.4.2"
seamless-immutable@^7.1.3:
version "7.1.4"
resolved "https://registry.yarnpkg.com/seamless-immutable/-/seamless-immutable-7.1.4.tgz#6e9536def083ddc4dea0207d722e0e80d0f372f8"
select-hose@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
@ -7293,6 +7632,11 @@ selfsigned@^1.9.1:
version "5.6.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
semver@~5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8=
send@0.16.2:
version "0.16.2"
resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
@ -7358,7 +7702,7 @@ set-value@^2.0.0:
is-plain-object "^2.0.3"
split-string "^3.0.1"
setimmediate@^1.0.4:
setimmediate@^1.0.4, setimmediate@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
@ -7513,6 +7857,13 @@ source-map-url@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
source-map@^0.4.2:
version "0.4.4"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
integrity sha1-66T12pwNyZneaAMti092FzZSA2s=
dependencies:
amdefine ">=0.0.4"
source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
@ -7625,6 +7976,13 @@ statuses@~1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
stdout-stream@^1.4.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de"
integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==
dependencies:
readable-stream "^2.0.1"
stealthy-require@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
@ -7664,7 +8022,7 @@ string-length@^2.0.0:
astral-regex "^1.0.0"
strip-ansi "^4.0.0"
string-width@^1.0.1:
string-width@^1.0.1, string-width@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
dependencies:
@ -7730,6 +8088,13 @@ strip-eof@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
strip-indent@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=
dependencies:
get-stdin "^4.0.1"
strip-json-comments@^2.0.1, strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
@ -7741,6 +8106,19 @@ style-loader@0.23.0:
loader-utils "^1.1.0"
schema-utils "^0.4.5"
styled-components@^2.1.2:
version "2.4.1"
resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-2.4.1.tgz#663bd0485d4b6ab46f946210dc03d2398d1ade74"
dependencies:
buffer "^5.0.3"
css-to-react-native "^2.0.3"
fbjs "^0.8.9"
hoist-non-react-statics "^1.2.0"
is-plain-object "^2.0.1"
prop-types "^15.5.4"
stylis "^3.4.0"
supports-color "^3.2.3"
stylehacks@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.1.tgz#3186595d047ab0df813d213e51c8b94e0b9010f2"
@ -7749,11 +8127,15 @@ stylehacks@^4.0.0:
postcss "^7.0.0"
postcss-selector-parser "^3.0.0"
stylis@^3.4.0:
version "3.5.4"
resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe"
supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
supports-color@^3.1.2:
supports-color@^3.1.2, supports-color@^3.2.3:
version "3.2.3"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
dependencies:
@ -7807,6 +8189,15 @@ tapable@^1.0.0, tapable@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c"
tar@^2.0.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=
dependencies:
block-stream "*"
fstream "^1.0.2"
inherits "2"
tar@^4:
version "4.4.6"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b"
@ -7946,10 +8337,22 @@ tr46@^1.0.1:
dependencies:
punycode "^2.1.0"
trim-newlines@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=
trim-right@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
"true-case-path@^1.0.2":
version "1.0.3"
resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d"
integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==
dependencies:
glob "^7.1.2"
tryer@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
@ -7989,6 +8392,10 @@ typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
ua-parser-js@^0.7.18:
version "0.7.19"
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b"
uglify-es@^3.3.4:
version "3.3.9"
resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
@ -8189,6 +8596,16 @@ verror@1.10.0:
core-util-is "1.0.2"
extsprintf "^1.2.0"
video-react@^0.13.1:
version "0.13.1"
resolved "https://registry.yarnpkg.com/video-react/-/video-react-0.13.1.tgz#5d0dc68748f9b12e118beea1998d6ae5f6cbd6ba"
integrity sha512-AeGSpddfHv0UxeJztWUALYEjCdzXM1QdtQ5GD1VUd3vxcgwgIfB7EzFKcewRevSHHK8TDmjNksbvbWRobF/QeA==
dependencies:
classnames "^2.2.3"
lodash.throttle "^4.1.1"
prop-types "^15.5.8"
redux "^4.0.0"
vm-browserify@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
@ -8362,7 +8779,7 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5:
dependencies:
iconv-lite "0.4.24"
whatwg-fetch@3.0.0, whatwg-fetch@^3.0.0:
whatwg-fetch@3.0.0, whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb"
@ -8386,11 +8803,16 @@ whatwg-url@^7.0.0:
tr46 "^1.0.1"
webidl-conversions "^4.0.2"
which-module@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
which-module@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0:
which@1, which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
dependencies:
@ -8603,6 +9025,13 @@ yargs-parser@^10.1.0:
dependencies:
camelcase "^4.1.0"
yargs-parser@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=
dependencies:
camelcase "^3.0.0"
yargs-parser@^9.0.2:
version "9.0.2"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
@ -8642,3 +9071,22 @@ yargs@^11.0.0:
which-module "^2.0.0"
y18n "^3.2.1"
yargs-parser "^9.0.2"
yargs@^7.0.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=
dependencies:
camelcase "^3.0.0"
cliui "^3.2.0"
decamelize "^1.1.1"
get-caller-file "^1.0.1"
os-locale "^1.4.0"
read-pkg-up "^1.0.1"
require-directory "^2.1.1"
require-main-filename "^1.0.1"
set-blocking "^2.0.0"
string-width "^1.0.2"
which-module "^1.0.0"
y18n "^3.2.1"
yargs-parser "^5.0.0"