From 97b880db95372e85a2111cdff551799f5eb655b4 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Mon, 18 Jun 2018 14:51:48 -0700 Subject: [PATCH 01/59] package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 951a38e2f..120e3bd86 100644 --- a/package.json +++ b/package.json @@ -13,4 +13,4 @@ "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" } -} \ No newline at end of file +} From 277f9aa4809ffd848d42a4244b0893628b7a55fc Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 18 Jun 2018 14:52:43 -0700 Subject: [PATCH 02/59] package.json updated --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 951a38e2f..120e3bd86 100644 --- a/package.json +++ b/package.json @@ -13,4 +13,4 @@ "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" } -} \ No newline at end of file +} From f50636bcbac39a04915adb1f5836beaf26202f6f Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Mon, 18 Jun 2018 15:04:54 -0700 Subject: [PATCH 03/59] local api request works; cannot render yet --- package-lock.json | 9 +++++++++ package.json | 1 + src/App.js | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 79f52b34f..2bdc7a2f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -434,6 +434,15 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" }, + "axios": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", + "requires": { + "follow-redirects": "1.5.0", + "is-buffer": "1.1.6" + } + }, "axobject-query": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", diff --git a/package.json b/package.json index 120e3bd86..b5d697449 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.1.0", "private": true, "dependencies": { + "axios": "^0.18.0", "react": "^16.4.1", "react-dom": "^16.4.1", "react-scripts": "1.1.4" diff --git a/src/App.js b/src/App.js index 203067e4d..50dbbb496 100644 --- a/src/App.js +++ b/src/App.js @@ -1,8 +1,39 @@ import React, { Component } from 'react'; import logo from './logo.svg'; +import axios from 'axios'; import './App.css'; class App extends Component { + constructor() { + super(); + this.state = { + movies: [], + }; + } + + componentDidMount = () => { + let query = 'http://localhost:3000/movies' + console.log(query) + + axios.get(query) + .then((response) => { + console.log(response); + this.setState({ + movies: response.data + }) + }) + .catch((error) => { + this.setState({ + error: error.message + }); + if (error.message) { + this.renderError(); + console.log(error.message); + } + } + ); + } + render() { return (
@@ -11,7 +42,7 @@ class App extends Component {

Welcome to React

- To get started, edit src/App.js and save to reload. + {this.state.movies}

); From 004c2872f4621cc72902f7927f38f4c19155abb4 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Mon, 18 Jun 2018 15:41:02 -0700 Subject: [PATCH 04/59] components folder made; generic App.js --- src/App.js | 30 ------------------------------ src/components/Rental.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 30 deletions(-) create mode 100644 src/components/Rental.js diff --git a/src/App.js b/src/App.js index 50dbbb496..16e5bfe3f 100644 --- a/src/App.js +++ b/src/App.js @@ -4,35 +4,6 @@ import axios from 'axios'; import './App.css'; class App extends Component { - constructor() { - super(); - this.state = { - movies: [], - }; - } - - componentDidMount = () => { - let query = 'http://localhost:3000/movies' - console.log(query) - - axios.get(query) - .then((response) => { - console.log(response); - this.setState({ - movies: response.data - }) - }) - .catch((error) => { - this.setState({ - error: error.message - }); - if (error.message) { - this.renderError(); - console.log(error.message); - } - } - ); - } render() { return ( @@ -42,7 +13,6 @@ class App extends Component {

Welcome to React

- {this.state.movies}

); diff --git a/src/components/Rental.js b/src/components/Rental.js new file mode 100644 index 000000000..9427b8304 --- /dev/null +++ b/src/components/Rental.js @@ -0,0 +1,33 @@ +import React, { Component } from 'react'; +import './App.css'; + +class Rental extends Component { + constructor() { + super(); + this.state = { + movies: [], + }; + + componentDidMount = () => { + let query = 'http://localhost:3000/movies' + console.log(query) + + axios.get(query) + .then((response) => { + console.log(response); + this.setState({ + movies: response.data + }) + }) + .catch((error) => { + this.setState({ + error: error.message + }); + if (error.message) { + this.renderError(); + console.log(error.message); + } + } + ); + } +} From 109781a986d9012a023a41125a4824bfd7cbabe7 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Mon, 18 Jun 2018 15:54:26 -0700 Subject: [PATCH 05/59] test commit --- src/components/Rental.js | 49 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/src/components/Rental.js b/src/components/Rental.js index 9427b8304..430f8f5b7 100644 --- a/src/components/Rental.js +++ b/src/components/Rental.js @@ -3,11 +3,12 @@ import './App.css'; class Rental extends Component { constructor() { - super(); - this.state = { - movies: [], - }; - + super(); + this.state = { + movies: [] + }; + } + componentDidMount = () => { let query = 'http://localhost:3000/movies' console.log(query) @@ -30,4 +31,42 @@ class Rental extends Component { } ); } + + renderMovielist = () => { + const movieList = this.state.movies.map((item, index) => { + return( + + ) + }) + return cardList + } + + renderError = () => { + return ( +

+ {this.state.error} +

+ ) + } + + render() { + return ( +
+
+ {this.renderCardlist()} +
+
+ + ) + } + } + +export default Rental; From 9df24a731cb7236f8684a1828d09220ebdb924bc Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 18 Jun 2018 16:05:15 -0700 Subject: [PATCH 06/59] creates Tmbd component --- src/App.js | 5 +++-- src/components/Tmbd.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 src/components/Tmbd.js diff --git a/src/App.js b/src/App.js index 16e5bfe3f..6547c041a 100644 --- a/src/App.js +++ b/src/App.js @@ -3,6 +3,8 @@ import logo from './logo.svg'; import axios from 'axios'; import './App.css'; +import Tmbd from './components/Tmbd.js' + class App extends Component { render() { @@ -12,8 +14,7 @@ class App extends Component { logo

Welcome to React

-

-

+ ); } diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js new file mode 100644 index 000000000..e247bb566 --- /dev/null +++ b/src/components/Tmbd.js @@ -0,0 +1,28 @@ +import React, { Component } from 'react'; +import axios from 'axios'; + +class Tmbd extends Component { + constructor(){ + super(); + this.state = { + search: '' + } + } + + render(){ + return( +
+
+ + +
+
+ ); + } +} + +export default Tmbd; From e9d973f3d94f52fd4c48e6a25bc77280be9832f2 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 18 Jun 2018 16:12:04 -0700 Subject: [PATCH 07/59] creates SearchTmbdForm component --- src/components/SearchTmbdForm.js | 28 ++++++++++++++++++++++++++++ src/components/Tmbd.js | 14 ++++---------- 2 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 src/components/SearchTmbdForm.js diff --git a/src/components/SearchTmbdForm.js b/src/components/SearchTmbdForm.js new file mode 100644 index 000000000..ef1b7cc09 --- /dev/null +++ b/src/components/SearchTmbdForm.js @@ -0,0 +1,28 @@ +import React, { Component } from 'react'; +import axios from 'axios'; + +class SearchTmbdForm extends Component { + constructor(){ + super(); + this.state = { + search: '' + } + } + + render(){ + return( +
+
+ + +
+
+ ); + } +} + +export default SearchTmbdForm; diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js index e247bb566..0b707f2f9 100644 --- a/src/components/Tmbd.js +++ b/src/components/Tmbd.js @@ -1,5 +1,6 @@ import React, { Component } from 'react'; import axios from 'axios'; +import SearchTmbdForm from './SearchTmbdForm.js' class Tmbd extends Component { constructor(){ @@ -11,16 +12,9 @@ class Tmbd extends Component { render(){ return( -
-
- - -
-
+
+ +
); } } From 162855a970ff0bad1cf76aa5ae37f3eeff93fe58 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Mon, 18 Jun 2018 16:40:38 -0700 Subject: [PATCH 08/59] basic movie information shows for all movies --- src/App.js | 7 ++++--- src/components/Movie.js | 25 +++++++++++++++++++++++++ src/components/Rental.js | 25 ++++++++++++++----------- 3 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 src/components/Movie.js diff --git a/src/App.js b/src/App.js index 16e5bfe3f..4ad5e0e14 100644 --- a/src/App.js +++ b/src/App.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import logo from './logo.svg'; -import axios from 'axios'; +import Rental from './components/Rental'; import './App.css'; class App extends Component { @@ -12,8 +12,9 @@ class App extends Component { logo

Welcome to React

-

-

+
+ +
); } diff --git a/src/components/Movie.js b/src/components/Movie.js new file mode 100644 index 000000000..502059755 --- /dev/null +++ b/src/components/Movie.js @@ -0,0 +1,25 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; + +class Movie extends Component { + render() { + return ( +
+
{this.props.title}
+ {this.props.title}/ +

{this.props.overview}

+

{this.props.release}

+
+ ) + } +} + +export default Movie; + +Movie.propTypes = { + id: PropTypes.number, + title: PropTypes.string, + overview: PropTypes.string, + release: PropTypes.string, + image_url: PropTypes.string, +} diff --git a/src/components/Rental.js b/src/components/Rental.js index 430f8f5b7..94c174604 100644 --- a/src/components/Rental.js +++ b/src/components/Rental.js @@ -1,5 +1,7 @@ import React, { Component } from 'react'; -import './App.css'; +// import './App.css'; +import Movie from './Movie'; +import axios from 'axios'; class Rental extends Component { constructor() { @@ -32,20 +34,21 @@ class Rental extends Component { ); } - renderMovielist = () => { + renderMovieList = () => { const movieList = this.state.movies.map((item, index) => { return( - + id={item.id} + title={item.title} + overview={item.overview} + release={item.release_date} + image_url={item.image_url} + /> ) + }) - return cardList + return movieList } renderError = () => { @@ -60,7 +63,7 @@ class Rental extends Component { return (
- {this.renderCardlist()} + {this.renderMovieList()}
From 60abbcdf906ce94f0d04aaa6c49ec9a1d8451c6d Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 18 Jun 2018 16:48:35 -0700 Subject: [PATCH 09/59] adds additional logic to search form and passes back term to Tmbd component --- src/App.js | 5 ++++- src/components/SearchTmbdForm.js | 36 +++++++++++++++++++++++++++++--- src/components/Tmbd.js | 14 ++++++++++++- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/App.js b/src/App.js index 6547c041a..99f8c7fc1 100644 --- a/src/App.js +++ b/src/App.js @@ -1,4 +1,5 @@ import React, { Component } from 'react'; +import PropTypes from 'prop-types'; import logo from './logo.svg'; import axios from 'axios'; import './App.css'; @@ -14,7 +15,9 @@ class App extends Component { logo

Welcome to React

- +
+ +
); } diff --git a/src/components/SearchTmbdForm.js b/src/components/SearchTmbdForm.js index ef1b7cc09..802e54b55 100644 --- a/src/components/SearchTmbdForm.js +++ b/src/components/SearchTmbdForm.js @@ -1,28 +1,58 @@ import React, { Component } from 'react'; +import PropTypes from 'prop-types'; import axios from 'axios'; class SearchTmbdForm extends Component { constructor(){ super(); this.state = { - search: '' + search: '', } } + onFieldChange = (event) => { + const search = event.target.value; + this.setState({ + search, + }); + } + + onFormSubmit = (event) => { + event.preventDefault(); + + // call separate function for axios call to Tmbd + this.props.searchCallback(this.state.search); + + // clear form + this.setState({ + search: '', + }); + // hide search component + + // console.log('Submit event'); + // console.log(`Searched Term: ${this.state.search}`); + } + + render(){ return( -
+
-
+
); } } +SearchTmbdForm.propTypes = { + searchCallback: PropTypes.func.isRequired +}; + export default SearchTmbdForm; diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js index 0b707f2f9..571a88d0f 100644 --- a/src/components/Tmbd.js +++ b/src/components/Tmbd.js @@ -1,4 +1,5 @@ import React, { Component } from 'react'; +import PropTypes from 'prop-types'; import axios from 'axios'; import SearchTmbdForm from './SearchTmbdForm.js' @@ -10,13 +11,24 @@ class Tmbd extends Component { } } + getMovies = (search) => { + console.log('In TMBD.js'); + console.log(`Search input: ${search}`); + } + render(){ return(
- +
); } } +Tmbd.propTypes = { + +}; + export default Tmbd; From 71cd79ea62aee4ae5538d2c5fc1b573e9ab9d83b Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 18 Jun 2018 17:02:01 -0700 Subject: [PATCH 10/59] adds axios get request to Tmbd --- src/components/Tmbd.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js index 571a88d0f..e9f068181 100644 --- a/src/components/Tmbd.js +++ b/src/components/Tmbd.js @@ -12,8 +12,16 @@ class Tmbd extends Component { } getMovies = (search) => { + const url = 'https://api.themoviedb.org/3/search/movie?api_key=4bc8e1bdfa9b893a8f74030d299fd75d&query='; console.log('In TMBD.js'); console.log(`Search input: ${search}`); + axios.get(`${url}${search}`) + .then( (response) => { + console.log(response.data.results); + }) + .catch( (error) => { + console.log(error); + }); } render(){ From 6ace143d060bd00eb80b3e41742e303967944c81 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 18 Jun 2018 17:19:29 -0700 Subject: [PATCH 11/59] adds logic for hidding/showing components within Tmbd Component --- src/components/Tmbd.css | 7 +++++++ src/components/Tmbd.js | 21 +++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 src/components/Tmbd.css diff --git a/src/components/Tmbd.css b/src/components/Tmbd.css new file mode 100644 index 000000000..45f91e939 --- /dev/null +++ b/src/components/Tmbd.css @@ -0,0 +1,7 @@ +.show { + display: block +} + +.hide { + display: none; +} diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js index e9f068181..34b14b6e9 100644 --- a/src/components/Tmbd.js +++ b/src/components/Tmbd.js @@ -1,5 +1,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; +import './Tmbd.css' import axios from 'axios'; import SearchTmbdForm from './SearchTmbdForm.js' @@ -7,7 +8,8 @@ class Tmbd extends Component { constructor(){ super(); this.state = { - search: '' + searchIsHidden: false, + view: 'search' } } @@ -24,12 +26,23 @@ class Tmbd extends Component { }); } + displayComp = (stateVar) => { + if (stateVar) { return 'hide' } + return 'show'; + } + render(){ return(
- +
+ +
+ +
+ +
); } From 38d38efbc4f9abbabc9068e3acd07f7ef7729ca5 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 18 Jun 2018 17:57:47 -0700 Subject: [PATCH 12/59] adds TmbdMovie component and renders within Tmbd --- src/components/SearchTmbdForm.js | 5 ---- src/components/ShowMovieResults.js | 39 ++++++++++++++++++++++++++++++ src/components/Tmbd.js | 27 ++++++++++++--------- src/components/TmbdMovie.js | 25 +++++++++++++++++++ 4 files changed, 80 insertions(+), 16 deletions(-) create mode 100644 src/components/ShowMovieResults.js create mode 100644 src/components/TmbdMovie.js diff --git a/src/components/SearchTmbdForm.js b/src/components/SearchTmbdForm.js index 802e54b55..d4420402f 100644 --- a/src/components/SearchTmbdForm.js +++ b/src/components/SearchTmbdForm.js @@ -1,6 +1,5 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import axios from 'axios'; class SearchTmbdForm extends Component { constructor(){ @@ -27,10 +26,6 @@ class SearchTmbdForm extends Component { this.setState({ search: '', }); - // hide search component - - // console.log('Submit event'); - // console.log(`Searched Term: ${this.state.search}`); } diff --git a/src/components/ShowMovieResults.js b/src/components/ShowMovieResults.js new file mode 100644 index 000000000..b03fc1272 --- /dev/null +++ b/src/components/ShowMovieResults.js @@ -0,0 +1,39 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import TmbdMovie from './TmbdMovie'; + +class ShowMovieResults extends Component { + constructor(props){ + super(props); + } + + renderMovies = () => { + const movieList = this.props.movies.map((movie, index) => { + return( + + ) + }) + + return movieList; + } + + + render(){ + return( +
+ { this.renderMovies() } +
+ ); + } +} + +ShowMovieResults.propTypes = { + movies: PropTypes.array.isRequired, +}; + + +export default ShowMovieResults; diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js index 34b14b6e9..0ccb03316 100644 --- a/src/components/Tmbd.js +++ b/src/components/Tmbd.js @@ -1,25 +1,32 @@ import React, { Component } from 'react'; -import PropTypes from 'prop-types'; +// import PropTypes from 'prop-types'; import './Tmbd.css' import axios from 'axios'; import SearchTmbdForm from './SearchTmbdForm.js' +import ShowMovieResults from './ShowMovieResults.js' class Tmbd extends Component { constructor(){ super(); this.state = { - searchIsHidden: false, - view: 'search' + // searchIsHidden: false, + moviesAreHidden: true, + movies: [] } } getMovies = (search) => { const url = 'https://api.themoviedb.org/3/search/movie?api_key=4bc8e1bdfa9b893a8f74030d299fd75d&query='; - console.log('In TMBD.js'); - console.log(`Search input: ${search}`); + // console.log('In TMBD.js'); + // console.log(`Search input: ${search}`); axios.get(`${url}${search}`) .then( (response) => { console.log(response.data.results); + this.setState({ + moviesAreHidden: false, + // searchIsHidden: true, + movies: response.data.results + }) }) .catch( (error) => { console.log(error); @@ -34,22 +41,20 @@ class Tmbd extends Component { render(){ return(
-
+
- +
); } } -Tmbd.propTypes = { - -}; - export default Tmbd; diff --git a/src/components/TmbdMovie.js b/src/components/TmbdMovie.js new file mode 100644 index 000000000..8ed4dd78d --- /dev/null +++ b/src/components/TmbdMovie.js @@ -0,0 +1,25 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; + +class TmbdMovie extends Component { + constructor(props){ + super(props); + } + + render(){ + return( +
+

Title: {this.props.title}

+

Release Date:{this.props.releaseDate}

+
+ ); + } +} + +TmbdMovie.propTypes = { + title: PropTypes.string, + releaseDate: PropTypes.string +}; + + +export default TmbdMovie; From c8a2a97a1f161ea980463ddc041f9fe8669862ac Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Tue, 19 Jun 2018 10:36:49 -0700 Subject: [PATCH 13/59] customer list renders --- src/components/Customer.js | 30 +++++++++++++ src/components/CustomerList.js | 71 +++++++++++++++++++++++++++++++ src/components/Rental.js | 58 +++---------------------- src/components/RentalList.js | 72 ++++++++++++++++++++++++++++++++ src/components/profile.jpg | Bin 0 -> 5027 bytes src/default-profile-picture.jpg | Bin 0 -> 16579 bytes 6 files changed, 178 insertions(+), 53 deletions(-) create mode 100644 src/components/Customer.js create mode 100644 src/components/CustomerList.js create mode 100644 src/components/RentalList.js create mode 100644 src/components/profile.jpg create mode 100644 src/default-profile-picture.jpg diff --git a/src/components/Customer.js b/src/components/Customer.js new file mode 100644 index 000000000..11002a9fc --- /dev/null +++ b/src/components/Customer.js @@ -0,0 +1,30 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import profile from './profile.jpg' + +class Customer extends Component { + render() { + return ( +
+
{this.props.id}
+ +

{this.props.name}

+

{this.props.address}

+

{this.props.city}, {this.props.state} {this.props.postal_code}

+

{this.props.phone}

+
+ ) + } +} + +export default Customer; + +Customer.propTypes = { + id: PropTypes.number, + name: PropTypes.string, + address: PropTypes.string, + city: PropTypes.string, + state: PropTypes.string, + postal_code: PropTypes.string, + phone: PropTypes.string, +} diff --git a/src/components/CustomerList.js b/src/components/CustomerList.js new file mode 100644 index 000000000..cf2164d31 --- /dev/null +++ b/src/components/CustomerList.js @@ -0,0 +1,71 @@ +import React, { Component } from 'react'; +import Customer from './Customer'; +import axios from 'axios'; + +class CustomerList extends Component { + constructor() { + super(); + this.state = { + customers: [], + } + } + + componentDidMount = () => { + let query = 'http://localhost:3000/customers' + console.log(query) + + axios.get(query) + .then((response) => { + console.log(response); + this.setState({ + customers: response.data + }) + }) + .catch((error) => { + this.setState({ + error: error.message + }); + if (error.message) { + this.renderError(); + console.log(error.message); + } + } + ); + } + + renderCustomerList = () => { + const customerList = this.state.customers.map((item, index) => { + return( + + ) + }) + return customerList + } + + renderError = () => { + return ( +

+ {this.state.error} +

+ ) + } + + render() { + return ( +
+ {this.renderCustomerList()} +
+ ) + } +} + +export default CustomerList; diff --git a/src/components/Rental.js b/src/components/Rental.js index 94c174604..ab2bfca77 100644 --- a/src/components/Rental.js +++ b/src/components/Rental.js @@ -1,69 +1,21 @@ import React, { Component } from 'react'; -// import './App.css'; -import Movie from './Movie'; -import axios from 'axios'; +import RentalList from './RentalList'; +import CustomerList from './CustomerList'; class Rental extends Component { constructor() { super(); this.state = { - movies: [] + selectedMovie: 'None', + selectedCustomer: 'None', }; } - componentDidMount = () => { - let query = 'http://localhost:3000/movies' - console.log(query) - - axios.get(query) - .then((response) => { - console.log(response); - this.setState({ - movies: response.data - }) - }) - .catch((error) => { - this.setState({ - error: error.message - }); - if (error.message) { - this.renderError(); - console.log(error.message); - } - } - ); - } - - renderMovieList = () => { - const movieList = this.state.movies.map((item, index) => { - return( - - ) - - }) - return movieList - } - - renderError = () => { - return ( -

- {this.state.error} -

- ) - } - render() { return (
- {this.renderMovieList()} +
diff --git a/src/components/RentalList.js b/src/components/RentalList.js new file mode 100644 index 000000000..f3114952a --- /dev/null +++ b/src/components/RentalList.js @@ -0,0 +1,72 @@ +import React, { Component } from 'react'; +import Movie from './Movie'; +import axios from 'axios'; + +class RentalList extends Component { + constructor() { + super(); + this.state = { + movies: [], + }; + } + + componentDidMount = () => { + let query = 'http://localhost:3000/movies' + console.log(query) + + axios.get(query) + .then((response) => { + console.log(response); + this.setState({ + movies: response.data + }) + }) + .catch((error) => { + this.setState({ + error: error.message + }); + if (error.message) { + this.renderError(); + console.log(error.message); + } + } + ); + } + + renderMovieList = () => { + const movieList = this.state.movies.map((item, index) => { + return( + + ) + }) + return movieList + } + + renderError = () => { + return ( +

+ {this.state.error} +

+ ) + } + + render() { + return ( +
+
+ {this.renderMovieList()} +
+
+ + ) + } +} + +export default RentalList; diff --git a/src/components/profile.jpg b/src/components/profile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f21cf3394a1e43f8cdca4d47d2c9e1fee72bde2d GIT binary patch literal 5027 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 Date: Tue, 19 Jun 2018 11:01:19 -0700 Subject: [PATCH 14/59] adds Add Movie button to all movies from search results --- src/App.js | 2 +- src/components/ShowMovieResults.js | 2 ++ src/components/Tmbd.js | 6 ++++++ src/components/TmbdMovie.js | 32 +++++++++++++++++++++++++----- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/App.js b/src/App.js index 99f8c7fc1..46d60660d 100644 --- a/src/App.js +++ b/src/App.js @@ -16,7 +16,7 @@ class App extends Component {

Welcome to React

- +
); diff --git a/src/components/ShowMovieResults.js b/src/components/ShowMovieResults.js index b03fc1272..6facaba89 100644 --- a/src/components/ShowMovieResults.js +++ b/src/components/ShowMovieResults.js @@ -12,8 +12,10 @@ class ShowMovieResults extends Component { return( ) }) diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js index 0ccb03316..a46c7c087 100644 --- a/src/components/Tmbd.js +++ b/src/components/Tmbd.js @@ -4,6 +4,7 @@ import './Tmbd.css' import axios from 'axios'; import SearchTmbdForm from './SearchTmbdForm.js' import ShowMovieResults from './ShowMovieResults.js' +import TmbdMovie from './TmbdMovie' class Tmbd extends Component { constructor(){ @@ -11,6 +12,7 @@ class Tmbd extends Component { this.state = { // searchIsHidden: false, moviesAreHidden: true, + movieHidden: true, movies: [] } } @@ -52,6 +54,10 @@ class Tmbd extends Component { movies = { this.state.movies } /> + +
+ +
); } diff --git a/src/components/TmbdMovie.js b/src/components/TmbdMovie.js index 8ed4dd78d..807be9adf 100644 --- a/src/components/TmbdMovie.js +++ b/src/components/TmbdMovie.js @@ -6,19 +6,41 @@ class TmbdMovie extends Component { super(props); } + imageURL = (imageId) => { + const imgPath = `https://image.tmdb.org/t/p/w300${imageId}` + // console.log(imgPath); + return imgPath; + } + + onFormSubmit = (event) => { + event.preventDefault(); + console.log(event.target); + // ideally a popup for confirmation of movie selected + // check if movie is already in videostore api + // if not, make a POST? request to the videostore api + // show status message for success or failure + // render Rental component + } + render(){ return( -
-

Title: {this.props.title}

-

Release Date:{this.props.releaseDate}

-
+
+

Title: {this.props.title}

+

Release Date: {this.props.releaseDate}

+ movie poster + +
); } } TmbdMovie.propTypes = { + id: PropTypes.number, title: PropTypes.string, - releaseDate: PropTypes.string + releaseDate: PropTypes.string, + poster: PropTypes.string }; From 302247e93beb7447a2e119ff247b308aad1dfe96 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Tue, 19 Jun 2018 11:01:28 -0700 Subject: [PATCH 15/59] prepped for merge --- src/App.js | 2 +- src/components/NewRentalForm.js | 42 +++++++++++++++++++++++++++++++++ src/components/Rental.js | 18 ++++++++------ 3 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 src/components/NewRentalForm.js diff --git a/src/App.js b/src/App.js index 4ad5e0e14..dec8c24a4 100644 --- a/src/App.js +++ b/src/App.js @@ -13,7 +13,7 @@ class App extends Component {

Welcome to React

- +
); diff --git a/src/components/NewRentalForm.js b/src/components/NewRentalForm.js new file mode 100644 index 000000000..a3488e5bf --- /dev/null +++ b/src/components/NewRentalForm.js @@ -0,0 +1,42 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; + +class NewRentalForm extends Component { + constructor() { + super(); + this.state = { + selectedMovie: 'None', + selectedCustomer: 'None', + }; + } + + onFieldChange = (event) => { + const fieldName = event.target.name; + const fieldValue = event.target.value; + const updateState = {}; + updateState[fieldName] = fieldValue; + this.setState(updateState); + } + + onFormSubmit = (event) => { + event.preventDefault(); + } + + render() { + return ( +
+
+ + +
+
+ + +
+ +
+ ) + } +} + +export default NewRentalForm; diff --git a/src/components/Rental.js b/src/components/Rental.js index ab2bfca77..bff6d188d 100644 --- a/src/components/Rental.js +++ b/src/components/Rental.js @@ -1,19 +1,23 @@ import React, { Component } from 'react'; import RentalList from './RentalList'; +import NewRentalForm from './NewRentalForm'; import CustomerList from './CustomerList'; class Rental extends Component { - constructor() { - super(); - this.state = { - selectedMovie: 'None', - selectedCustomer: 'None', - }; - } + // constructor() { + // super(); + // this.state = { + // selectedMovie: 'None', + // selectedCustomer: 'None', + // }; + // } render() { return (
+
+ +
From 51ae8f6679ee9d7b81e7cca45da0ac2b606e3e8b Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Tue, 19 Jun 2018 12:42:11 -0700 Subject: [PATCH 16/59] post rental works with writing in data --- src/App.js | 1 + src/components/NewRentalForm.js | 24 ++++++++++++++++++++---- src/components/Rental.js | 22 +++++++++++++++++++++- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/App.js b/src/App.js index b5e7e30e9..7179239ce 100644 --- a/src/App.js +++ b/src/App.js @@ -16,6 +16,7 @@ class App extends Component {

Welcome to React

+
); diff --git a/src/components/NewRentalForm.js b/src/components/NewRentalForm.js index a3488e5bf..4eb63ce8a 100644 --- a/src/components/NewRentalForm.js +++ b/src/components/NewRentalForm.js @@ -18,20 +18,32 @@ class NewRentalForm extends Component { this.setState(updateState); } + + clearForm = () => { + this.setState({ + selectedMovie: 'None', + selectedCustomer: 'None', + }); + } + onFormSubmit = (event) => { event.preventDefault(); + + this.props.addRentalCallback(this.state.selectedMovie, this.state.selectedCustomer) + this.clearForm(); + } render() { return (
- - + +
- - + +
@@ -40,3 +52,7 @@ class NewRentalForm extends Component { } export default NewRentalForm; + +NewRentalForm.propTypes = { + addRentalCallback: PropTypes.func +} diff --git a/src/components/Rental.js b/src/components/Rental.js index bff6d188d..a26fb5ce8 100644 --- a/src/components/Rental.js +++ b/src/components/Rental.js @@ -2,6 +2,7 @@ import React, { Component } from 'react'; import RentalList from './RentalList'; import NewRentalForm from './NewRentalForm'; import CustomerList from './CustomerList'; +import axios from 'axios'; class Rental extends Component { // constructor() { @@ -12,11 +13,30 @@ class Rental extends Component { // }; // } + addRental = (movie,customer) => { + const movieTitle = movie; + const customerId = customer; + const today = new Date() + const dueDate = (new Date(today.setDate(today.getDate() + 7))).toISOString().slice(0,10) + + const url = 'http://localhost:3000/rentals/' + movieTitle + '/check-out?customer_id=' + customerId + '&due_date=' + dueDate + + axios.post(url) + .then((response) => { + console.log(response); + }) + .catch((error) => { + this.setState({ + message: error.message + }); + }) + } + render() { return (
- +
From 76915d3a24da2b6e6f6e4fe086f448cdd723cbed Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 19 Jun 2018 12:51:06 -0700 Subject: [PATCH 17/59] refactors so that front end is not calling tmbd directly --- src/App.js | 1 + src/components/ShowMovieResults.js | 5 +++-- src/components/Tmbd.js | 36 +++++++++++++++++++++--------- src/components/TmbdMovie.js | 36 +++++++++++++++++------------- 4 files changed, 50 insertions(+), 28 deletions(-) diff --git a/src/App.js b/src/App.js index b5e7e30e9..f40bd90de 100644 --- a/src/App.js +++ b/src/App.js @@ -16,6 +16,7 @@ class App extends Component {

Welcome to React

+
); diff --git a/src/components/ShowMovieResults.js b/src/components/ShowMovieResults.js index 6facaba89..0249bde91 100644 --- a/src/components/ShowMovieResults.js +++ b/src/components/ShowMovieResults.js @@ -12,10 +12,11 @@ class ShowMovieResults extends Component { return( ) }) diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js index a46c7c087..1cb8943b1 100644 --- a/src/components/Tmbd.js +++ b/src/components/Tmbd.js @@ -17,22 +17,38 @@ class Tmbd extends Component { } } + // getMovies = (search) => { + // const url = 'https://api.themoviedb.org/3/search/movie?api_key=4bc8e1bdfa9b893a8f74030d299fd75d&query='; + // // console.log('In TMBD.js'); + // // console.log(`Search input: ${search}`); + // axios.get(`${url}${search}`) + // .then( (response) => { + // console.log(response.data.results); + // this.setState({ + // moviesAreHidden: false, + // // searchIsHidden: true, + // movies: response.data.results + // }) + // }) + // .catch( (error) => { + // console.log(error); + // }); + // } + getMovies = (search) => { - const url = 'https://api.themoviedb.org/3/search/movie?api_key=4bc8e1bdfa9b893a8f74030d299fd75d&query='; - // console.log('In TMBD.js'); - // console.log(`Search input: ${search}`); + const url = 'http://localhost:3000//movies?query='; axios.get(`${url}${search}`) - .then( (response) => { - console.log(response.data.results); + .then((response) => { + // console.log(response.data); this.setState({ moviesAreHidden: false, - // searchIsHidden: true, - movies: response.data.results + movies: response.data }) + console.log(this.state.movies); }) - .catch( (error) => { + .catch((error) => { console.log(error); - }); + }) } displayComp = (stateVar) => { @@ -56,7 +72,7 @@ class Tmbd extends Component {
- +
); diff --git a/src/components/TmbdMovie.js b/src/components/TmbdMovie.js index 807be9adf..c02e60afe 100644 --- a/src/components/TmbdMovie.js +++ b/src/components/TmbdMovie.js @@ -1,26 +1,29 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; +import axios from 'axios'; class TmbdMovie extends Component { constructor(props){ super(props); } - imageURL = (imageId) => { - const imgPath = `https://image.tmdb.org/t/p/w300${imageId}` - // console.log(imgPath); - return imgPath; - } + // imageURL = (imageId) => { + // const imgPath = `https://image.tmdb.org/t/p/w200${imageId}` + // // console.log(imgPath); + // return imgPath; + // } - onFormSubmit = (event) => { - event.preventDefault(); - console.log(event.target); - // ideally a popup for confirmation of movie selected - // check if movie is already in videostore api - // if not, make a POST? request to the videostore api - // show status message for success or failure - // render Rental component - } + // onFormSubmit = (event) => { + // event.preventDefault(); + // console.log(this.props); + // axios.post('http://localhost:3000/movies/', {title: 'Babe'}) + // .then((response) => { + // console.log(response); + // }) + // .catch((error) => { + // console.log(error); + // }); + // } render(){ return( @@ -28,7 +31,7 @@ class TmbdMovie extends Component {

Title: {this.props.title}

Release Date: {this.props.releaseDate}

movie poster @@ -40,7 +43,8 @@ TmbdMovie.propTypes = { id: PropTypes.number, title: PropTypes.string, releaseDate: PropTypes.string, - poster: PropTypes.string + poster: PropTypes.string, + overview: PropTypes.string }; From 5d11c65269d18e787db140aa798d9764399ef3eb Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 19 Jun 2018 13:01:24 -0700 Subject: [PATCH 18/59] gets rid of existing code with old api code to tmbd --- src/components/Tmbd.js | 18 ------------------ src/components/TmbdMovie.js | 35 ++++++++++++++++++----------------- 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js index 1cb8943b1..5980d0478 100644 --- a/src/components/Tmbd.js +++ b/src/components/Tmbd.js @@ -17,24 +17,6 @@ class Tmbd extends Component { } } - // getMovies = (search) => { - // const url = 'https://api.themoviedb.org/3/search/movie?api_key=4bc8e1bdfa9b893a8f74030d299fd75d&query='; - // // console.log('In TMBD.js'); - // // console.log(`Search input: ${search}`); - // axios.get(`${url}${search}`) - // .then( (response) => { - // console.log(response.data.results); - // this.setState({ - // moviesAreHidden: false, - // // searchIsHidden: true, - // movies: response.data.results - // }) - // }) - // .catch( (error) => { - // console.log(error); - // }); - // } - getMovies = (search) => { const url = 'http://localhost:3000//movies?query='; axios.get(`${url}${search}`) diff --git a/src/components/TmbdMovie.js b/src/components/TmbdMovie.js index c02e60afe..1013a72e6 100644 --- a/src/components/TmbdMovie.js +++ b/src/components/TmbdMovie.js @@ -7,23 +7,24 @@ class TmbdMovie extends Component { super(props); } - // imageURL = (imageId) => { - // const imgPath = `https://image.tmdb.org/t/p/w200${imageId}` - // // console.log(imgPath); - // return imgPath; - // } - - // onFormSubmit = (event) => { - // event.preventDefault(); - // console.log(this.props); - // axios.post('http://localhost:3000/movies/', {title: 'Babe'}) - // .then((response) => { - // console.log(response); - // }) - // .catch((error) => { - // console.log(error); - // }); - // } + onFormSubmit = (event) => { + event.preventDefault(); + console.log(this.props); + const movieObj = { + title: this.props.title, + release_date: this.props.releaseDate, + overview: this.props.overview, + image_url: this.props.poster, + external_id: this.props.id + } + axios.post('http://localhost:3000/movies/', movieObj) + .then((response) => { + console.log(response); + }) + .catch((error) => { + console.log(error); + }); + } render(){ return( From e99add3e648a560791570a6851ac56001de1958a Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Tue, 19 Jun 2018 13:45:29 -0700 Subject: [PATCH 19/59] updated App and components to not need form; can return title and c_id on image click --- src/App.js | 40 ++++++++++++++++++++++++++++++++-- src/components/Customer.js | 8 ++++++- src/components/CustomerList.js | 11 ++++++++++ src/components/Movie.js | 8 ++++++- src/components/RentalList.js | 11 +++++++++- 5 files changed, 73 insertions(+), 5 deletions(-) diff --git a/src/App.js b/src/App.js index 7179239ce..1fb3ceb6f 100644 --- a/src/App.js +++ b/src/App.js @@ -1,12 +1,47 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import logo from './logo.svg'; -import Rental from './components/Rental'; +import axios from 'axios'; +import RentalList from './components/RentalList'; +import CustomerList from './components/CustomerList'; import './App.css'; import Tmbd from './components/Tmbd.js' class App extends Component { + constructor() { + super(); + this.state = { + selectedMovie: 'None', + selectedCustomer: 'None', + }; + } + + pickRentalDetail = (id) => { + console.log(id); + // this.setState({ + // selectedCustomer: id + // }) + } + + addRental = (movie,customer) => { + const movieTitle = movie; + const customerId = customer; + const today = new Date() + const dueDate = (new Date(today.setDate(today.getDate() + 7))).toISOString().slice(0,10) + + const url = 'http://localhost:3000/rentals/' + movieTitle + '/check-out?customer_id=' + customerId + '&due_date=' + dueDate + + axios.post(url) + .then((response) => { + console.log(response); + }) + .catch((error) => { + this.setState({ + message: error.message + }); + }) + } render() { return ( @@ -15,8 +50,9 @@ class App extends Component { logo

Welcome to React

+
- +
); diff --git a/src/components/Customer.js b/src/components/Customer.js index 11002a9fc..2bd03e601 100644 --- a/src/components/Customer.js +++ b/src/components/Customer.js @@ -3,11 +3,16 @@ import PropTypes from 'prop-types'; import profile from './profile.jpg' class Customer extends Component { + + rentalDetail = () => { + this.props.customerCallback(this.props.id) + } + render() { return (
{this.props.id}
- +

{this.props.name}

{this.props.address}

{this.props.city}, {this.props.state} {this.props.postal_code}

@@ -27,4 +32,5 @@ Customer.propTypes = { state: PropTypes.string, postal_code: PropTypes.string, phone: PropTypes.string, + customerCallback: PropTypes.func, } diff --git a/src/components/CustomerList.js b/src/components/CustomerList.js index cf2164d31..25bf616dd 100644 --- a/src/components/CustomerList.js +++ b/src/components/CustomerList.js @@ -1,5 +1,6 @@ import React, { Component } from 'react'; import Customer from './Customer'; +import PropTypes from 'prop-types'; import axios from 'axios'; class CustomerList extends Component { @@ -33,6 +34,11 @@ class CustomerList extends Component { ); } + pickCustomer = (id) => { + this.props.pickRentalDetailCallback(id) + } + + renderCustomerList = () => { const customerList = this.state.customers.map((item, index) => { return( @@ -45,6 +51,7 @@ class CustomerList extends Component { state={item.state} postal_code={item.postal_code} phone={item.phone} + customerCallback={this.pickCustomer} /> ) }) @@ -69,3 +76,7 @@ class CustomerList extends Component { } export default CustomerList; + +CustomerList.propTypes = { + pickRentalDetailCallback: PropTypes.func, +} diff --git a/src/components/Movie.js b/src/components/Movie.js index 502059755..852681cf9 100644 --- a/src/components/Movie.js +++ b/src/components/Movie.js @@ -2,11 +2,16 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; class Movie extends Component { + + rentalDetail = () => { + this.props.movieCallback(this.props.title) + } + render() { return (
{this.props.title}
- {this.props.title}/ + {this.props.title}

{this.props.overview}

{this.props.release}

@@ -22,4 +27,5 @@ Movie.propTypes = { overview: PropTypes.string, release: PropTypes.string, image_url: PropTypes.string, + movieCallback: PropTypes.func, } diff --git a/src/components/RentalList.js b/src/components/RentalList.js index f3114952a..3abf8a1ed 100644 --- a/src/components/RentalList.js +++ b/src/components/RentalList.js @@ -1,4 +1,5 @@ import React, { Component } from 'react'; +import PropTypes from 'prop-types'; import Movie from './Movie'; import axios from 'axios'; @@ -43,6 +44,7 @@ class RentalList extends Component { overview={item.overview} release={item.release_date} image_url={item.image_url} + movieCallback={this.pickMovie} /> ) }) @@ -57,6 +59,10 @@ class RentalList extends Component { ) } + pickMovie = (id) => { + this.props.pickRentalDetailCallback(id) + } + render() { return (
@@ -64,9 +70,12 @@ class RentalList extends Component { {this.renderMovieList()}
- ) } } export default RentalList; + +RentalList.propTypes = { + pickRentalDetailCallback: PropTypes.func, +} From c4f5a49a2444c0f7f889a4f8f43dcb634d5c31ac Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Tue, 19 Jun 2018 14:00:47 -0700 Subject: [PATCH 20/59] can update state on App.js for customer name+id and movie title --- src/App.js | 31 +++++++++++++++++++++---------- src/components/Customer.js | 2 +- src/components/CustomerList.js | 7 +++---- src/components/RentalList.js | 4 ++-- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/App.js b/src/App.js index 1fb3ceb6f..e4a22f03a 100644 --- a/src/App.js +++ b/src/App.js @@ -12,16 +12,25 @@ class App extends Component { constructor() { super(); this.state = { - selectedMovie: 'None', - selectedCustomer: 'None', + selectedMovie: '', + selectedCustomer: '', + customerId: ',' }; } - pickRentalDetail = (id) => { + pickMovieDetail = (title) => { + console.log(title); + this.setState({ + selectedMovie: title + }) + } + + pickCustomerDetail = (id, name) => { console.log(id); - // this.setState({ - // selectedCustomer: id - // }) + this.setState({ + selectedCustomer: name, + customerId: id + }) } addRental = (movie,customer) => { @@ -47,12 +56,14 @@ class App extends Component { return (
- logo -

Welcome to React

-
+

Ada Movies

+ +
{this.state.selectedMovie}
+
{this.state.selectedCustomer}
- + +
); diff --git a/src/components/Customer.js b/src/components/Customer.js index 2bd03e601..85b8eb8f6 100644 --- a/src/components/Customer.js +++ b/src/components/Customer.js @@ -5,7 +5,7 @@ import profile from './profile.jpg' class Customer extends Component { rentalDetail = () => { - this.props.customerCallback(this.props.id) + this.props.customerCallback(this.props.id, this.props.name) } render() { diff --git a/src/components/CustomerList.js b/src/components/CustomerList.js index 25bf616dd..13ac6163a 100644 --- a/src/components/CustomerList.js +++ b/src/components/CustomerList.js @@ -34,11 +34,10 @@ class CustomerList extends Component { ); } - pickCustomer = (id) => { - this.props.pickRentalDetailCallback(id) + pickCustomer = (id, name) => { + this.props.pickCustomerDetailCallback(id, name) } - renderCustomerList = () => { const customerList = this.state.customers.map((item, index) => { return( @@ -78,5 +77,5 @@ class CustomerList extends Component { export default CustomerList; CustomerList.propTypes = { - pickRentalDetailCallback: PropTypes.func, + pickCustomerDetailCallback: PropTypes.func, } diff --git a/src/components/RentalList.js b/src/components/RentalList.js index 3abf8a1ed..e4b3fe85f 100644 --- a/src/components/RentalList.js +++ b/src/components/RentalList.js @@ -60,7 +60,7 @@ class RentalList extends Component { } pickMovie = (id) => { - this.props.pickRentalDetailCallback(id) + this.props.pickMovieDetailCallback(id) } render() { @@ -77,5 +77,5 @@ class RentalList extends Component { export default RentalList; RentalList.propTypes = { - pickRentalDetailCallback: PropTypes.func, + pickMovieDetailCallback: PropTypes.func, } From 33f106aa1e4a414af3d487f37800fe8769ea71bc Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 19 Jun 2018 14:34:55 -0700 Subject: [PATCH 21/59] gets rid of npm cors install --- src/App.js | 2 +- src/components/TmbdMovie.js | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/App.js b/src/App.js index 66441364b..f40bd90de 100644 --- a/src/App.js +++ b/src/App.js @@ -16,7 +16,7 @@ class App extends Component {

Welcome to React

- +
); diff --git a/src/components/TmbdMovie.js b/src/components/TmbdMovie.js index 1013a72e6..10e02797e 100644 --- a/src/components/TmbdMovie.js +++ b/src/components/TmbdMovie.js @@ -9,7 +9,7 @@ class TmbdMovie extends Component { onFormSubmit = (event) => { event.preventDefault(); - console.log(this.props); + // console.log(this.props); const movieObj = { title: this.props.title, release_date: this.props.releaseDate, @@ -17,19 +17,20 @@ class TmbdMovie extends Component { image_url: this.props.poster, external_id: this.props.id } + axios.post('http://localhost:3000/movies/', movieObj) .then((response) => { console.log(response); }) .catch((error) => { - console.log(error); + console.log(error.message); }); } render(){ return(
-

Title: {this.props.title}

+

Title: {this.props.title}

Release Date: {this.props.releaseDate}

Date: Tue, 19 Jun 2018 14:36:21 -0700 Subject: [PATCH 22/59] rental works; hide and how movies and customers works --- src/App.css | 9 +++++++++ src/App.js | 36 +++++++++++++++++++++++++++++------- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/App.css b/src/App.css index c5c6e8a68..893a0bce9 100644 --- a/src/App.css +++ b/src/App.css @@ -22,6 +22,15 @@ font-size: large; } +.show { + display: block +} + +.hide { + display: none; +} + + @keyframes App-logo-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } diff --git a/src/App.js b/src/App.js index 310006f01..f77068336 100644 --- a/src/App.js +++ b/src/App.js @@ -14,7 +14,9 @@ class App extends Component { this.state = { selectedMovie: '', selectedCustomer: '', - customerId: ',' + customerId: '', + hiddenMovies: 'hide', + hiddenCustomers: 'hide', }; } @@ -33,9 +35,9 @@ class App extends Component { }) } - addRental = (movie,customer) => { - const movieTitle = movie; - const customerId = customer; + addRental = () => { + const movieTitle = this.state.selectedMovie; + const customerId = this.state.customerId; const today = new Date() const dueDate = (new Date(today.setDate(today.getDate() + 7))).toISOString().slice(0,10) @@ -52,6 +54,20 @@ class App extends Component { }) } + rentalMovies = () => { + this.setState({ + hiddenMovies: 'show', + hiddenCustomers: 'hide', + }); + } + + rentalCustomer = () => { + this.setState({ + hiddenMovies: 'hide', + hiddenCustomers: 'show', + }); + } + render() { return (
@@ -59,11 +75,17 @@ class App extends Component {

Ada Movies

-
{this.state.selectedMovie}
-
{this.state.selectedCustomer}
-
+
Chosen Movie: {this.state.selectedMovie}
+
Chosen Customer: {this.state.selectedCustomer}
+ + + + +
+
+
From 729907e3073d5ac969dd1872436a67eeefd514f4 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 19 Jun 2018 14:43:26 -0700 Subject: [PATCH 23/59] adds button for search form --- src/App.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index bb16f78be..3d15363fa 100644 --- a/src/App.js +++ b/src/App.js @@ -17,6 +17,7 @@ class App extends Component { customerId: '', hiddenMovies: 'hide', hiddenCustomers: 'hide', + searchForm: 'hide' }; } @@ -58,6 +59,7 @@ class App extends Component { this.setState({ hiddenMovies: 'show', hiddenCustomers: 'hide', + searchForm: 'hide' }); } @@ -65,9 +67,18 @@ class App extends Component { this.setState({ hiddenMovies: 'hide', hiddenCustomers: 'show', + searchForm: 'hide' }); } + searchTmbd = () => { + this.setState({ + hiddenMovies: 'hide', + hiddenCustomers: 'hide', + searchForm: 'show' + }) + } + render() { return (
@@ -78,6 +89,7 @@ class App extends Component {
Chosen Movie: {this.state.selectedMovie}
Chosen Customer: {this.state.selectedCustomer}
+ @@ -87,7 +99,10 @@ class App extends Component {
- + +
+
+
); From c83dc8ff8d2924106d592992130b0cac9fd76eb9 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 19 Jun 2018 14:48:53 -0700 Subject: [PATCH 24/59] gets rid of comments --- src/components/Tmbd.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js index 630359580..8be59e449 100644 --- a/src/components/Tmbd.js +++ b/src/components/Tmbd.js @@ -10,7 +10,6 @@ class Tmbd extends Component { constructor(){ super(); this.state = { - // searchIsHidden: false, moviesAreHidden: true, movieHidden: true, movies: [] @@ -21,12 +20,10 @@ class Tmbd extends Component { const url = 'http://localhost:3000//movies?query='; axios.get(`${url}${search}`) .then((response) => { - // console.log(response.data); this.setState({ moviesAreHidden: false, movies: response.data }) - console.log(this.state.movies); }) .catch((error) => { console.log(error); @@ -54,7 +51,7 @@ class Tmbd extends Component {
- +
); From c68edf181fa1a6427838f5cda09d6ac9d84ff92c Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 19 Jun 2018 15:08:00 -0700 Subject: [PATCH 25/59] adds function to display status message based on state variable --- src/App.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 3d15363fa..ac716a5eb 100644 --- a/src/App.js +++ b/src/App.js @@ -17,7 +17,8 @@ class App extends Component { customerId: '', hiddenMovies: 'hide', hiddenCustomers: 'hide', - searchForm: 'hide' + searchForm: 'hide', + status: '' }; } @@ -79,6 +80,12 @@ class App extends Component { }) } + statusMessage = () => { + if (this.state.status !== ''){ + return

{this.state.status}

+ } + } + render() { return (
@@ -86,6 +93,9 @@ class App extends Component {

Ada Movies

+ + {this.statusMessage()} +
Chosen Movie: {this.state.selectedMovie}
Chosen Customer: {this.state.selectedCustomer}
From 12b1a6fb6d2fa47cf7a130efffb672150c61a899 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 19 Jun 2018 15:36:23 -0700 Subject: [PATCH 26/59] adds callbacks from tmbdMovie component to AppJs for posting to backend --- src/App.js | 18 +++++++++++++++--- src/components/ShowMovieResults.js | 6 ++++++ src/components/Tmbd.js | 15 ++++++++++----- src/components/TmbdMovie.js | 8 +++++--- 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/App.js b/src/App.js index ac716a5eb..391f1ad2b 100644 --- a/src/App.js +++ b/src/App.js @@ -48,10 +48,14 @@ class App extends Component { axios.post(url) .then((response) => { console.log(response); + this.setState({ + status: 'Movie Rental Processed!' + }); }) .catch((error) => { this.setState({ - message: error.message + // message: error.message + status: error.message }); }) } @@ -86,6 +90,12 @@ class App extends Component { } } + setMessageStatus = (status) => { + this.setState({ + status: status + }) + } + render() { return (
@@ -95,7 +105,7 @@ class App extends Component { {this.statusMessage()} - +
Chosen Movie: {this.state.selectedMovie}
Chosen Customer: {this.state.selectedCustomer}
@@ -112,7 +122,9 @@ class App extends Component {
- +
); diff --git a/src/components/ShowMovieResults.js b/src/components/ShowMovieResults.js index 0249bde91..b1e1218be 100644 --- a/src/components/ShowMovieResults.js +++ b/src/components/ShowMovieResults.js @@ -7,6 +7,10 @@ class ShowMovieResults extends Component { super(props); } + statusUpdate = (status) => { + this.props.tmbdStatusCallback(status); + } + renderMovies = () => { const movieList = this.props.movies.map((movie, index) => { return( @@ -17,6 +21,7 @@ class ShowMovieResults extends Component { releaseDate = { movie.release_date } poster = { movie.image_url} overview = { movie.overview } + statusCallback = { this.statusUpdate } /> ) }) @@ -36,6 +41,7 @@ class ShowMovieResults extends Component { ShowMovieResults.propTypes = { movies: PropTypes.array.isRequired, + tmbdStatusCallback: PropTypes.func.isRequired }; diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js index 8be59e449..521d6e707 100644 --- a/src/components/Tmbd.js +++ b/src/components/Tmbd.js @@ -1,5 +1,5 @@ import React, { Component } from 'react'; -// import PropTypes from 'prop-types'; +import PropTypes from 'prop-types'; import './Tmbd.css' import axios from 'axios'; import SearchTmbdForm from './SearchTmbdForm.js' @@ -35,6 +35,10 @@ class Tmbd extends Component { return 'show'; } + statusUpdate = (status) => { + this.props.statusCallback(status); + } + render(){ return(
@@ -47,15 +51,16 @@ class Tmbd extends Component {
- -
- -
); } } +Tmbd.propTypes = { + statusCallback: PropTypes.func.isRequired +} + export default Tmbd; diff --git a/src/components/TmbdMovie.js b/src/components/TmbdMovie.js index 10e02797e..8e39fd0b4 100644 --- a/src/components/TmbdMovie.js +++ b/src/components/TmbdMovie.js @@ -9,7 +9,6 @@ class TmbdMovie extends Component { onFormSubmit = (event) => { event.preventDefault(); - // console.log(this.props); const movieObj = { title: this.props.title, release_date: this.props.releaseDate, @@ -21,9 +20,11 @@ class TmbdMovie extends Component { axios.post('http://localhost:3000/movies/', movieObj) .then((response) => { console.log(response); + this.props.statusCallback('Movie posted!'); }) .catch((error) => { - console.log(error.message); + // console.log(error.message); + this.props.statusCallback(error.message); }); } @@ -46,7 +47,8 @@ TmbdMovie.propTypes = { title: PropTypes.string, releaseDate: PropTypes.string, poster: PropTypes.string, - overview: PropTypes.string + overview: PropTypes.string, + statusCallback: PropTypes.func }; From b6266f01cfd0a2a4f7eb8130929c17af513b7656 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 19 Jun 2018 15:40:26 -0700 Subject: [PATCH 27/59] adds timeout for status messages --- src/App.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 391f1ad2b..596fd6c0c 100644 --- a/src/App.js +++ b/src/App.js @@ -93,7 +93,14 @@ class App extends Component { setMessageStatus = (status) => { this.setState({ status: status - }) + }); + setTimeout(this.hideStatus, 2000); + } + + hideStatus = () => { + this.setState({ + status: '' + }); } render() { From 562d51ceb87ab6298537b885fcb41dae0ab85514 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Tue, 19 Jun 2018 15:50:55 -0700 Subject: [PATCH 28/59] basic page header styling --- src/App.css | 22 +++++++++++++++++++--- src/App.js | 36 ++++++++++++++++++++++++------------ 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/src/App.css b/src/App.css index 893a0bce9..c25e938e0 100644 --- a/src/App.css +++ b/src/App.css @@ -9,7 +9,7 @@ .App-header { background-color: #222; - height: 150px; + height: 50px; padding: 20px; color: white; } @@ -30,8 +30,24 @@ display: none; } +.navigation { + margin: 2em; +} + +.Rent-form { + margin: 2em; +} + +.Rent-form div:last-of-type { + padding-bottom: 1em; +} + +.tiles { + display: flex; + flex-direction: row; +} -@keyframes App-logo-spin { +/* @keyframes App-logo-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } -} +} */ diff --git a/src/App.js b/src/App.js index 3d15363fa..b04dc0ce1 100644 --- a/src/App.js +++ b/src/App.js @@ -17,7 +17,8 @@ class App extends Component { customerId: '', hiddenMovies: 'hide', hiddenCustomers: 'hide', - searchForm: 'hide' + searchForm: 'hide', + rentalFields: 'hide' }; } @@ -59,7 +60,8 @@ class App extends Component { this.setState({ hiddenMovies: 'show', hiddenCustomers: 'hide', - searchForm: 'hide' + searchForm: 'hide', + rentalFields: 'show' }); } @@ -67,7 +69,8 @@ class App extends Component { this.setState({ hiddenMovies: 'hide', hiddenCustomers: 'show', - searchForm: 'hide' + searchForm: 'hide', + rentalFields: 'show' }); } @@ -75,7 +78,8 @@ class App extends Component { this.setState({ hiddenMovies: 'hide', hiddenCustomers: 'hide', - searchForm: 'show' + searchForm: 'show', + rentalFields: 'hide' }) } @@ -84,26 +88,34 @@ class App extends Component {

Ada Movies

-
-
Chosen Movie: {this.state.selectedMovie}
-
Chosen Customer: {this.state.selectedCustomer}
- - - - +
+ + + + +
+ +
+ +
Chosen Movie: {this.state.selectedMovie}
+
Chosen Customer: {this.state.selectedCustomer}
+ +
+
+
-
+
); } From 2803466fa5306de51398901779e07e46713cb947 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 19 Jun 2018 15:51:49 -0700 Subject: [PATCH 29/59] adds function for default image --- src/App.js | 2 -- src/components/ShowMovieResults.js | 4 ++++ src/components/default-movie-1-3.jpg | Bin 0 -> 50923 bytes 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 src/components/default-movie-1-3.jpg diff --git a/src/App.js b/src/App.js index 596fd6c0c..2eb5b8d25 100644 --- a/src/App.js +++ b/src/App.js @@ -1,6 +1,4 @@ import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import logo from './logo.svg'; import axios from 'axios'; import RentalList from './components/RentalList'; import CustomerList from './components/CustomerList'; diff --git a/src/components/ShowMovieResults.js b/src/components/ShowMovieResults.js index b1e1218be..1d059855a 100644 --- a/src/components/ShowMovieResults.js +++ b/src/components/ShowMovieResults.js @@ -11,6 +11,10 @@ class ShowMovieResults extends Component { this.props.tmbdStatusCallback(status); } + // getImageUrl = () => { + // + // } + renderMovies = () => { const movieList = this.props.movies.map((movie, index) => { return( diff --git a/src/components/default-movie-1-3.jpg b/src/components/default-movie-1-3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e9ec6365b9c0010727ab6dbaec2b50527a769853 GIT binary patch literal 50923 zcmeFZ2UrtIwKj3r;KrQENV&x7X0gw^V3IM?A3gF5EQ#)fbfazxVULXSH#fz8EfcQy8b@?*&8PNU)BxL8$Q&Lb~y?F5| z?UgH6e#8Ia#OY@MH6__6(tD&N)PQr;B&5_Nr(XfJ#Acr(B_YCZU80~oPkw=nl;qqQ z_6&Z@0h}kc{T#_p020!3r02*kQ(YrFPj-%!*u`_CWap{LDSp1j|A2;4^O*yyV|Yg= zE#x|#Z=OIt!YQ%~D6B1dBkaRNt<*1Ug5Uz7La6iWs0@*IM}z-P{VjpNCGfWd{+7Vs68KvJe@ozR3H&XAza{Xu1pb!5pO(O7 zgI<1J>xS2+^G(kJAFvp)9$cuJ8zV=z% z&`0crw|i~*UO9&)hbPG_{qDq8QhL%FMWWScP=`yn>t|+%TyH+50i{vE-^KpFAdq7< z#d70>t}Sfh^WZSL%@-aRXU@U;sKN_`+C3wjOvlvWmuInz*Af38) zaKkt1&&(()2H{zGl*e+kE1GvmPfE*X$WWvJ-EMe`t*(4Ss^jsrXNbQ3EH4OK2FFrt z{9($Z+c^lvP?M-!_(U)3SSF@6knDAoU>e%frKx&7sxkOwwu>DfjZx>OAC=WJ?3I?l z$QCw#xtyv2Ib1FeF_OIy`-fXWM!`1B9U66lS;%pP!hVu@2k^14=8B4!MdKW-fD;S5Co3ZhAgwks zFVdfUx@c(Ir3m;Bq(t(_3kkT#*s1PRFMNh~~Lz-2OZmLrWF?fhHFdMcoFSH(5aXlbfBz)b7dk`Tu88 zk!S*eKz{kY%=gB;{pRhi!7a(;brNVj&1-C?^7B~xZCc9YbvUK~rt}DmYZ+*u=_(KU zJVp8$0JzzVi!rb4&H^?8X~lTtGGlW_$cs^xPcNvyY_cj+2y5@CZ5A_n$<>R>F~Cxk z0RS?LwdJCQT?kkJn3hzp(sa9mDekj}i=1;`lzl3WY8+iX*mI@0-D)}3JF6~$DfaweG^0C4Skd}mz)tb6<| zc1AAf8=MvIjXjXHd+{T-LN-dMV9V#&wIeQ5r>9%GGpk-^&#Auw04j0JagqBjam#Xw zt+P$6X!=zy@S-rF?>iN0+Yev?hDml~RyR2+j{{qH7XN|&3-~Vp5~&A!{)glTvR*%8 z_Cwq);`|ugnw=~Sh0AP)`Eq<`a4)X%(6;iEUGDRr#sGlF2Q~*(t_7k!zJ%|&|4OG* zm~8^9VeK{fBABSUCXFnEPE4=LJzlhYFU@A~c&{U3;1u9JCiDpaNPd4L=k?0#mh=xv z{VVCS@85^v0I@!-h-2BW{~Yo840%I!^tjllPqep?(jEY~?Im(dPUufqlpX$_dsgC~ z!7@H<9m-K8z5ZF@1%QNq`s#A&m8y~Q&*q=cN>S&eds-?j`&8P~KLr3Zo_MoLS5>@Y zkv+@%BS1-vXp0<+@2#W_gdR=(qBM3^=`y?B$zbjh!{Pv$7;#QWCwRXySZdjRZ~Hy> zti(TqP|M>zY{Vdo+ZdZH01&(JW@nh;WBG-(#ygnEIB#>Z@Zo( z$hN&WtH;Kq5S3e2MFRtdBoT)1Acji3WQErL>NG&wYUq7h#@LRJr(s$z^3Kq>&#%4w|yM)4o28aiq$BcH#@&pLS;Tv{2+Ce z$!uWOUTt6iZ*DOlwUE8+23RL{;R1_V<%66Z^Mh}q_WvrKv+wlg>7G!f<i5L2 zJDS5eE?dK?S<&RY-6qVLLmtcksbr`*%fPi`$SDB8{KKRSozM&&Yw8et74o8gr4FE0 z?f$j^clWglOM`{Pm{GS8`SFC{~ z_Z`-e(El_3|1P%D@2Z650)Y2zqoHG_HZXB7vH@~6yxu)LwbrP}rFJ>_gTVLR`&_X; z7ERkUN3!leNNs5A@^;42fH@Q-UtprDK1yAa@7Zi55iFRWrm+N$am!5E^5m1;OABR~@&Y zrbG(@_|1X@ye)gc1*T9^A3ll4t*Cmxr+54BYp1;vk6bmE6;B-R-CjFea>!{!PXRW) zJ5<}t=NSL&@~i6p=+O4nC)Zs2o1e~zky&9_=(RkIR)@%=0RWmV7XQ#scIgz~&hq{U zoFg7JQ&p;aOJ?q*odU#fTq6zyahG%<;S^A`NOU}Re6Rdj-+}%9hvVW0eUiN;m;26$ zofGZ~4d#@}-CZG7A$E7+>Q}`+(GJqNv%Eh7B!CwH@=o+N_sdg2L%F@KzYz`pp|$QQ zK9yLmO!i=p=k4c&vxg5B#@OBi05JkmDj#&oM|qUMi#t2Hk?x z+%ZmFK*5qUYlUEkJu2QYFgV3@x?B)V;Jtstt%*> zy2_x z#u8~^{X+bIakU$SBJ)CBRseaWC=?1<_yf!4@Nrc5}sT& z`f-#)9l|R_oIxz=%opW5P%&U+csnucZBUda~4hP zpiT4a-vk@bqBU}chEWpA`;vWEMMW!bq%Tjc{&Ih4XQ@4H<8X zLA}UGxn^c|Cux()l9nhE5=P%@xoo(8Vz#yO=2seQ82RjuFW;--u;cI``M<0fzpFk5 zS*TC|c^D2B?N+K;sws-t;Ic@CI|w>NEBOf%Z%NPll4 zOEgQ{6ccPq4D%#gXTtwO@PZg^V>7{(t~xG%@JGPa15af z;vX6o^m!ML?8#Lz#`^lF2tY?=3GfY^Oi}iD=9pA6N&B2{+X>7TX>CUepHpE?~`obsPt} zC%=&QS>Zh~bYnV$!`u4O$FkxU=RSr&NyWZXf4j|;t%BnUlbA-!LFd_q-=N6j|2w-k zqi7kXE)UI9K;qjA_s=9i@@vZ}V9@#am6wO?8=?=T*lG98sywcukZS0=fd1u!JPyMG z)bcP{Wh8q}loRullfm~(Op8P0*58TIFDTYVCifohl4QL2t7>D{nG&)fm3aziRrvQQ z@P#x>m;f)uRIz{`WxU`C7o7F7K_5`-Vs zgk6=TB96{qQ$sR+5i}*k@+%pEyE;lpMe(Nz*;&SRpj59?`^ipO5lHJz8%-eB;L9x? zR=(cnEETZnN)`+F$rMG@zFl4aKqa1J+FNgZ$0c_~cD;AD3CImE?2yQ}%L@^~V?xzh ztSy_-es=i4(j0uvGoH!f*TrhT}a5#&*JNRRo%N4ayc48|k^XpeJ5am4gyTUz--vIHQNfYj>#ia> zN2&Q&*pUPR=0ss_veOVC1cVZy1_sCa?)}w8;%wCZ4gOpJrs7xCgY*h4)F4z*rFPZ|sAJQG6=Ain8km>9 zhchGHlg=y-LoYV%;OnKKB`dP-#W=TN#Ua;QZdO~vEx|@MA4kK)SmQEdPXU<9G4fEb znx>-UJT~nqI@r~)&OX(bc!c`rqMKfp81%=a$gaFnohf}{U!buFH+9%V2>WKB&O zWL@S_eAWTuZT134o!BfJifZmM)n66a$z{kq44I-x@PGw(dDS^mOcsvxVS2RHLnfd@ zkb~G;^uxP%^m(XDu@r7*3@+tMwu^m9bfUoiPI*!t;#mB(LA=}p#R;q;U&fo(Cixer zCS5NGYKO`_VHc8vv+2eP6C=*&Zn3;4k|$5fydI0?!8n`PW74&8E9!J|+rw4Jz)Z}X z@6A8EyT6?+U06d!n$sbCJvF1%RNW{qAn4_IwP)N!2ctE+|o2&Pz`1ylG~UJ*)MRy$GDUNe6v$nYgzvNz zO2gJOIB+M&pDlm+s}a)wznu&8y$#^d1Sm@j>?guYy;Ce6Z`_K{Dcd!J*t z%!}2Rd$esof(SHG=8`g9LEA4Pz7P1nekcsQb_qn~Tr#~fqO5Nufu^{->_39#K#@lh zeHg>!;net%MU|ldP1RXx_S}BC?Hc<9aTs$ZL+lwLsGK}hpIQW)`O}I`X`O4i%Kb~_ zYS(W6gcoD%F~*h?GXYh9$w7Q+HQy6nii!fC_k-2FF`kyaKL#Kvc#6pQ(!yYAW(;i? zHDPmHDG&H&^~oUVj;x5nf_$E)D27APA=MV-WiUm$+bW+`1CpLBC7EUIo`_;`7zS*H z!Pk|E%l?aX*uuk7VY8xOJyukMg(EM^yxmo6@?a=bQ}2EhRExWykrpTL#e*$^IWEMB-n%05pK8zwD=Y$yUVO z>T(q86JyNkWiM0%b<9e{=0IzpF4*sW5sNN7Zf@30jXNaJt@pZA*2`4ivM2CIgY*Kk zN)=n<(dXsrj(JZ3KS_=JzDOu0ajg9>S31;lCgg|Y4hW6pc(2ytOJ(XAz5$8~%b_NW zIUb$wXRZ4?&*V$@2pE_ zd)hngywt^OKujRk{`N;XMUK>1zHU;j->vkc3#_=h+Ozf~)A**BF(nt8bcb*OHWPTz*EbM*K@__DBF>PPdbk7Gu82)D%UNqN%x zA5!=+@+!1+6zY@}5*VDY`MBbhUhOR3wOcfI;yX3Wit8Sc508}U+^aI&9(Ozi?0+Vg z{V|arVK3Xv)IIVy1qEd~af9~6PM=svW|vPsrz5C-&Ti-fW1>KDf4T`ruMuc0$K zNsWF)L5ZeaNfjS#73Y5DU&WL&xRsVFKD^g%0M;g#lIpgC*+Hkpe;_`CJ zFks^m&)zFZi(T3K@0z@Cwe}x>yLww-)L*dZ??V6kML;6pr!Qak`DVdU+sccbj{a;R zbw#cAM>L(j%OBs9?GkS5T*H4Vgr_;7_N?)egVAU9n^2uo{Rm}29 z9?b{0U$NJOFAvO{WfkVP7|E+QmOk&-!ZDWV9fs%hO;$S?uqZOEgw@40y7AM5@GhZT z>*C(ts}f1Pc#EF=(}In3r0K4?4kv>V?2f9C6NEP+OvyBYPLeLo5K~$!HG&QzMe~{4 z_I{ae9t{$5u!60khJETwd}0YBHGHb40D}~#TP7}_Lg{JXucIP_fhTfg_H}>U!jO8tm zfDz1VobGW^m#agO8E|pCX;>9~h1Fi?`m^P-t%9#wlWt8t*b)cz{4lsB(;F6p+qet6 z9K-rWAptQ-_j@YhO$H~Dg_;s=A9V%#FW;T#jteme)3b^q6i8l%-ij-?I;3OMFH_?% zYUs66FM%}8+6*TOtAG9MAlbbN!`F=np~V`a?=?5gQ7{`sIXY;7(+)uC!LW`>!^LABFQdi&j-tQU_CCUYF-Hu~Sc>>8}` z>W%Su@3g2M_K1AK4wUX_Qa1Zbz?*AHc>Ubqki>iT=9}K+^!zo~b@nF>S7YD|JcQei z?s(Ovf|RvAS&#Euw@koh0_&K57;m7lIlO!2u;lp+0;)-^Ug^^>126K7QF9dbwhwt- zeDiLKdK;Nj5UIg9jldm)EvvO^4;C%8JgcucoOS2*YgR7?WL>t0Y5Zf7X#CqG3H?4v z%n0b17<8bsT6b8m_v#gfh7dCOZKrNtrzj*Md8J>3JCCU*dX(ZzUU$fAqjB1H2=dq0 zd(Rqe4{}&D-i8LqL2LY^r{31xTgy>n6dPYX6gma`#;LCIOe+W}-IZ;2eFrwZM?r7) zgUXkr1dm<3+P-r)nJ+fl;ANTN-Tk!Hw%xxgrFXP*96sW=7^RR0F&s;-Z+fVEQ*{R) z#RYD3Q?8HY<*)N&OwsstqQ%UUQD`!#k~3j_z1{CZyn{hFf0-(y*sKI9 z5oPSTsDUTYS9;KfsJh*&Ce7uES;xlKQCznZ90Sw%i8WIHqft-3^HsS2zM2`9Doui9n|Am!3R(SZGTEv&WsB0uNE^ z8boB}<6OCf?sk7HZcdCckRZH@3&z5HWFp!P&y0|>~NP)}fdYqd6Jfbku*xMR>Fm`am7yF8f4 zc9L;%$bD`WV0k!?wOcai3O@XEisKV>bbF^j0!%nJHFjrDz=auEoH-qg zPvO?;k}bKNKWHAFv^VE zVIAC*tCVqJCKbWnH|$InpE_Xx|viNl`031%%n30{C6a1C!%U2-5S+ z*(V;}b-&q&XY(nG1uMwn{pCZJe=7XuOh@nwqqD_JULuPp^3_K*BRkAz1ZK~yNdZUn z{)G1ECNTBuQW`B)sdlF(_q^fkM@ul5@yPI+QytZk{nx$R82e7a8mx%dNc4URP*dXy zesD*vv<7o+-cVx$#elF4UCXq*58U{8;n(`>G-POBOxaa5rxxus}AS*QpUL zW)s?T%xO_`HgMSXqgT-}Z~e09^`e{UkUCR!tHcH|{;HgjYX7nFNW7hDZ7}w_VD!pd zz!w)~Epevz|1&S>9NVnqCR4o6n^OQD%!KEYNILEqn_-sMBaF9JKdCQnx!G#?5DtBH zPlZ)ccHq~H5`0tX*L3U=ZH}vw{|Xq}86#--wfNp*qruwB*DVQ)YMj{RG*c2K_sLn> zQj1H5YN!Z$4=RZ+C@!nu%c5qEoFfN=u@#X2(3x*z(G4tYV_S9=-Lgka8Naa zEXW|*@5W#+mH?wg@vzPmxU@wht=r>ydGnuU(T9HnSJNx$XkLmiO>#^#F)4Y94S{i7 zW4~A?{&q|AzEG_|TJ&_MqZl@kRd2*%M$dXrT1mjgI8!Cj2BxUtWNPOJW96lq{@L1! zSyE!T&iM*lJaY0BpqVx_k8i|OpO`!BVx31iU7BElSyDY0?%G}Nj|TZ0^i+tO7}7!x zvK_4<1Fy00z{wlkccEY?@R#Vkaqd0MWh}0{O7D`xa81{Sh@89uf$lOb!Qeim*~TKf zw+aGfy0(y1G_K-OtYvUFIb0L=h)GQ-0LMhzte6MJ2AZJmCEh6s2zdK!L53yA9g*B( z2!>Dh+(@ZZG%^9jr=uaGJD<+9HXB_rt`sn*dg>9z! zIM&_U01c1Ken6WhnHQhMY5@6j0Gt`m~+r(x$l7g3p^1 z`aOflrQtOh(y6kWruq)kGb1C@5>J0|Fh>}Q(BG>XjcjzgF<-~xNOXC}fT79g9dF&^ zS&oGjF2~VXsmDjXO(8g$rs&W&n^dUkCO4TcQIT8H)PzPyZyGM+(cv1xAfazO(4?Ig z2BQ*`{5iQ;1E{IqudDIl>WT9)$4O!6f)8;;FP@iKEm-MB^a^qJMq6*wy)AYP6>wv_ zt}~~nx}c0!=&EU=5myRZNR%YhXVnBQNo6DG;fbKP%yjN%kj`Miuen8pjM@eV6hRkm znugb`@5jJDxGaU$4`*g(g0ZpKdr3-=ZlPBG><+2xU2$ayH=-&-s_oJ2?3Fb zd^IV#)kzpHXja?>i^+%!G%k<9#7k95U({~)$uo(`%k1g?B4Q3C-B9wp8^!)1eTRMhUP{> zjF+_^x8;W@q@p$%6Bs*!o1BKwe$IDv3DD9KOwYWZY^%$%Y@=>pZfBgJd8I5k7H^pJWO9aXX1JVw`cbw>>EU#1NQ>2LI4|r%T1L8W z32TK;;#(^RgMh%?i}4aft-jfPxm>6POie#+>o_aWB=JPys6Tcg1>vD-7T8xm=_kr} zNpn*~-kZgybmYUe3Nvk)O?s)tEk`WT0l_4CwU9o==fdWX!##VWb2Q4H&aF9n39Y9) zKT*I2Pg6f76lOZ44vn<_9+J+T7G3$2DcJnhk^gwj1}1; z)t5jymlZBNx7ET#7|rWYwGa(V;VQwF7cA6hlZDg6f-=4hO~zn^tCc6-zc1m*3F3bs zZ~rpy*;-U^!g^Plw$xspK|)q9JGt>N!gxmT#(0p9i+{837mh33(wTz)(Br!YDMZ(Z z9jS4+beL9dJ~KZP#MNQ0!6|)X4ZF8Ia%oKZ0->>5Xz=iaT13oI%ywmcElJ0EHW+s0 z#`A&67E{lQZY6o0ez~Qz?=#jG7Ib+|G`^UHFdc~&yDPFeRMXa7RzE;f#%Z9EIsJ)u zlmA0egTE^({=1?!Ot)IF0L&TG4x2P6_jvP@2~{VTruH?+qw-hm+)RpHi|y;qSHJg! zHM?PA$9oyP+X$WoewkT8kfp<-R@W3EpBhdnYxEnwO;-u`mf%xt&)P)(@@HOE~&9*n4HykN3v7pBU$+5&s0r zkhPCMSSbbS23`i(HY-4P+sK~ zm$~RCzAy8#xY%7G?NePfn2~>u+9K|mOkMF(Ib+t16N3~NF5yj~=A9t@?S10qBB}!{ zxrF@t@VG9)$HA(u#)jJFSup{O*$XL72#~ow_MZFDw6mOv+S45_T^@O+hvL`+WU1>! zU@Y;mmO{nLv@q~DuII6eoiwXXDhU;-J#dkv&Yt1)>D(TSfel`jz{HhiWyF}(>A^TW zJ?SXcG_zDgh*iK?Il^X^%PjPtM}Bhn@dL?!^2YuP$E%INz!tu36QV8hI0;H>#L&*z zD{Kk}f%q=+-OR|{YXfuH$}C9q2g^4)PFb&eHHMoIY_OhAD~=PhV3`ZI9M^1|Y)vBf z3J_mYK?7TrcGY;HC8tXd3&LlEc|Q%KA|gvVtJl109OPYpZ9lo7za$1+R%kd$6O1n& zABu(N$9Sq}O7R?&7DW%rgB`NNSkux1wt?3OzF~6R9*O00s_JfUEhr$Z)Nk>Yi3lcb zhnASPEzq)pVeB-dw|6aN zzr#-Ogm9vqh(27|FBsY^V2l)3sE+}fG^0|%!cE%5UVUNqQPIq@4;Lm~g zU$wPFTx3lu7{b!KMh_-z_82y4p|+(Oi4mAEpl-$0iXf4T2@XSwzvz}5ou|>Re~@SQ z6;HbyqnR2gW@36Tk1bFnjm-p1j>}dhou zZdo1I@hwY~ar)5AG;<_PLViTgP^d-n=7^Qu#nkM~-30Y#F??23uj!8mtgua1Si3=i zjKGf?Cq13{6SX#c+HK6YIVeY*d;gTuml^7X`<%N*LgJX*-2A9!24{yG11yvZ74( zl}j7aGczNW)1!#*@=~$Zoc{h_ZXmJoD03vNF5X*16_27GK?m#DHy2dk7N)8i)UJJe zBAS^Q5+*4qo`SDIPz7u7;;O8e;|ufk=PS(kMp_;nOewZ1wgw-!JhCt}b<^E*}qt>#i z86;+8d0Jv&2rnn{f~bbS<6CKV<|ZBjN2j`P(yyg*4s1=ktmB2PL$;>{m%09Nxdy@ZRG>y$y=$l?CbKV06Ra(v{8;mz z0=Nr@qvof1-}AWV!^b9=@L)i+ps?*-0`y*^H` z=!vw0^a?YDSd38=ELa#^pfcE|!q=^BmWYe{*(627GAlC!GpwqKF|6;-aeW|)X)oC_ z=zKIA-TNA>J{qwY-yTe@-LMM1|0@1|V5^I2*QY%d9;ic?3VE{;J?~X3hrSSP>`Ja& z0dkayM!idt?!LrCc1ZYC`NKx~SGFo4(9%b`U2qAcsiO$$ydkHtAwH{Hl`a6%ID~`Z zzhqkT7^Y5{s7^E+ac}APH9345il5b6iR{#b3I~-=`=ts8A7*_mku*-B?G|cQb&}#j zfdT@$@51KZr27!vm6f91G(s2eVZ^aWYr`IjJ2!@BUy*NcqZ`vvI&2eg3#Bs@uGEl< zO%<;X2)Qx-*#V~C3u#`A@uHQdt>MSsM2zp`lx=!jEz4BSSAsu+97hF^74~5*_lY-Q zdmACx>h?R} zx&o=QRcS^0IF*RM3DaKLLwxEI;8JVjxLYI{_3Fv_VwkJGt7zQ``71}N`|FC;Z>HQbZFbP|e*m8v{W_EJ0 zl4+Pz3qwb*gy#g_NCmXqwPC9-$e3Lu{{}n7w5R-ffs3Ib*WAI>W_>uIKV!6+cTG2T zKIgW-p$wrnN)n7mxs*wINf>)y!!1`7;eHK)FlR; z_%%C0ZxcKa=pT}5J`!}7bD+}TYI974`pNE!Pg|C&)18xlw_TlYhCs;KHl~0 zJMp+CWf!M#$Ed0(Jg>#>fx+$PS-W?=99y8ao|`sKtNW}uwmeq2EY7qrpg8<>mCLfS zQj|2lKWPKLGjBh2|G;%uLc(ld>|%ABmI$v_lK|G6y7;DUuS2TDd8me>^Tna!{WdL8 z;f={`=vJ%Zqs)D2b5^d&@ZM_^gwmAxIOK$eB78_-?5e6jy$RQ=E-j=JCxXETqzLEK!Hirb7?ympY# zsKDDcLxn}<#sPEelG0pK>6F|YJ{+6-3t|(*j{^10Ps8qEEeA8W5ydSsB=bI>-_?K2 zYKA&!jdfRzTs^n3k*j$5X)T{p-SvkdT(L{8n_P(^pN=A5aX;k}R5!*=6OcZ&2JqDM z0Q(Vzk8KKBQ6koG-i@ty-}G~c)+pHz{%;YW(iC`6hfa2+b|7U3h@O%)0~Jg|X8nZ! z##dDdN?AosI@x~z5n|U&(ZzEQVjcQwwHCjx@pYq3%<}{OFh7mJ3}j#%bL*Ai+$*(5q>lzMm#pdiDu6da7oLAyb3 z6@}8+7e<@{me4Ey$q9yi&!x0S8mx4hl5Nz?^5NVO&%7!sT(}qzxl!Q~K$n)8hqYPy zQyN-1-ju|*eWX33JYO8JhIH;I{@2v#5$xzXwA<(~N*E{L6R%_%t%xMIM~-u-QY@EMgHOQsz4we9AqOu@GA%&Z*ili9i|GUp}|6opyGKJ z#A|0#)m&A)CXEZ&y;0ScgSi`7c?A!LbE=mo<>jk^3TyNXHy60xg4(%TO=5cGCN+)~ z;n&hX=Hj45Sie*_Xb?yI~|@pxM|K!jNPl zcqgxf4YQ*3c8_DAOYj2!d_!fInC+BJch-rSLN7l-q4MB0zN6f(VIW&QPj||h{MqZo z41;hCINAzqT*1NK@HA*gZ6HB3e&|Vn5061MvMASV)5$QHe&=>tR3C|f`^-`AfR9h7 zH~J}Ly25nZbDS;So%jkRHxdJVGdXBcGfsoI94nEKW-`&mfO^r!~z9%qhQ8YmR8Vz+0$vvL@7 z*2P)_ET*ecSe z0>`Vu!}Ckg7sYMq;B{%nFK>@HVsm=M-RQgO=){{|vUh6*J9o;NNc;>6a)xQs)(Xs> zgj#k<7==A|>^Wq|gGzH2!SuiMbFs@2BY)J;Y&mNi=(s{^oOR9Wbv))%)6+GZ8ky^R zh*H@fTIGKr|BJoo*&#rw47Oj%`I3T_O;}C2;~J%{$V{)E?%N(t>^c8or(gZMon}6>)1!tSB5_IN zPb%^P>J<(KI7e$k!&t*_Z)t|JB<5!eKiZA&OpRNV)&1Euur5nSVO+BK=e>s#7Ugc# zpmxi3eN7h*&ccj%bYQpUib_LwH8O5@xAYe?hMz9Rv>7jb4Z7PGyJQN})@~khqYt3f z#G;wSD(xN@G;wx9J|J`p!OEoH7Qw3$gow<^I;3PGFze00H@?@Bi*i~m&}ukl*EM5m zexh8}OV)*(dh%2{$ZG0ed4G!v|u^Ez(nrxV9_P!X6!!_b+$F zB*~{WeUf5Piph-aO||)gExwRGxa1j7)091K3m@cNu|Nb)f%7Ft)h+hL`E(8ngdu{+ z2wpHBD>mW20FH@9LXS-emgT$OZ2L?Oj5}=NaexVX%Lva1E`u0m)iyc3ci=3&tdjZC zPIfCA-%p^1wuF`{p=>eVB96Ia_pEKgWY230Nd4b>zMrz2*Vz4Qnl zDiGoYx_op)9ZlsG@#SG!Uh)B5l4oox~H(fkWMpv6uzOi9p^w)ceWyH^klMt6|q>Xu$)lv@l_qga8oEUp84ZAw2 z`)lQe7h9=XCgn$mh$0fprg*dla0!CK>nn<|+rpp3si~P8{n;Gx_f7%Q8+>Y13d$d? ztM89X25>O2dcJU#pJh(c+2{N3Adr+ZpPb7vDWlQBex*%bE?_K!O73dd2n==TJ;T*d$>MtuBMjR;8xx6pGP;JJ?>M(r`B( zXJ;v)!H_YRsa&g1`Xan!NE;Z$gjx`9n^g!FgF+N`x6NAdq5@FqH+<$?W+O#nJ(irA zT$T$N)@lgdTy42skT9@C)xH||0E(S|YtDX=w_Sf+_3NsMpi9*J4pNaI*vDxFN{;10 z=+#5fkJi??ZuftK{o*xPX;3-Imw@+hm5DUQ9<;QWIXWj3M5p5Ct*pCvbQZIt+;~*) zu};j^u~Abm8}oufQ)dKg_%6>SLic@i8 z|2*36qIj8d;&V)1Lv6yvsCMAjuM3g!T=Ag5G<}IT5eQnHVvr8vzUowhOWMmk^-q{4&xVElFN#7N#GmLe z;?&BzT36I&Q?*|kW9xHs!6Ms7Z1D}O8DURCiYVJpJKyC4v-ywQ3x%6N1mr1(kMZ%TCeO@Ma4O__wtgDC~oeQ~Q@ zpp5-}<)Vi1&V1%WoA4&{X>ZD6t-*b-5xuHgAymiBuC90yl$ddeNxKX?Cdu(Q&{+5( z=%1DWfwN`6e)B48_V5al-bKkOd#LHY^r(`-bREa|lR6oWHEm+ly36Ip9^AxF>Kykb zH^<)2aZFm22}@JKN-i=qj91q#VdbX!%!y7{h@w^x+jWsH@Z*H`#vUx;GT0ckF*XIM zvFGe3&^-_QzWE(A+CNfXU+Br_Z5eC20H94Q6S+wcZpFNmU_D4k(*~vp%lH z9^(aL2a|wXT#kf1R7jH5OS%8~-DheR@zL0&&Lf%Q#@OWs_pa5I7>cuF%F!z>^nUW) zL*>Vn@SP-?nRpXWFVC>VhgLPahM+KKkwf!9Y4uU=CIg!>g*_glar)rufWVy4WA-#I zM97fJ&xyG4;n=yJb_`}QXM0Vv6Sob!*kJOK95k_iCrtCLEw7<4L=COl48E}?p307? zMj1SA&@qo;pXL(LPOo}~>!?xBm6IC{%dSV>6+BBTzC*MSK?8lPv!3-;e8+hQ2%8-;e8)gb5nGT0$$c&rntd zu5VmQzvWbKl{!JKG-0nI;T8AYiUazsDwyh%U#oVfTp#M}{5I3nuc`QCZpvzYVSXeV zp&!`578dj}HFYd=3bI9I7~m(Vs!{G;XqBh{X)OXtTy8_43oYoM4^o*z!$l~uhQk5e ze8@DYVL(t^$Of+@@E%w=t`TbM;9nb^#g&vgEd~{XyxSB(PhI{Xd-!_yp60_^oMHV< z!8@5T&SGrD!!5_{pJq~9oLi}{5Mt(1`LWO140OA6v!Aqf<5QmxpQlf=v~kL5^Cf&z4n^kM&@N;qAWLPe;nL08J zh3E$81={n|hoz!wMvx9P_~5yAIp;<+SDu8e283sy+RML1N@s?Hg?XFOl z8!H>l+G!D}ZiA`$54-Zj_lf-9_Hz7l;!sHayiz^v(k`e;-a}ks;lgwVCiIQVQ|6CI zxzys+E1AB6$<2i5puHJdwQ=-`H`u?*Jy7FUeMTR+ z7>~Z$Q#sVTfiyF?TMTVsp02(p)eC=Z$gFIt(20_|qLhu~kZ&|EC>C33BRqn>!&Skh z4#50h-uvx$dNvxB$G_RG4_OLLVmOTWhX=hVT)B18=vipbhoI;U#%l8ff1RADV)3z^+W6v!X_=3X(> zLF2OV{B#UwDtsa~SVdgN#WQdi@58M^lxyIU%r8i+$*rkZOxuceehn2kLzqZhH zVrb&}YFSI>dOqqRl5Hgri9GoHp%G}8opx6zC`(UDD1g8X$F#$@v%W6T`R5|L^iwS( z_2^LD4iE{Jh;4)hqP!Gz$g>l5+e5SC8&tUwSq}@&m)m8FIIm7yll2wrXFMIa+)6`b z^Rb2y7A(-c4ND|fslN`d)w6Z#_3ZoTxcf(L3@zF?gY@90ay5C~VEn52#=2eJvE45j%zBPu=E+Hxi5*?* z@?P{|yl)onOBkhK5LDK-(e3xOo)|D(Ghqd*XS;0D(AGTN;r}1(y?0cT>DvG6-ZPGl zjX^-9I)d~j-GIOzY0`xhq>q#!L0STd6mi>7f`I{~BoL4mLIOcb2qBa~q&F#{7ZnnE zk>2O`sPEb{`>glfzq8Kotn=65FV>TX#q->`%XMG(_xrhag0g=_a|?IM?+A|x>3)XK z@XzCF2Q1>`Ojoy}xTCcb>)-#sm^KzHZ57pyiRfht@rPWkSwVil`FbKKl#Snd>@W7| zSvCS`@`d2yKSxg6*P(MZ?(5hI{nVS8oE(7pWt?Y_xzqjoVVc{k2)F*Qn!K``E!kaK zn0Cqdmma=%>_J`504I1%KIiu@x4mpEIO_TAbMWT@PVJWioUX_}4{%s1b&Ms~zWjqe zOD{(bD5Q9 zdBn!b4%#47IfV_#Hq1WSv#hn%xhS!eL~Ngj-ex&YTVG(R`X=J|Ymi^3Oow)iG&Y+& zcrJ7LpvS)p?>aX){Z+_{bD0! zxtt$=;dVw*G!4Dz@7sfZKo9^un9YV0@=xC6!lWy)1ux;eDcVYxI{o|iA53a;MxRmG z9=Pov%#b;RWDo-XO+PPnv@#T3 zfQ5UAB@mby9Os_oh_bbWRyXg};>QPqAB7zXK&}=I+S?$wb~q-KH5BMh_bYh^ed@+*l+zhm9v&qnE!$26Zf$K=0V4zhbvkX2b7oC)tj~uW-LW*`_erv> zQ=$|!abFDgR-sugRjvMc<&Hi%ITbxkLq0xPRs*IYeBT@0I19DxQhVQL3BG8OUwH7~ zm~Ac6(U33*_EiZ5t2p})u%=Z9Eu^Yq5#&#lQPB?M+vZTaJki0io3K> z;gMsVAT|{rJ%n3pia}_us5&kQ48zv_vx+EKVai_G1IwT4PftW&iH(TQ0f$u5`eAuvnZG z)-$jCnZOKR{_fg#VQ9jfSKD?tuHxa}rWIsomWLjkV^2vX!8L-zvjlf3Y@T=kt;m5AXBR&&9oc?qPQX%?A zlYbmbf?=|zMh|kPPW;E~<}K@nZ9-*AZtB;Wu?<0Gjkac%EtdjwGvZ4@rFu}|(h@S| z1uIYrb@~;Xf3?HBTan?yXU}hm7^wK(>-SSDT{B8t#r7oRp}uoDY<&K5rM_7Sx!qW21LU8wZgcwTZema-~P?8?x9@>&VECNH4cVbq4rrIZ2PyrI_ zaG_Zd=LNY)lOM{I$nkU!3IJV->SCf(6j3Kr-`2$#q;ksma5btWZvGCEpkdB!Wo8)1 zSiv5H4g*a!qE{7CUsQ`4U#l^iPucO|6_42m}2qE-I&!^<-OUThOdMz zCYT&zCH(2=Pn>!?EpNSMQH{ILI`UOwP>rs52c%sC4*^*d2O6TRaozLGSx{e$S2Wad z8b(tJ7fo~IQry{w%UEu7lV{D%#5N*$tiGvkgikPvs2DIwOh`;s0`9p%tZ!=@LZkcAkB?B_r`F+-SzY3bIakiZ7qI6h?(1Sff^^q=2Ky3{-V&zF@N`f~vzWrDo|cQps9LRwyaFt55elDIp0J{@COs?N z*-7~Bcg<%n2}Betr>0V78s-^B&<`gs5i{KC;8q~|d(MK3%S46l7@rxif+#_XqRW%~ z?5PsINy1nz>DnD^mg!{|jWImF!L&yOZwp0#l8Yu9$U!WWQxKl^X~Ct_tOW@#h;sP2 zZ=ngjKoUUfxDUN>q#f1@{c()UuK1~lv)l+YiF&bT6&%Qcp0p=Q#crks*L~POUO`!K zTg546oHqPEN!?$w)P1RiF!O8blJmJmoUPRuJn(&HW;Uhh4)4oPdE$SaCd9u^6P@3t ziHyH|^6i8Fe7$DCMY+GFSZmI!6*BsgXq zBGtJfcs`6OCr6!=d0iA;*26a0k-r?~-rOh&r2&DCfZ%ZhiNM~&)TXPbH2u5q$aaUS zC3u+^i$2k9qnkV#n3F}OU>$vQcK$f_Bfmd_DNG(D>55_zidaI@JPKE4?V@e@O{Q_5i;h%jmob4dxu34S!&n&2qacTPGA1O;c zRgj8bfC5_h^t%-Ni$UQFFMlil??a{k|LXr2EpS|K=6KOwR{W+KONA4@@=wRh`FROC z0pI6jo@hT0YOmAaL9^W|l&04PmYtf&eKp_drLp{H&ZJ*|GW1{iOQzkvJhUaW(D~$G{YO zJ!pD(zNF#obMdgo3p@8c&IIl1G9%qt)y}BcixC5|$+YL2G3nWos{Xma2-k zdj^cfUSK`iJpU`JlGN`m!3?`uNn}Rk*$2-*|G^hzMHHTK&*v(m!s;IqyJNSKvCw98 z!tj|udL>}psGN?V&bBz@NFp*`-lB2^Da89Bsv5$794kc6+1*tSxfg3}JYFz8f4lNw zGF*>`**cOrzw>f)_NaBrVs}!liYB5(vTHPL2T5Z0jRv(YP*#_B9le2&a9?t0=h zm6TwhRsmCOnK9Zs9i}-OgQa8SMivDh1wvf${zxq}y6t<^*OybNz17h#)UN1QW?T}K zQw1)~!Zixqo{{G9c(X4J5&*V_Y5%n~w5s}45p;dQ zUbT*xQQz|G>md46P4CCmvp2Q1db_nHkDF{L*r>BvWzCXc8bVn%HL(;{z;tf3jeVwg zIKO1eXZi6OWw00H90^ohu&LM|D%pcQ6d&Hp4tw^;vG!8^=YRR=Tc^k;yB)A3XCKIf zG;?e=_5*63&p8}~d(Z#ZAK+qacHb?Ct>}A&EA^=%w?=Ujk7G-D{`MMv0F(!6mc-z# z2c?yeBqfOJBMwFeL6A?ysq*!yIDr<}&Lrs~KGmK}MloH!x9OK`P@JmvS1N8NoV?2o z9Tde+o7uixDF6c4i3}mp)Cw)q$;x}6QipJiES{p89vRzlgy2x)`MY?ZvnHbS6RW1y z^7kGvCYmwd9*{UM2xRG6_AZ%?2kn9n^+#9ke0$f7tcPohaakM0!AnU7eM_}lm-4(n zFJ%_|=lioGxHXjFecJ$`s1%UP(fP+wgbYX6eN83(spLTJ*1ba*XA@E8ExbXi8yy#OQ9O9XKfeb8C!#Pvd-}Or&8E^;hO^Z5 zQb=R(`h=yNQn&~fpMbUc=~I@_8_t|{ldS2N1^%6&3-c8_KJ(SWE5hL3e#sniz=vG7 zlUQS`K?bVm+d;4W#^`(AxJr~@_x+c6O|Me)Tn#j zq_`if301fJs07tCw&fF3@mbq5(b>;j2%fQ8D28F9`rPK>QCPMDp;g;EX|xMHjYHX^ zrEjtv$srs+!!hF?c3$2x(5_LFOMsozO z-A$L!$xz~-xkMIxU{XG`&R(K#>6Q_14CoLNG7~9ygJaXdKQ(b0XX8ImpF2N*mj;9V z;V=5c0@6ug9D51E%*Bkn-k;0=!Aq)z11k95{R;PX&B*UUNeS_9AZtNZRSEsgB73c= zTgt$A8z4G31rH+SsNgsdl8Po#LS|RM5C1iRmtZyukMznmy=!g&``+P8riOQ?Bg$W` zwN%!8F6nYT19ik!{{VMv0sEl`{h+N?)Q9b%{(l_%0D#NBTXl5%E;|jCoc-8)bNwIN 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 Date: Tue, 19 Jun 2018 15:54:06 -0700 Subject: [PATCH 30/59] addtional merge conflict fixed --- src/App.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/App.js b/src/App.js index cbe6d8ea2..90c98d1b2 100644 --- a/src/App.js +++ b/src/App.js @@ -111,14 +111,11 @@ class App extends Component {

Ada Movies

-<<<<<<< HEAD -======= {this.statusMessage()}
Chosen Movie: {this.state.selectedMovie}
Chosen Customer: {this.state.selectedCustomer}
->>>>>>> status-messages
From 12891beceb38b1283ab4c505b5f6431222a9ef76 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 19 Jun 2018 15:56:18 -0700 Subject: [PATCH 31/59] refactor app.js layout / search form --- src/App.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/App.js b/src/App.js index 90c98d1b2..ba8861976 100644 --- a/src/App.js +++ b/src/App.js @@ -114,11 +114,7 @@ class App extends Component { {this.statusMessage()} -
Chosen Movie: {this.state.selectedMovie}
-
Chosen Customer: {this.state.selectedCustomer}
-
- @@ -133,18 +129,20 @@ class App extends Component {
-
- -
-
- -
+
+ +
+
+ +
+
+
- +
); } From 6330bf978bd40885864e847bc4cd046285d7ca86 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Tue, 19 Jun 2018 15:57:08 -0700 Subject: [PATCH 32/59] format tweak --- src/App.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index b04dc0ce1..6cc77701a 100644 --- a/src/App.js +++ b/src/App.js @@ -112,10 +112,11 @@ class App extends Component {
+
- + ); } From b48102ab8667e3525c7e633aa32035c74029f769 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Tue, 19 Jun 2018 16:58:00 -0700 Subject: [PATCH 33/59] base css styling --- src/App.css | 41 ++++++++++++++++------------- src/App.js | 3 +-- src/components/Customer.css | 10 +++++++ src/components/Customer.js | 6 ++--- src/components/CustomerList.css | 5 ++++ src/components/CustomerList.js | 3 ++- src/components/Movie.css | 11 ++++++++ src/components/Movie.js | 5 ++-- src/components/RentalList.css | 5 ++++ src/components/RentalList.js | 5 ++-- src/components/ShowMovieResults.css | 5 ++++ src/components/ShowMovieResults.js | 3 ++- src/components/TmbdMovie.css | 10 +++++++ src/components/TmbdMovie.js | 5 ++-- 14 files changed, 85 insertions(+), 32 deletions(-) create mode 100644 src/components/Customer.css create mode 100644 src/components/CustomerList.css create mode 100644 src/components/Movie.css create mode 100644 src/components/RentalList.css create mode 100644 src/components/ShowMovieResults.css create mode 100644 src/components/TmbdMovie.css diff --git a/src/App.css b/src/App.css index c25e938e0..5668dead2 100644 --- a/src/App.css +++ b/src/App.css @@ -2,9 +2,8 @@ text-align: center; } -.App-logo { - animation: App-logo-spin infinite 20s linear; - height: 80px; +p { + font-size: 12px; } .App-header { @@ -14,14 +13,6 @@ color: white; } -.App-title { - font-size: 1.5em; -} - -.App-intro { - font-size: large; -} - .show { display: block } @@ -30,24 +21,38 @@ display: none; } +/* HOME */ + .navigation { margin: 2em; } +button { + padding-left: 2em; + padding-right: 2em; + padding-top: 1em; + padding-bottom: 1em; + margin-left: 1em; + margin-right: 1em; + + /* border-radius: 15em; */ +} + +button:hover { + background-color: #5F4B66; + color: white; + cursor: pointer; +} + .Rent-form { margin: 2em; } .Rent-form div:last-of-type { padding-bottom: 1em; -} -.tiles { - display: flex; - flex-direction: row; } -/* @keyframes App-logo-spin { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } +/* * { + border: black 1px solid; } */ diff --git a/src/App.js b/src/App.js index b27fabdb8..8b75a771b 100644 --- a/src/App.js +++ b/src/App.js @@ -128,14 +128,13 @@ class App extends Component { -
-
+
-
{this.props.id}
+
-

{this.props.name}

+

{this.props.name}

{this.props.address}

{this.props.city}, {this.props.state} {this.props.postal_code}

{this.props.phone}

diff --git a/src/components/CustomerList.css b/src/components/CustomerList.css new file mode 100644 index 000000000..37f024c77 --- /dev/null +++ b/src/components/CustomerList.css @@ -0,0 +1,5 @@ +.customer-list { + display: flex; + flex-flow: row wrap; + justify-content: center; +} diff --git a/src/components/CustomerList.js b/src/components/CustomerList.js index 13ac6163a..5536c3959 100644 --- a/src/components/CustomerList.js +++ b/src/components/CustomerList.js @@ -2,6 +2,7 @@ import React, { Component } from 'react'; import Customer from './Customer'; import PropTypes from 'prop-types'; import axios from 'axios'; +import './CustomerList.css' class CustomerList extends Component { constructor() { @@ -67,7 +68,7 @@ class CustomerList extends Component { render() { return ( -
+
{this.renderCustomerList()}
) diff --git a/src/components/Movie.css b/src/components/Movie.css new file mode 100644 index 000000000..f52199f93 --- /dev/null +++ b/src/components/Movie.css @@ -0,0 +1,11 @@ +.movie { + margin: 2em; + padding-left: 1.5em; + padding-right: 1.5em; + width: 12em; + background-color: #EEE5E9; +} + +.movie img:hover { + cursor: pointer; +} diff --git a/src/components/Movie.js b/src/components/Movie.js index 852681cf9..0d7e2dfbd 100644 --- a/src/components/Movie.js +++ b/src/components/Movie.js @@ -1,5 +1,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; +import './Movie.css' class Movie extends Component { @@ -9,8 +10,8 @@ class Movie extends Component { render() { return ( -
-
{this.props.title}
+
+

{this.props.title}

{this.props.title}

{this.props.overview}

{this.props.release}

diff --git a/src/components/RentalList.css b/src/components/RentalList.css new file mode 100644 index 000000000..582c29e7e --- /dev/null +++ b/src/components/RentalList.css @@ -0,0 +1,5 @@ +.rental-list { + display: flex; + flex-flow: row wrap; + justify-content: center; +} diff --git a/src/components/RentalList.js b/src/components/RentalList.js index e4b3fe85f..1b476817c 100644 --- a/src/components/RentalList.js +++ b/src/components/RentalList.js @@ -1,6 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import Movie from './Movie'; +import './RentalList.css' import axios from 'axios'; class RentalList extends Component { @@ -65,11 +66,9 @@ class RentalList extends Component { render() { return ( -
-
+
{this.renderMovieList()}
-
) } } diff --git a/src/components/ShowMovieResults.css b/src/components/ShowMovieResults.css new file mode 100644 index 000000000..0252bad4b --- /dev/null +++ b/src/components/ShowMovieResults.css @@ -0,0 +1,5 @@ +.tmbd-movie-list { + display: flex; + flex-flow: row wrap; + justify-content: center; +} diff --git a/src/components/ShowMovieResults.js b/src/components/ShowMovieResults.js index 1d059855a..865e6b451 100644 --- a/src/components/ShowMovieResults.js +++ b/src/components/ShowMovieResults.js @@ -1,6 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import TmbdMovie from './TmbdMovie'; +import './ShowMovieResults.css' class ShowMovieResults extends Component { constructor(props){ @@ -36,7 +37,7 @@ class ShowMovieResults extends Component { render(){ return( -
+
{ this.renderMovies() }
); diff --git a/src/components/TmbdMovie.css b/src/components/TmbdMovie.css new file mode 100644 index 000000000..352253b23 --- /dev/null +++ b/src/components/TmbdMovie.css @@ -0,0 +1,10 @@ +.tmbd-movie { + margin: 2em; + padding: 1.5em; + width: 15em; + background-color: #C7C6FF; +} + +.tmbd-movie img { + padding-top: 1em; +} diff --git a/src/components/TmbdMovie.js b/src/components/TmbdMovie.js index 8e39fd0b4..74dd25274 100644 --- a/src/components/TmbdMovie.js +++ b/src/components/TmbdMovie.js @@ -1,6 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import axios from 'axios'; +import './TmbdMovie.css' class TmbdMovie extends Component { constructor(props){ @@ -30,8 +31,8 @@ class TmbdMovie extends Component { render(){ return( - -

Title: {this.props.title}

+ +

{this.props.title}

Release Date: {this.props.releaseDate}

Date: Tue, 19 Jun 2018 16:58:36 -0700 Subject: [PATCH 34/59] adds initial setup for react-router --- package-lock.json | 72 ++++++++++++++++++++++++++++++ package.json | 1 + src/App.js | 69 ++++++++++++++-------------- src/components/ShowMovieResults.js | 9 ++-- 4 files changed, 114 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2bdc7a2f0..cdd05bc6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4666,6 +4666,28 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, + "history": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", + "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", + "requires": { + "invariant": "2.2.4", + "loose-envify": "1.3.1", + "resolve-pathname": "2.2.0", + "value-equal": "0.4.0", + "warning": "3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "1.3.1" + } + } + } + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -4676,6 +4698,11 @@ "minimalistic-crypto-utils": "1.0.1" } }, + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -8818,6 +8845,33 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-4.0.0.tgz", "integrity": "sha512-FlsPxavEyMuR6TjVbSSywovXSEyOg6ZDj5+Z8nbsRl9EkOzAhEIcS+GLoQDC5fz/t9suhUXWmUrOBrgeUvrMxw==" }, + "react-router": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", + "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", + "requires": { + "history": "4.7.2", + "hoist-non-react-statics": "2.5.5", + "invariant": "2.2.4", + "loose-envify": "1.3.1", + "path-to-regexp": "1.7.0", + "prop-types": "15.6.1", + "warning": "4.0.1" + } + }, + "react-router-dom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", + "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", + "requires": { + "history": "4.7.2", + "invariant": "2.2.4", + "loose-envify": "1.3.1", + "prop-types": "15.6.1", + "react-router": "4.3.1", + "warning": "4.0.1" + } + }, "react-scripts": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-1.1.4.tgz", @@ -9240,6 +9294,11 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" }, + "resolve-pathname": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", + "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -10573,6 +10632,11 @@ "spdx-expression-parse": "3.0.0" } }, + "value-equal": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", + "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -10609,6 +10673,14 @@ "makeerror": "1.0.11" } }, + "warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.1.tgz", + "integrity": "sha512-rAVtTNZw+cQPjvGp1ox0XC5Q2IBFyqoqh+QII4J/oguyu83Bax1apbo2eqB8bHRS+fqYUBagys6lqUoVwKSmXQ==", + "requires": { + "loose-envify": "1.3.1" + } + }, "watch": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", diff --git a/package.json b/package.json index b5d697449..d170d92c8 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "axios": "^0.18.0", "react": "^16.4.1", "react-dom": "^16.4.1", + "react-router-dom": "^4.3.1", "react-scripts": "1.1.4" }, "scripts": { diff --git a/src/App.js b/src/App.js index b27fabdb8..cbc8f7f43 100644 --- a/src/App.js +++ b/src/App.js @@ -3,9 +3,11 @@ import axios from 'axios'; import RentalList from './components/RentalList'; import CustomerList from './components/CustomerList'; import './App.css'; - import Tmbd from './components/Tmbd.js' +import {BrowserRouter as Router} from 'react-router-dom'; +import Route from 'react-router-dom/Route'; + class App extends Component { constructor() { super(); @@ -107,42 +109,43 @@ class App extends Component { render() { return ( -
-
-

Ada Movies

-
- - {this.statusMessage()} - -
- - - -
- -
- -
Chosen Movie: {this.state.selectedMovie}
-
Chosen Customer: {this.state.selectedCustomer}
- -
-
+ +
+
+

Ada Movies

+
+ + {this.statusMessage()} + +
+ + + +
-
-
- +
+ +
Chosen Movie: {this.state.selectedMovie}
+
Chosen Customer: {this.state.selectedCustomer}
+ +
-
- + +
+
+ +
+
+ +
+
+
+
-
-
-
- -
+
); } } diff --git a/src/components/ShowMovieResults.js b/src/components/ShowMovieResults.js index 1d059855a..86948e477 100644 --- a/src/components/ShowMovieResults.js +++ b/src/components/ShowMovieResults.js @@ -11,9 +11,9 @@ class ShowMovieResults extends Component { this.props.tmbdStatusCallback(status); } - // getImageUrl = () => { - // - // } + getImageUrl = () => { + + } renderMovies = () => { const movieList = this.props.movies.map((movie, index) => { @@ -23,7 +23,8 @@ class ShowMovieResults extends Component { id = { movie.external_id } title = { movie.title } releaseDate = { movie.release_date } - poster = { movie.image_url} + // poster = { movie.image_url} + poster = { this.getImageUrl(movie.image_url) } overview = { movie.overview } statusCallback = { this.statusUpdate } /> From b61db857ba0dfe6f9f4948b4b0ce2dc607e0aa97 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 20 Jun 2018 12:17:58 -0700 Subject: [PATCH 35/59] fixes popup messages timeout --- src/App.js | 2 ++ src/components/ShowMovieResults.js | 11 +++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/App.js b/src/App.js index cbc8f7f43..cdc055832 100644 --- a/src/App.js +++ b/src/App.js @@ -52,12 +52,14 @@ class App extends Component { this.setState({ status: 'Movie Rental Processed!' }); + this.setMessageStatus(this.state.status); }) .catch((error) => { this.setState({ // message: error.message status: error.message }); + this.setMessageStatus(this.state.status); }) } diff --git a/src/components/ShowMovieResults.js b/src/components/ShowMovieResults.js index 9a937c02e..202bf0099 100644 --- a/src/components/ShowMovieResults.js +++ b/src/components/ShowMovieResults.js @@ -12,9 +12,9 @@ class ShowMovieResults extends Component { this.props.tmbdStatusCallback(status); } - getImageUrl = () => { - - } + // getImageUrl = () => { + // + // } renderMovies = () => { const movieList = this.props.movies.map((movie, index) => { @@ -24,8 +24,8 @@ class ShowMovieResults extends Component { id = { movie.external_id } title = { movie.title } releaseDate = { movie.release_date } - // poster = { movie.image_url} - poster = { this.getImageUrl(movie.image_url) } + poster = { movie.image_url} + // poster = { this.getImageUrl(movie.image_url) } overview = { movie.overview } statusCallback = { this.statusUpdate } /> @@ -35,7 +35,6 @@ class ShowMovieResults extends Component { return movieList; } - render(){ return(
From 39ceda8ab7b2b5410a3474b317d6cc2832869adc Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Wed, 20 Jun 2018 13:21:37 -0700 Subject: [PATCH 36/59] css styling for most pages --- src/App.css | 13 +++++-- src/App.js | 20 +++++++---- src/components/Customer.css | 4 +++ src/components/Customer.js | 2 +- src/components/Movie.css | 4 +++ src/components/Movie.js | 2 +- src/components/NewRentalForm.js | 58 ------------------------------- src/components/Rental.js | 51 --------------------------- src/components/RentalList.js | 1 - src/components/SearchTmbdForm.css | 14 ++++++++ src/components/SearchTmbdForm.js | 7 ++-- src/components/Tmbd.css | 7 ---- src/components/Tmbd.js | 2 +- src/components/TmbdMovie.css | 9 +++-- src/components/TmbdMovie.js | 2 +- 15 files changed, 63 insertions(+), 133 deletions(-) delete mode 100644 src/components/NewRentalForm.js delete mode 100644 src/components/Rental.js create mode 100644 src/components/SearchTmbdForm.css delete mode 100644 src/components/Tmbd.css diff --git a/src/App.css b/src/App.css index 5668dead2..1af9351c2 100644 --- a/src/App.css +++ b/src/App.css @@ -34,8 +34,6 @@ button { padding-bottom: 1em; margin-left: 1em; margin-right: 1em; - - /* border-radius: 15em; */ } button:hover { @@ -46,11 +44,22 @@ button:hover { .Rent-form { margin: 2em; + padding: 1em; + border: dotted white 5px; + border-radius: 10px; + background-color: #FFD36D; +} + +.Rent-form div { + padding-bottom: .5em; } .Rent-form div:last-of-type { padding-bottom: 1em; +} +.Rent-form button:hover { + background-color: #893B63; } /* * { diff --git a/src/App.js b/src/App.js index 8b75a771b..f543a9cbb 100644 --- a/src/App.js +++ b/src/App.js @@ -36,6 +36,14 @@ class App extends Component { }) } + clearRentalForm = () => { + this.setState({ + selectedMovie: '', + selectedCustomer: '', + customerId: '', + }) + } + addRental = () => { const movieTitle = this.state.selectedMovie; const customerId = this.state.customerId; @@ -50,10 +58,10 @@ class App extends Component { this.setState({ status: 'Movie Rental Processed!' }); + this.clearRentalForm() }) .catch((error) => { this.setState({ - // message: error.message status: error.message }); }) @@ -120,13 +128,13 @@ class App extends Component {
-
-
Chosen Movie: {this.state.selectedMovie}
-
Chosen Customer: {this.state.selectedCustomer}
- +
+
Chosen Movie: {this.state.selectedMovie}
+
Chosen Customer: {this.state.selectedCustomer}
+ +
-
diff --git a/src/components/Customer.css b/src/components/Customer.css index abd094c10..9ffb3740f 100644 --- a/src/components/Customer.css +++ b/src/components/Customer.css @@ -8,3 +8,7 @@ .customer img { padding-top: 2em; } + +.customer img:hover { + cursor: pointer; +} diff --git a/src/components/Customer.js b/src/components/Customer.js index 40e7d7510..cd8b580e1 100644 --- a/src/components/Customer.js +++ b/src/components/Customer.js @@ -12,7 +12,7 @@ class Customer extends Component { render() { return (
- +

{this.props.name}

{this.props.address}

{this.props.city}, {this.props.state} {this.props.postal_code}

diff --git a/src/components/Movie.css b/src/components/Movie.css index f52199f93..35026242a 100644 --- a/src/components/Movie.css +++ b/src/components/Movie.css @@ -9,3 +9,7 @@ .movie img:hover { cursor: pointer; } + +/* *{ + border: black 1px solid; +} */ diff --git a/src/components/Movie.js b/src/components/Movie.js index 0d7e2dfbd..91fa3829d 100644 --- a/src/components/Movie.js +++ b/src/components/Movie.js @@ -12,7 +12,7 @@ class Movie extends Component { return (

{this.props.title}

- {this.props.title} + {this.props.title}

{this.props.overview}

{this.props.release}

diff --git a/src/components/NewRentalForm.js b/src/components/NewRentalForm.js deleted file mode 100644 index 4eb63ce8a..000000000 --- a/src/components/NewRentalForm.js +++ /dev/null @@ -1,58 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; - -class NewRentalForm extends Component { - constructor() { - super(); - this.state = { - selectedMovie: 'None', - selectedCustomer: 'None', - }; - } - - onFieldChange = (event) => { - const fieldName = event.target.name; - const fieldValue = event.target.value; - const updateState = {}; - updateState[fieldName] = fieldValue; - this.setState(updateState); - } - - - clearForm = () => { - this.setState({ - selectedMovie: 'None', - selectedCustomer: 'None', - }); - } - - onFormSubmit = (event) => { - event.preventDefault(); - - this.props.addRentalCallback(this.state.selectedMovie, this.state.selectedCustomer) - this.clearForm(); - - } - - render() { - return ( - -
- - -
-
- - -
- - - ) - } -} - -export default NewRentalForm; - -NewRentalForm.propTypes = { - addRentalCallback: PropTypes.func -} diff --git a/src/components/Rental.js b/src/components/Rental.js deleted file mode 100644 index a26fb5ce8..000000000 --- a/src/components/Rental.js +++ /dev/null @@ -1,51 +0,0 @@ -import React, { Component } from 'react'; -import RentalList from './RentalList'; -import NewRentalForm from './NewRentalForm'; -import CustomerList from './CustomerList'; -import axios from 'axios'; - -class Rental extends Component { - // constructor() { - // super(); - // this.state = { - // selectedMovie: 'None', - // selectedCustomer: 'None', - // }; - // } - - addRental = (movie,customer) => { - const movieTitle = movie; - const customerId = customer; - const today = new Date() - const dueDate = (new Date(today.setDate(today.getDate() + 7))).toISOString().slice(0,10) - - const url = 'http://localhost:3000/rentals/' + movieTitle + '/check-out?customer_id=' + customerId + '&due_date=' + dueDate - - axios.post(url) - .then((response) => { - console.log(response); - }) - .catch((error) => { - this.setState({ - message: error.message - }); - }) - } - - render() { - return ( -
-
- -
-
- -
-
- - ) - } - -} - -export default Rental; diff --git a/src/components/RentalList.js b/src/components/RentalList.js index 1b476817c..5e6696141 100644 --- a/src/components/RentalList.js +++ b/src/components/RentalList.js @@ -14,7 +14,6 @@ class RentalList extends Component { componentDidMount = () => { let query = 'http://localhost:3000/movies' - console.log(query) axios.get(query) .then((response) => { diff --git a/src/components/SearchTmbdForm.css b/src/components/SearchTmbdForm.css new file mode 100644 index 000000000..34f034b74 --- /dev/null +++ b/src/components/SearchTmbdForm.css @@ -0,0 +1,14 @@ +form button { + padding-left: 2em; + padding-right: 2em; + padding-top: .25em; + padding-bottom: .25em; + margin-left: 1em; + margin-right: 1em; +} + +form button:hover { + background-color: #56667A; + color: white; + cursor: pointer; +} diff --git a/src/components/SearchTmbdForm.js b/src/components/SearchTmbdForm.js index d4420402f..39dd82199 100644 --- a/src/components/SearchTmbdForm.js +++ b/src/components/SearchTmbdForm.js @@ -1,5 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; +import '../App.css'; +import './SearchTmbdForm.css'; class SearchTmbdForm extends Component { constructor(){ @@ -34,13 +36,14 @@ class SearchTmbdForm extends Component {
+
- +
); } diff --git a/src/components/Tmbd.css b/src/components/Tmbd.css deleted file mode 100644 index 45f91e939..000000000 --- a/src/components/Tmbd.css +++ /dev/null @@ -1,7 +0,0 @@ -.show { - display: block -} - -.hide { - display: none; -} diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js index 521d6e707..bada1fefa 100644 --- a/src/components/Tmbd.js +++ b/src/components/Tmbd.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import './Tmbd.css' +import '../App.css'; import axios from 'axios'; import SearchTmbdForm from './SearchTmbdForm.js' import ShowMovieResults from './ShowMovieResults.js' diff --git a/src/components/TmbdMovie.css b/src/components/TmbdMovie.css index 352253b23..8ff3a2f46 100644 --- a/src/components/TmbdMovie.css +++ b/src/components/TmbdMovie.css @@ -1,10 +1,15 @@ .tmbd-movie { margin: 2em; - padding: 1.5em; + padding: 1em; width: 15em; - background-color: #C7C6FF; + background-color: #87ADAF; } .tmbd-movie img { padding-top: 1em; + padding-bottom: 1em; } + +/* .tmbd-movie h2 { + padding-top: none; +} */ diff --git a/src/components/TmbdMovie.js b/src/components/TmbdMovie.js index 74dd25274..d3dfb8e2b 100644 --- a/src/components/TmbdMovie.js +++ b/src/components/TmbdMovie.js @@ -37,7 +37,7 @@ class TmbdMovie extends Component { movie poster - + ); } From 86bc3d709938c37f01b015f7acd37c6946e281b8 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 20 Jun 2018 13:23:28 -0700 Subject: [PATCH 37/59] fixes status updates --- src/App.js | 1 + src/components/Tmbd.js | 3 ++- src/components/TmbdMovie.js | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index cdc055832..f6574d319 100644 --- a/src/App.js +++ b/src/App.js @@ -49,6 +49,7 @@ class App extends Component { axios.post(url) .then((response) => { console.log(response); + // this.rentalMovies(); this.setState({ status: 'Movie Rental Processed!' }); diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js index 521d6e707..88ede6630 100644 --- a/src/components/Tmbd.js +++ b/src/components/Tmbd.js @@ -23,7 +23,8 @@ class Tmbd extends Component { this.setState({ moviesAreHidden: false, movies: response.data - }) + }); + console.log(this.state.movies); }) .catch((error) => { console.log(error); diff --git a/src/components/TmbdMovie.js b/src/components/TmbdMovie.js index 74dd25274..6aea4f807 100644 --- a/src/components/TmbdMovie.js +++ b/src/components/TmbdMovie.js @@ -17,6 +17,7 @@ class TmbdMovie extends Component { image_url: this.props.poster, external_id: this.props.id } + console.log(movieObj); axios.post('http://localhost:3000/movies/', movieObj) .then((response) => { From 70d6747633448b0329acec9a7019b70a1b74bd0a Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Wed, 20 Jun 2018 13:35:40 -0700 Subject: [PATCH 38/59] another merge resolution --- src/App.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/App.js b/src/App.js index f714ee17a..baa8fa13f 100644 --- a/src/App.js +++ b/src/App.js @@ -61,11 +61,8 @@ class App extends Component { this.setState({ status: 'Movie Rental Processed!' }); -<<<<<<< HEAD this.setMessageStatus(this.state.status); -======= this.clearRentalForm() ->>>>>>> css-b }) .catch((error) => { this.setState({ @@ -137,13 +134,14 @@ class App extends Component {
-
- + +
+
Chosen Movie: {this.state.selectedMovie}
Chosen Customer: {this.state.selectedCustomer}
- -
+
+
From 21e5719bbae122336394b42b2a3454f863a29d83 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 20 Jun 2018 13:36:45 -0700 Subject: [PATCH 39/59] code cleanup --- src/App.js | 2 -- src/components/Customer.js | 2 +- src/components/ShowMovieResults.js | 9 --------- src/components/Tmbd.js | 1 - src/components/TmbdMovie.js | 4 ---- 5 files changed, 1 insertion(+), 17 deletions(-) diff --git a/src/App.js b/src/App.js index f6574d319..d9365db24 100644 --- a/src/App.js +++ b/src/App.js @@ -49,7 +49,6 @@ class App extends Component { axios.post(url) .then((response) => { console.log(response); - // this.rentalMovies(); this.setState({ status: 'Movie Rental Processed!' }); @@ -57,7 +56,6 @@ class App extends Component { }) .catch((error) => { this.setState({ - // message: error.message status: error.message }); this.setMessageStatus(this.state.status); diff --git a/src/components/Customer.js b/src/components/Customer.js index 40e7d7510..3060eab47 100644 --- a/src/components/Customer.js +++ b/src/components/Customer.js @@ -12,7 +12,7 @@ class Customer extends Component { render() { return (
- + customer profile

{this.props.name}

{this.props.address}

{this.props.city}, {this.props.state} {this.props.postal_code}

diff --git a/src/components/ShowMovieResults.js b/src/components/ShowMovieResults.js index 202bf0099..8f2a25088 100644 --- a/src/components/ShowMovieResults.js +++ b/src/components/ShowMovieResults.js @@ -4,18 +4,10 @@ import TmbdMovie from './TmbdMovie'; import './ShowMovieResults.css' class ShowMovieResults extends Component { - constructor(props){ - super(props); - } - statusUpdate = (status) => { this.props.tmbdStatusCallback(status); } - // getImageUrl = () => { - // - // } - renderMovies = () => { const movieList = this.props.movies.map((movie, index) => { return( @@ -25,7 +17,6 @@ class ShowMovieResults extends Component { title = { movie.title } releaseDate = { movie.release_date } poster = { movie.image_url} - // poster = { this.getImageUrl(movie.image_url) } overview = { movie.overview } statusCallback = { this.statusUpdate } /> diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js index 88ede6630..7678959a7 100644 --- a/src/components/Tmbd.js +++ b/src/components/Tmbd.js @@ -4,7 +4,6 @@ import './Tmbd.css' import axios from 'axios'; import SearchTmbdForm from './SearchTmbdForm.js' import ShowMovieResults from './ShowMovieResults.js' -// import TmbdMovie from './TmbdMovie' class Tmbd extends Component { constructor(){ diff --git a/src/components/TmbdMovie.js b/src/components/TmbdMovie.js index 6aea4f807..3b43073d6 100644 --- a/src/components/TmbdMovie.js +++ b/src/components/TmbdMovie.js @@ -4,9 +4,6 @@ import axios from 'axios'; import './TmbdMovie.css' class TmbdMovie extends Component { - constructor(props){ - super(props); - } onFormSubmit = (event) => { event.preventDefault(); @@ -25,7 +22,6 @@ class TmbdMovie extends Component { this.props.statusCallback('Movie posted!'); }) .catch((error) => { - // console.log(error.message); this.props.statusCallback(error.message); }); } From d00212a307ad85c43924e16e847db84d1fbc7acf Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Wed, 20 Jun 2018 14:33:41 -0700 Subject: [PATCH 40/59] router works --- src/App.css | 8 ++++++- src/App.js | 68 +++++++++++++++-------------------------------------- 2 files changed, 26 insertions(+), 50 deletions(-) diff --git a/src/App.css b/src/App.css index 1af9351c2..2d0db2786 100644 --- a/src/App.css +++ b/src/App.css @@ -39,15 +39,17 @@ button { button:hover { background-color: #5F4B66; color: white; - cursor: pointer; } + .Rent-form { margin: 2em; padding: 1em; border: dotted white 5px; border-radius: 10px; background-color: #FFD36D; + display: flex; + justify-content: space-around; } .Rent-form div { @@ -62,6 +64,10 @@ button:hover { background-color: #893B63; } +.chosen { + text-align: left; +} + /* * { border: black 1px solid; } */ diff --git a/src/App.js b/src/App.js index 92738d1c6..5aca5c7f8 100644 --- a/src/App.js +++ b/src/App.js @@ -5,8 +5,8 @@ import CustomerList from './components/CustomerList'; import './App.css'; import Tmbd from './components/Tmbd.js' -import {BrowserRouter as Router} from 'react-router-dom'; -import Route from 'react-router-dom/Route'; +import {BrowserRouter as Router, Route, Link} from 'react-router-dom'; +// import Route from 'react-router-dom/Route'; class App extends Component { constructor() { @@ -15,10 +15,6 @@ class App extends Component { selectedMovie: '', selectedCustomer: '', customerId: '', - hiddenMovies: 'hide', - hiddenCustomers: 'hide', - searchForm: 'hide', - rentalFields: 'hide', status: '' }; } @@ -71,33 +67,6 @@ class App extends Component { }) } - rentalMovies = () => { - this.setState({ - hiddenMovies: 'show', - hiddenCustomers: 'hide', - searchForm: 'hide', - rentalFields: 'show' - }); - } - - rentalCustomer = () => { - this.setState({ - hiddenMovies: 'hide', - hiddenCustomers: 'show', - searchForm: 'hide', - rentalFields: 'show' - }); - } - - searchTmbd = () => { - this.setState({ - hiddenMovies: 'hide', - hiddenCustomers: 'hide', - searchForm: 'show', - rentalFields: 'hide' - }) - } - statusMessage = () => { if (this.state.status !== ''){ return

{this.state.status}

@@ -122,38 +91,39 @@ class App extends Component {
-

Ada Movies

+

Ada Movies

{this.statusMessage()}
- - - + + +
- -
Chosen Movie: {this.state.selectedMovie}
-
Chosen Customer: {this.state.selectedCustomer}
- +
+
Chosen Movie: {this.state.selectedMovie}
+
Chosen Customer: {this.state.selectedCustomer}
+
+
-
- +
+ } />
-
- +
+ } />
-
- + +
+ } />
From 09c964e1b365a65c9cd243a683dcde646c0b45c3 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 20 Jun 2018 14:51:52 -0700 Subject: [PATCH 41/59] adds parameter for inventory --- src/components/TmbdMovie.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/components/TmbdMovie.js b/src/components/TmbdMovie.js index a8b6a17b4..e266a0bae 100644 --- a/src/components/TmbdMovie.js +++ b/src/components/TmbdMovie.js @@ -6,17 +6,24 @@ import './TmbdMovie.css' class TmbdMovie extends Component { onFormSubmit = (event) => { + const url = 'http://localhost:3000/movies/'; + // check if movie is already in library + + // if the movie is in the library call + // this.props.statusCallback('This movie is already in the library') + event.preventDefault(); const movieObj = { title: this.props.title, release_date: this.props.releaseDate, overview: this.props.overview, image_url: this.props.poster, - external_id: this.props.id + external_id: this.props.id, + inventory: 5 } console.log(movieObj); - axios.post('http://localhost:3000/movies/', movieObj) + axios.post(url , movieObj) .then((response) => { console.log(response); this.props.statusCallback('Movie posted!'); From 8edaf69217b0f0658d510d5bc7e7bf49ad9e60e4 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Wed, 20 Jun 2018 14:56:21 -0700 Subject: [PATCH 42/59] cleaned up files; buttons nested in link tos; cursors back --- src/App.css | 16 ++++++++++++++++ src/App.js | 22 +++++++++++----------- src/components/Movie.css | 2 +- src/components/default-movie-1-3.jpg | Bin 50923 -> 0 bytes src/default-profile-picture.jpg | Bin 16579 -> 0 bytes 5 files changed, 28 insertions(+), 12 deletions(-) delete mode 100644 src/components/default-movie-1-3.jpg delete mode 100644 src/default-profile-picture.jpg diff --git a/src/App.css b/src/App.css index 2d0db2786..7b28f5955 100644 --- a/src/App.css +++ b/src/App.css @@ -1,3 +1,4 @@ +/* Basics */ .App { text-align: center; } @@ -6,6 +7,10 @@ p { font-size: 12px; } +a { + text-decoration: none; +} + .App-header { background-color: #222; height: 50px; @@ -13,6 +18,10 @@ p { color: white; } +.App-title { + color: white; +} + .show { display: block } @@ -39,9 +48,11 @@ button { button:hover { background-color: #5F4B66; color: white; + cursor: pointer; } +/* Rental Form */ .Rent-form { margin: 2em; padding: 1em; @@ -68,6 +79,11 @@ button:hover { text-align: left; } +/* Alert messages */ +.status { + color: red; +} + /* * { border: black 1px solid; } */ diff --git a/src/App.js b/src/App.js index 5aca5c7f8..a72634f10 100644 --- a/src/App.js +++ b/src/App.js @@ -69,7 +69,7 @@ class App extends Component { statusMessage = () => { if (this.state.status !== ''){ - return

{this.state.status}

+ return

{this.state.status}

} } @@ -91,15 +91,15 @@ class App extends Component {
-

Ada Movies

+

Ada Movies

{this.statusMessage()}
- - - + + +
@@ -113,18 +113,18 @@ class App extends Component {
-
+
} />
-
+
} />
+
+ } /> +
-
- } /> -
); diff --git a/src/components/Movie.css b/src/components/Movie.css index 35026242a..a277b441e 100644 --- a/src/components/Movie.css +++ b/src/components/Movie.css @@ -1,5 +1,5 @@ .movie { - margin: 2em; + margin: 1.5em; padding-left: 1.5em; padding-right: 1.5em; width: 12em; diff --git a/src/components/default-movie-1-3.jpg b/src/components/default-movie-1-3.jpg deleted file mode 100644 index e9ec6365b9c0010727ab6dbaec2b50527a769853..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50923 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%0D#NBTXl5%E;|jCoc-8)bNwIN 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 Date: Wed, 20 Jun 2018 15:15:15 -0700 Subject: [PATCH 43/59] adds logic to prevent duplicates from being added to the library --- src/components/TmbdMovie.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/components/TmbdMovie.js b/src/components/TmbdMovie.js index e266a0bae..a53ec9510 100644 --- a/src/components/TmbdMovie.js +++ b/src/components/TmbdMovie.js @@ -6,13 +6,25 @@ import './TmbdMovie.css' class TmbdMovie extends Component { onFormSubmit = (event) => { + event.preventDefault(); const url = 'http://localhost:3000/movies/'; - // check if movie is already in library - // if the movie is in the library call - // this.props.statusCallback('This movie is already in the library') + const title = encodeURIComponent(this.props.title); + axios.get(`${url}${title}`) + .then((response) => { + console.log(response.data); + this.props.statusCallback('This movie is already in the library'); + }) + .catch((error) => { + console.log(error.response.status); + if (error.response.status === 404){ + this.addToLibrary(); + } + }); + } - event.preventDefault(); + addToLibrary = () => { + const url = 'http://localhost:3000/movies/'; const movieObj = { title: this.props.title, release_date: this.props.releaseDate, From ed388f5fae0008e2ed7d1d25a354170653a806a4 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 20 Jun 2018 15:53:33 -0700 Subject: [PATCH 44/59] setup for testing --- package-lock.json | 2085 ++++++++++++++++++++++++++++++++++++++------- package.json | 11 + src/App.test.js | 11 +- src/setupTests.js | 4 + 4 files changed, 1786 insertions(+), 325 deletions(-) create mode 100644 src/setupTests.js diff --git a/package-lock.json b/package-lock.json index cdd05bc6b..c9ce80722 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,42 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.51.tgz", + "integrity": "sha1-vXHZsZKvl435FYKdOdQJRFZDmgw=", + "requires": { + "@babel/highlight": "7.0.0-beta.51" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.51.tgz", + "integrity": "sha1-6IRK4loVlcz9QriWI7Q3bKBtIl0=", + "requires": { + "chalk": "2.4.1", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + } + } + }, + "@types/node": { + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.3.4.tgz", + "integrity": "sha512-YMLlzdeNnAyLrQew39IFRkMacAR5BqKGIEei9ZjdHsIZtv+ZWKYTu1i7QJhetxQ9ReXx8w5f+cixdHZG3zgMQA==", + "dev": true + }, "abab": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", @@ -39,18 +75,11 @@ } }, "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", + "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", "requires": { - "acorn": "4.0.13" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } + "acorn": "5.6.2" } }, "acorn-jsx": { @@ -388,6 +417,11 @@ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + }, "async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", @@ -401,6 +435,11 @@ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1474,10 +1513,15 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, + "browser-process-hrtime": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", + "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=" + }, "browser-resolve": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", - "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", "requires": { "resolve": "1.1.7" }, @@ -1701,6 +1745,14 @@ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000855.tgz", "integrity": "sha512-ajORrkXa5UYk62P5PK6ZmBraYOAOr9HWy+XxLwjDg8Ys/5KiSyarg8tIA32ZVqbFhtz67wyySXnU9imkh2ZT2w==" }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "requires": { + "rsvp": "3.6.2" + } + }, "capture-stack-trace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", @@ -1754,6 +1806,54 @@ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" }, + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "dev": true, + "requires": { + "css-select": "1.2.0", + "dom-serializer": "0.1.0", + "entities": "1.1.1", + "htmlparser2": "3.9.2", + "lodash": "4.17.10", + "parse5": "3.0.3" + }, + "dependencies": { + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.4.2", + "domutils": "1.5.1", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "requires": { + "@types/node": "10.3.4" + } + } + } + }, "chokidar": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", @@ -2463,9 +2563,9 @@ "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=" }, "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.3.1.tgz", + "integrity": "sha512-tNvaxM5blOnxanyxI6panOsnfiyLRj3HV4qjqqS45WPNS1usdYWRUQjqTEEELK73lpeP/1KoIGYUwrBn/VcECA==", "requires": { "cssom": "0.3.2" } @@ -2499,6 +2599,16 @@ "assert-plus": "1.0.0" } }, + "data-urls": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.0.tgz", + "integrity": "sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA==", + "requires": { + "abab": "1.0.4", + "whatwg-mimetype": "2.1.0", + "whatwg-url": "6.5.0" + } + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -2649,6 +2759,11 @@ "repeating": "2.0.1" } }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" + }, "detect-node": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", @@ -2678,6 +2793,12 @@ "randombytes": "2.0.6" } }, + "discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", + "dev": true + }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -2757,6 +2878,14 @@ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "requires": { + "webidl-conversions": "4.0.2" + } + }, "domhandler": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", @@ -2874,6 +3003,65 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" }, + "enzyme": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.3.0.tgz", + "integrity": "sha512-l8csyPyLmtxskTz6pX9W8eDOyH1ckEtDttXk/vlFWCjv00SkjTjtoUrogqp4yEvMyneU9dUJoOLnqFoiHb8IHA==", + "dev": true, + "requires": { + "cheerio": "1.0.0-rc.2", + "function.prototype.name": "1.1.0", + "has": "1.0.3", + "is-boolean-object": "1.0.0", + "is-callable": "1.1.3", + "is-number-object": "1.0.3", + "is-string": "1.0.4", + "is-subset": "0.1.1", + "lodash": "4.17.10", + "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" + } + }, + "enzyme-adapter-react-16": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.1.1.tgz", + "integrity": "sha512-kC8pAtU2Jk3OJ0EG8Y2813dg9Ol0TXi7UNxHzHiWs30Jo/hj7alc//G1YpKUsPP1oKl9X+Lkx+WlGJpPYA+nvw==", + "dev": true, + "requires": { + "enzyme-adapter-utils": "1.3.0", + "lodash": "4.17.10", + "object.assign": "4.1.0", + "object.values": "1.0.4", + "prop-types": "15.6.1", + "react-reconciler": "0.7.0", + "react-test-renderer": "16.4.1" + } + }, + "enzyme-adapter-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.3.0.tgz", + "integrity": "sha512-vVXSt6uDv230DIv+ebCG66T1Pm36Kv+m74L1TrF4kaE7e1V7Q/LcxO0QRkajk5cA6R3uu9wJf5h13wOTezTbjA==", + "dev": true, + "requires": { + "lodash": "4.17.10", + "object.assign": "4.1.0", + "prop-types": "15.6.1" + } + }, + "enzyme-to-json": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.3.4.tgz", + "integrity": "sha1-Z8YEDpMRgvGDQYry659DIyWKp38=", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -3401,6 +3589,11 @@ "strip-eof": "1.0.0" } }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -3487,6 +3680,19 @@ "homedir-polyfill": "1.0.1" } }, + "expect": { + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.1.0.tgz", + "integrity": "sha1-v9/VeiogFw2HWZnul4fMcfAcIF8=", + "requires": { + "ansi-styles": "3.2.1", + "jest-diff": "23.0.1", + "jest-get-type": "22.4.3", + "jest-matcher-utils": "23.0.1", + "jest-message-util": "23.1.0", + "jest-regex-util": "23.0.0" + } + }, "express": { "version": "4.16.3", "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", @@ -4370,6 +4576,17 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "function.prototype.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz", + "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "function-bind": "1.1.1", + "is-callable": "1.1.3" + } + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", @@ -4614,6 +4831,12 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -5202,6 +5425,12 @@ "binary-extensions": "1.11.0" } }, + "is-boolean-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", + "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", + "dev": true + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -5309,6 +5538,11 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=" + }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", @@ -5349,6 +5583,12 @@ } } }, + "is-number-object": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", + "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", + "dev": true + }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -5451,6 +5691,18 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, + "is-string": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", + "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", + "dev": true + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, "is-svg": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", @@ -5530,33 +5782,6 @@ "js-yaml": "3.7.0", "mkdirp": "0.5.1", "once": "1.4.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz", - "integrity": "sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA==", - "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } } }, "istanbul-lib-coverage": { @@ -5613,9 +5838,9 @@ } }, "istanbul-lib-source-maps": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", - "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz", + "integrity": "sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA==", "requires": { "debug": "3.1.0", "istanbul-lib-coverage": "1.2.0", @@ -5648,17 +5873,18 @@ } }, "jest": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", - "integrity": "sha1-PdJgwpidba1nix6cxNkZRPbWAqw=", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-23.1.0.tgz", + "integrity": "sha1-u7f4kxAKEadC3YvQ0EelSwlorRo=", "requires": { - "jest-cli": "20.0.4" + "import-local": "1.0.0", + "jest-cli": "23.1.0" }, "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "arr-diff": { "version": "2.0.0", @@ -5683,10 +5909,15 @@ "repeat-element": "1.1.2" } }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } }, "expand-brackets": { "version": "0.1.5", @@ -5704,41 +5935,55 @@ "is-extglob": "1.0.0" } }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "requires": { + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" + } + }, "jest-cli": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz", - "integrity": "sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.1.0.tgz", + "integrity": "sha1-64vdTODRUlCJLjGtm2m8mdKo9r8=", "requires": { - "ansi-escapes": "1.4.0", - "callsites": "2.0.0", - "chalk": "1.1.3", + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "exit": "0.1.2", + "glob": "7.1.2", "graceful-fs": "4.1.11", + "import-local": "1.0.0", "is-ci": "1.1.0", "istanbul-api": "1.3.1", "istanbul-lib-coverage": "1.2.0", "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-source-maps": "1.2.3", - "jest-changed-files": "20.0.3", - "jest-config": "20.0.4", - "jest-docblock": "20.0.3", - "jest-environment-jsdom": "20.0.3", - "jest-haste-map": "20.0.5", - "jest-jasmine2": "20.0.4", - "jest-message-util": "20.0.3", - "jest-regex-util": "20.0.3", - "jest-resolve-dependencies": "20.0.3", - "jest-runtime": "20.0.4", - "jest-snapshot": "20.0.3", - "jest-util": "20.0.3", + "istanbul-lib-source-maps": "1.2.5", + "jest-changed-files": "23.0.1", + "jest-config": "23.1.0", + "jest-environment-jsdom": "23.1.0", + "jest-get-type": "22.4.3", + "jest-haste-map": "23.1.0", + "jest-message-util": "23.1.0", + "jest-regex-util": "23.0.0", + "jest-resolve-dependencies": "23.0.1", + "jest-runner": "23.1.0", + "jest-runtime": "23.1.0", + "jest-snapshot": "23.0.1", + "jest-util": "23.1.0", + "jest-validate": "23.0.1", + "jest-watcher": "23.1.0", + "jest-worker": "23.0.1", "micromatch": "2.3.11", "node-notifier": "5.2.1", - "pify": "2.3.0", + "realpath-native": "1.0.0", + "rimraf": "2.6.2", "slash": "1.0.0", - "string-length": "1.0.1", - "throat": "3.2.0", + "string-length": "2.0.0", + "strip-ansi": "4.0.0", "which": "1.3.1", - "worker-farm": "1.6.0", - "yargs": "7.1.0" + "yargs": "11.0.0" } }, "kind-of": { @@ -5768,83 +6013,174 @@ "parse-glob": "3.0.4", "regex-cache": "0.4.4" } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } } } }, "jest-changed-files": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-20.0.3.tgz", - "integrity": "sha1-k5TVzGXEOEBhSb7xv01Sto4D4/g=" + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.0.1.tgz", + "integrity": "sha1-95Vy0HIIROpd+EwqRI6GLCJU9gw=", + "requires": { + "throat": "4.1.0" + } }, "jest-config": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", - "integrity": "sha1-43kwqyIXyRNgXv8T5712PsSPruo=", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.1.0.tgz", + "integrity": "sha1-cIyg9DHTVu5CT7SJXTMIAGvdgkE=", "requires": { - "chalk": "1.1.3", + "babel-core": "6.26.0", + "babel-jest": "23.0.1", + "chalk": "2.4.1", "glob": "7.1.2", - "jest-environment-jsdom": "20.0.3", - "jest-environment-node": "20.0.3", - "jest-jasmine2": "20.0.4", - "jest-matcher-utils": "20.0.3", - "jest-regex-util": "20.0.3", - "jest-resolve": "20.0.4", - "jest-validate": "20.0.3", - "pretty-format": "20.0.3" + "jest-environment-jsdom": "23.1.0", + "jest-environment-node": "23.1.0", + "jest-get-type": "22.4.3", + "jest-jasmine2": "23.1.0", + "jest-regex-util": "23.0.0", + "jest-resolve": "23.1.0", + "jest-util": "23.1.0", + "jest-validate": "23.0.1", + "pretty-format": "23.0.1" + }, + "dependencies": { + "babel-jest": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.0.1.tgz", + "integrity": "sha1-u6079SP7IC2gXtCmVAtIyE7tE6Y=", + "requires": { + "babel-plugin-istanbul": "4.1.6", + "babel-preset-jest": "23.0.1" + } + }, + "babel-plugin-jest-hoist": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.0.1.tgz", + "integrity": "sha1-6qEclkVjrqnCG+zvK994U/fzwUg=" + }, + "babel-preset-jest": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.0.1.tgz", + "integrity": "sha1-YxzFRcbPAhlDATvK8i9F2H/mIZg=", + "requires": { + "babel-plugin-jest-hoist": "23.0.1", + "babel-plugin-syntax-object-rest-spread": "6.13.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + } } }, "jest-diff": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", - "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.0.1.tgz", + "integrity": "sha1-PUkTfO4SwyCktNK0pvpugtSRoWo=", "requires": { - "chalk": "1.1.3", + "chalk": "2.4.1", "diff": "3.5.0", - "jest-matcher-utils": "20.0.3", - "pretty-format": "20.0.3" + "jest-get-type": "22.4.3", + "pretty-format": "23.0.1" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + } } }, "jest-docblock": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", - "integrity": "sha1-F76phDQswz2DxQ++FUXqDvqkRxI=" - }, - "jest-environment-jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", - "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=", - "requires": { - "jest-mock": "20.0.3", - "jest-util": "20.0.3", - "jsdom": "9.12.0" - } - }, - "jest-environment-node": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", - "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.0.1.tgz", + "integrity": "sha1-3t3RgzO+XcJBUmCgTvP86SdrVyU=", "requires": { - "jest-mock": "20.0.3", - "jest-util": "20.0.3" + "detect-newline": "2.1.0" } }, - "jest-haste-map": { - "version": "20.0.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.5.tgz", - "integrity": "sha512-0IKAQjUvuZjMCNi/0VNQQF74/H9KB67hsHJqGiwTWQC6XO5Azs7kLWm+6Q/dwuhvDUvABDOBMFK2/FwZ3sZ07Q==", + "jest-each": { + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.1.0.tgz", + "integrity": "sha1-FhRrWSw1SGelrl4TzfFcbGW2lsY=", "requires": { - "fb-watchman": "2.0.0", - "graceful-fs": "4.1.11", - "jest-docblock": "20.0.3", - "micromatch": "2.3.11", - "sane": "1.6.0", - "worker-farm": "1.6.0" + "chalk": "2.4.1", + "pretty-format": "23.0.1" }, "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.1.0.tgz", + "integrity": "sha1-hZKZFOI77TV32sl1X0EG0Gl8R5w=", + "requires": { + "jest-mock": "23.1.0", + "jest-util": "23.1.0", + "jsdom": "11.11.0" + } + }, + "jest-environment-node": { + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.1.0.tgz", + "integrity": "sha1-RSwL+UnPy7rNoeF2Lu7XC8eEx9U=", + "requires": { + "jest-mock": "23.1.0", + "jest-util": "23.1.0" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==" + }, + "jest-haste-map": { + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.1.0.tgz", + "integrity": "sha1-GObH1ajScTb5G32YUvhd4McHTEk=", + "requires": { + "fb-watchman": "2.0.0", + "graceful-fs": "4.1.11", + "jest-docblock": "23.0.1", + "jest-serializer": "23.0.1", + "jest-worker": "23.0.1", + "micromatch": "2.3.11", + "sane": "2.5.2" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { "arr-flatten": "1.1.0" } @@ -5911,28 +6247,63 @@ } }, "jest-jasmine2": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", - "integrity": "sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.1.0.tgz", + "integrity": "sha1-SvqzFym2VN3NKwdK3YSTlvE7MLg=", "requires": { - "chalk": "1.1.3", - "graceful-fs": "4.1.11", - "jest-diff": "20.0.3", - "jest-matcher-utils": "20.0.3", - "jest-matchers": "20.0.3", - "jest-message-util": "20.0.3", - "jest-snapshot": "20.0.3", - "once": "1.4.0", - "p-map": "1.2.0" + "chalk": "2.4.1", + "co": "4.6.0", + "expect": "23.1.0", + "is-generator-fn": "1.0.0", + "jest-diff": "23.0.1", + "jest-each": "23.1.0", + "jest-matcher-utils": "23.0.1", + "jest-message-util": "23.1.0", + "jest-snapshot": "23.0.1", + "jest-util": "23.1.0", + "pretty-format": "23.0.1" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + } + } + }, + "jest-leak-detector": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.0.1.tgz", + "integrity": "sha1-nboHUFrDSVw50+wJrB5WRZnoYaA=", + "requires": { + "pretty-format": "23.0.1" } }, "jest-matcher-utils": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", - "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.0.1.tgz", + "integrity": "sha1-DGwNrt+YM8Kn82I2Bp7+y0w/bl8=", "requires": { - "chalk": "1.1.3", - "pretty-format": "20.0.3" + "chalk": "2.4.1", + "jest-get-type": "22.4.3", + "pretty-format": "23.0.1" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + } } }, "jest-matchers": { @@ -5944,16 +6315,131 @@ "jest-matcher-utils": "20.0.3", "jest-message-util": "20.0.3", "jest-regex-util": "20.0.3" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "jest-diff": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", + "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", + "requires": { + "chalk": "1.1.3", + "diff": "3.5.0", + "jest-matcher-utils": "20.0.3", + "pretty-format": "20.0.3" + } + }, + "jest-matcher-utils": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", + "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=", + "requires": { + "chalk": "1.1.3", + "pretty-format": "20.0.3" + } + }, + "jest-message-util": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", + "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=", + "requires": { + "chalk": "1.1.3", + "micromatch": "2.3.11", + "slash": "1.0.0" + } + }, + "jest-regex-util": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", + "integrity": "sha1-hburXRM+RGJbGfr4xqpRItCF12I=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "pretty-format": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", + "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", + "requires": { + "ansi-regex": "2.1.1", + "ansi-styles": "3.2.1" + } + } } }, "jest-message-util": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", - "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.1.0.tgz", + "integrity": "sha1-moCbpIfsrFzlEdTmmO47XuJGHqk=", "requires": { - "chalk": "1.1.3", + "@babel/code-frame": "7.0.0-beta.51", + "chalk": "2.4.1", "micromatch": "2.3.11", - "slash": "1.0.0" + "slash": "1.0.0", + "stack-utils": "1.0.1" }, "dependencies": { "arr-diff": { @@ -5979,6 +6465,16 @@ "repeat-element": "1.1.2" } }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", @@ -6026,53 +6522,103 @@ } }, "jest-mock": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", - "integrity": "sha1-i8Bw6QQUqhVcEajWTIaaDVxx2lk=" + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.1.0.tgz", + "integrity": "sha1-o4HDGxIasfYMRiotrbe4bczKxIc=" }, "jest-regex-util": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", - "integrity": "sha1-hburXRM+RGJbGfr4xqpRItCF12I=" + "version": "23.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.0.0.tgz", + "integrity": "sha1-3Vwf3gxG9DcTFM8Q96dRoj9Oj3Y=" }, "jest-resolve": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", - "integrity": "sha1-lEiz6La6/BVHlETGSZBFt//ll6U=", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.1.0.tgz", + "integrity": "sha1-ueMW7s69bwC8UKOWDRUnuuZXktI=", "requires": { - "browser-resolve": "1.11.2", - "is-builtin-module": "1.0.0", - "resolve": "1.6.0" + "browser-resolve": "1.11.3", + "chalk": "2.4.1", + "realpath-native": "1.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + } } }, "jest-resolve-dependencies": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", - "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.0.1.tgz", + "integrity": "sha1-0BoQ3a2RUsTOzfXqwriFccS2pk0=", "requires": { - "jest-regex-util": "20.0.3" + "jest-regex-util": "23.0.0", + "jest-snapshot": "23.0.1" + } + }, + "jest-runner": { + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.1.0.tgz", + "integrity": "sha1-+iCpM//3MaVDKzVh5/ZCZZT6KbU=", + "requires": { + "exit": "0.1.2", + "graceful-fs": "4.1.11", + "jest-config": "23.1.0", + "jest-docblock": "23.0.1", + "jest-haste-map": "23.1.0", + "jest-jasmine2": "23.1.0", + "jest-leak-detector": "23.0.1", + "jest-message-util": "23.1.0", + "jest-runtime": "23.1.0", + "jest-util": "23.1.0", + "jest-worker": "23.0.1", + "source-map-support": "0.5.6", + "throat": "4.1.0" + }, + "dependencies": { + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "requires": { + "buffer-from": "1.1.0", + "source-map": "0.6.1" + } + } } }, "jest-runtime": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", - "integrity": "sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.1.0.tgz", + "integrity": "sha1-tK4OhyWeys/UqIS2OdsHz03WIK8=", "requires": { "babel-core": "6.26.0", - "babel-jest": "20.0.3", "babel-plugin-istanbul": "4.1.6", - "chalk": "1.1.3", + "chalk": "2.4.1", "convert-source-map": "1.5.1", + "exit": "0.1.2", + "fast-json-stable-stringify": "2.0.0", "graceful-fs": "4.1.11", - "jest-config": "20.0.4", - "jest-haste-map": "20.0.5", - "jest-regex-util": "20.0.3", - "jest-resolve": "20.0.4", - "jest-util": "20.0.3", - "json-stable-stringify": "1.0.1", + "jest-config": "23.1.0", + "jest-haste-map": "23.1.0", + "jest-message-util": "23.1.0", + "jest-regex-util": "23.0.0", + "jest-resolve": "23.1.0", + "jest-snapshot": "23.0.1", + "jest-util": "23.1.0", + "jest-validate": "23.0.1", "micromatch": "2.3.11", + "realpath-native": "1.0.0", + "slash": "1.0.0", "strip-bom": "3.0.0", - "yargs": "7.1.0" + "write-file-atomic": "2.3.0", + "yargs": "11.0.0" }, "dependencies": { "arr-diff": { @@ -6098,6 +6644,16 @@ "repeat-element": "1.1.2" } }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", @@ -6149,42 +6705,119 @@ } } }, + "jest-serializer": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", + "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=" + }, "jest-snapshot": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", - "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.0.1.tgz", + "integrity": "sha1-ZnT6Gbnraamcq+zUFb3cQtavPn4=", "requires": { - "chalk": "1.1.3", - "jest-diff": "20.0.3", - "jest-matcher-utils": "20.0.3", - "jest-util": "20.0.3", + "chalk": "2.4.1", + "jest-diff": "23.0.1", + "jest-matcher-utils": "23.0.1", + "mkdirp": "0.5.1", "natural-compare": "1.4.0", - "pretty-format": "20.0.3" + "pretty-format": "23.0.1" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + } } }, "jest-util": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", - "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.1.0.tgz", + "integrity": "sha1-wCUbrzRkTG3S/qeKli9CY6xVdy0=", "requires": { - "chalk": "1.1.3", + "callsites": "2.0.0", + "chalk": "2.4.1", "graceful-fs": "4.1.11", - "jest-message-util": "20.0.3", - "jest-mock": "20.0.3", - "jest-validate": "20.0.3", - "leven": "2.1.0", - "mkdirp": "0.5.1" + "is-ci": "1.1.0", + "jest-message-util": "23.1.0", + "mkdirp": "0.5.1", + "slash": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + } } }, "jest-validate": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", - "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.0.1.tgz", + "integrity": "sha1-zZ8BqJ0mu4hfEqhmdxXpyGWldU8=", "requires": { - "chalk": "1.1.3", - "jest-matcher-utils": "20.0.3", + "chalk": "2.4.1", + "jest-get-type": "22.4.3", "leven": "2.1.0", - "pretty-format": "20.0.3" + "pretty-format": "23.0.1" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + } + } + }, + "jest-watcher": { + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.1.0.tgz", + "integrity": "sha1-qNWELjjZ+0r/+CPfartCpYrmzb0=", + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "string-length": "2.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + } + } + }, + "jest-worker": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.0.1.tgz", + "integrity": "sha1-nmSd2WP/QEYCb5HEAX8Dmmqkp7w=", + "requires": { + "merge-stream": "1.0.1" } }, "js-base64": { @@ -6213,36 +6846,36 @@ "optional": true }, "jsdom": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", - "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.11.0.tgz", + "integrity": "sha512-ou1VyfjwsSuWkudGxb03FotDajxAto6USAlmMZjE2lc0jCznt7sBWkhfRBRaWwbnmDqdMSTKTLT5d9sBFkkM7A==", "requires": { "abab": "1.0.4", - "acorn": "4.0.13", - "acorn-globals": "3.1.0", + "acorn": "5.6.2", + "acorn-globals": "4.1.0", "array-equal": "1.0.0", - "content-type-parser": "1.0.2", "cssom": "0.3.2", - "cssstyle": "0.2.37", + "cssstyle": "0.3.1", + "data-urls": "1.0.0", + "domexception": "1.0.1", "escodegen": "1.10.0", "html-encoding-sniffer": "1.0.2", - "nwmatcher": "1.4.4", - "parse5": "1.5.1", + "left-pad": "1.3.0", + "nwsapi": "2.0.4", + "parse5": "4.0.0", + "pn": "1.1.0", "request": "2.87.0", + "request-promise-native": "1.0.5", "sax": "1.2.4", "symbol-tree": "3.2.2", "tough-cookie": "2.4.2", + "w3c-hr-time": "1.0.1", "webidl-conversions": "4.0.2", "whatwg-encoding": "1.0.3", - "whatwg-url": "4.8.0", - "xml-name-validator": "2.0.1" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } + "whatwg-mimetype": "2.1.0", + "whatwg-url": "6.5.0", + "ws": "4.1.0", + "xml-name-validator": "3.0.0" } }, "jsesc": { @@ -6356,6 +6989,11 @@ "invert-kv": "1.0.0" } }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" + }, "leven": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", @@ -6477,11 +7115,22 @@ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, "lodash.template": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", @@ -6666,6 +7315,14 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "requires": { + "readable-stream": "2.3.6" + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -6827,6 +7484,18 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, + "nearley": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.13.0.tgz", + "integrity": "sha512-ioYYogSaZhFlCpRizQgY3UT3G1qFXmHGY/5ozoFE3dMfiCRAeJfh+IPE3/eh9gCZvqLhPCWb4bLt7Bqzo+1mLQ==", + "dev": true, + "requires": { + "nomnom": "1.6.2", + "railroad-diagrams": "1.0.0", + "randexp": "0.4.6", + "semver": "5.5.0" + } + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -6917,6 +7586,24 @@ "which": "1.3.1" } }, + "nomnom": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", + "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", + "dev": true, + "requires": { + "colors": "0.5.1", + "underscore": "1.4.4" + }, + "dependencies": { + "colors": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", + "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", + "dev": true + } + } + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -6983,6 +7670,11 @@ "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==" }, + "nwsapi": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.4.tgz", + "integrity": "sha512-Zt6HRR6RcJkuj5/N9zeE7FN6YitRW//hK2wTOwX274IBphbY3Zf5+yn5mZ9v/SzAOTMjQNxZf9KkmPLWn0cV4g==" + }, "oauth-sign": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", @@ -7026,6 +7718,18 @@ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.0.tgz", "integrity": "sha512-05KzQ70lSeGSrZJQXE5wNDiTkBJDlUT/myi6RX9dVIvz7a7Qh4oH93BQdiPMn27nldYvVQCKMUaM83AfizZlsQ==" }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, "object-keys": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", @@ -7039,6 +7743,39 @@ "isobject": "3.0.1" } }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "function-bind": "1.1.1", + "has-symbols": "1.0.0", + "object-keys": "1.0.11" + } + }, + "object.entries": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", + "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.12.0", + "function-bind": "1.1.1", + "has": "1.0.3" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.12.0" + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -7056,6 +7793,18 @@ "isobject": "3.0.1" } }, + "object.values": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", + "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.12.0", + "function-bind": "1.1.1", + "has": "1.0.3" + } + }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -7250,9 +7999,9 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" }, "parse5": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", - "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" }, "parseurl": { "version": "1.3.2", @@ -7372,6 +8121,11 @@ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + }, "portfinder": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", @@ -8568,12 +9322,19 @@ } }, "pretty-format": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", - "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.0.1.tgz", + "integrity": "sha1-1h0GUmjkx1kIO8y8onoBrXx2AfQ=", "requires": { - "ansi-regex": "2.1.1", + "ansi-regex": "3.0.0", "ansi-styles": "3.2.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + } } }, "private": { @@ -8697,6 +9458,22 @@ "performance-now": "2.1.0" } }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", + "dev": true + }, + "randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dev": true, + "requires": { + "discontinuous-range": "1.0.0", + "ret": "0.1.15" + } + }, "randomatic": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", @@ -8845,6 +9622,24 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-4.0.0.tgz", "integrity": "sha512-FlsPxavEyMuR6TjVbSSywovXSEyOg6ZDj5+Z8nbsRl9EkOzAhEIcS+GLoQDC5fz/t9suhUXWmUrOBrgeUvrMxw==" }, + "react-is": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.4.1.tgz", + "integrity": "sha512-xpb0PpALlFWNw/q13A+1aHeyJyLYCg0/cCHPUA43zYluZuIPHaHL3k8OBsTgQtxqW0FhyDEMvi8fZ/+7+r4OSQ==", + "dev": true + }, + "react-reconciler": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.7.0.tgz", + "integrity": "sha512-50JwZ3yNyMS8fchN+jjWEJOH3Oze7UmhxeoJLn2j6f3NjpfCRbcmih83XTWmzqtar/ivd5f7tvQhvvhism2fgg==", + "dev": true, + "requires": { + "fbjs": "0.8.17", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.1" + } + }, "react-router": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", @@ -8918,6 +9713,420 @@ "whatwg-fetch": "2.0.3" }, "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + }, + "acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "requires": { + "acorn": "4.0.13" + } + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "bser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", + "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", + "requires": { + "node-int64": "0.4.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "requires": { + "cssom": "0.3.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "jest": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", + "integrity": "sha1-PdJgwpidba1nix6cxNkZRPbWAqw=", + "requires": { + "jest-cli": "20.0.4" + }, + "dependencies": { + "jest-cli": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz", + "integrity": "sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=", + "requires": { + "ansi-escapes": "1.4.0", + "callsites": "2.0.0", + "chalk": "1.1.3", + "graceful-fs": "4.1.11", + "is-ci": "1.1.0", + "istanbul-api": "1.3.1", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-source-maps": "1.2.5", + "jest-changed-files": "20.0.3", + "jest-config": "20.0.4", + "jest-docblock": "20.0.3", + "jest-environment-jsdom": "20.0.3", + "jest-haste-map": "20.0.5", + "jest-jasmine2": "20.0.4", + "jest-message-util": "20.0.3", + "jest-regex-util": "20.0.3", + "jest-resolve-dependencies": "20.0.3", + "jest-runtime": "20.0.4", + "jest-snapshot": "20.0.3", + "jest-util": "20.0.3", + "micromatch": "2.3.11", + "node-notifier": "5.2.1", + "pify": "2.3.0", + "slash": "1.0.0", + "string-length": "1.0.1", + "throat": "3.2.0", + "which": "1.3.1", + "worker-farm": "1.6.0", + "yargs": "7.1.0" + } + } + } + }, + "jest-changed-files": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-20.0.3.tgz", + "integrity": "sha1-k5TVzGXEOEBhSb7xv01Sto4D4/g=" + }, + "jest-config": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", + "integrity": "sha1-43kwqyIXyRNgXv8T5712PsSPruo=", + "requires": { + "chalk": "1.1.3", + "glob": "7.1.2", + "jest-environment-jsdom": "20.0.3", + "jest-environment-node": "20.0.3", + "jest-jasmine2": "20.0.4", + "jest-matcher-utils": "20.0.3", + "jest-regex-util": "20.0.3", + "jest-resolve": "20.0.4", + "jest-validate": "20.0.3", + "pretty-format": "20.0.3" + } + }, + "jest-diff": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", + "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", + "requires": { + "chalk": "1.1.3", + "diff": "3.5.0", + "jest-matcher-utils": "20.0.3", + "pretty-format": "20.0.3" + } + }, + "jest-docblock": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", + "integrity": "sha1-F76phDQswz2DxQ++FUXqDvqkRxI=" + }, + "jest-environment-jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", + "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=", + "requires": { + "jest-mock": "20.0.3", + "jest-util": "20.0.3", + "jsdom": "9.12.0" + } + }, + "jest-environment-node": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", + "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=", + "requires": { + "jest-mock": "20.0.3", + "jest-util": "20.0.3" + } + }, + "jest-haste-map": { + "version": "20.0.5", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.5.tgz", + "integrity": "sha512-0IKAQjUvuZjMCNi/0VNQQF74/H9KB67hsHJqGiwTWQC6XO5Azs7kLWm+6Q/dwuhvDUvABDOBMFK2/FwZ3sZ07Q==", + "requires": { + "fb-watchman": "2.0.0", + "graceful-fs": "4.1.11", + "jest-docblock": "20.0.3", + "micromatch": "2.3.11", + "sane": "1.6.0", + "worker-farm": "1.6.0" + } + }, + "jest-jasmine2": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", + "integrity": "sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=", + "requires": { + "chalk": "1.1.3", + "graceful-fs": "4.1.11", + "jest-diff": "20.0.3", + "jest-matcher-utils": "20.0.3", + "jest-matchers": "20.0.3", + "jest-message-util": "20.0.3", + "jest-snapshot": "20.0.3", + "once": "1.4.0", + "p-map": "1.2.0" + } + }, + "jest-matcher-utils": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", + "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=", + "requires": { + "chalk": "1.1.3", + "pretty-format": "20.0.3" + } + }, + "jest-message-util": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", + "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=", + "requires": { + "chalk": "1.1.3", + "micromatch": "2.3.11", + "slash": "1.0.0" + } + }, + "jest-mock": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", + "integrity": "sha1-i8Bw6QQUqhVcEajWTIaaDVxx2lk=" + }, + "jest-regex-util": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", + "integrity": "sha1-hburXRM+RGJbGfr4xqpRItCF12I=" + }, + "jest-resolve": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", + "integrity": "sha1-lEiz6La6/BVHlETGSZBFt//ll6U=", + "requires": { + "browser-resolve": "1.11.3", + "is-builtin-module": "1.0.0", + "resolve": "1.6.0" + } + }, + "jest-resolve-dependencies": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", + "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=", + "requires": { + "jest-regex-util": "20.0.3" + } + }, + "jest-runtime": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", + "integrity": "sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=", + "requires": { + "babel-core": "6.26.0", + "babel-jest": "20.0.3", + "babel-plugin-istanbul": "4.1.6", + "chalk": "1.1.3", + "convert-source-map": "1.5.1", + "graceful-fs": "4.1.11", + "jest-config": "20.0.4", + "jest-haste-map": "20.0.5", + "jest-regex-util": "20.0.3", + "jest-resolve": "20.0.4", + "jest-util": "20.0.3", + "json-stable-stringify": "1.0.1", + "micromatch": "2.3.11", + "strip-bom": "3.0.0", + "yargs": "7.1.0" + } + }, + "jest-snapshot": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", + "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=", + "requires": { + "chalk": "1.1.3", + "jest-diff": "20.0.3", + "jest-matcher-utils": "20.0.3", + "jest-util": "20.0.3", + "natural-compare": "1.4.0", + "pretty-format": "20.0.3" + } + }, + "jest-util": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", + "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=", + "requires": { + "chalk": "1.1.3", + "graceful-fs": "4.1.11", + "jest-message-util": "20.0.3", + "jest-mock": "20.0.3", + "jest-validate": "20.0.3", + "leven": "2.1.0", + "mkdirp": "0.5.1" + } + }, + "jest-validate": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", + "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=", + "requires": { + "chalk": "1.1.3", + "jest-matcher-utils": "20.0.3", + "leven": "2.1.0", + "pretty-format": "20.0.3" + } + }, + "jsdom": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", + "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", + "requires": { + "abab": "1.0.4", + "acorn": "4.0.13", + "acorn-globals": "3.1.0", + "array-equal": "1.0.0", + "content-type-parser": "1.0.2", + "cssom": "0.3.2", + "cssstyle": "0.2.37", + "escodegen": "1.10.0", + "html-encoding-sniffer": "1.0.2", + "nwmatcher": "1.4.4", + "parse5": "1.5.1", + "request": "2.87.0", + "sax": "1.2.4", + "symbol-tree": "3.2.2", + "tough-cookie": "2.4.2", + "webidl-conversions": "4.0.2", + "whatwg-encoding": "1.0.3", + "whatwg-url": "4.8.0", + "xml-name-validator": "2.0.1" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" + }, + "pretty-format": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", + "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", + "requires": { + "ansi-regex": "2.1.1", + "ansi-styles": "3.2.1" + } + }, "promise": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz", @@ -8926,13 +10135,136 @@ "asap": "2.0.6" } }, + "sane": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", + "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=", + "requires": { + "anymatch": "1.3.2", + "exec-sh": "0.2.1", + "fb-watchman": "1.9.2", + "minimatch": "3.0.4", + "minimist": "1.2.0", + "walker": "1.0.7", + "watch": "0.10.0" + }, + "dependencies": { + "fb-watchman": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", + "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=", + "requires": { + "bser": "1.0.2" + } + } + } + }, + "string-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", + "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", + "requires": { + "strip-ansi": "3.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "throat": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", + "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==" + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "watch": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", + "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=" + }, "whatwg-fetch": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + }, + "whatwg-url": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", + "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", + "requires": { + "tr46": "0.0.3", + "webidl-conversions": "3.0.1" + }, + "dependencies": { + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + } + } + }, + "xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "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" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "requires": { + "camelcase": "3.0.0" + } } } }, + "react-test-renderer": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.4.1.tgz", + "integrity": "sha512-wyyiPxRZOTpKnNIgUBOB6xPLTpIzwcQMIURhZvzUqZzezvHjaGNsDPBhMac5fIY3Jf5NuKxoGvV64zDSOECPPQ==", + "dev": true, + "requires": { + "fbjs": "0.8.17", + "object-assign": "4.1.1", + "prop-types": "15.6.1", + "react-is": "16.4.1" + } + }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -8996,6 +10328,14 @@ "set-immediate-shim": "1.0.1" } }, + "realpath-native": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.0.tgz", + "integrity": "sha512-XJtlRJ9jf0E1H1SLeJyQ9PGzQD7S65h1pRXEcAeK48doKOnKxcgPeNohJvD5u/2sI9J1oke6E8bZHS/fmW1UiQ==", + "requires": { + "util.promisify": "1.0.0" + } + }, "recursive-readdir": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz", @@ -9228,6 +10568,24 @@ } } }, + "request-promise-core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", + "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "requires": { + "lodash": "4.17.10" + } + }, + "request-promise-native": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", + "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "requires": { + "request-promise-core": "1.1.1", + "stealthy-require": "1.1.1", + "tough-cookie": "2.4.2" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -9343,6 +10701,21 @@ "inherits": "2.0.3" } }, + "rst-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", + "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", + "dev": true, + "requires": { + "lodash.flattendeep": "4.4.0", + "nearley": "2.13.0" + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" + }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", @@ -9383,33 +10756,28 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", - "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", "requires": { - "anymatch": "1.3.2", + "anymatch": "2.0.0", + "capture-exit": "1.2.0", "exec-sh": "0.2.1", - "fb-watchman": "1.9.2", - "minimatch": "3.0.4", + "fb-watchman": "2.0.0", + "fsevents": "1.2.4", + "micromatch": "3.1.10", "minimist": "1.2.0", "walker": "1.0.7", - "watch": "0.10.0" + "watch": "0.18.0" }, "dependencies": { - "bser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", - "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", - "requires": { - "node-int64": "0.4.0" - } - }, - "fb-watchman": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", - "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "requires": { - "bser": "1.0.2" + "micromatch": "3.1.10", + "normalize-path": "2.1.1" } }, "minimist": { @@ -9885,6 +11253,11 @@ "tweetnacl": "0.14.5" } }, + "stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=" + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -9909,6 +11282,11 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, "stream-browserify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", @@ -9936,11 +11314,27 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", - "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", "requires": { - "strip-ansi": "3.0.1" + "astral-regex": "1.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } } }, "string-width": { @@ -10158,9 +11552,9 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "throat": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", - "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" }, "through": { "version": "2.3.8", @@ -10273,9 +11667,12 @@ } }, "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "2.1.1" + } }, "trim-newlines": { "version": "1.0.0", @@ -10386,6 +11783,12 @@ } } }, + "underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", + "dev": true + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -10608,6 +12011,15 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "1.1.2", + "object.getownpropertydescriptors": "2.0.3" + } + }, "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", @@ -10665,6 +12077,14 @@ "indexof": "0.0.1" } }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "requires": { + "browser-process-hrtime": "0.1.2" + } + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", @@ -10682,9 +12102,20 @@ } }, "watch": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", - "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=" + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "requires": { + "exec-sh": "0.2.1", + "minimist": "1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } }, "watchpack": { "version": "1.6.0", @@ -11141,20 +12572,19 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" }, + "whatwg-mimetype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz", + "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==" + }, "whatwg-url": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", - "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", "requires": { - "tr46": "0.0.3", - "webidl-conversions": "3.0.1" - }, - "dependencies": { - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - } + "lodash.sortby": "4.7.0", + "tr46": "1.0.1", + "webidl-conversions": "4.0.2" } }, "whet.extend": { @@ -11253,15 +12683,24 @@ "signal-exit": "3.0.2" } }, + "ws": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.2" + } + }, "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" }, "xml-name-validator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", - "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, "xtend": { "version": "4.0.1", @@ -11279,72 +12718,76 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", + "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", + "cliui": "4.1.0", "decamelize": "1.2.0", + "find-up": "2.1.0", "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", + "os-locale": "2.1.0", "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", + "string-width": "2.1.1", + "which-module": "2.0.0", "y18n": "3.2.1", - "yargs-parser": "5.0.0" + "yargs-parser": "9.0.2" }, "dependencies": { - "camelcase": { + "ansi-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", "wrap-ansi": "2.1.0" } }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "number-is-nan": "1.0.1" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "ansi-regex": "3.0.0" } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" } } }, "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "requires": { - "camelcase": "3.0.0" + "camelcase": "4.1.0" }, "dependencies": { "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" } } } diff --git a/package.json b/package.json index d170d92c8..117c32699 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "private": true, "dependencies": { "axios": "^0.18.0", + "jest": "^23.1.0", "react": "^16.4.1", "react-dom": "^16.4.1", "react-router-dom": "^4.3.1", @@ -14,5 +15,15 @@ "build": "react-scripts build", "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" + }, + "devDependencies": { + "enzyme": "^3.3.0", + "enzyme-adapter-react-16": "^1.1.1", + "enzyme-to-json": "^3.3.4" + }, + "jest": { + "snapshotSerializers": [ + "enzyme-to-json/serializer" + ] } } diff --git a/src/App.test.js b/src/App.test.js index a754b201b..7abf07aed 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -1,9 +1,12 @@ import React from 'react'; import ReactDOM from 'react-dom'; +// import { shallow } from 'enzyme'; import App from './App'; -it('renders without crashing', () => { - const div = document.createElement('div'); - ReactDOM.render(, div); - ReactDOM.unmountComponentAtNode(div); +describe('App', () => { + it('renders without crashing', () => { + const div = document.createElement('div'); + ReactDOM.render(, div); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/src/setupTests.js b/src/setupTests.js new file mode 100644 index 000000000..82edfc9e5 --- /dev/null +++ b/src/setupTests.js @@ -0,0 +1,4 @@ +import { configure } from 'enzyme'; +import Adapter from 'enzyme-adapter-react-16'; + +configure({ adapter: new Adapter() }); From a13ae6a57398c211d103f2d7a8a2f8b08078cbeb Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 20 Jun 2018 16:08:11 -0700 Subject: [PATCH 45/59] adds snapshot tests for Customerlist --- src/components/Customer.test.js | 22 +++++++++++++ src/components/CustomerList.js | 22 +++++++++---- src/components/CustomerList.test.js | 15 +++++++++ .../__snapshots__/Customer.test.js.snap | 31 +++++++++++++++++++ .../__snapshots__/CustomerList.test.js.snap | 11 +++++++ 5 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 src/components/Customer.test.js create mode 100644 src/components/CustomerList.test.js create mode 100644 src/components/__snapshots__/Customer.test.js.snap create mode 100644 src/components/__snapshots__/CustomerList.test.js.snap diff --git a/src/components/Customer.test.js b/src/components/Customer.test.js new file mode 100644 index 000000000..673168f87 --- /dev/null +++ b/src/components/Customer.test.js @@ -0,0 +1,22 @@ +import React from 'react'; +import { mount } from 'enzyme'; +import Customer from './Customer'; + +describe('Board', () => { + test('snapshot', () => { + const wrapper = mount( + {}} + /> + ); + expect(wrapper).toMatchSnapshot(); + wrapper.unmount(); + }); +}); diff --git a/src/components/CustomerList.js b/src/components/CustomerList.js index 5536c3959..f7b1877ea 100644 --- a/src/components/CustomerList.js +++ b/src/components/CustomerList.js @@ -19,14 +19,24 @@ class CustomerList extends Component { axios.get(query) .then((response) => { console.log(response); - this.setState({ - customers: response.data - }) + if(this._mounted){ + this.setState({ + customers: response.data + }); + } + // this.setState({ + // customers: response.data + // }); }) .catch((error) => { - this.setState({ - error: error.message - }); + if(this._mounted){ + this.setState({ + error: error.message + }); + } + // this.setState({ + // error: error.message + // }); if (error.message) { this.renderError(); console.log(error.message); diff --git a/src/components/CustomerList.test.js b/src/components/CustomerList.test.js new file mode 100644 index 000000000..711db52dc --- /dev/null +++ b/src/components/CustomerList.test.js @@ -0,0 +1,15 @@ +import React from 'react'; +import { mount } from 'enzyme'; +import CustomerList from './CustomerList'; + +describe('CustomerList', () => { + test('snapshot', () => { + const wrapper = mount( + {}} + /> + ); + expect(wrapper).toMatchSnapshot(); + wrapper.unmount(); + }); +}); diff --git a/src/components/__snapshots__/Customer.test.js.snap b/src/components/__snapshots__/Customer.test.js.snap new file mode 100644 index 000000000..6259d1879 --- /dev/null +++ b/src/components/__snapshots__/Customer.test.js.snap @@ -0,0 +1,31 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Board snapshot 1`] = ` + +
+ customer profile +

+

+

+ , + +

+

+

+
+`; diff --git a/src/components/__snapshots__/CustomerList.test.js.snap b/src/components/__snapshots__/CustomerList.test.js.snap new file mode 100644 index 000000000..ef2ed9963 --- /dev/null +++ b/src/components/__snapshots__/CustomerList.test.js.snap @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CustomerList snapshot 1`] = ` + +
+ +`; From e278a37e39355eb4a33f5ef257c7817ded81ddb3 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Wed, 20 Jun 2018 16:15:21 -0700 Subject: [PATCH 46/59] footer; code clean up --- src/App.css | 15 +++++++++------ src/App.js | 21 ++++++++++++++------- src/tmdb.png | Bin 0 -> 3498 bytes 3 files changed, 23 insertions(+), 13 deletions(-) create mode 100644 src/tmdb.png diff --git a/src/App.css b/src/App.css index 7b28f5955..25967c8b6 100644 --- a/src/App.css +++ b/src/App.css @@ -1,6 +1,9 @@ /* Basics */ .App { text-align: center; + display: flex; + flex-direction: column; + min-height: 100vh; } p { @@ -22,12 +25,12 @@ a { color: white; } -.show { - display: block -} - -.hide { - display: none; +footer { + height: 100px; + margin-top: 25%; + position: relative; + bottom: 0; + width: 100%; } /* HOME */ diff --git a/src/App.js b/src/App.js index a72634f10..a7e0aa264 100644 --- a/src/App.js +++ b/src/App.js @@ -2,8 +2,11 @@ import React, { Component } from 'react'; import axios from 'axios'; import RentalList from './components/RentalList'; import CustomerList from './components/CustomerList'; -import './App.css'; import Tmbd from './components/Tmbd.js' +import './App.css'; +import logo from './tmdb.png'; + + import {BrowserRouter as Router, Route, Link} from 'react-router-dom'; // import Route from 'react-router-dom/Route'; @@ -90,6 +93,7 @@ class App extends Component { return (
+

Ada Movies

@@ -102,15 +106,14 @@ class App extends Component {
- -
+
Chosen Movie: {this.state.selectedMovie}
Chosen Customer: {this.state.selectedCustomer}
-
-
- +
+
+
@@ -124,7 +127,11 @@ class App extends Component { statusCallback = { this.setMessageStatus }/>} />
- + +
+ +

☞ Phoebe & Lily

+
); diff --git a/src/tmdb.png b/src/tmdb.png new file mode 100644 index 0000000000000000000000000000000000000000..8dd11b893d09e7fa27530897d4fbf81544c0322e GIT binary patch literal 3498 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 Date: Wed, 20 Jun 2018 16:20:39 -0700 Subject: [PATCH 47/59] snapshot test for movie comp. --- src/components/CustomerList.js | 10 ---------- src/components/Movie.test.js | 20 +++++++++++++++++++ .../__snapshots__/Movie.test.js.snap | 17 ++++++++++++++++ 3 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 src/components/Movie.test.js create mode 100644 src/components/__snapshots__/Movie.test.js.snap diff --git a/src/components/CustomerList.js b/src/components/CustomerList.js index f7b1877ea..7105ad9b4 100644 --- a/src/components/CustomerList.js +++ b/src/components/CustomerList.js @@ -19,24 +19,14 @@ class CustomerList extends Component { axios.get(query) .then((response) => { console.log(response); - if(this._mounted){ this.setState({ customers: response.data }); - } - // this.setState({ - // customers: response.data - // }); }) .catch((error) => { - if(this._mounted){ this.setState({ error: error.message }); - } - // this.setState({ - // error: error.message - // }); if (error.message) { this.renderError(); console.log(error.message); diff --git a/src/components/Movie.test.js b/src/components/Movie.test.js new file mode 100644 index 000000000..a5ce37244 --- /dev/null +++ b/src/components/Movie.test.js @@ -0,0 +1,20 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import Movie from './Movie'; + +describe('CustomerList', () => { + test('snapshot', () => { + const wrapper = shallow( + {}} + /> + ); + expect(wrapper).toMatchSnapshot(); + wrapper.unmount(); + }); +}); diff --git a/src/components/__snapshots__/Movie.test.js.snap b/src/components/__snapshots__/Movie.test.js.snap new file mode 100644 index 000000000..449d0b527 --- /dev/null +++ b/src/components/__snapshots__/Movie.test.js.snap @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CustomerList snapshot 1`] = ` +
+

+ +

+

+

+`; From 63def761bcfb6e92cc6eeaa4914fd6ec6ac9e5d6 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 20 Jun 2018 16:23:03 -0700 Subject: [PATCH 48/59] snapshot test for rentalList comp. --- src/components/Movie.test.js | 2 +- src/components/RentalList.test.js | 15 +++++++++++++++ src/components/__snapshots__/Movie.test.js.snap | 2 +- .../__snapshots__/RentalList.test.js.snap | 15 +++++++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 src/components/RentalList.test.js create mode 100644 src/components/__snapshots__/RentalList.test.js.snap diff --git a/src/components/Movie.test.js b/src/components/Movie.test.js index a5ce37244..a9376a742 100644 --- a/src/components/Movie.test.js +++ b/src/components/Movie.test.js @@ -2,7 +2,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import Movie from './Movie'; -describe('CustomerList', () => { +describe('Movie', () => { test('snapshot', () => { const wrapper = shallow( { + test('snapshot', () => { + const wrapper = shallow( + {}} + /> + ); + expect(wrapper).toMatchSnapshot(); + wrapper.unmount(); + }); +}); diff --git a/src/components/__snapshots__/Movie.test.js.snap b/src/components/__snapshots__/Movie.test.js.snap index 449d0b527..c28f43d85 100644 --- a/src/components/__snapshots__/Movie.test.js.snap +++ b/src/components/__snapshots__/Movie.test.js.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`CustomerList snapshot 1`] = ` +exports[`Movie snapshot 1`] = `
diff --git a/src/components/__snapshots__/RentalList.test.js.snap b/src/components/__snapshots__/RentalList.test.js.snap new file mode 100644 index 000000000..1b923043a --- /dev/null +++ b/src/components/__snapshots__/RentalList.test.js.snap @@ -0,0 +1,15 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`RentalList snapshot 1`] = ` +
+

+ +

+

+

+`; From f68630964e4629f62f261f587cfa9b7841c4bd30 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 20 Jun 2018 16:25:05 -0700 Subject: [PATCH 49/59] snapshot test for searchtmbdform comp. --- src/components/SearchTmbdForm.test.js | 15 ++++++++++ .../__snapshots__/SearchTmbdForm.test.js.snap | 28 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 src/components/SearchTmbdForm.test.js create mode 100644 src/components/__snapshots__/SearchTmbdForm.test.js.snap diff --git a/src/components/SearchTmbdForm.test.js b/src/components/SearchTmbdForm.test.js new file mode 100644 index 000000000..c5984b2dd --- /dev/null +++ b/src/components/SearchTmbdForm.test.js @@ -0,0 +1,15 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import SearchTmbdForm from './SearchTmbdForm'; + +describe('SearchTmbdForm', () => { + test('snapshot', () => { + const wrapper = shallow( + {}} + /> + ); + expect(wrapper).toMatchSnapshot(); + wrapper.unmount(); + }); +}); diff --git a/src/components/__snapshots__/SearchTmbdForm.test.js.snap b/src/components/__snapshots__/SearchTmbdForm.test.js.snap new file mode 100644 index 000000000..4730bc28b --- /dev/null +++ b/src/components/__snapshots__/SearchTmbdForm.test.js.snap @@ -0,0 +1,28 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`SearchTmbdForm snapshot 1`] = ` +
+
+ + + +
+
+`; From 7fb3dfc4cf121ae2f13e7cc8ad149caab84aa6bc Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 20 Jun 2018 16:29:11 -0700 Subject: [PATCH 50/59] snapshot test for showmovieresults comp. --- src/components/ShowMovieResults.test.js | 16 ++++++++++++++++ .../__snapshots__/ShowMovieResults.test.js.snap | 7 +++++++ 2 files changed, 23 insertions(+) create mode 100644 src/components/ShowMovieResults.test.js create mode 100644 src/components/__snapshots__/ShowMovieResults.test.js.snap diff --git a/src/components/ShowMovieResults.test.js b/src/components/ShowMovieResults.test.js new file mode 100644 index 000000000..4f41c5649 --- /dev/null +++ b/src/components/ShowMovieResults.test.js @@ -0,0 +1,16 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import ShowMovieResults from './ShowMovieResults'; + +describe('ShowMovieResults', () => { + test('snapshot', () => { + const wrapper = shallow( + {}} + /> + ); + expect(wrapper).toMatchSnapshot(); + wrapper.unmount(); + }); +}); diff --git a/src/components/__snapshots__/ShowMovieResults.test.js.snap b/src/components/__snapshots__/ShowMovieResults.test.js.snap new file mode 100644 index 000000000..143a0ecd2 --- /dev/null +++ b/src/components/__snapshots__/ShowMovieResults.test.js.snap @@ -0,0 +1,7 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ShowMovieResults snapshot 1`] = ` +
+`; From 431a5e7ea2841d881a135fa8c65fe46fb20feeea Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 20 Jun 2018 16:30:48 -0700 Subject: [PATCH 51/59] snapshot test for tmbd comp. --- src/components/Tmbd.test.js | 15 +++++++++++++ .../__snapshots__/Tmbd.test.js.snap | 21 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/components/Tmbd.test.js create mode 100644 src/components/__snapshots__/Tmbd.test.js.snap diff --git a/src/components/Tmbd.test.js b/src/components/Tmbd.test.js new file mode 100644 index 000000000..b64f678f1 --- /dev/null +++ b/src/components/Tmbd.test.js @@ -0,0 +1,15 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import Tmbd from './Tmbd'; + +describe('Tmbd', () => { + test('snapshot', () => { + const wrapper = shallow( + {}} + /> + ); + expect(wrapper).toMatchSnapshot(); + wrapper.unmount(); + }); +}); diff --git a/src/components/__snapshots__/Tmbd.test.js.snap b/src/components/__snapshots__/Tmbd.test.js.snap new file mode 100644 index 000000000..9f0a4c01c --- /dev/null +++ b/src/components/__snapshots__/Tmbd.test.js.snap @@ -0,0 +1,21 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Tmbd snapshot 1`] = ` +
+
+ +
+
+ +
+
+`; From b9ed87f7d4104761631bc964c878be08f77da546 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 20 Jun 2018 16:33:27 -0700 Subject: [PATCH 52/59] snapshot test for tmbdmovie --- src/components/TmbdMovie.test.js | 20 ++++++++++++++++ .../__snapshots__/TmbdMovie.test.js.snap | 24 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/components/TmbdMovie.test.js create mode 100644 src/components/__snapshots__/TmbdMovie.test.js.snap diff --git a/src/components/TmbdMovie.test.js b/src/components/TmbdMovie.test.js new file mode 100644 index 000000000..51477650a --- /dev/null +++ b/src/components/TmbdMovie.test.js @@ -0,0 +1,20 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import TmbdMovie from './TmbdMovie'; + +describe('TmbdMovie', () => { + test('snapshot', () => { + const wrapper = shallow( + {}} + /> + ); + expect(wrapper).toMatchSnapshot(); + wrapper.unmount(); + }); +}); diff --git a/src/components/__snapshots__/TmbdMovie.test.js.snap b/src/components/__snapshots__/TmbdMovie.test.js.snap new file mode 100644 index 000000000..097c80f57 --- /dev/null +++ b/src/components/__snapshots__/TmbdMovie.test.js.snap @@ -0,0 +1,24 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`TmbdMovie snapshot 1`] = ` +
+

+ +

+

+ Release Date: +

+ movie poster + +
+`; From b1b57650ad68d5c7218ce6efb296a755554f6b46 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Thu, 21 Jun 2018 13:44:17 -0700 Subject: [PATCH 53/59] alt txt added to logo; alerts for adding movie to library --- src/App.js | 4 ++-- src/components/TmbdMovie.js | 29 ++++++++++++++++------------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/App.js b/src/App.js index a7e0aa264..6bdcfc66c 100644 --- a/src/App.js +++ b/src/App.js @@ -127,9 +127,9 @@ class App extends Component { statusCallback = { this.setMessageStatus }/>} />
- +
- + The Movie Database logo

☞ Phoebe & Lily

diff --git a/src/components/TmbdMovie.js b/src/components/TmbdMovie.js index a53ec9510..d381545f8 100644 --- a/src/components/TmbdMovie.js +++ b/src/components/TmbdMovie.js @@ -8,21 +8,24 @@ class TmbdMovie extends Component { onFormSubmit = (event) => { event.preventDefault(); const url = 'http://localhost:3000/movies/'; - const title = encodeURIComponent(this.props.title); - axios.get(`${url}${title}`) - .then((response) => { - console.log(response.data); - this.props.statusCallback('This movie is already in the library'); - }) - .catch((error) => { - console.log(error.response.status); - if (error.response.status === 404){ - this.addToLibrary(); - } + + if (window.confirm('Are you sure you wish to add this movie?')) { + axios.get(`${url}${title}`) + .then((response) => { + console.log(response.data); + window.alert('This movie is already in the library'); + }) + .catch((error) => { + console.log(error.response.status); + if (error.response.status === 404){ + this.addToLibrary(); + } }); + } } + addToLibrary = () => { const url = 'http://localhost:3000/movies/'; const movieObj = { @@ -38,10 +41,10 @@ class TmbdMovie extends Component { axios.post(url , movieObj) .then((response) => { console.log(response); - this.props.statusCallback('Movie posted!'); + window.alert('Movie posted!'); }) .catch((error) => { - this.props.statusCallback(error.message); + window.alert(error.message); }); } From 5220592ef9e4a70b7db0a2557d76cbe77bfd015d Mon Sep 17 00:00:00 2001 From: Phoebe Date: Thu, 21 Jun 2018 15:58:12 -0700 Subject: [PATCH 54/59] changes back to localhost from aws instance --- src/components/RentalList.js | 1 + src/components/Tmbd.js | 1 + src/components/TmbdMovie.js | 2 ++ 3 files changed, 4 insertions(+) diff --git a/src/components/RentalList.js b/src/components/RentalList.js index 5e6696141..88414ebf3 100644 --- a/src/components/RentalList.js +++ b/src/components/RentalList.js @@ -14,6 +14,7 @@ class RentalList extends Component { componentDidMount = () => { let query = 'http://localhost:3000/movies' + // let query = 'http://video-store-env.2u3bfdmdgx.us-west-2.elasticbeanstalk.com/movies' axios.get(query) .then((response) => { diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js index 0734cd83c..099d4f525 100644 --- a/src/components/Tmbd.js +++ b/src/components/Tmbd.js @@ -17,6 +17,7 @@ class Tmbd extends Component { getMovies = (search) => { const url = 'http://localhost:3000//movies?query='; + // const url='http://video-store-env.2u3bfdmdgx.us-west-2.elasticbeanstalk.com/movies?query=' axios.get(`${url}${search}`) .then((response) => { this.setState({ diff --git a/src/components/TmbdMovie.js b/src/components/TmbdMovie.js index d381545f8..f8060800b 100644 --- a/src/components/TmbdMovie.js +++ b/src/components/TmbdMovie.js @@ -8,6 +8,7 @@ class TmbdMovie extends Component { onFormSubmit = (event) => { event.preventDefault(); const url = 'http://localhost:3000/movies/'; + // const url = 'http://video-store-env.2u3bfdmdgx.us-west-2.elasticbeanstalk.com/movies/' const title = encodeURIComponent(this.props.title); if (window.confirm('Are you sure you wish to add this movie?')) { @@ -28,6 +29,7 @@ class TmbdMovie extends Component { addToLibrary = () => { const url = 'http://localhost:3000/movies/'; + // const url = 'http://video-store-env.2u3bfdmdgx.us-west-2.elasticbeanstalk.com/movies/'; const movieObj = { title: this.props.title, release_date: this.props.releaseDate, From 8a2d34a7a1085e3a75ba6f0d2dc204f8bfd84e56 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Fri, 22 Jun 2018 11:08:34 -0700 Subject: [PATCH 55/59] refactored/cleaned up tmbd component --- src/App.js | 6 +++++- src/components/Tmbd.js | 15 +++------------ src/components/__snapshots__/Tmbd.test.js.snap | 8 ++------ 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/src/App.js b/src/App.js index 6bdcfc66c..ae11b9d63 100644 --- a/src/App.js +++ b/src/App.js @@ -98,7 +98,7 @@ class App extends Component {

Ada Movies

- {this.statusMessage()} +
@@ -115,6 +115,10 @@ class App extends Component {
+
+ {this.statusMessage()} +
+
} /> diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js index 099d4f525..5a0d05f28 100644 --- a/src/components/Tmbd.js +++ b/src/components/Tmbd.js @@ -9,19 +9,15 @@ class Tmbd extends Component { constructor(){ super(); this.state = { - moviesAreHidden: true, - movieHidden: true, movies: [] } } getMovies = (search) => { const url = 'http://localhost:3000//movies?query='; - // const url='http://video-store-env.2u3bfdmdgx.us-west-2.elasticbeanstalk.com/movies?query=' axios.get(`${url}${search}`) .then((response) => { this.setState({ - moviesAreHidden: false, movies: response.data }); console.log(this.state.movies); @@ -31,11 +27,6 @@ class Tmbd extends Component { }) } - displayComp = (stateVar) => { - if (stateVar) { return 'hide' } - return 'show'; - } - statusUpdate = (status) => { this.props.statusCallback(status); } @@ -43,16 +34,16 @@ class Tmbd extends Component { render(){ return(
-
+
-
+
diff --git a/src/components/__snapshots__/Tmbd.test.js.snap b/src/components/__snapshots__/Tmbd.test.js.snap index 9f0a4c01c..0e05fd68b 100644 --- a/src/components/__snapshots__/Tmbd.test.js.snap +++ b/src/components/__snapshots__/Tmbd.test.js.snap @@ -2,16 +2,12 @@ exports[`Tmbd snapshot 1`] = `
-
+
-
+
Date: Fri, 22 Jun 2018 11:09:53 -0700 Subject: [PATCH 56/59] cleaned up tmbdmovie component --- src/components/TmbdMovie.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/TmbdMovie.js b/src/components/TmbdMovie.js index f8060800b..e1088c333 100644 --- a/src/components/TmbdMovie.js +++ b/src/components/TmbdMovie.js @@ -8,7 +8,7 @@ class TmbdMovie extends Component { onFormSubmit = (event) => { event.preventDefault(); const url = 'http://localhost:3000/movies/'; - // const url = 'http://video-store-env.2u3bfdmdgx.us-west-2.elasticbeanstalk.com/movies/' + const title = encodeURIComponent(this.props.title); if (window.confirm('Are you sure you wish to add this movie?')) { @@ -29,7 +29,6 @@ class TmbdMovie extends Component { addToLibrary = () => { const url = 'http://localhost:3000/movies/'; - // const url = 'http://video-store-env.2u3bfdmdgx.us-west-2.elasticbeanstalk.com/movies/'; const movieObj = { title: this.props.title, release_date: this.props.releaseDate, From f8adf6e0c9373fac94eb103bbdc103c715c89da6 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Fri, 22 Jun 2018 11:11:07 -0700 Subject: [PATCH 57/59] cleaned up app component --- src/App.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/App.js b/src/App.js index ae11b9d63..3ff3ad5ca 100644 --- a/src/App.js +++ b/src/App.js @@ -6,10 +6,7 @@ import Tmbd from './components/Tmbd.js' import './App.css'; import logo from './tmdb.png'; - - import {BrowserRouter as Router, Route, Link} from 'react-router-dom'; -// import Route from 'react-router-dom/Route'; class App extends Component { constructor() { @@ -93,13 +90,10 @@ class App extends Component { return (
-

Ada Movies

- -
From 37af922bd41f4e2d0bd7d298f126f00ffb9717e0 Mon Sep 17 00:00:00 2001 From: Lily Sky Date: Fri, 22 Jun 2018 11:21:57 -0700 Subject: [PATCH 58/59] less space below nav buttons --- src/App.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/App.css b/src/App.css index 25967c8b6..494d2c9b2 100644 --- a/src/App.css +++ b/src/App.css @@ -58,6 +58,7 @@ button:hover { /* Rental Form */ .Rent-form { margin: 2em; + margin-top: .5em; padding: 1em; border: dotted white 5px; border-radius: 10px; From 734a5c04f2ce874e38b06a7e18e3d97db58e7b9b Mon Sep 17 00:00:00 2001 From: Phoebe Date: Fri, 22 Jun 2018 11:27:20 -0700 Subject: [PATCH 59/59] code cleanup --- src/components/Tmbd.js | 2 +- src/components/TmbdMovie.js | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/Tmbd.js b/src/components/Tmbd.js index 5a0d05f28..56f57cc73 100644 --- a/src/components/Tmbd.js +++ b/src/components/Tmbd.js @@ -40,7 +40,7 @@ class Tmbd extends Component { />
-
+
{ event.preventDefault(); const url = 'http://localhost:3000/movies/'; - const title = encodeURIComponent(this.props.title); if (window.confirm('Are you sure you wish to add this movie?')) { @@ -26,7 +25,6 @@ class TmbdMovie extends Component { } } - addToLibrary = () => { const url = 'http://localhost:3000/movies/'; const movieObj = {