From 41d6bba743fc89cd4016224916f9b7940d1e7b03 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 28 Oct 2018 12:21:47 +0100 Subject: [PATCH 01/85] v2 endpoints added for clearer intent in endpoints. Two new controller categories; info and search. --- seasoned_api/src/tmdb/tmdb.js | 13 ++++++- seasoned_api/src/webserver/app.js | 8 +++++ .../webserver/controllers/info/movieInfo.js | 24 +++++++++++++ .../webserver/controllers/info/personInfo.js | 24 +++++++++++++ .../webserver/controllers/info/showInfo.js | 24 +++++++++++++ .../controllers/search/movieSearch.js | 35 +++++++++++++++++++ .../controllers/search/multiSearch.js | 35 +++++++++++++++++++ .../controllers/search/personSearch.js | 35 +++++++++++++++++++ .../controllers/search/showSearch.js | 35 +++++++++++++++++++ 9 files changed, 232 insertions(+), 1 deletion(-) create mode 100644 seasoned_api/src/webserver/controllers/info/movieInfo.js create mode 100644 seasoned_api/src/webserver/controllers/info/personInfo.js create mode 100644 seasoned_api/src/webserver/controllers/info/showInfo.js create mode 100644 seasoned_api/src/webserver/controllers/search/movieSearch.js create mode 100644 seasoned_api/src/webserver/controllers/search/multiSearch.js create mode 100644 seasoned_api/src/webserver/controllers/search/personSearch.js create mode 100644 seasoned_api/src/webserver/controllers/search/showSearch.js diff --git a/seasoned_api/src/tmdb/tmdb.js b/seasoned_api/src/tmdb/tmdb.js index a5b7b4d..5efe0ed 100644 --- a/seasoned_api/src/tmdb/tmdb.js +++ b/seasoned_api/src/tmdb/tmdb.js @@ -68,6 +68,17 @@ class TMDB { .then(response => this.mapResults(response)); } + multiSearch(search_query, page=1) { + const query = { query: search_query, page: page }; + const cacheKey = `${this.cacheTags.multiSeach}:${page}:${search_query}`; + return Promise.resolve() + .then(() => this.cache.get(cacheKey)) + .catch(() => this.tmdb('searchMulti', query)) + .catch(() => { throw new Error('Could not complete search to tmdb'); }) + .then(response => this.cache.set(cacheKey, response)) + .then(response => this.mapResults(response)); + } + /** * Fetches a given list from tmdb. * @param {String} listName Name of list @@ -122,7 +133,7 @@ class TMDB { if (error) { return reject(error); } - return resolve(reponse); + resolve(reponse); }; if (!argument) { diff --git a/seasoned_api/src/webserver/app.js b/seasoned_api/src/webserver/app.js index 469b366..2d5c01e 100644 --- a/seasoned_api/src/webserver/app.js +++ b/seasoned_api/src/webserver/app.js @@ -67,6 +67,14 @@ router.get('/v1/seasoned/all', require('./controllers/seasoned/readStrays.js')); router.get('/v1/seasoned/:strayId', require('./controllers/seasoned/strayById.js')); router.post('/v1/seasoned/verify/:strayId', require('./controllers/seasoned/verifyStray.js')); +router.get('/v2/search/', require('./controllers/search/multiSearch.js')); +router.get('/v2/search/movie', require('./controllers/search/movieSearch.js')); +router.get('/v2/search/show', require('./controllers/search/showSearch.js')); +router.get('/v2/search/person', require('./controllers/search/personSearch.js')); + +router.get('/v2/movie/:id', require('./controllers/info/movieInfo.js')); +router.get('/v2/show/:id', require('./controllers/info/showInfo.js')); +router.get('/v2/person/:id', require('./controllers/info/personInfo.js')); /** * Plex */ diff --git a/seasoned_api/src/webserver/controllers/info/movieInfo.js b/seasoned_api/src/webserver/controllers/info/movieInfo.js new file mode 100644 index 0000000..5afa547 --- /dev/null +++ b/seasoned_api/src/webserver/controllers/info/movieInfo.js @@ -0,0 +1,24 @@ +const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); +const TMDB = require('src/tmdb/tmdb'); +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); + +/** + * Controller: Retrieve information for a movie + * @param {Request} req http request variable + * @param {Response} res + * @returns {Callback} + */ + +function movieInfoController(req, res) { + const movieId = req.params.id; + tmdb.movieInfo(movieId) + .then((movie) => { + res.send(movie); + }).catch((error) => { + res.status(404).send({ success: false, error: error.message }); + }); +} + +module.exports = movieInfoController; diff --git a/seasoned_api/src/webserver/controllers/info/personInfo.js b/seasoned_api/src/webserver/controllers/info/personInfo.js new file mode 100644 index 0000000..1d19c9d --- /dev/null +++ b/seasoned_api/src/webserver/controllers/info/personInfo.js @@ -0,0 +1,24 @@ +const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); +const TMDB = require('src/tmdb/tmdb'); +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); + +/** + * Controller: Retrieve information for a person + * @param {Request} req http request variable + * @param {Response} res + * @returns {Callback} + */ + +function personInfoController(req, res) { + const personId = req.params.id; + tmdb.personInfo(personId) + .then((person) => { + res.send(person); + }).catch((error) => { + res.status(404).send({ success: false, error: error.message }); + }); +} + +module.exports = personInfoController; diff --git a/seasoned_api/src/webserver/controllers/info/showInfo.js b/seasoned_api/src/webserver/controllers/info/showInfo.js new file mode 100644 index 0000000..5e1e33d --- /dev/null +++ b/seasoned_api/src/webserver/controllers/info/showInfo.js @@ -0,0 +1,24 @@ +const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); +const TMDB = require('src/tmdb/tmdb'); +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); + +/** + * Controller: Retrieve information for a show + * @param {Request} req http request variable + * @param {Response} res + * @returns {Callback} + */ + +function showInfoController(req, res) { + const showId = req.params.id; + tmdb.showInfo(showId) + .then((show) => { + res.send(show); + }).catch((error) => { + res.status(404).send({ success: false, error: error.message }); + }); +} + +module.exports = showInfoController; diff --git a/seasoned_api/src/webserver/controllers/search/movieSearch.js b/seasoned_api/src/webserver/controllers/search/movieSearch.js new file mode 100644 index 0000000..906a132 --- /dev/null +++ b/seasoned_api/src/webserver/controllers/search/movieSearch.js @@ -0,0 +1,35 @@ +const SearchHistory = require('src/searchHistory/searchHistory'); +const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); +const TMDB = require('src/tmdb/tmdb'); +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); +const searchHistory = new SearchHistory(); + +/** + * Controller: Search for movies by query and pagey + * @param {Request} req http request variable + * @param {Response} res + * @returns {Callback} + */ +function movieSearchController(req, res) { + const user = req.loggedInUser; + const { query, page } = req.query; + + Promise.resolve() + .then(() => { + if (user) { + return searchHistory.create(user, query); + } + return null + }) + .then(() => tmdb.movieSearch(query, page)) + .then((movies) => { + res.send(movies); + }) + .catch((error) => { + res.status(500).send({ success: false, error: error.message }); + }); +} + +module.exports = movieSearchController; diff --git a/seasoned_api/src/webserver/controllers/search/multiSearch.js b/seasoned_api/src/webserver/controllers/search/multiSearch.js new file mode 100644 index 0000000..bf90753 --- /dev/null +++ b/seasoned_api/src/webserver/controllers/search/multiSearch.js @@ -0,0 +1,35 @@ +const SearchHistory = require('src/searchHistory/searchHistory'); +const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); +const TMDB = require('src/tmdb/tmdb'); +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); +const searchHistory = new SearchHistory(); + +/** + * Controller: Search for multi (movies, shows and people by query and pagey + * @param {Request} req http request variable + * @param {Response} res + * @returns {Callback} + */ +function multiSearchController(req, res) { + const user = req.loggedInUser; + const { query, page } = req.query; + + Promise.resolve() + .then(() => { + if (user) { + return searchHistory.create(user, query); + } + return null + }) + .then(() => tmdb.multiSearch(query, page)) + .then((result) => { + res.send(result); + }) + .catch((error) => { + res.status(500).send({ success: false, error: error.message }); + }); +} + +module.exports = multiSearchController; diff --git a/seasoned_api/src/webserver/controllers/search/personSearch.js b/seasoned_api/src/webserver/controllers/search/personSearch.js new file mode 100644 index 0000000..34bab20 --- /dev/null +++ b/seasoned_api/src/webserver/controllers/search/personSearch.js @@ -0,0 +1,35 @@ +const SearchHistory = require('src/searchHistory/searchHistory'); +const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); +const TMDB = require('src/tmdb/tmdb'); +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); +const searchHistory = new SearchHistory(); + +/** + * Controller: Search for person by query and pagey + * @param {Request} req http request variable + * @param {Response} res + * @returns {Callback} + */ +function personSearchController(req, res) { + const user = req.loggedInUser; + const { query, page } = req.query; + + Promise.resolve() + .then(() => { + if (user) { + return searchHistory.create(user, query); + } + return null + }) + .then(() => tmdb.personSearch(query, page)) + .then((person) => { + res.send(person); + }) + .catch((error) => { + res.status(500).send({ success: false, error: error.message }); + }); +} + +module.exports = personSearchController; diff --git a/seasoned_api/src/webserver/controllers/search/showSearch.js b/seasoned_api/src/webserver/controllers/search/showSearch.js new file mode 100644 index 0000000..f982116 --- /dev/null +++ b/seasoned_api/src/webserver/controllers/search/showSearch.js @@ -0,0 +1,35 @@ +const SearchHistory = require('src/searchHistory/searchHistory'); +const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); +const TMDB = require('src/tmdb/tmdb'); +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); +const searchHistory = new SearchHistory(); + +/** + * Controller: Search for shows by query and pagey + * @param {Request} req http request variable + * @param {Response} res + * @returns {Callback} + */ +function showSearchController(req, res) { + const user = req.loggedInUser; + const { query, page } = req.query; + + Promise.resolve() + .then(() => { + if (user) { + return searchHistory.create(user, query); + } + return null + }) + .then(() => tmdb.showSearch(query, page)) + .then((shows) => { + res.send(shows); + }) + .catch((error) => { + res.status(500).send({ success: false, error: error.message }); + }); +} + +module.exports = showSearchController; From 1b0525063f15099f4e1368b90beaf50899b9a787 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Mon, 29 Oct 2018 20:47:57 +0100 Subject: [PATCH 02/85] New parameter in config and added axios package for new plex connect command. --- seasoned_api/conf/development.json | 3 +++ seasoned_api/package.json | 1 + 2 files changed, 4 insertions(+) diff --git a/seasoned_api/conf/development.json b/seasoned_api/conf/development.json index abf8399..f9b1801 100644 --- a/seasoned_api/conf/development.json +++ b/seasoned_api/conf/development.json @@ -8,6 +8,9 @@ "tmdb": { "apiKey": "" }, + "plex": { + "ip": "" + }, "raven": { "DSN": "" }, diff --git a/seasoned_api/package.json b/seasoned_api/package.json index 36428ac..59b5ff7 100644 --- a/seasoned_api/package.json +++ b/seasoned_api/package.json @@ -14,6 +14,7 @@ "update": "cross-env SEASONED_CONFIG=conf/development.json NODE_PATH=. node src/plex/updateRequestsInPlex.js" }, "dependencies": { + "axios": "^0.18.0", "bcrypt-nodejs": "^0.0.3", "body-parser": "~1.18.2", "cross-env": "~5.1.4", From 90b8ee005e5a7dd825a86ca754cf65ce757208b4 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Mon, 29 Oct 2018 20:49:21 +0100 Subject: [PATCH 03/85] Changed moviedb package to my own fork of it. The old package had vulnerabilities and needed updating. --- seasoned_api/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/seasoned_api/package.json b/seasoned_api/package.json index 59b5ff7..d5a98ac 100644 --- a/seasoned_api/package.json +++ b/seasoned_api/package.json @@ -20,6 +20,7 @@ "cross-env": "~5.1.4", "express": "~4.16.0", "jsonwebtoken": "^8.0.1", + "km-moviedb": "^0.2.13", "mongoose": "~5.0.11", "moviedb": "^0.2.10", "node-cache": "^4.1.1", From 5d8869e0420b0028e6975dfb26cf4febe29861a6 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Mon, 29 Oct 2018 20:55:18 +0100 Subject: [PATCH 04/85] Rewrote every function for searching and looking up items from tmdb library. Now there are separate functions for the four categories of search and three for info (multi, movie, show & person). Each function now has its own endpoint and matching controller. Converting tmdb results into a class has been alterted from using three classes; movie, show & person, and each have each their own convertTmdbTo function. Now the structure of the three types are more structured and no longer a single "seasoned" class object. --- seasoned_api/src/tmdb/convertTmdbToMovie.js | 45 ++++ seasoned_api/src/tmdb/convertTmdbToPerson.js | 26 ++ .../src/tmdb/convertTmdbToSeasoned.js | 26 +- seasoned_api/src/tmdb/convertTmdbToShow.js | 37 +++ seasoned_api/src/tmdb/tmdb.js | 252 +++++++++++++++--- seasoned_api/src/tmdb/types/movie.js | 20 ++ seasoned_api/src/tmdb/types/person.js | 13 + seasoned_api/src/tmdb/types/show.js | 20 ++ .../webserver/controllers/info/movieInfo.js | 4 +- .../webserver/controllers/info/showInfo.js | 3 + 10 files changed, 408 insertions(+), 38 deletions(-) create mode 100644 seasoned_api/src/tmdb/convertTmdbToMovie.js create mode 100644 seasoned_api/src/tmdb/convertTmdbToPerson.js create mode 100644 seasoned_api/src/tmdb/convertTmdbToShow.js create mode 100644 seasoned_api/src/tmdb/types/movie.js create mode 100644 seasoned_api/src/tmdb/types/person.js create mode 100644 seasoned_api/src/tmdb/types/show.js diff --git a/seasoned_api/src/tmdb/convertTmdbToMovie.js b/seasoned_api/src/tmdb/convertTmdbToMovie.js new file mode 100644 index 0000000..3e702a0 --- /dev/null +++ b/seasoned_api/src/tmdb/convertTmdbToMovie.js @@ -0,0 +1,45 @@ +const Movie = require('src/tmdb/types/movie'); + +const tmdbSwitcher = (tmdbMovie, property) => tmdbMovie[property] + +function convertTmdbToMovie(tmdbMovie) { + const movie = new Movie(tmdbMovie.id, tmdbMovie.title) + movie.overview = tmdbMovie.overview; + movie.rank = tmdbMovie.vote_average; + + if (tmdbMovie.release_date !== undefined) { + movie.release_date = new Date(tmdbMovie.release_date); + movie.year = movie.release_date.getFullYear(); + } + + if (tmdbMovie.poster_path !== undefined) { + movie.poster = tmdbMovie.poster_path; + } + if (tmdbMovie.backdrop_path !== undefined) { + movie.backdrop = tmdbMovie.backdrop_path; + } + + if (tmdbMovie.status !== undefined) { + movie.status = tmdbMovie.status; + } + + if (tmdbMovie.genres !== undefined) { + movie.genres = tmdbMovie.genres.map(genre => genre.name); + } + + if (tmdbMovie.tagline !== undefined) { + movie.tagline = tmdbMovie.tagline; + } + + if (tmdbMovie.runtime !== undefined) { + movie.runtime = tmdbMovie.runtime; + } + + if (tmdbMovie.imdb_id !== undefined) { + movie.imdb_id = tmdbMovie.imdb_id; + } + + return movie; +} + +module.exports = convertTmdbToMovie; diff --git a/seasoned_api/src/tmdb/convertTmdbToPerson.js b/seasoned_api/src/tmdb/convertTmdbToPerson.js new file mode 100644 index 0000000..5821c84 --- /dev/null +++ b/seasoned_api/src/tmdb/convertTmdbToPerson.js @@ -0,0 +1,26 @@ +const Person = require('src/tmdb/types/person'); +const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); + +function convertTmdbToPerson(tmdbPerson) { + const person = new Person(tmdbPerson.id, tmdbPerson.name); + + if (tmdbPerson.profile_path !== undefined) { + person.poster = tmdbPerson.profile_path; + } + + if (tmdbPerson.birthday !== undefined) { + person.birthday = new Date(tmdbPerson.birthday); + } + + if (tmdbPerson.deathday !== undefined) { + person.deathday = tmdbPerson.deathday; + } + + if (tmdbPerson.known_for !== undefined) { + person.known_for = tmdbPerson.known_for.map(convertTmdbToMovie); + } + + return person; +} + +module.exports = convertTmdbToPerson; diff --git a/seasoned_api/src/tmdb/convertTmdbToSeasoned.js b/seasoned_api/src/tmdb/convertTmdbToSeasoned.js index 05502b9..b89fd44 100644 --- a/seasoned_api/src/tmdb/convertTmdbToSeasoned.js +++ b/seasoned_api/src/tmdb/convertTmdbToSeasoned.js @@ -1,5 +1,5 @@ - const TMDB = require('src/media_classes/tmdb'); +const Movie = require('src/types/movie'); function translateYear(tmdbReleaseDate) { return new Date(tmdbReleaseDate).getFullYear(); @@ -14,10 +14,28 @@ function convertType(tmdbType) { return undefined; } -function convertTmdbToSeasoned(tmdb, manualType = undefined) { - const title = tmdb.title || tmdb.name; +function convertTmdbToMovie(tmdb) { + const year = + const movie = new Movie(); + let seasoned = undefined; + + if (tmdb.id && tmdb.title && tmdb.release_date) { + const year = tmdb.release_date.getFullYear(); + seasoned = new Movie(tmdb.id, tmdb.title, year); + } + else if (tmdb.id && tmdb.name && tmdb.first_air_date) { + const year = tmdb.first_air_date.getFullYear(); + seasoned = new Show(tmdb.id, tmdb.name, year); + seasoned.seasons = tmdb.number_of_season; + seasoned.episodes = tmdb.episodes; + return + } +} + + + const title = tmdb.title || tmdb.name; const year = translateYear(tmdb.release_date || tmdb.first_air_date); - const type = manualType || convertType(tmdb.media_type) || 'movie'; + const type = manualType || convertType(tmdb.type) || 'movie'; const id = tmdb.id; const summary = tmdb.overview; diff --git a/seasoned_api/src/tmdb/convertTmdbToShow.js b/seasoned_api/src/tmdb/convertTmdbToShow.js new file mode 100644 index 0000000..594f160 --- /dev/null +++ b/seasoned_api/src/tmdb/convertTmdbToShow.js @@ -0,0 +1,37 @@ +const Show = require('src/tmdb/types/show'); + +function convertTmdbToShow(tmdbShow) { + const show = new Show(tmdbShow.id, tmdbShow.name) + show.seasons = tmdbShow.number_of_seasons; + show.episodes = tmdbShow.number_of_episodes; + show.overview = tmdbShow.overview; + show.rank = tmdbShow.vote_average; + + if (tmdbShow.genres !== undefined) { + show.genres = tmdbShow.genres.map(genre => genre.name); + } + + if (tmdbShow.first_air_date !== undefined) { + show.first_air_date = new Date(tmdbShow.first_air_date); + show.year = show.first_air_date.getFullYear(); + } + + if (tmdbShow.poster_path !== undefined) { + show.poster = tmdbShow.poster_path; + } + if (tmdbShow.backdrop_path !== undefined) { + show.backdrop = tmdbShow.backdrop_path; + } + + if (tmdbShow.status !== undefined) { + show.status = tmdbShow.status; + } + + if (tmdbShow.episode_run_time !== undefined) { + show.runtime = tmdbShow.runtime; + } + + return show; +} + +module.exports = convertTmdbToShow; diff --git a/seasoned_api/src/tmdb/tmdb.js b/seasoned_api/src/tmdb/tmdb.js index 5efe0ed..bfe895c 100644 --- a/seasoned_api/src/tmdb/tmdb.js +++ b/seasoned_api/src/tmdb/tmdb.js @@ -1,5 +1,8 @@ -const moviedb = require('moviedb'); -const convertTmdbToSeasoned = require('src/tmdb/convertTmdbToSeasoned'); +const moviedb = require('km-moviedb'); +const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); +const convertTmdbToShow = require('src/tmdb/convertTmdbToShow'); +const convertTmdbToPerson = require('src/tmdb/convertTmdbToPerson'); + const TMDB_METHODS = { upcoming: { movie: 'miscUpcomingMovies' }, @@ -12,19 +15,24 @@ const TMDB_METHODS = { }; class TMDB { - constructor(cache, apiKey, tmdbLibrary) { - this.cache = cache; - this.tmdbLibrary = tmdbLibrary || moviedb(apiKey); - this.cacheTags = { - search: 'se', - info: 'i', - upcoming: 'u', - discover: 'd', - popular: 'p', - nowplaying: 'n', - similar: 'si', - }; - } + constructor(cache, apiKey, tmdbLibrary) { + this.cache = cache; + this.tmdbLibrary = tmdbLibrary || moviedb(apiKey); + this.cacheTags = { + multiSearch: 'muse', + movieSearch: 'mose', + showSearch: 'sse', + personSearch: 'pse', + movieInfo: 'mi', + showInfo: 'si', + personInfo: 'pi', + upcoming: 'u', + discover: 'd', + popular: 'p', + nowplaying: 'n', + similar: 'sim', + }; + } /** * Retrieve a specific movie by id from TMDB. @@ -68,9 +76,84 @@ class TMDB { .then(response => this.mapResults(response)); } + /** + * Retrieve a specific movie by id from TMDB. + * @param {Number} identifier of the movie you want to retrieve + * @param {String} type filter results by type (default movie). + * @returns {Promise} succeeds if movie was found + */ + movieInfo(identifier) { + const query = { id: identifier }; + const cacheKey = `${this.cacheTags.movieInfo}:${identifier}`; + return Promise.resolve() + .then(() => this.cache.get(cacheKey)) + .catch(() => this.tmdb('movieInfo', query)) + .catch(() => { throw new Error('Could not find a movie with that id.'); }) + .then(response => this.cache.set(cacheKey, response)) + .then((response) => { + try { + return convertTmdbToMovie(response); + } catch (parseError) { + console.error(parseError); + throw new Error('Could not parse movie.'); + } + }); + } + + /** + * Retrieve a specific show by id from TMDB. + * @param {Number} identifier of the show you want to retrieve + * @param {String} type filter results by type (default show). + * @returns {Promise} succeeds if show was found + */ + showInfo(identifier) { + const query = { id: identifier }; + const cacheKey = `${this.cacheTags.showInfo}:${identifier}`; + return Promise.resolve() + .then(() => this.cache.get(cacheKey)) + .catch(() => this.tmdb('tvInfo', query)) + .catch(() => { throw new Error('Could not find a show with that id.'); }) + .then(response => this.cache.set(cacheKey, response)) + .then((response) => { + try { + return convertTmdbToShow(response); + } catch (parseError) { + console.error(parseError); + throw new Error('Could not parse show.'); + } + }); + } + + /** + * Retrieve a specific person id from TMDB. + * @param {Number} identifier of the person you want to retrieve + * @param {String} type filter results by type (default person). + * @returns {Promise} succeeds if person was found + */ + personInfo(identifier) { + const query = { id: identifier }; + const cacheKey = `${this.cacheTags.personInfo}:${identifier}`; + return Promise.resolve() + .then(() => this.cache.get(cacheKey)) + .catch(() => this.tmdb('personInfo', query)) + .catch(() => { throw new Error('Could not find a person with that id.'); }) + .then(response => this.cache.set(cacheKey, response)) + .then((response) => { + try { + return convertTmdbToPerson(response); + } catch (parseError) { + console.error(parseError); + throw new Error('Could not parse person.'); + } + }); + } + + + + multiSearch(search_query, page=1) { const query = { query: search_query, page: page }; - const cacheKey = `${this.cacheTags.multiSeach}:${page}:${search_query}`; + const cacheKey = `${this.cacheTags.multiSearch}:${page}:${search_query}`; return Promise.resolve() .then(() => this.cache.get(cacheKey)) .catch(() => this.tmdb('searchMulti', query)) @@ -79,6 +162,96 @@ class TMDB { .then(response => this.mapResults(response)); } + /** + * Retrive movie search results from TMDB. + * @param {String} text query you want to search for + * @param {Number} page representing pagination of results + * @returns {Promise} dict with query results, current page and total_pages + */ + movieSearch(query, page=1) { + const tmdbquery = { query: query, page: page }; + const cacheKey = `${this.cacheTags.movieSearch}:${page}:${query}`; + return Promise.resolve() + .then(() => this.cache.get(cacheKey)) + .catch(() => this.tmdb('searchMovie', tmdbquery)) + .catch(() => { throw new Error('Could not complete movie search to tmdb'); }) + .then(response => this.cache.set(cacheKey, response)) + .then((response) => { + try { + return { + results: response.results.map(convertTmdbToMovie), + page: page, + total_results: response.total_results, + total_pages: response.total_pages + } + } catch (parseError) { + console.error(`ParseError: ${parseError}`); + throw new Error('Could not parse movie search results.') + } + }); + } + + /** + * Retrive show search results from TMDB. + * @param {String} text query you want to search for + * @param {Number} page representing pagination of results + * @returns {Promise} dict with query results, current page and total_pages + */ + showSearch(query, page=1) { + const tmdbquery = { query: query, page: page }; + const cacheKey = `${this.cacheTags.showSearch}:${page}:${query}`; + return Promise.resolve() + .then(() => this.cache.get(cacheKey)) + .catch(() => this.tmdb('searchTv', tmdbquery)) + .catch(() => { throw new Error('Could not complete show search to tmdb'); }) + .then(response => this.cache.set(cacheKey, response)) + .then((response) => { + try { + return { + results: response.results.map(convertTmdbToShow), + page: page, + total_results: response.total_results, + total_pages: response.total_pages + } + } catch (parseError) { + console.error(`ParseError: ${parseError}`); + throw new Error('Could not parse show search results.') + } + }); + } + + /** + * Retrive person search results from TMDB. + * @param {String} text query you want to search for + * @param {Number} page representing pagination of results + * @returns {Promise} dict with query results, current page and total_pages + */ + personSearch(query, page=1) { + const tmdbquery = { query: query, page: page }; + const cacheKey = `${this.cacheTags.personSearch}:${page}:${query}`; + return Promise.resolve() + .then(() => this.cache.get(cacheKey)) + .catch(() => this.tmdb('searchPerson', tmdbquery)) + .catch(() => { throw new Error('Could not complete person search to tmdb'); }) + .then(response => this.cache.set(cacheKey, response)) + .then((response) => { + try { + return { + results: response.results.map(convertTmdbToPerson), + page: page, + total_results: response.total_results, + total_pages: response.total_pages + } + } catch (parseError) { + console.error(`ParseError: ${parseError}`); + throw new Error('Could not parse show search results.') + } + }); + } + + + + /** * Fetches a given list from tmdb. * @param {String} listName Name of list @@ -98,28 +271,41 @@ class TMDB { .then(response => this.mapResults(response, type)); } - /** + popular(type='movie', page=1) { + const query = { type: type, page: page }; + const cacheKey = `${this.cacheTags.popular}:${type}:${page}`; + return Promise.resolve() + .then(() => this.cache.get(cacheKey)) + .catch(() => this.tmdb('miscPopularMovies', query)) + .catch((e) => { throw new Error(`Error fetching popular list of type ${type} : ${e}`) }) + .then(response => this.cache.set(cacheKey, response)) + .then(response => this.mapResults(response, type)); + } + + /** * Maps our response from tmdb api to a movie/show object. * @param {String} response from tmdb. * @param {String} The type declared in listSearch. * @returns {Promise} dict with tmdb results, mapped as movie/show objects. */ - mapResults(response, type) { - console.log(response.page); - return Promise.resolve() - .then(() => { - const mappedResults = response.results.filter((element) => { - return (element.media_type === 'movie' || element.media_type === 'tv' || element.media_type === undefined); - }).map((element) => convertTmdbToSeasoned(element, type)); - return { - results: mappedResults, - page: response.page, - total_pages: response.total_pages, - total_results: response.total_results - } - }) - .catch((error) => { throw new Error(error); }); - } + mapResults(response, type) { + let results = response.results.map((result) => { + if (result.media_type === 'movie') { + return convertTmdbToMovie(result); + } else if (result.media_type === 'tv') { + return convertTmdbToShow(result); + } else if (result.media_type === 'person') { + return convertTmdbToPerson(result); + } + }) + + return { + results: results, + page: response.page, + total_results: response.total_results, + total_pages: response.total_pages + } + } /** * Wraps moviedb library to support Promises. diff --git a/seasoned_api/src/tmdb/types/movie.js b/seasoned_api/src/tmdb/types/movie.js new file mode 100644 index 0000000..1d443d2 --- /dev/null +++ b/seasoned_api/src/tmdb/types/movie.js @@ -0,0 +1,20 @@ +class Movie { + constructor(id, title, year=null, overview=null, poster=null, backdrop=null, rank=null, genres=null, status=null, + tagline=null, runtime=null, imdb_id=null) { + this.id = id; + this.title = title; + this.year = year; + this.overview = overview; + this.poster = poster; + this.backdrop = backdrop; + this.rank = rank; + this.genres = genres; + this.status = status; + this.tagline = tagline; + this.runtime = runtime; + this.imdb_id = imdb_id; + this.type = 'movie'; + } +} + +module.exports = Movie; diff --git a/seasoned_api/src/tmdb/types/person.js b/seasoned_api/src/tmdb/types/person.js new file mode 100644 index 0000000..4c469fb --- /dev/null +++ b/seasoned_api/src/tmdb/types/person.js @@ -0,0 +1,13 @@ +class Person { + constructor(id, name, poster=null, birthday=null, deathday=null, known_for=null) { + this.id = id; + this.name = name; + this.poster = poster; + this.birthday = birthday; + this.deathday = deathday; + this.known_for = known_for; + this.type = 'person'; + } +} + +module.exports = Person; diff --git a/seasoned_api/src/tmdb/types/show.js b/seasoned_api/src/tmdb/types/show.js new file mode 100644 index 0000000..5aaf8d1 --- /dev/null +++ b/seasoned_api/src/tmdb/types/show.js @@ -0,0 +1,20 @@ +class Show { + constructor(id, title, year=null, seasons=null, episodes=null, overview=null, rank=null, genres=null, + poster=null, backdrop=null, status=null, runtime=null) { + this.id = id; + this.title = title; + this.year = year; + this.seasons = seasons; + this.episodes = episodes; + this.overview = overview; + this.rank = rank; + this.genres = genres; + this.poster = poster; + this.backdrop = backdrop; + this.status = status; + this.runtime = runtime; + this.type = 'show'; + } +} + +module.exports = Show; diff --git a/seasoned_api/src/webserver/controllers/info/movieInfo.js b/seasoned_api/src/webserver/controllers/info/movieInfo.js index 5afa547..3607285 100644 --- a/seasoned_api/src/webserver/controllers/info/movieInfo.js +++ b/seasoned_api/src/webserver/controllers/info/movieInfo.js @@ -1,8 +1,10 @@ const configuration = require('src/config/configuration').getInstance(); const Cache = require('src/tmdb/cache'); const TMDB = require('src/tmdb/tmdb'); +const Plex = require('src/plex/plex'); const cache = new Cache(); const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); +const plex = new Plex(configuration.get('plex', 'ip')); /** * Controller: Retrieve information for a movie @@ -10,10 +12,10 @@ const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); * @param {Response} res * @returns {Callback} */ - function movieInfoController(req, res) { const movieId = req.params.id; tmdb.movieInfo(movieId) + .then((movie) => plex.existsInPlex(movie)) .then((movie) => { res.send(movie); }).catch((error) => { diff --git a/seasoned_api/src/webserver/controllers/info/showInfo.js b/seasoned_api/src/webserver/controllers/info/showInfo.js index 5e1e33d..f345855 100644 --- a/seasoned_api/src/webserver/controllers/info/showInfo.js +++ b/seasoned_api/src/webserver/controllers/info/showInfo.js @@ -1,8 +1,10 @@ const configuration = require('src/config/configuration').getInstance(); const Cache = require('src/tmdb/cache'); const TMDB = require('src/tmdb/tmdb'); +const Plex = require('src/plex/plex'); const cache = new Cache(); const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); +const plex = new Plex(configuration.get('plex', 'ip')); /** * Controller: Retrieve information for a show @@ -14,6 +16,7 @@ const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); function showInfoController(req, res) { const showId = req.params.id; tmdb.showInfo(showId) + .then((show) => plex.existsInPlex(show)) .then((show) => { res.send(show); }).catch((error) => { From 8f5bd44e4df52078257a9f26e7b6dfb9a5bae62c Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Mon, 29 Oct 2018 20:57:22 +0100 Subject: [PATCH 05/85] Added endpoint for new plex search. --- seasoned_api/src/webserver/app.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/seasoned_api/src/webserver/app.js b/seasoned_api/src/webserver/app.js index 2d5c01e..0d2d3f8 100644 --- a/seasoned_api/src/webserver/app.js +++ b/seasoned_api/src/webserver/app.js @@ -78,6 +78,8 @@ router.get('/v2/person/:id', require('./controllers/info/personInfo.js')); /** * Plex */ +router.get('/v2/plex/search', require('./controllers/plex/search')); + router.get('/v1/plex/search', require('./controllers/plex/searchMedia.js')); router.get('/v1/plex/playing', require('./controllers/plex/plexPlaying.js')); router.get('/v1/plex/request', require('./controllers/plex/searchRequest.js')); From 161a466ab74fcc973782b45e31a63afcb14e3833 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Mon, 29 Oct 2018 21:01:16 +0100 Subject: [PATCH 06/85] Rewrote how local plex library is indexed and what it returns. After searching plex the response is separated into three classes by types (movie, show & episode). Plex also has a function for inputing a (tmdb)movie object and searching for matches of name & type in plex. If a match the object matchedInPlex variable is set to true. --- seasoned_api/src/plex/convertPlexToEpisode.js | 20 +++++++ seasoned_api/src/plex/convertPlexToMovie.js | 15 +++++ seasoned_api/src/plex/convertPlexToShow.js | 13 +++++ seasoned_api/src/plex/plex.js | 57 +++++++++++++++++++ seasoned_api/src/plex/types/episode.js | 16 ++++++ seasoned_api/src/plex/types/movie.js | 12 ++++ seasoned_api/src/plex/types/show.js | 13 +++++ .../src/webserver/controllers/plex/search.js | 25 ++++++++ 8 files changed, 171 insertions(+) create mode 100644 seasoned_api/src/plex/convertPlexToEpisode.js create mode 100644 seasoned_api/src/plex/convertPlexToMovie.js create mode 100644 seasoned_api/src/plex/convertPlexToShow.js create mode 100644 seasoned_api/src/plex/plex.js create mode 100644 seasoned_api/src/plex/types/episode.js create mode 100644 seasoned_api/src/plex/types/movie.js create mode 100644 seasoned_api/src/plex/types/show.js create mode 100644 seasoned_api/src/webserver/controllers/plex/search.js diff --git a/seasoned_api/src/plex/convertPlexToEpisode.js b/seasoned_api/src/plex/convertPlexToEpisode.js new file mode 100644 index 0000000..a85b5d2 --- /dev/null +++ b/seasoned_api/src/plex/convertPlexToEpisode.js @@ -0,0 +1,20 @@ +const Episode = require('src/plex/types/episode'); + +function convertPlexToEpisode(plexEpisode) { + const episode = new Episode(plexEpisode.title, plexEpisode.grandparentTitle, plexEpisode.year); + episode.season = plexEpisode.parentIndex; + episode.episode = plexEpisode.index; + episode.summary = plexEpisode.summary; + episode.rating = plexEpisode.rating; + + if (plexEpisode.viewCount !== undefined) { + episode.views = plexEpisode.viewCount; + } + + if (plexEpisode.originallyAvailableAt !== undefined) { + episode.airdate = new Date(plexEpisode.originallyAvailableAt) + } + + return episode; +} +module.exports = convertPlexToEpisode; diff --git a/seasoned_api/src/plex/convertPlexToMovie.js b/seasoned_api/src/plex/convertPlexToMovie.js new file mode 100644 index 0000000..b41a887 --- /dev/null +++ b/seasoned_api/src/plex/convertPlexToMovie.js @@ -0,0 +1,15 @@ +const Movie = require('src/plex/types/movie'); + +function convertPlexToMovie(plexMovie) { + const movie = new Movie(plexMovie.title, plexMovie.year); + movie.rating = plexMovie.rating; + movie.tagline = plexMovie.tagline; + + if (plexMovie.summary !== undefined) { + movie.summary = plexMovie.summary; + } + + return movie; +} + +module.exports = convertPlexToMovie; diff --git a/seasoned_api/src/plex/convertPlexToShow.js b/seasoned_api/src/plex/convertPlexToShow.js new file mode 100644 index 0000000..04e337a --- /dev/null +++ b/seasoned_api/src/plex/convertPlexToShow.js @@ -0,0 +1,13 @@ +const Show = require('src/plex/types/show'); + +function convertPlexToShow(plexShow) { + const show = new Show(plexShow.title, plexShow.year); + show.summary = plexShow.summary; + show.rating = plexShow.rating; + show.seasons = plexShow.childCount; + show.episodes = plexShow.leafCount; + + return show; +} + +module.exports = convertPlexToShow; diff --git a/seasoned_api/src/plex/plex.js b/seasoned_api/src/plex/plex.js new file mode 100644 index 0000000..0df1b20 --- /dev/null +++ b/seasoned_api/src/plex/plex.js @@ -0,0 +1,57 @@ +const axios = require('axios'); +const convertPlexToMovie = require('src/plex/convertPlexToMovie'); +const convertPlexToShow = require('src/plex/convertPlexToShow'); +const convertPlexToEpisode = require('src/plex/convertPlexToEpisode'); + +class Plex { + constructor(ip) { + this.plexIP = ip; + this.plexPort = 32400; + } + + existsInPlex(tmdbMovie) { + return Promise.resolve() + .then(() => this.search(tmdbMovie.title)) + .then((plexMovies) => { + const matches = plexMovies.some((plexMovie) => { + return tmdbMovie.title === plexMovie.title && tmdbMovie.type === plexMovie.type; + }) + + tmdbMovie.existsInPlex = matches; + return tmdbMovie; + }) + } + + search(query) { + const options = { + baseURL: `http://${this.plexIP}:${this.plexPort}`, + url: '/hubs/search', + params: { query: query }, + responseType: 'json' + } + + return Promise.resolve() + .then(() => axios.request(options)) + .catch((error) => { throw new Error(`Unable to search plex library`); }) + .then(response => this.mapResults(response)); + } + + + mapResults(response) { + return response.data.MediaContainer.Hub.reduce((result, hub) => { + if (hub.type === 'movie' && hub.Metadata !== undefined) { + return [...result, ...hub.Metadata.map(convertPlexToMovie)]; + } + else if (hub.type === 'show' && hub.Metadata !== undefined) { + return [...result, ...hub.Metadata.map(convertPlexToShow)]; + } + else if (hub.type === 'episode' && hub.Metadata !== undefined) { + return [...result, ...hub.Metadata.map(convertPlexToEpisode)]; + } + + return result + }, []) + } +} + +module.exports = Plex; diff --git a/seasoned_api/src/plex/types/episode.js b/seasoned_api/src/plex/types/episode.js new file mode 100644 index 0000000..a99fa8f --- /dev/null +++ b/seasoned_api/src/plex/types/episode.js @@ -0,0 +1,16 @@ +class Episode { + constructor(title, show, year) { + this.title = title; + this.show = show; + this.year = year; + this.season = null; + this.episode = null; + this.summary = null; + this.rating = null; + this.views = null; + this.aired = null; + this.type = 'episode'; + } +} + +module.exports = Episode; \ No newline at end of file diff --git a/seasoned_api/src/plex/types/movie.js b/seasoned_api/src/plex/types/movie.js new file mode 100644 index 0000000..8a2b6fa --- /dev/null +++ b/seasoned_api/src/plex/types/movie.js @@ -0,0 +1,12 @@ +class Movie { + constructor(title, year) { + this.title = title; + this.year = year; + this.summary = null; + this.rating = null; + this.tagline = null; + this.type = 'movie'; + } +} + +module.exports = Movie; \ No newline at end of file diff --git a/seasoned_api/src/plex/types/show.js b/seasoned_api/src/plex/types/show.js new file mode 100644 index 0000000..8290f1e --- /dev/null +++ b/seasoned_api/src/plex/types/show.js @@ -0,0 +1,13 @@ +class Show { + constructor(title, year) { + this.title = title; + this.year = year; + this.summary = null; + this.rating = null; + this.seasons = null; + this.episodes = null; + this.type = 'show'; + } +} + +module.exports = Show; \ No newline at end of file diff --git a/seasoned_api/src/webserver/controllers/plex/search.js b/seasoned_api/src/webserver/controllers/plex/search.js new file mode 100644 index 0000000..69401c6 --- /dev/null +++ b/seasoned_api/src/webserver/controllers/plex/search.js @@ -0,0 +1,25 @@ +const configuration = require('src/config/configuration').getInstance(); +const Plex = require('src/plex/plex'); +const plex = new Plex(configuration.get('plex', 'ip')); + +/** + * Controller: Search plex for movies, shows and episodes by query + * @param {Request} req http request variable + * @param {Response} res + * @returns {Callback} + */ +function searchPlexController(req, res) { + const { query, type } = req.query; + plex.search(query, type) + .then((movies) => { + if (movies.length > 0) { + res.send(movies); + } else { + res.status(404).send({ success: false, error: 'Search query did not give any results from plex.'}) + } + }).catch((error) => { + res.status(500).send({ success: false, error: error.message }); + }); +} + +module.exports = searchPlexController; From 5a48158f07d252fd9d9e5e39898a72c62a8413e3 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Tue, 30 Oct 2018 19:20:52 +0100 Subject: [PATCH 07/85] Request now happens at /request with id parameter and query for type selection. Only allows movie or show type and is static set in the controller. AddRequest adds tmdb item to database with time of request. --- seasoned_api/src/request/request.js | 33 +++++++++++++++ seasoned_api/src/webserver/app.js | 2 + .../controllers/request/requestTmdbId.js | 40 +++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 seasoned_api/src/request/request.js create mode 100644 seasoned_api/src/webserver/controllers/request/requestTmdbId.js diff --git a/seasoned_api/src/request/request.js b/seasoned_api/src/request/request.js new file mode 100644 index 0000000..f52dccd --- /dev/null +++ b/seasoned_api/src/request/request.js @@ -0,0 +1,33 @@ +const assert = require('assert') +const establishedDatabase = require('src/database/database'); + +class RequestRepository { + constructor(database) { + this.database = database || establishedDatabase; + this.queries = { + add: 'insert into request (id,title,year,type) values(?,?,?,?)', + read: 'select * from request where id is ? and type is ?' + }; + } + + /** + * Add tmdb movie|show to requests + * @param {tmdb} tmdb class of movie|show to add + * @returns {Promise} + */ + addTmdb(tmdb) { + return Promise.resolve() + .then(() => this.database.get(this.queries.read, [tmdb.id, tmdb.type])) + .then(row => assert.equal(row, undefined, 'Id has already been requested')) + .then(() => this.database.run(this.queries.add, [tmdb.id, tmdb.title||tmdb.name, tmdb.year, tmdb.type])) + .catch((error) => { + if (error.name === 'AssertionError' || error.message.endsWith('been requested')) { + throw new Error('This id is already requested', error.message); + } + console.log('Error @ request.addTmdb:', error); + throw new Error('Could not add request'); + }); + } +} + +module.exports = RequestRepository; diff --git a/seasoned_api/src/webserver/app.js b/seasoned_api/src/webserver/app.js index 0d2d3f8..e598905 100644 --- a/seasoned_api/src/webserver/app.js +++ b/seasoned_api/src/webserver/app.js @@ -90,6 +90,8 @@ router.get('/v1/plex/hook', require('./controllers/plex/hookDump.js')); /** * Requests */ + +router.post('/v2/request/:id', require('./controllers/request/requestTmdbId.js')); router.get('/v1/plex/requests/all', require('./controllers/plex/fetchRequested.js')); router.put('/v1/plex/request/:requestId', mustBeAuthenticated, require('./controllers/plex/updateRequested.js')); diff --git a/seasoned_api/src/webserver/controllers/request/requestTmdbId.js b/seasoned_api/src/webserver/controllers/request/requestTmdbId.js new file mode 100644 index 0000000..ef4e913 --- /dev/null +++ b/seasoned_api/src/webserver/controllers/request/requestTmdbId.js @@ -0,0 +1,40 @@ +const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); +const TMDB = require('src/tmdb/tmdb'); +const RequestRepository = require('src/request/request'); +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); +const request = new RequestRepository(); + +const typeFunction = (type) => { + type = type.toLowerCase(); + if (type === 'movie') { + return tmdb.movieInfo; + } else if (type === 'show') { + return tmdb.showInfo; + } else { + throw new Error("Unprocessable Entity: Invalid type for query 'type'. Allowed values: movie|show"); + } +} +/** + * Controller: Request by id with type param + * @param {Request} req http request variable + * @param {Response} res + * @returns {Callback} + */ +function requestTmdbIdController(req, res) { + const requestId = req.params.id; + const { type } = req.query; + + Promise.resolve() + .then(() => typeFunction(type)) + // .then(() => checkType + .then(() => tmdb.movieInfo(requestId)) + .then((movie) => request.addTmdb(movie)) + .then(() => res.send({sucess: true, message: 'Request has been submitted.'})) + .catch((error) => { + res.status(404).send({ success: false, error: error.message }); + }); +} + +module.exports = requestTmdbIdController; From 7e46d32e308944843e00b24e9feb74b7c233a25c Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Tue, 30 Oct 2018 20:32:55 +0100 Subject: [PATCH 08/85] More unit tests for checking correct definition of movie. Changed some test to match update functions in tmdb. --- seasoned_api/package.json | 2 +- seasoned_api/src/database/schemas/setup.sql | 8 +++++ .../src/database/schemas/teardown.sql | 1 + ...ade_runner_2049-info-success-response.json | 1 + ...rstellar-query-movie-success-response.json | 1 + .../system/asAUserIWantToRequestAMovie.js | 7 +++-- ...asAnAnonymousUserIWantToSearchForAMovie.js | 6 ++-- .../test/unit/tmdb/testConvertTmdbToMovie.js | 30 ++++++++++++++++++ seasoned_api/test/unit/tmdb/testTmdb.disabled | 31 +++++++++++++++++++ 9 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 seasoned_api/test/fixtures/blade_runner_2049-info-success-response.json create mode 100644 seasoned_api/test/fixtures/interstellar-query-movie-success-response.json create mode 100644 seasoned_api/test/unit/tmdb/testConvertTmdbToMovie.js create mode 100644 seasoned_api/test/unit/tmdb/testTmdb.disabled diff --git a/seasoned_api/package.json b/seasoned_api/package.json index d5a98ac..8d1b458 100644 --- a/seasoned_api/package.json +++ b/seasoned_api/package.json @@ -8,7 +8,7 @@ "main": "webserver/server.js", "scripts": { "start": "cross-env SEASONED_CONFIG=conf/development.json PROD=true NODE_PATH=. node src/webserver/server.js", - "test": "cross-env SEASONED_CONFIG=conf/test.json NODE_PATH=. mocha --recursive test", + "test": "cross-env SEASONED_CONFIG=conf/test.json NODE_PATH=. mocha --recursive test/unit test/system", "coverage": "cross-env SEASONED_CONFIG=conf/test.json NODE_PATH=. nyc mocha --recursive test && nyc report --reporter=text-lcov | coveralls", "lint": "./node_modules/.bin/eslint src/", "update": "cross-env SEASONED_CONFIG=conf/development.json NODE_PATH=. node src/plex/updateRequestsInPlex.js" diff --git a/seasoned_api/src/database/schemas/setup.sql b/seasoned_api/src/database/schemas/setup.sql index ed96de5..88a0a8c 100644 --- a/seasoned_api/src/database/schemas/setup.sql +++ b/seasoned_api/src/database/schemas/setup.sql @@ -36,6 +36,14 @@ CREATE TABLE IF NOT EXISTS requests( type CHAR(50) DEFAULT 'movie' ); +CREATE TABLE IF NOT EXISTS request( + id int not null, + title text not null, + year int not null, + type char(10) not null, + date default current_timestamp +); + CREATE TABLE IF NOT EXISTS stray_eps( id TEXT UNIQUE, diff --git a/seasoned_api/src/database/schemas/teardown.sql b/seasoned_api/src/database/schemas/teardown.sql index 750cbab..cf7e6e3 100644 --- a/seasoned_api/src/database/schemas/teardown.sql +++ b/seasoned_api/src/database/schemas/teardown.sql @@ -1,3 +1,4 @@ DROP TABLE IF EXISTS user; DROP TABLE IF EXISTS search_history; DROP TABLE IF EXISTS requests; +DROP TABLE IF EXISTS request; diff --git a/seasoned_api/test/fixtures/blade_runner_2049-info-success-response.json b/seasoned_api/test/fixtures/blade_runner_2049-info-success-response.json new file mode 100644 index 0000000..7e8e9f3 --- /dev/null +++ b/seasoned_api/test/fixtures/blade_runner_2049-info-success-response.json @@ -0,0 +1 @@ +{"adult":false,"backdrop_path":"/mVr0UiqyltcfqxbAUcLl9zWL8ah.jpg","belongs_to_collection":{"id":422837,"name":"Blade Runner Collection","poster_path":"/cWESb1o9lW2i2Z3Xllv9u40aNIk.jpg","backdrop_path":"/bSHZIvLoPBWyGLeiAudN1mXdvQX.jpg"},"budget":150000000,"genres":[{"id":9648,"name":"Mystery"},{"id":878,"name":"Science Fiction"},{"id":53,"name":"Thriller"}],"homepage":"http://bladerunnermovie.com/","id":335984,"imdb_id":"tt1856101","original_language":"en","original_title":"Blade Runner 2049","overview":"Thirty years after the events of the first film, a new blade runner, LAPD Officer K, unearths a long-buried secret that has the potential to plunge what's left of society into chaos. K's discovery leads him on a quest to find Rick Deckard, a former LAPD blade runner who has been missing for 30 years.","popularity":30.03,"poster_path":"/gajva2L0rPYkEWjzgFlBXCAVBE5.jpg","production_companies":[{"id":79529,"logo_path":"/gVN3k8emmKy4iV4KREWcCtxusZK.png","name":"Torridon Films","origin_country":"US"},{"id":101829,"logo_path":"/8IOjCvgjq0zTrtP91cWD3kL2jMK.png","name":"16:14 Entertainment","origin_country":"US"},{"id":1645,"logo_path":"/6Ry6uNBaa0IbbSs1XYIgX5DkA9r.png","name":"Scott Free Productions","origin_country":""},{"id":5,"logo_path":"/71BqEFAF4V3qjjMPCpLuyJFB9A.png","name":"Columbia Pictures","origin_country":"US"},{"id":1088,"logo_path":"/9WOE5AQUXbOtLU6GTwfjS8OMF0v.png","name":"Alcon Entertainment","origin_country":"US"},{"id":78028,"logo_path":"/sTFcDFfJaSVT3sv3DoaZDE4SlGB.png","name":"Thunderbird Entertainment","origin_country":"CA"},{"id":174,"logo_path":"/ky0xOc5OrhzkZ1N6KyUxacfQsCk.png","name":"Warner Bros. Pictures","origin_country":"US"}],"production_countries":[{"iso_3166_1":"CA","name":"Canada"},{"iso_3166_1":"US","name":"United States of America"},{"iso_3166_1":"HU","name":"Hungary"},{"iso_3166_1":"GB","name":"United Kingdom"}],"release_date":"2017-10-04","revenue":259239658,"runtime":163,"spoken_languages":[{"iso_639_1":"en","name":"English"},{"iso_639_1":"fi","name":"suomi"}],"status":"Released","tagline":"There's still a page left.","title":"Blade Runner 2049","video":false,"vote_average":7.3,"vote_count":5478} diff --git a/seasoned_api/test/fixtures/interstellar-query-movie-success-response.json b/seasoned_api/test/fixtures/interstellar-query-movie-success-response.json new file mode 100644 index 0000000..aca9a34 --- /dev/null +++ b/seasoned_api/test/fixtures/interstellar-query-movie-success-response.json @@ -0,0 +1 @@ +{"page":1,"total_results":11,"total_pages":1,"results":[{"vote_count":15920,"id":157336,"video":false,"vote_average":8.2,"title":"Interstellar","popularity":34.088,"poster_path":"/nBNZadXqJSdt05SHLqgT0HuC5Gm.jpg","original_language":"en","original_title":"Interstellar","genre_ids":[12,18,878],"backdrop_path":"/xu9zaAevzQ5nnrsXN6JcahLnG4i.jpg","adult":false,"overview":"Interstellar chronicles the adventures of a group of explorers who make use of a newly discovered wormhole to surpass the limitations on human space travel and conquer the vast distances involved in an interstellar voyage.","release_date":"2014-11-05"},{"vote_count":126,"id":301959,"video":false,"vote_average":7.8,"title":"Interstellar: Nolan's Odyssey","popularity":4.961,"poster_path":"/xZwUIPqBHyJ2QIfMPANOZ1mAld6.jpg","original_language":"en","original_title":"Interstellar: Nolan's Odyssey","genre_ids":[99],"backdrop_path":"/bT5jpIZE50MI0COE8pOeq0kMpQo.jpg","adult":false,"overview":"Behind the scenes of Christopher Nolan's sci-fi drama, which stars Matthew McConaughey and Anne Hathaway","release_date":"2014-11-05"},{"vote_count":1,"id":287954,"video":false,"vote_average":7,"title":"Lolita from Interstellar Space","popularity":3.45,"poster_path":"/buoq7zYO4J3ttkEAqEMWelPDC0G.jpg","original_language":"en","original_title":"Lolita from Interstellar Space","genre_ids":[35],"backdrop_path":"/mgb6tVEieDYLpQt666ACzGz5cyE.jpg","adult":false,"overview":"An undeniably beautiful alien is sent to Earth to study the complex mating rituals of human beings, which leads to the young interstellar traveler experiencing the passion that surrounds the centuries-old ritual of the species.","release_date":"2014-03-08"},{"vote_count":0,"id":529107,"video":false,"vote_average":0,"title":"Inside Interstellar","popularity":1.102,"poster_path":"/vemBplPKQhVe5cRWL7kxtgp15Vq.jpg","original_language":"en","original_title":"Inside Interstellar","genre_ids":[99],"backdrop_path":null,"adult":false,"overview":"Cast and crew of Christopher Nolan's 'Interstellar' discuss project origins, the film's imagery, ambitions, incorporating IMAX footage, the human element within the film, arm shooting locations outside of Calgary, the set construction and design, working with real corn, mechanical characters, including backstory, design, the blend of practical and digital effects in bringing them to life, the differences in the characters, the human performances behind the characters, the creative process behind the film's music, Icelandic locations, vehicle interiors, the processes of simulating the absence of gravity, the crucial end-film visuals and influence and inspiration for future generations","release_date":"2015-03-31"},{"vote_count":6,"id":336592,"video":false,"vote_average":7.8,"title":"The Science of Interstellar","popularity":0.852,"poster_path":"/6KBD7YSBjCfgBgHwpsQo3G3GGdx.jpg","original_language":"en","original_title":"The Science of Interstellar","genre_ids":[99],"backdrop_path":null,"adult":false,"overview":"The science of Christopher Nolan's sci-fi, Interstellar.","release_date":"2014-11-25"},{"vote_count":7,"id":398188,"video":false,"vote_average":3.8,"title":"Interstellar Wars","popularity":0.6,"poster_path":"/cjvTebuqD8wmhchHE286ltVcbX6.jpg","original_language":"en","original_title":"Interstellar Wars","genre_ids":[878],"backdrop_path":"/yTnHa6lgIv8rNneSNBDkBe8MnZe.jpg","adult":false,"overview":"For Millennia the Aliien force has watched and waited, a brooding menace that has now at last decided to take over the Earth. Communications systems worldwide are sent into chaos by a strange atmospheric interference and this has turned into a global phenomenon. A massive spaceship headed towards Earth and smaller spaceships began to cover entire cities around the world. Suddenly, the wonder turns into horror as the spaceships destroy the cities with energy weapons. When the world counterattacks, the alien ships are invincible to military weapons. The survivors have to use their wits to kill the aliens, or die.","release_date":"2016-05-23"},{"vote_count":1,"id":460616,"video":false,"vote_average":4,"title":"Interstellar Civil War: Shadows of the Empire","popularity":0.959,"poster_path":"/7yTHKiVWZmUxgqGSzZv9yBx5bGI.jpg","original_language":"en","original_title":"Interstellar Civil War: Shadows of the Empire","genre_ids":[28,14,878],"backdrop_path":null,"adult":false,"overview":"The Imperial Empire is attacked by an Alliance of rebels led by fanatical mystics. The ruler, Empress Nobu, the 8th generation of her family, wants to execute a bold plan to rescue a cyborg, Leah C6, trapped on the battle ravaged planet Endor. The Empress believes Leah C6 holds the secret to destroying the Alliance of Rebels before their insurgency can kill millions of citizens of the Empire. She recruits her heroic fleet commander, Lord General Luka Raan and asks him to gather a team from the Empire's elite soldiers, the Galactic Rangers. Raan assembles the team in the ruins of Endor which was attacked by depraved Rebels and outlaws led by, Kindo-Ker, a fanatical mystic in Dark Energy. The Galactic Rangers begin a desperate search to find and rescue Leah C6 before the Alliance Rebels can.","release_date":"2018-04-15"},{"vote_count":0,"id":552531,"video":false,"vote_average":0,"title":"The Prom Goer's Interstellar Excursion","popularity":0.6,"poster_path":null,"original_language":"en","original_title":"The Prom Goer's Interstellar Excursion","genre_ids":[12],"backdrop_path":null,"adult":false,"overview":"High schooler Bennett lands the prom date of his dreams, Sophie, just days before the dance. Not long after, he witnesses Sophie being abducted by aliens in the middle of the New Mexico desert.","release_date":""},{"vote_count":11,"id":47662,"video":false,"vote_average":5.4,"title":"Trancers 4: Jack of Swords","popularity":3.221,"poster_path":"/69yr3oxBpSgua26RJkFmsm7plTG.jpg","original_language":"en","original_title":"Trancers 4: Jack of Swords","genre_ids":[878,28],"backdrop_path":"/5ism2HNUGuQi5a3ajYaN9ypMQMf.jpg","adult":false,"overview":"Jack is now back in the future. He had since lost Lena, and finds out that he's lost his other wife Alice to none other than Harris. While heading out for another assignment, something goes awry with the TCL chamber. Jack finds himself in a whole new dimension. He also runs across a different version of trancers. These guys seem to be in control of this planet. Jack manages to assist a rebel group known as the \"Tunnel Rats\" crush the rule of the evil Lord Calaban.","release_date":"1994-02-02"},{"vote_count":7,"id":47663,"video":false,"vote_average":5.3,"title":"Trancers 5: Sudden Deth","popularity":0.6,"poster_path":"/epMaTjPDMbgC8TbW1ZToh4RNv0i.jpg","original_language":"en","original_title":"Trancers 5: Sudden Deth","genre_ids":[28,53,878],"backdrop_path":"/an0xpUEX1P1BI80sCpkU1pSoREx.jpg","adult":false,"overview":"Jack Deth is back for one more round with the trancers. Jack must attempt to find his way home from the other-dimensional world of Orpheus, where magic works and the trancers were the ruling class (before Trancers IV, that is). Unfortunately, Jack's quest to find the mystical Tiamond in the Castle of Unrelenting Terror may be thwarted by the return of Caliban, king of the trancers who was thought dead.","release_date":"1994-11-04"},{"vote_count":1,"id":261443,"video":false,"vote_average":4.5,"title":"Angry Planet","popularity":0.6,"poster_path":"/ie5luS87ess1c5VgFhbGECJTQVK.jpg","original_language":"en","original_title":"Angry Planet","genre_ids":[878],"backdrop_path":"/u4JBwlGZN8hGeLxwu7Q0WmibACp.jpg","adult":false,"overview":"A criminal sentenced to life on a prison planet reveals his true purpose: to extract revenge on the killers who murdered his family.","release_date":"2008-01-01"}]} diff --git a/seasoned_api/test/system/asAUserIWantToRequestAMovie.js b/seasoned_api/test/system/asAUserIWantToRequestAMovie.js index 65b496f..218a0fa 100644 --- a/seasoned_api/test/system/asAUserIWantToRequestAMovie.js +++ b/seasoned_api/test/system/asAUserIWantToRequestAMovie.js @@ -4,18 +4,19 @@ const app = require('src/webserver/app'); const request = require('supertest-as-promised'); const createUser = require('test/helpers/createUser'); const createToken = require('test/helpers/createToken'); -const infoMovieSuccess = require('test/fixtures/arrival-info-success-response.json'); +const infoMovieSuccess = require('test/fixtures/blade_runner_2049-info-success-response.json'); describe('As a user I want to request a movie', () => { before(() => { return resetDatabase() .then(() => createUser('test_user', 'test@gmail.com', 'password')); }) - before(() => createCacheEntry('i:movie:329865', infoMovieSuccess)); + before(() => createCacheEntry('mi:335984', infoMovieSuccess)); it('should return 200 when item is requested', () => request(app) - .post('/api/v1/plex/request/329865') + .post('/api/v2/request/335984', {tmdbType: 'movie'}) + .send({ tmdbType: 'movie' }) .set('Authorization', createToken('test_user', 'secret')) .expect(200) ); diff --git a/seasoned_api/test/system/asAnAnonymousUserIWantToSearchForAMovie.js b/seasoned_api/test/system/asAnAnonymousUserIWantToSearchForAMovie.js index b9b2789..13e43ab 100644 --- a/seasoned_api/test/system/asAnAnonymousUserIWantToSearchForAMovie.js +++ b/seasoned_api/test/system/asAnAnonymousUserIWantToSearchForAMovie.js @@ -2,15 +2,15 @@ const createCacheEntry = require('test/helpers/createCacheEntry'); const resetDatabase = require('test/helpers/resetDatabase'); const request = require('supertest-as-promised'); const app = require('src/webserver/app'); -const interstellarQuerySuccess = require('test/fixtures/interstellar-query-success-response.json'); +const interstellarQuerySuccess = require('test/fixtures/interstellar-query-movie-success-response.json'); describe('As an anonymous user I want to search for a movie', () => { before(() => resetDatabase()); - before(() => createCacheEntry('se:1:multi:interstellar', interstellarQuerySuccess)); + before(() => createCacheEntry('mose:1:interstellar', interstellarQuerySuccess)); it('should return 200 with the search results even if user is not logged in', () => request(app) - .get('/api/v1/tmdb/search?query=interstellar&page=1') + .get('/api/v2/search/movie?query=interstellar&page=1') .expect(200) ); }); diff --git a/seasoned_api/test/unit/tmdb/testConvertTmdbToMovie.js b/seasoned_api/test/unit/tmdb/testConvertTmdbToMovie.js new file mode 100644 index 0000000..64c2e4f --- /dev/null +++ b/seasoned_api/test/unit/tmdb/testConvertTmdbToMovie.js @@ -0,0 +1,30 @@ +const assert = require('assert'); +const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); +const bladeRunnerQuerySuccess = require('test/fixtures/blade_runner_2049-info-success-response.json') + +describe('Convert tmdb movieInfo to movie', () => { + beforeEach(() => this.bladeRunnerTmdbMovie = bladeRunnerQuerySuccess); + + it('should translate the tmdb release date to movie year', () => { + const bladeRunner = convertTmdbToMovie(this.bladeRunnerTmdbMovie); + assert.strictEqual(bladeRunner.year, 2017); + }); + + it('should translate the tmdb release date to instance of Date', () => { + const bladeRunner = convertTmdbToMovie(this.bladeRunnerTmdbMovie); + assert(bladeRunner.release_date instanceof Date); + }); + + it('should translate the tmdb title to title', () => { + const bladeRunner = convertTmdbToMovie(this.bladeRunnerTmdbMovie); + assert.equal(bladeRunner.title, 'Blade Runner 2049'); + }); + + it('should translate the tmdb vote_average to rank', () => { + const bladeRunner = convertTmdbToMovie(this.bladeRunnerTmdbMovie); + assert.equal(bladeRunner.rank, 7.3); + }); + + + +}); diff --git a/seasoned_api/test/unit/tmdb/testTmdb.disabled b/seasoned_api/test/unit/tmdb/testTmdb.disabled new file mode 100644 index 0000000..cb5c5eb --- /dev/null +++ b/seasoned_api/test/unit/tmdb/testTmdb.disabled @@ -0,0 +1,31 @@ +const assert = require('assert'); +// const Movie = require('src/movie/movie'); +const TMDB = require('src/tmdb/tmdb'); +const Cache = require('src/tmdb/cache'); +const SqliteDatabase = require('src/database/sqliteDatabase'); +const tmdbMock = require('test/helpers/tmdbMock'); + +const emptyQuerySuccess = require('test/fixtures/empty-query-success-response.json'); +const interstellarQuerySuccess = require('test/fixtures/arrival-info-success-response.json'); +const popularMovieSuccessResponse = require('test/fixtures/popular-movies-success-response.json'); + +describe('TMDB', function test() { + beforeEach(() => { + this.mockMoviedb = tmdbMock(); + this.database = new SqliteDatabase(':memory:'); + return Promise.resolve() + .then(() => this.database.setUp()); + }); + + describe('popular', () => { + it('should return the "Blade Runner 2049" year in the collection of popular movies', () => { + this.mockMoviedb.response = popularMovieSuccessResponse; + const cache = new Cache(this.database); + const tmdb = new TMDB(cache, 'bogus-api-key', this.mockMoviedb); + return tmdb.popular() + .then(movies => + assert.equal(movies[0].title, "Blade Runner 2049") + ); + }); + }) +}); From 4250b1bd17c6a5f78b85f54aee0d289501dc1e04 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Tue, 30 Oct 2018 20:34:26 +0100 Subject: [PATCH 09/85] request endpoint finds type by body not query. Better error handling on what goes wrong if incorrect type or missing body parameter. --- seasoned_api/src/tmdb/tmdb.js | 2 +- .../controllers/request/requestTmdbId.js | 23 +++++++++++-------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/seasoned_api/src/tmdb/tmdb.js b/seasoned_api/src/tmdb/tmdb.js index bfe895c..74f68c8 100644 --- a/seasoned_api/src/tmdb/tmdb.js +++ b/seasoned_api/src/tmdb/tmdb.js @@ -88,7 +88,7 @@ class TMDB { return Promise.resolve() .then(() => this.cache.get(cacheKey)) .catch(() => this.tmdb('movieInfo', query)) - .catch(() => { throw new Error('Could not find a movie with that id.'); }) + .catch((error) => { console.log(error); throw new Error('Could not find a movie with that id.'); }) .then(response => this.cache.set(cacheKey, response)) .then((response) => { try { diff --git a/seasoned_api/src/webserver/controllers/request/requestTmdbId.js b/seasoned_api/src/webserver/controllers/request/requestTmdbId.js index ef4e913..46ad956 100644 --- a/seasoned_api/src/webserver/controllers/request/requestTmdbId.js +++ b/seasoned_api/src/webserver/controllers/request/requestTmdbId.js @@ -7,14 +7,19 @@ const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); const request = new RequestRepository(); const typeFunction = (type) => { - type = type.toLowerCase(); - if (type === 'movie') { - return tmdb.movieInfo; - } else if (type === 'show') { - return tmdb.showInfo; - } else { - throw new Error("Unprocessable Entity: Invalid type for query 'type'. Allowed values: movie|show"); + if (type !== undefined) { + type = type.toLowerCase(); + + if (type === 'movie') { + return tmdb.movieInfo; + } else if (type === 'show') { + return tmdb.showInfo; + } else { + throw new Error("Unprocessable Entity: Invalid type for body parameter 'type'. Allowed values: movie|show"); + } } + throw new Error("tmdbType body parameter not defined. Allowed values: movie|show") + } /** * Controller: Request by id with type param @@ -24,10 +29,10 @@ const typeFunction = (type) => { */ function requestTmdbIdController(req, res) { const requestId = req.params.id; - const { type } = req.query; + const tmdbType = req.body.tmdbType; Promise.resolve() - .then(() => typeFunction(type)) + .then(() => typeFunction(tmdbType)) // .then(() => checkType .then(() => tmdb.movieInfo(requestId)) .then((movie) => request.addTmdb(movie)) From 8ece7b84c41a5b5bc31874cf787c61e4b1dc0fe0 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Tue, 30 Oct 2018 20:38:05 +0100 Subject: [PATCH 10/85] test configuration also gets plex ip parameter. --- seasoned_api/conf/test.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/seasoned_api/conf/test.json b/seasoned_api/conf/test.json index cc7b8fc..8f4af80 100644 --- a/seasoned_api/conf/test.json +++ b/seasoned_api/conf/test.json @@ -8,6 +8,9 @@ "tmdb": { "apiKey": "bogus-api-key" }, + "plex": { + "ip": "0.0.0.0" + }, "raven": { "DSN": "" }, From d80386da40ad691ac1698c0bcab8ed32c8bf5725 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Thu, 1 Nov 2018 00:15:49 +0100 Subject: [PATCH 11/85] Implementing lists lookups for movie and shows. Add new cachetags for the lists & created a helper function for returning response with convertFunction as parameter. --- seasoned_api/src/tmdb/tmdb.js | 112 +++++++++++++++------------------- 1 file changed, 50 insertions(+), 62 deletions(-) diff --git a/seasoned_api/src/tmdb/tmdb.js b/seasoned_api/src/tmdb/tmdb.js index 74f68c8..7f1a6f7 100644 --- a/seasoned_api/src/tmdb/tmdb.js +++ b/seasoned_api/src/tmdb/tmdb.js @@ -3,34 +3,25 @@ const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); const convertTmdbToShow = require('src/tmdb/convertTmdbToShow'); const convertTmdbToPerson = require('src/tmdb/convertTmdbToPerson'); - -const TMDB_METHODS = { - upcoming: { movie: 'miscUpcomingMovies' }, - discover: { movie: 'discoverMovie', show: 'discoverTv' }, - popular: { movie: 'miscPopularMovies', show: 'miscPopularTvs' }, - nowplaying: { movie: 'miscNowPlayingMovies', show: 'tvOnTheAir' }, - similar: { movie: 'movieSimilar', show: 'tvSimilar' }, - search: { movie: 'searchMovie', show: 'searchTv', multi: 'searchMulti' }, - info: { movie: 'movieInfo', show: 'tvInfo' } -}; - class TMDB { constructor(cache, apiKey, tmdbLibrary) { this.cache = cache; this.tmdbLibrary = tmdbLibrary || moviedb(apiKey); this.cacheTags = { - multiSearch: 'muse', - movieSearch: 'mose', - showSearch: 'sse', - personSearch: 'pse', - movieInfo: 'mi', - showInfo: 'si', + multiSearch: 'mus', + movieSearch: 'mos', + showSearch: 'ss', + personSearch: 'ps', + movieInfo: 'mi', + showInfo: 'si', personInfo: 'pi', - upcoming: 'u', - discover: 'd', - popular: 'p', - nowplaying: 'n', - similar: 'sim', + miscNowPlayingMovies: 'npm', + miscPopularMovies: 'pm', + miscTopRatedMovies: 'tpm', + miscUpcomingMovies: 'um', + tvOnTheAir: 'toa', + miscPopularTvs: 'pt', + miscTopRatedTvs: 'trt', }; } @@ -176,19 +167,8 @@ class TMDB { .catch(() => this.tmdb('searchMovie', tmdbquery)) .catch(() => { throw new Error('Could not complete movie search to tmdb'); }) .then(response => this.cache.set(cacheKey, response)) - .then((response) => { - try { - return { - results: response.results.map(convertTmdbToMovie), - page: page, - total_results: response.total_results, - total_pages: response.total_pages - } - } catch (parseError) { - console.error(`ParseError: ${parseError}`); - throw new Error('Could not parse movie search results.') - } - }); + .then(response => this.mapAndCreateResponse(response, convertTmdbToMovie)) + .catch((error) => { console.log(error); throw new Error('Could not parse movie search result') }) } /** @@ -205,19 +185,8 @@ class TMDB { .catch(() => this.tmdb('searchTv', tmdbquery)) .catch(() => { throw new Error('Could not complete show search to tmdb'); }) .then(response => this.cache.set(cacheKey, response)) - .then((response) => { - try { - return { - results: response.results.map(convertTmdbToShow), - page: page, - total_results: response.total_results, - total_pages: response.total_pages - } - } catch (parseError) { - console.error(`ParseError: ${parseError}`); - throw new Error('Could not parse show search results.') - } - }); + .then(response => this.mapAndCreateResponse(response, convertTmdbToShow)) + .catch((error) => { console.log(error); throw new Error('Could not parse show search result') }) } /** @@ -234,23 +203,42 @@ class TMDB { .catch(() => this.tmdb('searchPerson', tmdbquery)) .catch(() => { throw new Error('Could not complete person search to tmdb'); }) .then(response => this.cache.set(cacheKey, response)) - .then((response) => { - try { - return { - results: response.results.map(convertTmdbToPerson), - page: page, - total_results: response.total_results, - total_pages: response.total_pages - } - } catch (parseError) { - console.error(`ParseError: ${parseError}`); - throw new Error('Could not parse show search results.') - } - }); + .then(response => this.mapAndCreateResponse(response, convertTmdbToPerson)) + .catch((error) => { console.log(error); throw new Error('Could not parse person search result') }) + } + + mapAndCreateResponse(response, resultConvertFunction) { + // console.log(response) + return { + results: response.results.map(resultConvertFunction), + page: response.page, + total_results: response.total_results, + total_pages: response.total_pages + } } + movieList(listname, page = 1) { + const query = { page: page }; + const cacheKey = `${this.cacheTags[listname]}:${page}`; + return Promise.resolve() + .then(() => this.cache.get(cacheKey)) + .catch(() => this.tmdb(listname, query)) + .catch(() => { throw new Error('Unable to get movie list from tmdb')}) + .then(response => this.cache.set(cacheKey, response)) + .then(response => this.mapAndCreateResponse(response, convertTmdbToMovie)); + } + showList(listname, page = 1) { + const query = { page: page }; + const cacheKey = `${this.cacheTags[listname]}:${page}`; + return Promise.resolve() + .then(() => this.cache.get(cacheKey)) + .catch(() => this.tmdb(listname, query)) + .catch(() => { throw new Error('Unable to get show list from tmdb')}) + .then(response => this.cache.set(cacheKey, response)) + .then(response => this.mapAndCreateResponse(response, convertTmdbToShow)); + } /** * Fetches a given list from tmdb. @@ -288,7 +276,7 @@ class TMDB { * @param {String} The type declared in listSearch. * @returns {Promise} dict with tmdb results, mapped as movie/show objects. */ - mapResults(response, type) { + mapResults(response, _) { let results = response.results.map((result) => { if (result.media_type === 'movie') { return convertTmdbToMovie(result); From 22e57c03de19f75ff9f862e353dd8b24cb271918 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Thu, 1 Nov 2018 00:16:56 +0100 Subject: [PATCH 12/85] Controller for movie and shows. Each have multiple small export functions; one for each list search type --- .../controllers/list/listController.js | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 seasoned_api/src/webserver/controllers/list/listController.js diff --git a/seasoned_api/src/webserver/controllers/list/listController.js b/seasoned_api/src/webserver/controllers/list/listController.js new file mode 100644 index 0000000..118eaa4 --- /dev/null +++ b/seasoned_api/src/webserver/controllers/list/listController.js @@ -0,0 +1,85 @@ +const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); +const TMDB = require('src/tmdb/tmdb'); +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); + +// there should be a translate function from query params to +// tmdb list that is valid. Should it be a helper function or does it +// belong in tmdb. +// + could also have default value that are sent to the client. +// * have the same class create a getListNames() and a fetchList() +// * dicover list might be overkill_https://tinyurl.com/y7f8ragw +// + trending! https://tinyurl.com/ydywrqox +// by all, mediatype, or person. Can also define time periode to +// get more trending view of what people are checking out. +// + newly created (tv/latest). +// + movie/latest +// + +function getTmdbMovieList(res, listname, page) { + Promise.resolve() + .then(() => tmdb.movieList(listname, page)) + .then((response) => res.send(response)) + .catch((error) => { + res.status(500).send({ success: false, error: error.message }); + }) +} + +function getTmdbShowList(res, listname, page) { + Promise.resolve() + .then(() => tmdb.showList(listname, page)) + .then((response) => res.send(response)) + .catch((error) => { + res.status(500).send({ success: false, error: error.message }); + }) +} + +exports.nowPlayingMovies = (req, res) => { + const { page } = req.query; + const listname = 'miscNowPlayingMovies' + + getTmdbMovieList(res, listname, page); +} + +exports.popularMovies = (req, res) => { + const { page } = req.query; + const listname = 'miscPopularMovies' + + getTmdbMovieList(res, listname, page); +} + +exports.topRatedMovies = (req, res) => { + const { page } = req.query; + const listname = 'miscTopRatedMovies' + + getTmdbMovieList(res, listname, page); +} + +exports.upcomingMovies = (req, res) => { + const { page } = req.query; + const listname = 'miscUpcomingMovies' + + getTmdbMovieList(res, listname, page); +} + +exports.nowPlayingShows = (req, res) => { + const { page } = req.query; + const listname = 'tvOnTheAir' + + getTmdbShowList(res, listname, page); +} + +exports.popularShows = (req, res) => { + const { page } = req.query; + const listname = 'miscPopularTvs' + + getTmdbShowList(res, listname, page); +} + +exports.topRatedShows = (req, res) => { + const { page } = req.query; + const listname = 'miscTopRatedTvs' + + getTmdbShowList(res, listname, page); +} From e64c4d5d0173f7e2868596f5e778ea947dec8d71 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Thu, 1 Nov 2018 00:17:51 +0100 Subject: [PATCH 13/85] Lists are now reachable by movie or show / listname. Endpoints added & removed outdated comments. --- seasoned_api/src/webserver/app.js | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/seasoned_api/src/webserver/app.js b/seasoned_api/src/webserver/app.js index e598905..342b65a 100644 --- a/seasoned_api/src/webserver/app.js +++ b/seasoned_api/src/webserver/app.js @@ -6,16 +6,14 @@ const mustBeAuthenticated = require('./middleware/mustBeAuthenticated'); const mustBeAdmin = require('./middleware/mustBeAdmin'); const configuration = require('src/config/configuration').getInstance(); +const listController = require('./controllers/list/listController'); + // TODO: Have our raven router check if there is a value, if not don't enable raven. Raven.config(configuration.get('raven', 'DSN')).install(); const app = express(); // define our app using express app.use(Raven.requestHandler()); -// this will let us get the data from a POST -// configure app to use bodyParser() app.use(bodyParser.json()); -// router.use(bodyParser.urlencoded({ extended: true })); - const router = express.Router(); const allowedOrigins = ['https://kevinmidboe.com', 'http://localhost:8080']; @@ -31,10 +29,10 @@ router.use(tokenToUser); router.use((req, res, next) => { // TODO add logging of all incoming console.log('Request: ', req.originalUrl); - const origin = req.headers.origin; + + const origin = req.headers.origin; if (allowedOrigins.indexOf(origin) > -1) { - console.log('allowed'); - res.setHeader('Access-Control-Allow-Origin', origin); + res.setHeader('Access-Control-Allow-Origin', origin); } res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, loggedinuser'); res.header('Access-Control-Allow-Methods', 'POST, GET, PUT'); @@ -72,6 +70,15 @@ router.get('/v2/search/movie', require('./controllers/search/movieSearch.js')); router.get('/v2/search/show', require('./controllers/search/showSearch.js')); router.get('/v2/search/person', require('./controllers/search/personSearch.js')); +router.get('/v2/movie/now_playing', listController.nowPlayingMovies); +router.get('/v2/movie/popular', listController.popularMovies); +router.get('/v2/movie/top_rated', listController.topRatedMovies); +router.get('/v2/movie/upcoming', listController.upcomingMovies); + +router.get('/v2/show/now_playing', listController.nowPlayingShows); +router.get('/v2/show/popular', listController.popularShows); +router.get('/v2/show/top_rated', listController.topRatedShows); + router.get('/v2/movie/:id', require('./controllers/info/movieInfo.js')); router.get('/v2/show/:id', require('./controllers/info/showInfo.js')); router.get('/v2/person/:id', require('./controllers/info/personInfo.js')); @@ -80,6 +87,9 @@ router.get('/v2/person/:id', require('./controllers/info/personInfo.js')); */ router.get('/v2/plex/search', require('./controllers/plex/search')); +/** + * List + */ router.get('/v1/plex/search', require('./controllers/plex/searchMedia.js')); router.get('/v1/plex/playing', require('./controllers/plex/plexPlaying.js')); router.get('/v1/plex/request', require('./controllers/plex/searchRequest.js')); From 87c76e3f1d720a8439c58b19c3cf40886ec6a75b Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Thu, 1 Nov 2018 00:18:54 +0100 Subject: [PATCH 14/85] Tests now suppoer the new list endpoints. Also updated response for interstellar query (movieInfo). --- ...rstellar-query-movie-success-response.json | 2 +- .../popular-movies-success-response.json | 228 +----------------- .../popular-show-success-response.json | 228 +----------------- .../system/asAUserIWantToGetPopularMovies.js | 6 +- .../system/asAUserIWantToGetPopularShows.js | 6 +- ...asAnAnonymousUserIWantToSearchForAMovie.js | 2 +- 6 files changed, 10 insertions(+), 462 deletions(-) diff --git a/seasoned_api/test/fixtures/interstellar-query-movie-success-response.json b/seasoned_api/test/fixtures/interstellar-query-movie-success-response.json index aca9a34..61fdfc7 100644 --- a/seasoned_api/test/fixtures/interstellar-query-movie-success-response.json +++ b/seasoned_api/test/fixtures/interstellar-query-movie-success-response.json @@ -1 +1 @@ -{"page":1,"total_results":11,"total_pages":1,"results":[{"vote_count":15920,"id":157336,"video":false,"vote_average":8.2,"title":"Interstellar","popularity":34.088,"poster_path":"/nBNZadXqJSdt05SHLqgT0HuC5Gm.jpg","original_language":"en","original_title":"Interstellar","genre_ids":[12,18,878],"backdrop_path":"/xu9zaAevzQ5nnrsXN6JcahLnG4i.jpg","adult":false,"overview":"Interstellar chronicles the adventures of a group of explorers who make use of a newly discovered wormhole to surpass the limitations on human space travel and conquer the vast distances involved in an interstellar voyage.","release_date":"2014-11-05"},{"vote_count":126,"id":301959,"video":false,"vote_average":7.8,"title":"Interstellar: Nolan's Odyssey","popularity":4.961,"poster_path":"/xZwUIPqBHyJ2QIfMPANOZ1mAld6.jpg","original_language":"en","original_title":"Interstellar: Nolan's Odyssey","genre_ids":[99],"backdrop_path":"/bT5jpIZE50MI0COE8pOeq0kMpQo.jpg","adult":false,"overview":"Behind the scenes of Christopher Nolan's sci-fi drama, which stars Matthew McConaughey and Anne Hathaway","release_date":"2014-11-05"},{"vote_count":1,"id":287954,"video":false,"vote_average":7,"title":"Lolita from Interstellar Space","popularity":3.45,"poster_path":"/buoq7zYO4J3ttkEAqEMWelPDC0G.jpg","original_language":"en","original_title":"Lolita from Interstellar Space","genre_ids":[35],"backdrop_path":"/mgb6tVEieDYLpQt666ACzGz5cyE.jpg","adult":false,"overview":"An undeniably beautiful alien is sent to Earth to study the complex mating rituals of human beings, which leads to the young interstellar traveler experiencing the passion that surrounds the centuries-old ritual of the species.","release_date":"2014-03-08"},{"vote_count":0,"id":529107,"video":false,"vote_average":0,"title":"Inside Interstellar","popularity":1.102,"poster_path":"/vemBplPKQhVe5cRWL7kxtgp15Vq.jpg","original_language":"en","original_title":"Inside Interstellar","genre_ids":[99],"backdrop_path":null,"adult":false,"overview":"Cast and crew of Christopher Nolan's 'Interstellar' discuss project origins, the film's imagery, ambitions, incorporating IMAX footage, the human element within the film, arm shooting locations outside of Calgary, the set construction and design, working with real corn, mechanical characters, including backstory, design, the blend of practical and digital effects in bringing them to life, the differences in the characters, the human performances behind the characters, the creative process behind the film's music, Icelandic locations, vehicle interiors, the processes of simulating the absence of gravity, the crucial end-film visuals and influence and inspiration for future generations","release_date":"2015-03-31"},{"vote_count":6,"id":336592,"video":false,"vote_average":7.8,"title":"The Science of Interstellar","popularity":0.852,"poster_path":"/6KBD7YSBjCfgBgHwpsQo3G3GGdx.jpg","original_language":"en","original_title":"The Science of Interstellar","genre_ids":[99],"backdrop_path":null,"adult":false,"overview":"The science of Christopher Nolan's sci-fi, Interstellar.","release_date":"2014-11-25"},{"vote_count":7,"id":398188,"video":false,"vote_average":3.8,"title":"Interstellar Wars","popularity":0.6,"poster_path":"/cjvTebuqD8wmhchHE286ltVcbX6.jpg","original_language":"en","original_title":"Interstellar Wars","genre_ids":[878],"backdrop_path":"/yTnHa6lgIv8rNneSNBDkBe8MnZe.jpg","adult":false,"overview":"For Millennia the Aliien force has watched and waited, a brooding menace that has now at last decided to take over the Earth. Communications systems worldwide are sent into chaos by a strange atmospheric interference and this has turned into a global phenomenon. A massive spaceship headed towards Earth and smaller spaceships began to cover entire cities around the world. Suddenly, the wonder turns into horror as the spaceships destroy the cities with energy weapons. When the world counterattacks, the alien ships are invincible to military weapons. The survivors have to use their wits to kill the aliens, or die.","release_date":"2016-05-23"},{"vote_count":1,"id":460616,"video":false,"vote_average":4,"title":"Interstellar Civil War: Shadows of the Empire","popularity":0.959,"poster_path":"/7yTHKiVWZmUxgqGSzZv9yBx5bGI.jpg","original_language":"en","original_title":"Interstellar Civil War: Shadows of the Empire","genre_ids":[28,14,878],"backdrop_path":null,"adult":false,"overview":"The Imperial Empire is attacked by an Alliance of rebels led by fanatical mystics. The ruler, Empress Nobu, the 8th generation of her family, wants to execute a bold plan to rescue a cyborg, Leah C6, trapped on the battle ravaged planet Endor. The Empress believes Leah C6 holds the secret to destroying the Alliance of Rebels before their insurgency can kill millions of citizens of the Empire. She recruits her heroic fleet commander, Lord General Luka Raan and asks him to gather a team from the Empire's elite soldiers, the Galactic Rangers. Raan assembles the team in the ruins of Endor which was attacked by depraved Rebels and outlaws led by, Kindo-Ker, a fanatical mystic in Dark Energy. The Galactic Rangers begin a desperate search to find and rescue Leah C6 before the Alliance Rebels can.","release_date":"2018-04-15"},{"vote_count":0,"id":552531,"video":false,"vote_average":0,"title":"The Prom Goer's Interstellar Excursion","popularity":0.6,"poster_path":null,"original_language":"en","original_title":"The Prom Goer's Interstellar Excursion","genre_ids":[12],"backdrop_path":null,"adult":false,"overview":"High schooler Bennett lands the prom date of his dreams, Sophie, just days before the dance. Not long after, he witnesses Sophie being abducted by aliens in the middle of the New Mexico desert.","release_date":""},{"vote_count":11,"id":47662,"video":false,"vote_average":5.4,"title":"Trancers 4: Jack of Swords","popularity":3.221,"poster_path":"/69yr3oxBpSgua26RJkFmsm7plTG.jpg","original_language":"en","original_title":"Trancers 4: Jack of Swords","genre_ids":[878,28],"backdrop_path":"/5ism2HNUGuQi5a3ajYaN9ypMQMf.jpg","adult":false,"overview":"Jack is now back in the future. He had since lost Lena, and finds out that he's lost his other wife Alice to none other than Harris. While heading out for another assignment, something goes awry with the TCL chamber. Jack finds himself in a whole new dimension. He also runs across a different version of trancers. These guys seem to be in control of this planet. Jack manages to assist a rebel group known as the \"Tunnel Rats\" crush the rule of the evil Lord Calaban.","release_date":"1994-02-02"},{"vote_count":7,"id":47663,"video":false,"vote_average":5.3,"title":"Trancers 5: Sudden Deth","popularity":0.6,"poster_path":"/epMaTjPDMbgC8TbW1ZToh4RNv0i.jpg","original_language":"en","original_title":"Trancers 5: Sudden Deth","genre_ids":[28,53,878],"backdrop_path":"/an0xpUEX1P1BI80sCpkU1pSoREx.jpg","adult":false,"overview":"Jack Deth is back for one more round with the trancers. Jack must attempt to find his way home from the other-dimensional world of Orpheus, where magic works and the trancers were the ruling class (before Trancers IV, that is). Unfortunately, Jack's quest to find the mystical Tiamond in the Castle of Unrelenting Terror may be thwarted by the return of Caliban, king of the trancers who was thought dead.","release_date":"1994-11-04"},{"vote_count":1,"id":261443,"video":false,"vote_average":4.5,"title":"Angry Planet","popularity":0.6,"poster_path":"/ie5luS87ess1c5VgFhbGECJTQVK.jpg","original_language":"en","original_title":"Angry Planet","genre_ids":[878],"backdrop_path":"/u4JBwlGZN8hGeLxwu7Q0WmibACp.jpg","adult":false,"overview":"A criminal sentenced to life on a prison planet reveals his true purpose: to extract revenge on the killers who murdered his family.","release_date":"2008-01-01"}]} +{"page":1,"total_results":11,"total_pages":1,"results":[{"vote_count":15925,"id":157336,"video":false,"vote_average":8.2,"title":"Interstellar","popularity":31.724,"poster_path":"/nBNZadXqJSdt05SHLqgT0HuC5Gm.jpg","original_language":"en","original_title":"Interstellar","genre_ids":[12,18,878],"backdrop_path":"/xu9zaAevzQ5nnrsXN6JcahLnG4i.jpg","adult":false,"overview":"Interstellar chronicles the adventures of a group of explorers who make use of a newly discovered wormhole to surpass the limitations on human space travel and conquer the vast distances involved in an interstellar voyage.","release_date":"2014-11-05"},{"vote_count":126,"id":301959,"video":false,"vote_average":7.8,"title":"Interstellar: Nolan's Odyssey","popularity":5.505,"poster_path":"/xZwUIPqBHyJ2QIfMPANOZ1mAld6.jpg","original_language":"en","original_title":"Interstellar: Nolan's Odyssey","genre_ids":[99],"backdrop_path":"/bT5jpIZE50MI0COE8pOeq0kMpQo.jpg","adult":false,"overview":"Behind the scenes of Christopher Nolan's sci-fi drama, which stars Matthew McConaughey and Anne Hathaway","release_date":"2014-11-05"},{"vote_count":1,"id":287954,"video":false,"vote_average":7,"title":"Lolita from Interstellar Space","popularity":2.07,"poster_path":"/buoq7zYO4J3ttkEAqEMWelPDC0G.jpg","original_language":"en","original_title":"Lolita from Interstellar Space","genre_ids":[35],"backdrop_path":"/mgb6tVEieDYLpQt666ACzGz5cyE.jpg","adult":false,"overview":"An undeniably beautiful alien is sent to Earth to study the complex mating rituals of human beings, which leads to the young interstellar traveler experiencing the passion that surrounds the centuries-old ritual of the species.","release_date":"2014-03-08"},{"vote_count":7,"id":398188,"video":false,"vote_average":3.8,"title":"Interstellar Wars","popularity":0.819,"poster_path":"/cjvTebuqD8wmhchHE286ltVcbX6.jpg","original_language":"en","original_title":"Interstellar Wars","genre_ids":[878],"backdrop_path":"/yTnHa6lgIv8rNneSNBDkBe8MnZe.jpg","adult":false,"overview":"For Millennia the Aliien force has watched and waited, a brooding menace that has now at last decided to take over the Earth. Communications systems worldwide are sent into chaos by a strange atmospheric interference and this has turned into a global phenomenon. A massive spaceship headed towards Earth and smaller spaceships began to cover entire cities around the world. Suddenly, the wonder turns into horror as the spaceships destroy the cities with energy weapons. When the world counterattacks, the alien ships are invincible to military weapons. The survivors have to use their wits to kill the aliens, or die.","release_date":"2016-05-23"},{"vote_count":0,"id":529107,"video":false,"vote_average":0,"title":"Inside Interstellar","popularity":0.677,"poster_path":"/vemBplPKQhVe5cRWL7kxtgp15Vq.jpg","original_language":"en","original_title":"Inside Interstellar","genre_ids":[99],"backdrop_path":null,"adult":false,"overview":"Cast and crew of Christopher Nolan's 'Interstellar' discuss project origins, the film's imagery, ambitions, incorporating IMAX footage, the human element within the film, arm shooting locations outside of Calgary, the set construction and design, working with real corn, mechanical characters, including backstory, design, the blend of practical and digital effects in bringing them to life, the differences in the characters, the human performances behind the characters, the creative process behind the film's music, Icelandic locations, vehicle interiors, the processes of simulating the absence of gravity, the crucial end-film visuals and influence and inspiration for future generations","release_date":"2015-03-31"},{"vote_count":6,"id":336592,"video":false,"vote_average":7.8,"title":"The Science of Interstellar","popularity":0.6,"poster_path":"/6KBD7YSBjCfgBgHwpsQo3G3GGdx.jpg","original_language":"en","original_title":"The Science of Interstellar","genre_ids":[99],"backdrop_path":null,"adult":false,"overview":"The science of Christopher Nolan's sci-fi, Interstellar.","release_date":"2014-11-25"},{"vote_count":0,"id":552531,"video":false,"vote_average":0,"title":"The Prom Goer's Interstellar Excursion","popularity":0.6,"poster_path":null,"original_language":"en","original_title":"The Prom Goer's Interstellar Excursion","genre_ids":[12],"backdrop_path":null,"adult":false,"overview":"High schooler Bennett lands the prom date of his dreams, Sophie, just days before the dance. Not long after, he witnesses Sophie being abducted by aliens in the middle of the New Mexico desert.","release_date":""},{"vote_count":1,"id":460616,"video":false,"vote_average":4,"title":"Interstellar Civil War: Shadows of the Empire","popularity":0.6,"poster_path":"/7yTHKiVWZmUxgqGSzZv9yBx5bGI.jpg","original_language":"en","original_title":"Interstellar Civil War: Shadows of the Empire","genre_ids":[28,14,878],"backdrop_path":null,"adult":false,"overview":"The Imperial Empire is attacked by an Alliance of rebels led by fanatical mystics. The ruler, Empress Nobu, the 8th generation of her family, wants to execute a bold plan to rescue a cyborg, Leah C6, trapped on the battle ravaged planet Endor. The Empress believes Leah C6 holds the secret to destroying the Alliance of Rebels before their insurgency can kill millions of citizens of the Empire. She recruits her heroic fleet commander, Lord General Luka Raan and asks him to gather a team from the Empire's elite soldiers, the Galactic Rangers. Raan assembles the team in the ruins of Endor which was attacked by depraved Rebels and outlaws led by, Kindo-Ker, a fanatical mystic in Dark Energy. The Galactic Rangers begin a desperate search to find and rescue Leah C6 before the Alliance Rebels can.","release_date":"2018-04-15"},{"vote_count":11,"id":47662,"video":false,"vote_average":5.4,"title":"Trancers 4: Jack of Swords","popularity":3.313,"poster_path":"/69yr3oxBpSgua26RJkFmsm7plTG.jpg","original_language":"en","original_title":"Trancers 4: Jack of Swords","genre_ids":[878,28],"backdrop_path":"/5ism2HNUGuQi5a3ajYaN9ypMQMf.jpg","adult":false,"overview":"Jack is now back in the future. He had since lost Lena, and finds out that he's lost his other wife Alice to none other than Harris. While heading out for another assignment, something goes awry with the TCL chamber. Jack finds himself in a whole new dimension. He also runs across a different version of trancers. These guys seem to be in control of this planet. Jack manages to assist a rebel group known as the \"Tunnel Rats\" crush the rule of the evil Lord Calaban.","release_date":"1994-02-02"},{"vote_count":7,"id":47663,"video":false,"vote_average":5.3,"title":"Trancers 5: Sudden Deth","popularity":1.301,"poster_path":"/epMaTjPDMbgC8TbW1ZToh4RNv0i.jpg","original_language":"en","original_title":"Trancers 5: Sudden Deth","genre_ids":[28,53,878],"backdrop_path":"/an0xpUEX1P1BI80sCpkU1pSoREx.jpg","adult":false,"overview":"Jack Deth is back for one more round with the trancers. Jack must attempt to find his way home from the other-dimensional world of Orpheus, where magic works and the trancers were the ruling class (before Trancers IV, that is). Unfortunately, Jack's quest to find the mystical Tiamond in the Castle of Unrelenting Terror may be thwarted by the return of Caliban, king of the trancers who was thought dead.","release_date":"1994-11-04"},{"vote_count":1,"id":261443,"video":false,"vote_average":4.5,"title":"Angry Planet","popularity":0.623,"poster_path":"/ie5luS87ess1c5VgFhbGECJTQVK.jpg","original_language":"en","original_title":"Angry Planet","genre_ids":[878],"backdrop_path":"/u4JBwlGZN8hGeLxwu7Q0WmibACp.jpg","adult":false,"overview":"A criminal sentenced to life on a prison planet reveals his true purpose: to extract revenge on the killers who murdered his family.","release_date":"2008-01-01"}]} diff --git a/seasoned_api/test/fixtures/popular-movies-success-response.json b/seasoned_api/test/fixtures/popular-movies-success-response.json index d6c5f9d..215b1d0 100644 --- a/seasoned_api/test/fixtures/popular-movies-success-response.json +++ b/seasoned_api/test/fixtures/popular-movies-success-response.json @@ -1,227 +1 @@ -{ - "page": 1, - "results": [ - { - "background_path": "/9ywA15OAiwjSTvg3cBs9B7kOCBF.jpg", - "id": 337167, - "popularity": 620.073793, - "poster_path": "/jjPJ4s3DWZZvI4vw8Xfi4Vqa1Q8.jpg", - "score": 6.2, - "summary": "Believing they have left behind shadowy figures from their past, newlyweds Christian and Ana fully embrace an inextricable connection and shared life of luxury. But just as she steps into her role as Mrs. Grey and he relaxes into an unfamiliar stability, new threats could jeopardize their happy ending before it even begins.", - "title": "Fifty Shades Freed", - "type": "movie", - "year": 2018 - }, - { - "background_path": "/mhdeE1yShHTaDbJVdWyTlzFvNkr.jpg", - "id": 269149, - "popularity": 375.524444, - "poster_path": "/sM33SANp9z6rXW8Itn7NnG1GOEs.jpg", - "score": 7.7, - "summary": "Determined to prove herself, Officer Judy Hopps, the first bunny on Zootopia's police force, jumps at the chance to crack her first case - even if it means partnering with scam-artist fox Nick Wilde to solve the mystery.", - "title": "Zootopia", - "type": "movie", - "year": 2016 - }, - { - "background_path": "/b6ZJZHUdMEFECvGiDpJjlfUWela.jpg", - "id": 284054, - "popularity": 327.127873, - "poster_path": "/uxzzxijgPIY7slzFvMotPv8wjKA.jpg", - "score": 7.4, - "summary": "After the events of Captain America: Civil War, King T'Challa returns home to the reclusive, technologically advanced African nation of Wakanda to serve as his country's new leader. However, T'Challa soon finds that he is challenged for the throne from factions within his own country. When two foes conspire to destroy Wakanda, the hero known as Black Panther must team up with C.I.A. agent Everett K. Ross and members of the Dora Milaje, Wakandan special forces, to prevent Wakanda from being dragged into a world war.", - "title": "Black Panther", - "type": "movie", - "year": 2018 - }, - { - "background_path": "/c4Dw37VZjBmObmJw9bmt8IDwMZH.jpg", - "id": 181808, - "popularity": 231.685892, - "poster_path": "/kOVEVeg59E0wsnXmF9nrh6OmWII.jpg", - "score": 7.2, - "summary": "Rey develops her newly discovered abilities with the guidance of Luke Skywalker, who is unsettled by the strength of her powers. Meanwhile, the Resistance prepares to do battle with the First Order.", - "title": "Star Wars: The Last Jedi", - "type": "movie", - "year": 2017 - }, - { - "background_path": "/askg3SMvhqEl4OL52YuvdtY40Yb.jpg", - "id": 354912, - "popularity": 228.556797, - "poster_path": "/eKi8dIrr8voobbaGzDpe8w0PVbC.jpg", - "score": 7.8, - "summary": "Despite his family’s baffling generations-old ban on music, Miguel dreams of becoming an accomplished musician like his idol, Ernesto de la Cruz. Desperate to prove his talent, Miguel finds himself in the stunning and colorful Land of the Dead following a mysterious chain of events. Along the way, he meets charming trickster Hector, and together, they set off on an extraordinary journey to unlock the real story behind Miguel's family history.", - "title": "Coco", - "type": "movie", - "year": 2017 - }, - { - "background_path": "/rgyhSn3mINvkuy9iswZK0VLqQO3.jpg", - "id": 399055, - "popularity": 192.900926, - "poster_path": "/k4FwHlMhuRR5BISY2Gm2QZHlH5Q.jpg", - "score": 7.4, - "summary": "An other-worldly story, set against the backdrop of Cold War era America circa 1962, where a mute janitor working at a lab falls in love with an amphibious man being held captive there and devises a plan to help him escape.", - "title": "The Shape of Water", - "type": "movie", - "year": 2017 - }, - { - "background_path": "/kaIfm5ryEOwYg8mLbq8HkPuM1Fo.jpg", - "id": 284053, - "popularity": 188.734084, - "poster_path": "/rzRwTcFvttcN1ZpX2xv4j3tSdJu.jpg", - "score": 7.4, - "summary": "Thor is imprisoned on the other side of the universe and finds himself in a race against time to get back to Asgard to stop Ragnarok, the prophecy of destruction to his homeworld and the end of Asgardian civilization, at the hands of an all-powerful new threat, the ruthless Hela.", - "title": "Thor: Ragnarok", - "type": "movie", - "year": 2017 - }, - { - "background_path": "/bLJTjfbZ1c5zSNiAvGYs1Uc82ir.jpg", - "id": 338970, - "popularity": 172.766878, - "poster_path": "/ePyN2nX9t8SOl70eRW47Q29zUFO.jpg", - "score": 6.2, - "summary": "Lara Croft, the fiercely independent daughter of a missing adventurer, must push herself beyond her limits when she finds herself on the island where her father disappeared.", - "title": "Tomb Raider", - "type": "movie", - "year": 2018 - }, - { - "background_path": "/o5T8rZxoWSBMYwjsUFUqTt6uMQB.jpg", - "id": 141052, - "popularity": 153.290379, - "poster_path": "/eifGNCSDuxJeS1loAXil5bIGgvC.jpg", - "score": 6.4, - "summary": "Fuelled by his restored faith in humanity and inspired by Superman's selfless act, Bruce Wayne and Diana Prince assemble a team of metahumans consisting of Barry Allen, Arthur Curry and Victor Stone to face the catastrophic threat of Steppenwolf and the Parademons who are on the hunt for three Mother Boxes on Earth.", - "title": "Justice League", - "type": "movie", - "year": 2017 - }, - { - "background_path": "/gZF2EfM8ov834pCzRpt1xt01SUy.jpg", - "id": 394823, - "popularity": 138.469508, - "poster_path": "/x97gjhJW6X2fus5Q4zhgCe48LYr.jpg", - "score": 4.6, - "summary": "One day, robot Robby enters into a life of the most creative little boy, Toby. Robby had been separated from his robot parents when his spaceship crashed. Toby decides to offer his help and the two of them become friends.", - "title": "Robby and Toby's Fantastic Voyager", - "type": "movie", - "year": 2016 - }, - { - "background_path": "/4QrbczSQGZQA7BG9xMhccQI7LHm.jpg", - "id": 499772, - "popularity": 136.803208, - "poster_path": "/uGntNjUx6YAzbVy7RDgxWnWsdet.jpg", - "score": 5.5, - "summary": "The story of Jesse and Celeste who meets at an unexpected time in their lives. They then realize their names are the same as the characters in the popular break-up romantic comedy, Celeste and Jesse Forever.", - "title": "Meet Me In St. Gallen", - "type": "movie", - "year": 2018 - }, - { - "background_path": "/2SEgJ0mHJ7TSdVDbkGU061tR33K.jpg", - "id": 347882, - "popularity": 125.184868, - "poster_path": "/wridRvGxDqGldhzAIh3IcZhHT5F.jpg", - "score": 5.2, - "summary": "A young street magician is left to take care of his little sister after his mother's passing and turns to drug dealing in the Los Angeles party scene to keep a roof over their heads. When he gets into trouble with his supplier, his sister is kidnapped and he is forced to rely on both his sleight of hand and brilliant mind to save her.", - "title": "Sleight", - "type": "movie", - "year": 2017 - }, - { - "background_path": "/6aUWe0GSl69wMTSWWexsorMIvwU.jpg", - "id": 321612, - "popularity": 121.462615, - "poster_path": "/tWqifoYuwLETmmasnGHO7xBjEtt.jpg", - "score": 6.8, - "summary": "A live-action adaptation of Disney's version of the classic tale of a cursed prince and a beautiful young woman who helps him break the spell.", - "title": "Beauty and the Beast", - "type": "movie", - "year": 2017 - }, - { - "background_path": "/gDbNf0JpmG46fFTHJIPdFga9RRg.jpg", - "id": 300668, - "popularity": 113.297986, - "poster_path": "/d3qcpfNwbAMCNqWDHzPQsUYiUgS.jpg", - "score": 6.5, - "summary": "A biologist signs up for a dangerous, secret expedition into a mysterious zone where the laws of nature don't apply.", - "title": "Annihilation", - "type": "movie", - "year": 2018 - }, - { - "background_path": "/lkOZcsXcOLZYeJ2YxJd3vSldvU4.jpg", - "id": 198663, - "popularity": 109.304464, - "poster_path": "/coss7RgL0NH6g4fC2s5atvf3dFO.jpg", - "score": 7, - "summary": "Set in a post-apocalyptic world, young Thomas is deposited in a community of boys after his memory is erased, soon learning they're all trapped in a maze that will require him to join forces with fellow “runners” for a shot at escape.", - "title": "The Maze Runner", - "type": "movie", - "year": 2014 - }, - { - "background_path": "/rz3TAyd5kmiJmozp3GUbYeB5Kep.jpg", - "id": 353486, - "popularity": 105.483862, - "poster_path": "/bXrZ5iHBEjH7WMidbUDQ0U2xbmr.jpg", - "score": 6.5, - "summary": "The tables are turned as four teenagers are sucked into Jumanji's world - pitted against rhinos, black mambas and an endless variety of jungle traps and puzzles. To survive, they'll play as characters from the game.", - "title": "Jumanji: Welcome to the Jungle", - "type": "movie", - "year": 2017 - }, - { - "background_path": "/mVr0UiqyltcfqxbAUcLl9zWL8ah.jpg", - "id": 335984, - "popularity": 100.275711, - "poster_path": "/gajva2L0rPYkEWjzgFlBXCAVBE5.jpg", - "score": 7.3, - "summary": "Thirty years after the events of the first film, a new blade runner, LAPD Officer K, unearths a long-buried secret that has the potential to plunge what's left of society into chaos. K's discovery leads him on a quest to find Rick Deckard, a former LAPD blade runner who has been missing for 30 years.", - "title": "Blade Runner 2049", - "type": "movie", - "year": 2017 - }, - { - "background_path": "/3L5gfIKt2RK9vnCiLgWTAzkhQWC.jpg", - "id": 396422, - "popularity": 98.340797, - "poster_path": "/tb86j8jVCVsdZnzf8I6cIi65IeM.jpg", - "score": 6.4, - "summary": "Several years after the tragic death of their little girl, a dollmaker and his wife welcome a nun and several girls from a shuttered orphanage into their home, soon becoming the target of the dollmaker's possessed creation, Annabelle.", - "title": "Annabelle: Creation", - "type": "movie", - "year": 2017 - }, - { - "background_path": "/umC04Cozevu8nn3JTDJ1pc7PVTn.jpg", - "id": 245891, - "popularity": 88.622619, - "poster_path": "/5vHssUeVe25bMrof1HyaPyWgaP.jpg", - "score": 7, - "summary": "Ex-hitman John Wick comes out of retirement to track down the gangsters that took everything from him.", - "title": "John Wick", - "type": "movie", - "year": 2014 - }, - { - "background_path": "/9K4QqQZg4TVXcxBGDiVY4Aey3Rn.jpg", - "id": 460793, - "popularity": 88.332911, - "poster_path": "/As8WTtxXs9e3cBit3ztTf7zoRmm.jpg", - "score": 5.9, - "summary": "Olaf is on a mission to harness the best holiday traditions for Anna, Elsa, and Kristoff.", - "title": "Olaf's Frozen Adventure", - "type": "movie", - "year": 2017 - } - ], - "total_pages": 995, - "total_results": 19889 -} \ No newline at end of file +{"page":1,"total_results":19844,"total_pages":993,"results":[{"vote_count":1754,"id":335983,"video":false,"vote_average":6.6,"title":"Venom","popularity":446.596,"poster_path":"/2uNW4WbgBXL25BAbXGLnLqX71Sw.jpg","original_language":"en","original_title":"Venom","genre_ids":[878],"backdrop_path":"/VuukZLgaCrho2Ar8Scl9HtV3yD.jpg","adult":false,"overview":"When Eddie Brock acquires the powers of a symbiote, he will have to release his alter-ego \"Venom\" to save his life.","release_date":"2018-10-03"},{"vote_count":424,"id":424139,"video":false,"vote_average":6.7,"title":"Halloween","popularity":354.291,"poster_path":"/bXs0zkv2iGVViZEy78teg2ycDBm.jpg","original_language":"en","original_title":"Halloween","genre_ids":[27,53],"backdrop_path":"/tZ358Wk4BnOc4FjdGsiexAUvCMH.jpg","adult":false,"overview":"Laurie Strode comes to her final confrontation with Michael Myers, the masked figure who has haunted her since she narrowly escaped his killing spree on Halloween night four decades ago.","release_date":"2018-10-18"},{"vote_count":48,"id":507569,"video":false,"vote_average":5.9,"title":"The Seven Deadly Sins: Prisoners of the Sky","popularity":194.674,"poster_path":"/lgYGPujZNckyKwQQNwMLmkWoKui.jpg","original_language":"en","original_title":"劇場版 七つの大罪 天空の囚われ人","genre_ids":[28,12,14,16],"backdrop_path":"/uKwOX7MtKlAaGeCQe6c4jc1vZpj.jpg","adult":false,"overview":"Traveling in search of the rare ingredient, “sky fish” Meliodas and Hawk arrive at a palace that floats above the clouds. The people there are busy preparing a ceremony, meant to protect their home from a ferocious beast that awakens once every 3,000 years. But before the ritual is complete, the Six Knights of Black—a Demon Clan army—removes the seal on the beast, threatening the lives of everyone in the Sky Palace.","release_date":"2018-08-18"},{"vote_count":1202,"id":332562,"video":false,"vote_average":7.6,"title":"A Star Is Born","popularity":187.61,"poster_path":"/wrFpXMNBRj2PBiN4Z5kix51XaIZ.jpg","original_language":"en","original_title":"A Star Is Born","genre_ids":[18,10402,10749],"backdrop_path":"/840rbblaLc4SVxm8gF3DNdJ0YAE.jpg","adult":false,"overview":"Seasoned musician Jackson Maine discovers—and falls in love with—struggling artist Ally. She has just about given up on her dream to make it big as a singer—until Jack coaxes her into the spotlight. But even as Ally's career takes off, the personal side of their relationship is breaking down, as Jack fights an ongoing battle with his own internal demons.","release_date":"2018-10-03"},{"vote_count":3166,"id":260513,"video":false,"vote_average":7.6,"title":"Incredibles 2","popularity":170.839,"poster_path":"/x1txcDXkcM65gl7w20PwYSxAYah.jpg","original_language":"en","original_title":"Incredibles 2","genre_ids":[28,12,16,10751],"backdrop_path":"/mabuNsGJgRuCTuGqjFkWe1xdu19.jpg","adult":false,"overview":"Elastigirl springs into action to save the day, while Mr. Incredible faces his greatest challenge yet – taking care of the problems of his three children.","release_date":"2018-06-14"},{"vote_count":119,"id":454293,"video":false,"vote_average":6.4,"title":"Night School","popularity":152.869,"poster_path":"/1NSMAaBPSbWv7sGmF8oLGMNb8Qm.jpg","original_language":"en","original_title":"Night School","genre_ids":[35],"backdrop_path":"/7CWpvqVY5JWbEtkaenzqfJjVSal.jpg","adult":false,"overview":"Teddy Walker is a successful salesman whose life takes an unexpected turn when he accidentally blows up his place of employment. Forced to attend night school to get his GED, Teddy soon finds himself dealing with a group of misfit students, his former high school nemesis and a feisty teacher who doesn't think he's too bright.","release_date":"2018-09-27"},{"vote_count":197,"id":347375,"video":false,"vote_average":5.8,"title":"Mile 22","popularity":139.525,"poster_path":"/hQKdZ6nnHfrWCAZ87cPnazrJEDL.jpg","original_language":"en","original_title":"Mile 22","genre_ids":[28,53],"backdrop_path":"/A2rIVEV2jOzb4smx8hby1u9UwAm.jpg","adult":false,"overview":"An elite group of American operatives, aided by a top-secret tactical command team, must transport an asset who holds life-threatening information to an extraction point 22 miles away through the hostile streets of an Asian city.","release_date":"2018-08-16"},{"vote_count":1245,"id":439079,"video":false,"vote_average":5.8,"title":"The Nun","popularity":126.301,"poster_path":"/sFC1ElvoKGdHJIWRpNB3xWJ9lJA.jpg","original_language":"en","original_title":"The Nun","genre_ids":[27,9648,53],"backdrop_path":"/fgsHxz21B27hOOqQBiw9L6yWcM7.jpg","adult":false,"overview":"When a young nun at a cloistered abbey in Romania takes her own life, a priest with a haunted past and a novitiate on the threshold of her final vows are sent by the Vatican to investigate. Together they uncover the order’s unholy secret. Risking not only their lives but their faith and their very souls, they confront a malevolent force in the form of the same demonic nun that first terrorized audiences in “The Conjuring 2” as the abbey becomes a horrific battleground between the living and the damned.","release_date":"2018-09-05"},{"vote_count":9035,"id":299536,"video":false,"vote_average":8.3,"title":"Avengers: Infinity War","popularity":122.307,"poster_path":"/7WsyChQLEftFiDOVTGkv3hFpyyt.jpg","original_language":"en","original_title":"Avengers: Infinity War","genre_ids":[12,878,28,14],"backdrop_path":"/lmZFxXgJE3vgrciwuDib0N8CfQo.jpg","adult":false,"overview":"As the Avengers and their allies have continued to protect the world from threats too large for any one hero to handle, a new danger has emerged from the cosmic shadows: Thanos. A despot of intergalactic infamy, his goal is to collect all six Infinity Stones, artifacts of unimaginable power, and use them to inflict his twisted will on all of reality. Everything the Avengers have fought for has led up to this moment - the fate of Earth and existence itself has never been more uncertain.","release_date":"2018-04-25"},{"vote_count":367,"id":399360,"video":false,"vote_average":5.4,"title":"Alpha","popularity":117.828,"poster_path":"/afdZAIcAQscziqVtsEoh2PwsYTW.jpg","original_language":"en","original_title":"Alpha","genre_ids":[12,18],"backdrop_path":"/nKMeTdm72LQ756Eq20uTjF1zDXu.jpg","adult":false,"overview":"After a hunting expedition goes awry, a young caveman struggles against the elements to find his way home.","release_date":"2018-08-17"},{"vote_count":3065,"id":363088,"video":false,"vote_average":7,"title":"Ant-Man and the Wasp","popularity":110.377,"poster_path":"/rv1AWImgx386ULjcf62VYaW8zSt.jpg","original_language":"en","original_title":"Ant-Man and the Wasp","genre_ids":[28,12,878,35,10751],"backdrop_path":"/6P3c80EOm7BodndGBUAJHHsHKrp.jpg","adult":false,"overview":"Just when his time under house arrest is about to end, Scott Lang puts again his freedom at risk to help Hope van Dyne and Dr. Hank Pym dive into the quantum realm and try to accomplish, against time and any chance of success, a very dangerous rescue mission.","release_date":"2018-07-04"},{"vote_count":696,"id":346910,"video":false,"vote_average":5.3,"title":"The Predator","popularity":101.547,"poster_path":"/wMq9kQXTeQCHUZOG4fAe5cAxyUA.jpg","original_language":"en","original_title":"The Predator","genre_ids":[27,878,28,53],"backdrop_path":"/f4E0ocYeToEuXvczZv6QArrMDJ.jpg","adult":false,"overview":"From the outer reaches of space to the small-town streets of suburbia, the hunt comes home. Now, the universe’s most lethal hunters are stronger, smarter and deadlier than ever before, having genetically upgraded themselves with DNA from other species. When a young boy accidentally triggers their return to Earth, only a ragtag crew of ex-soldiers and a disgruntled science teacher can prevent the end of the human race.","release_date":"2018-09-13"},{"vote_count":258,"id":463272,"video":false,"vote_average":6.2,"title":"Johnny English Strikes Again","popularity":96.091,"poster_path":"/tCBxnZwLiY1BOKw3tH6AxHZdqPh.jpg","original_language":"en","original_title":"Johnny English Strikes Again","genre_ids":[12,10751,28,35],"backdrop_path":"/yCOLqh5MOGyYdo58Ap0aWvKop9h.jpg","adult":false,"overview":"Disaster strikes when a criminal mastermind reveals the identities of all active undercover agents in Britain. The secret service can now rely on only one man—Johnny English. Currently teaching at a minor prep school, Johnny springs back into action to find the mysterious hacker. For this mission to succeed, he’ll need all of his skills—what few he has—as the man with yesterday’s analogue methods faces off against tomorrow’s digital technology.","release_date":"2018-09-13"},{"vote_count":384,"id":369972,"video":false,"vote_average":7.2,"title":"First Man","popularity":90.644,"poster_path":"/i91mfvFcPPlaegcbOyjGgiWfZzh.jpg","original_language":"en","original_title":"First Man","genre_ids":[36,18],"backdrop_path":"/z1FkoHO7bz40S4JiptWHSYoPpxq.jpg","adult":false,"overview":"A look at the life of the astronaut, Neil Armstrong, and the legendary space mission that led him to become the first man to walk on the Moon on July 20, 1969.","release_date":"2018-10-11"},{"vote_count":1308,"id":345940,"video":false,"vote_average":6,"title":"The Meg","popularity":86.442,"poster_path":"/eyWICPcxOuTcDDDbTMOZawoOn8d.jpg","original_language":"en","original_title":"The Meg","genre_ids":[28,878,53],"backdrop_path":"/rH79sB6Nkx4cMW3JzsUy7wK0rhX.jpg","adult":false,"overview":"A deep sea submersible pilot revisits his past fears in the Mariana Trench, and accidentally unleashes the seventy foot ancestor of the Great White Shark believed to be extinct.","release_date":"2018-08-09"},{"vote_count":8750,"id":284054,"video":false,"vote_average":7.3,"title":"Black Panther","popularity":79.294,"poster_path":"/uxzzxijgPIY7slzFvMotPv8wjKA.jpg","original_language":"en","original_title":"Black Panther","genre_ids":[28,12,14,878],"backdrop_path":"/b6ZJZHUdMEFECvGiDpJjlfUWela.jpg","adult":false,"overview":"King T'Challa returns home from America to the reclusive, technologically advanced African nation of Wakanda to serve as his country's new leader. However, T'Challa soon finds that he is challenged for the throne by factions within his own country as well as without. Using powers reserved to Wakandan kings, T'Challa assumes the Black Panther mantel to join with girlfriend Nakia, the queen-mother, his princess-kid sister, members of the Dora Milaje (the Wakandan 'special forces') and an American secret agent, to prevent Wakanda from being dragged into a world war.","release_date":"2018-02-13"},{"vote_count":78,"id":438590,"video":false,"vote_average":5.4,"title":"A-X-L","popularity":78.392,"poster_path":"/9kB56ZdMB6RgY5QtX9Bar45jCeI.jpg","original_language":"en","original_title":"A-X-L","genre_ids":[878,28,12,10751],"backdrop_path":"/l1nYo0yzKjf84atnBDbx0do16vQ.jpg","adult":false,"overview":"The life of a teenage boy is forever altered by a chance encounter with cutting edge military technology.","release_date":"2018-08-16"},{"vote_count":373,"id":420814,"video":false,"vote_average":7.6,"title":"Christopher Robin","popularity":73.3,"poster_path":"/xR5w0he6czZkcAz459a4iPBqXGe.jpg","original_language":"en","original_title":"Christopher Robin","genre_ids":[16,12,35,10751,14],"backdrop_path":"/uDt8bQ4lGVlabEx5Gl2cPzvy6qz.jpg","adult":false,"overview":"Working-class family man Christopher Robin encounters his childhood friend Winnie-the-Pooh, who helps him to rediscover the joys of life.","release_date":"2018-08-02"},{"vote_count":13,"id":523873,"video":false,"vote_average":3.9,"title":"Kung Fu League","popularity":72.261,"poster_path":"/rW0A73hjzPWVwADlCTLnjLhAFLX.jpg","original_language":"zh","original_title":"功夫联盟","genre_ids":[28,35],"backdrop_path":null,"adult":false,"overview":"Martial arts comedy following a group of kung fu legends banding together to take on the bad guys. The legends includes VINCENT ZHAO reprising his role as ‘Wong Fei Hung’ with DENNIS TO once again portraying ‘Wing Chun’ master ‘Ip Man’, DANNY CHAN KWOK KWAN as ‘Chen Zhen’ and ANDY ON as master ‘Huo Yuan Jia’.","release_date":"2018-10-19"},{"vote_count":785,"id":487558,"video":false,"vote_average":7.5,"title":"BlacKkKlansman","popularity":69.141,"poster_path":"/bT5WuAsjDJYQv2vXbWGDQTmjKav.jpg","original_language":"en","original_title":"BlacKkKlansman","genre_ids":[80,18,35],"backdrop_path":"/gMVdhfQ7q9DFHhDkehrququjGPd.jpg","adult":false,"overview":"Ron Stallworth, an African-American police officer from Colorado, successfully manages to infiltrate the local Ku Klux Klan and become the head of the local chapter.","release_date":"2018-07-30"}]} diff --git a/seasoned_api/test/fixtures/popular-show-success-response.json b/seasoned_api/test/fixtures/popular-show-success-response.json index 2163c1d..7857913 100644 --- a/seasoned_api/test/fixtures/popular-show-success-response.json +++ b/seasoned_api/test/fixtures/popular-show-success-response.json @@ -1,227 +1 @@ -{ - "page": 1, - "results": [ - { - "background_path": "/nGsNruW3W27V6r4gkyc3iiEGsKR.jpg", - "id": 1418, - "popularity": 265.003846, - "poster_path": "/ooBGRQBdbGzBxAVfExiO8r7kloA.jpg", - "score": 6.8, - "summary": "The Big Bang Theory is centered on five characters living in Pasadena, California: roommates Leonard Hofstadter and Sheldon Cooper; Penny, a waitress and aspiring actress who lives across the hall; and Leonard and Sheldon's equally geeky and socially awkward friends and co-workers, mechanical engineer Howard Wolowitz and astrophysicist Raj Koothrappali. The geekiness and intellect of the four guys is contrasted for comic effect with Penny's social skills and common sense.", - "title": "The Big Bang Theory", - "type": "show", - "year": 2007 - }, - { - "background_path": "/xVzvD5BPAU4HpleFSo8QOdHkndo.jpg", - "id": 1402, - "popularity": 259.746702, - "poster_path": "/yn7psGTZsHumHOkLUmYpyrIcA2G.jpg", - "score": 7.4, - "summary": "Sheriff's deputy Rick Grimes awakens from a coma to find a post-apocalyptic world dominated by flesh-eating zombies. He sets out to find his family and encounters many other survivors along the way.", - "title": "The Walking Dead", - "type": "show", - "year": 2010 - }, - { - "background_path": "/a906PH7CDmSOdS7kmnAgdWk5mhv.jpg", - "id": 67744, - "popularity": 133.480285, - "poster_path": "/zVuc3Sfs6gyJm6M6Iq52jqdavw4.jpg", - "score": 7.5, - "summary": "An agent in the FBI's Elite Serial Crime Unit develops profiling techniques as he pursues notorious serial killers and rapists.", - "title": "Mindhunter", - "type": "show", - "year": 2017 - }, - { - "background_path": "/pH38r4TWTqq7Mcs6XAlwgzNUeJe.jpg", - "id": 1434, - "popularity": 115.294602, - "poster_path": "/gBGUL1UTUNmdRQT8gA1LUV4yg39.jpg", - "score": 6.6, - "summary": "Sick, twisted, politically incorrect and Freakin' Sweet animated series featuring the adventures of the dysfunctional Griffin family. Bumbling Peter and long-suffering Lois have three kids. Stewie (a brilliant but sadistic baby bent on killing his mother and taking over the world), Meg (the oldest, and is the most unpopular girl in town) and Chris (the middle kid, he's not very bright but has a passion for movies). The final member of the family is Brian - a talking dog and much more than a pet, he keeps Stewie in check whilst sipping Martinis and sorting through his own life issues.", - "title": "Family Guy", - "type": "show", - "year": 1999 - }, - { - "background_path": "/qtr5i6hOm6oVzTYl3jOQAYP3oc7.jpg", - "id": 1403, - "popularity": 111.281986, - "poster_path": "/xjm6uVktPuKXNILwjLXwVG5d5BU.jpg", - "score": 6.7, - "summary": "Agent Phil Coulson of S.H.I.E.L.D. (Strategic Homeland Intervention, Enforcement and Logistics Division) puts together a team of agents to investigate the new, the strange and the unknown around the globe, protecting the ordinary from the extraordinary.", - "title": "Marvel's Agents of S.H.I.E.L.D.", - "type": "show", - "year": 2013 - }, - { - "background_path": "/mmxxEpTqVdwBlu5Pii7tbedBkPC.jpg", - "id": 60735, - "popularity": 109.249893, - "poster_path": "/lUFK7ElGCk9kVEryDJHICeNdmd1.jpg", - "score": 6.7, - "summary": "After a particle accelerator causes a freak storm, CSI Investigator Barry Allen is struck by lightning and falls into a coma. Months later he awakens with the power of super speed, granting him the ability to move through Central City like an unseen guardian angel. Though initially excited by his newfound powers, Barry is shocked to discover he is not the only \"meta-human\" who was created in the wake of the accelerator explosion -- and not everyone is using their new powers for good. Barry partners with S.T.A.R. Labs and dedicates his life to protect the innocent. For now, only a few close friends and associates know that Barry is literally the fastest man alive, but it won't be long before the world learns what Barry Allen has become...The Flash.", - "title": "The Flash", - "type": "show", - "year": 2014 - }, - { - "background_path": "/f5uNbUC76oowt5mt5J9QlqrIYQ6.jpg", - "id": 456, - "popularity": 104.645298, - "poster_path": "/yTZQkSsxUFJZJe67IenRM0AEklc.jpg", - "score": 7.1, - "summary": "Set in Springfield, the average American town, the show focuses on the antics and everyday adventures of the Simpson family; Homer, Marge, Bart, Lisa and Maggie, as well as a virtual cast of thousands. Since the beginning, the series has been a pop culture icon, attracting hundreds of celebrities to guest star. The show has also made name for itself in its fearless satirical take on politics, media and American life in general.", - "title": "The Simpsons", - "type": "show", - "year": 1989 - }, - { - "background_path": "/2hF2RnjVwHvxfhH2lkB9H9FdQHb.jpg", - "id": 61555, - "popularity": 94.412332, - "poster_path": "/w1FDeOGoFS1qsSRHlj2Jzp2P0e1.jpg", - "score": 7.3, - "summary": "A gripping anthological relationship thriller series exploring the emotional fallout of a child's abduction not only on the family but on the wider community, told over two time frames.", - "title": "The Missing", - "type": "show", - "year": 2014 - }, - { - "background_path": "/dKxkwAJfGuznW8Hu0mhaDJtna0n.jpg", - "id": 1412, - "popularity": 85.601456, - "poster_path": "/mo0FP1GxOFZT4UDde7RFDz5APXF.jpg", - "score": 6, - "summary": "Spoiled billionaire playboy Oliver Queen is missing and presumed dead when his yacht is lost at sea. He returns five years later a changed man, determined to clean up the city as a hooded vigilante armed with a bow.", - "title": "Arrow", - "type": "show", - "year": 2012 - }, - { - "background_path": "/o9OKe3M06QMLOzTl3l6GStYtnE9.jpg", - "id": 1622, - "popularity": 85.36772, - "poster_path": "/pui1V389cQft0BVFu9pbsYLEW1Q.jpg", - "score": 7.2, - "summary": "When they were boys, Sam and Dean Winchester lost their mother to a mysterious and demonic supernatural force. Subsequently, their father raised them to be soldiers. He taught them about the paranormal evil that lives in the dark corners and on the back roads of America ... and he taught them how to kill it. Now, the Winchester brothers crisscross the country in their '67 Chevy Impala, battling every kind of supernatural threat they encounter along the way. ", - "title": "Supernatural", - "type": "show", - "year": 2005 - }, - { - "background_path": "/snxFgPvHMcpW5f8Q3wu6uRRycww.jpg", - "id": 1421, - "popularity": 81.016473, - "poster_path": "/gLAcu4VPCAb90oJvJ4nUJc5ZBQi.jpg", - "score": 7.3, - "summary": "The Pritchett-Dunphy-Tucker clan is a wonderfully large and blended family. They give us an honest and often hilarious look into the sometimes warm, sometimes twisted, embrace of the modern family.", - "title": "Modern Family", - "type": "show", - "year": 2009 - }, - { - "background_path": "/hTxfw4af6EizpLM7tHKtoSlbdnu.jpg", - "id": 1407, - "popularity": 78.331466, - "poster_path": "/lT8o38ubu9uzcjZbkDtwsVizDeQ.jpg", - "score": 7.3, - "summary": "CIA officer Carrie Mathison is tops in her field despite being bipolar, which makes her volatile and unpredictable. With the help of her long-time mentor Saul Berenson, Carrie fearlessly risks everything, including her personal well-being and even sanity, at every turn.", - "title": "Homeland", - "type": "show", - "year": 2011 - }, - { - "background_path": "/mKBP1OCgCG0jw8DwVYlnYqVILtc.jpg", - "id": 60708, - "popularity": 78.270408, - "poster_path": "/5tSHzkJ1HBnyGdcpr6wSyw7jYnJ.jpg", - "score": 6.9, - "summary": "Before there was Batman, there was GOTHAM. \n\nEveryone knows the name Commissioner Gordon. He is one of the crime world's greatest foes, a man whose reputation is synonymous with law and order. But what is known of Gordon's story and his rise from rookie detective to Police Commissioner? What did it take to navigate the multiple layers of corruption that secretly ruled Gotham City, the spawning ground of the world's most iconic villains? And what circumstances created them – the larger-than-life personas who would become Catwoman, The Penguin, The Riddler, Two-Face and The Joker? ", - "title": "Gotham", - "type": "show", - "year": 2014 - }, - { - "background_path": "/kOvt2BOOwSAQCT8yo3pM3X2GXjh.jpg", - "id": 2734, - "popularity": 77.581038, - "poster_path": "/yzMQBlirydvKp4Zgr5FbXlsrRmw.jpg", - "score": 6.2, - "summary": "In the criminal justice system, sexually-based offenses are considered especially heinous. In New York City, the dedicated detectives who investigate these vicious felonies are members of an elite squad known as the Special Victims Unit. These are their stories.", - "title": "Law & Order: Special Victims Unit", - "type": "show", - "year": 1999 - }, - { - "background_path": "/y6JABtgWMVYPx84Rvy7tROU5aNH.jpg", - "id": 1416, - "popularity": 77.265382, - "poster_path": "/mgOZSS2FFIGtfVeac1buBw3Cx5w.jpg", - "score": 6.2, - "summary": "Follows the personal and professional lives of a group of doctors at Seattle’s Grey Sloan Memorial Hospital.", - "title": "Grey's Anatomy", - "type": "show", - "year": 2005 - }, - { - "background_path": "/hQOrVu62yJkMkyKDKdzMt6MzdIQ.jpg", - "id": 72837, - "popularity": 75.714532, - "poster_path": "/pyruRb239sh6DUtj8FtjtOZG1d4.jpg", - "score": 2, - "summary": "Secret Story takes more or less the basic principles of Big Brother, a reality show created in 1997 by the Dutchman John de Mol. The game contestants are cut off from the rest of the world during ten to fifteen weeks in a house called “house of secrets”, where every room is fitted with video cameras, except the restroom. They have to keep a secret while trying to discover the other contestants’ one.", - "title": "Secret Story - Casa dos Segredos", - "type": "show", - "year": 2010 - }, - { - "background_path": "/efiX8iir6GEBWCD0uCFIi5NAyYA.jpg", - "id": 1668, - "popularity": 74.555045, - "poster_path": "/7buCWBTpiPrCF5Lt023dSC60rgS.jpg", - "score": 7.8, - "summary": "Friends is an American sitcom revolving around a group of friends in the New York City borough of Manhattan. Episodes typically depict the friends' comedic and romantic adventures and career issues, such as Joey auditioning for roles or Rachel seeking jobs in the fashion industry. The six characters each have many dates and serious relationships, such as Monica with Richard Burke and Ross with Emily Waltham. Other frequently recurring characters include Ross and Monica's parents in Long Island, Ross's ex-wife and their son, Central Perk barista Gunther, Chandler's ex-girlfriend Janice, and Phoebe's twin sister Ursula.", - "title": "Friends", - "type": "show", - "year": 1994 - }, - { - "background_path": "/gX8SYlnL9ZznfZwEH4KJUePBFUM.jpg", - "id": 1399, - "popularity": 73.757691, - "poster_path": "/gwPSoYUHAKmdyVywgLpKKA4BjRr.jpg", - "score": 8.1, - "summary": "Seven noble families fight for control of the mythical land of Westeros. Friction between the houses leads to full-scale war. All while a very ancient evil awakens in the farthest north. Amidst the war, a neglected military order of misfits, the Night's Watch, is all that stands between the realms of men and icy horrors beyond.", - "title": "Game of Thrones", - "type": "show", - "year": 2011 - }, - { - "background_path": "/uqu5SuPIr0VQPqXF7CuGY3j2431.jpg", - "id": 2046, - "popularity": 71.597403, - "poster_path": "/bMj6iM7TBcceG44vpireA2Axeab.jpg", - "score": 6.2, - "summary": "Sydney Bristow, an agent who has been tricked to believe she is working for the U.S. government, is actually working for a criminal organization named the Alliance of Twelve. Upon learning this, Sydney becomes a double agent for the real CIA.", - "title": "Alias", - "type": "show", - "year": 2001 - }, - { - "background_path": "/xHCfWGlxwbtMeeOnTvxUCZRGnkk.jpg", - "id": 62127, - "popularity": 71.366535, - "poster_path": "/nv4nLXbDhcISPP8C1mgaxKU50KO.jpg", - "score": 6.1, - "summary": "Danny Rand resurfaces 15 years after being presumed dead. Now, with the power of the Iron Fist, he seeks to reclaim his past and fulfill his destiny.", - "title": "Marvel's Iron Fist", - "type": "show", - "year": 2017 - } - ], - "total_pages": 1002, - "total_results": 20037 -} \ No newline at end of file +{"page":1,"total_results":19983,"total_pages":1000,"results":[{"original_name":"The Flash","genre_ids":[18,10765],"name":"The Flash","popularity":271.575,"origin_country":["US"],"vote_count":2315,"first_air_date":"2014-10-07","backdrop_path":"/mmxxEpTqVdwBlu5Pii7tbedBkPC.jpg","original_language":"en","id":60735,"vote_average":6.7,"overview":"After a particle accelerator causes a freak storm, CSI Investigator Barry Allen is struck by lightning and falls into a coma. Months later he awakens with the power of super speed, granting him the ability to move through Central City like an unseen guardian angel. Though initially excited by his newfound powers, Barry is shocked to discover he is not the only \"meta-human\" who was created in the wake of the accelerator explosion -- and not everyone is using their new powers for good. Barry partners with S.T.A.R. Labs and dedicates his life to protect the innocent. For now, only a few close friends and associates know that Barry is literally the fastest man alive, but it won't be long before the world learns what Barry Allen has become...The Flash.","poster_path":"/fki3kBlwJzFp8QohL43g9ReV455.jpg"},{"original_name":"The Walking Dead","genre_ids":[18,10759,10765],"name":"The Walking Dead","popularity":183.183,"origin_country":["US"],"vote_count":3741,"first_air_date":"2010-10-31","backdrop_path":"/xVzvD5BPAU4HpleFSo8QOdHkndo.jpg","original_language":"en","id":1402,"vote_average":7.3,"overview":"Sheriff's deputy Rick Grimes awakens from a coma to find a post-apocalyptic world dominated by flesh-eating zombies. He sets out to find his family and encounters many other survivors along the way.","poster_path":"/yn7psGTZsHumHOkLUmYpyrIcA2G.jpg"},{"original_name":"Grey's Anatomy","genre_ids":[18],"name":"Grey's Anatomy","popularity":104.917,"origin_country":["US"],"vote_count":806,"first_air_date":"2005-03-27","backdrop_path":"/y6JABtgWMVYPx84Rvy7tROU5aNH.jpg","original_language":"en","id":1416,"vote_average":6.3,"overview":"Follows the personal and professional lives of a group of doctors at Seattle’s Grey Sloan Memorial Hospital.","poster_path":"/mgOZSS2FFIGtfVeac1buBw3Cx5w.jpg"},{"original_name":"Marvel's Iron Fist","genre_ids":[80,18,10759,10765],"name":"Marvel's Iron Fist","popularity":92.48,"origin_country":["US"],"vote_count":698,"first_air_date":"2017-03-17","backdrop_path":"/xHCfWGlxwbtMeeOnTvxUCZRGnkk.jpg","original_language":"en","id":62127,"vote_average":6.1,"overview":"Danny Rand resurfaces 15 years after being presumed dead. Now, with the power of the Iron Fist, he seeks to reclaim his past and fulfill his destiny.","poster_path":"/nv4nLXbDhcISPP8C1mgaxKU50KO.jpg"},{"original_name":"Arrow","genre_ids":[80,18,9648,10759],"name":"Arrow","popularity":84.855,"origin_country":["US"],"vote_count":1998,"first_air_date":"2012-10-10","backdrop_path":"/dKxkwAJfGuznW8Hu0mhaDJtna0n.jpg","original_language":"en","id":1412,"vote_average":6,"overview":"Spoiled billionaire playboy Oliver Queen is missing and presumed dead when his yacht is lost at sea. He returns five years later a changed man, determined to clean up the city as a hooded vigilante armed with a bow.","poster_path":"/mo0FP1GxOFZT4UDde7RFDz5APXF.jpg"},{"original_name":"The Big Bang Theory","genre_ids":[35],"name":"The Big Bang Theory","popularity":82.409,"origin_country":["US"],"vote_count":3344,"first_air_date":"2007-09-24","backdrop_path":"/nGsNruW3W27V6r4gkyc3iiEGsKR.jpg","original_language":"en","id":1418,"vote_average":6.8,"overview":"The Big Bang Theory is centered on five characters living in Pasadena, California: roommates Leonard Hofstadter and Sheldon Cooper; Penny, a waitress and aspiring actress who lives across the hall; and Leonard and Sheldon's equally geeky and socially awkward friends and co-workers, mechanical engineer Howard Wolowitz and astrophysicist Raj Koothrappali. The geekiness and intellect of the four guys is contrasted for comic effect with Penny's social skills and common sense.","poster_path":"/ooBGRQBdbGzBxAVfExiO8r7kloA.jpg"},{"original_name":"The Simpsons","genre_ids":[16,35],"name":"The Simpsons","popularity":77.538,"origin_country":["US"],"vote_count":1731,"first_air_date":"1989-12-17","backdrop_path":"/lnnrirKFGwFW18GiH3AmuYy40cz.jpg","original_language":"en","id":456,"vote_average":7.1,"overview":"Set in Springfield, the average American town, the show focuses on the antics and everyday adventures of the Simpson family; Homer, Marge, Bart, Lisa and Maggie, as well as a virtual cast of thousands. Since the beginning, the series has been a pop culture icon, attracting hundreds of celebrities to guest star. The show has also made name for itself in its fearless satirical take on politics, media and American life in general.","poster_path":"/yTZQkSsxUFJZJe67IenRM0AEklc.jpg"},{"original_name":"Supergirl","genre_ids":[28,12,18,878],"name":"Supergirl","popularity":64.875,"origin_country":["US"],"vote_count":769,"first_air_date":"2015-10-26","backdrop_path":"/2qou2R47XZ1N6SlqGZcoCHDyEhN.jpg","original_language":"en","id":62688,"vote_average":5.8,"overview":"Twenty-four-year-old Kara Zor-El, who was taken in by the Danvers family when she was 13 after being sent away from Krypton, must learn to embrace her powers after previously hiding them. The Danvers teach her to be careful with her powers, until she has to reveal them during an unexpected disaster, setting her on her journey of heroism.","poster_path":"/vqBsgL9nd2v04ZvCqPzwtckDdFD.jpg"},{"original_name":"Chilling Adventures of Sabrina","genre_ids":[18,9648,10765],"name":"Chilling Adventures of Sabrina","popularity":62.946,"origin_country":[],"vote_count":17,"first_air_date":"2018-10-26","backdrop_path":"/8AdmUPTyidDebwIuakqkSt6u1II.jpg","original_language":"en","id":79242,"vote_average":7.6,"overview":"As her 16th birthday nears, Sabrina must choose between the witch world of her family and the human world of her friends. Based on the Archie comic.","poster_path":"/yxMpoHO0CXP5o9gB7IfsciilQS4.jpg"},{"original_name":"Doctor Who","genre_ids":[18,10759,10765],"name":"Doctor Who","popularity":57.379,"origin_country":["GB"],"vote_count":1264,"first_air_date":"2005-03-26","backdrop_path":"/mQ9yeCuofNatSyErUKAPD1uOq8Q.jpg","original_language":"en","id":57243,"vote_average":7,"overview":"The Doctor is a Time Lord: a 900 year old alien with 2 hearts, part of a gifted civilization who mastered time travel. The Doctor saves planets for a living – more of a hobby actually, and the Doctor's very, very good at it.","poster_path":"/3EcYZhBMAvVw4czcDLg9Sd0FuzQ.jpg"},{"original_name":"Supernatural","genre_ids":[18,9648,10765],"name":"Supernatural","popularity":55.872,"origin_country":["US"],"vote_count":1589,"first_air_date":"2005-09-13","backdrop_path":"/koMUCyGWNtH5LXYbGqjsUwvgtsT.jpg","original_language":"en","id":1622,"vote_average":7.2,"overview":"When they were boys, Sam and Dean Winchester lost their mother to a mysterious and demonic supernatural force. Subsequently, their father raised them to be soldiers. He taught them about the paranormal evil that lives in the dark corners and on the back roads of America ... and he taught them how to kill it. Now, the Winchester brothers crisscross the country in their '67 Chevy Impala, battling every kind of supernatural threat they encounter along the way. ","poster_path":"/3iFm6Kz7iYoFaEcj4fLyZHAmTQA.jpg"},{"original_name":"Game of Thrones","genre_ids":[18,10759,10765],"name":"Game of Thrones","popularity":55.149,"origin_country":["US"],"vote_count":4955,"first_air_date":"2011-04-17","backdrop_path":"/gX8SYlnL9ZznfZwEH4KJUePBFUM.jpg","original_language":"en","id":1399,"vote_average":8.2,"overview":"Seven noble families fight for control of the mythical land of Westeros. Friction between the houses leads to full-scale war. All while a very ancient evil awakens in the farthest north. Amidst the war, a neglected military order of misfits, the Night's Watch, is all that stands between the realms of men and icy horrors beyond.","poster_path":"/gwPSoYUHAKmdyVywgLpKKA4BjRr.jpg"},{"original_name":"Law & Order: Special Victims Unit","genre_ids":[80,18],"name":"Law & Order: Special Victims Unit","popularity":52.092,"origin_country":["US"],"vote_count":539,"first_air_date":"1999-09-20","backdrop_path":"/kOvt2BOOwSAQCT8yo3pM3X2GXjh.jpg","original_language":"en","id":2734,"vote_average":6.2,"overview":"In the criminal justice system, sexually-based offenses are considered especially heinous. In New York City, the dedicated detectives who investigate these vicious felonies are members of an elite squad known as the Special Victims Unit. These are their stories.","poster_path":"/ydSvHgksuB8Ix0V05QEZBKrnIcg.jpg"},{"original_name":"DC's Legends of Tomorrow","genre_ids":[18,10759,10765],"name":"DC's Legends of Tomorrow","popularity":52.048,"origin_country":["US"],"vote_count":606,"first_air_date":"2016-01-21","backdrop_path":"/AuZYwTktioCd13hhogAU0Bup2Cz.jpg","original_language":"en","id":62643,"vote_average":6.1,"overview":"When heroes alone are not enough ... the world needs legends. Having seen the future, one he will desperately try to prevent from happening, time-traveling rogue Rip Hunter is tasked with assembling a disparate group of both heroes and villains to confront an unstoppable threat — one in which not only is the planet at stake, but all of time itself. Can this ragtag team defeat an immortal threat unlike anything they have ever known?","poster_path":"/qEobyOhOTSse59ym0gIxsQgcRGZ.jpg"},{"original_name":"American Horror Story","genre_ids":[18,9648,10765],"name":"American Horror Story","popularity":50.925,"origin_country":["US"],"vote_count":927,"first_air_date":"2011-10-05","backdrop_path":"/ilKE2RPD8tkynAOHefX9ZclG1yq.jpg","original_language":"en","id":1413,"vote_average":6.9,"overview":"An anthology horror drama series centering on different characters and locations, including a house with a murderous past, an asylum, a witch coven, a freak show, a hotel, a farmhouse in Roanoke and a cult.","poster_path":"/zheiOgPKDMvYjrCSrMLv8FSNJn4.jpg"},{"original_name":"The Haunting of Hill House","genre_ids":[18,9648],"name":"The Haunting of Hill House","popularity":50.496,"origin_country":["US"],"vote_count":63,"first_air_date":"2018-10-12","backdrop_path":"/dQF17lG4OZ3pC4QD9iNjaMS96gO.jpg","original_language":"en","id":72844,"vote_average":8.1,"overview":"The Crains, a fractured family, confront haunting memories of their old home and the terrifying events that drove them from it.","poster_path":"/38PkhBGRQtmVx2drvPik3F42qHO.jpg"},{"original_name":"Ray Donovan","genre_ids":[18],"name":"Ray Donovan","popularity":47.327,"origin_country":["US"],"vote_count":313,"first_air_date":"2013-06-30","backdrop_path":"/ijX8tWeMBMPwEPKNpSavyd9334r.jpg","original_language":"en","id":1423,"vote_average":7.5,"overview":"Set in the sprawling mecca of the rich and famous, Ray Donovan does the dirty work for LA's top power players, and makes their problems disappear. His father's unexpected release from prison sets off a chain of events that shakes the Donovan family to its core.","poster_path":"/cwJ6nLNvX62By0yoLYWFhRelPkF.jpg"},{"original_name":"Dark Shadows","genre_ids":[18,10765,10766],"name":"Dark Shadows","popularity":46.699,"origin_country":["US"],"vote_count":32,"first_air_date":"1966-06-27","backdrop_path":"/wLgrvxvrxHgWt9AFqbgQUyJYWvH.jpg","original_language":"en","id":2883,"vote_average":6.4,"overview":"Dark Shadows is an American gothic soap opera that originally aired weekdays on the ABC television network, from June 27, 1966, to April 2, 1971. The show was created by Dan Curtis. The story bible, which was written by Art Wallace, does not mention any supernatural elements. It was unprecedented in daytime television when ghosts were introduced about six months after it began.\n\nThe series became hugely popular when vampire Barnabas Collins appeared a year into its run. Dark Shadows also featured werewolves, zombies, man-made monsters, witches, warlocks, time travel, and a parallel universe. A small company of actors each played many roles; indeed, as actors came and went, some characters were played by more than one actor. Major writers besides Art Wallace included Malcolm Marmorstein, Sam Hall, Gordon Russell, and Violet Welles.\n\nDark Shadows was distinguished by its vividly melodramatic performances, atmospheric interiors, memorable storylines, numerous dramatic plot twists, unusually adventurous music score, and broad and epic cosmos of characters and heroic adventures. Now regarded as something of a classic, it continues to enjoy an intense cult following. Although the original series ran for only five years, its scheduling as a daily daytime drama allowed it to amass more single episodes during its run than most other science-fiction/fantasy genre series produced for English-language television, including Doctor Who and the entire Star Trek television franchise. Only the paranormal soap opera Passions, with a total of 2,231 episodes, has more.","poster_path":"/y2t6w8il225T2IRsvpWJ2SzTrSn.jpg"},{"original_name":"Family Guy","genre_ids":[16,35],"name":"Family Guy","popularity":42.279,"origin_country":["US"],"vote_count":1278,"first_air_date":"1999-01-31","backdrop_path":"/pH38r4TWTqq7Mcs6XAlwgzNUeJe.jpg","original_language":"en","id":1434,"vote_average":6.5,"overview":"Sick, twisted, politically incorrect and Freakin' Sweet animated series featuring the adventures of the dysfunctional Griffin family. Bumbling Peter and long-suffering Lois have three kids. Stewie (a brilliant but sadistic baby bent on killing his mother and taking over the world), Meg (the oldest, and is the most unpopular girl in town) and Chris (the middle kid, he's not very bright but has a passion for movies). The final member of the family is Brian - a talking dog and much more than a pet, he keeps Stewie in check whilst sipping Martinis and sorting through his own life issues.","poster_path":"/gBGUL1UTUNmdRQT8gA1LUV4yg39.jpg"},{"original_name":"Friends","genre_ids":[35],"name":"Friends","popularity":41.584,"origin_country":["US"],"vote_count":1328,"first_air_date":"1994-09-22","backdrop_path":"/efiX8iir6GEBWCD0uCFIi5NAyYA.jpg","original_language":"en","id":1668,"vote_average":7.9,"overview":"The misadventures of a group of friends as they navigate the pitfalls of work, life and love in Manhattan.","poster_path":"/7buCWBTpiPrCF5Lt023dSC60rgS.jpg"}]} diff --git a/seasoned_api/test/system/asAUserIWantToGetPopularMovies.js b/seasoned_api/test/system/asAUserIWantToGetPopularMovies.js index d909d73..501f97c 100644 --- a/seasoned_api/test/system/asAUserIWantToGetPopularMovies.js +++ b/seasoned_api/test/system/asAUserIWantToGetPopularMovies.js @@ -7,12 +7,12 @@ const popularMoviesSuccess = require('test/fixtures/popular-movies-success-respo describe('As a user I want to get popular movies', () => { before(() => resetDatabase()); - before(() => createCacheEntry('p:movie:1', popularMoviesSuccess)); + before(() => createCacheEntry('pm:1', popularMoviesSuccess)); it('should return 200 with the information', () => request(app) - .get('/api/v1/tmdb/list/popular') + .get('/api/v2/movie/popular') .expect(200) .then(response => assert.equal(response.body.results.length, 20)) ); -}); \ No newline at end of file +}); diff --git a/seasoned_api/test/system/asAUserIWantToGetPopularShows.js b/seasoned_api/test/system/asAUserIWantToGetPopularShows.js index 5260235..375c95a 100644 --- a/seasoned_api/test/system/asAUserIWantToGetPopularShows.js +++ b/seasoned_api/test/system/asAUserIWantToGetPopularShows.js @@ -7,12 +7,12 @@ const popularShowsSuccess = require('test/fixtures/popular-show-success-response describe('As a user I want to get popular shows', () => { before(() => resetDatabase()); - before(() => createCacheEntry('p:show:1', popularShowsSuccess)); + before(() => createCacheEntry('pt:1', popularShowsSuccess)); it('should return 200 with the information', () => request(app) - .get('/api/v1/tmdb/list/popular?type=show') + .get('/api/v2/show/popular') .expect(200) .then(response => assert.equal(response.body.results.length, 20)) ); -}); \ No newline at end of file +}); diff --git a/seasoned_api/test/system/asAnAnonymousUserIWantToSearchForAMovie.js b/seasoned_api/test/system/asAnAnonymousUserIWantToSearchForAMovie.js index 13e43ab..788e35b 100644 --- a/seasoned_api/test/system/asAnAnonymousUserIWantToSearchForAMovie.js +++ b/seasoned_api/test/system/asAnAnonymousUserIWantToSearchForAMovie.js @@ -6,7 +6,7 @@ const interstellarQuerySuccess = require('test/fixtures/interstellar-query-movie describe('As an anonymous user I want to search for a movie', () => { before(() => resetDatabase()); - before(() => createCacheEntry('mose:1:interstellar', interstellarQuerySuccess)); + before(() => createCacheEntry('mos:1:interstellar', interstellarQuerySuccess)); it('should return 200 with the search results even if user is not logged in', () => request(app) From 91d238de7c5a08934f946896943d1960d466e50a Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Fri, 9 Nov 2018 22:13:00 +0100 Subject: [PATCH 15/85] Request id is now passed as body param. Database default timestamp value changed to epoch time. --- seasoned_api/src/database/schemas/setup.sql | 2 +- seasoned_api/src/webserver/app.js | 2 +- .../controllers/request/requestTmdbId.js | 15 ++++++--------- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/seasoned_api/src/database/schemas/setup.sql b/seasoned_api/src/database/schemas/setup.sql index 88a0a8c..91bfc3e 100644 --- a/seasoned_api/src/database/schemas/setup.sql +++ b/seasoned_api/src/database/schemas/setup.sql @@ -41,7 +41,7 @@ CREATE TABLE IF NOT EXISTS request( title text not null, year int not null, type char(10) not null, - date default current_timestamp + date timestamp default (strftime('%s', 'now')) ); diff --git a/seasoned_api/src/webserver/app.js b/seasoned_api/src/webserver/app.js index 342b65a..17ea14c 100644 --- a/seasoned_api/src/webserver/app.js +++ b/seasoned_api/src/webserver/app.js @@ -101,7 +101,7 @@ router.get('/v1/plex/hook', require('./controllers/plex/hookDump.js')); * Requests */ -router.post('/v2/request/:id', require('./controllers/request/requestTmdbId.js')); +router.post('/v2/request', require('./controllers/request/requestTmdbId.js')); router.get('/v1/plex/requests/all', require('./controllers/plex/fetchRequested.js')); router.put('/v1/plex/request/:requestId', mustBeAuthenticated, require('./controllers/plex/updateRequested.js')); diff --git a/seasoned_api/src/webserver/controllers/request/requestTmdbId.js b/seasoned_api/src/webserver/controllers/request/requestTmdbId.js index 46ad956..354b8bf 100644 --- a/seasoned_api/src/webserver/controllers/request/requestTmdbId.js +++ b/seasoned_api/src/webserver/controllers/request/requestTmdbId.js @@ -6,14 +6,14 @@ const cache = new Cache(); const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); const request = new RequestRepository(); -const typeFunction = (type) => { +const requestAsTmdb = (type, id) => { if (type !== undefined) { type = type.toLowerCase(); if (type === 'movie') { - return tmdb.movieInfo; + return tmdb.movieInfo(id); } else if (type === 'show') { - return tmdb.showInfo; + return tmdb.showInfo(id); } else { throw new Error("Unprocessable Entity: Invalid type for body parameter 'type'. Allowed values: movie|show"); } @@ -28,14 +28,11 @@ const typeFunction = (type) => { * @returns {Callback} */ function requestTmdbIdController(req, res) { - const requestId = req.params.id; - const tmdbType = req.body.tmdbType; + const { id, type } = req.body; Promise.resolve() - .then(() => typeFunction(tmdbType)) - // .then(() => checkType - .then(() => tmdb.movieInfo(requestId)) - .then((movie) => request.addTmdb(movie)) + .then(() => requestAsTmdb(type, id)) + .then((requesAsTmdb) => request.addTmdb(requesAsTmdb)) .then(() => res.send({sucess: true, message: 'Request has been submitted.'})) .catch((error) => { res.status(404).send({ success: false, error: error.message }); From 840816c9301b4ecd7cd8aeb213d58f06b5ce533e Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sat, 10 Nov 2018 01:50:24 +0100 Subject: [PATCH 16/85] request returns all requested items. Optional sort, query and filter params. --- seasoned_api/src/request/request.js | 85 +++++++++++++++++++ seasoned_api/src/request/utils.js | 22 +++++ seasoned_api/src/webserver/app.js | 1 + .../controllers/request/fetchAllRequests.js | 49 +++++++++++ 4 files changed, 157 insertions(+) create mode 100644 seasoned_api/src/request/utils.js create mode 100644 seasoned_api/src/webserver/controllers/request/fetchAllRequests.js diff --git a/seasoned_api/src/request/request.js b/seasoned_api/src/request/request.js index f52dccd..a0e944f 100644 --- a/seasoned_api/src/request/request.js +++ b/seasoned_api/src/request/request.js @@ -1,15 +1,82 @@ const assert = require('assert') +const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); +const TMDB = require('src/tmdb/tmdb'); +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); const establishedDatabase = require('src/database/database'); +const utils = require('./utils'); class RequestRepository { constructor(database) { this.database = database || establishedDatabase; this.queries = { add: 'insert into request (id,title,year,type) values(?,?,?,?)', + fetchAll: 'select id, type from request', + fetchAllSort: `select id, type from request order by ? ?`, + fetchAllFilter: `select id, type from request where ? is "?"`, + fetchAllQuery: `select id, type from request where title like "%?%" or year like "%?%"`, + fetchAllFilterAndSort: `select id, type from request where ? is "?" order by ? ?`, + downloaded: '(select status from requests where id is request.id and type is request.type limit 1)', + // deluge: '(select status from deluge_torrent where id is request.id and type is request.type limit 1)', + // fetchAllFilterStatus: 'select * from request where ' read: 'select * from request where id is ? and type is ?' }; } + sortAndFilterToDbQuery(by, direction, filter, query) { + let dbQuery = undefined; + + if (query !== undefined) { + const dbParams = [query, query]; + const dbquery = this.queries.fetchAllQuery + + dbQuery = dbquery.split('').map((char) => char === '?' ? dbParams.shift() : char).join('') + } + else if (by !== undefined && filter !== undefined) { + const paramToColumnAndValue = { + movie: ['type', 'movie'], + show: ['type', 'show'] + } + const dbParams = paramToColumnAndValue[filter].concat([by, direction]); + const query = this.queries.fetchAllFilterAndSort; + + dbQuery = query.split('').map((char) => char === '?' ? dbParams.shift() : char).join('') + } + else if (by !== undefined) { + const dbParams = [by, direction]; + const query = this.queries.fetchAllSort; + + dbQuery = query.split('').map((char) => char === '?' ? dbParams.shift() : char).join('') + } + else if (filter !== undefined) { + const paramToColumnAndValue = { + movie: ['type', 'movie'], + show: ['type', 'show'], + downloaded: [this.queries.downloaded, 'downloaded'] + // downloading: [this.database.delugeStatus, 'downloading'] + } + const dbParams = paramToColumnAndValue[filter] + const query = this.queries.fetchAllFilter; + + dbQuery = query.split('').map((char) => char === '?' ? dbParams.shift() : char).join('') + } + else { + dbQuery = this.queries.fetchAll; + } + + return dbQuery + } + + mapToTmdbByType(rows) { + return rows.map((row) => { + if (row.type === 'movie') + return tmdb.movieInfo(row.id) + else if (row.type === 'show') + return tmdb.showInfo(row.id) + }) + } + /** * Add tmdb movie|show to requests * @param {tmdb} tmdb class of movie|show to add @@ -28,6 +95,24 @@ class RequestRepository { throw new Error('Could not add request'); }); } + + fetchAll(sort_by=undefined, sort_direction='asc', filter_param=undefined, query=undefined) { + if (sort_by !== undefined && ! utils.validSort(sort_by, sort_direction)) { + throw new Error('Invalid sort parameters') + } else if (filter_param !== undefined && ! utils.validFilter(filter_param)) { + throw new Error('Invalid filter parameter') + } + + return Promise.resolve() + .then(() => this.sortAndFilterToDbQuery(sort_by, sort_direction, filter_param, query)) + .then((dbQuery) => this.database.all(dbQuery)) + .then((rows) => Promise.all(this.mapToTmdbByType(rows))) + .catch((err) => { throw new Error(`err ${err}`) }) + } + + // return Promise.resolve() + // .then(() => this.database.get(this.)) + // } } module.exports = RequestRepository; diff --git a/seasoned_api/src/request/utils.js b/seasoned_api/src/request/utils.js new file mode 100644 index 0000000..5aa4003 --- /dev/null +++ b/seasoned_api/src/request/utils.js @@ -0,0 +1,22 @@ +// TODO : test title and date are valid matches to columns in the database + +const validSortParams = ['title', 'date'] +const validSortDirections = ['asc', 'desc'] +const validFilterParams = ['movie', 'show', 'seeding', 'downloading', 'paused', 'finished', 'downloaded'] + +function validSort(by, direction) { + if (! validSortParams.includes(by)) { + return false + } + else if (! validSortDirections.includes(direction)) { + return false + } + + return true +} + +function validFilter(filter_param) { + return validFilterParams.includes(filter_param) +} + +module.exports = { validSort, validFilter } \ No newline at end of file diff --git a/seasoned_api/src/webserver/app.js b/seasoned_api/src/webserver/app.js index 17ea14c..1761c59 100644 --- a/seasoned_api/src/webserver/app.js +++ b/seasoned_api/src/webserver/app.js @@ -101,6 +101,7 @@ router.get('/v1/plex/hook', require('./controllers/plex/hookDump.js')); * Requests */ +router.get('/v2/request', require('./controllers/request/fetchAllRequests.js')); router.post('/v2/request', require('./controllers/request/requestTmdbId.js')); router.get('/v1/plex/requests/all', require('./controllers/plex/fetchRequested.js')); router.put('/v1/plex/request/:requestId', mustBeAuthenticated, require('./controllers/plex/updateRequested.js')); diff --git a/seasoned_api/src/webserver/controllers/request/fetchAllRequests.js b/seasoned_api/src/webserver/controllers/request/fetchAllRequests.js new file mode 100644 index 0000000..2d98339 --- /dev/null +++ b/seasoned_api/src/webserver/controllers/request/fetchAllRequests.js @@ -0,0 +1,49 @@ +const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); +const TMDB = require('src/tmdb/tmdb'); +const RequestRepository = require('src/request/request'); +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); +const request = new RequestRepository(); + +const requestAsTmdb = (type, id) => { + if (type !== undefined) { + type = type.toLowerCase(); + + if (type === 'movie') { + return tmdb.movieInfo(id); + } else if (type === 'show') { + return tmdb.showInfo(id); + } else { + throw new Error("Unprocessable Entity: Invalid type for body parameter 'type'. Allowed values: movie|show"); + } + } + throw new Error("tmdbType body parameter not defined. Allowed values: movie|show") + +} +/** + * Controller: Request by id with type param + * @param {Request} req http request variable + * @param {Response} res + * @returns {Callback} + */ +function requestTmdbIdController(req, res) { + const { filter, sort, query } = req.query; + let sort_by = sort_direction = undefined; + + if (sort !== undefined && sort.includes(':')) { + [sort_by, sort_direction] = sort.split(':') + } + // log, but disregard erroros sort param + // non valid sort type, throw from request.fetchAll(sort, filter) + + Promise.resolve() + // .then(() => requestAsTmdb(type, id)) + .then(() => request.fetchAll(sort_by, sort_direction, filter, query)) + .then((result) => res.send(result)) + .catch((error) => { + res.status(404).send({ success: false, error: error.message }); + }); +} + +module.exports = requestTmdbIdController; From 87eb6de802ccbadd0fc3b706c432404b385e97a6 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sat, 10 Nov 2018 01:57:19 +0100 Subject: [PATCH 17/85] =?UTF-8?q?=F0=9F=94=A8=20test=20now=20requests=20wi?= =?UTF-8?q?th=20id=20in=20body=20not=20in=20query=20params.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seasoned_api/test/system/asAUserIWantToRequestAMovie.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/seasoned_api/test/system/asAUserIWantToRequestAMovie.js b/seasoned_api/test/system/asAUserIWantToRequestAMovie.js index 218a0fa..2c5c56d 100644 --- a/seasoned_api/test/system/asAUserIWantToRequestAMovie.js +++ b/seasoned_api/test/system/asAUserIWantToRequestAMovie.js @@ -15,8 +15,8 @@ describe('As a user I want to request a movie', () => { it('should return 200 when item is requested', () => request(app) - .post('/api/v2/request/335984', {tmdbType: 'movie'}) - .send({ tmdbType: 'movie' }) + .post('/api/v2/request') + .send({ id: 335984, type: 'movie' }) .set('Authorization', createToken('test_user', 'secret')) .expect(200) ); From 7cb55ce054b03c933fc852fa7833fc2c4c1b2cb1 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sat, 10 Nov 2018 20:26:28 +0100 Subject: [PATCH 18/85] Fetchall uses promises smarter. Now the utils functions also return promises to be able to nicely chain the steps a request needs to go through. Promise all lets us wait for all items return in the map function. Without the map function would return immidiately and resolve before the map operation completed. --- seasoned_api/src/request/request.js | 13 ++----- seasoned_api/src/request/utils.js | 34 +++++++++++++------ seasoned_api/src/tmdb/tmdb.js | 1 - .../controllers/request/fetchAllRequests.js | 28 ++------------- 4 files changed, 28 insertions(+), 48 deletions(-) diff --git a/seasoned_api/src/request/request.js b/seasoned_api/src/request/request.js index a0e944f..abeb9ff 100644 --- a/seasoned_api/src/request/request.js +++ b/seasoned_api/src/request/request.js @@ -97,22 +97,13 @@ class RequestRepository { } fetchAll(sort_by=undefined, sort_direction='asc', filter_param=undefined, query=undefined) { - if (sort_by !== undefined && ! utils.validSort(sort_by, sort_direction)) { - throw new Error('Invalid sort parameters') - } else if (filter_param !== undefined && ! utils.validFilter(filter_param)) { - throw new Error('Invalid filter parameter') - } - return Promise.resolve() + .then(() => utils.validSort(sort_by, sort_direction)) + .then(() => utils.validFilter(filter_param)) .then(() => this.sortAndFilterToDbQuery(sort_by, sort_direction, filter_param, query)) .then((dbQuery) => this.database.all(dbQuery)) .then((rows) => Promise.all(this.mapToTmdbByType(rows))) - .catch((err) => { throw new Error(`err ${err}`) }) } - - // return Promise.resolve() - // .then(() => this.database.get(this.)) - // } } module.exports = RequestRepository; diff --git a/seasoned_api/src/request/utils.js b/seasoned_api/src/request/utils.js index 5aa4003..0f92156 100644 --- a/seasoned_api/src/request/utils.js +++ b/seasoned_api/src/request/utils.js @@ -1,22 +1,34 @@ // TODO : test title and date are valid matches to columns in the database - const validSortParams = ['title', 'date'] -const validSortDirections = ['asc', 'desc'] +const validSortDirs = ['asc', 'desc'] const validFilterParams = ['movie', 'show', 'seeding', 'downloading', 'paused', 'finished', 'downloaded'] function validSort(by, direction) { - if (! validSortParams.includes(by)) { - return false - } - else if (! validSortDirections.includes(direction)) { - return false - } - - return true + return new Promise((resolve, reject) => { + if (by === undefined) { + resolve() + } + + if (validSortParams.includes(by) && validSortDirs.includes(direction)) { + resolve() + } else { + reject(new Error(`invalid sort parameter, must be of: ${validSortParams} with optional sort directions: ${validSortDirs} appended with ':'`)) + } + }); } function validFilter(filter_param) { - return validFilterParams.includes(filter_param) + return new Promise((resolve, reject) => { + if (filter_param === undefined) { + resolve() + } + + if (filter_param && validFilterParams.includes(filter_param)) { + resolve() + } else { + reject(new Error(`filter parameteres must be of type: ${validFilterParams}`)) + } + }); } module.exports = { validSort, validFilter } \ No newline at end of file diff --git a/seasoned_api/src/tmdb/tmdb.js b/seasoned_api/src/tmdb/tmdb.js index 7f1a6f7..e1016f8 100644 --- a/seasoned_api/src/tmdb/tmdb.js +++ b/seasoned_api/src/tmdb/tmdb.js @@ -141,7 +141,6 @@ class TMDB { - multiSearch(search_query, page=1) { const query = { query: search_query, page: page }; const cacheKey = `${this.cacheTags.multiSearch}:${page}:${search_query}`; diff --git a/seasoned_api/src/webserver/controllers/request/fetchAllRequests.js b/seasoned_api/src/webserver/controllers/request/fetchAllRequests.js index 2d98339..b256344 100644 --- a/seasoned_api/src/webserver/controllers/request/fetchAllRequests.js +++ b/seasoned_api/src/webserver/controllers/request/fetchAllRequests.js @@ -1,26 +1,6 @@ -const configuration = require('src/config/configuration').getInstance(); -const Cache = require('src/tmdb/cache'); -const TMDB = require('src/tmdb/tmdb'); const RequestRepository = require('src/request/request'); -const cache = new Cache(); -const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); const request = new RequestRepository(); -const requestAsTmdb = (type, id) => { - if (type !== undefined) { - type = type.toLowerCase(); - - if (type === 'movie') { - return tmdb.movieInfo(id); - } else if (type === 'show') { - return tmdb.showInfo(id); - } else { - throw new Error("Unprocessable Entity: Invalid type for body parameter 'type'. Allowed values: movie|show"); - } - } - throw new Error("tmdbType body parameter not defined. Allowed values: movie|show") - -} /** * Controller: Request by id with type param * @param {Request} req http request variable @@ -28,17 +8,15 @@ const requestAsTmdb = (type, id) => { * @returns {Callback} */ function requestTmdbIdController(req, res) { - const { filter, sort, query } = req.query; - let sort_by = sort_direction = undefined; + let { filter, sort, query } = req.query; + let sort_by = sort; + let sort_direction = undefined; if (sort !== undefined && sort.includes(':')) { [sort_by, sort_direction] = sort.split(':') } - // log, but disregard erroros sort param - // non valid sort type, throw from request.fetchAll(sort, filter) Promise.resolve() - // .then(() => requestAsTmdb(type, id)) .then(() => request.fetchAll(sort_by, sort_direction, filter, query)) .then((result) => res.send(result)) .catch((error) => { From 784aa2616acdaa4effda8323a6ed37bdd0115932 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Mon, 12 Nov 2018 01:20:18 +0100 Subject: [PATCH 19/85] Fetchall gets docstring --- seasoned_api/src/request/request.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/seasoned_api/src/request/request.js b/seasoned_api/src/request/request.js index abeb9ff..376087a 100644 --- a/seasoned_api/src/request/request.js +++ b/seasoned_api/src/request/request.js @@ -96,6 +96,14 @@ class RequestRepository { }); } + /** + * Fetch all requests with optional sort and filter params + * @param {String} what we are sorting by + * @param {String} direction that can be either 'asc' or 'desc', default 'asc'. + * @param {String} params to filter by + * @param {String} query param to filter result on. Filters on title and year + * @returns {Promise} + */ fetchAll(sort_by=undefined, sort_direction='asc', filter_param=undefined, query=undefined) { return Promise.resolve() .then(() => utils.validSort(sort_by, sort_direction)) From 7db8f752c59e89ddd67ecb3f938d591dede2c7c1 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 8 Dec 2018 03:59:04 +0000 Subject: [PATCH 20/85] fix: seasoned_api/package.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/npm:base64url:20180511 - https://snyk.io/vuln/npm:cryptiles:20180710 - https://snyk.io/vuln/npm:extend:20180424 - https://snyk.io/vuln/npm:stringstream:20180511 --- seasoned_api/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/seasoned_api/package.json b/seasoned_api/package.json index 2001433..fd1f102 100644 --- a/seasoned_api/package.json +++ b/seasoned_api/package.json @@ -18,12 +18,12 @@ "body-parser": "~1.18.2", "cross-env": "~5.1.4", "express": "~4.16.0", - "jsonwebtoken": "^8.0.1", + "jsonwebtoken": "^8.2.0", "mongoose": "~5.0.11", "km-moviedb": "^0.2.12", "node-cache": "^4.1.1", "python-shell": "^0.5.0", - "request": "^2.85.0", + "request": "^2.87.0", "request-promise": "^4.2", "sqlite3": "^4.0.0" }, From 4eaa60b0445d22e977cafeab12b6e7d95c0294f7 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 13 Dec 2018 03:19:03 +0000 Subject: [PATCH 21/85] fix: seasoned_api/package.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-MPATH-72672 --- seasoned_api/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seasoned_api/package.json b/seasoned_api/package.json index 2001433..a1e7f03 100644 --- a/seasoned_api/package.json +++ b/seasoned_api/package.json @@ -19,7 +19,7 @@ "cross-env": "~5.1.4", "express": "~4.16.0", "jsonwebtoken": "^8.0.1", - "mongoose": "~5.0.11", + "mongoose": "~5.2.12", "km-moviedb": "^0.2.12", "node-cache": "^4.1.1", "python-shell": "^0.5.0", From e6796aff8b31abf13ad854dce63b09b263326fef Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Tue, 4 Jun 2019 21:41:10 +0200 Subject: [PATCH 22/85] =?UTF-8?q?Hotfix=20=F0=9F=A7=AF=20for=20returning?= =?UTF-8?q?=20new=20poster=20object=20variable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seasoned_api/src/plex/requestRepository.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/seasoned_api/src/plex/requestRepository.js b/seasoned_api/src/plex/requestRepository.js index 447384e..7006758 100644 --- a/seasoned_api/src/plex/requestRepository.js +++ b/seasoned_api/src/plex/requestRepository.js @@ -86,7 +86,11 @@ class RequestRepository { } throw new Error('Unable to fetch your requests'); }) - .then((result) => { return result; }); + .then((result) => { + // TODO do a correct mapping before sending, not just a dump of the database + result.map(item => item.poster = item.poster_path) + return result + }); } updateRequestedById(id, type, status) { From 99bab3fb73b2938b378fa61cdc6dfda77ec7c86a Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Tue, 4 Jun 2019 23:32:38 +0200 Subject: [PATCH 23/85] Movie and show can also return credits for a item. Enabled by query parameter credits=true --- seasoned_api/src/tmdb/tmdb.js | 74 +++++++++---------- .../webserver/controllers/info/showInfo.js | 12 ++- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/seasoned_api/src/tmdb/tmdb.js b/seasoned_api/src/tmdb/tmdb.js index e1016f8..37011a8 100644 --- a/seasoned_api/src/tmdb/tmdb.js +++ b/seasoned_api/src/tmdb/tmdb.js @@ -39,7 +39,7 @@ class TMDB { .catch(() => this.tmdb(TMDB_METHODS['info'][type], query)) .catch(() => { throw new Error('Could not find a movie with that id.'); }) .then(response => this.cache.set(cacheKey, response)) - .then((response) => { + .then(response => { try { return convertTmdbToSeasoned(response, type); } catch (parseError) { @@ -73,22 +73,22 @@ class TMDB { * @param {String} type filter results by type (default movie). * @returns {Promise} succeeds if movie was found */ - movieInfo(identifier) { + movieInfo(identifier, credits=false) { const query = { id: identifier }; - const cacheKey = `${this.cacheTags.movieInfo}:${identifier}`; + const cacheKey = `${this.cacheTags.movieInfo}:${identifier}:${credits}`; + + const requests = [this.tmdb('movieInfo', query)] + + if (credits) { + requests.push(this.tmdb('movieCredits', query)) + } + return Promise.resolve() - .then(() => this.cache.get(cacheKey)) - .catch(() => this.tmdb('movieInfo', query)) - .catch((error) => { console.log(error); throw new Error('Could not find a movie with that id.'); }) - .then(response => this.cache.set(cacheKey, response)) - .then((response) => { - try { - return convertTmdbToMovie(response); - } catch (parseError) { - console.error(parseError); - throw new Error('Could not parse movie.'); - } - }); + .then(() => this.cache.get(cacheKey)) + .catch(() => Promise.all(requests)) + .catch((error) => { console.log(error); throw new Error('Could not find a movie with that id.'); }) + .then(([movies, credits]) => this.cache.set(cacheKey, [movies, credits])) + .then(([movies, credits]) => convertTmdbToMovie(movies, credits)) } /** @@ -97,22 +97,22 @@ class TMDB { * @param {String} type filter results by type (default show). * @returns {Promise} succeeds if show was found */ - showInfo(identifier) { + showInfo(identifier, credits=false) { const query = { id: identifier }; - const cacheKey = `${this.cacheTags.showInfo}:${identifier}`; + const cacheKey = `${this.cacheTags.showInfo}:${identifier}:${credits}`; + + const requests = [this.tmdb('tvInfo', query)] + + if (credits) { + requests.push(this.tmdb('tvCredits', query)) + } + return Promise.resolve() .then(() => this.cache.get(cacheKey)) - .catch(() => this.tmdb('tvInfo', query)) + .catch(() => Promise.all(requests)) .catch(() => { throw new Error('Could not find a show with that id.'); }) - .then(response => this.cache.set(cacheKey, response)) - .then((response) => { - try { - return convertTmdbToShow(response); - } catch (parseError) { - console.error(parseError); - throw new Error('Could not parse show.'); - } - }); + .then(([shows, credits]) => this.cache.set(cacheKey, [shows, credits])) + .then(([shows, credits]) => convertTmdbToShow(shows, credits)) } /** @@ -124,19 +124,14 @@ class TMDB { personInfo(identifier) { const query = { id: identifier }; const cacheKey = `${this.cacheTags.personInfo}:${identifier}`; + return Promise.resolve() - .then(() => this.cache.get(cacheKey)) - .catch(() => this.tmdb('personInfo', query)) - .catch(() => { throw new Error('Could not find a person with that id.'); }) - .then(response => this.cache.set(cacheKey, response)) - .then((response) => { - try { - return convertTmdbToPerson(response); - } catch (parseError) { - console.error(parseError); - throw new Error('Could not parse person.'); - } - }); + .then(() => this.cache.get(cacheKey)) + .catch(() => Promise.all([this.tmdb('personInfo', query), this.tmdb('personCombinedCredits', query)])) + .catch(() => { throw new Error('Could not find a person with that id.'); }) + .then(([person, cast]) => this.cache.set(cacheKey, [person, cast])) + .then(([person, cast]) => convertTmdbToPerson(person, cast)) + .catch(err => new Error('Unable to convert result to person', err)) } @@ -161,6 +156,7 @@ class TMDB { movieSearch(query, page=1) { const tmdbquery = { query: query, page: page }; const cacheKey = `${this.cacheTags.movieSearch}:${page}:${query}`; + return Promise.resolve() .then(() => this.cache.get(cacheKey)) .catch(() => this.tmdb('searchMovie', tmdbquery)) diff --git a/seasoned_api/src/webserver/controllers/info/showInfo.js b/seasoned_api/src/webserver/controllers/info/showInfo.js index f345855..4cbc5a9 100644 --- a/seasoned_api/src/webserver/controllers/info/showInfo.js +++ b/seasoned_api/src/webserver/controllers/info/showInfo.js @@ -13,11 +13,15 @@ const plex = new Plex(configuration.get('plex', 'ip')); * @returns {Callback} */ -function showInfoController(req, res) { +async function showInfoController(req, res) { const showId = req.params.id; - tmdb.showInfo(showId) - .then((show) => plex.existsInPlex(show)) - .then((show) => { + const { credits } = req.query; + const show = await tmdb.showInfo(showId, credits); + + plex.existsInPlex(show) + .catch((error) => { console.log('Error when searching plex'); }) + .then(() => { + console.log('show', show) res.send(show); }).catch((error) => { res.status(404).send({ success: false, error: error.message }); From 70f6497404e31bfeeac0ce8de317ae825583b865 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Tue, 4 Jun 2019 23:35:21 +0200 Subject: [PATCH 24/85] All converter function from tmdb to movie, show and person takes optional cast object and maps to response --- seasoned_api/src/tmdb/convertTmdbToMovie.js | 6 +++++- seasoned_api/src/tmdb/convertTmdbToPerson.js | 6 +++++- seasoned_api/src/tmdb/convertTmdbToShow.js | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/seasoned_api/src/tmdb/convertTmdbToMovie.js b/seasoned_api/src/tmdb/convertTmdbToMovie.js index 3e702a0..d9e4d5e 100644 --- a/seasoned_api/src/tmdb/convertTmdbToMovie.js +++ b/seasoned_api/src/tmdb/convertTmdbToMovie.js @@ -2,11 +2,15 @@ const Movie = require('src/tmdb/types/movie'); const tmdbSwitcher = (tmdbMovie, property) => tmdbMovie[property] -function convertTmdbToMovie(tmdbMovie) { +function convertTmdbToMovie(tmdbMovie, credits=undefined) { const movie = new Movie(tmdbMovie.id, tmdbMovie.title) movie.overview = tmdbMovie.overview; movie.rank = tmdbMovie.vote_average; + if (credits) { + movie.credits = credits; + } + if (tmdbMovie.release_date !== undefined) { movie.release_date = new Date(tmdbMovie.release_date); movie.year = movie.release_date.getFullYear(); diff --git a/seasoned_api/src/tmdb/convertTmdbToPerson.js b/seasoned_api/src/tmdb/convertTmdbToPerson.js index 5821c84..32e6911 100644 --- a/seasoned_api/src/tmdb/convertTmdbToPerson.js +++ b/seasoned_api/src/tmdb/convertTmdbToPerson.js @@ -1,7 +1,7 @@ const Person = require('src/tmdb/types/person'); const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); -function convertTmdbToPerson(tmdbPerson) { +function convertTmdbToPerson(tmdbPerson, cast=undefined) { const person = new Person(tmdbPerson.id, tmdbPerson.name); if (tmdbPerson.profile_path !== undefined) { @@ -20,6 +20,10 @@ function convertTmdbToPerson(tmdbPerson) { person.known_for = tmdbPerson.known_for.map(convertTmdbToMovie); } + if (cast) { + person.cast = cast.cast; + } + return person; } diff --git a/seasoned_api/src/tmdb/convertTmdbToShow.js b/seasoned_api/src/tmdb/convertTmdbToShow.js index 594f160..0bb0481 100644 --- a/seasoned_api/src/tmdb/convertTmdbToShow.js +++ b/seasoned_api/src/tmdb/convertTmdbToShow.js @@ -1,12 +1,16 @@ const Show = require('src/tmdb/types/show'); -function convertTmdbToShow(tmdbShow) { +function convertTmdbToShow(tmdbShow, credits=undefined) { const show = new Show(tmdbShow.id, tmdbShow.name) show.seasons = tmdbShow.number_of_seasons; show.episodes = tmdbShow.number_of_episodes; show.overview = tmdbShow.overview; show.rank = tmdbShow.vote_average; + if (credits) { + show.credits = credits + } + if (tmdbShow.genres !== undefined) { show.genres = tmdbShow.genres.map(genre => genre.name); } From e3ed08e8dd36afec0481a06060526dd5e04025a1 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Tue, 4 Jun 2019 23:45:22 +0200 Subject: [PATCH 25/85] Now a plex ip address is dynamically passed into the plexrepository, fetched from the config --- seasoned_api/src/plex/plexRepository.js | 8 ++++++-- seasoned_api/src/plex/requestRepository.js | 2 +- .../src/webserver/controllers/plex/plexPlaying.js | 3 ++- .../src/webserver/controllers/plex/searchMedia.js | 3 ++- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/seasoned_api/src/plex/plexRepository.js b/seasoned_api/src/plex/plexRepository.js index 395cf0b..88f26fb 100644 --- a/seasoned_api/src/plex/plexRepository.js +++ b/seasoned_api/src/plex/plexRepository.js @@ -3,6 +3,10 @@ const convertPlexToStream = require('src/plex/convertPlexToStream'); const rp = require('request-promise'); class PlexRepository { + constructor(plexIP) { + this.plexIP = plexIP; + } + inPlex(tmdbResult) { return Promise.resolve() .then(() => this.search(tmdbResult.title)) @@ -17,7 +21,7 @@ class PlexRepository { search(query) { console.log('searching:', query) const options = { - uri: `http://10.0.0.44:32400/search?query=${query}`, + uri: `http://${plexIP}:32400/search?query=${query}`, headers: { Accept: 'application/json', }, @@ -65,7 +69,7 @@ class PlexRepository { nowPlaying() { const options = { - uri: 'http://10.0.0.44:32400/status/sessions', + uri: `http://${plexIP}:32400/status/sessions`, headers: { Accept: 'application/json', }, diff --git a/seasoned_api/src/plex/requestRepository.js b/seasoned_api/src/plex/requestRepository.js index 7006758..28e4d9a 100644 --- a/seasoned_api/src/plex/requestRepository.js +++ b/seasoned_api/src/plex/requestRepository.js @@ -4,7 +4,7 @@ const configuration = require('src/config/configuration').getInstance(); const TMDB = require('src/tmdb/tmdb'); const establishedDatabase = require('src/database/database'); -const plexRepository = new PlexRepository(); +const plexRepository = new PlexRepository(configuration.get('plex', 'ip')); const cache = new Cache(); const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); diff --git a/seasoned_api/src/webserver/controllers/plex/plexPlaying.js b/seasoned_api/src/webserver/controllers/plex/plexPlaying.js index a14ec6a..5bc2d59 100644 --- a/seasoned_api/src/webserver/controllers/plex/plexPlaying.js +++ b/seasoned_api/src/webserver/controllers/plex/plexPlaying.js @@ -1,6 +1,7 @@ const PlexRepository = require('src/plex/plexRepository'); +const configuration = require('src/config/configuration').getInstance(); -const plexRepository = new PlexRepository(); +const plexRepository = new PlexRepository(onfiguration.get('plex', 'ip')); function playingController(req, res) { plexRepository.nowPlaying() diff --git a/seasoned_api/src/webserver/controllers/plex/searchMedia.js b/seasoned_api/src/webserver/controllers/plex/searchMedia.js index 3351f6c..e70311a 100644 --- a/seasoned_api/src/webserver/controllers/plex/searchMedia.js +++ b/seasoned_api/src/webserver/controllers/plex/searchMedia.js @@ -1,6 +1,7 @@ const PlexRepository = require('src/plex/plexRepository'); +const configuration = require('src/config/configuration').getInstance(); -const plexRepository = new PlexRepository(); +const plexRepository = new PlexRepository(onfiguration.get('plex', 'ip')); /** * Controller: Search for media and check existence From 476a34fb695029a4adff526c8aecb311c8b21543 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Tue, 4 Jun 2019 23:47:10 +0200 Subject: [PATCH 26/85] Changed the order of execution between getting tmdb movie and searching plex for it. Now we await tmdb movie and then check if exists in plex. This is better when we miss plex request --- .../src/webserver/controllers/info/movieInfo.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/seasoned_api/src/webserver/controllers/info/movieInfo.js b/seasoned_api/src/webserver/controllers/info/movieInfo.js index 3607285..896f656 100644 --- a/seasoned_api/src/webserver/controllers/info/movieInfo.js +++ b/seasoned_api/src/webserver/controllers/info/movieInfo.js @@ -12,11 +12,15 @@ const plex = new Plex(configuration.get('plex', 'ip')); * @param {Response} res * @returns {Callback} */ -function movieInfoController(req, res) { +async function movieInfoController(req, res) { const movieId = req.params.id; - tmdb.movieInfo(movieId) - .then((movie) => plex.existsInPlex(movie)) - .then((movie) => { + const { credits } = req.query; + const movie = await tmdb.movieInfo(movieId, credits); + + plex.existsInPlex(movie) + .catch((error) => { console.log('Error when searching plex'); }) + .then(() => { + console.log('movie', movie) res.send(movie); }).catch((error) => { res.status(404).send({ success: false, error: error.message }); From b9dec2344ee6faf120acd6324736e6d5e1946070 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Tue, 4 Jun 2019 23:53:54 +0200 Subject: [PATCH 27/85] Added timeout to plex requests and include error in error message when unable to search --- seasoned_api/src/plex/plex.js | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/seasoned_api/src/plex/plex.js b/seasoned_api/src/plex/plex.js index 0df1b20..19fa502 100644 --- a/seasoned_api/src/plex/plex.js +++ b/seasoned_api/src/plex/plex.js @@ -1,24 +1,26 @@ -const axios = require('axios'); -const convertPlexToMovie = require('src/plex/convertPlexToMovie'); -const convertPlexToShow = require('src/plex/convertPlexToShow'); -const convertPlexToEpisode = require('src/plex/convertPlexToEpisode'); +const axios = require('axios') +const convertPlexToMovie = require('src/plex/convertPlexToMovie') +const convertPlexToShow = require('src/plex/convertPlexToShow') +const convertPlexToEpisode = require('src/plex/convertPlexToEpisode') class Plex { constructor(ip) { - this.plexIP = ip; - this.plexPort = 32400; + this.plexIP = ip + this.plexPort = 32400 } existsInPlex(tmdbMovie) { return Promise.resolve() .then(() => this.search(tmdbMovie.title)) + // TODO handle this when whitelist of local ip is not set in plex + .catch((error) => { console.error('Unable to search plex')}) .then((plexMovies) => { const matches = plexMovies.some((plexMovie) => { - return tmdbMovie.title === plexMovie.title && tmdbMovie.type === plexMovie.type; + return tmdbMovie.title === plexMovie.title && tmdbMovie.type === plexMovie.type }) - tmdbMovie.existsInPlex = matches; - return tmdbMovie; + tmdbMovie.existsInPlex = matches + return tmdbMovie }) } @@ -27,26 +29,27 @@ class Plex { baseURL: `http://${this.plexIP}:${this.plexPort}`, url: '/hubs/search', params: { query: query }, - responseType: 'json' + responseType: 'json', + timeout: 3000 } return Promise.resolve() .then(() => axios.request(options)) - .catch((error) => { throw new Error(`Unable to search plex library`); }) - .then(response => this.mapResults(response)); + .catch((error) => { throw new Error(`Unable to search plex library`, error) }) + .then(response => this.mapResults(response)) } mapResults(response) { return response.data.MediaContainer.Hub.reduce((result, hub) => { if (hub.type === 'movie' && hub.Metadata !== undefined) { - return [...result, ...hub.Metadata.map(convertPlexToMovie)]; + return [...result, ...hub.Metadata.map(convertPlexToMovie)] } else if (hub.type === 'show' && hub.Metadata !== undefined) { - return [...result, ...hub.Metadata.map(convertPlexToShow)]; + return [...result, ...hub.Metadata.map(convertPlexToShow)] } else if (hub.type === 'episode' && hub.Metadata !== undefined) { - return [...result, ...hub.Metadata.map(convertPlexToEpisode)]; + return [...result, ...hub.Metadata.map(convertPlexToEpisode)] } return result From 1a1a7328a3a759b32b11b8fafc806956f1260dab Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Tue, 4 Jun 2019 23:54:39 +0200 Subject: [PATCH 28/85] Map results with total_results before returing. TODO this should be mapped with all wanted list return vars --- seasoned_api/src/request/request.js | 1 + 1 file changed, 1 insertion(+) diff --git a/seasoned_api/src/request/request.js b/seasoned_api/src/request/request.js index 376087a..64d4205 100644 --- a/seasoned_api/src/request/request.js +++ b/seasoned_api/src/request/request.js @@ -111,6 +111,7 @@ class RequestRepository { .then(() => this.sortAndFilterToDbQuery(sort_by, sort_direction, filter_param, query)) .then((dbQuery) => this.database.all(dbQuery)) .then((rows) => Promise.all(this.mapToTmdbByType(rows))) + .then(result => Promise.resolve({results: result, total_results: result.length})) } } From 5d6f2baa34f79136bc7a841e1f4b688859613b47 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Wed, 5 Jun 2019 00:00:31 +0200 Subject: [PATCH 29/85] plex hook should have post not get --- seasoned_api/src/webserver/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seasoned_api/src/webserver/app.js b/seasoned_api/src/webserver/app.js index 1761c59..61aa040 100644 --- a/seasoned_api/src/webserver/app.js +++ b/seasoned_api/src/webserver/app.js @@ -95,7 +95,7 @@ router.get('/v1/plex/playing', require('./controllers/plex/plexPlaying.js')); router.get('/v1/plex/request', require('./controllers/plex/searchRequest.js')); router.get('/v1/plex/request/:mediaId', require('./controllers/plex/readRequest.js')); router.post('/v1/plex/request/:mediaId', require('./controllers/plex/submitRequest.js')); -router.get('/v1/plex/hook', require('./controllers/plex/hookDump.js')); +router.post('/v1/plex/hook', require('./controllers/plex/hookDump.js')); /** * Requests From 4b074346152a3b31a3f7f57b10084a07efd02805 Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Wed, 5 Jun 2019 00:05:54 +0200 Subject: [PATCH 30/85] Imported configuration with incorrect name --- seasoned_api/src/webserver/controllers/plex/plexPlaying.js | 2 +- seasoned_api/src/webserver/controllers/plex/searchMedia.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/seasoned_api/src/webserver/controllers/plex/plexPlaying.js b/seasoned_api/src/webserver/controllers/plex/plexPlaying.js index 5bc2d59..30b05e2 100644 --- a/seasoned_api/src/webserver/controllers/plex/plexPlaying.js +++ b/seasoned_api/src/webserver/controllers/plex/plexPlaying.js @@ -1,7 +1,7 @@ const PlexRepository = require('src/plex/plexRepository'); const configuration = require('src/config/configuration').getInstance(); -const plexRepository = new PlexRepository(onfiguration.get('plex', 'ip')); +const plexRepository = new PlexRepository(configuration.get('plex', 'ip')); function playingController(req, res) { plexRepository.nowPlaying() diff --git a/seasoned_api/src/webserver/controllers/plex/searchMedia.js b/seasoned_api/src/webserver/controllers/plex/searchMedia.js index e70311a..4eee722 100644 --- a/seasoned_api/src/webserver/controllers/plex/searchMedia.js +++ b/seasoned_api/src/webserver/controllers/plex/searchMedia.js @@ -1,7 +1,7 @@ const PlexRepository = require('src/plex/plexRepository'); const configuration = require('src/config/configuration').getInstance(); -const plexRepository = new PlexRepository(onfiguration.get('plex', 'ip')); +const plexRepository = new PlexRepository(configuration.get('plex', 'ip')); /** * Controller: Search for media and check existence From 127db88ded0d42e7bbf4c87074cce7b2b40c756f Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Fri, 28 Jun 2019 18:45:53 +0200 Subject: [PATCH 31/85] Renamed function name and comment to make for sense. Also deconstruct page from query --- .../webserver/controllers/request/fetchAllRequests.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/seasoned_api/src/webserver/controllers/request/fetchAllRequests.js b/seasoned_api/src/webserver/controllers/request/fetchAllRequests.js index b256344..fb16b41 100644 --- a/seasoned_api/src/webserver/controllers/request/fetchAllRequests.js +++ b/seasoned_api/src/webserver/controllers/request/fetchAllRequests.js @@ -2,13 +2,13 @@ const RequestRepository = require('src/request/request'); const request = new RequestRepository(); /** - * Controller: Request by id with type param + * Controller: Fetch all requested items * @param {Request} req http request variable * @param {Response} res * @returns {Callback} */ -function requestTmdbIdController(req, res) { - let { filter, sort, query } = req.query; +function fetchAllRequests(req, res) { + let { page, filter, sort, query } = req.query; let sort_by = sort; let sort_direction = undefined; @@ -17,11 +17,11 @@ function requestTmdbIdController(req, res) { } Promise.resolve() - .then(() => request.fetchAll(sort_by, sort_direction, filter, query)) + .then(() => request.fetchAll(page, sort_by, sort_direction, filter, query)) .then((result) => res.send(result)) .catch((error) => { res.status(404).send({ success: false, error: error.message }); }); } -module.exports = requestTmdbIdController; +module.exports = fetchAllRequests; From ac027a97d6ed8d0dd092718d1e8583929cde1d5e Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Fri, 28 Jun 2019 18:48:58 +0200 Subject: [PATCH 32/85] Added pagination and removed sort & filtering for requested items --- seasoned_api/src/request/request.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/seasoned_api/src/request/request.js b/seasoned_api/src/request/request.js index 64d4205..f4ce7d7 100644 --- a/seasoned_api/src/request/request.js +++ b/seasoned_api/src/request/request.js @@ -12,7 +12,7 @@ class RequestRepository { this.database = database || establishedDatabase; this.queries = { add: 'insert into request (id,title,year,type) values(?,?,?,?)', - fetchAll: 'select id, type from request', + fetchAll: 'select * from requests where status != "downloaded" order by date desc LIMIT 25 OFFSET ?*25-25', fetchAllSort: `select id, type from request order by ? ?`, fetchAllFilter: `select id, type from request where ? is "?"`, fetchAllQuery: `select id, type from request where title like "%?%" or year like "%?%"`, @@ -104,14 +104,17 @@ class RequestRepository { * @param {String} query param to filter result on. Filters on title and year * @returns {Promise} */ - fetchAll(sort_by=undefined, sort_direction='asc', filter_param=undefined, query=undefined) { + fetchAll(page, sort_by=undefined, sort_direction='asc', filter_param=undefined, query=undefined) { + // TODO implemented sort and filter + // console.log('hit', sort_by, sort_direction, filter_param, query) return Promise.resolve() - .then(() => utils.validSort(sort_by, sort_direction)) - .then(() => utils.validFilter(filter_param)) - .then(() => this.sortAndFilterToDbQuery(sort_by, sort_direction, filter_param, query)) - .then((dbQuery) => this.database.all(dbQuery)) - .then((rows) => Promise.all(this.mapToTmdbByType(rows))) + .then((dbQuery) => this.database.all(this.queries.fetchAll, page)) + .then((rows) => { + return rows.map(item => { item.poster = item.poster_path; return item }) + return Promise.all(this.mapToTmdbByType(rows)) +}) .then(result => Promise.resolve({results: result, total_results: result.length})) + .catch(error => { console.log(error);throw error }) } } From 9f1badc1b1740406f8546f7708dea3e65791f236 Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Fri, 28 Jun 2019 19:21:54 +0200 Subject: [PATCH 33/85] Get a request item by id and type --- seasoned_api/src/request/request.js | 18 ++++++++++++++- seasoned_api/src/webserver/app.js | 1 + .../controllers/request/getRequest.js | 22 +++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 seasoned_api/src/webserver/controllers/request/getRequest.js diff --git a/seasoned_api/src/request/request.js b/seasoned_api/src/request/request.js index f4ce7d7..e77f016 100644 --- a/seasoned_api/src/request/request.js +++ b/seasoned_api/src/request/request.js @@ -20,7 +20,7 @@ class RequestRepository { downloaded: '(select status from requests where id is request.id and type is request.type limit 1)', // deluge: '(select status from deluge_torrent where id is request.id and type is request.type limit 1)', // fetchAllFilterStatus: 'select * from request where ' - read: 'select * from request where id is ? and type is ?' + read: 'select id, title, year, type, status, requested_by, ip, date, user_agent from requests where id is ? and type is ?' }; } @@ -96,6 +96,22 @@ class RequestRepository { }); } + /** + * Get request item by id + * @param {String} id + * @param {String} type + * @returns {Promise} + */ + getRequestByIdAndType(id, type) { + console.log('id & type', id, type) + return Promise.resolve() + .then(() => this.database.get(this.queries.read, [id, type])) + .then(row => { + assert(row, 'Could not find request item with that id and type') + return JSON.stringify(row) + }) + } + /** * Fetch all requests with optional sort and filter params * @param {String} what we are sorting by diff --git a/seasoned_api/src/webserver/app.js b/seasoned_api/src/webserver/app.js index 61aa040..cb84124 100644 --- a/seasoned_api/src/webserver/app.js +++ b/seasoned_api/src/webserver/app.js @@ -102,6 +102,7 @@ router.post('/v1/plex/hook', require('./controllers/plex/hookDump.js')); */ router.get('/v2/request', require('./controllers/request/fetchAllRequests.js')); +router.get('/v2/request/:id', require('./controllers/request/getRequest.js')); router.post('/v2/request', require('./controllers/request/requestTmdbId.js')); router.get('/v1/plex/requests/all', require('./controllers/plex/fetchRequested.js')); router.put('/v1/plex/request/:requestId', mustBeAuthenticated, require('./controllers/plex/updateRequested.js')); diff --git a/seasoned_api/src/webserver/controllers/request/getRequest.js b/seasoned_api/src/webserver/controllers/request/getRequest.js new file mode 100644 index 0000000..2420211 --- /dev/null +++ b/seasoned_api/src/webserver/controllers/request/getRequest.js @@ -0,0 +1,22 @@ +const RequestRepository = require('src/request/request'); +const request = new RequestRepository(); + +/** + * Controller: Get requested item by tmdb id and type + * @param {Request} req http request variable + * @param {Response} res + * @returns {Callback} + */ +function fetchAllRequests(req, res) { + const id = req.params.id; + const { type } = req.query; + + Promise.resolve() + .then(() => request.getRequestByIdAndType(id, type)) + .then((result) => res.send(result)) + .catch((error) => { + res.status(404).send({ success: false, error: error.message }); + }); +} + +module.exports = fetchAllRequests; From 162d20ae522f5c544d56263a1146e3a782f3e603 Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Fri, 28 Jun 2019 21:51:11 +0200 Subject: [PATCH 34/85] Submitting requests now use requests repository --- seasoned_api/src/request/request.js | 6 +-- .../controllers/plex/submitRequest.js | 54 +++++++++++++------ 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/seasoned_api/src/request/request.js b/seasoned_api/src/request/request.js index e77f016..cdf4fb7 100644 --- a/seasoned_api/src/request/request.js +++ b/seasoned_api/src/request/request.js @@ -11,7 +11,7 @@ class RequestRepository { constructor(database) { this.database = database || establishedDatabase; this.queries = { - add: 'insert into request (id,title,year,type) values(?,?,?,?)', + add: 'insert into requests (id,title,year,poster_path,background_path,requested_by,ip,user_agent,type) values(?,?,?,?,?,?,?,?,?)', fetchAll: 'select * from requests where status != "downloaded" order by date desc LIMIT 25 OFFSET ?*25-25', fetchAllSort: `select id, type from request order by ? ?`, fetchAllFilter: `select id, type from request where ? is "?"`, @@ -82,11 +82,11 @@ class RequestRepository { * @param {tmdb} tmdb class of movie|show to add * @returns {Promise} */ - addTmdb(tmdb) { + requestFromTmdb(tmdb, ip, user_agent, user) { return Promise.resolve() .then(() => this.database.get(this.queries.read, [tmdb.id, tmdb.type])) .then(row => assert.equal(row, undefined, 'Id has already been requested')) - .then(() => this.database.run(this.queries.add, [tmdb.id, tmdb.title||tmdb.name, tmdb.year, tmdb.type])) + .then(() => this.database.run(this.queries.add, [tmdb.id, tmdb.title, tmdb.year, tmdb.poster, tmdb.backdrop, user, ip, user_agent, tmdb.type])) .catch((error) => { if (error.name === 'AssertionError' || error.message.endsWith('been requested')) { throw new Error('This id is already requested', error.message); diff --git a/seasoned_api/src/webserver/controllers/plex/submitRequest.js b/seasoned_api/src/webserver/controllers/plex/submitRequest.js index 293d80c..e4d7e78 100644 --- a/seasoned_api/src/webserver/controllers/plex/submitRequest.js +++ b/seasoned_api/src/webserver/controllers/plex/submitRequest.js @@ -1,6 +1,19 @@ -const RequestRepository = require('src/plex/requestRepository.js'); +const configuration = require('src/config/configuration').getInstance() +const RequestRepository = require('src/request/request'); +const Cache = require('src/tmdb/cache') +const TMDB = require('src/tmdb/tmdb') -const requestRepository = new RequestRepository(); +const cache = new Cache() +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')) +const request = new RequestRepository() + +const tmdbMovieInfo = (id) => { + return tmdb.movieInfo(id) +} + +const tmdbShowInfo = (id) => { + return tmdb.showInfo(id) +} /** * Controller: POST a media id to be donwloaded @@ -8,22 +21,31 @@ const requestRepository = new RequestRepository(); * @param {Response} res * @returns {Callback} */ - function submitRequestController(req, res) { - // This is the id that is the param of the url - const id = req.params.mediaId; - const type = req.query.type; - const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; - const user_agent = req.headers['user-agent']; - const user = req.loggedInUser; + // This is the id that is the param of the url + const id = req.params.mediaId; + const type = req.query.type ? req.query.type.toLowerCase() : undefined + const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; + const user_agent = req.headers['user-agent']; + const user = req.loggedInUser; + let mediaFunction = undefined - requestRepository.sendRequest(id, type, ip, user_agent, user) - .then(() => { - res.send({ success: true, message: 'Media item sucessfully requested!' }); - }) - .catch((error) => { - res.status(500).send({ success: false, error: error.message }); - }); + if (type === 'movie') { + console.log('movie') + mediaFunction = tmdbMovieInfo + } else if (type === 'show') { + console.log('show') + mediaFunction = tmdbShowInfo + } else { + res.status(422).send({ success: false, error: 'Incorrect type. Allowed types: "movie" or "show"'}) + } + + if (mediaFunction === undefined) { res.status(200); return } + + mediaFunction(id) + .then(tmdbMedia => request.requestFromTmdb(tmdbMedia, ip, user_agent, user)) + .then(() => res.send({ success: true, message: 'Media item successfully requested' })) + .catch(err => res.status(500).send({ success: false, error: err.message })) } module.exports = submitRequestController; From 270a259ceedf62bdc22b23c8a10156c14d7570e4 Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Fri, 28 Jun 2019 21:51:43 +0200 Subject: [PATCH 35/85] Request list also gets and returns total pages --- seasoned_api/src/request/request.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/seasoned_api/src/request/request.js b/seasoned_api/src/request/request.js index cdf4fb7..e1d2175 100644 --- a/seasoned_api/src/request/request.js +++ b/seasoned_api/src/request/request.js @@ -13,6 +13,7 @@ class RequestRepository { this.queries = { add: 'insert into requests (id,title,year,poster_path,background_path,requested_by,ip,user_agent,type) values(?,?,?,?,?,?,?,?,?)', fetchAll: 'select * from requests where status != "downloaded" order by date desc LIMIT 25 OFFSET ?*25-25', + totalRequests: 'select count(*) as totalRequests from requests', fetchAllSort: `select id, type from request order by ? ?`, fetchAllFilter: `select id, type from request where ? is "?"`, fetchAllQuery: `select id, type from request where title like "%?%" or year like "%?%"`, @@ -125,11 +126,17 @@ class RequestRepository { // console.log('hit', sort_by, sort_direction, filter_param, query) return Promise.resolve() .then((dbQuery) => this.database.all(this.queries.fetchAll, page)) - .then((rows) => { - return rows.map(item => { item.poster = item.poster_path; return item }) + .then(async (rows) => { + const sqliteResponse = await this.database.get(this.queries.totalRequests) + const totalRequests = sqliteResponse['totalRequests'] + const totalPages = Math.floor(totalRequests / 25) + + return [ rows.map(item => { item.poster = item.poster_path; return item }), totalPages ] return Promise.all(this.mapToTmdbByType(rows)) }) - .then(result => Promise.resolve({results: result, total_results: result.length})) + .then(([result, totalPages]) => Promise.resolve({ + results: result, total_results: result.length, page: page, total_pages: totalPages + })) .catch(error => { console.log(error);throw error }) } } From 91dcfaccb920f12ba2697d56c431a5888113d138 Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Fri, 28 Jun 2019 22:31:52 +0200 Subject: [PATCH 36/85] Rewrote posting request controller to handle body parameters and use new requestsRepository function istead of plexRepository functions --- .../controllers/request/requestTmdbId.js | 54 +++++++++++-------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/seasoned_api/src/webserver/controllers/request/requestTmdbId.js b/seasoned_api/src/webserver/controllers/request/requestTmdbId.js index 354b8bf..81092b4 100644 --- a/seasoned_api/src/webserver/controllers/request/requestTmdbId.js +++ b/seasoned_api/src/webserver/controllers/request/requestTmdbId.js @@ -6,21 +6,14 @@ const cache = new Cache(); const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); const request = new RequestRepository(); -const requestAsTmdb = (type, id) => { - if (type !== undefined) { - type = type.toLowerCase(); - - if (type === 'movie') { - return tmdb.movieInfo(id); - } else if (type === 'show') { - return tmdb.showInfo(id); - } else { - throw new Error("Unprocessable Entity: Invalid type for body parameter 'type'. Allowed values: movie|show"); - } - } - throw new Error("tmdbType body parameter not defined. Allowed values: movie|show") - +const tmdbMovieInfo = (id) => { + return tmdb.movieInfo(id) } + +const tmdbShowInfo = (id) => { + return tmdb.showInfo(id) +} + /** * Controller: Request by id with type param * @param {Request} req http request variable @@ -28,15 +21,32 @@ const requestAsTmdb = (type, id) => { * @returns {Callback} */ function requestTmdbIdController(req, res) { - const { id, type } = req.body; + const { id, type } = req.body + console.log('body', req.body) + console.log('id & type', id, type) - Promise.resolve() - .then(() => requestAsTmdb(type, id)) - .then((requesAsTmdb) => request.addTmdb(requesAsTmdb)) - .then(() => res.send({sucess: true, message: 'Request has been submitted.'})) - .catch((error) => { - res.status(404).send({ success: false, error: error.message }); - }); + const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; + const user_agent = req.headers['user-agent']; + const user = req.loggedInUser; + let mediaFunction = undefined + + if (type === 'movie') { + console.log('movie') + mediaFunction = tmdbMovieInfo + } else if (type === 'show') { + console.log('show') + mediaFunction = tmdbShowInfo + } else { + res.status(422).send({ success: false, error: 'Incorrect type. Allowed types: "movie" or "show"'}) + } + + mediaFunction(id) + .catch((error) => { console.error(error); res.status(404).send({ success: false, error: 'Id not found' }) }) + .then((tmdbMedia) => request.requestFromTmdb(tmdbMedia, ip, user_agent, user)) + .then(() => res.send({success: true, message: 'Request has been submitted.'})) + .catch((error) => { + res.status(501).send({ success: false, error: error.message }); + }) } module.exports = requestTmdbIdController; From 4019d63f3b78dbf6c60d5ce78a7005050e88f3fb Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Fri, 28 Jun 2019 22:39:24 +0200 Subject: [PATCH 37/85] Created example config and added development config to gitignore --- .gitignore | 1 + .../{development.json => development.json.example} | 11 ++--------- 2 files changed, 3 insertions(+), 9 deletions(-) rename seasoned_api/conf/{development.json => development.json.example} (59%) diff --git a/.gitignore b/.gitignore index be0f9f0..6447c5f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .DS_Store +development.json env shows.db diff --git a/seasoned_api/conf/development.json b/seasoned_api/conf/development.json.example similarity index 59% rename from seasoned_api/conf/development.json rename to seasoned_api/conf/development.json.example index f9b1801..6f95f9a 100644 --- a/seasoned_api/conf/development.json +++ b/seasoned_api/conf/development.json.example @@ -14,14 +14,7 @@ "raven": { "DSN": "" }, - "mail": { - "host": "", - "user": "", - "password": "", - "user_pi": "", - "password_pi": "" - }, "authentication": { - "secret": "secret" - } + "secret": "secret" + } } From 15826a00ba231b67ca2ce0a42e64c1f9a9b844f5 Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Fri, 28 Jun 2019 22:42:11 +0200 Subject: [PATCH 38/85] plexRepo now using class instance plexIp address --- seasoned_api/src/plex/plexRepository.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/seasoned_api/src/plex/plexRepository.js b/seasoned_api/src/plex/plexRepository.js index 88f26fb..0c4987b 100644 --- a/seasoned_api/src/plex/plexRepository.js +++ b/seasoned_api/src/plex/plexRepository.js @@ -21,7 +21,7 @@ class PlexRepository { search(query) { console.log('searching:', query) const options = { - uri: `http://${plexIP}:32400/search?query=${query}`, + uri: `http://${this.plexIP}:32400/search?query=${query}`, headers: { Accept: 'application/json', }, @@ -69,7 +69,7 @@ class PlexRepository { nowPlaying() { const options = { - uri: `http://${plexIP}:32400/status/sessions`, + uri: `http://${this.plexIP}:32400/status/sessions`, headers: { Accept: 'application/json', }, From d3bc854e03bea757b53a8e0bfbb355e4cc319427 Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Fri, 28 Jun 2019 22:44:39 +0200 Subject: [PATCH 39/85] Pirate repository has relative and use virtuale python when running python commands --- seasoned_api/src/pirate/pirateRepository.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/seasoned_api/src/pirate/pirateRepository.js b/seasoned_api/src/pirate/pirateRepository.js index bee32b6..2b7ca02 100644 --- a/seasoned_api/src/pirate/pirateRepository.js +++ b/seasoned_api/src/pirate/pirateRepository.js @@ -21,12 +21,12 @@ function getMagnetFromURL(url) { async function find(searchterm, callback) { const options = { - pythonPath: '/usr/bin/python3', - // pythonPath: '/Library/Frameworks/Python.framework/Versions/3.6/bin/python3', - args: [searchterm, '-s', 'jackett', '-f', '--print'], - }; + pythonPath: '../torrent_search/env/bin/python3.6', + scriptPath: '../torrent_search', + args: [searchterm, '-s', 'jackett', '-f', '--print'] + } - PythonShell.run('../torrent_search/torrentSearch/search.py', options, callback); + PythonShell.run('torrentSearch/search.py', options, callback); // PythonShell does not support return } @@ -35,12 +35,12 @@ async function callPythonAddMagnet(url, callback) { getMagnetFromURL(url) .then((magnet) => { const options = { - pythonPath: '/usr/bin/python', - // pythonPath: '/Library/Frameworks/Python.framework/Versions/3.6/bin/python3', - args: [magnet], + pythonPath: '../delugeClient/env/bin/python3.6', + scriptPath: '../delugeClient', + args: ['add', magnet] }; - PythonShell.run('../app/magnet.py', options, callback); + PythonShell.run('deluge_cli.py', options, callback); }) .catch((err) => { console.log(err); @@ -63,7 +63,7 @@ async function SearchPiratebay(query) { })); } -async function AddMagnet(magnet) { +async function AddMagnet(magnet, name, tmdb_id) { return await new Promise((resolve, reject) => callPythonAddMagnet(magnet, (err, results) => { if (err) { /* eslint-disable no-console */ From 537f237e83e29fe54f0c14ac4d992d9c6f890567 Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Fri, 28 Jun 2019 22:45:31 +0200 Subject: [PATCH 40/85] Updated lock file --- seasoned_api/yarn.lock | 277 +++++++++++++++++++++++++++++++---------- 1 file changed, 214 insertions(+), 63 deletions(-) diff --git a/seasoned_api/yarn.lock b/seasoned_api/yarn.lock index b0c1545..8bc54e0 100644 --- a/seasoned_api/yarn.lock +++ b/seasoned_api/yarn.lock @@ -44,6 +44,16 @@ ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" +ajv@^6.5.5: + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -161,7 +171,7 @@ assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" -async@1.x, async@^1.4.0, async@^1.5.2: +async@1.x, async@^1.4.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -187,6 +197,19 @@ aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + +axios@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3" + integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== + dependencies: + follow-redirects "1.5.10" + is-buffer "^2.0.2" + babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -528,12 +551,19 @@ color-name@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" -combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: +combined-stream@1.0.6, combined-stream@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" dependencies: delayed-stream "~1.0.0" +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + commander@2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" @@ -587,7 +617,7 @@ cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" -cookiejar@^2.0.6, cookiejar@^2.1.0: +cookiejar@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.1.tgz#41ad57b1b555951ec171412a81942b1e8200d34a" @@ -655,18 +685,26 @@ debug-log@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" -debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" -debug@3.1.0, debug@^3.1.0: +debug@3.1.0, debug@=3.1.0, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" +debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + decamelize@^1.0.0, decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -675,9 +713,10 @@ decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@~0.1.3: version "0.1.3" @@ -1037,6 +1076,11 @@ extend@^3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + external-editor@^2.0.4: version "2.2.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" @@ -1076,6 +1120,11 @@ fast-deep-equal@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -1162,6 +1211,13 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -1183,14 +1239,6 @@ forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" -form-data@1.0.0-rc4: - version "1.0.0-rc4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.0-rc4.tgz#05ac6bc22227b43e4461f488161554699d4f8b5e" - dependencies: - async "^1.5.2" - combined-stream "^1.0.5" - mime-types "^2.1.10" - form-data@^2.3.1, form-data@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" @@ -1199,7 +1247,16 @@ form-data@^2.3.1, form-data@~2.3.1: combined-stream "1.0.6" mime-types "^2.1.12" -formidable@^1.0.17, formidable@^1.1.1: +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +formidable@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" @@ -1348,6 +1405,14 @@ har-validator@~5.0.3: ajv "^5.1.0" har-schema "^2.0.0" +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -1536,6 +1601,11 @@ is-buffer@^1.1.5, is-buffer@~1.1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" +is-buffer@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" + integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== + is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" @@ -1803,6 +1873,11 @@ json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -1880,6 +1955,13 @@ kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" +km-moviedb@^0.2.12: + version "0.2.13" + resolved "https://registry.yarnpkg.com/km-moviedb/-/km-moviedb-0.2.13.tgz#1981f1468ed4a52f6ec3a257310719d79a0892ab" + integrity sha512-/AsIP3oltR6UVDrf05gRsjjIL6cnCP136U65QLf1TQiyz9ixGGNO9M/dxOrMJVCmIdOHW1EJtXDvzBYv7lMfYg== + dependencies: + superagent "3.8.2" + lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" @@ -2072,21 +2154,33 @@ micromatch@^3.1.8: snapdragon "^0.8.1" to-regex "^3.0.2" +mime-db@1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + mime-db@~1.33.0: version "1.33.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" -mime-types@^2.1.10, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18: +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18: version "2.1.18" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" dependencies: mime-db "~1.33.0" +mime-types@~2.1.19: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" -mime@^1.3.4, mime@^1.4.1: +mime@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -2190,12 +2284,6 @@ mongoose@~5.0.11: regexp-clone "0.0.1" sliced "1.0.1" -moviedb@^0.2.10: - version "0.2.10" - resolved "https://registry.yarnpkg.com/moviedb/-/moviedb-0.2.10.tgz#53238d403608478b8ba69e8d8dad19e3f0af78e8" - dependencies: - superagent "^2.3.0" - mpath@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.3.0.tgz#7a58f789e9b5fd3c94520634157960f26bd5ef44" @@ -2221,9 +2309,10 @@ mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" -nan@~2.9.2: - version "2.9.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.9.2.tgz#f564d75f5f8f36a6d9456cca7a6c4fe488ab7866" +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nanomatch@^1.2.9: version "1.2.9" @@ -2246,11 +2335,12 @@ natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" -needle@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.0.tgz#f14efc69cee1024b72c8b21c7bdf94a731dc12fa" +needle@^2.2.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== dependencies: - debug "^2.1.2" + debug "^3.2.6" iconv-lite "^0.4.4" sax "^1.2.4" @@ -2265,17 +2355,18 @@ node-cache@^4.1.1: clone "2.x" lodash "4.x" -node-pre-gyp@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.9.0.tgz#bdd4c3afac9b1b1ebff0a9ff3362859eb6781bb8" +node-pre-gyp@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" + integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" - needle "^2.2.0" + needle "^2.2.1" nopt "^4.0.1" npm-packlist "^1.1.6" npmlog "^4.0.2" - rc "^1.1.7" + rc "^1.2.7" rimraf "^2.6.1" semver "^5.3.0" tar "^4" @@ -2374,6 +2465,11 @@ oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -2610,18 +2706,33 @@ pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +psl@^1.1.24: + version "1.1.32" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.32.tgz#3f132717cf2f9c169724b2b6caf373cf694198db" + integrity sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g== + punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + python-shell@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/python-shell/-/python-shell-0.5.0.tgz#461983bafd092010bc2760c365b13e7d50aab231" -qs@6.5.1, qs@^6.1.0, qs@^6.5.1, qs@~6.5.1: +qs@6.5.1, qs@^6.5.1, qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + randomatic@^1.1.3: version "1.1.7" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" @@ -2652,11 +2763,12 @@ raw-body@2.3.2: iconv-lite "0.4.19" unpipe "1.0.0" -rc@^1.1.7: - version "1.2.6" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.6.tgz#eb18989c6d4f4f162c399f79ddd29f3835568092" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: - deep-extend "~0.4.0" + deep-extend "^0.6.0" ini "~1.3.0" minimist "^1.2.0" strip-json-comments "~2.0.1" @@ -2788,6 +2900,32 @@ request@^2.79.0, request@^2.85.0: tunnel-agent "^0.6.0" uuid "^3.1.0" +request@^2.87.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -2875,6 +3013,11 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, s version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" +safe-buffer@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -3088,12 +3231,14 @@ sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" -sqlite3@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.0.0.tgz#cc0e093ab51873f50d9dfc4126fcbef15d486570" +sqlite3@^4.0.0: + version "4.0.8" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.0.8.tgz#81ee60d54befaa52f5421fe6337050bd43d4bb95" + integrity sha512-kgwHu4j10KhpCHtx//dejd/tVQot7jc3sw+Sn0vMuKOw0X00Ckyg9VceKgzPyGmmz+zEoYue9tOLriWTvYy0ww== dependencies: - nan "~2.9.2" - node-pre-gyp "~0.9.0" + nan "^2.12.1" + node-pre-gyp "^0.11.0" + request "^2.87.0" sshpk@^1.7.0: version "1.14.1" @@ -3187,24 +3332,10 @@ strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" -superagent@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-2.3.0.tgz#703529a0714e57e123959ddefbce193b2e50d115" - dependencies: - component-emitter "^1.2.0" - cookiejar "^2.0.6" - debug "^2.2.0" - extend "^3.0.0" - form-data "1.0.0-rc4" - formidable "^1.0.17" - methods "^1.1.1" - mime "^1.3.4" - qs "^6.1.0" - readable-stream "^2.0.5" - -superagent@^3.0.0: +superagent@3.8.2, superagent@^3.0.0: version "3.8.2" resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.2.tgz#e4a11b9d047f7d3efeb3bbe536d9ec0021d16403" + integrity sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ== dependencies: component-emitter "^1.2.0" cookiejar "^2.1.0" @@ -3336,6 +3467,14 @@ tough-cookie@>=2.3.3, tough-cookie@~2.3.3: dependencies: punycode "^1.4.1" +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -3400,6 +3539,13 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -3426,6 +3572,11 @@ uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" +uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + validate-npm-package-license@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" From 071fd548255c5ffcc67d0dc65ab92693aebdab3e Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Fri, 28 Jun 2019 22:51:09 +0200 Subject: [PATCH 41/85] Pages for requests are only calulated for items not yet downloaded and use ceil isteadof floor to get last items on a page --- seasoned_api/src/request/request.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/seasoned_api/src/request/request.js b/seasoned_api/src/request/request.js index e1d2175..32e1141 100644 --- a/seasoned_api/src/request/request.js +++ b/seasoned_api/src/request/request.js @@ -13,7 +13,7 @@ class RequestRepository { this.queries = { add: 'insert into requests (id,title,year,poster_path,background_path,requested_by,ip,user_agent,type) values(?,?,?,?,?,?,?,?,?)', fetchAll: 'select * from requests where status != "downloaded" order by date desc LIMIT 25 OFFSET ?*25-25', - totalRequests: 'select count(*) as totalRequests from requests', + totalRequests: 'select count(*) as totalRequests from requests where status != "downloaded"', fetchAllSort: `select id, type from request order by ? ?`, fetchAllFilter: `select id, type from request where ? is "?"`, fetchAllQuery: `select id, type from request where title like "%?%" or year like "%?%"`, @@ -129,7 +129,7 @@ class RequestRepository { .then(async (rows) => { const sqliteResponse = await this.database.get(this.queries.totalRequests) const totalRequests = sqliteResponse['totalRequests'] - const totalPages = Math.floor(totalRequests / 25) + const totalPages = Math.ceil(totalRequests / 25) return [ rows.map(item => { item.poster = item.poster_path; return item }), totalPages ] return Promise.all(this.mapToTmdbByType(rows)) From 3845000b3f77100a70d9743db2145a83779331f7 Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Fri, 28 Jun 2019 23:32:11 +0200 Subject: [PATCH 42/85] Allow filtering for requested items by status --- seasoned_api/src/request/request.js | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/seasoned_api/src/request/request.js b/seasoned_api/src/request/request.js index 32e1141..6e17e70 100644 --- a/seasoned_api/src/request/request.js +++ b/seasoned_api/src/request/request.js @@ -13,7 +13,9 @@ class RequestRepository { this.queries = { add: 'insert into requests (id,title,year,poster_path,background_path,requested_by,ip,user_agent,type) values(?,?,?,?,?,?,?,?,?)', fetchAll: 'select * from requests where status != "downloaded" order by date desc LIMIT 25 OFFSET ?*25-25', + fetchAllFilteredStatus: 'select * from requests where status = ? order by date desc LIMIT 25 offset ?*25-25', totalRequests: 'select count(*) as totalRequests from requests where status != "downloaded"', + totalRequestsFilteredStatus: 'select count(*) as totalRequests from requests where status = ?', fetchAllSort: `select id, type from request order by ? ?`, fetchAllFilter: `select id, type from request where ? is "?"`, fetchAllQuery: `select id, type from request where title like "%?%" or year like "%?%"`, @@ -104,7 +106,6 @@ class RequestRepository { * @returns {Promise} */ getRequestByIdAndType(id, type) { - console.log('id & type', id, type) return Promise.resolve() .then(() => this.database.get(this.queries.read, [id, type])) .then(row => { @@ -121,15 +122,27 @@ class RequestRepository { * @param {String} query param to filter result on. Filters on title and year * @returns {Promise} */ - fetchAll(page, sort_by=undefined, sort_direction='asc', filter_param=undefined, query=undefined) { + fetchAll(page=1, sort_by=undefined, sort_direction='asc', filter=undefined, query=undefined) { // TODO implemented sort and filter - // console.log('hit', sort_by, sort_direction, filter_param, query) + let fetchQuery = this.queries.fetchAll + let fetchTotalResults = this.queries.totalRequests + let fetchParams = [page] + + if (filter && (filter === 'downloading' || filter === 'downloaded' || filter === 'requested')) { + console.log('tes') + fetchQuery = this.queries.fetchAllFilteredStatus + fetchTotalResults = this.queries.totalRequestsFilteredStatus + fetchParams = [filter, page] + } else { + filter = undefined + } + return Promise.resolve() - .then((dbQuery) => this.database.all(this.queries.fetchAll, page)) + .then((dbQuery) => this.database.all(fetchQuery, fetchParams)) .then(async (rows) => { - const sqliteResponse = await this.database.get(this.queries.totalRequests) + const sqliteResponse = await this.database.get(fetchTotalResults, filter ? filter : undefined) const totalRequests = sqliteResponse['totalRequests'] - const totalPages = Math.ceil(totalRequests / 25) + const totalPages = Math.ceil(totalRequests / 26) return [ rows.map(item => { item.poster = item.poster_path; return item }), totalPages ] return Promise.all(this.mapToTmdbByType(rows)) From 77433e8505af4cd139883f7af1f981082919f7bb Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Tue, 2 Jul 2019 23:53:08 +0200 Subject: [PATCH 43/85] Query of plex search is now encoded --- seasoned_api/src/plex/plexRepository.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/seasoned_api/src/plex/plexRepository.js b/seasoned_api/src/plex/plexRepository.js index 0c4987b..6bbc052 100644 --- a/seasoned_api/src/plex/plexRepository.js +++ b/seasoned_api/src/plex/plexRepository.js @@ -19,9 +19,10 @@ class PlexRepository { } search(query) { - console.log('searching:', query) + const queryUri = encodeURIComponent(query) + const uri = encodeURI(`http://${this.plexIP}:32400/search?query=${queryUri}`) const options = { - uri: `http://${this.plexIP}:32400/search?query=${query}`, + uri: uri, headers: { Accept: 'application/json', }, From 3a9131a022391699ae4598822c6e3c3a0f1edc35 Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Tue, 2 Jul 2019 23:53:26 +0200 Subject: [PATCH 44/85] Removed, commented and added comments --- seasoned_api/src/plex/plexRepository.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/seasoned_api/src/plex/plexRepository.js b/seasoned_api/src/plex/plexRepository.js index 6bbc052..8f56695 100644 --- a/seasoned_api/src/plex/plexRepository.js +++ b/seasoned_api/src/plex/plexRepository.js @@ -31,6 +31,7 @@ class PlexRepository { return rp(options) .catch((error) => { + console.log(error) throw new Error('Unable to search plex.') }) .then(result => this.mapResults(result)) @@ -44,6 +45,7 @@ class PlexRepository { tmdb.matchedInPlex = false } else { + // console.log('plex and tmdb:', plexResult, '\n', tmdb) plexResult.results.map((plexItem) => { if (tmdb.title === plexItem.title && tmdb.year === plexItem.year) tmdb.matchedInPlex = true; @@ -57,7 +59,6 @@ class PlexRepository { mapResults(response) { return Promise.resolve() .then(() => { - console.log('plexResponse:', response) if (!response.MediaContainer.hasOwnProperty('Metadata')) return [[], 0]; const mappedResults = response.MediaContainer.Metadata.filter((element) => { From de50805d1e118b16169403938b78f0dc3d2e1413 Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Mon, 15 Jul 2019 18:16:46 +0200 Subject: [PATCH 45/85] Handle both status code 301 and 302 from jackett --- seasoned_api/src/pirate/pirateRepository.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seasoned_api/src/pirate/pirateRepository.js b/seasoned_api/src/pirate/pirateRepository.js index 2b7ca02..f14075a 100644 --- a/seasoned_api/src/pirate/pirateRepository.js +++ b/seasoned_api/src/pirate/pirateRepository.js @@ -12,7 +12,7 @@ function getMagnetFromURL(url) { resolve(url) http.get(options, (res) => { - if (res.statusCode == 301) { + if (res.statusCode == 301 || res.statusCode == 302) { resolve(res.headers.location) } }); From 3f04d9bc56b8759a7dbdd908b8525c9c121c7b18 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Tue, 16 Jul 2019 18:50:27 +0200 Subject: [PATCH 46/85] Update script for updating all plex statuses of requestes. --- seasoned_api/package.json | 2 +- seasoned_api/src/plex/updateRequestsInPlex.js | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 seasoned_api/src/plex/updateRequestsInPlex.js diff --git a/seasoned_api/package.json b/seasoned_api/package.json index a0e79a1..9c4834d 100644 --- a/seasoned_api/package.json +++ b/seasoned_api/package.json @@ -11,7 +11,7 @@ "test": "cross-env SEASONED_CONFIG=conf/test.json NODE_PATH=. mocha --recursive test/unit test/system", "coverage": "cross-env SEASONED_CONFIG=conf/test.json NODE_PATH=. nyc mocha --recursive test && nyc report --reporter=text-lcov | coveralls", "lint": "./node_modules/.bin/eslint src/", - "update": "cross-env SEASONED_CONFIG=conf/development.json NODE_PATH=. node src/plex/updateRequestsInPlex.js" + "update": "cross-env SEASONED_CONFIG=conf/development.json NODE_PATH=. node src/plex/updateRequestsInPlex.js", }, "dependencies": { "axios": "^0.18.0", diff --git a/seasoned_api/src/plex/updateRequestsInPlex.js b/seasoned_api/src/plex/updateRequestsInPlex.js new file mode 100644 index 0000000..f1a028a --- /dev/null +++ b/seasoned_api/src/plex/updateRequestsInPlex.js @@ -0,0 +1,41 @@ +const PlexRepository = require('src/plex/plexRepository'); +const configuration = require('src/config/configuration').getInstance(); +const establishedDatabase = require('src/database/database'); + +const plexRepository = new PlexRepository(); + +class UpdateRequestsInPlex { + constructor() { + this.database = establishedDatabase; + this.queries = { + getRequests: `SELECT * FROM requests WHERE status IS 'requested' OR 'downloaded'`, + saveNewStatus: `UPDATE requests SET status = ? WHERE id IS ? and type IS ?`, + } + } + + getRequests() { + return this.database.all(this.queries.getRequests); + } + + scrub() { + return this.getRequests() + .then((requests) => Promise.all(requests.map(async (movie) => { + return plexRepository.inPlex(movie) + }))) + .then((requests_checkInPlex) => requests_checkInPlex.filter((movie) => movie.matchedInPlex)) + } + + updateStatus(status) { + this.scrub().then((newInPlex) => + newInPlex.map((movie) => { + console.log('updated', movie.title, 'to', status) + // this.database.run(this.queries.saveNewStatus, [status, movie.id, movie.type]) + }) + ) + } +} + +var requestsUpdater = new UpdateRequestsInPlex(); +requestsUpdater.updateStatus('downloaded') + +module.exports = UpdateRequestsInPlex \ No newline at end of file From 8a5ab204e1ea1e7abdcd74c9a75a503c79134d6d Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Wed, 24 Jul 2019 22:54:04 +0200 Subject: [PATCH 47/85] Change node bcrypt package from bcrypt-nodejs to bcrypt. Change response message on invalid username/pass and changed to bcrypt syntax for compare and hash. --- seasoned_api/package.json | 2 +- seasoned_api/src/user/userSecurity.js | 91 +++++++++++++-------------- 2 files changed, 46 insertions(+), 47 deletions(-) diff --git a/seasoned_api/package.json b/seasoned_api/package.json index 9c4834d..dfc9297 100644 --- a/seasoned_api/package.json +++ b/seasoned_api/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "axios": "^0.18.0", - "bcrypt-nodejs": "^0.0.3", + "bcrypt": "^3.0.6", "body-parser": "~1.18.2", "cross-env": "~5.1.4", "express": "~4.16.0", diff --git a/seasoned_api/src/user/userSecurity.js b/seasoned_api/src/user/userSecurity.js index 9cf4ba4..571ec58 100644 --- a/seasoned_api/src/user/userSecurity.js +++ b/seasoned_api/src/user/userSecurity.js @@ -1,73 +1,72 @@ -const bcrypt = require('bcrypt-nodejs'); +const bcrypt = require('bcrypt'); const UserRepository = require('src/user/userRepository'); class UserSecurity { - constructor(database) { - this.userRepository = new UserRepository(database); - } + constructor(database) { + this.userRepository = new UserRepository(database); +} - /** + /** * Create a new user in PlanFlix. * @param {User} user the new user you want to create * @param {String} clearPassword a password of the user * @returns {Promise} */ - createNewUser(user, clearPassword) { - if (user.username.trim() === '') { - throw new Error('The username is empty.'); - } else if (clearPassword.trim() === '') { - throw new Error('The password is empty.'); - } else { - return Promise.resolve() - .then(() => this.userRepository.create(user)) - .then(() => UserSecurity.hashPassword(clearPassword)) - .then(hash => this.userRepository.changePassword(user, hash)); - } - } + createNewUser(user, clearPassword) { + if (user.username.trim() === '') { + throw new Error('The username is empty.'); + } else if (clearPassword.trim() === '') { + throw new Error('The password is empty.'); + } else { + return Promise.resolve() + .then(() => this.userRepository.create(user)) + .then(() => UserSecurity.hashPassword(clearPassword)) + .then(hash => this.userRepository.changePassword(user, hash)); + } + } - /** + /** * Login into PlanFlix. * @param {User} user the user you want to login * @param {String} clearPassword the user's password * @returns {Promise} */ - login(user, clearPassword) { - return Promise.resolve() - .then(() => this.userRepository.retrieveHash(user)) - .then(hash => UserSecurity.compareHashes(hash, clearPassword)) - .catch(() => { throw new Error('Wrong username or password.'); }); - } + login(user, clearPassword) { + return Promise.resolve() + .then(() => this.userRepository.retrieveHash(user)) + .then(hash => UserSecurity.compareHashes(hash, clearPassword)) + .catch(() => { throw new Error('Incorrect username or password.'); }); + } /** - * Compare between a password and a hash password from database. - * @param {String} hash the hash password from database - * @param {String} clearPassword the user's password - * @returns {Promise} - */ - static compareHashes(hash, clearPassword) { - return new Promise((resolve, reject) => { - bcrypt.compare(clearPassword, hash, (error, matches) => { - if (matches === true) { - resolve(); - } else { - reject(); - } - }); + * Compare between a password and a hash password from database. + * @param {String} hash the hash password from database + * @param {String} clearPassword the user's password + * @returns {Promise} + */ + static compareHashes(hash, clearPassword) { + return new Promise((resolve, reject) => { + bcrypt.compare(clearPassword, hash, (error, match) => { + if (match) + resolve() + reject() }); - } + }); + } - /** + /** * Hashes a password. * @param {String} clearPassword the user's password * @returns {Promise} */ - static hashPassword(clearPassword) { - return new Promise((resolve) => { - bcrypt.hash(clearPassword, null, null, (error, hash) => { - resolve(hash); - }); + static hashPassword(clearPassword) { + return new Promise((resolve) => { + const salatRounds = 10; + bcrypt.hash(clearPassword, saltRounds, (error, hash) => { + resolve(hash); }); - } + }); + } } module.exports = UserSecurity; From 12afbf63645ad4725a88da10c5a62360d40c3c99 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Thu, 25 Jul 2019 00:13:28 +0200 Subject: [PATCH 48/85] Tokens can also have a admin property. When admin is defined its included in the jwt token. --- seasoned_api/src/user/token.js | 44 +++++++++++-------- .../src/webserver/controllers/user/login.js | 6 +-- .../webserver/controllers/user/register.js | 6 +-- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/seasoned_api/src/user/token.js b/seasoned_api/src/user/token.js index cd8c285..6e904de 100644 --- a/seasoned_api/src/user/token.js +++ b/seasoned_api/src/user/token.js @@ -2,36 +2,44 @@ const User = require('src/user/user'); const jwt = require('jsonwebtoken'); class Token { - constructor(user) { - this.user = user; - } + constructor(user, admin=false) { + this.user = user; + this.admin = admin; + } - /** + /** * Generate a new token. * @param {String} secret a cipher of the token * @returns {String} */ - toString(secret) { - return jwt.sign({ username: this.user.username }, secret); - } + toString(secret) { + const user = this.user.username; + const admin = this.admin; + let data = { user } - /** + if (admin) + data = { ...data, admin } + + return jwt.sign(data, secret, { expiresIn: '90d' }); + } + + /** * Decode a token. * @param {Token} jwtToken an encrypted token * @param {String} secret a cipher of the token * @returns {Token} */ - static fromString(jwtToken, secret) { - let username = null; + static fromString(jwtToken, secret) { + let username = null; - try { - username = jwt.verify(jwtToken, secret).username; - } catch (error) { - throw new Error('The token is invalid.'); - } - const user = new User(username); - return new Token(user); - } + const token = jwt.verify(jwtToken, secret, { clockTolerance: 10000 }) + if (token.username === undefined) + throw new Error('Malformed token') + + username = token.username + const user = new User(username) + return new Token(user) + } } module.exports = Token; diff --git a/seasoned_api/src/webserver/controllers/user/login.js b/seasoned_api/src/webserver/controllers/user/login.js index 89722c1..25d8bca 100644 --- a/seasoned_api/src/webserver/controllers/user/login.js +++ b/seasoned_api/src/webserver/controllers/user/login.js @@ -21,9 +21,9 @@ function loginController(req, res) { userSecurity.login(user, password) .then(() => userRepository.checkAdmin(user)) .then((checkAdmin) => { - const token = new Token(user).toString(secret); - const admin_state = checkAdmin === 1 ? true : false; - res.send({ success: true, token, admin: admin_state }); + const isAdmin = checkAdmin === 1 ? true : false; + const token = new Token(user, isAdmin).toString(secret); + res.send({ success: true, token }); }) .catch((error) => { res.status(401).send({ success: false, error: error.message }); diff --git a/seasoned_api/src/webserver/controllers/user/register.js b/seasoned_api/src/webserver/controllers/user/register.js index 280f4be..36d9ff2 100644 --- a/seasoned_api/src/webserver/controllers/user/register.js +++ b/seasoned_api/src/webserver/controllers/user/register.js @@ -21,10 +21,10 @@ function registerController(req, res) { userSecurity.createNewUser(user, password) .then(() => userRepository.checkAdmin(user)) .then((checkAdmin) => { - const token = new Token(user).toString(secret); - const admin_state = checkAdmin === 1 ? true : false; + const isAdmin = checkAdmin === 1 ? true : false; + const token = new Token(user, isAdmin).toString(secret); res.send({ - success: true, message: 'Welcome to Seasoned!', token, admin: admin_state, + success: true, message: 'Welcome to Seasoned!', token }); }) .catch((error) => { From 144b27f128620620fcaa35118211597d83e3462d Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Thu, 25 Jul 2019 00:23:32 +0200 Subject: [PATCH 49/85] Renamed token variable from user to username --- seasoned_api/src/user/token.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/seasoned_api/src/user/token.js b/seasoned_api/src/user/token.js index 6e904de..0590dc3 100644 --- a/seasoned_api/src/user/token.js +++ b/seasoned_api/src/user/token.js @@ -13,9 +13,9 @@ class Token { * @returns {String} */ toString(secret) { - const user = this.user.username; + const username = this.user.username; const admin = this.admin; - let data = { user } + let data = { username } if (admin) data = { ...data, admin } From e19cfb5870c31c83766166631d3885ec8a148828 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Thu, 25 Jul 2019 00:24:04 +0200 Subject: [PATCH 50/85] Updated formatting --- .../webserver/middleware/.tokenToUser.js.swp | Bin 0 -> 12288 bytes .../src/webserver/middleware/tokenToUser.js | 20 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) create mode 100644 seasoned_api/src/webserver/middleware/.tokenToUser.js.swp diff --git a/seasoned_api/src/webserver/middleware/.tokenToUser.js.swp b/seasoned_api/src/webserver/middleware/.tokenToUser.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..7b48de57e0a9b164787c569854a6ed534546b227 GIT binary patch literal 12288 zcmeI2J8u&~5XU!^NZ~0&hlU_zJM!Jd1SBU>kf0($kwAGgD1!Cf+FpFOYj*eI1Qe*L zproV&iG~IVDyZQTq~;S)(lLAIJWLWwB+#t&ztukG^*c9~r!}>@un5ht!El^n?A3O2 z?Z=moZ00>e!B5g-DG5XfCS zXpXb#D~&0CdTHV!oISI0$VJ*B0z`la5CI}U1c(3;AOb|-eK#|2x0`w@)(m67>Rg z7ga@7Q0GwJPB8Wr^%`YR4^XS93#gyy=R4{%>J#b%>K*DW>J7@r8K5qsj-zN00U|&I zhyW2F0z`la5CI}U1pYpOOec9NLb1`;##xw$y*A@N9GN-Bw&oZBD6x?hLuZ-BPx&~) z^x*cvoxLvSofsIxRck)lmXA1m0vPcK`>i`2kt`_R6^+T~DiLjojnzeNumv%9aTlt> z7;S3sq_98KvM4*u(M@Rz5Nl;!i32?^`@F)o(biHiUa|i*(}1y zHtb$01DF1G%+RIJzbkkmj175?ec?tv=1yug$M(f8JHGLH74O&4$ksh{SA+TM7>Pv@ z#JNc!kPzI0i5vSJ&E6}@TAP5PFTJa+o1Jc4y*3m1PV@Cfl!3)8}V1xqgzE=gdnxNOT#Zi;fkj&RkAuTUr_@r_`Kl{!?) z+unL;K4Mh@+KX2nMk9ABHSc=?-xF7{@ZXVW5`;~qazP?3Z>0j14*J~iEHKz}Z)Hcp HWW;^}h>=Za literal 0 HcmV?d00001 diff --git a/seasoned_api/src/webserver/middleware/tokenToUser.js b/seasoned_api/src/webserver/middleware/tokenToUser.js index 462d077..069c3e5 100644 --- a/seasoned_api/src/webserver/middleware/tokenToUser.js +++ b/seasoned_api/src/webserver/middleware/tokenToUser.js @@ -8,16 +8,16 @@ const Token = require('src/user/token'); // curl -i -H "Authorization:[token]" localhost:31459/api/v1/user/history const tokenToUser = (req, res, next) => { - const rawToken = req.headers.authorization; - if (rawToken) { - try { - const token = Token.fromString(rawToken, secret); - req.loggedInUser = token.user; - } catch (error) { - req.loggedInUser = undefined; - } - } - next(); + const rawToken = req.headers.authorization; + if (rawToken) { + try { + const token = Token.fromString(rawToken, secret); + req.loggedInUser = token.user; + } catch (error) { + req.loggedInUser = undefined; + } + } + next(); }; module.exports = tokenToUser; From 6aba9774c6e42086215980195987142e31aa0953 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Thu, 25 Jul 2019 00:47:17 +0200 Subject: [PATCH 51/85] When requesting all request elements we now also return the page as int not string --- seasoned_api/src/request/request.js | 1 + 1 file changed, 1 insertion(+) diff --git a/seasoned_api/src/request/request.js b/seasoned_api/src/request/request.js index 6e17e70..b83882e 100644 --- a/seasoned_api/src/request/request.js +++ b/seasoned_api/src/request/request.js @@ -124,6 +124,7 @@ class RequestRepository { */ fetchAll(page=1, sort_by=undefined, sort_direction='asc', filter=undefined, query=undefined) { // TODO implemented sort and filter + page = parseInt(page) let fetchQuery = this.queries.fetchAll let fetchTotalResults = this.queries.totalRequests let fetchParams = [page] From af7b1f2424eb5063196435f55ab8fca472219f13 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Thu, 25 Jul 2019 00:48:16 +0200 Subject: [PATCH 52/85] Script for updating all requested and downloading request status to downloaded if exist in plex --- seasoned_api/src/plex/updateRequestsInPlex.js | 62 +++++++++---------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/seasoned_api/src/plex/updateRequestsInPlex.js b/seasoned_api/src/plex/updateRequestsInPlex.js index f1a028a..c53ff7f 100644 --- a/seasoned_api/src/plex/updateRequestsInPlex.js +++ b/seasoned_api/src/plex/updateRequestsInPlex.js @@ -1,41 +1,39 @@ -const PlexRepository = require('src/plex/plexRepository'); +const Plex = require('src/plex/plex') const configuration = require('src/config/configuration').getInstance(); -const establishedDatabase = require('src/database/database'); - -const plexRepository = new PlexRepository(); +const plex = new Plex(configuration.get('plex', 'ip')) +const establishedDatabase = require('src/database/database'); class UpdateRequestsInPlex { - constructor() { - this.database = establishedDatabase; - this.queries = { - getRequests: `SELECT * FROM requests WHERE status IS 'requested' OR 'downloaded'`, - saveNewStatus: `UPDATE requests SET status = ? WHERE id IS ? and type IS ?`, - } - } + constructor() { + this.database = establishedDatabase; + this.queries = { + getMovies: `SELECT * FROM requests WHERE status = 'requested' OR status = 'downloading'`, +// getMovies: "select * from requests where status is 'reset'", + saveNewStatus: `UPDATE requests SET status = ? WHERE id IS ? and type IS ?`, + } + } + getByStatus() { + return this.database.all(this.queries.getMovies); + } + scrub() { + return this.getByStatus() + .then((requests) => Promise.all(requests.map(movie => plex.existsInPlex(movie)))) + } - getRequests() { - return this.database.all(this.queries.getRequests); - } + commitNewStatus(status, id, type, title) { + console.log(type, title, 'updated to:', status) + this.database.run(this.queries.saveNewStatus, [status, id, type]) + } - scrub() { - return this.getRequests() - .then((requests) => Promise.all(requests.map(async (movie) => { - return plexRepository.inPlex(movie) - }))) - .then((requests_checkInPlex) => requests_checkInPlex.filter((movie) => movie.matchedInPlex)) - } - - updateStatus(status) { - this.scrub().then((newInPlex) => - newInPlex.map((movie) => { - console.log('updated', movie.title, 'to', status) - // this.database.run(this.queries.saveNewStatus, [status, movie.id, movie.type]) - }) - ) - } + + updateStatus(status) { + this.getByStatus() + .then(requests => Promise.all(requests.map(request => plex.existsInPlex(request)))) + .then(matchedRequests => matchedRequests.filter(request => request.existsInPlex)) + .then(newMatches => newMatches.map(match => this.commitNewStatus(status, match.id, match.type, match.title))) + } } - var requestsUpdater = new UpdateRequestsInPlex(); requestsUpdater.updateStatus('downloaded') -module.exports = UpdateRequestsInPlex \ No newline at end of file +module.exports = UpdateRequestsInPlex From c42195d24262493e6a9d5991249662932eadac53 Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Thu, 25 Jul 2019 00:53:40 +0200 Subject: [PATCH 53/85] Removed swap file --- .../webserver/middleware/.tokenToUser.js.swp | Bin 12288 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 seasoned_api/src/webserver/middleware/.tokenToUser.js.swp diff --git a/seasoned_api/src/webserver/middleware/.tokenToUser.js.swp b/seasoned_api/src/webserver/middleware/.tokenToUser.js.swp deleted file mode 100644 index 7b48de57e0a9b164787c569854a6ed534546b227..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2J8u&~5XU!^NZ~0&hlU_zJM!Jd1SBU>kf0($kwAGgD1!Cf+FpFOYj*eI1Qe*L zproV&iG~IVDyZQTq~;S)(lLAIJWLWwB+#t&ztukG^*c9~r!}>@un5ht!El^n?A3O2 z?Z=moZ00>e!B5g-DG5XfCS zXpXb#D~&0CdTHV!oISI0$VJ*B0z`la5CI}U1c(3;AOb|-eK#|2x0`w@)(m67>Rg z7ga@7Q0GwJPB8Wr^%`YR4^XS93#gyy=R4{%>J#b%>K*DW>J7@r8K5qsj-zN00U|&I zhyW2F0z`la5CI}U1pYpOOec9NLb1`;##xw$y*A@N9GN-Bw&oZBD6x?hLuZ-BPx&~) z^x*cvoxLvSofsIxRck)lmXA1m0vPcK`>i`2kt`_R6^+T~DiLjojnzeNumv%9aTlt> z7;S3sq_98KvM4*u(M@Rz5Nl;!i32?^`@F)o(biHiUa|i*(}1y zHtb$01DF1G%+RIJzbkkmj175?ec?tv=1yug$M(f8JHGLH74O&4$ksh{SA+TM7>Pv@ z#JNc!kPzI0i5vSJ&E6}@TAP5PFTJa+o1Jc4y*3m1PV@Cfl!3)8}V1xqgzE=gdnxNOT#Zi;fkj&RkAuTUr_@r_`Kl{!?) z+unL;K4Mh@+KX2nMk9ABHSc=?-xF7{@ZXVW5`;~qazP?3Z>0j14*J~iEHKz}Z)Hcp HWW;^}h>=Za From 6f9ca9e0673ef1ade8dc5464336b1721c3fd7908 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Fri, 26 Jul 2019 20:56:13 +0200 Subject: [PATCH 54/85] Added package and commands for generating documentation and upgraded mocha --- seasoned_api/package.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/seasoned_api/package.json b/seasoned_api/package.json index dfc9297..8b2db1b 100644 --- a/seasoned_api/package.json +++ b/seasoned_api/package.json @@ -12,6 +12,9 @@ "coverage": "cross-env SEASONED_CONFIG=conf/test.json NODE_PATH=. nyc mocha --recursive test && nyc report --reporter=text-lcov | coveralls", "lint": "./node_modules/.bin/eslint src/", "update": "cross-env SEASONED_CONFIG=conf/development.json NODE_PATH=. node src/plex/updateRequestsInPlex.js", + "docs": "yarn apiDocs; yarn classDocs", + "apiDocs": "", + "classDocs": "./script/generate-class-docs.sh" }, "dependencies": { "axios": "^0.18.0", @@ -20,9 +23,8 @@ "cross-env": "~5.1.4", "express": "~4.16.0", "jsonwebtoken": "^8.0.1", - "km-moviedb": "^0.2.13", - "mongoose": "~5.0.11", "km-moviedb": "^0.2.12", + "mongoose": "~5.0.11", "node-cache": "^4.1.1", "python-shell": "^0.5.0", "request": "^2.85.0", @@ -31,11 +33,12 @@ }, "devDependencies": { "coveralls": "^3.0.0", + "documentation": "^12.0.3", "eslint": "^4.9.0", "eslint-config-airbnb-base": "^12.1.0", "eslint-plugin-import": "^2.8.0", "istanbul": "^0.4.5", - "mocha": "^5.0.4", + "mocha": "^6.2.0", "mocha-lcov-reporter": "^1.3.0", "nyc": "^11.6.0", "raven": "^2.4.2", From e5d5bdefd62b3f601317005e3d3f84ea996122ee Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Fri, 26 Jul 2019 21:05:45 +0200 Subject: [PATCH 55/85] Updated cache key and cleaned up formatting --- .../test/system/asAUserIWantToRequestAMovie.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/seasoned_api/test/system/asAUserIWantToRequestAMovie.js b/seasoned_api/test/system/asAUserIWantToRequestAMovie.js index 2c5c56d..146eca8 100644 --- a/seasoned_api/test/system/asAUserIWantToRequestAMovie.js +++ b/seasoned_api/test/system/asAUserIWantToRequestAMovie.js @@ -7,17 +7,17 @@ const createToken = require('test/helpers/createToken'); const infoMovieSuccess = require('test/fixtures/blade_runner_2049-info-success-response.json'); describe('As a user I want to request a movie', () => { - before(() => { - return resetDatabase() - .then(() => createUser('test_user', 'test@gmail.com', 'password')); + before(async () => { + await resetDatabase() + await createUser('test_user', 'test@gmail.com', 'password') }) - before(() => createCacheEntry('mi:335984', infoMovieSuccess)); + before(() => createCacheEntry('mi:335984:false', infoMovieSuccess)); it('should return 200 when item is requested', () => request(app) .post('/api/v2/request') + .set('authorization', createToken('test_user', 'secret')) .send({ id: 335984, type: 'movie' }) - .set('Authorization', createToken('test_user', 'secret')) .expect(200) ); }); From 135375cb94b6489abc91012a47e0bed0b96cf711 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Fri, 26 Jul 2019 21:06:45 +0200 Subject: [PATCH 56/85] instead of "describe" "xdescribe" was defined which made the test pending in results. This has now been resolved. --- seasoned_api/test/system/asADeveloperIWantTheServerToStart.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seasoned_api/test/system/asADeveloperIWantTheServerToStart.js b/seasoned_api/test/system/asADeveloperIWantTheServerToStart.js index aa2d7ee..1c317bd 100644 --- a/seasoned_api/test/system/asADeveloperIWantTheServerToStart.js +++ b/seasoned_api/test/system/asADeveloperIWantTheServerToStart.js @@ -1,7 +1,7 @@ /* eslint-disable no-return-assign */ const net = require('net'); -xdescribe('As a developer I want the server to start', () => { +describe('As a developer I want the server to start', () => { beforeEach(() => this.server = require('src/webserver/server')); From 6ba8ca2add07bd2460a6e82d5f95ba00538ed967 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Fri, 26 Jul 2019 21:07:26 +0200 Subject: [PATCH 57/85] Updated search query response --- .../fixtures/interstellar-query-movie-success-response.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seasoned_api/test/fixtures/interstellar-query-movie-success-response.json b/seasoned_api/test/fixtures/interstellar-query-movie-success-response.json index 61fdfc7..19162ac 100644 --- a/seasoned_api/test/fixtures/interstellar-query-movie-success-response.json +++ b/seasoned_api/test/fixtures/interstellar-query-movie-success-response.json @@ -1 +1 @@ -{"page":1,"total_results":11,"total_pages":1,"results":[{"vote_count":15925,"id":157336,"video":false,"vote_average":8.2,"title":"Interstellar","popularity":31.724,"poster_path":"/nBNZadXqJSdt05SHLqgT0HuC5Gm.jpg","original_language":"en","original_title":"Interstellar","genre_ids":[12,18,878],"backdrop_path":"/xu9zaAevzQ5nnrsXN6JcahLnG4i.jpg","adult":false,"overview":"Interstellar chronicles the adventures of a group of explorers who make use of a newly discovered wormhole to surpass the limitations on human space travel and conquer the vast distances involved in an interstellar voyage.","release_date":"2014-11-05"},{"vote_count":126,"id":301959,"video":false,"vote_average":7.8,"title":"Interstellar: Nolan's Odyssey","popularity":5.505,"poster_path":"/xZwUIPqBHyJ2QIfMPANOZ1mAld6.jpg","original_language":"en","original_title":"Interstellar: Nolan's Odyssey","genre_ids":[99],"backdrop_path":"/bT5jpIZE50MI0COE8pOeq0kMpQo.jpg","adult":false,"overview":"Behind the scenes of Christopher Nolan's sci-fi drama, which stars Matthew McConaughey and Anne Hathaway","release_date":"2014-11-05"},{"vote_count":1,"id":287954,"video":false,"vote_average":7,"title":"Lolita from Interstellar Space","popularity":2.07,"poster_path":"/buoq7zYO4J3ttkEAqEMWelPDC0G.jpg","original_language":"en","original_title":"Lolita from Interstellar Space","genre_ids":[35],"backdrop_path":"/mgb6tVEieDYLpQt666ACzGz5cyE.jpg","adult":false,"overview":"An undeniably beautiful alien is sent to Earth to study the complex mating rituals of human beings, which leads to the young interstellar traveler experiencing the passion that surrounds the centuries-old ritual of the species.","release_date":"2014-03-08"},{"vote_count":7,"id":398188,"video":false,"vote_average":3.8,"title":"Interstellar Wars","popularity":0.819,"poster_path":"/cjvTebuqD8wmhchHE286ltVcbX6.jpg","original_language":"en","original_title":"Interstellar Wars","genre_ids":[878],"backdrop_path":"/yTnHa6lgIv8rNneSNBDkBe8MnZe.jpg","adult":false,"overview":"For Millennia the Aliien force has watched and waited, a brooding menace that has now at last decided to take over the Earth. Communications systems worldwide are sent into chaos by a strange atmospheric interference and this has turned into a global phenomenon. A massive spaceship headed towards Earth and smaller spaceships began to cover entire cities around the world. Suddenly, the wonder turns into horror as the spaceships destroy the cities with energy weapons. When the world counterattacks, the alien ships are invincible to military weapons. The survivors have to use their wits to kill the aliens, or die.","release_date":"2016-05-23"},{"vote_count":0,"id":529107,"video":false,"vote_average":0,"title":"Inside Interstellar","popularity":0.677,"poster_path":"/vemBplPKQhVe5cRWL7kxtgp15Vq.jpg","original_language":"en","original_title":"Inside Interstellar","genre_ids":[99],"backdrop_path":null,"adult":false,"overview":"Cast and crew of Christopher Nolan's 'Interstellar' discuss project origins, the film's imagery, ambitions, incorporating IMAX footage, the human element within the film, arm shooting locations outside of Calgary, the set construction and design, working with real corn, mechanical characters, including backstory, design, the blend of practical and digital effects in bringing them to life, the differences in the characters, the human performances behind the characters, the creative process behind the film's music, Icelandic locations, vehicle interiors, the processes of simulating the absence of gravity, the crucial end-film visuals and influence and inspiration for future generations","release_date":"2015-03-31"},{"vote_count":6,"id":336592,"video":false,"vote_average":7.8,"title":"The Science of Interstellar","popularity":0.6,"poster_path":"/6KBD7YSBjCfgBgHwpsQo3G3GGdx.jpg","original_language":"en","original_title":"The Science of Interstellar","genre_ids":[99],"backdrop_path":null,"adult":false,"overview":"The science of Christopher Nolan's sci-fi, Interstellar.","release_date":"2014-11-25"},{"vote_count":0,"id":552531,"video":false,"vote_average":0,"title":"The Prom Goer's Interstellar Excursion","popularity":0.6,"poster_path":null,"original_language":"en","original_title":"The Prom Goer's Interstellar Excursion","genre_ids":[12],"backdrop_path":null,"adult":false,"overview":"High schooler Bennett lands the prom date of his dreams, Sophie, just days before the dance. Not long after, he witnesses Sophie being abducted by aliens in the middle of the New Mexico desert.","release_date":""},{"vote_count":1,"id":460616,"video":false,"vote_average":4,"title":"Interstellar Civil War: Shadows of the Empire","popularity":0.6,"poster_path":"/7yTHKiVWZmUxgqGSzZv9yBx5bGI.jpg","original_language":"en","original_title":"Interstellar Civil War: Shadows of the Empire","genre_ids":[28,14,878],"backdrop_path":null,"adult":false,"overview":"The Imperial Empire is attacked by an Alliance of rebels led by fanatical mystics. The ruler, Empress Nobu, the 8th generation of her family, wants to execute a bold plan to rescue a cyborg, Leah C6, trapped on the battle ravaged planet Endor. The Empress believes Leah C6 holds the secret to destroying the Alliance of Rebels before their insurgency can kill millions of citizens of the Empire. She recruits her heroic fleet commander, Lord General Luka Raan and asks him to gather a team from the Empire's elite soldiers, the Galactic Rangers. Raan assembles the team in the ruins of Endor which was attacked by depraved Rebels and outlaws led by, Kindo-Ker, a fanatical mystic in Dark Energy. The Galactic Rangers begin a desperate search to find and rescue Leah C6 before the Alliance Rebels can.","release_date":"2018-04-15"},{"vote_count":11,"id":47662,"video":false,"vote_average":5.4,"title":"Trancers 4: Jack of Swords","popularity":3.313,"poster_path":"/69yr3oxBpSgua26RJkFmsm7plTG.jpg","original_language":"en","original_title":"Trancers 4: Jack of Swords","genre_ids":[878,28],"backdrop_path":"/5ism2HNUGuQi5a3ajYaN9ypMQMf.jpg","adult":false,"overview":"Jack is now back in the future. He had since lost Lena, and finds out that he's lost his other wife Alice to none other than Harris. While heading out for another assignment, something goes awry with the TCL chamber. Jack finds himself in a whole new dimension. He also runs across a different version of trancers. These guys seem to be in control of this planet. Jack manages to assist a rebel group known as the \"Tunnel Rats\" crush the rule of the evil Lord Calaban.","release_date":"1994-02-02"},{"vote_count":7,"id":47663,"video":false,"vote_average":5.3,"title":"Trancers 5: Sudden Deth","popularity":1.301,"poster_path":"/epMaTjPDMbgC8TbW1ZToh4RNv0i.jpg","original_language":"en","original_title":"Trancers 5: Sudden Deth","genre_ids":[28,53,878],"backdrop_path":"/an0xpUEX1P1BI80sCpkU1pSoREx.jpg","adult":false,"overview":"Jack Deth is back for one more round with the trancers. Jack must attempt to find his way home from the other-dimensional world of Orpheus, where magic works and the trancers were the ruling class (before Trancers IV, that is). Unfortunately, Jack's quest to find the mystical Tiamond in the Castle of Unrelenting Terror may be thwarted by the return of Caliban, king of the trancers who was thought dead.","release_date":"1994-11-04"},{"vote_count":1,"id":261443,"video":false,"vote_average":4.5,"title":"Angry Planet","popularity":0.623,"poster_path":"/ie5luS87ess1c5VgFhbGECJTQVK.jpg","original_language":"en","original_title":"Angry Planet","genre_ids":[878],"backdrop_path":"/u4JBwlGZN8hGeLxwu7Q0WmibACp.jpg","adult":false,"overview":"A criminal sentenced to life on a prison planet reveals his true purpose: to extract revenge on the killers who murdered his family.","release_date":"2008-01-01"}]} +{"results":[{"id":157336,"title":"Interstellar","year":2014,"overview":"Interstellar chronicles the adventures of a group of explorers who make use of a newly discovered wormhole to surpass the limitations on human space travel and conquer the vast distances involved in an interstellar voyage.","poster":"/nBNZadXqJSdt05SHLqgT0HuC5Gm.jpg","backdrop":"/xu9zaAevzQ5nnrsXN6JcahLnG4i.jpg","rank":8.2,"genres":null,"status":null,"tagline":null,"runtime":null,"imdb_id":null,"type":"movie","release_date":"2014-11-05T00:00:00.000Z"},{"id":301959,"title":"Interstellar: Nolan's Odyssey","year":2014,"overview":"Behind the scenes of Christopher Nolan's sci-fi drama, which stars Matthew McConaughey and Anne Hathaway","poster":"/xZwUIPqBHyJ2QIfMPANOZ1mAld6.jpg","backdrop":"/bT5jpIZE50MI0COE8pOeq0kMpQo.jpg","rank":7.9,"genres":null,"status":null,"tagline":null,"runtime":null,"imdb_id":null,"type":"movie","credits":1,"release_date":"2014-11-05T00:00:00.000Z"},{"id":398188,"title":"Interstellar Wars","year":2016,"overview":"For Millennia the Aliien force has watched and waited, a brooding menace that has now at last decided to take over the Earth. Communications systems worldwide are sent into chaos by a strange atmospheric interference and this has turned into a global phenomenon. A massive spaceship headed towards Earth and smaller spaceships began to cover entire cities around the world. Suddenly, the wonder turns into horror as the spaceships destroy the cities with energy weapons. When the world counterattacks, the alien ships are invincible to military weapons. The survivors have to use their wits to kill the aliens, or die.","poster":"/cjvTebuqD8wmhchHE286ltVcbX6.jpg","backdrop":"/yTnHa6lgIv8rNneSNBDkBe8MnZe.jpg","rank":3.8,"genres":null,"status":null,"tagline":null,"runtime":null,"imdb_id":null,"type":"movie","credits":2,"release_date":"2016-05-23T00:00:00.000Z"},{"id":287954,"title":"Lolita from Interstellar Space","year":2014,"overview":"An undeniably beautiful alien is sent to Earth to study the complex mating rituals of human beings, which leads to the young interstellar traveler experiencing the passion that surrounds the centuries-old ritual of the species.","poster":"/buoq7zYO4J3ttkEAqEMWelPDC0G.jpg","backdrop":"/mgb6tVEieDYLpQt666ACzGz5cyE.jpg","rank":7,"genres":null,"status":null,"tagline":null,"runtime":null,"imdb_id":null,"type":"movie","credits":3,"release_date":"2014-03-08T00:00:00.000Z"},{"id":336592,"title":"The Science of Interstellar","year":2014,"overview":"The science of Christopher Nolan's sci-fi, Interstellar.","poster":"/6KBD7YSBjCfgBgHwpsQo3G3GGdx.jpg","backdrop":null,"rank":7.8,"genres":null,"status":null,"tagline":null,"runtime":null,"imdb_id":null,"type":"movie","credits":4,"release_date":"2014-11-25T00:00:00.000Z"},{"id":529107,"title":"Inside Interstellar","year":2015,"overview":"Cast and crew of Christopher Nolan's 'Interstellar' discuss project origins, the film's imagery, ambitions, incorporating IMAX footage, the human element within the film, arm shooting locations outside of Calgary, the set construction and design, working with real corn, mechanical characters, including backstory, design, the blend of practical and digital effects in bringing them to life, the differences in the characters, the human performances behind the characters, the creative process behind the film's music, Icelandic locations, vehicle interiors, the processes of simulating the absence of gravity, the crucial end-film visuals and influence and inspiration for future generations","poster":"/vemBplPKQhVe5cRWL7kxtgp15Vq.jpg","backdrop":null,"rank":9,"genres":null,"status":null,"tagline":null,"runtime":null,"imdb_id":null,"type":"movie","credits":5,"release_date":"2015-03-31T00:00:00.000Z"},{"id":552531,"title":"The Prom Goer's Interstellar Excursion","year":null,"overview":"High schooler Bennett lands the prom date of his dreams, Sophie, just days before the dance. Not long after, he witnesses Sophie being abducted by aliens in the middle of the New Mexico desert.","poster":null,"backdrop":null,"rank":0,"genres":null,"status":null,"tagline":null,"runtime":null,"imdb_id":null,"type":"movie","credits":6,"release_date":null},{"id":460616,"title":"Interstellar Civil War: Shadows of the Empire","year":2018,"overview":"The Imperial Empire is attacked by an Alliance of rebels led by fanatical mystics. The ruler, Empress Nobu, the 8th generation of her family, wants to execute a bold plan to rescue a cyborg, Leah C6, trapped on the battle ravaged planet Endor. The Empress believes Leah C6 holds the secret to destroying the Alliance of Rebels before their insurgency can kill millions of citizens of the Empire. She recruits her heroic fleet commander, Lord General Luka Raan and asks him to gather a team from the Empire's elite soldiers, the Galactic Rangers. Raan assembles the team in the ruins of Endor which was attacked by depraved Rebels and outlaws led by, Kindo-Ker, a fanatical mystic in Dark Energy. The Galactic Rangers begin a desperate search to find and rescue Leah C6 before the Alliance Rebels can.","poster":"/1lDY7ZpEKOl3OaIQURjRbmFPfT8.jpg","backdrop":null,"rank":4,"genres":null,"status":null,"tagline":null,"runtime":null,"imdb_id":null,"type":"movie","credits":7,"release_date":"2018-04-15T00:00:00.000Z"},{"id":47662,"title":"Trancers 4: Jack of Swords","year":1994,"overview":"Jack is now back in the future. He had since lost Lena, and finds out that he's lost his other wife Alice to none other than Harris. While heading out for another assignment, something goes awry with the TCL chamber. Jack finds himself in a whole new dimension. He also runs across a different version of trancers. These guys seem to be in control of this planet. Jack manages to assist a rebel group known as the \"Tunnel Rats\" crush the rule of the evil Lord Calaban.","poster":"/69yr3oxBpSgua26RJkFmsm7plTG.jpg","backdrop":"/5ism2HNUGuQi5a3ajYaN9ypMQMf.jpg","rank":5.2,"genres":null,"status":null,"tagline":null,"runtime":null,"imdb_id":null,"type":"movie","credits":8,"release_date":"1994-02-02T00:00:00.000Z"},{"id":47663,"title":"Trancers 5: Sudden Deth","year":1994,"overview":"Jack Deth is back for one more round with the trancers. Jack must attempt to find his way home from the other-dimensional world of Orpheus, where magic works and the trancers were the ruling class (before Trancers IV, that is). Unfortunately, Jack's quest to find the mystical Tiamond in the Castle of Unrelenting Terror may be thwarted by the return of Caliban, king of the trancers who was thought dead.","poster":"/epMaTjPDMbgC8TbW1ZToh4RNv0i.jpg","backdrop":"/an0xpUEX1P1BI80sCpkU1pSoREx.jpg","rank":5,"genres":null,"status":null,"tagline":null,"runtime":null,"imdb_id":null,"type":"movie","credits":9,"release_date":"1994-11-04T00:00:00.000Z"},{"id":261443,"title":"Angry Planet","year":2008,"overview":"A criminal sentenced to life on a prison planet reveals his true purpose: to extract revenge on the killers who murdered his family.","poster":"/ie5luS87ess1c5VgFhbGECJTQVK.jpg","backdrop":"/u4JBwlGZN8hGeLxwu7Q0WmibACp.jpg","rank":4.5,"genres":null,"status":null,"tagline":null,"runtime":null,"imdb_id":null,"type":"movie","credits":10,"release_date":"2008-01-01T00:00:00.000Z"}],"page":1,"total_results":11,"total_pages":1} \ No newline at end of file From afb7af46b8888c9dfd4a9b31bb1820ea48b72e9d Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Fri, 26 Jul 2019 21:09:58 +0200 Subject: [PATCH 58/85] The test uses the cached to not need to query themoviedb, but the function that would in prod now saves a Class containing movie result and extras such as credits. --- .../test/fixtures/blade_runner_2049-info-success-response.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seasoned_api/test/fixtures/blade_runner_2049-info-success-response.json b/seasoned_api/test/fixtures/blade_runner_2049-info-success-response.json index 7e8e9f3..62eb96f 100644 --- a/seasoned_api/test/fixtures/blade_runner_2049-info-success-response.json +++ b/seasoned_api/test/fixtures/blade_runner_2049-info-success-response.json @@ -1 +1 @@ -{"adult":false,"backdrop_path":"/mVr0UiqyltcfqxbAUcLl9zWL8ah.jpg","belongs_to_collection":{"id":422837,"name":"Blade Runner Collection","poster_path":"/cWESb1o9lW2i2Z3Xllv9u40aNIk.jpg","backdrop_path":"/bSHZIvLoPBWyGLeiAudN1mXdvQX.jpg"},"budget":150000000,"genres":[{"id":9648,"name":"Mystery"},{"id":878,"name":"Science Fiction"},{"id":53,"name":"Thriller"}],"homepage":"http://bladerunnermovie.com/","id":335984,"imdb_id":"tt1856101","original_language":"en","original_title":"Blade Runner 2049","overview":"Thirty years after the events of the first film, a new blade runner, LAPD Officer K, unearths a long-buried secret that has the potential to plunge what's left of society into chaos. K's discovery leads him on a quest to find Rick Deckard, a former LAPD blade runner who has been missing for 30 years.","popularity":30.03,"poster_path":"/gajva2L0rPYkEWjzgFlBXCAVBE5.jpg","production_companies":[{"id":79529,"logo_path":"/gVN3k8emmKy4iV4KREWcCtxusZK.png","name":"Torridon Films","origin_country":"US"},{"id":101829,"logo_path":"/8IOjCvgjq0zTrtP91cWD3kL2jMK.png","name":"16:14 Entertainment","origin_country":"US"},{"id":1645,"logo_path":"/6Ry6uNBaa0IbbSs1XYIgX5DkA9r.png","name":"Scott Free Productions","origin_country":""},{"id":5,"logo_path":"/71BqEFAF4V3qjjMPCpLuyJFB9A.png","name":"Columbia Pictures","origin_country":"US"},{"id":1088,"logo_path":"/9WOE5AQUXbOtLU6GTwfjS8OMF0v.png","name":"Alcon Entertainment","origin_country":"US"},{"id":78028,"logo_path":"/sTFcDFfJaSVT3sv3DoaZDE4SlGB.png","name":"Thunderbird Entertainment","origin_country":"CA"},{"id":174,"logo_path":"/ky0xOc5OrhzkZ1N6KyUxacfQsCk.png","name":"Warner Bros. Pictures","origin_country":"US"}],"production_countries":[{"iso_3166_1":"CA","name":"Canada"},{"iso_3166_1":"US","name":"United States of America"},{"iso_3166_1":"HU","name":"Hungary"},{"iso_3166_1":"GB","name":"United Kingdom"}],"release_date":"2017-10-04","revenue":259239658,"runtime":163,"spoken_languages":[{"iso_639_1":"en","name":"English"},{"iso_639_1":"fi","name":"suomi"}],"status":"Released","tagline":"There's still a page left.","title":"Blade Runner 2049","video":false,"vote_average":7.3,"vote_count":5478} +[{"adult":false,"backdrop_path":"/mVr0UiqyltcfqxbAUcLl9zWL8ah.jpg","belongs_to_collection":{"id":422837,"name":"Blade Runner Collection","poster_path":"/cWESb1o9lW2i2Z3Xllv9u40aNIk.jpg","backdrop_path":"/bSHZIvLoPBWyGLeiAudN1mXdvQX.jpg"},"budget":150000000,"genres":[{"id":9648,"name":"Mystery"},{"id":878,"name":"Science Fiction"},{"id":53,"name":"Thriller"}],"homepage":"http://bladerunnermovie.com/","id":335984,"imdb_id":"tt1856101","original_language":"en","original_title":"Blade Runner 2049","overview":"Thirty years after the events of the first film, a new blade runner, LAPD Officer K, unearths a long-buried secret that has the potential to plunge what's left of society into chaos. K's discovery leads him on a quest to find Rick Deckard, a former LAPD blade runner who has been missing for 30 years.","popularity":30.03,"poster_path":"/gajva2L0rPYkEWjzgFlBXCAVBE5.jpg","production_companies":[{"id":79529,"logo_path":"/gVN3k8emmKy4iV4KREWcCtxusZK.png","name":"Torridon Films","origin_country":"US"},{"id":101829,"logo_path":"/8IOjCvgjq0zTrtP91cWD3kL2jMK.png","name":"16:14 Entertainment","origin_country":"US"},{"id":1645,"logo_path":"/6Ry6uNBaa0IbbSs1XYIgX5DkA9r.png","name":"Scott Free Productions","origin_country":""},{"id":5,"logo_path":"/71BqEFAF4V3qjjMPCpLuyJFB9A.png","name":"Columbia Pictures","origin_country":"US"},{"id":1088,"logo_path":"/9WOE5AQUXbOtLU6GTwfjS8OMF0v.png","name":"Alcon Entertainment","origin_country":"US"},{"id":78028,"logo_path":"/sTFcDFfJaSVT3sv3DoaZDE4SlGB.png","name":"Thunderbird Entertainment","origin_country":"CA"},{"id":174,"logo_path":"/ky0xOc5OrhzkZ1N6KyUxacfQsCk.png","name":"Warner Bros. Pictures","origin_country":"US"}],"production_countries":[{"iso_3166_1":"CA","name":"Canada"},{"iso_3166_1":"US","name":"United States of America"},{"iso_3166_1":"HU","name":"Hungary"},{"iso_3166_1":"GB","name":"United Kingdom"}],"release_date":"2017-10-04","revenue":259239658,"runtime":163,"spoken_languages":[{"iso_639_1":"en","name":"English"},{"iso_639_1":"fi","name":"suomi"}],"status":"Released","tagline":"There's still a page left.","title":"Blade Runner 2049","video":false,"vote_average":7.3,"vote_count":5478}] From 3b27af1f83fe765b2e3ea63270734d1c49f3329f Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Fri, 26 Jul 2019 21:52:20 +0200 Subject: [PATCH 59/85] Error handling for themoviedb api response codes that are not 200. Started with 401 and 404. See issue #116 for info. --- seasoned_api/src/tmdb/tmdb.js | 23 ++++++++++++++++--- .../webserver/controllers/info/movieInfo.js | 1 - .../controllers/request/requestTmdbId.js | 13 ++++++----- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/seasoned_api/src/tmdb/tmdb.js b/seasoned_api/src/tmdb/tmdb.js index 37011a8..8c16f40 100644 --- a/seasoned_api/src/tmdb/tmdb.js +++ b/seasoned_api/src/tmdb/tmdb.js @@ -2,6 +2,7 @@ const moviedb = require('km-moviedb'); const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); const convertTmdbToShow = require('src/tmdb/convertTmdbToShow'); const convertTmdbToPerson = require('src/tmdb/convertTmdbToPerson'); +const { tmdbInfo } = require('src/tmdb/types') class TMDB { constructor(cache, apiKey, tmdbLibrary) { @@ -86,7 +87,15 @@ class TMDB { return Promise.resolve() .then(() => this.cache.get(cacheKey)) .catch(() => Promise.all(requests)) - .catch((error) => { console.log(error); throw new Error('Could not find a movie with that id.'); }) + .catch(error => { + if (error.status === 401) { + throw new Error('Unathorized tmdb request, please check api key.') + } else if (error.status === 404) { + throw new Error(`Could not find a movie with id: ${identifier}`) + } + + throw new Error('Unexpected error has occured:', error.message) + }) .then(([movies, credits]) => this.cache.set(cacheKey, [movies, credits])) .then(([movies, credits]) => convertTmdbToMovie(movies, credits)) } @@ -109,8 +118,16 @@ class TMDB { return Promise.resolve() .then(() => this.cache.get(cacheKey)) - .catch(() => Promise.all(requests)) - .catch(() => { throw new Error('Could not find a show with that id.'); }) + .catch(() => Promise.all(requests)) + .catch(error => { + if (error.status === 401) { + throw new Error('Unathorized tmdb request, please check api key.') + } else if (error.status === 404) { + throw new Error(`Could not find a show with id: ${identifier}`) + } + + throw new Error('Unexpected error has occured:', error.message) + }) .then(([shows, credits]) => this.cache.set(cacheKey, [shows, credits])) .then(([shows, credits]) => convertTmdbToShow(shows, credits)) } diff --git a/seasoned_api/src/webserver/controllers/info/movieInfo.js b/seasoned_api/src/webserver/controllers/info/movieInfo.js index 896f656..8b2f565 100644 --- a/seasoned_api/src/webserver/controllers/info/movieInfo.js +++ b/seasoned_api/src/webserver/controllers/info/movieInfo.js @@ -20,7 +20,6 @@ async function movieInfoController(req, res) { plex.existsInPlex(movie) .catch((error) => { console.log('Error when searching plex'); }) .then(() => { - console.log('movie', movie) res.send(movie); }).catch((error) => { res.status(404).send({ success: false, error: error.message }); diff --git a/seasoned_api/src/webserver/controllers/request/requestTmdbId.js b/seasoned_api/src/webserver/controllers/request/requestTmdbId.js index 81092b4..5604252 100644 --- a/seasoned_api/src/webserver/controllers/request/requestTmdbId.js +++ b/seasoned_api/src/webserver/controllers/request/requestTmdbId.js @@ -22,30 +22,31 @@ const tmdbShowInfo = (id) => { */ function requestTmdbIdController(req, res) { const { id, type } = req.body - console.log('body', req.body) - console.log('id & type', id, type) const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; const user_agent = req.headers['user-agent']; const user = req.loggedInUser; + let mediaFunction = undefined + if (id === undefined || type === undefined) { + res.status(422).send({ success: false, message: "'Missing parameteres: 'id' and/or 'type'"}) + } + if (type === 'movie') { - console.log('movie') mediaFunction = tmdbMovieInfo } else if (type === 'show') { - console.log('show') mediaFunction = tmdbShowInfo } else { res.status(422).send({ success: false, error: 'Incorrect type. Allowed types: "movie" or "show"'}) } mediaFunction(id) - .catch((error) => { console.error(error); res.status(404).send({ success: false, error: 'Id not found' }) }) + // .catch((error) => { console.error(error); res.status(404).send({ success: false, error: 'Id not found' }) }) .then((tmdbMedia) => request.requestFromTmdb(tmdbMedia, ip, user_agent, user)) .then(() => res.send({success: true, message: 'Request has been submitted.'})) .catch((error) => { - res.status(501).send({ success: false, error: error.message }); + res.send({ success: false, error: error.message }); }) } From 23f99112374d675b7e7b1a6f60064a4332bc28e2 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Fri, 26 Jul 2019 21:54:13 +0200 Subject: [PATCH 60/85] Throw errors when failing to create user --- seasoned_api/src/user/userRepository.js | 1 + 1 file changed, 1 insertion(+) diff --git a/seasoned_api/src/user/userRepository.js b/seasoned_api/src/user/userRepository.js index 2e4ebbd..c2cf6b2 100644 --- a/seasoned_api/src/user/userRepository.js +++ b/seasoned_api/src/user/userRepository.js @@ -26,6 +26,7 @@ class UserRepository { if (error.name === 'AssertionError' || error.message.endsWith('user_name')) { throw new Error('That username is already registered'); } + throw Error(error) }); } From 04ba094a14ad79b7fa154516b961aeceecf914ee Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Fri, 26 Jul 2019 21:55:59 +0200 Subject: [PATCH 61/85] Throw more errors and cleanup some unmerged code --- seasoned_api/src/tmdb/convertTmdbToMovie.js | 16 +++++++-------- .../src/tmdb/convertTmdbToSeasoned.js | 20 +------------------ seasoned_api/src/user/token.js | 2 +- seasoned_api/src/user/userSecurity.js | 4 ++-- 4 files changed, 12 insertions(+), 30 deletions(-) diff --git a/seasoned_api/src/tmdb/convertTmdbToMovie.js b/seasoned_api/src/tmdb/convertTmdbToMovie.js index d9e4d5e..9d06ca0 100644 --- a/seasoned_api/src/tmdb/convertTmdbToMovie.js +++ b/seasoned_api/src/tmdb/convertTmdbToMovie.js @@ -11,35 +11,35 @@ function convertTmdbToMovie(tmdbMovie, credits=undefined) { movie.credits = credits; } - if (tmdbMovie.release_date !== undefined) { + if (tmdbMovie.release_date !== undefined && tmdbMovie.genres) { movie.release_date = new Date(tmdbMovie.release_date); movie.year = movie.release_date.getFullYear(); } - if (tmdbMovie.poster_path !== undefined) { + if (tmdbMovie.poster_path !== undefined && tmdbMovie.genres) { movie.poster = tmdbMovie.poster_path; } - if (tmdbMovie.backdrop_path !== undefined) { + if (tmdbMovie.backdrop_path !== undefined && tmdbMovie.genres) { movie.backdrop = tmdbMovie.backdrop_path; } - if (tmdbMovie.status !== undefined) { + if (tmdbMovie.status !== undefined && tmdbMovie.genres) { movie.status = tmdbMovie.status; } - if (tmdbMovie.genres !== undefined) { + if (tmdbMovie.genres !== undefined && tmdbMovie.genres) { movie.genres = tmdbMovie.genres.map(genre => genre.name); } - if (tmdbMovie.tagline !== undefined) { + if (tmdbMovie.tagline !== undefined && tmdbMovie.genres) { movie.tagline = tmdbMovie.tagline; } - if (tmdbMovie.runtime !== undefined) { + if (tmdbMovie.runtime !== undefined && tmdbMovie.genres) { movie.runtime = tmdbMovie.runtime; } - if (tmdbMovie.imdb_id !== undefined) { + if (tmdbMovie.imdb_id !== undefined && tmdbMovie.genres) { movie.imdb_id = tmdbMovie.imdb_id; } diff --git a/seasoned_api/src/tmdb/convertTmdbToSeasoned.js b/seasoned_api/src/tmdb/convertTmdbToSeasoned.js index b89fd44..cd552c2 100644 --- a/seasoned_api/src/tmdb/convertTmdbToSeasoned.js +++ b/seasoned_api/src/tmdb/convertTmdbToSeasoned.js @@ -15,25 +15,7 @@ function convertType(tmdbType) { } function convertTmdbToMovie(tmdb) { - const year = - const movie = new Movie(); - let seasoned = undefined; - - if (tmdb.id && tmdb.title && tmdb.release_date) { - const year = tmdb.release_date.getFullYear(); - seasoned = new Movie(tmdb.id, tmdb.title, year); - } - else if (tmdb.id && tmdb.name && tmdb.first_air_date) { - const year = tmdb.first_air_date.getFullYear(); - seasoned = new Show(tmdb.id, tmdb.name, year); - seasoned.seasons = tmdb.number_of_season; - seasoned.episodes = tmdb.episodes; - return - } -} - - - const title = tmdb.title || tmdb.name; + const title = tmdb.title || tmdb.name; const year = translateYear(tmdb.release_date || tmdb.first_air_date); const type = manualType || convertType(tmdb.type) || 'movie'; diff --git a/seasoned_api/src/user/token.js b/seasoned_api/src/user/token.js index 0590dc3..f8e0112 100644 --- a/seasoned_api/src/user/token.js +++ b/seasoned_api/src/user/token.js @@ -33,7 +33,7 @@ class Token { let username = null; const token = jwt.verify(jwtToken, secret, { clockTolerance: 10000 }) - if (token.username === undefined) + if (token.username === undefined || token.username === null) throw new Error('Malformed token') username = token.username diff --git a/seasoned_api/src/user/userSecurity.js b/seasoned_api/src/user/userSecurity.js index 571ec58..d878664 100644 --- a/seasoned_api/src/user/userSecurity.js +++ b/seasoned_api/src/user/userSecurity.js @@ -21,7 +21,7 @@ class UserSecurity { return Promise.resolve() .then(() => this.userRepository.create(user)) .then(() => UserSecurity.hashPassword(clearPassword)) - .then(hash => this.userRepository.changePassword(user, hash)); + .then(hash => this.userRepository.changePassword(user, hash)) } } @@ -61,7 +61,7 @@ class UserSecurity { */ static hashPassword(clearPassword) { return new Promise((resolve) => { - const salatRounds = 10; + const saltRounds = 10; bcrypt.hash(clearPassword, saltRounds, (error, hash) => { resolve(hash); }); From 8e23ae5a279232a682547f7459f59af8f9930d66 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sat, 27 Jul 2019 01:28:41 +0200 Subject: [PATCH 62/85] Added babel for ES6 functionality. In this case the new import statements --- seasoned_api/package.json | 8 ++++++-- seasoned_api/src/database/sqliteDatabase.js | 8 ++++---- seasoned_api/src/tmdb/.babelrc | 3 +++ seasoned_api/src/tmdb/convertTmdbToMovie.js | 2 +- seasoned_api/src/tmdb/convertTmdbToPerson.js | 2 +- seasoned_api/src/tmdb/convertTmdbToSeasoned.js | 1 - seasoned_api/src/tmdb/convertTmdbToShow.js | 2 +- seasoned_api/src/tmdb/tmdb.js | 2 +- seasoned_api/src/tmdb/types.js | 5 +++++ 9 files changed, 22 insertions(+), 11 deletions(-) create mode 100644 seasoned_api/src/tmdb/.babelrc create mode 100644 seasoned_api/src/tmdb/types.js diff --git a/seasoned_api/package.json b/seasoned_api/package.json index 8b2db1b..9f69350 100644 --- a/seasoned_api/package.json +++ b/seasoned_api/package.json @@ -7,8 +7,8 @@ }, "main": "webserver/server.js", "scripts": { - "start": "cross-env SEASONED_CONFIG=conf/development.json PROD=true NODE_PATH=. node src/webserver/server.js", - "test": "cross-env SEASONED_CONFIG=conf/test.json NODE_PATH=. mocha --recursive test/unit test/system", + "start": "cross-env SEASONED_CONFIG=conf/development.json PROD=true NODE_PATH=. babel-node src/webserver/server.js", + "test": "cross-env SEASONED_CONFIG=conf/test.json NODE_PATH=. mocha --require @babel/register --recursive test/unit test/system", "coverage": "cross-env SEASONED_CONFIG=conf/test.json NODE_PATH=. nyc mocha --recursive test && nyc report --reporter=text-lcov | coveralls", "lint": "./node_modules/.bin/eslint src/", "update": "cross-env SEASONED_CONFIG=conf/development.json NODE_PATH=. node src/plex/updateRequestsInPlex.js", @@ -32,6 +32,10 @@ "sqlite3": "^4.0.0" }, "devDependencies": { + "@babel/core": "^7.5.5", + "@babel/node": "^7.5.5", + "@babel/preset-env": "^7.5.5", + "@babel/register": "^7.5.5", "coveralls": "^3.0.0", "documentation": "^12.0.3", "eslint": "^4.9.0", diff --git a/seasoned_api/src/database/sqliteDatabase.js b/seasoned_api/src/database/sqliteDatabase.js index e6b8bf7..aee129a 100644 --- a/seasoned_api/src/database/sqliteDatabase.js +++ b/seasoned_api/src/database/sqliteDatabase.js @@ -25,7 +25,7 @@ class SqliteDatabase { * @param {Array} parameters in the SQL query * @returns {Promise} */ - async run(sql, parameters) { + run(sql, parameters) { return new Promise((resolve, reject) => { this.connection.run(sql, parameters, (error, result) => { if (error) @@ -41,7 +41,7 @@ class SqliteDatabase { * @param {Array} parameters in the SQL query * @returns {Promise} */ - async all(sql, parameters) { + all(sql, parameters) { return new Promise((resolve, reject) => { this.connection.all(sql, parameters, (err, rows) => { if (err) { @@ -58,7 +58,7 @@ class SqliteDatabase { * @param {Array} parameters in the SQL query * @returns {Promise} */ - async get(sql, parameters) { + get(sql, parameters) { return new Promise((resolve, reject) => { this.connection.get(sql, parameters, (err, rows) => { if (err) { @@ -75,7 +75,7 @@ class SqliteDatabase { * @param {Array} parameters in the SQL query * @returns {Promise} */ - async execute(sql) { + execute(sql) { return new Promise(resolve => { this.connection.exec(sql, (err, database) => { if (err) { diff --git a/seasoned_api/src/tmdb/.babelrc b/seasoned_api/src/tmdb/.babelrc new file mode 100644 index 0000000..1320b9a --- /dev/null +++ b/seasoned_api/src/tmdb/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/preset-env"] +} diff --git a/seasoned_api/src/tmdb/convertTmdbToMovie.js b/seasoned_api/src/tmdb/convertTmdbToMovie.js index 9d06ca0..2b54c0f 100644 --- a/seasoned_api/src/tmdb/convertTmdbToMovie.js +++ b/seasoned_api/src/tmdb/convertTmdbToMovie.js @@ -1,4 +1,4 @@ -const Movie = require('src/tmdb/types/movie'); +import { Movie } from './types' const tmdbSwitcher = (tmdbMovie, property) => tmdbMovie[property] diff --git a/seasoned_api/src/tmdb/convertTmdbToPerson.js b/seasoned_api/src/tmdb/convertTmdbToPerson.js index 32e6911..3626ff4 100644 --- a/seasoned_api/src/tmdb/convertTmdbToPerson.js +++ b/seasoned_api/src/tmdb/convertTmdbToPerson.js @@ -1,4 +1,4 @@ -const Person = require('src/tmdb/types/person'); +import { Person } from './types' const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); function convertTmdbToPerson(tmdbPerson, cast=undefined) { diff --git a/seasoned_api/src/tmdb/convertTmdbToSeasoned.js b/seasoned_api/src/tmdb/convertTmdbToSeasoned.js index cd552c2..0ce7886 100644 --- a/seasoned_api/src/tmdb/convertTmdbToSeasoned.js +++ b/seasoned_api/src/tmdb/convertTmdbToSeasoned.js @@ -1,5 +1,4 @@ const TMDB = require('src/media_classes/tmdb'); -const Movie = require('src/types/movie'); function translateYear(tmdbReleaseDate) { return new Date(tmdbReleaseDate).getFullYear(); diff --git a/seasoned_api/src/tmdb/convertTmdbToShow.js b/seasoned_api/src/tmdb/convertTmdbToShow.js index 0bb0481..1a25fe5 100644 --- a/seasoned_api/src/tmdb/convertTmdbToShow.js +++ b/seasoned_api/src/tmdb/convertTmdbToShow.js @@ -1,4 +1,4 @@ -const Show = require('src/tmdb/types/show'); +import { Show } from './types' function convertTmdbToShow(tmdbShow, credits=undefined) { const show = new Show(tmdbShow.id, tmdbShow.name) diff --git a/seasoned_api/src/tmdb/tmdb.js b/seasoned_api/src/tmdb/tmdb.js index 8c16f40..3675dd8 100644 --- a/seasoned_api/src/tmdb/tmdb.js +++ b/seasoned_api/src/tmdb/tmdb.js @@ -2,7 +2,7 @@ const moviedb = require('km-moviedb'); const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); const convertTmdbToShow = require('src/tmdb/convertTmdbToShow'); const convertTmdbToPerson = require('src/tmdb/convertTmdbToPerson'); -const { tmdbInfo } = require('src/tmdb/types') +// const { tmdbInfo } = require('src/tmdb/types') class TMDB { constructor(cache, apiKey, tmdbLibrary) { diff --git a/seasoned_api/src/tmdb/types.js b/seasoned_api/src/tmdb/types.js new file mode 100644 index 0000000..5c8891e --- /dev/null +++ b/seasoned_api/src/tmdb/types.js @@ -0,0 +1,5 @@ +import Movie from './types/movie.js' +import Show from './types/show.js' +import Person from './types/person.js' + +module.exports = { Movie, Show, Person } From 7ede37039a6d58ed9affe16a1c24a96d2dd42361 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sat, 27 Jul 2019 01:30:08 +0200 Subject: [PATCH 63/85] info-success-response is now a list so need this reflected in this test also. Changed the port we test for to whats in our config/test.jsono --- seasoned_api/test/system/asADeveloperIWantTheServerToStart.js | 4 ++-- seasoned_api/test/unit/tmdb/testConvertTmdbToMovie.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/seasoned_api/test/system/asADeveloperIWantTheServerToStart.js b/seasoned_api/test/system/asADeveloperIWantTheServerToStart.js index 1c317bd..1544b94 100644 --- a/seasoned_api/test/system/asADeveloperIWantTheServerToStart.js +++ b/seasoned_api/test/system/asADeveloperIWantTheServerToStart.js @@ -5,8 +5,8 @@ describe('As a developer I want the server to start', () => { beforeEach(() => this.server = require('src/webserver/server')); - it('should listen on port 31459', (done) => { - net.createConnection(31459, done); + it('should listen on port 31400', (done) => { + net.createConnection(31400, done); }); afterEach(() => diff --git a/seasoned_api/test/unit/tmdb/testConvertTmdbToMovie.js b/seasoned_api/test/unit/tmdb/testConvertTmdbToMovie.js index 64c2e4f..cf8f3ba 100644 --- a/seasoned_api/test/unit/tmdb/testConvertTmdbToMovie.js +++ b/seasoned_api/test/unit/tmdb/testConvertTmdbToMovie.js @@ -3,7 +3,7 @@ const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); const bladeRunnerQuerySuccess = require('test/fixtures/blade_runner_2049-info-success-response.json') describe('Convert tmdb movieInfo to movie', () => { - beforeEach(() => this.bladeRunnerTmdbMovie = bladeRunnerQuerySuccess); + beforeEach(() => [this.bladeRunnerTmdbMovie] = bladeRunnerQuerySuccess); it('should translate the tmdb release date to movie year', () => { const bladeRunner = convertTmdbToMovie(this.bladeRunnerTmdbMovie); From 5d2e375213bf6d201c4b5879617c6d57966849a3 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sat, 27 Jul 2019 01:34:15 +0200 Subject: [PATCH 64/85] Upgraded node version for travis from 8 to 11 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 02a123a..bfc0952 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: node_js -node_js: '8.7.0' +node_js: '11.9.0' git: submodules: true script: From 81e9fe5b1543502186ce16050fc2959983a4f1fe Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sat, 27 Jul 2019 01:42:44 +0200 Subject: [PATCH 65/85] Testing for a running application is a bit weird, disabling it for now --- seasoned_api/test/system/asADeveloperIWantTheServerToStart.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seasoned_api/test/system/asADeveloperIWantTheServerToStart.js b/seasoned_api/test/system/asADeveloperIWantTheServerToStart.js index 1544b94..f0819a7 100644 --- a/seasoned_api/test/system/asADeveloperIWantTheServerToStart.js +++ b/seasoned_api/test/system/asADeveloperIWantTheServerToStart.js @@ -1,7 +1,7 @@ /* eslint-disable no-return-assign */ const net = require('net'); -describe('As a developer I want the server to start', () => { +xdescribe('As a developer I want the server to start', () => { beforeEach(() => this.server = require('src/webserver/server')); From 30682814610905ab70dfb57c5878e3377a90288e Mon Sep 17 00:00:00 2001 From: Kevin Date: Sat, 27 Jul 2019 01:55:43 +0200 Subject: [PATCH 66/85] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b79cf95..fefe130 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ Travis CI - - + + From 53228a2662ee898b204d79bfa6afd54f91fc5a58 Mon Sep 17 00:00:00 2001 From: snyk-test Date: Fri, 26 Jul 2019 23:56:40 +0000 Subject: [PATCH 67/85] fix: client/package.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-JSYAML-173999 - https://snyk.io/vuln/SNYK-JS-JSYAML-174129 --- client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/package.json b/client/package.json index 3529ce3..10fca34 100644 --- a/client/package.json +++ b/client/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "clean-webpack-plugin": "^0.1.17", - "css-loader": "^0.28.4", + "css-loader": "^1.0.0", "html-webpack-plugin": "^2.28.0", "path": "^0.12.7", "react": "^15.6.1", From ab6144eb810160862015b1d6a19ee19750cb40a1 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sat, 27 Jul 2019 02:03:11 +0200 Subject: [PATCH 68/85] Update yarn lock, updated coveralls and mocha run under coverage command now uses required babel register --- seasoned_api/package.json | 4 +- seasoned_api/yarn.lock | 4847 +++++++++++++++++++++++++++++++------ 2 files changed, 4127 insertions(+), 724 deletions(-) diff --git a/seasoned_api/package.json b/seasoned_api/package.json index 9f69350..01e852c 100644 --- a/seasoned_api/package.json +++ b/seasoned_api/package.json @@ -9,7 +9,7 @@ "scripts": { "start": "cross-env SEASONED_CONFIG=conf/development.json PROD=true NODE_PATH=. babel-node src/webserver/server.js", "test": "cross-env SEASONED_CONFIG=conf/test.json NODE_PATH=. mocha --require @babel/register --recursive test/unit test/system", - "coverage": "cross-env SEASONED_CONFIG=conf/test.json NODE_PATH=. nyc mocha --recursive test && nyc report --reporter=text-lcov | coveralls", + "coverage": "cross-env SEASONED_CONFIG=conf/test.json NODE_PATH=. nyc mocha --require @babel/register --recursive test && nyc report --reporter=text-lcov | coveralls", "lint": "./node_modules/.bin/eslint src/", "update": "cross-env SEASONED_CONFIG=conf/development.json NODE_PATH=. node src/plex/updateRequestsInPlex.js", "docs": "yarn apiDocs; yarn classDocs", @@ -36,7 +36,7 @@ "@babel/node": "^7.5.5", "@babel/preset-env": "^7.5.5", "@babel/register": "^7.5.5", - "coveralls": "^3.0.0", + "coveralls": "^3.0.5", "documentation": "^12.0.3", "eslint": "^4.9.0", "eslint-config-airbnb-base": "^12.1.0", diff --git a/seasoned_api/yarn.lock b/seasoned_api/yarn.lock index 8bc54e0..8e68ea2 100644 --- a/seasoned_api/yarn.lock +++ b/seasoned_api/yarn.lock @@ -2,42 +2,1036 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.1.2", "@babel/core@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" + integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.5.5" + "@babel/helpers" "^7.5.5" + "@babel/parser" "^7.5.5" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.1.3", "@babel/generator@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" + integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== + dependencies: + "@babel/types" "^7.5.5" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-builder-react-jsx@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" + integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== + dependencies: + "@babel/types" "^7.3.0" + esutils "^2.0.0" + +"@babel/helper-call-delegate@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" + integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-create-class-features-plugin@^7.4.4", "@babel/helper-create-class-features-plugin@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz#401f302c8ddbc0edd36f7c6b2887d8fa1122e5a4" + integrity sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-member-expression-to-functions" "^7.5.5" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.5.5" + "@babel/helper-split-export-declaration" "^7.4.4" + +"@babel/helper-define-map@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" + integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.5.5" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" + integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-member-expression-to-functions@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" + integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA== + dependencies: + "@babel/types" "^7.5.5" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" + integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/types" "^7.5.5" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" + integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" + integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.5.5" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-wrap-function@^7.1.0", "@babel/helper-wrap-function@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/helpers@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.5.tgz#63908d2a73942229d1e6685bc2a0e730dde3b75e" + integrity sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g== + dependencies: + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" + +"@babel/highlight@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" + integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/node@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.5.5.tgz#5db48a3bcee64d9eda6474f2a0a55b235d0438b5" + integrity sha512-xsW6il+yY+lzXMsQuvIJNA7tU8ix/f4G6bDt4DrnCkVpsR6clk9XgEbp7QF+xGNDdoD7M7QYokCH83pm+UjD0w== + dependencies: + "@babel/polyfill" "^7.0.0" + "@babel/register" "^7.5.5" + commander "^2.8.1" + lodash "^4.17.13" + node-environment-flags "^1.0.5" + v8flags "^3.1.1" + +"@babel/parser@7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.3.tgz#2c92469bac2b7fbff810b67fca07bd138b48af77" + integrity sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w== + +"@babel/parser@^7.4.4", "@babel/parser@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" + integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-class-properties@^7.1.0": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz#a974cfae1e37c3110e71f3c6a2e48b8e71958cd4" + integrity sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.5.5" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-proposal-decorators@^7.1.2": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.4.tgz#de9b2a1a8ab0196f378e2a82f10b6e2a36f21cc0" + integrity sha512-z7MpQz3XC/iQJWXH9y+MaWcLPNSMY9RQSthrLzak8R8hCj0fuyNk+Dzi9kfNe/JxxlWQ2g7wkABbgWjW36MTcw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-decorators" "^7.2.0" + +"@babel/plugin-proposal-do-expressions@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.5.0.tgz#ceb594d4a618545b00aa0b5cd61cad4aaaeb7a5a" + integrity sha512-xe0QQrhm+DGj6H23a6XtwkJNimy1fo71O/YVBfrfvfSl0fsq9T9dfoQBIY4QceEIdUo7u9s7OPEdsWEuizfGeg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-do-expressions" "^7.2.0" + +"@babel/plugin-proposal-dynamic-import@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" + integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + +"@babel/plugin-proposal-export-default-from@^7.0.0": + version "7.5.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.5.2.tgz#2c0ac2dcc36e3b2443fead2c3c5fc796fb1b5145" + integrity sha512-wr9Itk05L1/wyyZKVEmXWCdcsp/e185WUNl6AfYZeEKYaUPPvHXRDqO5K1VH7/UamYqGJowFRuCv30aDYZawsg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.2.0" + +"@babel/plugin-proposal-export-namespace-from@^7.0.0": + version "7.5.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.5.2.tgz#ccd5ed05b06d700688ff1db01a9dd27155e0d2a0" + integrity sha512-TKUdOL07anjZEbR1iSxb5WFh810KyObdd29XLFLGo1IDsSuGrjH3ouWSbAxHNmrVKzr9X71UYl2dQ7oGGcRp0g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-export-namespace-from" "^7.2.0" + +"@babel/plugin-proposal-function-bind@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.2.0.tgz#94dc2cdc505cafc4e225c0014335a01648056bf7" + integrity sha512-qOFJ/eX1Is78sywwTxDcsntLOdb5ZlHVVqUz5xznq8ldAfOVIyZzp1JE2rzHnaksZIhrqMrwIpQL/qcEprnVbw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-function-bind" "^7.2.0" + +"@babel/plugin-proposal-function-sent@^7.1.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.5.0.tgz#39233aa801145e7d8072077cdb2d25f781c1ffd7" + integrity sha512-JXdfiQpKoC6UgQliZkp3NX7K3MVec1o1nfTWiCCIORE5ag/QZXhL0aSD8/Y2K+hIHonSTxuJF9rh9zsB6hBi2A== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-wrap-function" "^7.2.0" + "@babel/plugin-syntax-function-sent" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.0.0", "@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-logical-assignment-operators@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.2.0.tgz#8a5cea6c42a7c87446959e02fff5fad012c56f57" + integrity sha512-0w797xwdPXKk0m3Js74hDi0mCTZplIu93MOSfb1ZLd/XFe3abWypx1QknVk0J+ohnsjYpvjH4Gwfo2i3RicB6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.2.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.4.4.tgz#41c360d59481d88e0ce3a3f837df10121a769b39" + integrity sha512-Amph7Epui1Dh/xxUxS2+K22/MUi6+6JVTvy3P58tja3B6yKTSjwwx0/d83rF7551D6PVSSoplQb8GCwqec7HRw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.2.0" + +"@babel/plugin-proposal-numeric-separator@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.2.0.tgz#646854daf4cd22fd6733f6076013a936310443ac" + integrity sha512-DohMOGDrZiMKS7LthjUZNNcWl8TAf5BZDwZAH4wpm55FuJTHgfqPGdibg7rZDmont/8Yg0zA03IgT6XLeP+4sg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-numeric-separator" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58" + integrity sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-optional-chaining@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.2.0.tgz#ae454f4c21c6c2ce8cb2397dc332ae8b420c5441" + integrity sha512-ea3Q6edZC/55wEBVZAEz42v528VulyO0eir+7uky/sT4XRcdkWJcFi1aPtitTlwUzGnECWJNExWww1SStt+yWw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.2.0" + +"@babel/plugin-proposal-pipeline-operator@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.5.0.tgz#4100ec55ef4f6a4c2490b5f5a4f2a22dfa272c06" + integrity sha512-HFYuu/yGnkn69ligXxU0ohOVvQDsMNOUJs/c4PYLUVS6ntCYOyGmRQQaSYJARJ9rvc7/ulZKIzxd4wk91hN63A== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-pipeline-operator" "^7.5.0" + +"@babel/plugin-proposal-throw-expressions@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.2.0.tgz#2d9e452d370f139000e51db65d0a85dc60c64739" + integrity sha512-adsydM8DQF4i5DLNO4ySAU5VtHTPewOtNBV3u7F4lNMPADFF9bWQ+iDtUUe8+033cYCUz+bFlQdXQJmJOwoLpw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-throw-expressions" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" + integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-decorators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz#c50b1b957dcc69e4b1127b65e1c33eef61570c1b" + integrity sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-do-expressions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.2.0.tgz#f3d4b01be05ecde2892086d7cfd5f1fa1ead5a2a" + integrity sha512-/u4rJ+XEmZkIhspVuKRS+7WLvm7Dky9j9TvGK5IgId8B3FKir9MG+nQxDZ9xLn10QMBvW58dZ6ABe2juSmARjg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" + integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-export-default-from@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.2.0.tgz#edd83b7adc2e0d059e2467ca96c650ab6d2f3820" + integrity sha512-c7nqUnNST97BWPtoe+Ssi+fJukc9P9/JMZ71IOMNQWza2E+Psrd46N6AEvtw6pqK+gt7ChjXyrw4SPDO79f3Lw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-export-namespace-from@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.2.0.tgz#8d257838c6b3b779db52c0224443459bd27fb039" + integrity sha512-1zGA3UNch6A+A11nIzBVEaE3DDJbjfB+eLIcf0GGOh/BJr/8NxL3546MGhV/r0RhH4xADFIEso39TKCfEMlsGA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-flow@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz#a765f061f803bc48f240c26f8747faf97c26bf7c" + integrity sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-function-bind@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.2.0.tgz#68fe85b0c0da67125f87bf239c68051b06c66309" + integrity sha512-/WzU1lLU2l0wDfB42Wkg6tahrmtBbiD8C4H6EGSX0M4GAjzN6JiOpq/Uh8G6GSoR6lPMvhjM0MNiV6znj6y/zg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-function-sent@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.2.0.tgz#91474d4d400604e4c6cbd4d77cd6cb3b8565576c" + integrity sha512-2MOVuJ6IMAifp2cf0RFkHQaOvHpbBYyWCvgtF/WVqXhTd7Bgtov8iXVCadLXp2FN1BrI2EFl+JXuwXy0qr3KoQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-import-meta@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.2.0.tgz#2333ef4b875553a3bcd1e93f8ebc09f5b9213a40" + integrity sha512-Hq6kFSZD7+PHkmBN8bCpHR6J8QEoCuEV/B38AIQscYjgMZkGlXB7cHNFzP5jR4RCh5545yP1ujHdmO7hAgKtBA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-jsx@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" + integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.2.0.tgz#fcab7388530e96c6f277ce494c55caa6c141fcfb" + integrity sha512-l/NKSlrnvd73/EL540t9hZhcSo4TULBrIPs9Palju8Oc/A8DXDO+xQf04whfeuZLpi8AuIvCAdpKmmubLN4EfQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.2.0.tgz#f75083dfd5ade73e783db729bbd87e7b9efb7624" + integrity sha512-lRCEaKE+LTxDQtgbYajI04ddt6WW0WJq57xqkAZ+s11h4YgfRHhVA/Y2VhfPzzFD4qeLHWg32DMp9HooY4Kqlg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-numeric-separator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.2.0.tgz#7470fe070c2944469a756752a69a6963135018be" + integrity sha512-DroeVNkO/BnGpL2R7+ZNZqW+E24aR/4YWxP3Qb15d6lPU8KDzF8HlIUIRCOJRn4X77/oyW4mJY+7FHfY82NLtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-chaining@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.2.0.tgz#a59d6ae8c167e7608eaa443fda9fa8fa6bf21dff" + integrity sha512-HtGCtvp5Uq/jH/WNUPkK6b7rufnCPLLlDAFN7cmACoIjaOOiXxUt3SswU5loHqrhtqTsa/WoLQ1OQ1AGuZqaWA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-pipeline-operator@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.5.0.tgz#8ea7c2c22847c797748bf07752722a317079dc1e" + integrity sha512-5FVxPiMTMXWk4R7Kq9pt272nDu8VImJdaIzvXFSTcXFbgKWWaOdbic12TvUvl6cK+AE5EgnhwvxuWik4ZYYdzg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-throw-expressions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.2.0.tgz#79001ee2afe1b174b1733cdc2fc69c9a46a0f1f8" + integrity sha512-ngwynuqu1Rx0JUS9zxSDuPgW1K8TyVZCi2hHehrL4vyjqE7RGoNHWlZsS7KQT2vw9Yjk4YLa0+KldBXTRdPLRg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" + integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz#a35f395e5402822f10d2119f6f8e045e3639a2ce" + integrity sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" + integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.5.5" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.5.5" + "@babel/helper-split-export-declaration" "^7.4.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a" + integrity sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" + integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-transform-duplicate-keys@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" + integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz#d267a081f49a8705fc9146de0768c6b58dccd8f7" + integrity sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.2.0" + +"@babel/plugin-transform-for-of@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" + integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" + integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" + integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-commonjs@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" + integrity sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ== + dependencies: + "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-systemjs@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" + integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" + integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== + dependencies: + regexp-tree "^0.1.6" + +"@babel/plugin-transform-new-target@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" + integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" + integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.5.5" + +"@babel/plugin-transform-parameters@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" + integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== + dependencies: + "@babel/helper-call-delegate" "^7.4.4" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" + integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" + integrity sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz#583b10c49cf057e237085bcbd8cc960bd83bd96b" + integrity sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" + integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== + dependencies: + "@babel/helper-builder-react-jsx" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-regenerator@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-reserved-words@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" + integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" + integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" + integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/polyfill@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.4.4.tgz#78801cf3dbe657844eeabf31c1cae3828051e893" + integrity sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.2" + +"@babel/preset-env@^7.1.0", "@babel/preset-env@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.5.5.tgz#bc470b53acaa48df4b8db24a570d6da1fef53c9a" + integrity sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-dynamic-import" "^7.5.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.5.5" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.5.0" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.5.5" + "@babel/plugin-transform-classes" "^7.5.5" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.5.0" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/plugin-transform-duplicate-keys" "^7.5.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.5.0" + "@babel/plugin-transform-modules-commonjs" "^7.5.0" + "@babel/plugin-transform-modules-systemjs" "^7.5.0" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" + "@babel/plugin-transform-new-target" "^7.4.4" + "@babel/plugin-transform-object-super" "^7.5.5" + "@babel/plugin-transform-parameters" "^7.4.4" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.4.4" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.4.4" + "@babel/types" "^7.5.5" + browserslist "^4.6.0" + core-js-compat "^3.1.1" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/preset-flow@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.0.0.tgz#afd764835d9535ec63d8c7d4caf1c06457263da2" + integrity sha512-bJOHrYOPqJZCkPVbG1Lot2r5OSsB+iUOaxiHdlOeB1yPWS6evswVHwvkDLZ54WTaTRIk89ds0iHmGZSnxlPejQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + +"@babel/preset-react@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" + integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + +"@babel/preset-stage-0@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-stage-0/-/preset-stage-0-7.0.0.tgz#999aaec79ee8f0a763042c68c06539c97c6e0646" + integrity sha512-FBMd0IiARPtH5aaOFUVki6evHiJQiY0pFy7fizyRF7dtwc+el3nwpzvhb9qBNzceG1OIJModG1xpE0DDFjPXwA== + +"@babel/register@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.5.5.tgz#40fe0d474c8c8587b28d6ae18a03eddad3dac3c1" + integrity sha512-pdd5nNR+g2qDkXZlW1yRCWFlNrAn2PPdnZUB72zjX4l1Vv4fMRRLwyf+n/idFCLI1UgVGboUU8oVziwTBiyNKQ== + dependencies: + core-js "^3.0.0" + find-cache-dir "^2.0.0" + lodash "^4.17.13" + mkdirp "^0.5.1" + pirates "^4.0.0" + source-map-support "^0.5.9" + +"@babel/template@^7.1.0", "@babel/template@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" + integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.4", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" + integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.5.5" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.5.5" + "@babel/types" "^7.5.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.0.0", "@babel/types@^7.1.3", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" + integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@types/node@^12.6.8": + version "12.6.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.8.tgz#e469b4bf9d1c9832aee4907ba8a051494357c12c" + integrity sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg== + +"@types/unist@^2.0.0", "@types/unist@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" + integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + +JSONStream@^1.0.3: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= accepts@~1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== dependencies: - mime-types "~2.1.18" - negotiator "0.6.1" + mime-types "~2.1.24" + negotiator "0.6.2" acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= dependencies: acorn "^3.0.4" acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= -acorn@^5.5.0: - version "5.5.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" +acorn@^5.2.1, acorn@^5.5.0: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== ajv-keywords@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= -ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: +ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" @@ -45,66 +1039,98 @@ ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: json-schema-traverse "^0.3.0" ajv@^6.5.5: - version "6.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" - integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +ansi-colors@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== ansi-escapes@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-html@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +append-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" + integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE= + dependencies: + buffer-equal "^1.0.0" + append-transform@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + integrity sha1-126/jKlNJ24keja61EpLdKthGZE= dependencies: default-require-extensions "^1.0.0" aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -112,90 +1138,108 @@ are-we-there-yet@~1.1.2: argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= dependencies: arr-flatten "^1.0.1" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + define-properties "^1.1.2" + es-abstract "^1.7.0" array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -arrify@^1.0.0, arrify@^1.0.1: +arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -async@1.x, async@^1.4.0: +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async@1.x: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= async@2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" + integrity sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ= dependencies: lodash "^4.14.0" asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.0.tgz#ab2b150e51d7b122b9efc8d7340c06b6c41076bc" +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - -aws4@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: version "1.8.0" @@ -213,6 +1257,7 @@ axios@^0.18.0: babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= dependencies: chalk "^1.1.3" esutils "^2.0.2" @@ -221,6 +1266,7 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: babel-generator@^6.18.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== dependencies: babel-messages "^6.23.0" babel-runtime "^6.26.0" @@ -234,12 +1280,21 @@ babel-generator@^6.18.0: babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= dependencies: babel-runtime "^6.22.0" +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" @@ -247,6 +1302,7 @@ babel-runtime@^6.22.0, babel-runtime@^6.26.0: babel-template@^6.16.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= dependencies: babel-runtime "^6.26.0" babel-traverse "^6.26.0" @@ -257,6 +1313,7 @@ babel-template@^6.16.0: babel-traverse@^6.18.0, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= dependencies: babel-code-frame "^6.26.0" babel-messages "^6.23.0" @@ -271,27 +1328,37 @@ babel-traverse@^6.18.0, babel-traverse@^6.26.0: babel-types@^6.18.0, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= dependencies: babel-runtime "^6.26.0" esutils "^2.0.2" lodash "^4.17.4" to-fast-properties "^1.0.3" +babelify@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/babelify/-/babelify-10.0.0.tgz#fe73b1a22583f06680d8d072e25a1e0d1d1d7fb5" + integrity sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg== + babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +bail@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.4.tgz#7181b66d508aa3055d3f6c13f0a0c720641dde9b" + integrity sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww== balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base64url@2.0.0, base64url@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" @@ -301,54 +1368,66 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -bcrypt-nodejs@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz#c60917f26dc235661566c681061c303c2b28842b" - bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" +bcrypt@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-3.0.6.tgz#f607846df62d27e60d5e795612c4f67d70206eb2" + integrity sha512-taA5bCTfXe7FUjKroKky9EXpdhkVvhE5owfxfLYodbrAR1Ul3juLmIQmIQBK4L9a5BuUcE6cqmwT+Da20lF9tg== + dependencies: + nan "2.13.2" + node-pre-gyp "0.12.0" + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + bluebird@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + integrity sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw= bluebird@^3.3.1, bluebird@^3.5.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + version "3.5.5" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" + integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== -body-parser@1.18.2, body-parser@~1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" +body-parser@1.18.3, body-parser@~1.18.2: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= dependencies: bytes "3.0.0" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.1" - http-errors "~1.6.2" - iconv-lite "0.4.19" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" on-finished "~2.3.0" - qs "6.5.1" - raw-body "2.3.2" - type-is "~1.6.15" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" -boom@4.x.x: - version "4.3.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" +body@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" + integrity sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk= dependencies: - hoek "4.x.x" - -boom@5.x.x: - version "5.2.0" - resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" - dependencies: - hoek "4.x.x" + continuable-cache "^0.3.1" + error "^7.0.0" + raw-body "~1.1.0" + safe-json-parse "~1.0.1" brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -356,55 +1435,88 @@ brace-expansion@^1.1.7: braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= dependencies: expand-range "^1.8.1" preserve "^0.2.0" repeat-element "^1.1.2" -braces@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb" +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" - define-property "^1.0.0" extend-shallow "^2.0.1" fill-range "^4.0.0" isobject "^3.0.1" - kind-of "^6.0.2" repeat-element "^1.1.2" snapdragon "^0.8.1" snapdragon-node "^2.0.1" split-string "^3.0.2" to-regex "^3.0.1" +browser-resolve@^1.7.0: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -bson@~1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.6.tgz#444db59ddd4c24f0cb063aabdc5c8c7b0ceca912" +browserslist@^4.6.0, browserslist@^4.6.2: + version "4.6.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.6.tgz#6e4bf467cde520bc9dbdf3747dafa03531cec453" + integrity sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA== + dependencies: + caniuse-lite "^1.0.30000984" + electron-to-chromium "^1.3.191" + node-releases "^1.1.25" + +bson@~1.0.4, bson@~1.0.5: + version "1.0.9" + resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.9.tgz#12319f8323b1254739b7c6bef8d3e89ae05a2f57" + integrity sha512-IQX9/h7WdMBIW/q/++tGd+emQr0XMdeZ6icnT/74Xk9fnabWn+gZgpE+9V+gujL3hhJOoNrnDVY7tWdzc7NUTg== buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + +buffer-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= buffer-from@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" - -builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + integrity sha1-mXjOMXOIxkmth5MCjDR37wRKi1E= + +bytes@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" + integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g= bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" @@ -416,9 +1528,15 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +cached-path-relative@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" + integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== + caching-transform@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" + integrity sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE= dependencies: md5-hex "^1.2.0" mkdirp "^0.5.1" @@ -427,35 +1545,44 @@ caching-transform@^1.0.0: caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= dependencies: callsites "^0.2.0" callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30000984: + version "1.0.30000985" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000985.tgz#0eb40f6c8a8c219155cbe43c4975c0efb4a0f77f" + integrity sha512-1ngiwkgqAYPG0JSSUp3PUDGPKKY59EK7NrGGX+VOxaKCNzRbNc7uXMny+c3VJfZxtoK3wSImTvG9T9sXiTw2+w== caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" +ccount@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.4.tgz#9cf2de494ca84060a2a8d2854edd6dfb0445f386" + integrity sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w== chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -463,33 +1590,78 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.1.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" +character-entities-html4@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.3.tgz#5ce6e01618e47048ac22f34f7f39db5c6fd679ef" + integrity sha512-SwnyZ7jQBCRHELk9zf2CN5AnGEc2nA+uKMZLHvcqhpPprjkYhiLn0DywMHgN5ttFZuITMATbh68M6VIVKwJbcg== + +character-entities-legacy@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz#3c729991d9293da0ede6dddcaf1f2ce1009ee8b4" + integrity sha512-YAxUpPoPwxYFsslbdKkhrGnXAtXoHNgYjlBM3WMXkWGTl5RsY3QmOyhwAgL8Nxm9l5LBThXGawxKPn68y6/fww== + +character-entities@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.3.tgz#bbed4a52fe7ef98cc713c6d80d9faa26916d54e6" + integrity sha512-yB4oYSAa9yLcGyTbB4ItFwHw43QHdH129IJ5R+WvxOkWlyFnR5FAaBNnUq4mcxsTVZGh28bHoeTHMKXH1wZf3w== + +character-reference-invalid@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz#1647f4f726638d3ea4a750cf5d1975c1c7919a85" + integrity sha512-VOq6PRzQBam/8Jm6XBGk2fNEnHXAdGd6go0rtd4weAGECBamHDwwCQSOT12TACIYUZegUXnV6xBXqUssijtxIg== + chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= charenc@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= -chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" +chokidar@^2.0.4: + version "2.1.6" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" + integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" + integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" @@ -499,63 +1671,82 @@ class-utils@^0.3.5: cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= cliui@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc" + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== dependencies: string-width "^2.1.1" strip-ansi "^4.0.0" wrap-ansi "^2.0.0" -clone@2.x: +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= + +clone@2.x, clone@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +cloneable-readable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" + integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collapse-white-space@^1.0.0, collapse-white-space@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.5.tgz#c2495b699ab1ed380d29a1091e01063e75dbbe3a" + integrity sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ== collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" color-convert@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: - color-name "^1.1.1" + color-name "1.1.3" -color-name@^1.1.1: +color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -combined-stream@1.0.6, combined-stream@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - dependencies: - delayed-stream "~1.0.0" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" @@ -564,88 +1755,147 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" +comma-separated-tokens@^1.0.1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.7.tgz#419cd7fb3258b1ed838dc0953167a25e152f5b59" + integrity sha512-Jrx3xsP4pPv4AwJUDWY9wOXGtwPXARej6Xd99h4TUGotmf8APuquKMpK+dnD3UgyxK7OEWaisjZz+3b5jtL6xQ== + +commander@^2.8.1, commander@~2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= component-emitter@^1.2.0, component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= concat-stream@^1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" +concat-stream@~1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" + integrity sha1-cIl4Yk2FavQaWnQd790mHadSwmY= + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" +continuable-cache@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" + integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= + +convert-source-map@^1.1.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= cookiejar@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.1.tgz#41ad57b1b555951ec171412a81942b1e8200d34a" + version "2.1.2" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" + integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js@^2.4.0: - version "2.5.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.4.tgz#f2c8bf181f2a80b92f360121429ce63a2f0aeae0" +core-js-compat@^3.1.1: + version "3.1.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.4.tgz#e4d0c40fbd01e65b1d457980fe4112d4358a7408" + integrity sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg== + dependencies: + browserslist "^4.6.2" + core-js-pure "3.1.4" + semver "^6.1.1" + +core-js-pure@3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.4.tgz#5fa17dc77002a169a3566cc48dc774d2e13e3769" + integrity sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA== + +core-js@^2.4.0, core-js@^2.6.5: + version "2.6.9" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" + integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== + +core-js@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.1.4.tgz#3a2837fc48e582e1ae25907afcd6cf03b0cc7a07" + integrity sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -coveralls@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.0.tgz#22ef730330538080d29b8c151dc9146afde88a99" +coveralls@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.5.tgz#28d7274c6c9827aa85537eab82d66e7e62d0d527" + integrity sha512-/KD7PGfZv/tjKB6LoW97jzIgFqem0Tu9tZL9/iwBnBd8zkIZp7vT1ZSHNvnr0GSQMV/LTMxUstWg8WcDDUVQKg== dependencies: - js-yaml "^3.6.1" + growl "~> 1.10.0" + js-yaml "^3.13.1" lcov-parse "^0.0.10" - log-driver "^1.2.5" + log-driver "^1.2.7" minimist "^1.2.0" - request "^2.79.0" + request "^2.86.0" cross-env@~5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.1.4.tgz#f61c14291f7cc653bb86457002ea80a04699d022" + version "5.1.6" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.1.6.tgz#0dc05caf945b24e4b9e3b12871fe0e858d08b38d" + integrity sha512-VWTDq+G4v383SzgRS7jsAVWqEWF0aKZpDz1GVjhONvPRgHB1LnxP2sXUVFKbykHkPSnfRKS8YdiDevWFwZmQ9g== dependencies: cross-spawn "^5.1.0" is-windows "^1.0.0" @@ -653,6 +1903,7 @@ cross-env@~5.1.4: cross-spawn@^4: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= dependencies: lru-cache "^4.0.1" which "^1.2.9" @@ -660,58 +1911,82 @@ cross-spawn@^4: cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + crypt@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - -cryptiles@3.x.x: - version "3.1.2" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" - dependencies: - boom "5.x.x" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= + debug-log@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" + integrity sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8= debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@3.1.0, debug@=3.1.0, debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@^3.2.6: +debug@3.2.6, debug@^3.1.0, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" -decamelize@^1.0.0, decamelize@^1.1.1: +debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= deep-extend@^0.6.0: version "0.6.0" @@ -721,81 +1996,117 @@ deep-extend@^0.6.0: deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= default-require-extensions@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + integrity sha1-836hXT4T/9m0N9M+GnW1+5eHTLg= dependencies: strip-bom "^2.0.0" +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" isobject "^3.0.1" -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - -depd@~1.1.1, depd@~1.1.2: +depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detab@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.2.tgz#074970d1a807b045d0258a4235df5928dd683561" + integrity sha512-Q57yPrxScy816TTE1P/uLRXLDKjXhvYTbfxS/e6lPD+YrqghbsMlGB9nQzj/zVtSPaF0DFPSdO916EWO4sQUyQ== + dependencies: + repeat-string "^1.5.4" detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= dependencies: repeating "^2.0.0" detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detective@^4.0.0: + version "4.7.1" + resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e" + integrity sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig== + dependencies: + acorn "^5.2.1" + defined "^1.0.0" diff@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +diff@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" + integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== + +doctrine-temporary-fork@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine-temporary-fork/-/doctrine-temporary-fork-2.1.0.tgz#36f2154f556ee4f1e60311d391cd23de5187ed57" + integrity sha512-nliqOv5NkE4zMON4UA6AMJE6As35afs8aYXATpU4pTUdIKiARZwrJVEP1boA3Rx1ZXHVkwxkhcq4VkqvsuRLsA== + dependencies: + esutils "^2.0.2" doctrine@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= dependencies: esutils "^2.0.2" isarray "^1.0.0" @@ -803,47 +2114,200 @@ doctrine@1.5.0: doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" +documentation@^12.0.3: + version "12.0.3" + resolved "https://registry.yarnpkg.com/documentation/-/documentation-12.0.3.tgz#32f91da8e5cb4104f69db9fd32c87773a1ad6240" + integrity sha512-RoqkH+mQ4Vi/nFMxG0BaqPAnjKfsJ9lbLWB8KqoKVAZy+urSpk1K1zBzaFesdDkKeaR3aBgeR3RjtHp8Ut/1Wg== + dependencies: + "@babel/core" "^7.1.2" + "@babel/generator" "^7.1.3" + "@babel/parser" "7.1.3" + "@babel/plugin-proposal-class-properties" "^7.1.0" + "@babel/plugin-proposal-decorators" "^7.1.2" + "@babel/plugin-proposal-do-expressions" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-export-namespace-from" "^7.0.0" + "@babel/plugin-proposal-function-bind" "^7.0.0" + "@babel/plugin-proposal-function-sent" "^7.1.0" + "@babel/plugin-proposal-json-strings" "^7.0.0" + "@babel/plugin-proposal-logical-assignment-operators" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-numeric-separator" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-proposal-pipeline-operator" "^7.0.0" + "@babel/plugin-proposal-throw-expressions" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-import-meta" "^7.0.0" + "@babel/preset-env" "^7.1.0" + "@babel/preset-flow" "^7.0.0" + "@babel/preset-react" "^7.0.0" + "@babel/preset-stage-0" "^7.0.0" + "@babel/traverse" "^7.1.4" + "@babel/types" "^7.1.3" + ansi-html "^0.0.7" + babelify "^10.0.0" + chalk "^2.3.0" + chokidar "^2.0.4" + concat-stream "^1.6.0" + diff "^4.0.1" + doctrine-temporary-fork "2.1.0" + get-port "^4.0.0" + git-url-parse "^10.0.1" + github-slugger "1.2.0" + glob "^7.1.2" + globals-docs "^2.4.0" + highlight.js "^9.15.5" + js-yaml "^3.10.0" + lodash "^4.17.10" + mdast-util-inject "^1.1.0" + micromatch "^3.1.5" + mime "^2.2.0" + module-deps-sortable "5.0.0" + parse-filepath "^1.0.2" + pify "^4.0.0" + read-pkg-up "^4.0.0" + remark "^9.0.0" + remark-html "^8.0.0" + remark-reference-links "^4.0.1" + remark-toc "^5.0.0" + remote-origin-url "0.4.0" + resolve "^1.8.1" + stream-array "^1.1.2" + strip-json-comments "^2.0.1" + tiny-lr "^1.1.0" + unist-builder "^1.0.2" + unist-util-visit "^1.3.0" + vfile "^4.0.0" + vfile-reporter "^6.0.0" + vfile-sort "^2.1.0" + vinyl "^2.1.0" + vinyl-fs "^3.0.2" + vue-template-compiler "^2.5.16" + yargs "^12.0.2" + +duplexer2@^0.1.2, duplexer2@~0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + +duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" + safer-buffer "^2.1.0" -ecdsa-sig-formatter@1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz#4bc926274ec3b5abb5016e7e1d60921ac262b2a1" +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== dependencies: - base64url "^2.0.0" safe-buffer "^5.0.1" ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.191: + version "1.3.201" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.201.tgz#b516e941baf01a7cf8abd33af537a39e1e0096db" + integrity sha512-aCTPIfY1Jvuam5b6vuWRjt1F8i4kY7zX0Qtpu5SNd6l1zjuxU9fDNpbM4o6+oJsra+TMD2o7D20GnkSIgpTr9w== + +"emoji-regex@>=6.0.0 <=6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e" + integrity sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4= + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" +error@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" + integrity sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI= + dependencies: + string-template "~0.2.1" + xtend "~4.0.0" + +es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@1.8.x: version "1.8.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= dependencies: esprima "^2.7.1" estraverse "^1.9.1" @@ -855,45 +2319,52 @@ escodegen@1.8.x: eslint-config-airbnb-base@^12.1.0: version "12.1.0" resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz#386441e54a12ccd957b0a92564a4bafebd747944" + integrity sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA== dependencies: eslint-restricted-globals "^0.1.1" -eslint-import-resolver-node@^0.3.1: +eslint-import-resolver-node@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== dependencies: debug "^2.6.9" resolve "^1.5.0" -eslint-module-utils@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" +eslint-module-utils@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz#7b4675875bf96b0dbf1b21977456e5bb1f5e018c" + integrity sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw== dependencies: debug "^2.6.8" - pkg-dir "^1.0.0" + pkg-dir "^2.0.0" eslint-plugin-import@^2.8.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.10.0.tgz#fa09083d5a75288df9c6c7d09fe12255985655e7" + version "2.18.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6" + integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ== dependencies: - builtin-modules "^1.1.1" + array-includes "^3.0.3" contains-path "^0.1.0" - debug "^2.6.8" + debug "^2.6.9" doctrine "1.5.0" - eslint-import-resolver-node "^0.3.1" - eslint-module-utils "^2.2.0" - has "^1.0.1" - lodash "^4.17.4" - minimatch "^3.0.3" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.0" read-pkg-up "^2.0.0" + resolve "^1.11.0" eslint-restricted-globals@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" + integrity sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc= eslint-scope@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + version "3.7.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" + integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -901,10 +2372,12 @@ eslint-scope@^3.7.1: eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== eslint@^4.9.0: version "4.19.1" resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ== dependencies: ajv "^5.3.0" babel-code-frame "^6.22.0" @@ -948,6 +2421,7 @@ eslint@^4.9.0: espree@^3.5.4: version "3.5.4" resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== dependencies: acorn "^5.5.0" acorn-jsx "^3.0.0" @@ -955,42 +2429,51 @@ espree@^3.5.4: esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== dependencies: estraverse "^4.0.0" esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== dependencies: estraverse "^4.1.0" estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= -esutils@^2.0.2: +esutils@^2.0.0, esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -1000,15 +2483,30 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= dependencies: is-posix-bracket "^0.1.0" expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -1021,16 +2519,18 @@ expand-brackets@^2.1.4: expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= dependencies: fill-range "^2.1.0" express@~4.16.0: - version "4.16.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + version "4.16.4" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== dependencies: accepts "~1.3.5" array-flatten "1.1.1" - body-parser "1.18.2" + body-parser "1.18.3" content-disposition "0.5.2" content-type "~1.0.4" cookie "0.3.1" @@ -1047,10 +2547,10 @@ express@~4.16.0: on-finished "~2.3.0" parseurl "~1.3.2" path-to-regexp "0.1.7" - proxy-addr "~2.0.3" - qs "6.5.1" + proxy-addr "~2.0.4" + qs "6.5.2" range-parser "~1.2.0" - safe-buffer "5.1.1" + safe-buffer "5.1.2" send "0.16.2" serve-static "1.13.2" setprototypeof "1.1.0" @@ -1062,21 +2562,19 @@ express@~4.16.0: extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -extend@~3.0.2: +extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -1084,6 +2582,7 @@ extend@~3.0.2: external-editor@^2.0.4: version "2.2.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== dependencies: chardet "^0.4.0" iconv-lite "^0.4.17" @@ -1092,12 +2591,14 @@ external-editor@^2.0.4: extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= dependencies: is-extglob "^1.0.0" extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -1111,14 +2612,17 @@ extglob@^2.0.4: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fast-deep-equal@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= fast-deep-equal@^2.0.1: version "2.0.1" @@ -1128,20 +2632,31 @@ fast-deep-equal@^2.0.1: fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +faye-websocket@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + dependencies: + websocket-driver ">=0.5.1" figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= dependencies: flat-cache "^1.2.1" object-assign "^4.0.1" @@ -1149,20 +2664,23 @@ file-entry-cache@^2.0.0: filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== dependencies: is-number "^2.1.0" isobject "^2.0.0" - randomatic "^1.1.3" + randomatic "^3.0.0" repeat-element "^1.1.2" repeat-string "^1.5.2" fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -1172,6 +2690,7 @@ fill-range@^4.0.0: finalhandler@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== dependencies: debug "2.6.9" encodeurl "~1.0.2" @@ -1184,14 +2703,32 @@ finalhandler@1.1.1: find-cache-dir@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= dependencies: commondir "^1.0.1" mkdirp "^0.5.1" pkg-dir "^1.0.0" +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@3.0.0, find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" @@ -1199,18 +2736,35 @@ find-up@^1.0.0: find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" flat-cache@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + version "1.3.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" + integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== dependencies: circular-json "^0.3.1" - del "^2.0.2" graceful-fs "^4.1.2" + rimraf "~2.6.2" write "^0.2.1" +flat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" + integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== + dependencies: + is-buffer "~2.0.3" + +flush-write-stream@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + follow-redirects@1.5.10: version "1.5.10" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" @@ -1221,16 +2775,19 @@ follow-redirects@1.5.10: for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" foreground-child@^1.5.3, foreground-child@^1.5.6: version "1.5.6" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" + integrity sha1-T9ca0t/elnibmApcCilZN8svXOk= dependencies: cross-spawn "^4" signal-exit "^3.0.0" @@ -1238,13 +2795,15 @@ foreground-child@^1.5.3, foreground-child@^1.5.6: forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@^2.3.1, form-data@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" +form-data@^2.3.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.0.tgz#094ec359dc4b55e7d62e0db4acd76e89fe874d37" + integrity sha512-WXieX3G/8side6VIqx44ablyULoGruSde5PNTxoUyo5CeyAMX6nVWUd0rgist/EuX655cjhUhTo1Fo3tRYqbcA== dependencies: asynckit "^0.4.0" - combined-stream "1.0.6" + combined-stream "^1.0.6" mime-types "^2.1.12" form-data@~2.3.2: @@ -1256,45 +2815,70 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -formidable@^1.1.1: +formidable@^1.1.1, formidable@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" + integrity sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg== forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + version "1.2.6" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" + integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== dependencies: minipass "^2.2.1" +fs-mkdirp-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" + integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes= + dependencies: + graceful-fs "^4.1.11" + through2 "^2.0.3" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -function-bind@^1.0.2: +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + +function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -1306,26 +2890,77 @@ gauge@~2.7.3: wide-align "^1.1.0" get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-port@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" + integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" +git-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/git-up/-/git-up-2.1.0.tgz#2f14cfe78327e7c4a2b92fcac7bfc674fdfad40c" + integrity sha512-MJgwfcSd9qxgDyEYpRU/CDxNpUadrK80JHuEQDG4Urn0m7tpSOgCBrtiSIa9S9KH8Tbuo/TN8SSQmJBvsw1HkA== + dependencies: + is-ssh "^1.3.0" + parse-url "^3.0.2" + +git-url-parse@^10.0.1: + version "10.1.0" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-10.1.0.tgz#a27813218f8777e91d15f1c121b83bf14721b67e" + integrity sha512-goZOORAtFjU1iG+4zZgWq+N7It09PqS3Xsy43ZwhP5unDD0tTSmXTpqULHodMdJXGejm3COwXIhIRT6Z8DYVZQ== + dependencies: + git-up "^2.0.0" + +github-slugger@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.2.0.tgz#8ada3286fd046d8951c3c952a8d7854cfd90fd9a" + integrity sha512-wIaa75k1vZhyPm9yWrD08A5Xnx/V+RmzGrpjQuLemGKSb77Qukiaei58Bogrl/LZSADDfPzKJX8jhLs4CRTl7Q== + dependencies: + emoji-regex ">=6.0.0 <=6.1.1" + +github-slugger@^1.0.0, github-slugger@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.2.1.tgz#47e904e70bf2dccd0014748142d31126cfd49508" + integrity sha512-SsZUjg/P03KPzQBt7OxJPasGw6NRO5uOgiZ5RGXVud5iSIZ0eNZeNp5rTwCxtavrRUa/A77j8mePVc5lEvk0KQ== + dependencies: + emoji-regex ">=6.0.0 <=6.1.1" + glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" @@ -1333,12 +2968,38 @@ glob-base@^0.3.0: glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= dependencies: is-glob "^2.0.0" -glob@7.1.2, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-stream@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" + integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ= + dependencies: + extend "^3.0.0" + glob "^7.1.1" + glob-parent "^3.1.0" + is-negated-glob "^1.0.0" + ordered-read-streams "^1.0.0" + pumpify "^1.3.5" + readable-stream "^2.1.5" + remove-trailing-separator "^1.0.1" + to-absolute-glob "^2.0.0" + unique-stream "^2.0.2" + +glob@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -1350,6 +3011,7 @@ glob@7.1.2, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.2: glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= dependencies: inflight "^1.0.4" inherits "2" @@ -1357,53 +3019,58 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^11.0.1: - version "11.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.4.0.tgz#b85c793349561c16076a3c13549238a27945f1bc" +glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals-docs@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/globals-docs/-/globals-docs-2.4.0.tgz#f2c647544eb6161c7c38452808e16e693c2dafbb" + integrity sha512-B69mWcqCmT3jNYmSxRxxOXWfzu3Go8NQXPfl2o0qPd1EEFhwW0dFUg9ztTu915zPQzqwIhWAlw6hmfIcCK4kkQ== + +globals@^11.0.1, globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" +graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.2.0" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" + integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== -graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -growl@1.10.3: - version "1.10.3" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" +growl@1.10.5, "growl@~> 1.10.0": + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== handlebars@^4.0.1, handlebars@^4.0.3: - version "4.0.11" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + version "4.1.2" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" + integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== dependencies: - async "^1.4.0" + neo-async "^2.6.0" optimist "^0.6.1" - source-map "^0.4.4" + source-map "^0.6.1" optionalDependencies: - uglify-js "^2.6" + uglify-js "^3.1.4" har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.0: version "5.1.3" @@ -1416,28 +3083,34 @@ har-validator@~5.1.0: has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -1446,6 +3119,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -1454,103 +3128,165 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: - function-bind "^1.0.2" + function-bind "^1.1.1" -hawk@~6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" +hast-util-is-element@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.0.3.tgz#423b4b26fe8bf1f25950fe052e9ce8f83fd5f6a4" + integrity sha512-C62CVn7jbjp89yOhhy7vrkSaB7Vk906Gtcw/Ihd+Iufnq+2pwOZjdPmpzpKLWJXPJBMDX3wXg4FqmdOayPcewA== + +hast-util-sanitize@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-1.3.1.tgz#4e60d66336bd67e52354d581967467029a933f2e" + integrity sha512-AIeKHuHx0Wk45nSkGVa2/ujQYTksnDl8gmmKo/mwQi7ag7IBZ8cM3nJ2G86SajbjGP/HRpud6kMkPtcM2i0Tlw== dependencies: - boom "4.x.x" - cryptiles "3.x.x" - hoek "4.x.x" - sntp "2.x.x" + xtend "^4.0.1" -he@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" +hast-util-to-html@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-4.0.1.tgz#3666b05afb62bd69f8f5e6c94db04dea19438e2a" + integrity sha512-2emzwyf0xEsc4TBIPmDJmBttIw8R4SXAJiJZoiRR/s47ODYWgOqNoDbf2SJAbMbfNdFWMiCSOrI3OVnX6Qq2Mg== + dependencies: + ccount "^1.0.0" + comma-separated-tokens "^1.0.1" + hast-util-is-element "^1.0.0" + hast-util-whitespace "^1.0.0" + html-void-elements "^1.0.0" + property-information "^4.0.0" + space-separated-tokens "^1.0.0" + stringify-entities "^1.0.1" + unist-util-is "^2.0.0" + xtend "^4.0.1" -hoek@4.x.x: - version "4.2.1" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" +hast-util-whitespace@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.3.tgz#6d161b307bd0693b5ec000c7c7e8b5445109ee34" + integrity sha512-AlkYiLTTwPOyxZ8axq2/bCwRUPjIPBfrHkXuCR92B38b3lSdU22R5F/Z4DL6a2kxWpekWq1w6Nj48tWat6GeRA== + +he@1.2.0, he@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +highlight.js@^9.15.5: + version "9.15.8" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.15.8.tgz#f344fda123f36f1a65490e932cf90569e4999971" + integrity sha512-RrapkKQWwE+wKdF73VsOa2RQdIoO3mxwJ4P8mhbI6KYJUraUHRKM5w5zQQKXNk0xNL4UVRdulV9SBJcmzJNzVA== + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" hosted-git-info@^2.1.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== -http-errors@1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" - dependencies: - depd "1.1.1" - inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" +html-void-elements@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.4.tgz#95e8bb5ecd6b88766569c2645f2b5f1591db9ba5" + integrity sha512-yMk3naGPLrfvUV9TdDbuYXngh/TpHbA6TrOw3HL9kS8yhwx7i309BReNg7CbAJXGE+UMJ6je5OqJ7lC63o6YuQ== -http-errors@~1.6.2: +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= dependencies: depd "~1.1.2" inherits "2.0.3" setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" +"http-parser-js@>=0.4.0 <0.4.11": + version "0.4.10" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" sshpk "^1.7.0" -iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@^0.4.4: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.4.17, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" ignore-walk@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== dependencies: minimatch "^3.0.4" ignore@^3.3.3: - version "3.3.7" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.3, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@~1.3.0: +ini@^1.3.3, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== inquirer@^3.0.6: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== dependencies: ansi-escapes "^3.0.0" chalk "^2.0.0" @@ -1570,63 +3306,120 @@ inquirer@^3.0.6: invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= -ipaddr.js@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ipaddr.js@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" +is-alphabetical@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.3.tgz#eb04cc47219a8895d8450ace4715abff2258a1f8" + integrity sha512-eEMa6MKpHFzw38eKm56iNNi6GJ7lf6aLLio7Kr23sJPAECscgRtZvOBYybejWDQ2bM949Y++61PY+udzj5QMLA== + +is-alphanumeric@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4" + integrity sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ= + +is-alphanumerical@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz#57ae21c374277b3defe0274c640a5704b8f6657c" + integrity sha512-A1IGAPO5AW9vSh7omxIlOGwIqEvpW/TA+DksVOPM5ODuxKlZS09+TEM1E3275lJqO2oJ38vDpeAL3DCIiHE6eA== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-buffer@^1.1.5, is-buffer@~1.1.1: +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.4, is-buffer@^1.1.5, is-buffer@~1.1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@^2.0.2: +is-buffer@^2.0.0, is-buffer@^2.0.2, is-buffer@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-decimal@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.3.tgz#381068759b9dc807d8c0dc0bfbae2b68e1da48b7" + integrity sha512-bvLSwoDg2q6Gf+E2LEPiklHZxxiSi3XAh4Mav65mKqTfCO1HM3uBs24TjEH8iJX3bbDdLXKJXBTmGzuTUuAEjQ== + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" @@ -1635,6 +3428,7 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" @@ -1643,197 +3437,297 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= dependencies: is-primitive "^2.0.0" is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= dependencies: is-extglob "^1.0.0" +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz#e8a426a69b6d31470d3a33a47bb825cda02506ee" + integrity sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA== + +is-negated-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" + integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= + is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" is-number@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== -is-odd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" - dependencies: - is-number "^4.0.0" +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - dependencies: - path-is-inside "^1.0.1" - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-ssh@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.1.tgz#f349a8cadd24e65298037a522cf7520f2e81a0f3" + integrity sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg== + dependencies: + protocols "^1.1.0" is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-utf8@^0.2.0: +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + +is-utf8@^0.2.0, is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-windows@^1.0.0, is-windows@^1.0.2: +is-valid-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" + integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= + +is-whitespace-character@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz#b3ad9546d916d7d3ffa78204bca0c26b56257fac" + integrity sha512-SNPgMLz9JzPccD3nPctcj8sZlX9DAMJSKH8bP7Z6bohCwuNgX8xbWr1eTAYXX9Vpi/aSn8Y1akL9WgM3t43YNQ== + +is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-word-character@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.3.tgz#264d15541cbad0ba833d3992c34e6b40873b08aa" + integrity sha512-0wfcrFgOOOBdgRNT9H33xe6Zi6yhX/uoc4U8NBZGeQQB0ctU1dnlNTyL9JM2646bHDTpsDm1Brb3VPoCIMrd/A== isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" +istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" + integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== istanbul-lib-hook@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b" + version "1.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" + integrity sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw== dependencies: append-transform "^0.4.0" istanbul-lib-instrument@^1.10.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" + version "1.10.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" + integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" babel-traverse "^6.18.0" babel-types "^6.18.0" babylon "^6.18.0" - istanbul-lib-coverage "^1.2.0" + istanbul-lib-coverage "^1.2.1" semver "^5.3.0" istanbul-lib-report@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.3.tgz#2df12188c0fa77990c0d2176d2d0ba3394188259" + version "1.1.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" + integrity sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw== dependencies: - istanbul-lib-coverage "^1.1.2" + istanbul-lib-coverage "^1.2.1" mkdirp "^0.5.1" path-parse "^1.0.5" supports-color "^3.1.2" istanbul-lib-source-maps@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6" + version "1.2.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" + integrity sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg== dependencies: debug "^3.1.0" - istanbul-lib-coverage "^1.1.2" + istanbul-lib-coverage "^1.2.1" mkdirp "^0.5.1" rimraf "^2.6.1" source-map "^0.5.3" -istanbul-reports@^1.1.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554" +istanbul-reports@^1.4.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" + integrity sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw== dependencies: handlebars "^4.0.3" istanbul@^0.4.5: version "0.4.5" resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= dependencies: abbrev "1.0.x" async "1.x" @@ -1850,13 +3744,25 @@ istanbul@^0.4.5: which "^1.1.1" wordwrap "^1.0.0" -js-tokens@^3.0.0, js-tokens@^3.0.2: +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@3.x, js-yaml@^3.6.1, js-yaml@^3.9.1: - version "3.11.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" +js-yaml@3.13.1, js-yaml@3.x, js-yaml@^3.10.0, js-yaml@^3.13.1, js-yaml@^3.9.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -1864,14 +3770,32 @@ js-yaml@3.x, js-yaml@^3.6.1, js-yaml@^3.9.1: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= json-schema-traverse@^0.4.1: version "0.4.1" @@ -1881,20 +3805,36 @@ json-schema-traverse@^0.4.1: json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= jsonwebtoken@^8.0.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.2.0.tgz#690ec3a9e7e95e2884347ce3e9eb9d389aa598b3" + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== dependencies: - jws "^3.1.4" + jws "^3.2.2" lodash.includes "^4.3.0" lodash.isboolean "^3.0.3" lodash.isinteger "^4.0.4" @@ -1903,57 +3843,63 @@ jsonwebtoken@^8.0.1: lodash.isstring "^4.0.1" lodash.once "^4.0.0" ms "^2.1.1" - xtend "^4.0.1" + semver "^5.6.0" jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" extsprintf "1.3.0" json-schema "0.2.3" verror "1.10.0" -jwa@^1.1.4: - version "1.1.5" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.5.tgz#a0552ce0220742cd52e153774a32905c30e756e5" +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== dependencies: - base64url "2.0.0" buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.9" + ecdsa-sig-formatter "1.0.11" safe-buffer "^5.0.1" -jws@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2" +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== dependencies: - base64url "^2.0.0" - jwa "^1.1.4" + jwa "^1.4.1" safe-buffer "^5.0.1" -kareem@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.0.6.tgz#011ed59fd718bb147c63141a799fc888cd5a211b" +kareem@2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.0.7.tgz#8d260366a4df4236ceccec318fcf10c17c5beb22" + integrity sha512-p8+lEpsNs4N0fvNOC1/zzDO0wDrD3Pb1G+OwfIG+gKVK3MyY5jeaGYh+9Qx6jb4fEG2b3E6U98vaE9MH7Gilsw== kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== km-moviedb@^0.2.12: version "0.2.13" @@ -1962,30 +3908,56 @@ km-moviedb@^0.2.12: dependencies: superagent "3.8.2" -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= + dependencies: + readable-stream "^2.0.5" lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= dependencies: invert-kv "^1.0.0" +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + lcov-parse@^0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" + integrity sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM= + +lead@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" + integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI= + dependencies: + flush-write-stream "^1.0.2" levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" +livereload-js@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c" + integrity sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw== + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -1996,131 +3968,279 @@ load-json-file@^1.0.0: load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" pify "^2.0.0" strip-bom "^3.0.0" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lodash.get@4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= lodash.isboolean@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= lodash.isinteger@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= lodash.isnumber@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= lodash.isstring@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= lodash.once@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= -lodash@4.x, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0: - version "4.17.5" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" +lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.3.0: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -log-driver@^1.2.5: +log-driver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" + integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" +log-symbols@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +longest-streak@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.3.tgz#3de7a3f47ee18e9074ded8575b5c091f5d0a4105" + integrity sha512-9lz5IVdpwsKLMzQi0MQ+oD9EA0mIGcWYP7jXMTZVXP8D42PwuAk+M/HBFYQoxt1G5OR8m7aSIgb1UymfWGBWEw== loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: - js-tokens "^3.0.0" + js-tokens "^3.0.0 || ^4.0.0" lru-cache@^4.0.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f" + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" -map-cache@^0.2.2: +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" +markdown-escapes@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.3.tgz#6155e10416efaafab665d466ce598216375195f5" + integrity sha512-XUi5HJhhV5R74k8/0H2oCbCiYf/u4cO/rX8tnGkRvrqhsr5BRNU6Mg0yt/8UIx1iIS8220BNJsDb7XnILhLepw== + +markdown-table@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" + integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== + +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + md5-hex@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" + integrity sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ= dependencies: md5-o-matic "^0.1.1" md5-o-matic@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" + integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= md5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= dependencies: charenc "~0.0.1" crypt "~0.0.1" is-buffer "~1.1.1" +mdast-util-compact@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-1.0.3.tgz#98a25cc8a7865761a41477b3a87d1dcef0b1e79d" + integrity sha512-nRiU5GpNy62rZppDKbLwhhtw5DXoFMqw9UNZFmlPsNaQCZ//WLjGKUwWMdJrUH+Se7UvtO2gXtAMe0g/N+eI5w== + dependencies: + unist-util-visit "^1.1.0" + +mdast-util-definitions@^1.2.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-1.2.4.tgz#2b54ad4eecaff9d9fcb6bf6f9f6b68b232d77ca7" + integrity sha512-HfUArPog1j4Z78Xlzy9Q4aHLnrF/7fb57cooTHypyGoe2XFNbcx/kWZDoOz+ra8CkUzvg3+VHV434yqEd1DRmA== + dependencies: + unist-util-visit "^1.0.0" + +mdast-util-inject@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-inject/-/mdast-util-inject-1.1.0.tgz#db06b8b585be959a2dcd2f87f472ba9b756f3675" + integrity sha1-2wa4tYW+lZotzS+H9HK6m3VvNnU= + dependencies: + mdast-util-to-string "^1.0.0" + +mdast-util-to-hast@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-3.0.4.tgz#132001b266031192348d3366a6b011f28e54dc40" + integrity sha512-/eIbly2YmyVgpJNo+bFLLMCI1XgolO/Ffowhf+pHDq3X4/V6FntC9sGQCDLM147eTS+uSXv5dRzJyFn+o0tazA== + dependencies: + collapse-white-space "^1.0.0" + detab "^2.0.0" + mdast-util-definitions "^1.2.0" + mdurl "^1.0.1" + trim "0.0.1" + trim-lines "^1.0.0" + unist-builder "^1.0.1" + unist-util-generated "^1.1.0" + unist-util-position "^3.0.0" + unist-util-visit "^1.1.0" + xtend "^4.0.1" + +mdast-util-to-string@^1.0.0, mdast-util-to-string@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.0.6.tgz#7d85421021343b33de1552fc71cb8e5b4ae7536d" + integrity sha512-868pp48gUPmZIhfKrLbaDneuzGiw3OTDjHc5M1kAepR2CWBJ+HpEsm252K4aXdiP5coVZaJPOqGtVU6Po8xnXg== + +mdast-util-toc@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-toc/-/mdast-util-toc-3.1.0.tgz#395eeb877f067f9d2165d990d77c7eea6f740934" + integrity sha512-Za0hqL1PqWrvxGtA/3NH9D5nhGAUS9grMM4obEAz5+zsk1RIw/vWUchkaoDLNdrwk05A0CSC5eEXng36/1qE5w== + dependencies: + github-slugger "^1.2.1" + mdast-util-to-string "^1.0.5" + unist-util-is "^2.1.2" + unist-util-visit "^1.1.0" + +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= mem@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= dependencies: mimic-fn "^1.0.0" +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge-source-map@^1.0.2: +merge-source-map@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== dependencies: source-map "^0.6.1" -methods@^1.1.1, methods@~1.1.2: +methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" @@ -2136,9 +4256,10 @@ micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.1.8: +micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.5: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -2159,17 +4280,7 @@ mime-db@1.40.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" - -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" - dependencies: - mime-db "~1.33.0" - -mime-types@~2.1.19: +mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.24" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== @@ -2179,49 +4290,69 @@ mime-types@~2.1.19: mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== mime@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.2.0: + version "2.4.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.2.0: +minimist@^1.1.0, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.1, minipass@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.2.4.tgz#03c824d84551ec38a8d1bb5bc350a5a30a354a40" +minipass@^2.2.1, minipass@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== dependencies: - safe-buffer "^5.1.1" + safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" +minizlib@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== dependencies: minipass "^2.2.1" mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -2229,68 +4360,110 @@ mixin-deep@^1.2.0: mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" mocha-lcov-reporter@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz#469bdef4f8afc9a116056f079df6182d0afb0384" + integrity sha1-Rpve9PivyaEWBW8HnfYYLQr7A4Q= -mocha@^5.0.4: - version "5.0.5" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.0.5.tgz#e228e3386b9387a4710007a641f127b00be44b52" +mocha@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.0.tgz#f896b642843445d1bb8bca60eabd9206b8916e56" + integrity sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ== dependencies: + ansi-colors "3.2.3" browser-stdout "1.3.1" - commander "2.11.0" - debug "3.1.0" + debug "3.2.6" diff "3.5.0" escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.3" - he "1.1.1" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "2.2.0" + minimatch "3.0.4" mkdirp "0.5.1" - supports-color "4.4.0" + ms "2.1.1" + node-environment-flags "1.0.5" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.2.2" + yargs-parser "13.0.0" + yargs-unparser "1.5.0" -mongodb-core@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.0.4.tgz#a3fdf466e697a2f1df87e458e5e2df1c26cc654b" +module-deps-sortable@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/module-deps-sortable/-/module-deps-sortable-5.0.0.tgz#99db5bb08f7eab55e4c31f6b7c722c6a2144ba74" + integrity sha512-bnGGeghQmz/t/6771/KC4FmxpVm126iR6AAzzq4N6hVZQVl4+ZZBv+VF3PJmDyxXtVtgcgTSSP7NL+jq1QAHrg== + dependencies: + JSONStream "^1.0.3" + browser-resolve "^1.7.0" + cached-path-relative "^1.0.0" + concat-stream "~1.5.0" + defined "^1.0.0" + detective "^4.0.0" + duplexer2 "^0.1.2" + inherits "^2.0.1" + readable-stream "^2.0.2" + resolve "^1.1.3" + stream-combiner2 "^1.1.1" + subarg "^1.0.0" + through2 "^2.0.0" + xtend "^4.0.0" + +mongodb-core@3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.0.8.tgz#8d401f4eab6056c0d874a3d5844a4844f761d4d7" + integrity sha512-dFxfhH9N7ohuQnINyIl6dqEF8sYOE0WKuymrFf3L3cipJNrx+S8rAbNOTwa00/fuJCjBMJNFsaA+R2N16//UIw== dependencies: bson "~1.0.4" require_optional "^1.0.1" -mongodb@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.0.4.tgz#ee0c0f7bc565edc5f40ee2d23170e522a8ad2286" +mongodb@3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.0.8.tgz#2c1daecac9a0ec2de2f2aea4dc97d76ae70f8951" + integrity sha512-mj7yIUyAr9xnO2ev8pcVJ9uX7gSum5LLs1qIFoWLxA5Il50+jcojKtaO1/TbexsScZ9Poz00Pc3b86GiSqJ7WA== dependencies: - mongodb-core "3.0.4" + mongodb-core "3.0.8" mongoose-legacy-pluralize@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4" + integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ== mongoose@~5.0.11: - version "5.0.12" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.0.12.tgz#608a3829bf2edae47b0078cd1970ede2a033b3a0" + version "5.0.18" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.0.18.tgz#2d04c70f0800959b4c8180e5e70db13bc18d3826" + integrity sha512-13+gKxvViIVp4esPkgQYTdfisLLWxghvsj7aBg4oBurvb0LAXcSXFZpFORZnxtOdyxM7kJiSV9kjFjerEm3Bhw== dependencies: async "2.1.4" - bson "~1.0.4" - kareem "2.0.6" + bson "~1.0.5" + kareem "2.0.7" lodash.get "4.4.2" - mongodb "3.0.4" + mongodb "3.0.8" mongoose-legacy-pluralize "1.0.2" - mpath "0.3.0" + mpath "0.4.1" mquery "3.0.0" ms "2.0.0" regexp-clone "0.0.1" sliced "1.0.1" -mpath@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.3.0.tgz#7a58f789e9b5fd3c94520634157960f26bd5ef44" +mpath@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.4.1.tgz#ed10388430380bf7bbb5be1391e5d6969cb08e89" + integrity sha512-NNY/MpBkALb9jJmjpBlIi6GRoLveLUM0pJzgbp9vY9F7IQEb/HREC/nxrixechcQwd1NevOhJnWWV8QQQRE+OA== mquery@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mquery/-/mquery-3.0.0.tgz#e5f387dbabc0b9b69859e550e810faabe0ceabb0" + integrity sha512-WL1Lk8v4l8VFSSwN3yCzY9TXw+fKVYKn6f+w86TRzOLSE8k1yTgGaLBPUByJQi8VcLbOdnUneFV/y3Kv874pnQ== dependencies: bluebird "3.5.0" debug "2.6.9" @@ -2300,14 +4473,27 @@ mquery@3.0.0: ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.1.1: +ms@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +nan@2.13.2: + version "2.13.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" + integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== nan@^2.12.1: version "2.14.0" @@ -2315,15 +4501,15 @@ nan@^2.12.1: integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nanomatch@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" define-property "^2.0.2" extend-shallow "^3.0.2" fragment-cache "^0.2.1" - is-odd "^2.0.0" is-windows "^1.0.2" kind-of "^6.0.2" object.pick "^1.3.0" @@ -2334,6 +4520,7 @@ nanomatch@^1.2.9: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= needle@^2.2.1: version "2.4.0" @@ -2344,16 +4531,65 @@ needle@^2.2.1: iconv-lite "^0.4.4" sax "^1.2.4" -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-cache@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-4.2.0.tgz#48ac796a874e762582692004a376d26dfa875811" + version "4.2.1" + resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-4.2.1.tgz#efd8474dee4edec4138cdded580f5516500f7334" + integrity sha512-BOb67bWg2dTyax5kdef5WfU3X8xu4wPg+zHzkvls0Q/QpYycIFRLEEIdAx9Wma43DxG6Qzn4illdZoYseKWa4A== dependencies: clone "2.x" - lodash "4.x" + lodash "^4.17.15" + +node-environment-flags@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" + integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + +node-environment-flags@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" + integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-pre-gyp@0.12.0, node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" node-pre-gyp@^0.11.0: version "0.11.0" @@ -2371,41 +4607,76 @@ node-pre-gyp@^0.11.0: semver "^5.3.0" tar "^4" +node-releases@^1.1.25: + version "1.1.26" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.26.tgz#f30563edc5c7dc20cf524cc8652ffa7be0762937" + integrity sha512-fZPsuhhUHMTlfkhDLGtfY80DSJTjOcx+qD1j5pqPkuhUHVS7xHZIg9EE4DHK8O3f0zTxXHX5VIkDG8pu98/wfQ== + dependencies: + semver "^5.3.0" + nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= dependencies: abbrev "1" nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" normalize-package-data@^2.3.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" + resolve "^1.10.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1: +normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +now-and-later@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c" + integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ== + dependencies: + once "^1.3.2" + npm-bundled@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== npm-packlist@^1.1.6: - version "1.1.10" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" + version "1.4.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" + integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -2413,12 +4684,14 @@ npm-packlist@^1.1.6: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -2428,10 +4701,12 @@ npmlog@^4.0.2: number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= nyc@^11.6.0: - version "11.6.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-11.6.0.tgz#d9c7b51ffceb6bba099a4683a6adc1b331b98853" + version "11.9.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-11.9.0.tgz#4106e89e8fbe73623a1fc8b6ecb7abaa271ae1e4" + integrity sha512-w8OdJAhXL5izerzZMdqzYKMj/pgHJyY3qEPYBjLLxrhcVoHEY9pU5ENIiZyCgG9OR7x3VcUMoD40o6PtVpfR4g== dependencies: archy "^1.0.0" arrify "^1.0.1" @@ -2448,23 +4723,19 @@ nyc@^11.6.0: istanbul-lib-instrument "^1.10.0" istanbul-lib-report "^1.1.3" istanbul-lib-source-maps "^1.2.3" - istanbul-reports "^1.1.4" + istanbul-reports "^1.4.0" md5-hex "^1.2.0" - merge-source-map "^1.0.2" - micromatch "^2.3.11" + merge-source-map "^1.1.0" + micromatch "^3.1.10" mkdirp "^0.5.0" resolve-from "^2.0.0" - rimraf "^2.5.4" + rimraf "^2.6.2" signal-exit "^3.0.1" spawn-wrap "^1.4.2" test-exclude "^4.2.0" yargs "11.1.0" yargs-parser "^8.0.0" -oauth-sign@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -2473,24 +4744,51 @@ oauth-sign@~0.9.0: object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" +object-keys@^1.0.11, object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" +object.assign@4.1.0, object.assign@^4.0.4, object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= dependencies: for-own "^0.1.4" is-extendable "^0.1.1" @@ -2498,30 +4796,45 @@ object.omit@^2.0.0: object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" +object.values@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" + integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" -once@1.x, once@^1.3.0: +once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: mimic-fn "^1.0.0" optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" @@ -2529,6 +4842,7 @@ optimist@^0.6.1: optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.4" @@ -2537,52 +4851,134 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" +ordered-read-streams@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" + integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4= + dependencies: + readable-stream "^2.0.1" + os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== dependencies: execa "^0.7.0" lcid "^1.0.0" mem "^1.1.0" +os-locale@^3.0.0, os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= osenv@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== p-limit@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" +p-limit@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parse-entities@^1.0.2, parse-entities@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" + integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-filepath@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-git-config@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-0.2.0.tgz#272833fdd15fea146fb75d336d236b963b6ff706" + integrity sha1-Jygz/dFf6hRvt10zbSNrljtv9wY= + dependencies: + ini "^1.3.3" parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" @@ -2592,50 +4988,109 @@ parse-glob@^3.0.4: parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= dependencies: error-ex "^1.2.0" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parse-path@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-3.0.4.tgz#a48b7b529da41f34d9d1428602a39b29fc7180e4" + integrity sha512-wP70vtwv2DyrM2YoA7ZHVv4zIXa4P7dGgHlj+VwyXNDduLLVJ7NMY1zsFxjUUJ3DAwJLupGb1H5gMDDiNlJaxw== + dependencies: + is-ssh "^1.3.0" + protocols "^1.4.0" + +parse-url@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-3.0.2.tgz#602787a7063a795d72b8673197505e72f60610be" + integrity sha1-YCeHpwY6eV1yuGcxl1BecvYGEL4= + dependencies: + is-ssh "^1.3.0" + normalize-url "^1.9.1" + parse-path "^3.0.1" + protocols "^1.4.0" + parseurl@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.1, path-is-inside@^1.0.2: +path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= -path-key@^2.0.0: +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" +path-parse@^1.0.5, path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= dependencies: graceful-fs "^4.1.2" pify "^2.0.0" @@ -2644,78 +5099,183 @@ path-type@^1.0.0: path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= dependencies: pify "^2.0.0" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.0, pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" pkg-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= dependencies: find-up "^1.0.0" +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" +private@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" - -proxy-addr@~2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +property-information@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-4.2.0.tgz#f0e66e07cbd6fed31d96844d958d153ad3eb486e" + integrity sha512-TlgDPagHh+eBKOnH2VYvk8qbwsCG/TAJdmTL7f1PROUcSO8qt/KSmShEQ/OKvock8X9tFjtqjCScyOkkkvIKVQ== + dependencies: + xtend "^4.0.1" + +protocols@^1.1.0, protocols@^1.4.0: + version "1.4.7" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.7.tgz#95f788a4f0e979b291ffefcf5636ad113d037d32" + integrity sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg== + +proxy-addr@~2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" + integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== dependencies: forwarded "~0.1.2" - ipaddr.js "1.6.0" + ipaddr.js "1.9.0" pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24: - version "1.1.32" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.32.tgz#3f132717cf2f9c169724b2b6caf373cf694198db" - integrity sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g== +psl@^1.1.24, psl@^1.1.28: + version "1.2.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.2.0.tgz#df12b5b1b3a30f51c329eacbdef98f3a6e136dc6" + integrity sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA== + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.5: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -2723,46 +5283,69 @@ punycode@^2.1.0: python-shell@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/python-shell/-/python-shell-0.5.0.tgz#461983bafd092010bc2760c365b13e7d50aab231" + integrity sha512-+jgmFZvwk1yMBBDisDlkXXMYv1eEJKbGCtwHLppGIyEV83cKeX9hjOjfR2yONWK3yQFhum0M2r7UE0U//hiK9w== -qs@6.5.1, qs@^6.5.1, qs@~6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" - -qs@~6.5.2: +qs@6.5.2, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -randomatic@^1.1.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" +qs@^6.4.0, qs@^6.5.1: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raven@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/raven/-/raven-2.4.2.tgz#0129e2adc30788646fd530b67d08a8ce25d4f6dc" + version "2.6.4" + resolved "https://registry.yarnpkg.com/raven/-/raven-2.6.4.tgz#458d4a380c8fbb59e0150c655625aaf60c167ea3" + integrity sha512-6PQdfC4+DQSFncowthLf+B6Hr0JpPsFBgTVYTAOq7tCmx/kR4SXbeawtPch20+3QfUcQDoJBLjWW1ybvZ4kXTw== dependencies: cookie "0.3.1" md5 "^2.2.1" - stack-trace "0.0.9" + stack-trace "0.0.10" timed-out "4.0.1" - uuid "3.0.0" + uuid "3.3.2" -raw-body@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== dependencies: bytes "3.0.0" - http-errors "1.6.2" - iconv-lite "0.4.19" + http-errors "1.6.3" + iconv-lite "0.4.23" unpipe "1.0.0" +raw-body@~1.1.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" + integrity sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU= + dependencies: + bytes "1" + string_decoder "0.10" + rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -2776,6 +5359,7 @@ rc@^1.2.7: read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= dependencies: find-up "^1.0.0" read-pkg "^1.0.0" @@ -2783,13 +5367,23 @@ read-pkg-up@^1.0.1: read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= dependencies: find-up "^2.0.0" read-pkg "^2.0.0" +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" @@ -2798,14 +5392,25 @@ read-pkg@^1.0.0: read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= dependencies: load-json-file "^2.0.0" normalize-package-data "^2.3.2" path-type "^2.0.0" -readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.2.2: +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -2815,19 +5420,80 @@ readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.2.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@~2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + integrity sha1-j5A0HmilPMySh4jaz80Rs265t44= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@~2.1.0: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + integrity sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA= + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +regenerate-unicode-properties@^8.0.2: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.2: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" + integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== + +regenerator-transform@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" + integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== + dependencies: + private "^0.1.6" regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" @@ -2835,72 +5501,195 @@ regex-not@^1.0.0, regex-not@^1.0.2: regexp-clone@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-0.0.1.tgz#a7c2e09891fdbf38fbb10d376fb73003e68ac589" + integrity sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk= + +regexp-tree@^0.1.6: + version "0.1.11" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.11.tgz#c9c7f00fcf722e0a56c7390983a7a63dd6c272f3" + integrity sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg== regexpp@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== + +regexpu-core@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" + integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.0.2" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" + +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + dependencies: + jsesc "~0.5.0" + +remark-html@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/remark-html/-/remark-html-8.0.0.tgz#9fcb859a6f3cb40f3ef15402950f1a62ec301b3a" + integrity sha512-3V2391GL3hxKhrkzYOyfPpxJ6taIKLCfuLVqumeWQOk3H9nTtSQ8St8kMYkBVIEAquXN1chT83qJ/2lAW+dpEg== + dependencies: + hast-util-sanitize "^1.0.0" + hast-util-to-html "^4.0.0" + mdast-util-to-hast "^3.0.0" + xtend "^4.0.1" + +remark-parse@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-5.0.0.tgz#4c077f9e499044d1d5c13f80d7a98cf7b9285d95" + integrity sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA== + dependencies: + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^1.1.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^1.0.0" + vfile-location "^2.0.0" + xtend "^4.0.1" + +remark-reference-links@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/remark-reference-links/-/remark-reference-links-4.0.4.tgz#190579a0d6b002859d6cdbdc5aeb8bbdae4e06ab" + integrity sha512-+2X8hwSQqxG4tvjYZNrTcEC+bXp8shQvwRGG6J/rnFTvBoU4G0BBviZoqKGZizLh/DG+0gSYhiDDWCqyxXW1iQ== + dependencies: + unist-util-visit "^1.0.0" + +remark-slug@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/remark-slug/-/remark-slug-5.1.2.tgz#715ecdef8df1226786204b1887d31ab16aa24609" + integrity sha512-DWX+Kd9iKycqyD+/B+gEFO3jjnt7Yg1O05lygYSNTe5i5PIxxxPjp5qPBDxPIzp5wreF7+1ROCwRgjEcqmzr3A== + dependencies: + github-slugger "^1.0.0" + mdast-util-to-string "^1.0.0" + unist-util-visit "^1.0.0" + +remark-stringify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-5.0.0.tgz#336d3a4d4a6a3390d933eeba62e8de4bd280afba" + integrity sha512-Ws5MdA69ftqQ/yhRF9XhVV29mhxbfGhbz0Rx5bQH+oJcNhhSM6nCu1EpLod+DjrFGrU0BMPs+czVmJZU7xiS7w== + dependencies: + ccount "^1.0.0" + is-alphanumeric "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + longest-streak "^2.0.1" + markdown-escapes "^1.0.0" + markdown-table "^1.1.0" + mdast-util-compact "^1.0.0" + parse-entities "^1.0.2" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + stringify-entities "^1.0.1" + unherit "^1.0.4" + xtend "^4.0.1" + +remark-toc@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/remark-toc/-/remark-toc-5.1.1.tgz#8c229d6f834cdb43fde6685e2d43248d3fc82d78" + integrity sha512-vCPW4YOsm2CfyuScdktM9KDnJXVHJsd/ZeRtst+dnBU3B3KKvt8bc+bs5syJjyptAHfqo7H+5Uhz+2blWBfwow== + dependencies: + mdast-util-toc "^3.0.0" + remark-slug "^5.0.0" + +remark@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark/-/remark-9.0.0.tgz#c5cfa8ec535c73a67c4b0f12bfdbd3a67d8b2f60" + integrity sha512-amw8rGdD5lHbMEakiEsllmkdBP+/KpjW/PRK6NSGPZKCQowh0BT4IWXDAkRMyG3SB9dKPXWMviFjNusXzXNn3A== + dependencies: + remark-parse "^5.0.0" + remark-stringify "^5.0.0" + unified "^6.0.0" + +remote-origin-url@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/remote-origin-url/-/remote-origin-url-0.4.0.tgz#4d3e2902f34e2d37d1c263d87710b77eb4086a30" + integrity sha1-TT4pAvNOLTfRwmPYdxC3frQIajA= + dependencies: + parse-git-config "^0.2.0" + +remove-bom-buffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" + integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== + dependencies: + is-buffer "^1.1.5" + is-utf8 "^0.2.1" + +remove-bom-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" + integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM= + dependencies: + remove-bom-buffer "^3.0.0" + safe-buffer "^5.1.0" + through2 "^2.0.3" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.5.0, repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" -request-promise-core@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" +replace-ext@1.0.0, replace-ext@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + +request-promise-core@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" + integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== dependencies: - lodash "^4.13.1" + lodash "^4.17.11" request-promise@^4.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.2.tgz#d1ea46d654a6ee4f8ee6a4fea1018c22911904b4" + version "4.2.4" + resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.4.tgz#1c5ed0d71441e38ad58c7ce4ea4ea5b06d54b310" + integrity sha512-8wgMrvE546PzbR5WbYxUQogUnUDfM0S7QIFZMID+J73vdFARkFy+HElj4T+MWYhpXwlLp0EQ8Zoj8xUA0he4Vg== dependencies: bluebird "^3.5.0" - request-promise-core "1.1.1" - stealthy-require "^1.1.0" - tough-cookie ">=2.3.3" + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" -request@^2.79.0, request@^2.85.0: - version "2.85.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - hawk "~6.0.2" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - stringstream "~0.0.5" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -request@^2.87.0: +request@^2.85.0, request@^2.86.0, request@^2.87.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -2929,14 +5718,22 @@ request@^2.87.0: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= dependencies: caller-path "^0.1.0" resolve-from "^1.0.0" @@ -2944,6 +5741,7 @@ require-uncached@^1.0.3: require_optional@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" + integrity sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g== dependencies: resolve-from "^2.0.0" semver "^5.1.0" @@ -2951,28 +5749,41 @@ require_optional@^1.0.1: resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= resolve-from@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= + +resolve-options@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" + integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE= + dependencies: + value-or-function "^3.0.0" resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.1.x: +resolve@1.1.7, resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c" +resolve@^1.1.3, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" + integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== dependencies: - path-parse "^1.0.5" + path-parse "^1.0.6" restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: onetime "^2.0.0" signal-exit "^3.0.2" @@ -2980,61 +5791,80 @@ restore-cursor@^2.0.0: ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" +rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: - align-text "^0.1.1" - -rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" + glob "^7.1.3" run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= dependencies: is-promise "^2.1.0" rx-lite-aggregates@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= dependencies: rx-lite "*" rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= -safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - -safe-buffer@^5.1.2: +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-json-parse@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" + integrity sha1-PnZyPjjf3aE8mx0poeB//uSzC1c= + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +semver@^6.1.1: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== dependencies: debug "2.6.9" depd "~1.1.2" @@ -3053,6 +5883,7 @@ send@0.16.2: serve-static@1.13.2: version "1.13.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" @@ -3062,68 +5893,66 @@ serve-static@1.13.2: set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" is-plain-object "^2.0.3" split-string "^3.0.1" -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" - setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= signal-exit@^3.0.0, signal-exit@^3.0.1, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= slice-ansi@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== dependencies: is-fullwidth-code-point "^2.0.0" sliced@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/sliced/-/sliced-0.0.5.tgz#5edc044ca4eb6f7816d50ba2fc63e25d8fe4707f" + integrity sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8= sliced@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" + integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E= slide@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" @@ -3132,12 +5961,14 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" debug "^2.2.0" @@ -3148,49 +5979,63 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sntp@2.x.x: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= dependencies: - hoek "4.x.x" + is-plain-obj "^1.0.0" source-map-resolve@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== dependencies: - atob "^2.0.0" + atob "^2.1.1" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@^0.5.9: + version "0.5.12" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= dependencies: amdefine ">=0.0.4" +space-separated-tokens@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.4.tgz#27910835ae00d0adfcdbd0ad7e611fb9544351fa" + integrity sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA== + spawn-wrap@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.2.tgz#cff58e73a8224617b6561abdc32586ea0c82248c" + integrity sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg== dependencies: foreground-child "^1.5.6" mkdirp "^0.5.0" @@ -3200,139 +6045,238 @@ spawn-wrap@^1.4.2: which "^1.3.0" spdx-correct@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== spdx-expression-parse@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sqlite3@^4.0.0: - version "4.0.8" - resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.0.8.tgz#81ee60d54befaa52f5421fe6337050bd43d4bb95" - integrity sha512-kgwHu4j10KhpCHtx//dejd/tVQot7jc3sw+Sn0vMuKOw0X00Ckyg9VceKgzPyGmmz+zEoYue9tOLriWTvYy0ww== + version "4.0.9" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.0.9.tgz#cff74550fa5a1159956815400bdef69245557640" + integrity sha512-IkvzjmsWQl9BuBiM4xKpl5X8WCR4w0AeJHRdobCdXZ8dT/lNc1XS6WqvY35N6+YzIIgzSBeY5prdFObID9F9tA== dependencies: nan "^2.12.1" node-pre-gyp "^0.11.0" request "^2.87.0" sshpk@^1.7.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" ecc-jsbn "~0.1.1" + getpass "^0.1.1" jsbn "~0.1.0" + safer-buffer "^2.0.2" tweetnacl "~0.14.0" -stack-trace@0.0.9: - version "0.0.9" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" +stack-trace@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + +state-toggle@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.2.tgz#75e93a61944116b4959d665c8db2d243631d6ddc" + integrity sha512-8LpelPGR0qQM4PnfLiplOQNJcIN1/r2Gy0xKB2zKnIW2YzPMt2sR4I/+gtPjhN7Svh9kw+zqEg2SFwpBO9iNiw== static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2": +"statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== -stealthy-require@^1.1.0: +stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= -string-width@^1.0.1, string-width@^1.0.2: +stream-array@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/stream-array/-/stream-array-1.1.2.tgz#9e5f7345f2137c30ee3b498b9114e80b52bb7eb5" + integrity sha1-nl9zRfITfDDuO0mLkRToC1K7frU= + dependencies: + readable-stream "~2.1.0" + +stream-combiner2@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4= + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-template@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= + +string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" + integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^5.2.0" + +string_decoder@0.10, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" +stringify-entities@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-1.3.2.tgz#a98417e5471fd227b3e45d3db1861c11caf668f7" + integrity sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A== + dependencies: + character-entities-html4 "^1.0.0" + character-entities-legacy "^1.0.0" + is-alphanumerical "^1.0.0" + is-hexadecimal "^1.0.0" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" +strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= dependencies: is-utf8 "^0.2.0" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -strip-json-comments@~2.0.1: +strip-json-comments@2.0.1, strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -superagent@3.8.2, superagent@^3.0.0: +subarg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI= + dependencies: + minimist "^1.1.0" + +superagent@3.8.2: version "3.8.2" resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.2.tgz#e4a11b9d047f7d3efeb3bbe536d9ec0021d16403" integrity sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ== @@ -3348,45 +6292,75 @@ superagent@3.8.2, superagent@^3.0.0: qs "^6.5.1" readable-stream "^2.0.5" +superagent@^3.8.3: + version "3.8.3" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" + integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== + dependencies: + component-emitter "^1.2.0" + cookiejar "^2.1.0" + debug "^3.1.0" + extend "^3.0.0" + form-data "^2.3.1" + formidable "^1.2.0" + methods "^1.1.1" + mime "^1.4.1" + qs "^6.5.1" + readable-stream "^2.3.5" + supertest-as-promised@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/supertest-as-promised/-/supertest-as-promised-4.0.2.tgz#0464f2bd256568d4a59bce84269c0548f6879f1a" + integrity sha1-BGTyvSVlaNSlm86EJpwFSPaHnxo= dependencies: bluebird "^3.3.1" methods "^1.1.1" supertest@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/supertest/-/supertest-3.0.0.tgz#8d4bb68fd1830ee07033b1c5a5a9a4021c965296" + version "3.4.2" + resolved "https://registry.yarnpkg.com/supertest/-/supertest-3.4.2.tgz#bad7de2e43d60d27c8caeb8ab34a67c8a5f71aad" + integrity sha512-WZWbwceHUo2P36RoEIdXvmqfs47idNNZjCuJOqDz6rvtkk8ym56aU5oglORCpPeXGxT7l9rkJ41+O1lffQXYSA== dependencies: - methods "~1.1.2" - superagent "^3.0.0" + methods "^1.1.2" + superagent "^3.8.3" -supports-color@4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== dependencies: - has-flag "^2.0.0" + has-flag "^3.0.0" supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= supports-color@^3.1.0, supports-color@^3.1.2: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= dependencies: has-flag "^1.0.0" supports-color@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== dependencies: has-flag "^3.0.0" table@4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== dependencies: ajv "^5.2.3" ajv-keywords "^2.1.0" @@ -3396,23 +6370,25 @@ table@4.0.2: string-width "^2.1.1" tar@^4: - version "4.4.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.1.tgz#b25d5a8470c976fd7a9a8a350f42c59e9fa81749" + version "4.4.10" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" + integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== dependencies: - chownr "^1.0.1" + chownr "^1.1.1" fs-minipass "^1.2.5" - minipass "^2.2.4" - minizlib "^1.1.0" + minipass "^2.3.5" + minizlib "^1.2.1" mkdirp "^0.5.0" - safe-buffer "^5.1.1" - yallist "^3.0.2" + safe-buffer "^5.1.2" + yallist "^3.0.3" test-exclude@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa" + version "4.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" + integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA== dependencies: arrify "^1.0.1" - micromatch "^3.1.8" + micromatch "^2.3.11" object-assign "^4.1.0" read-pkg-up "^1.0.1" require-main-filename "^1.0.1" @@ -3420,34 +6396,82 @@ test-exclude@^4.2.0: text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -through@^2.3.6: +through2-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" + integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +"through@>=2.2.7 <3", through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= timed-out@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +tiny-lr@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab" + integrity sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA== + dependencies: + body "^5.1.0" + debug "^3.1.0" + faye-websocket "~0.10.0" + livereload-js "^2.3.0" + object-assign "^4.1.0" + qs "^6.4.0" tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" +to-absolute-glob@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" + integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs= + dependencies: + is-absolute "^1.0.0" + is-negated-glob "^1.0.0" + to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -3455,17 +6479,27 @@ to-regex-range@^2.1.0: to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" extend-shallow "^3.0.2" regex-not "^1.0.2" safe-regex "^1.1.0" -tough-cookie@>=2.3.3, tough-cookie@~2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" +to-through@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" + integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY= dependencies: - punycode "^1.4.1" + through2 "^2.0.3" + +tough-cookie@^2.3.3: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" tough-cookie@~2.4.3: version "2.4.3" @@ -3475,70 +6509,220 @@ tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" +trim-lines@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-1.1.2.tgz#c8adbdbdae21bb5c2766240a661f693afe23e59b" + integrity sha512-3GOuyNeTqk3FAqc3jOJtw7FTjYl94XBR5aD9QnDbK/T4CA9sW/J0l9RoaRPE9wyPP7NF331qnHnvJFBJ+IDkmQ== + trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +trim-trailing-lines@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.2.tgz#d2f1e153161152e9f02fabc670fb40bec2ea2e3a" + integrity sha512-MUjYItdrqqj2zpcHFTkMa9WAv4JHTI6gnRQGPFLrt5L9a6tRMiDnIqYl8JBvu2d2Tc3lWJKQwlGCp0K8AvCM+Q== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +trough@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.4.tgz#3b52b1f13924f460c3fbfd0df69b587dbcbc762e" + integrity sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q== tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" -type-is@~1.6.15, type-is@~1.6.16: - version "1.6.16" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" +type-is@~1.6.16: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" - mime-types "~2.1.18" + mime-types "~2.1.24" -typedarray@^0.0.6: +typedarray@^0.0.6, typedarray@~0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -uglify-js@^2.6: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" +typescript@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" + integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== + +uglify-js@^3.1.4: + version "3.6.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" + integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" + commander "~2.20.0" + source-map "~0.6.1" -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= + +unherit@^1.0.4: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.2.tgz#14f1f397253ee4ec95cec167762e77df83678449" + integrity sha512-W3tMnpaMG7ZY6xe/moK04U9fBhi6wEiCYHUW5Mop/wQHf12+79EQGwxYejNdhEz2mkqkBlGwm7pxmgBKMVUj0w== + dependencies: + inherits "^2.0.1" + xtend "^4.0.1" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + +unified@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-6.2.0.tgz#7fbd630f719126d67d40c644b7e3f617035f6dba" + integrity sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-plain-obj "^1.1.0" + trough "^1.0.0" + vfile "^2.0.0" + x-is-string "^0.1.0" union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" - set-value "^0.4.3" + set-value "^2.0.1" + +unique-stream@^2.0.2: + version "2.3.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" + integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== + dependencies: + json-stable-stringify-without-jsonify "^1.0.1" + through2-filter "^3.0.0" + +unist-builder@^1.0.1, unist-builder@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-1.0.4.tgz#e1808aed30bd72adc3607f25afecebef4dd59e17" + integrity sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg== + dependencies: + object-assign "^4.1.0" + +unist-util-generated@^1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.4.tgz#2261c033d9fc23fae41872cdb7663746e972c1a7" + integrity sha512-SA7Sys3h3X4AlVnxHdvN/qYdr4R38HzihoEVY2Q2BZu8NHWDnw5OGcC/tXWjQfd4iG+M6qRFNIRGqJmp2ez4Ww== + +unist-util-is@^2.0.0, unist-util-is@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-2.1.3.tgz#459182db31f4742fceaea88d429693cbf0043d20" + integrity sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA== + +unist-util-is@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" + integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== + +unist-util-position@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.0.3.tgz#fff942b879538b242096c148153826664b1ca373" + integrity sha512-28EpCBYFvnMeq9y/4w6pbnFmCUfzlsc41NJui5c51hOFjBA1fejcwc+5W4z2+0ECVbScG3dURS3JTVqwenzqZw== + +unist-util-remove-position@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.3.tgz#d91aa8b89b30cb38bad2924da11072faa64fd972" + integrity sha512-CtszTlOjP2sBGYc2zcKA/CvNdTdEs3ozbiJ63IPBxh8iZg42SCCb8m04f8z2+V1aSk5a7BxbZKEdoDjadmBkWA== + dependencies: + unist-util-visit "^1.1.0" + +unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6" + integrity sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ== + +unist-util-stringify-position@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.1.tgz#de2a2bc8d3febfa606652673a91455b6a36fb9f3" + integrity sha512-Zqlf6+FRI39Bah8Q6ZnNGrEHUhwJOkHde2MHVk96lLyftfJJckaPslKgzhVcviXj8KcE9UJM9F+a4JEiBUTYgA== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" + integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== + dependencies: + unist-util-is "^3.0.0" + +unist-util-visit@^1.0.0, unist-util-visit@^1.1.0, unist-util-visit@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" + integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== + dependencies: + unist-util-visit-parents "^2.0.0" unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -3549,88 +6733,228 @@ uri-js@^4.2.2: urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= use@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" - dependencies: - kind-of "^6.0.2" + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.0.tgz#6728fc0459c450d796a99c31837569bdf672d728" - -uuid@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" - -uuid@^3.3.2: +uuid@3.3.2, uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== +v8flags@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8" + integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w== + dependencies: + homedir-polyfill "^1.0.1" + validate-npm-package-license@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +value-or-function@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" + integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM= + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" extsprintf "^1.2.0" +vfile-location@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.5.tgz#c83eb02f8040228a8d2b3f10e485be3e3433e0a2" + integrity sha512-Pa1ey0OzYBkLPxPZI3d9E+S4BmvfVwNAAXrrqGbwTVXWaX2p9kM1zZ+n35UtVM06shmWKH4RPRN8KI80qE3wNQ== + +vfile-message@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.1.1.tgz#5833ae078a1dfa2d96e9647886cd32993ab313e1" + integrity sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA== + dependencies: + unist-util-stringify-position "^1.1.1" + +vfile-message@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.1.tgz#951881861c22fc1eb39f873c0b93e336a64e8f6d" + integrity sha512-KtasSV+uVU7RWhUn4Lw+wW1Zl/nW8JWx7JCPps10Y9JRRIDeDXf8wfBLoOSsJLyo27DqMyAi54C6Jf/d6Kr2Bw== + dependencies: + "@types/unist" "^2.0.2" + unist-util-stringify-position "^2.0.0" + +vfile-reporter@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/vfile-reporter/-/vfile-reporter-6.0.0.tgz#753119f51dec9289b7508b457afc0cddf5e07f2e" + integrity sha512-8Is0XxFxWJUhPJdOg3CyZTqd3ICCWg6r304PuBl818ZG91h4FMS3Q+lrOPS+cs5/DZK3H0+AkJdH0J8JEwKtDA== + dependencies: + repeat-string "^1.5.0" + string-width "^4.0.0" + supports-color "^6.0.0" + unist-util-stringify-position "^2.0.0" + vfile-sort "^2.1.2" + vfile-statistics "^1.1.0" + +vfile-sort@^2.1.0, vfile-sort@^2.1.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/vfile-sort/-/vfile-sort-2.2.1.tgz#74e714f9175618cdae96bcaedf1a3dc711d87567" + integrity sha512-5dt7xEhC44h0uRQKhbM2JAe0z/naHphIZlMOygtMBM9Nn0pZdaX5fshhwWit9wvsuP8t/wp43nTDRRErO1WK8g== + +vfile-statistics@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/vfile-statistics/-/vfile-statistics-1.1.3.tgz#e9c87071997fbcb4243764d2c3805e0bb0820c60" + integrity sha512-CstaK/ebTz1W3Qp41Bt9Lj/2DmumFsCwC2sKahDNSPh0mPh7/UyMLCoU8ZBX34CRU0d61B4W41yIFsV0NKMZeA== + +vfile@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-2.3.0.tgz#e62d8e72b20e83c324bc6c67278ee272488bf84a" + integrity sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w== + dependencies: + is-buffer "^1.1.4" + replace-ext "1.0.0" + unist-util-stringify-position "^1.0.0" + vfile-message "^1.0.0" + +vfile@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.0.1.tgz#fc3d43a1c71916034216bf65926d5ee3c64ed60c" + integrity sha512-lRHFCuC4SQBFr7Uq91oJDJxlnftoTLQ7eKIpMdubhYcVMho4781a8MWXLy3qZrZ0/STD1kRiKc0cQOHm4OkPeA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + replace-ext "1.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vinyl-fs@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" + integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== + dependencies: + fs-mkdirp-stream "^1.0.0" + glob-stream "^6.1.0" + graceful-fs "^4.0.0" + is-valid-glob "^1.0.0" + lazystream "^1.0.0" + lead "^1.0.0" + object.assign "^4.0.4" + pumpify "^1.3.5" + readable-stream "^2.3.3" + remove-bom-buffer "^3.0.0" + remove-bom-stream "^1.2.0" + resolve-options "^1.1.0" + through2 "^2.0.0" + to-through "^2.0.0" + value-or-function "^3.0.0" + vinyl "^2.0.0" + vinyl-sourcemap "^1.1.0" + +vinyl-sourcemap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" + integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY= + dependencies: + append-buffer "^1.0.2" + convert-source-map "^1.5.0" + graceful-fs "^4.1.6" + normalize-path "^2.1.1" + now-and-later "^2.0.0" + remove-bom-buffer "^3.0.0" + vinyl "^2.0.0" + +vinyl@^2.0.0, vinyl@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" + integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + +vue-template-compiler@^2.5.16: + version "2.6.10" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.10.tgz#323b4f3495f04faa3503337a82f5d6507799c9cc" + integrity sha512-jVZkw4/I/HT5ZMvRnhv78okGusqe0+qH2A0Em0Cp8aq78+NK9TII263CDVz2QXZsIT+yyV/gZc/j/vlwa+Epyg== + dependencies: + de-indent "^1.0.2" + he "^1.1.0" + +websocket-driver@>=0.5.1: + version "0.7.3" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" + integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== + dependencies: + http-parser-js ">=0.4.0 <0.4.11" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.1.1, which@^1.2.9, which@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" +which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" +wide-align@1.1.3, wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: - string-width "^1.0.2" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + string-width "^1.0.2 || 2" wordwrap@^1.0.0, wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -3638,10 +6962,12 @@ wrap-ansi@^2.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= write-file-atomic@^1.1.4: version "1.3.4" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -3650,40 +6976,91 @@ write-file-atomic@^1.1.4: write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= dependencies: mkdirp "^0.5.1" -xtend@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" +x-is-string@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" + integrity sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI= + +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" +yallist@^3.0.0, yallist@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + +yargs-parser@13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" + integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^13.0.0: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" yargs-parser@^8.0.0: version "8.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ== dependencies: camelcase "^4.1.0" yargs-parser@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= dependencies: camelcase "^4.1.0" +yargs-unparser@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.5.0.tgz#f2bb2a7e83cbc87bb95c8e572828a06c9add6e0d" + integrity sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw== + dependencies: + flat "^4.1.0" + lodash "^4.17.11" + yargs "^12.0.5" + yargs@11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== dependencies: cliui "^4.0.0" decamelize "^1.1.1" @@ -3698,11 +7075,37 @@ yargs@11.1.0: y18n "^3.2.1" yargs-parser "^9.0.2" -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" +yargs@13.2.2: + version "13.2.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993" + integrity sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA== dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" + cliui "^4.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.0.0" + +yargs@^12.0.2, yargs@^12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" From bc4d73821db7c0eaaf113b7fd833aac195c1fa26 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sat, 27 Jul 2019 02:05:38 +0200 Subject: [PATCH 69/85] Upgraded webpack-dev-server to not have a screaming vulnerability --- client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/package.json b/client/package.json index 3529ce3..733a58c 100644 --- a/client/package.json +++ b/client/package.json @@ -31,7 +31,7 @@ "urijs": "^1.18.12", "webfontloader": "^1.6.28", "webpack": "^3.5.5", - "webpack-dev-server": "^2.4.5", + "webpack-dev-server": "^3.1.11", "webpack-merge": "^4.1.0" }, "devDependencies": { From eb0881f19ef5c6df2b302fc170a0306ac01cff47 Mon Sep 17 00:00:00 2001 From: snyk-test Date: Sat, 27 Jul 2019 00:16:09 +0000 Subject: [PATCH 70/85] fix: client/package.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-JSYAML-173999 - https://snyk.io/vuln/SNYK-JS-JSYAML-174129 - https://snyk.io/vuln/npm:mem:20180117 --- client/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/package.json b/client/package.json index 733a58c..02bf3f7 100644 --- a/client/package.json +++ b/client/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "clean-webpack-plugin": "^0.1.17", - "css-loader": "^0.28.4", + "css-loader": "^1.0.0", "html-webpack-plugin": "^2.28.0", "path": "^0.12.7", "react": "^15.6.1", @@ -30,7 +30,7 @@ "redux-thunk": "^2.2.0", "urijs": "^1.18.12", "webfontloader": "^1.6.28", - "webpack": "^3.5.5", + "webpack": "^4.0.0", "webpack-dev-server": "^3.1.11", "webpack-merge": "^4.1.0" }, From b9831c6b3dee865b7778eee7c8c8358879e1924f Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Fri, 4 Oct 2019 20:37:06 +0200 Subject: [PATCH 71/85] Forgot to reasing variables after copy-pasting them in convertTmdbToMovie --- seasoned_api/src/tmdb/convertTmdbToMovie.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/seasoned_api/src/tmdb/convertTmdbToMovie.js b/seasoned_api/src/tmdb/convertTmdbToMovie.js index 2b54c0f..071d02c 100644 --- a/seasoned_api/src/tmdb/convertTmdbToMovie.js +++ b/seasoned_api/src/tmdb/convertTmdbToMovie.js @@ -11,19 +11,19 @@ function convertTmdbToMovie(tmdbMovie, credits=undefined) { movie.credits = credits; } - if (tmdbMovie.release_date !== undefined && tmdbMovie.genres) { + if (tmdbMovie.release_date !== undefined && tmdbMovie.release_date) { movie.release_date = new Date(tmdbMovie.release_date); movie.year = movie.release_date.getFullYear(); } - if (tmdbMovie.poster_path !== undefined && tmdbMovie.genres) { + if (tmdbMovie.poster_path !== undefined && tmdbMovie.poster_path) { movie.poster = tmdbMovie.poster_path; } - if (tmdbMovie.backdrop_path !== undefined && tmdbMovie.genres) { + if (tmdbMovie.backdrop_path !== undefined && tmdbMovie.backdrop_path) { movie.backdrop = tmdbMovie.backdrop_path; } - if (tmdbMovie.status !== undefined && tmdbMovie.genres) { + if (tmdbMovie.status !== undefined && tmdbMovie.status) { movie.status = tmdbMovie.status; } @@ -31,15 +31,15 @@ function convertTmdbToMovie(tmdbMovie, credits=undefined) { movie.genres = tmdbMovie.genres.map(genre => genre.name); } - if (tmdbMovie.tagline !== undefined && tmdbMovie.genres) { + if (tmdbMovie.tagline !== undefined && tmdbMovie.tagline) { movie.tagline = tmdbMovie.tagline; } - if (tmdbMovie.runtime !== undefined && tmdbMovie.genres) { + if (tmdbMovie.runtime !== undefined && tmdbMovie.runtime) { movie.runtime = tmdbMovie.runtime; } - if (tmdbMovie.imdb_id !== undefined && tmdbMovie.genres) { + if (tmdbMovie.imdb_id !== undefined && tmdbMovie.imdb_id) { movie.imdb_id = tmdbMovie.imdb_id; } From 0ca3f81bf896d30a3dfd8c930c99b67f0d79b3fb Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Fri, 4 Oct 2019 20:55:39 +0200 Subject: [PATCH 72/85] listController first defines all async functions as constant variables then module exports them all as a dict --- .../controllers/list/listController.js | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/seasoned_api/src/webserver/controllers/list/listController.js b/seasoned_api/src/webserver/controllers/list/listController.js index 118eaa4..ad68da3 100644 --- a/seasoned_api/src/webserver/controllers/list/listController.js +++ b/seasoned_api/src/webserver/controllers/list/listController.js @@ -35,51 +35,68 @@ function getTmdbShowList(res, listname, page) { }) } -exports.nowPlayingMovies = (req, res) => { +const respondWithUnknownError = (res, error) => { + // console.log('Unknown error:', error) + res.status(500).send({ success: false, error: 'Unhandled error occured'}) +} + +const nowPlayingMovies = (req, res) => { const { page } = req.query; const listname = 'miscNowPlayingMovies' - getTmdbMovieList(res, listname, page); + return tmdb.movieList(listname, page) + .then(nowPlayingMovieList => res.send(nowPlayingMovieList)) + .catch(error => respondUnknownError(res, error)) } -exports.popularMovies = (req, res) => { +const popularMovies = (req, res) => { const { page } = req.query; const listname = 'miscPopularMovies' getTmdbMovieList(res, listname, page); } -exports.topRatedMovies = (req, res) => { +const topRatedMovies = (req, res) => { const { page } = req.query; const listname = 'miscTopRatedMovies' getTmdbMovieList(res, listname, page); } -exports.upcomingMovies = (req, res) => { +const upcomingMovies = (req, res) => { const { page } = req.query; const listname = 'miscUpcomingMovies' getTmdbMovieList(res, listname, page); } -exports.nowPlayingShows = (req, res) => { +const nowPlayingShows = (req, res) => { const { page } = req.query; const listname = 'tvOnTheAir' getTmdbShowList(res, listname, page); } -exports.popularShows = (req, res) => { +const popularShows = (req, res) => { const { page } = req.query; const listname = 'miscPopularTvs' getTmdbShowList(res, listname, page); } -exports.topRatedShows = (req, res) => { +const topRatedShows = (req, res) => { const { page } = req.query; const listname = 'miscTopRatedTvs' getTmdbShowList(res, listname, page); } + +module.exports = { + nowPlayingMovies, + popularMovies, + topRatedMovies, + upcomingMovies, + nowPlayingShows, + popularShows, + topRatedShows +} From 90aa4d24859a8346cfae9dce1c944244abf8b32d Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Fri, 4 Oct 2019 21:21:52 +0200 Subject: [PATCH 73/85] Rewrote the movie & show list controller to be more abstract and easier to extend later --- .../controllers/list/listController.js | 78 +++++-------------- 1 file changed, 19 insertions(+), 59 deletions(-) diff --git a/seasoned_api/src/webserver/controllers/list/listController.js b/seasoned_api/src/webserver/controllers/list/listController.js index ad68da3..037bc89 100644 --- a/seasoned_api/src/webserver/controllers/list/listController.js +++ b/seasoned_api/src/webserver/controllers/list/listController.js @@ -17,79 +17,39 @@ const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); // + movie/latest // -function getTmdbMovieList(res, listname, page) { - Promise.resolve() - .then(() => tmdb.movieList(listname, page)) - .then((response) => res.send(response)) - .catch((error) => { - res.status(500).send({ success: false, error: error.message }); - }) -} -function getTmdbShowList(res, listname, page) { - Promise.resolve() - .then(() => tmdb.showList(listname, page)) - .then((response) => res.send(response)) - .catch((error) => { - res.status(500).send({ success: false, error: error.message }); - }) -} +const respondWithErrorMessage = (res, error) => { + const status = error.status || 500 + const message = error.message || 'Unhandled error occured' + const success = error.success || false -const respondWithUnknownError = (res, error) => { // console.log('Unknown error:', error) - res.status(500).send({ success: false, error: 'Unhandled error occured'}) + return res.status(status).send({ success: success, error: message}) } -const nowPlayingMovies = (req, res) => { +function fetchTmdbMovieList(req, res, listName, tmdbListFunction) { const { page } = req.query; - const listname = 'miscNowPlayingMovies' - return tmdb.movieList(listname, page) + return tmdb.movieList(listName, page) .then(nowPlayingMovieList => res.send(nowPlayingMovieList)) - .catch(error => respondUnknownError(res, error)) + .catch(error => respondWithErrorMessage(res, error)) } -const popularMovies = (req, res) => { +function fetchTmdbShowList(req, res, listName, tmdbListFunction) { const { page } = req.query; - const listname = 'miscPopularMovies' - getTmdbMovieList(res, listname, page); + return tmdb.showList(listName, page) + .then(nowPlayingMovieList => res.send(nowPlayingMovieList)) + .catch(error => respondWithErrorMessage(res, error)) } -const topRatedMovies = (req, res) => { - const { page } = req.query; - const listname = 'miscTopRatedMovies' - - getTmdbMovieList(res, listname, page); -} - -const upcomingMovies = (req, res) => { - const { page } = req.query; - const listname = 'miscUpcomingMovies' - - getTmdbMovieList(res, listname, page); -} - -const nowPlayingShows = (req, res) => { - const { page } = req.query; - const listname = 'tvOnTheAir' - - getTmdbShowList(res, listname, page); -} - -const popularShows = (req, res) => { - const { page } = req.query; - const listname = 'miscPopularTvs' - - getTmdbShowList(res, listname, page); -} - -const topRatedShows = (req, res) => { - const { page } = req.query; - const listname = 'miscTopRatedTvs' - - getTmdbShowList(res, listname, page); -} +const nowPlayingMovies = (req, res) => fetchTmdbMovieList(req, res, 'miscNowPlayingMovies') +const popularMovies = (req, res) => fetchTmdbMovieList(req, res, 'miscPopularMovies') +const topRatedMovies = (req, res) => fetchTmdbMovieList(req, res, 'miscTopRatedMovies') +const upcomingMovies = (req, res) => fetchTmdbMovieList(req, res, 'miscUpcomingMovies') +const nowPlayingShows = (req, res) => fetchTmdbShowList(req, res, 'tvOnTheAir') +const popularShows = (req, res) => fetchTmdbShowList(req, res, 'miscPopularTvs') +const topRatedShows = (req, res) => fetchTmdbShowList(req, res, 'miscTopRatedTvs') module.exports = { nowPlayingMovies, From 6c2c81a1a180e592d5d85cad717acfddcd70a936 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Fri, 4 Oct 2019 22:36:39 +0200 Subject: [PATCH 74/85] Updated movieInfo controller to also handle requesting release_dates as query parameter --- seasoned_api/src/tmdb/convertTmdbToMovie.js | 26 +++++++++++++++++-- seasoned_api/src/tmdb/tmdb.js | 13 +++++++--- .../webserver/controllers/info/movieInfo.js | 13 ++++++++-- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/seasoned_api/src/tmdb/convertTmdbToMovie.js b/seasoned_api/src/tmdb/convertTmdbToMovie.js index 071d02c..3604f8c 100644 --- a/seasoned_api/src/tmdb/convertTmdbToMovie.js +++ b/seasoned_api/src/tmdb/convertTmdbToMovie.js @@ -2,13 +2,35 @@ import { Movie } from './types' const tmdbSwitcher = (tmdbMovie, property) => tmdbMovie[property] -function convertTmdbToMovie(tmdbMovie, credits=undefined) { +const releaseTypeEnum = { + 1: 'Premier', + 2: 'Limited theatrical', + 3: 'Theatrical', + 4: 'Digital', + 5: 'Physical', + 6: 'TV' +} + +function convertTmdbToMovie(tmdbMovie, credits=undefined, releaseDates=undefined) { const movie = new Movie(tmdbMovie.id, tmdbMovie.title) movie.overview = tmdbMovie.overview; movie.rank = tmdbMovie.vote_average; if (credits) { - movie.credits = credits; + movie.credits = { cast: credits.cast, crew: credits.crew }; + } + + if (releaseDates) { + movie.release_dates = releaseDates.results.map((releasePlace) => { + const newestRelease = releasePlace.release_dates.sort((a,b) => a.type < b.type ? 1 : -1)[0] + const type = releaseTypeEnum[newestRelease.type] + + return { + country: releasePlace.iso_3166_1, + type: type, + date: newestRelease.release_date + } + }) } if (tmdbMovie.release_date !== undefined && tmdbMovie.release_date) { diff --git a/seasoned_api/src/tmdb/tmdb.js b/seasoned_api/src/tmdb/tmdb.js index 3675dd8..979dda1 100644 --- a/seasoned_api/src/tmdb/tmdb.js +++ b/seasoned_api/src/tmdb/tmdb.js @@ -74,7 +74,7 @@ class TMDB { * @param {String} type filter results by type (default movie). * @returns {Promise} succeeds if movie was found */ - movieInfo(identifier, credits=false) { + movieInfo(identifier, credits=false, releaseDates=false) { const query = { id: identifier }; const cacheKey = `${this.cacheTags.movieInfo}:${identifier}:${credits}`; @@ -82,6 +82,13 @@ class TMDB { if (credits) { requests.push(this.tmdb('movieCredits', query)) + } else { + // This is because we expect ordered parameters below + requests.push(Promise.resolve([])) + } + + if (releaseDates) { + requests.push(this.tmdb('movieReleaseDates', query)) } return Promise.resolve() @@ -96,8 +103,8 @@ class TMDB { throw new Error('Unexpected error has occured:', error.message) }) - .then(([movies, credits]) => this.cache.set(cacheKey, [movies, credits])) - .then(([movies, credits]) => convertTmdbToMovie(movies, credits)) + .then(([movies, credits, releaseDates]) => this.cache.set(cacheKey, [movies, credits, releaseDates])) + .then(([movies, credits, releaseDates]) => convertTmdbToMovie(movies, credits, releaseDates)) } /** diff --git a/seasoned_api/src/webserver/controllers/info/movieInfo.js b/seasoned_api/src/webserver/controllers/info/movieInfo.js index 8b2f565..2c18b5e 100644 --- a/seasoned_api/src/webserver/controllers/info/movieInfo.js +++ b/seasoned_api/src/webserver/controllers/info/movieInfo.js @@ -14,8 +14,17 @@ const plex = new Plex(configuration.get('plex', 'ip')); */ async function movieInfoController(req, res) { const movieId = req.params.id; - const { credits } = req.query; - const movie = await tmdb.movieInfo(movieId, credits); + const queryCredits = req.query.credits; + const queryReleaseDates = req.query.release_dates; + let credits = undefined + let releaseDates = undefined + + if (queryCredits && queryCredits.toLowerCase() === 'true') + credits = true + if (queryReleaseDates && queryReleaseDates.toLowerCase() === 'true') + releaseDates = true + + const movie = await tmdb.movieInfo(movieId, credits, releaseDates); plex.existsInPlex(movie) .catch((error) => { console.log('Error when searching plex'); }) From 9308d4ea9b2b9db176bd41655000fe1c57106e55 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 3 Nov 2019 15:02:45 +0100 Subject: [PATCH 75/85] Credits endpoint for movies --- seasoned_api/src/tmdb/tmdb.js | 30 +++++++- seasoned_api/src/tmdb/types.js | 3 +- seasoned_api/src/tmdb/types/credits.js | 76 +++++++++++++++++++ seasoned_api/src/tmdb/types/movie.js | 23 +++++- seasoned_api/src/tmdb/types/person.js | 12 +++ seasoned_api/src/tmdb/types/show.js | 32 ++++++-- .../webserver/controllers/movie/credits.js | 25 ++++++ 7 files changed, 191 insertions(+), 10 deletions(-) create mode 100644 seasoned_api/src/tmdb/types/credits.js create mode 100644 seasoned_api/src/webserver/controllers/movie/credits.js diff --git a/seasoned_api/src/tmdb/tmdb.js b/seasoned_api/src/tmdb/tmdb.js index 979dda1..4d95e96 100644 --- a/seasoned_api/src/tmdb/tmdb.js +++ b/seasoned_api/src/tmdb/tmdb.js @@ -2,6 +2,8 @@ const moviedb = require('km-moviedb'); const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); const convertTmdbToShow = require('src/tmdb/convertTmdbToShow'); const convertTmdbToPerson = require('src/tmdb/convertTmdbToPerson'); + +const { Credits } = require('src/tmdb/types'); // const { tmdbInfo } = require('src/tmdb/types') class TMDB { @@ -13,7 +15,8 @@ class TMDB { movieSearch: 'mos', showSearch: 'ss', personSearch: 'ps', - movieInfo: 'mi', + movieInfo: 'mi', + movieCredits: 'mc', showInfo: 'si', personInfo: 'pi', miscNowPlayingMovies: 'npm', @@ -106,6 +109,31 @@ class TMDB { .then(([movies, credits, releaseDates]) => this.cache.set(cacheKey, [movies, credits, releaseDates])) .then(([movies, credits, releaseDates]) => convertTmdbToMovie(movies, credits, releaseDates)) } + + tmdbCreditsError(error) { + if (error.status === 404) { + throw { + status: 404, + message: error.response.body.status_message + } + } + + throw { + status: 500, + message: 'An unexpected error occured while fetching credits from tmdb' + } + } + + movieCredits(identifier) { + const query = { id: identifier } + const cacheKey = `${this.cacheTags.movieCredits}:${identifier}` + + return this.cache.get(cacheKey) + .catch(() => this.tmdb('movieCredits', query)) + .catch(tmdbError => this.tmdbCreditsError(tmdbError)) + .then(credits => this.cache.set(cacheKey, credits, 1)) + .then(credits => Credits.convertFromTmdbResponse(credits)) + } /** * Retrieve a specific show by id from TMDB. diff --git a/seasoned_api/src/tmdb/types.js b/seasoned_api/src/tmdb/types.js index 5c8891e..08de9ab 100644 --- a/seasoned_api/src/tmdb/types.js +++ b/seasoned_api/src/tmdb/types.js @@ -1,5 +1,6 @@ import Movie from './types/movie.js' import Show from './types/show.js' import Person from './types/person.js' +import Credits from './types/credits.js' -module.exports = { Movie, Show, Person } +module.exports = { Movie, Show, Person, Credits } diff --git a/seasoned_api/src/tmdb/types/credits.js b/seasoned_api/src/tmdb/types/credits.js new file mode 100644 index 0000000..0e2213e --- /dev/null +++ b/seasoned_api/src/tmdb/types/credits.js @@ -0,0 +1,76 @@ +class Credits { + constructor(id, cast=[], crew=[]) { + this.id = id; + this.cast = cast; + this.crew = crew; + this.type = 'credits'; + } + + static convertFromTmdbResponse(response) { + console.log('this is our credits response', response) + const { id, cast, crew } = response; + + const allCast = cast.map(cast => + new CastMember(cast.character, cast.gender, cast.id, cast.name, cast.profile_path)) + const allCrew = crew.map(crew => + new CrewMember(crew.department, crew.gender, crew.id, crew.job, crew.name, crew.profile_path)) + + return new Credits(id, allCast, allCrew) + } + + createJsonResponse() { + return { + id: this.id, + cast: this.cast, + crew: this.crew + } + } +} + +class CastMember { + constructor(character, gender, id, name, profile_path) { + this.character = character; + this.gender = gender; + this.id = id; + this.name = name; + this.profile_path = profile_path; + this.type = 'cast member'; + } + + createJsonResponse() { + return { + character: this.character, + gender: this.gender, + id: this.id, + name: this.name, + profile_path: this.profile_path, + type: this.type + } + } +} + +class CrewMember { + constructor(department, gender, id, job, name, profile_path) { + this.department = department; + this.gender = gender; + this.id = id; + this.job = job; + this.name = name; + this.profile_path = profile_path; + this.type = 'crew member'; + } + + createJsonResponse() { + return { + department: this.department, + gender: this.gender, + id: this.id, + job: this.job, + name: this.name, + profile_path: this.profile_path, + type: this.type + } + } +} + +module.exports = Credits; diff --git a/seasoned_api/src/tmdb/types/movie.js b/seasoned_api/src/tmdb/types/movie.js index 1d443d2..d3e4a23 100644 --- a/seasoned_api/src/tmdb/types/movie.js +++ b/seasoned_api/src/tmdb/types/movie.js @@ -1,6 +1,7 @@ class Movie { - constructor(id, title, year=null, overview=null, poster=null, backdrop=null, rank=null, genres=null, status=null, - tagline=null, runtime=null, imdb_id=null) { + constructor(id, title, year=undefined, overview=undefined, poster=undefined, + backdrop=undefined, rank=undefined, genres=undefined, status=undefined, + tagline=undefined, runtime=undefined, imdb_id=undefined) { this.id = id; this.title = title; this.year = year; @@ -15,6 +16,24 @@ class Movie { this.imdb_id = imdb_id; this.type = 'movie'; } + + createJsonResponse() { + return { + id: this.id, + title: this.title, + year: this.year, + overview: this.overview, + poster: this.poster, + backdrop: this.backdrop, + rank: this.rank, + genres: this.genres, + status: this.status, + tagline: this.tagline, + runtime: this.runtime, + imdb_id: this.imdb_id, + type: this.type + } + } } module.exports = Movie; diff --git a/seasoned_api/src/tmdb/types/person.js b/seasoned_api/src/tmdb/types/person.js index 4c469fb..d051a2a 100644 --- a/seasoned_api/src/tmdb/types/person.js +++ b/seasoned_api/src/tmdb/types/person.js @@ -8,6 +8,18 @@ class Person { this.known_for = known_for; this.type = 'person'; } + + createJsonResponse() { + return { + id: this.id, + name: this.name, + poster: this.poster, + birthday: this.birthday, + deathday: this.deathday, + known_for: this.known_for, + type: this.type + } + } } module.exports = Person; diff --git a/seasoned_api/src/tmdb/types/show.js b/seasoned_api/src/tmdb/types/show.js index 5aaf8d1..d6b69d5 100644 --- a/seasoned_api/src/tmdb/types/show.js +++ b/seasoned_api/src/tmdb/types/show.js @@ -1,20 +1,40 @@ class Show { - constructor(id, title, year=null, seasons=null, episodes=null, overview=null, rank=null, genres=null, - poster=null, backdrop=null, status=null, runtime=null) { + constructor(id, title, year=null, overview=null, poster=null, backdrop=null, + seasons=null, episodes=null, rank=null, genres=null, status=null, + runtime=null) { this.id = id; this.title = title; this.year = year; - this.seasons = seasons; - this.episodes = episodes; this.overview = overview; - this.rank = rank; - this.genres = genres; this.poster = poster; this.backdrop = backdrop; + this.seasons = seasons; + this.episodes = episodes; + this.rank = rank; + this.genres = genres; this.status = status; this.runtime = runtime; this.type = 'show'; } + + createJsonResponse() { + return { + id: this.id, + title: this.title, + year: this.year, + overview: this.overview, + poster: this.poster, + backdrop: this.backdrop, + seasons: this.seasons, + episodes: this.episodes, + rank: this.rank, + genres: this.genres, + status: this.status, + runtime: this.runtime, + // imdb_id: this.imdb_id, + type: this.type + } + } } module.exports = Show; diff --git a/seasoned_api/src/webserver/controllers/movie/credits.js b/seasoned_api/src/webserver/controllers/movie/credits.js new file mode 100644 index 0000000..cd31924 --- /dev/null +++ b/seasoned_api/src/webserver/controllers/movie/credits.js @@ -0,0 +1,25 @@ +const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); +const TMDB = require('src/tmdb/tmdb'); + +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); + +const movieCreditsController = (req, res) => { + const movieId = req.params.id; + + tmdb.movieCredits(movieId) + .then(credits => res.send(credits.createJsonResponse())) + .catch(error => { + const { status, message } = error; + + if (status && message) { + res.status(error.status).send({ success: false, error: error.message }) + } else { + // TODO log unhandled errors + res.status(500).send({ message: 'An unexpected error occured while requesting movie credits' }) + } + }) +} + +module.exports = movieCreditsController; \ No newline at end of file From 500b75eaf65578658c638176fd7d11cfe4534be1 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 3 Nov 2019 15:04:14 +0100 Subject: [PATCH 76/85] We know there could be a 401 response so we handle it --- seasoned_api/src/tmdb/tmdb.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/seasoned_api/src/tmdb/tmdb.js b/seasoned_api/src/tmdb/tmdb.js index 4d95e96..ab8c847 100644 --- a/seasoned_api/src/tmdb/tmdb.js +++ b/seasoned_api/src/tmdb/tmdb.js @@ -116,6 +116,11 @@ class TMDB { status: 404, message: error.response.body.status_message } + } else if (error.status === 401) { + throw { + status: 401, + message: error.response.body.status_message + } } throw { From d2d396bb7a14478497f4b5b8a7d52e64a3db8199 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 3 Nov 2019 15:07:11 +0100 Subject: [PATCH 77/85] Set cache TTL for credits to 1 day --- seasoned_api/src/tmdb/tmdb.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seasoned_api/src/tmdb/tmdb.js b/seasoned_api/src/tmdb/tmdb.js index ab8c847..91fc81a 100644 --- a/seasoned_api/src/tmdb/tmdb.js +++ b/seasoned_api/src/tmdb/tmdb.js @@ -136,7 +136,7 @@ class TMDB { return this.cache.get(cacheKey) .catch(() => this.tmdb('movieCredits', query)) .catch(tmdbError => this.tmdbCreditsError(tmdbError)) - .then(credits => this.cache.set(cacheKey, credits, 1)) + .then(credits => this.cache.set(cacheKey, credits, 86400)) .then(credits => Credits.convertFromTmdbResponse(credits)) } From ef8d4d90b251d7b247d6e5c98cb7623060d63c69 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 3 Nov 2019 15:08:42 +0100 Subject: [PATCH 78/85] Removed console log --- seasoned_api/src/tmdb/types/credits.js | 1 - 1 file changed, 1 deletion(-) diff --git a/seasoned_api/src/tmdb/types/credits.js b/seasoned_api/src/tmdb/types/credits.js index 0e2213e..262093b 100644 --- a/seasoned_api/src/tmdb/types/credits.js +++ b/seasoned_api/src/tmdb/types/credits.js @@ -7,7 +7,6 @@ class Credits { } static convertFromTmdbResponse(response) { - console.log('this is our credits response', response) const { id, cast, crew } = response; const allCast = cast.map(cast => From bc3d4881bd08944ec8a00fa70da0579599655f5e Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 3 Nov 2019 15:43:35 +0100 Subject: [PATCH 79/85] New release_dates endpoint for movie --- seasoned_api/src/tmdb/tmdb.js | 33 +++++++++- seasoned_api/src/tmdb/types.js | 3 +- seasoned_api/src/tmdb/types/releaseDates.js | 62 +++++++++++++++++++ seasoned_api/src/webserver/app.js | 4 ++ .../controllers/movie/releaseDates.js | 26 ++++++++ 5 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 seasoned_api/src/tmdb/types/releaseDates.js create mode 100644 seasoned_api/src/webserver/controllers/movie/releaseDates.js diff --git a/seasoned_api/src/tmdb/tmdb.js b/seasoned_api/src/tmdb/tmdb.js index 91fc81a..80ea986 100644 --- a/seasoned_api/src/tmdb/tmdb.js +++ b/seasoned_api/src/tmdb/tmdb.js @@ -3,7 +3,7 @@ const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); const convertTmdbToShow = require('src/tmdb/convertTmdbToShow'); const convertTmdbToPerson = require('src/tmdb/convertTmdbToPerson'); -const { Credits } = require('src/tmdb/types'); +const { Credits, ReleaseDates} = require('src/tmdb/types'); // const { tmdbInfo } = require('src/tmdb/types') class TMDB { @@ -17,6 +17,7 @@ class TMDB { personSearch: 'ps', movieInfo: 'mi', movieCredits: 'mc', + movieReleaseDates: 'mrd', showInfo: 'si', personInfo: 'pi', miscNowPlayingMovies: 'npm', @@ -129,6 +130,25 @@ class TMDB { } } + tmdbRelaseDatesError(error) { + if (error.status === 404) { + throw { + status: 404, + message: error.response.body.status_message + } + } else if (error.status === 401) { + throw { + status: 401, + message: error.response.body.status_message + } + } + + throw { + status: 500, + message: 'An unexpected error occured while fetching release dates from tmdb' + } + } + movieCredits(identifier) { const query = { id: identifier } const cacheKey = `${this.cacheTags.movieCredits}:${identifier}` @@ -139,6 +159,17 @@ class TMDB { .then(credits => this.cache.set(cacheKey, credits, 86400)) .then(credits => Credits.convertFromTmdbResponse(credits)) } + + movieReleaseDates(identifier) { + const query = { id: identifier } + const cacheKey = `${this.cacheTags.movieReleaseDates}:${identifier}` + + return this.cache.get(cacheKey) + .catch(() => this.tmdb('movieReleaseDates', query)) + .catch(tmdbError => this.tmdbRelaseDatesError(tmdbError)) + .then(releaseDates => this.cache.set(cacheKey, releaseDates, 1)) + .then(releaseDates => ReleaseDates.convertFromTmdbResponse(releaseDates)) + } /** * Retrieve a specific show by id from TMDB. diff --git a/seasoned_api/src/tmdb/types.js b/seasoned_api/src/tmdb/types.js index 08de9ab..9b096c4 100644 --- a/seasoned_api/src/tmdb/types.js +++ b/seasoned_api/src/tmdb/types.js @@ -2,5 +2,6 @@ import Movie from './types/movie.js' import Show from './types/show.js' import Person from './types/person.js' import Credits from './types/credits.js' +import ReleaseDates from './types/releaseDates.js' -module.exports = { Movie, Show, Person, Credits } +module.exports = { Movie, Show, Person, ReleaseDates } diff --git a/seasoned_api/src/tmdb/types/releaseDates.js b/seasoned_api/src/tmdb/types/releaseDates.js new file mode 100644 index 0000000..3959922 --- /dev/null +++ b/seasoned_api/src/tmdb/types/releaseDates.js @@ -0,0 +1,62 @@ +class ReleaseDate { + constructor(certification, language, releaseDate, type, note) { + this.certification = certification; + this.language = language; + this.releaseDate = releaseDate; + this.type = this.releaseTypeLookup(type); + this.note = note; + } + + releaseTypeLookup(releaseTypeKey) { + const releaseTypeEnum = { + 1: 'Premier', + 2: 'Limited theatrical', + 3: 'Theatrical', + 4: 'Digital', + 5: 'Physical', + 6: 'TV' + } + if (releaseTypeKey <= Object.keys(releaseTypeEnum).length) { + return releaseTypeEnum[releaseTypeKey] + } else { + // TODO log | Release type not defined, does this need updating? + return null + } + } +} + +class Release { + constructor(country, releaseDates) { + this.country = country; + this.releaseDates = releaseDates; + } +} + +class ReleaseDates { + constructor(id, releases) { + this.id = id; + this.releases = releases; + } + + static convertFromTmdbResponse(response) { + console.log('this is relese dates response') + const { id, results } = response; + + const releases = results.map(countryRelease => + new Release( + countryRelease.iso_3166_1, + countryRelease.release_dates.map(rd => new ReleaseDate(rd.certification, rd.iso_639_1, rd.release_date, rd.type, rd.note)) + )) + + return new ReleaseDates(id, releases) + } + + createJsonResponse() { + return JSON.stringify({ + id: this.id, + release_dates: this.releases + }) + } +} + +module.exports = ReleaseDates; diff --git a/seasoned_api/src/webserver/app.js b/seasoned_api/src/webserver/app.js index cb84124..db48442 100644 --- a/seasoned_api/src/webserver/app.js +++ b/seasoned_api/src/webserver/app.js @@ -79,9 +79,13 @@ router.get('/v2/show/now_playing', listController.nowPlayingShows); router.get('/v2/show/popular', listController.popularShows); router.get('/v2/show/top_rated', listController.topRatedShows); +router.get('/v2/movie/:id/credits', require('./controllers/movie/credits.js')); +router.get('/v2/movie/:id/release_dates', require('./controllers/movie/releaseDates.js')); + router.get('/v2/movie/:id', require('./controllers/info/movieInfo.js')); router.get('/v2/show/:id', require('./controllers/info/showInfo.js')); router.get('/v2/person/:id', require('./controllers/info/personInfo.js')); + /** * Plex */ diff --git a/seasoned_api/src/webserver/controllers/movie/releaseDates.js b/seasoned_api/src/webserver/controllers/movie/releaseDates.js new file mode 100644 index 0000000..7234888 --- /dev/null +++ b/seasoned_api/src/webserver/controllers/movie/releaseDates.js @@ -0,0 +1,26 @@ +const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); +const TMDB = require('src/tmdb/tmdb'); + +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); + +const movieReleaseDatesController = (req, res) => { + const movieId = req.params.id; + + tmdb.movieReleaseDates(movieId) + .then(releaseDates => res.send(releaseDates)) + .catch(error => { + const { status, message } = error; + + if (status && message) { + res.status(error.status).send({ success: false, error: error.message }) + } else { + // TODO log unhandled errors : here our at tmdbReleaseError ? + console.log('error', error) + res.status(500).send({ message: 'An unexpected error occured while requesting movie credits' }) + } + }) +} + +module.exports = movieReleaseDatesController; \ No newline at end of file From 879a02b38809b406ea78b1f0e3e3e20503cff61b Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 3 Nov 2019 16:01:19 +0100 Subject: [PATCH 80/85] Finished movie credits and release dates --- seasoned_api/src/tmdb/tmdb.js | 14 +++- seasoned_api/src/tmdb/types.js | 2 +- seasoned_api/src/tmdb/types/credits.js | 4 +- seasoned_api/src/tmdb/types/releaseDates.js | 78 +++++++++++-------- .../webserver/controllers/movie/credits.js | 1 + .../controllers/movie/releaseDates.js | 4 +- 6 files changed, 65 insertions(+), 38 deletions(-) diff --git a/seasoned_api/src/tmdb/tmdb.js b/seasoned_api/src/tmdb/tmdb.js index 80ea986..a6eb35d 100644 --- a/seasoned_api/src/tmdb/tmdb.js +++ b/seasoned_api/src/tmdb/tmdb.js @@ -3,7 +3,7 @@ const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); const convertTmdbToShow = require('src/tmdb/convertTmdbToShow'); const convertTmdbToPerson = require('src/tmdb/convertTmdbToPerson'); -const { Credits, ReleaseDates} = require('src/tmdb/types'); +const { Credits, ReleaseDates } = require('src/tmdb/types'); // const { tmdbInfo } = require('src/tmdb/types') class TMDB { @@ -149,6 +149,11 @@ class TMDB { } } + /** + * Retrieve credits for a movie + * @param {Number} identifier of the movie to get credits for + * @returns {Promise} movie cast object + */ movieCredits(identifier) { const query = { id: identifier } const cacheKey = `${this.cacheTags.movieCredits}:${identifier}` @@ -160,6 +165,11 @@ class TMDB { .then(credits => Credits.convertFromTmdbResponse(credits)) } + /** + * Retrieve release dates for a movie + * @param {Number} identifier of the movie to get release dates for + * @returns {Promise} movie release dates object + */ movieReleaseDates(identifier) { const query = { id: identifier } const cacheKey = `${this.cacheTags.movieReleaseDates}:${identifier}` @@ -167,7 +177,7 @@ class TMDB { return this.cache.get(cacheKey) .catch(() => this.tmdb('movieReleaseDates', query)) .catch(tmdbError => this.tmdbRelaseDatesError(tmdbError)) - .then(releaseDates => this.cache.set(cacheKey, releaseDates, 1)) + .then(releaseDates => this.cache.set(cacheKey, releaseDates, 86400)) .then(releaseDates => ReleaseDates.convertFromTmdbResponse(releaseDates)) } diff --git a/seasoned_api/src/tmdb/types.js b/seasoned_api/src/tmdb/types.js index 9b096c4..7bbd2b0 100644 --- a/seasoned_api/src/tmdb/types.js +++ b/seasoned_api/src/tmdb/types.js @@ -4,4 +4,4 @@ import Person from './types/person.js' import Credits from './types/credits.js' import ReleaseDates from './types/releaseDates.js' -module.exports = { Movie, Show, Person, ReleaseDates } +module.exports = { Movie, Show, Person, Credits, ReleaseDates } diff --git a/seasoned_api/src/tmdb/types/credits.js b/seasoned_api/src/tmdb/types/credits.js index 262093b..9762799 100644 --- a/seasoned_api/src/tmdb/types/credits.js +++ b/seasoned_api/src/tmdb/types/credits.js @@ -20,8 +20,8 @@ class Credits { createJsonResponse() { return { id: this.id, - cast: this.cast, - crew: this.crew + cast: this.cast.map(cast => cast.createJsonResponse()), + crew: this.crew.map(crew => crew.createJsonResponse()) } } } diff --git a/seasoned_api/src/tmdb/types/releaseDates.js b/seasoned_api/src/tmdb/types/releaseDates.js index 3959922..8ce749a 100644 --- a/seasoned_api/src/tmdb/types/releaseDates.js +++ b/seasoned_api/src/tmdb/types/releaseDates.js @@ -1,3 +1,43 @@ +class ReleaseDates { + constructor(id, releases) { + this.id = id; + this.releases = releases; + } + + static convertFromTmdbResponse(response) { + const { id, results } = response; + + const releases = results.map(countryRelease => + new Release( + countryRelease.iso_3166_1, + countryRelease.release_dates.map(rd => new ReleaseDate(rd.certification, rd.iso_639_1, rd.release_date, rd.type, rd.note)) + )) + + return new ReleaseDates(id, releases) + } + + createJsonResponse() { + return { + id: this.id, + results: this.releases.map(release => release.createJsonResponse()) + } + } +} + +class Release { + constructor(country, releaseDates) { + this.country = country; + this.releaseDates = releaseDates; + } + + createJsonResponse() { + return { + country: this.country, + release_dates: this.releaseDates.map(releaseDate => releaseDate.createJsonResponse()) + } + } +} + class ReleaseDate { constructor(certification, language, releaseDate, type, note) { this.certification = certification; @@ -23,39 +63,15 @@ class ReleaseDate { return null } } -} - -class Release { - constructor(country, releaseDates) { - this.country = country; - this.releaseDates = releaseDates; - } -} - -class ReleaseDates { - constructor(id, releases) { - this.id = id; - this.releases = releases; - } - - static convertFromTmdbResponse(response) { - console.log('this is relese dates response') - const { id, results } = response; - - const releases = results.map(countryRelease => - new Release( - countryRelease.iso_3166_1, - countryRelease.release_dates.map(rd => new ReleaseDate(rd.certification, rd.iso_639_1, rd.release_date, rd.type, rd.note)) - )) - - return new ReleaseDates(id, releases) - } createJsonResponse() { - return JSON.stringify({ - id: this.id, - release_dates: this.releases - }) + return { + certification: this.certification, + language: this.language, + releaseDate: this.releaseDate, + type: this.type, + note: this.note + } } } diff --git a/seasoned_api/src/webserver/controllers/movie/credits.js b/seasoned_api/src/webserver/controllers/movie/credits.js index cd31924..5ca5b58 100644 --- a/seasoned_api/src/webserver/controllers/movie/credits.js +++ b/seasoned_api/src/webserver/controllers/movie/credits.js @@ -17,6 +17,7 @@ const movieCreditsController = (req, res) => { res.status(error.status).send({ success: false, error: error.message }) } else { // TODO log unhandled errors + console.log('caugth credits controller error', error) res.status(500).send({ message: 'An unexpected error occured while requesting movie credits' }) } }) diff --git a/seasoned_api/src/webserver/controllers/movie/releaseDates.js b/seasoned_api/src/webserver/controllers/movie/releaseDates.js index 7234888..01cd48e 100644 --- a/seasoned_api/src/webserver/controllers/movie/releaseDates.js +++ b/seasoned_api/src/webserver/controllers/movie/releaseDates.js @@ -9,7 +9,7 @@ const movieReleaseDatesController = (req, res) => { const movieId = req.params.id; tmdb.movieReleaseDates(movieId) - .then(releaseDates => res.send(releaseDates)) + .then(releaseDates => res.send(releaseDates.createJsonResponse())) .catch(error => { const { status, message } = error; @@ -17,7 +17,7 @@ const movieReleaseDatesController = (req, res) => { res.status(error.status).send({ success: false, error: error.message }) } else { // TODO log unhandled errors : here our at tmdbReleaseError ? - console.log('error', error) + console.log('caugth release dates controller error', error) res.status(500).send({ message: 'An unexpected error occured while requesting movie credits' }) } }) From b802a7b62bb35333c22aecd733b97f8bc6cc94df Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 3 Nov 2019 20:33:30 +0100 Subject: [PATCH 81/85] Moved, renamed, re-did and added a lot of stuff. Getting ready for the v2 upgrade --- seasoned_api/package.json | 7 +- seasoned_api/src/pirate/pirateRepository.js | 7 +- seasoned_api/src/plex/plex.js | 102 ++++-- seasoned_api/src/plex/types/show.js | 1 - seasoned_api/src/request/request.js | 23 +- seasoned_api/src/tmdb/cache.js | 12 +- seasoned_api/src/tmdb/convertTmdbToMovie.js | 71 ---- seasoned_api/src/tmdb/convertTmdbToPerson.js | 30 -- .../src/tmdb/convertTmdbToSeasoned.js | 43 --- seasoned_api/src/tmdb/convertTmdbToShow.js | 41 --- seasoned_api/src/tmdb/tmdb.js | 335 ++++++------------ seasoned_api/src/tmdb/tmdb.ts | 7 + seasoned_api/src/tmdb/types.ts | 64 ++++ seasoned_api/src/tmdb/types/movie.js | 28 +- seasoned_api/src/tmdb/types/person.js | 18 +- seasoned_api/src/tmdb/types/releaseDates.js | 2 +- seasoned_api/src/tmdb/types/show.js | 22 +- seasoned_api/src/webserver/app.js | 16 +- .../webserver/controllers/info/movieInfo.js | 38 -- .../webserver/controllers/info/showInfo.js | 31 -- .../controllers/list/listController.js | 62 ++-- .../webserver/controllers/movie/credits.js | 2 +- .../src/webserver/controllers/movie/info.js | 58 +++ .../{info/personInfo.js => person/info.js} | 7 +- .../controllers/request/getRequest.js | 7 +- .../controllers/search/movieSearch.js | 35 +- .../controllers/search/multiSearch.js | 36 +- .../controllers/search/personSearch.js | 37 +- .../src/webserver/controllers/show/credits.js | 26 ++ .../src/webserver/controllers/show/info.js | 54 +++ .../webserver/controllers/tmdb/listSearch.js | 25 -- .../webserver/controllers/tmdb/readMedia.js | 25 -- .../webserver/controllers/tmdb/searchMedia.js | 31 -- 33 files changed, 576 insertions(+), 727 deletions(-) delete mode 100644 seasoned_api/src/tmdb/convertTmdbToMovie.js delete mode 100644 seasoned_api/src/tmdb/convertTmdbToPerson.js delete mode 100644 seasoned_api/src/tmdb/convertTmdbToSeasoned.js delete mode 100644 seasoned_api/src/tmdb/convertTmdbToShow.js create mode 100644 seasoned_api/src/tmdb/tmdb.ts create mode 100644 seasoned_api/src/tmdb/types.ts delete mode 100644 seasoned_api/src/webserver/controllers/info/movieInfo.js delete mode 100644 seasoned_api/src/webserver/controllers/info/showInfo.js create mode 100644 seasoned_api/src/webserver/controllers/movie/info.js rename seasoned_api/src/webserver/controllers/{info/personInfo.js => person/info.js} (88%) create mode 100644 seasoned_api/src/webserver/controllers/show/credits.js create mode 100644 seasoned_api/src/webserver/controllers/show/info.js delete mode 100644 seasoned_api/src/webserver/controllers/tmdb/listSearch.js delete mode 100644 seasoned_api/src/webserver/controllers/tmdb/readMedia.js delete mode 100644 seasoned_api/src/webserver/controllers/tmdb/searchMedia.js diff --git a/seasoned_api/package.json b/seasoned_api/package.json index 01e852c..b64922f 100644 --- a/seasoned_api/package.json +++ b/seasoned_api/package.json @@ -26,7 +26,9 @@ "km-moviedb": "^0.2.12", "mongoose": "~5.0.11", "node-cache": "^4.1.1", + "node-fetch": "^2.6.0", "python-shell": "^0.5.0", + "raven": "^2.4.2", "request": "^2.85.0", "request-promise": "^4.2", "sqlite3": "^4.0.0" @@ -36,6 +38,7 @@ "@babel/node": "^7.5.5", "@babel/preset-env": "^7.5.5", "@babel/register": "^7.5.5", + "@types/node": "^12.6.8", "coveralls": "^3.0.5", "documentation": "^12.0.3", "eslint": "^4.9.0", @@ -45,8 +48,8 @@ "mocha": "^6.2.0", "mocha-lcov-reporter": "^1.3.0", "nyc": "^11.6.0", - "raven": "^2.4.2", "supertest": "^3.0.0", - "supertest-as-promised": "^4.0.1" + "supertest-as-promised": "^4.0.1", + "typescript": "^3.5.3" } } diff --git a/seasoned_api/src/pirate/pirateRepository.js b/seasoned_api/src/pirate/pirateRepository.js index f14075a..031f780 100644 --- a/seasoned_api/src/pirate/pirateRepository.js +++ b/seasoned_api/src/pirate/pirateRepository.js @@ -21,7 +21,7 @@ function getMagnetFromURL(url) { async function find(searchterm, callback) { const options = { - pythonPath: '../torrent_search/env/bin/python3.6', + pythonPath: '../torrent_search/env/bin/python3', scriptPath: '../torrent_search', args: [searchterm, '-s', 'jackett', '-f', '--print'] } @@ -35,7 +35,7 @@ async function callPythonAddMagnet(url, callback) { getMagnetFromURL(url) .then((magnet) => { const options = { - pythonPath: '../delugeClient/env/bin/python3.6', + pythonPath: '../delugeClient/env/bin/python3', scriptPath: '../delugeClient', args: ['add', magnet] }; @@ -51,13 +51,10 @@ async function callPythonAddMagnet(url, callback) { async function SearchPiratebay(query) { return await new Promise((resolve, reject) => find(query, (err, results) => { if (err) { - /* eslint-disable no-console */ console.log('THERE WAS A FUCKING ERROR!\n', err); reject(Error('There was a error when searching for torrents')); } if (results) { - /* eslint-disable no-console */ - console.log('result', results); resolve(JSON.parse(results, null, '\t')); } })); diff --git a/seasoned_api/src/plex/plex.js b/seasoned_api/src/plex/plex.js index 19fa502..30e4693 100644 --- a/seasoned_api/src/plex/plex.js +++ b/seasoned_api/src/plex/plex.js @@ -1,59 +1,89 @@ -const axios = require('axios') +const fetch = require('node-fetch') const convertPlexToMovie = require('src/plex/convertPlexToMovie') const convertPlexToShow = require('src/plex/convertPlexToShow') const convertPlexToEpisode = require('src/plex/convertPlexToEpisode') + +const { Movie, Show, Person } = require('src/tmdb/types'); + +// const { Movie, } +// TODO? import class definitions to compare types ? +// what would typescript do? + class Plex { - constructor(ip) { + constructor(ip, port=32400) { this.plexIP = ip - this.plexPort = 32400 + this.plexPort = port + } + + matchTmdbAndPlexMedia(plex, tmdb) { + if (plex === undefined || tmdb === undefined) + return false + + const sanitize = (string) => string.toLowerCase() + + const matchTitle = sanitize(plex.title) === sanitize(tmdb.title) + const matchYear = plex.year === tmdb.year + + return matchTitle && matchYear } existsInPlex(tmdbMovie) { - return Promise.resolve() - .then(() => this.search(tmdbMovie.title)) - // TODO handle this when whitelist of local ip is not set in plex - .catch((error) => { console.error('Unable to search plex')}) - .then((plexMovies) => { - const matches = plexMovies.some((plexMovie) => { - return tmdbMovie.title === plexMovie.title && tmdbMovie.type === plexMovie.type - }) + return this.search(tmdbMovie.title) + .then(plexMovies => plexMovies.some(plex => this.matchTmdbAndPlexMedia(plex, tmdbMovie))) + } - tmdbMovie.existsInPlex = matches - return tmdbMovie - }) + successfullResponse(response) { + const { status, statusText } = response + + if (status === 200) { + return response.json() + } else { + throw { message: statusText, status: status } + } } search(query) { + const url = `http://${this.plexIP}:${this.plexPort}/hubs/search?query=${query}` const options = { - baseURL: `http://${this.plexIP}:${this.plexPort}`, - url: '/hubs/search', - params: { query: query }, - responseType: 'json', - timeout: 3000 + timeout: 2000, + headers: { 'Accept': 'application/json' } } - return Promise.resolve() - .then(() => axios.request(options)) - .catch((error) => { throw new Error(`Unable to search plex library`, error) }) - .then(response => this.mapResults(response)) + return fetch(url, options) + .then(this.successfullResponse) + .then(this.mapResults) + .catch(error => { + if (error.type === 'request-timeout') { + throw { message: 'Plex did not respond', status: 408, success: false } + } + + throw error + }) } - mapResults(response) { - return response.data.MediaContainer.Hub.reduce((result, hub) => { - if (hub.type === 'movie' && hub.Metadata !== undefined) { - return [...result, ...hub.Metadata.map(convertPlexToMovie)] - } - else if (hub.type === 'show' && hub.Metadata !== undefined) { - return [...result, ...hub.Metadata.map(convertPlexToShow)] - } - else if (hub.type === 'episode' && hub.Metadata !== undefined) { - return [...result, ...hub.Metadata.map(convertPlexToEpisode)] - } + if (response === undefined || response.MediaContainer === undefined) { + console.log('response was not valid to map', response) + return [] + } - return result - }, []) + return response.MediaContainer.Hub + .filter(category => category.size > 0) + .map(category => { + if (category.type === 'movie') { + return category.Metadata.map(movie => { + const ovie = Movie.convertFromPlexResponse(movie) + return ovie.createJsonResponse() + }) + } else if (category.type === 'show') { + return category.Metadata.map(convertPlexToShow) + } else if (category.type === 'episode') { + return category.Metadata.map(convertPlexToEpisode) + } + }) + .filter(result => result !== undefined) + .flat() } } diff --git a/seasoned_api/src/plex/types/show.js b/seasoned_api/src/plex/types/show.js index 8290f1e..86c1ef4 100644 --- a/seasoned_api/src/plex/types/show.js +++ b/seasoned_api/src/plex/types/show.js @@ -6,7 +6,6 @@ class Show { this.rating = null; this.seasons = null; this.episodes = null; - this.type = 'show'; } } diff --git a/seasoned_api/src/request/request.js b/seasoned_api/src/request/request.js index b83882e..380c12a 100644 --- a/seasoned_api/src/request/request.js +++ b/seasoned_api/src/request/request.js @@ -23,6 +23,7 @@ class RequestRepository { downloaded: '(select status from requests where id is request.id and type is request.type limit 1)', // deluge: '(select status from deluge_torrent where id is request.id and type is request.type limit 1)', // fetchAllFilterStatus: 'select * from request where ' + readWithoutUserData: 'select id, title, year, type, status, date from requests where id is ? and type is ?', read: 'select id, title, year, type, status, requested_by, ip, date, user_agent from requests where id is ? and type is ?' }; } @@ -106,11 +107,17 @@ class RequestRepository { * @returns {Promise} */ getRequestByIdAndType(id, type) { - return Promise.resolve() - .then(() => this.database.get(this.queries.read, [id, type])) + return this.database.get(this.queries.readWithoutUserData, [id, type]) .then(row => { assert(row, 'Could not find request item with that id and type') - return JSON.stringify(row) + return { + id: row.id, + title: row.title, + year: row.year, + type: row.type, + status: row.status, + requested_date: new Date(row.date) + } }) } @@ -145,11 +152,15 @@ class RequestRepository { const totalRequests = sqliteResponse['totalRequests'] const totalPages = Math.ceil(totalRequests / 26) - return [ rows.map(item => { item.poster = item.poster_path; return item }), totalPages ] + return [ rows.map(item => { + item.poster = item.poster_path; delete item.poster_path; + item.backdrop = item.background_path; delete item.background_path; + return item + }), totalPages, totalRequests ] return Promise.all(this.mapToTmdbByType(rows)) }) - .then(([result, totalPages]) => Promise.resolve({ - results: result, total_results: result.length, page: page, total_pages: totalPages + .then(([result, totalPages, totalRequests]) => Promise.resolve({ + results: result, total_results: totalRequests, page: page, total_pages: totalPages })) .catch(error => { console.log(error);throw error }) } diff --git a/seasoned_api/src/tmdb/cache.js b/seasoned_api/src/tmdb/cache.js index f55179e..e85494a 100644 --- a/seasoned_api/src/tmdb/cache.js +++ b/seasoned_api/src/tmdb/cache.js @@ -18,12 +18,12 @@ class Cache { * @returns {Object} */ get(key) { - return Promise.resolve() - .then(() => this.database.get(this.queries.read, [key])) - .then((row) => { - assert(row, 'Could not find cache enrty with that key.'); - return JSON.parse(row.value); - }); + return Promise.resolve() + .then(() => this.database.get(this.queries.read, [key])) + .then(row => { + assert(row, 'Could not find cache entry with that key.'); + return JSON.parse(row.value); + }) } /** diff --git a/seasoned_api/src/tmdb/convertTmdbToMovie.js b/seasoned_api/src/tmdb/convertTmdbToMovie.js deleted file mode 100644 index 3604f8c..0000000 --- a/seasoned_api/src/tmdb/convertTmdbToMovie.js +++ /dev/null @@ -1,71 +0,0 @@ -import { Movie } from './types' - -const tmdbSwitcher = (tmdbMovie, property) => tmdbMovie[property] - -const releaseTypeEnum = { - 1: 'Premier', - 2: 'Limited theatrical', - 3: 'Theatrical', - 4: 'Digital', - 5: 'Physical', - 6: 'TV' -} - -function convertTmdbToMovie(tmdbMovie, credits=undefined, releaseDates=undefined) { - const movie = new Movie(tmdbMovie.id, tmdbMovie.title) - movie.overview = tmdbMovie.overview; - movie.rank = tmdbMovie.vote_average; - - if (credits) { - movie.credits = { cast: credits.cast, crew: credits.crew }; - } - - if (releaseDates) { - movie.release_dates = releaseDates.results.map((releasePlace) => { - const newestRelease = releasePlace.release_dates.sort((a,b) => a.type < b.type ? 1 : -1)[0] - const type = releaseTypeEnum[newestRelease.type] - - return { - country: releasePlace.iso_3166_1, - type: type, - date: newestRelease.release_date - } - }) - } - - if (tmdbMovie.release_date !== undefined && tmdbMovie.release_date) { - movie.release_date = new Date(tmdbMovie.release_date); - movie.year = movie.release_date.getFullYear(); - } - - if (tmdbMovie.poster_path !== undefined && tmdbMovie.poster_path) { - movie.poster = tmdbMovie.poster_path; - } - if (tmdbMovie.backdrop_path !== undefined && tmdbMovie.backdrop_path) { - movie.backdrop = tmdbMovie.backdrop_path; - } - - if (tmdbMovie.status !== undefined && tmdbMovie.status) { - movie.status = tmdbMovie.status; - } - - if (tmdbMovie.genres !== undefined && tmdbMovie.genres) { - movie.genres = tmdbMovie.genres.map(genre => genre.name); - } - - if (tmdbMovie.tagline !== undefined && tmdbMovie.tagline) { - movie.tagline = tmdbMovie.tagline; - } - - if (tmdbMovie.runtime !== undefined && tmdbMovie.runtime) { - movie.runtime = tmdbMovie.runtime; - } - - if (tmdbMovie.imdb_id !== undefined && tmdbMovie.imdb_id) { - movie.imdb_id = tmdbMovie.imdb_id; - } - - return movie; -} - -module.exports = convertTmdbToMovie; diff --git a/seasoned_api/src/tmdb/convertTmdbToPerson.js b/seasoned_api/src/tmdb/convertTmdbToPerson.js deleted file mode 100644 index 3626ff4..0000000 --- a/seasoned_api/src/tmdb/convertTmdbToPerson.js +++ /dev/null @@ -1,30 +0,0 @@ -import { Person } from './types' -const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); - -function convertTmdbToPerson(tmdbPerson, cast=undefined) { - const person = new Person(tmdbPerson.id, tmdbPerson.name); - - if (tmdbPerson.profile_path !== undefined) { - person.poster = tmdbPerson.profile_path; - } - - if (tmdbPerson.birthday !== undefined) { - person.birthday = new Date(tmdbPerson.birthday); - } - - if (tmdbPerson.deathday !== undefined) { - person.deathday = tmdbPerson.deathday; - } - - if (tmdbPerson.known_for !== undefined) { - person.known_for = tmdbPerson.known_for.map(convertTmdbToMovie); - } - - if (cast) { - person.cast = cast.cast; - } - - return person; -} - -module.exports = convertTmdbToPerson; diff --git a/seasoned_api/src/tmdb/convertTmdbToSeasoned.js b/seasoned_api/src/tmdb/convertTmdbToSeasoned.js deleted file mode 100644 index 0ce7886..0000000 --- a/seasoned_api/src/tmdb/convertTmdbToSeasoned.js +++ /dev/null @@ -1,43 +0,0 @@ -const TMDB = require('src/media_classes/tmdb'); - -function translateYear(tmdbReleaseDate) { - return new Date(tmdbReleaseDate).getFullYear(); -} - -function translateGenre(tmdbGenres) { - return tmdbGenres.map(genre => genre.name); -} - -function convertType(tmdbType) { - if (tmdbType === 'tv') return 'show'; - return undefined; -} - -function convertTmdbToMovie(tmdb) { - const title = tmdb.title || tmdb.name; - const year = translateYear(tmdb.release_date || tmdb.first_air_date); - const type = manualType || convertType(tmdb.type) || 'movie'; - - const id = tmdb.id; - const summary = tmdb.overview; - const poster_path = tmdb.poster_path; - const background_path = tmdb.backdrop_path; - const popularity = tmdb.popularity; - const score = tmdb.vote_average; - // const genres = translateGenre(tmdb.genres); - const release_status = tmdb.status; - const tagline = tmdb.tagline; - - const seasons = tmdb.number_of_seasons; - const episodes = tmdb.episodes; - - const seasoned = new TMDB( - title, year, type, id, summary, poster_path, background_path, - popularity, score, release_status, tagline, seasons, episodes - ); - - // seasoned.print() - return seasoned; -} - -module.exports = convertTmdbToSeasoned; diff --git a/seasoned_api/src/tmdb/convertTmdbToShow.js b/seasoned_api/src/tmdb/convertTmdbToShow.js deleted file mode 100644 index 1a25fe5..0000000 --- a/seasoned_api/src/tmdb/convertTmdbToShow.js +++ /dev/null @@ -1,41 +0,0 @@ -import { Show } from './types' - -function convertTmdbToShow(tmdbShow, credits=undefined) { - const show = new Show(tmdbShow.id, tmdbShow.name) - show.seasons = tmdbShow.number_of_seasons; - show.episodes = tmdbShow.number_of_episodes; - show.overview = tmdbShow.overview; - show.rank = tmdbShow.vote_average; - - if (credits) { - show.credits = credits - } - - if (tmdbShow.genres !== undefined) { - show.genres = tmdbShow.genres.map(genre => genre.name); - } - - if (tmdbShow.first_air_date !== undefined) { - show.first_air_date = new Date(tmdbShow.first_air_date); - show.year = show.first_air_date.getFullYear(); - } - - if (tmdbShow.poster_path !== undefined) { - show.poster = tmdbShow.poster_path; - } - if (tmdbShow.backdrop_path !== undefined) { - show.backdrop = tmdbShow.backdrop_path; - } - - if (tmdbShow.status !== undefined) { - show.status = tmdbShow.status; - } - - if (tmdbShow.episode_run_time !== undefined) { - show.runtime = tmdbShow.runtime; - } - - return show; -} - -module.exports = convertTmdbToShow; diff --git a/seasoned_api/src/tmdb/tmdb.js b/seasoned_api/src/tmdb/tmdb.js index a6eb35d..3cd68ec 100644 --- a/seasoned_api/src/tmdb/tmdb.js +++ b/seasoned_api/src/tmdb/tmdb.js @@ -1,9 +1,6 @@ const moviedb = require('km-moviedb'); -const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); -const convertTmdbToShow = require('src/tmdb/convertTmdbToShow'); -const convertTmdbToPerson = require('src/tmdb/convertTmdbToPerson'); -const { Credits, ReleaseDates } = require('src/tmdb/types'); +const { Movie, Show, Person, Credits, ReleaseDates } = require('src/tmdb/types'); // const { tmdbInfo } = require('src/tmdb/types') class TMDB { @@ -18,7 +15,8 @@ class TMDB { movieInfo: 'mi', movieCredits: 'mc', movieReleaseDates: 'mrd', - showInfo: 'si', + showInfo: 'si', + showCredits: 'sc', personInfo: 'pi', miscNowPlayingMovies: 'npm', miscPopularMovies: 'pm', @@ -30,123 +28,22 @@ class TMDB { }; } - /** - * Retrieve a specific movie by id from TMDB. - * @param {Number} identifier of the movie you want to retrieve - * @param {String} type filter results by type (default movie). - * @returns {Promise} succeeds if movie was found - */ - lookup(identifier, type = 'movie') { - const query = { id: identifier }; - const cacheKey = `${this.cacheTags.info}:${type}:${identifier}`; - return Promise.resolve() - .then(() => this.cache.get(cacheKey)) - .catch(() => this.tmdb(TMDB_METHODS['info'][type], query)) - .catch(() => { throw new Error('Could not find a movie with that id.'); }) - .then(response => this.cache.set(cacheKey, response)) - .then(response => { - try { - return convertTmdbToSeasoned(response, type); - } catch (parseError) { - console.error(parseError); - throw new Error('Could not parse movie.'); - } - }); - } - - /** - * Retrive search results from TMDB. - * @param {String} text query you want to search for - * @param {Number} page representing pagination of results - * @param {String} type filter results by type (default multi) - * @returns {Promise} dict with query results, current page and total_pages - */ - search(text, page = 1, type = 'multi') { - const query = { query: text, page: page }; - const cacheKey = `${this.cacheTags.search}:${page}:${type}:${text}`; - return Promise.resolve() - .then(() => this.cache.get(cacheKey)) - .catch(() => this.tmdb(TMDB_METHODS['search'][type], query)) - .catch(() => { throw new Error('Could not search for movies/shows at tmdb.'); }) - .then(response => this.cache.set(cacheKey, response)) - .then(response => this.mapResults(response)); - } - /** * Retrieve a specific movie by id from TMDB. * @param {Number} identifier of the movie you want to retrieve - * @param {String} type filter results by type (default movie). + * @param {Boolean} add credits (cast & crew) for movie + * @param {Boolean} add release dates for every country * @returns {Promise} succeeds if movie was found */ - movieInfo(identifier, credits=false, releaseDates=false) { + movieInfo(identifier) { const query = { id: identifier }; - const cacheKey = `${this.cacheTags.movieInfo}:${identifier}:${credits}`; + const cacheKey = `${this.cacheTags.movieInfo}:${identifier}`; - const requests = [this.tmdb('movieInfo', query)] - - if (credits) { - requests.push(this.tmdb('movieCredits', query)) - } else { - // This is because we expect ordered parameters below - requests.push(Promise.resolve([])) - } - - if (releaseDates) { - requests.push(this.tmdb('movieReleaseDates', query)) - } - - return Promise.resolve() - .then(() => this.cache.get(cacheKey)) - .catch(() => Promise.all(requests)) - .catch(error => { - if (error.status === 401) { - throw new Error('Unathorized tmdb request, please check api key.') - } else if (error.status === 404) { - throw new Error(`Could not find a movie with id: ${identifier}`) - } - - throw new Error('Unexpected error has occured:', error.message) - }) - .then(([movies, credits, releaseDates]) => this.cache.set(cacheKey, [movies, credits, releaseDates])) - .then(([movies, credits, releaseDates]) => convertTmdbToMovie(movies, credits, releaseDates)) - } - - tmdbCreditsError(error) { - if (error.status === 404) { - throw { - status: 404, - message: error.response.body.status_message - } - } else if (error.status === 401) { - throw { - status: 401, - message: error.response.body.status_message - } - } - - throw { - status: 500, - message: 'An unexpected error occured while fetching credits from tmdb' - } - } - - tmdbRelaseDatesError(error) { - if (error.status === 404) { - throw { - status: 404, - message: error.response.body.status_message - } - } else if (error.status === 401) { - throw { - status: 401, - message: error.response.body.status_message - } - } - - throw { - status: 500, - message: 'An unexpected error occured while fetching release dates from tmdb' - } + return this.cache.get(cacheKey) + .catch(() => this.tmdb('movieInfo', query)) + .catch(tmdbError => tmdbErrorResponse(tmdbError, 'movie info')) + .then(movie => this.cache.set(cacheKey, movie, 1)) + .then(movie => Movie.convertFromTmdbResponse(movie)) } /** @@ -160,8 +57,8 @@ class TMDB { return this.cache.get(cacheKey) .catch(() => this.tmdb('movieCredits', query)) - .catch(tmdbError => this.tmdbCreditsError(tmdbError)) - .then(credits => this.cache.set(cacheKey, credits, 86400)) + .catch(tmdbError => tmdbErrorResponse(tmdbError, 'movie credits')) + .then(credits => this.cache.set(cacheKey, credits, 1)) .then(credits => Credits.convertFromTmdbResponse(credits)) } @@ -176,8 +73,8 @@ class TMDB { return this.cache.get(cacheKey) .catch(() => this.tmdb('movieReleaseDates', query)) - .catch(tmdbError => this.tmdbRelaseDatesError(tmdbError)) - .then(releaseDates => this.cache.set(cacheKey, releaseDates, 86400)) + .catch(tmdbError => tmdbErrorResponse(tmdbError, 'movie release dates')) + .then(releaseDates => this.cache.set(cacheKey, releaseDates, 1)) .then(releaseDates => ReleaseDates.convertFromTmdbResponse(releaseDates)) } @@ -187,30 +84,26 @@ class TMDB { * @param {String} type filter results by type (default show). * @returns {Promise} succeeds if show was found */ - showInfo(identifier, credits=false) { + showInfo(identifier) { const query = { id: identifier }; - const cacheKey = `${this.cacheTags.showInfo}:${identifier}:${credits}`; + const cacheKey = `${this.cacheTags.showInfo}:${identifier}`; - const requests = [this.tmdb('tvInfo', query)] + return this.cache.get(cacheKey) + .catch(() => this.tmdb('tvInfo', query)) + .catch(tmdbError => tmdbErrorResponse(tmdbError, 'tv info')) + .then(show => this.cache.set(cacheKey, show, 1)) + .then(show => Show.convertFromTmdbResponse(show)) + } - if (credits) { - requests.push(this.tmdb('tvCredits', query)) - } + showCredits(identifier) { + const query = { id: identifier } + const cacheKey = `${this.cacheTags.showCredits}:${identifier}` - return Promise.resolve() - .then(() => this.cache.get(cacheKey)) - .catch(() => Promise.all(requests)) - .catch(error => { - if (error.status === 401) { - throw new Error('Unathorized tmdb request, please check api key.') - } else if (error.status === 404) { - throw new Error(`Could not find a show with id: ${identifier}`) - } - - throw new Error('Unexpected error has occured:', error.message) - }) - .then(([shows, credits]) => this.cache.set(cacheKey, [shows, credits])) - .then(([shows, credits]) => convertTmdbToShow(shows, credits)) + return this.cache.get(cacheKey) + .catch(() => this.tmdb('tvCredits', query)) + .catch(tmdbError => tmdbErrorResponse(tmdbError, 'show credits')) + .then(credits => this.cache.set(cacheKey, credits, 1)) + .then(credits => Credits.convertFromTmdbResponse(credits)) } /** @@ -223,25 +116,20 @@ class TMDB { const query = { id: identifier }; const cacheKey = `${this.cacheTags.personInfo}:${identifier}`; - return Promise.resolve() - .then(() => this.cache.get(cacheKey)) - .catch(() => Promise.all([this.tmdb('personInfo', query), this.tmdb('personCombinedCredits', query)])) - .catch(() => { throw new Error('Could not find a person with that id.'); }) - .then(([person, cast]) => this.cache.set(cacheKey, [person, cast])) - .then(([person, cast]) => convertTmdbToPerson(person, cast)) - .catch(err => new Error('Unable to convert result to person', err)) + return this.cache.get(cacheKey) + .catch(() => this.tmdb('personInfo', query)) + .catch(tmdbError => tmdbErrorResponse(tmdbError, 'person info')) + .then(person => this.cache.set(cacheKey, person, 1)) + .then(person => Person.convertFromTmdbResponse(person)) } - - multiSearch(search_query, page=1) { const query = { query: search_query, page: page }; const cacheKey = `${this.cacheTags.multiSearch}:${page}:${search_query}`; - return Promise.resolve() - .then(() => this.cache.get(cacheKey)) + return this.cache.get(cacheKey) .catch(() => this.tmdb('searchMulti', query)) - .catch(() => { throw new Error('Could not complete search to tmdb'); }) - .then(response => this.cache.set(cacheKey, response)) + .catch(tmdbError => tmdbErrorResponse(tmdbError, 'search results')) + .then(response => this.cache.set(cacheKey, response, 1)) .then(response => this.mapResults(response)); } @@ -255,13 +143,11 @@ class TMDB { const tmdbquery = { query: query, page: page }; const cacheKey = `${this.cacheTags.movieSearch}:${page}:${query}`; - return Promise.resolve() - .then(() => this.cache.get(cacheKey)) - .catch(() => this.tmdb('searchMovie', tmdbquery)) - .catch(() => { throw new Error('Could not complete movie search to tmdb'); }) - .then(response => this.cache.set(cacheKey, response)) - .then(response => this.mapAndCreateResponse(response, convertTmdbToMovie)) - .catch((error) => { console.log(error); throw new Error('Could not parse movie search result') }) + return this.cache.get(cacheKey) + .catch(() => this.tmdb('searchMovie', tmdbquery)) + .catch(tmdbError => tmdbErrorResponse(tmdbError, 'movie search results')) + .then(response => this.cache.set(cacheKey, response, 1)) + .then(response => this.mapResults(response, 'movie')) } /** @@ -273,13 +159,12 @@ class TMDB { showSearch(query, page=1) { const tmdbquery = { query: query, page: page }; const cacheKey = `${this.cacheTags.showSearch}:${page}:${query}`; - return Promise.resolve() - .then(() => this.cache.get(cacheKey)) - .catch(() => this.tmdb('searchTv', tmdbquery)) - .catch(() => { throw new Error('Could not complete show search to tmdb'); }) - .then(response => this.cache.set(cacheKey, response)) - .then(response => this.mapAndCreateResponse(response, convertTmdbToShow)) - .catch((error) => { console.log(error); throw new Error('Could not parse show search result') }) + + return this.cache.get(cacheKey) + .catch(() => this.tmdb('searchTv', tmdbquery)) + .catch(tmdbError => tmdbErrorResponse(tmdbError, 'tv search results')) + .then(response => this.cache.set(cacheKey, response, 1)) + .then(response => this.mapResults(response, 'show')) } /** @@ -289,78 +174,36 @@ class TMDB { * @returns {Promise} dict with query results, current page and total_pages */ personSearch(query, page=1) { - const tmdbquery = { query: query, page: page }; + + const tmdbquery = { query: query, page: page, include_adult: true }; const cacheKey = `${this.cacheTags.personSearch}:${page}:${query}`; - return Promise.resolve() - .then(() => this.cache.get(cacheKey)) - .catch(() => this.tmdb('searchPerson', tmdbquery)) - .catch(() => { throw new Error('Could not complete person search to tmdb'); }) - .then(response => this.cache.set(cacheKey, response)) - .then(response => this.mapAndCreateResponse(response, convertTmdbToPerson)) - .catch((error) => { console.log(error); throw new Error('Could not parse person search result') }) - } - mapAndCreateResponse(response, resultConvertFunction) { - // console.log(response) - return { - results: response.results.map(resultConvertFunction), - page: response.page, - total_results: response.total_results, - total_pages: response.total_pages - } + return this.cache.get(cacheKey) + .catch(() => this.tmdb('searchPerson', tmdbquery)) + .catch(tmdbError => tmdbErrorResponse(tmdbError, 'person search results')) + .then(response => this.cache.set(cacheKey, response, 1)) + .then(response => this.mapResults(response, 'person')) } - movieList(listname, page = 1) { const query = { page: page }; const cacheKey = `${this.cacheTags[listname]}:${page}`; - return Promise.resolve() - .then(() => this.cache.get(cacheKey)) + return this.cache.get(cacheKey) .catch(() => this.tmdb(listname, query)) - .catch(() => { throw new Error('Unable to get movie list from tmdb')}) - .then(response => this.cache.set(cacheKey, response)) - .then(response => this.mapAndCreateResponse(response, convertTmdbToMovie)); + .catch(tmdbError => this.tmdbErrorResponse(tmdbError, 'movie list ' + listname)) + .then(response => this.cache.set(cacheKey, response, 1)) + .then(response => this.mapResults(response, 'movie')) } showList(listname, page = 1) { const query = { page: page }; const cacheKey = `${this.cacheTags[listname]}:${page}`; - return Promise.resolve() - .then(() => this.cache.get(cacheKey)) + + return this.cache.get(cacheKey) .catch(() => this.tmdb(listname, query)) - .catch(() => { throw new Error('Unable to get show list from tmdb')}) - .then(response => this.cache.set(cacheKey, response)) - .then(response => this.mapAndCreateResponse(response, convertTmdbToShow)); - } - - /** - * Fetches a given list from tmdb. - * @param {String} listName Name of list - * @param {String} type filter results by type (default movie) - * @param {Number} page representing pagination of results - * @returns {Promise} dict with query results, current page and total_pages - */ - listSearch(listName, type = 'movie', page = '1') { - const query = { page: page }; - console.log(query); - const cacheKey = `${this.cacheTags[listName]}:${type}:${page}`; - return Promise.resolve() - .then(() => this.cache.get(cacheKey)) - .catch(() => this.tmdb(TMDB_METHODS[listName][type], query)) - .catch(() => { throw new Error('Error fetching list from tmdb.'); }) - .then(response => this.cache.set(cacheKey, response)) - .then(response => this.mapResults(response, type)); - } - - popular(type='movie', page=1) { - const query = { type: type, page: page }; - const cacheKey = `${this.cacheTags.popular}:${type}:${page}`; - return Promise.resolve() - .then(() => this.cache.get(cacheKey)) - .catch(() => this.tmdb('miscPopularMovies', query)) - .catch((e) => { throw new Error(`Error fetching popular list of type ${type} : ${e}`) }) - .then(response => this.cache.set(cacheKey, response)) - .then(response => this.mapResults(response, type)); + .catch(tmdbError => this.tmdbErrorResponse(tmdbError, 'show list ' + listname)) + .then(response => this.cache.set(cacheKey, response, 1)) + .then(response => this.mapResults(response, 'show')) } /** @@ -369,14 +212,20 @@ class TMDB { * @param {String} The type declared in listSearch. * @returns {Promise} dict with tmdb results, mapped as movie/show objects. */ - mapResults(response, _) { - let results = response.results.map((result) => { - if (result.media_type === 'movie') { - return convertTmdbToMovie(result); - } else if (result.media_type === 'tv') { - return convertTmdbToShow(result); - } else if (result.media_type === 'person') { - return convertTmdbToPerson(result); + mapResults(response, type=undefined) { + // console.log(response.results) + // response.results.map(te => console.table(te)) + + let results = response.results.map(result => { + if (type === 'movie' || result.media_type === 'movie') { + const movie = Movie.convertFromTmdbResponse(result) + return movie.createJsonResponse() + } else if (type === 'show' || result.media_type === 'tv') { + const show = Show.convertFromTmdbResponse(result) + return show.createJsonResponse() + } else if (type === 'person' || result.media_type === 'person') { + const person = Person.convertFromTmdbResponse(result) + return person.createJsonResponse() } }) @@ -410,6 +259,28 @@ class TMDB { } }); } + +} + +function tmdbErrorResponse(error, typeString=undefined) { + if (error.status === 404) { + let message = error.response.body.status_message; + + throw { + status: 404, + message: message.slice(0, -1) + " in tmdb." + } + } else if (error.status === 401) { + throw { + status: 401, + message: error.response.body.status_message + } + } + + throw { + status: 500, + message: `An unexpected error occured while fetching ${typeString} from tmdb` + } } module.exports = TMDB; diff --git a/seasoned_api/src/tmdb/tmdb.ts b/seasoned_api/src/tmdb/tmdb.ts new file mode 100644 index 0000000..85da44f --- /dev/null +++ b/seasoned_api/src/tmdb/tmdb.ts @@ -0,0 +1,7 @@ +import { Movie } from './types' + +Movie('str', 123) + + + +module.exports = TMDB; diff --git a/seasoned_api/src/tmdb/types.ts b/seasoned_api/src/tmdb/types.ts new file mode 100644 index 0000000..89e2f8a --- /dev/null +++ b/seasoned_api/src/tmdb/types.ts @@ -0,0 +1,64 @@ +interface Movie { + adult: boolean; + backdrop: string; + genres: Genre[]; + id: number; + imdb_id: number; + overview: string; + popularity: number; + poster: string; + release_date: Date; + rank: number; + runtime: number; + status: string; + tagline: string; + title: string; + vote_count: number; +} + +interface Show { + adult: boolean; + backdrop: string; + episodes: number; + genres: Genre[]; + id: number; + imdb_id: number; + overview: string; + popularity: number; + poster: string; + rank: number; + runtime: number; + seasons: number; + status: string; + tagline: string; + title: string; + vote_count: number; +} + +interface Person { + birthday: Date; + deathday: Date; + id: number; + known_for: string; + name: string; + poster: string; +} + +interface SearchResult { + adult: boolean; + backdrop_path: string; + id: number; + original_title: string; + release_date: Date; + poster_path: string; + popularity: number; + vote_average: number; + vote_counte: number; +} + +interface Genre { + id: number; + name: string; +} + +export { Movie, Show, Person, Genre } diff --git a/seasoned_api/src/tmdb/types/movie.js b/seasoned_api/src/tmdb/types/movie.js index d3e4a23..64556a8 100644 --- a/seasoned_api/src/tmdb/types/movie.js +++ b/seasoned_api/src/tmdb/types/movie.js @@ -1,7 +1,7 @@ class Movie { constructor(id, title, year=undefined, overview=undefined, poster=undefined, - backdrop=undefined, rank=undefined, genres=undefined, status=undefined, - tagline=undefined, runtime=undefined, imdb_id=undefined) { + backdrop=undefined, rank=undefined, genres=undefined, productionStatus=undefined, + tagline=undefined, runtime=undefined, imdb_id=undefined, popularity) { this.id = id; this.title = title; this.year = year; @@ -10,13 +10,33 @@ class Movie { this.backdrop = backdrop; this.rank = rank; this.genres = genres; - this.status = status; + this.productionStatus = productionStatus; this.tagline = tagline; this.runtime = runtime; this.imdb_id = imdb_id; + this.popularity = popularity; this.type = 'movie'; } + static convertFromTmdbResponse(response) { + const { id, title, release_date, overview, poster_path, backdrop_path, rank, genres, status, + tagline, runtime, imdb_id, popularity } = response; + + const year = new Date(release_date).getFullYear() + const genreNames = genres ? genres.map(g => g.name) : undefined + + return new Movie(id, title, year, overview, poster_path, backdrop_path, rank, genreNames, status, + tagline, runtime, imdb_id, popularity) + } + + static convertFromPlexResponse(response) { + // console.log('response', response) + const { title, year, rating, tagline, summary } = response; + const _ = undefined + + return new Movie(null, title, year, summary, _, _, rating, _, _, tagline) + } + createJsonResponse() { return { id: this.id, @@ -27,7 +47,7 @@ class Movie { backdrop: this.backdrop, rank: this.rank, genres: this.genres, - status: this.status, + production_status: this.productionStatus, tagline: this.tagline, runtime: this.runtime, imdb_id: this.imdb_id, diff --git a/seasoned_api/src/tmdb/types/person.js b/seasoned_api/src/tmdb/types/person.js index d051a2a..45df6c9 100644 --- a/seasoned_api/src/tmdb/types/person.js +++ b/seasoned_api/src/tmdb/types/person.js @@ -1,14 +1,25 @@ class Person { - constructor(id, name, poster=null, birthday=null, deathday=null, known_for=null) { + constructor(id, name, poster=undefined, birthday=undefined, deathday=undefined, + adult=undefined, knownForDepartment=undefined) { this.id = id; this.name = name; this.poster = poster; this.birthday = birthday; this.deathday = deathday; - this.known_for = known_for; + this.adult = adult; + this.knownForDepartment = knownForDepartment; this.type = 'person'; } + static convertFromTmdbResponse(response) { + const { id, name, poster, birthday, deathday, adult, known_for_department } = response; + + const birthDay = new Date(birthday) + const deathDay = deathday ? new Date(deathday) : null + + return new Person(id, name, poster, birthDay, deathDay, adult, known_for_department) + } + createJsonResponse() { return { id: this.id, @@ -16,7 +27,8 @@ class Person { poster: this.poster, birthday: this.birthday, deathday: this.deathday, - known_for: this.known_for, + known_for_department: this.knownForDepartment, + adult: this.adult, type: this.type } } diff --git a/seasoned_api/src/tmdb/types/releaseDates.js b/seasoned_api/src/tmdb/types/releaseDates.js index 8ce749a..340479e 100644 --- a/seasoned_api/src/tmdb/types/releaseDates.js +++ b/seasoned_api/src/tmdb/types/releaseDates.js @@ -68,7 +68,7 @@ class ReleaseDate { return { certification: this.certification, language: this.language, - releaseDate: this.releaseDate, + release_date: this.releaseDate, type: this.type, note: this.note } diff --git a/seasoned_api/src/tmdb/types/show.js b/seasoned_api/src/tmdb/types/show.js index d6b69d5..176c59a 100644 --- a/seasoned_api/src/tmdb/types/show.js +++ b/seasoned_api/src/tmdb/types/show.js @@ -1,7 +1,7 @@ class Show { - constructor(id, title, year=null, overview=null, poster=null, backdrop=null, - seasons=null, episodes=null, rank=null, genres=null, status=null, - runtime=null) { + constructor(id, title, year=undefined, overview=undefined, poster=undefined, backdrop=undefined, + seasons=undefined, episodes=undefined, rank=undefined, genres=undefined, status=undefined, + runtime=undefined) { this.id = id; this.title = title; this.year = year; @@ -12,11 +12,22 @@ class Show { this.episodes = episodes; this.rank = rank; this.genres = genres; - this.status = status; + this.productionStatus = status; this.runtime = runtime; this.type = 'show'; } + static convertFromTmdbResponse(response) { + const { id, name, first_air_date, overview, poster_path, backdrop_path, number_of_seasons, number_of_episodes, + rank, genres, status, episode_run_time, popularity } = response; + + const year = new Date(first_air_date).getFullYear() + const genreNames = genres ? genres.map(g => g.name) : undefined + + return new Show(id, name, year, overview, poster_path, backdrop_path, number_of_seasons, number_of_episodes, + rank, genreNames, status, episode_run_time, popularity) + } + createJsonResponse() { return { id: this.id, @@ -29,9 +40,8 @@ class Show { episodes: this.episodes, rank: this.rank, genres: this.genres, - status: this.status, + production_status: this.productionStatus, runtime: this.runtime, - // imdb_id: this.imdb_id, type: this.type } } diff --git a/seasoned_api/src/webserver/app.js b/seasoned_api/src/webserver/app.js index db48442..b1b625e 100644 --- a/seasoned_api/src/webserver/app.js +++ b/seasoned_api/src/webserver/app.js @@ -28,8 +28,6 @@ router.use(tokenToUser); // TODO: Should have a separate middleware/router for handling headers. router.use((req, res, next) => { // TODO add logging of all incoming - console.log('Request: ', req.originalUrl); - const origin = req.headers.origin; if (allowedOrigins.indexOf(origin) > -1) { res.setHeader('Access-Control-Allow-Origin', origin); @@ -81,10 +79,11 @@ router.get('/v2/show/top_rated', listController.topRatedShows); router.get('/v2/movie/:id/credits', require('./controllers/movie/credits.js')); router.get('/v2/movie/:id/release_dates', require('./controllers/movie/releaseDates.js')); +router.get('/v2/show/:id/credits', require('./controllers/show/credits.js')); -router.get('/v2/movie/:id', require('./controllers/info/movieInfo.js')); -router.get('/v2/show/:id', require('./controllers/info/showInfo.js')); -router.get('/v2/person/:id', require('./controllers/info/personInfo.js')); +router.get('/v2/movie/:id', require('./controllers/movie/info.js')); +router.get('/v2/show/:id', require('./controllers/show/info.js')); +router.get('/v2/person/:id', require('./controllers/person/info.js')); /** * Plex @@ -117,13 +116,6 @@ router.put('/v1/plex/request/:requestId', mustBeAuthenticated, require('./contro router.get('/v1/pirate/search', mustBeAuthenticated, require('./controllers/pirate/searchTheBay.js')); router.post('/v1/pirate/add', mustBeAuthenticated, require('./controllers/pirate/addMagnet.js')); -/** - * TMDB - */ -router.get('/v1/tmdb/search', require('./controllers/tmdb/searchMedia.js')); -router.get('/v1/tmdb/list/:listname', require('./controllers/tmdb/listSearch.js')); -router.get('/v1/tmdb/:mediaId', require('./controllers/tmdb/readMedia.js')); - /** * git */ diff --git a/seasoned_api/src/webserver/controllers/info/movieInfo.js b/seasoned_api/src/webserver/controllers/info/movieInfo.js deleted file mode 100644 index 2c18b5e..0000000 --- a/seasoned_api/src/webserver/controllers/info/movieInfo.js +++ /dev/null @@ -1,38 +0,0 @@ -const configuration = require('src/config/configuration').getInstance(); -const Cache = require('src/tmdb/cache'); -const TMDB = require('src/tmdb/tmdb'); -const Plex = require('src/plex/plex'); -const cache = new Cache(); -const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); -const plex = new Plex(configuration.get('plex', 'ip')); - -/** - * Controller: Retrieve information for a movie - * @param {Request} req http request variable - * @param {Response} res - * @returns {Callback} - */ -async function movieInfoController(req, res) { - const movieId = req.params.id; - const queryCredits = req.query.credits; - const queryReleaseDates = req.query.release_dates; - let credits = undefined - let releaseDates = undefined - - if (queryCredits && queryCredits.toLowerCase() === 'true') - credits = true - if (queryReleaseDates && queryReleaseDates.toLowerCase() === 'true') - releaseDates = true - - const movie = await tmdb.movieInfo(movieId, credits, releaseDates); - - plex.existsInPlex(movie) - .catch((error) => { console.log('Error when searching plex'); }) - .then(() => { - res.send(movie); - }).catch((error) => { - res.status(404).send({ success: false, error: error.message }); - }); -} - -module.exports = movieInfoController; diff --git a/seasoned_api/src/webserver/controllers/info/showInfo.js b/seasoned_api/src/webserver/controllers/info/showInfo.js deleted file mode 100644 index 4cbc5a9..0000000 --- a/seasoned_api/src/webserver/controllers/info/showInfo.js +++ /dev/null @@ -1,31 +0,0 @@ -const configuration = require('src/config/configuration').getInstance(); -const Cache = require('src/tmdb/cache'); -const TMDB = require('src/tmdb/tmdb'); -const Plex = require('src/plex/plex'); -const cache = new Cache(); -const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); -const plex = new Plex(configuration.get('plex', 'ip')); - -/** - * Controller: Retrieve information for a show - * @param {Request} req http request variable - * @param {Response} res - * @returns {Callback} - */ - -async function showInfoController(req, res) { - const showId = req.params.id; - const { credits } = req.query; - const show = await tmdb.showInfo(showId, credits); - - plex.existsInPlex(show) - .catch((error) => { console.log('Error when searching plex'); }) - .then(() => { - console.log('show', show) - res.send(show); - }).catch((error) => { - res.status(404).send({ success: false, error: error.message }); - }); -} - -module.exports = showInfoController; diff --git a/seasoned_api/src/webserver/controllers/list/listController.js b/seasoned_api/src/webserver/controllers/list/listController.js index 037bc89..c6357dd 100644 --- a/seasoned_api/src/webserver/controllers/list/listController.js +++ b/seasoned_api/src/webserver/controllers/list/listController.js @@ -16,40 +16,48 @@ const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); // + newly created (tv/latest). // + movie/latest // +function handleError(error, res) { + const { status, message } = error; - -const respondWithErrorMessage = (res, error) => { - const status = error.status || 500 - const message = error.message || 'Unhandled error occured' - const success = error.success || false - - // console.log('Unknown error:', error) - return res.status(status).send({ success: success, error: message}) + if (status && message) { + res.status(error.status).send({ success: false, error: error.message }) + } else { + console.log('caught list controller error', error) + res.status(500).send({ message: 'An unexpected error occured while requesting list'}) + } } -function fetchTmdbMovieList(req, res, listName, tmdbListFunction) { +function handleListResponse(response, res) { + return res.send(response) + .catch(error => handleError(error, res)) +} + +function fetchTmdbList(req, res, listName, type) { const { page } = req.query; - return tmdb.movieList(listName, page) - .then(nowPlayingMovieList => res.send(nowPlayingMovieList)) - .catch(error => respondWithErrorMessage(res, error)) + if (type === 'movie') { + return tmdb.movieList(listName, page) + .then(listResponse => res.send(listResponse)) + .catch(error => handleError(error, res)) + } else if (type === 'show') { + return tmdb.showList(listname, page) + .then(listResponse => res.send(listResponse)) + .catch(error => handleError(error, res)) + } + + handleError({ + status: 400, + message: `'${type}' is not a valid list type.` + }, res) } -function fetchTmdbShowList(req, res, listName, tmdbListFunction) { - const { page } = req.query; - - return tmdb.showList(listName, page) - .then(nowPlayingMovieList => res.send(nowPlayingMovieList)) - .catch(error => respondWithErrorMessage(res, error)) -} - -const nowPlayingMovies = (req, res) => fetchTmdbMovieList(req, res, 'miscNowPlayingMovies') -const popularMovies = (req, res) => fetchTmdbMovieList(req, res, 'miscPopularMovies') -const topRatedMovies = (req, res) => fetchTmdbMovieList(req, res, 'miscTopRatedMovies') -const upcomingMovies = (req, res) => fetchTmdbMovieList(req, res, 'miscUpcomingMovies') -const nowPlayingShows = (req, res) => fetchTmdbShowList(req, res, 'tvOnTheAir') -const popularShows = (req, res) => fetchTmdbShowList(req, res, 'miscPopularTvs') -const topRatedShows = (req, res) => fetchTmdbShowList(req, res, 'miscTopRatedTvs') +const nowPlayingMovies = (req, res) => fetchTmdbList(req, res, 'miscNowPlayingMovies', 'movie') +const popularMovies = (req, res) => fetchTmdbList(req, res, 'miscPopularMovies', 'movie') +const topRatedMovies = (req, res) => fetchTmdbList(req, res, 'miscTopRatedMovies', 'movie') +const upcomingMovies = (req, res) => fetchTmdbList(req, res, 'miscUpcomingMovies', 'movie') +const nowPlayingShows = (req, res) => fetchTmdbList(req, res, 'tvOnTheAir', 'show') +const popularShows = (req, res) => fetchTmdbList(req, res, 'miscPopularTvs', 'show') +const topRatedShows = (req, res) => fetchTmdbList(req, res, 'miscTopRatedTvs', 'show') module.exports = { nowPlayingMovies, diff --git a/seasoned_api/src/webserver/controllers/movie/credits.js b/seasoned_api/src/webserver/controllers/movie/credits.js index 5ca5b58..a3eceb8 100644 --- a/seasoned_api/src/webserver/controllers/movie/credits.js +++ b/seasoned_api/src/webserver/controllers/movie/credits.js @@ -17,7 +17,7 @@ const movieCreditsController = (req, res) => { res.status(error.status).send({ success: false, error: error.message }) } else { // TODO log unhandled errors - console.log('caugth credits controller error', error) + console.log('caugth movie credits controller error', error) res.status(500).send({ message: 'An unexpected error occured while requesting movie credits' }) } }) diff --git a/seasoned_api/src/webserver/controllers/movie/info.js b/seasoned_api/src/webserver/controllers/movie/info.js new file mode 100644 index 0000000..14d4d82 --- /dev/null +++ b/seasoned_api/src/webserver/controllers/movie/info.js @@ -0,0 +1,58 @@ +const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); +const TMDB = require('src/tmdb/tmdb'); +const Plex = require('src/plex/plex'); +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); +const plex = new Plex(configuration.get('plex', 'ip')); + +function handleError(error, res) { + const { status, message } = error; + + if (status && message) { + res.status(error.status).send({ success: false, error: error.message }) + } else { + console.log('caught movieinfo controller error', error) + res.status(500).send({ message: 'An unexpected error occured while requesting movie info'}) + } +} + +/** + * Controller: Retrieve information for a movie + * @param {Request} req http request variable + * @param {Response} res + * @returns {Callback} + */ +async function movieInfoController(req, res) { + const movieId = req.params.id; + let { credits, release_dates, check_existance } = req.query; + + credits && credits.toLowerCase() === 'true' ? credits = true : credits = false + release_dates && release_dates.toLowerCase() === 'true' ? release_dates = true : release_dates = false + check_existance && check_existance.toLowerCase() === 'true' ? check_existance = true : check_existance = false + + let tmdbQueue = [tmdb.movieInfo(movieId)] + if (credits) + tmdbQueue.push(tmdb.movieCredits(movieId)) + if (release_dates) + tmdbQueue.push(tmdb.movieReleaseDates(movieId)) + + try { + const [ Movie, Credits, ReleaseDates ] = await Promise.all(tmdbQueue) + + const movie = Movie.createJsonResponse() + if (Credits) + movie.credits = Credits.createJsonResponse() + if (ReleaseDates) + movie.release_dates = ReleaseDates.createJsonResponse().results + + if (check_existance) + movie.exists_in_plex = await plex.existsInPlex(movie) + + res.send(movie) + } catch(error) { + handleError(error, res) + } +} + +module.exports = movieInfoController; diff --git a/seasoned_api/src/webserver/controllers/info/personInfo.js b/seasoned_api/src/webserver/controllers/person/info.js similarity index 88% rename from seasoned_api/src/webserver/controllers/info/personInfo.js rename to seasoned_api/src/webserver/controllers/person/info.js index 1d19c9d..a0eeab6 100644 --- a/seasoned_api/src/webserver/controllers/info/personInfo.js +++ b/seasoned_api/src/webserver/controllers/person/info.js @@ -13,10 +13,11 @@ const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); function personInfoController(req, res) { const personId = req.params.id; + + tmdb.personInfo(personId) - .then((person) => { - res.send(person); - }).catch((error) => { + .then(person => res.send(person.createJsonResponse())) + .catch(error => { res.status(404).send({ success: false, error: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/request/getRequest.js b/seasoned_api/src/webserver/controllers/request/getRequest.js index 2420211..e72b8e2 100644 --- a/seasoned_api/src/webserver/controllers/request/getRequest.js +++ b/seasoned_api/src/webserver/controllers/request/getRequest.js @@ -11,10 +11,9 @@ function fetchAllRequests(req, res) { const id = req.params.id; const { type } = req.query; - Promise.resolve() - .then(() => request.getRequestByIdAndType(id, type)) - .then((result) => res.send(result)) - .catch((error) => { + request.getRequestByIdAndType(id, type) + .then(result => res.send(result)) + .catch(error => { res.status(404).send({ success: false, error: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/search/movieSearch.js b/seasoned_api/src/webserver/controllers/search/movieSearch.js index 906a132..4a9dfd7 100644 --- a/seasoned_api/src/webserver/controllers/search/movieSearch.js +++ b/seasoned_api/src/webserver/controllers/search/movieSearch.js @@ -1,7 +1,7 @@ -const SearchHistory = require('src/searchHistory/searchHistory'); const configuration = require('src/config/configuration').getInstance(); const Cache = require('src/tmdb/cache'); const TMDB = require('src/tmdb/tmdb'); +const SearchHistory = require('src/searchHistory/searchHistory'); const cache = new Cache(); const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); const searchHistory = new SearchHistory(); @@ -16,20 +16,25 @@ function movieSearchController(req, res) { const user = req.loggedInUser; const { query, page } = req.query; - Promise.resolve() - .then(() => { - if (user) { - return searchHistory.create(user, query); - } - return null - }) - .then(() => tmdb.movieSearch(query, page)) - .then((movies) => { - res.send(movies); - }) - .catch((error) => { - res.status(500).send({ success: false, error: error.message }); - }); + if (user) { + return searchHistory.create(user, query); + } + + tmdb.movieSearch(query, page) + .then(movieSearchResults => res.send(movieSearchResults)) + .catch(error => { + const { status, message } = error; + + if (status && message) { + res.status(error.status).send({ success: false, error: error.message }) + } else { + // TODO log unhandled errors + console.log('caugth movie search controller error', error) + res.status(500).send({ + message: `An unexpected error occured while searching movies with query: ${query}` + }) + } + }) } module.exports = movieSearchController; diff --git a/seasoned_api/src/webserver/controllers/search/multiSearch.js b/seasoned_api/src/webserver/controllers/search/multiSearch.js index bf90753..37b44cf 100644 --- a/seasoned_api/src/webserver/controllers/search/multiSearch.js +++ b/seasoned_api/src/webserver/controllers/search/multiSearch.js @@ -1,11 +1,18 @@ -const SearchHistory = require('src/searchHistory/searchHistory'); const configuration = require('src/config/configuration').getInstance(); const Cache = require('src/tmdb/cache'); const TMDB = require('src/tmdb/tmdb'); +const SearchHistory = require('src/searchHistory/searchHistory'); const cache = new Cache(); const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); const searchHistory = new SearchHistory(); +function checkAndCreateJsonResponse(result) { + if (typeof result['createJsonResponse'] === 'function') { + return result.createJsonResponse() + } + return result +} + /** * Controller: Search for multi (movies, shows and people by query and pagey * @param {Request} req http request variable @@ -16,20 +23,23 @@ function multiSearchController(req, res) { const user = req.loggedInUser; const { query, page } = req.query; - Promise.resolve() - .then(() => { - if (user) { - return searchHistory.create(user, query); + if (user) { + searchHistory.create(user, query) + } + + return tmdb.multiSearch(query, page) + .then(multiSearchResults => res.send(multiSearchResults)) + .catch(error => { + const { status, message } = error; + + if (status && message) { + res.status(error.status).send({ success: false, error: error.message }) + } else { + // TODO log unhandled errors + console.log('caugth multi search controller error', error) + res.status(500).send({ message: `An unexpected error occured while searching with query: ${query}` }) } - return null }) - .then(() => tmdb.multiSearch(query, page)) - .then((result) => { - res.send(result); - }) - .catch((error) => { - res.status(500).send({ success: false, error: error.message }); - }); } module.exports = multiSearchController; diff --git a/seasoned_api/src/webserver/controllers/search/personSearch.js b/seasoned_api/src/webserver/controllers/search/personSearch.js index 34bab20..7c35272 100644 --- a/seasoned_api/src/webserver/controllers/search/personSearch.js +++ b/seasoned_api/src/webserver/controllers/search/personSearch.js @@ -1,7 +1,7 @@ -const SearchHistory = require('src/searchHistory/searchHistory'); const configuration = require('src/config/configuration').getInstance(); const Cache = require('src/tmdb/cache'); const TMDB = require('src/tmdb/tmdb'); +const SearchHistory = require('src/searchHistory/searchHistory'); const cache = new Cache(); const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); const searchHistory = new SearchHistory(); @@ -16,20 +16,27 @@ function personSearchController(req, res) { const user = req.loggedInUser; const { query, page } = req.query; - Promise.resolve() - .then(() => { - if (user) { - return searchHistory.create(user, query); - } - return null - }) - .then(() => tmdb.personSearch(query, page)) - .then((person) => { - res.send(person); - }) - .catch((error) => { - res.status(500).send({ success: false, error: error.message }); - }); + if (user) { + return searchHistory.create(user, query); + } + + tmdb.personSearch(query, page) + .then((person) => { + res.send(person); + }) + .catch(error => { + const { status, message } = error; + + if (status && message) { + res.status(error.status).send({ success: false, error: error.message }) + } else { + // TODO log unhandled errors + console.log('caugth person search controller error', error) + res.status(500).send({ + message: `An unexpected error occured while searching people with query: ${query}` + }) + } + }) } module.exports = personSearchController; diff --git a/seasoned_api/src/webserver/controllers/show/credits.js b/seasoned_api/src/webserver/controllers/show/credits.js new file mode 100644 index 0000000..fcfccbd --- /dev/null +++ b/seasoned_api/src/webserver/controllers/show/credits.js @@ -0,0 +1,26 @@ +const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); +const TMDB = require('src/tmdb/tmdb'); + +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); + +const showCreditsController = (req, res) => { + const showId = req.params.id; + + tmdb.showCredits(showId) + .then(credits => res.send(credits.createJsonResponse())) + .catch(error => { + const { status, message } = error; + + if (status && message) { + res.status(error.status).send({ success: false, error: error.message }) + } else { + // TODO log unhandled errors + console.log('caugth show credits controller error', error) + res.status(500).send({ message: 'An unexpected error occured while requesting show credits' }) + } + }) +} + +module.exports = showCreditsController; \ No newline at end of file diff --git a/seasoned_api/src/webserver/controllers/show/info.js b/seasoned_api/src/webserver/controllers/show/info.js new file mode 100644 index 0000000..5cd56e8 --- /dev/null +++ b/seasoned_api/src/webserver/controllers/show/info.js @@ -0,0 +1,54 @@ +const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); +const TMDB = require('src/tmdb/tmdb'); +const Plex = require('src/plex/plex'); +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); +const plex = new Plex(configuration.get('plex', 'ip')); + +function handleError(error, res) { + const { status, message } = error; + + if (status && message) { + res.status(error.status).send({ success: false, error: error.message }) + } else { + console.log('caught showinfo controller error', error) + res.status(500).send({ message: 'An unexpected error occured while requesting show info'}) + } +} + +/** + * Controller: Retrieve information for a show + * @param {Request} req http request variable + * @param {Response} res + * @returns {Callback} + */ + +async function showInfoController(req, res) { + const showId = req.params.id; + let { credits, check_existance } = req.query; + + credits && credits.toLowerCase() === 'true' ? credits = true : credits = false + check_existance && check_existance.toLowerCase() === 'true' ? check_existance = true : check_existance = false + + let tmdbQueue = [tmdb.showInfo(showId)] + if (credits) + tmdbQueue.push(tmdb.showCredits(showId)) + + try { + const [Show, Credits] = await Promise.all(tmdbQueue) + + const show = Show.createJsonResponse() + if (credits) + show.credits = Credits.createJsonResponse() + + if (check_existance) + show.exists_in_plex = await plex.existsInPlex(show) + + res.send(show) + } catch(error) { + handleError(error, res) + } +} + +module.exports = showInfoController; diff --git a/seasoned_api/src/webserver/controllers/tmdb/listSearch.js b/seasoned_api/src/webserver/controllers/tmdb/listSearch.js deleted file mode 100644 index 80e7add..0000000 --- a/seasoned_api/src/webserver/controllers/tmdb/listSearch.js +++ /dev/null @@ -1,25 +0,0 @@ -const configuration = require('src/config/configuration').getInstance(); -const Cache = require('src/tmdb/cache'); -const TMDB = require('src/tmdb/tmdb'); - -const cache = new Cache(); -const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); - -/** - * Controller: Retrieve nowplaying movies / now airing shows - * @param {Request} req http request variable - * @param {Response} res - * @returns {Callback} - */ -function listSearchController(req, res) { - const listname = req.params.listname; - const { type, page } = req.query; - tmdb.listSearch(listname, type, page) - .then((results) => { - res.send(results); - }).catch((error) => { - res.status(404).send({ success: false, error: error.message }); - }); -} - -module.exports = listSearchController; diff --git a/seasoned_api/src/webserver/controllers/tmdb/readMedia.js b/seasoned_api/src/webserver/controllers/tmdb/readMedia.js deleted file mode 100644 index d2c7294..0000000 --- a/seasoned_api/src/webserver/controllers/tmdb/readMedia.js +++ /dev/null @@ -1,25 +0,0 @@ -const configuration = require('src/config/configuration').getInstance(); -const Cache = require('src/tmdb/cache'); -const TMDB = require('src/tmdb/tmdb'); - -const cache = new Cache(); -const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); - -/** - * Controller: Retrieve information for a movie - * @param {Request} req http request variable - * @param {Response} res - * @returns {Callback} - */ -function readMediaController(req, res) { - const mediaId = req.params.mediaId; - const { type } = req.query; - tmdb.lookup(mediaId, type) - .then((movies) => { - res.send(movies); - }).catch((error) => { - res.status(404).send({ success: false, error: error.message }); - }); -} - -module.exports = readMediaController; diff --git a/seasoned_api/src/webserver/controllers/tmdb/searchMedia.js b/seasoned_api/src/webserver/controllers/tmdb/searchMedia.js deleted file mode 100644 index 5d5910e..0000000 --- a/seasoned_api/src/webserver/controllers/tmdb/searchMedia.js +++ /dev/null @@ -1,31 +0,0 @@ -const configuration = require('src/config/configuration').getInstance(); -const Cache = require('src/tmdb/cache'); -const TMDB = require('src/tmdb/tmdb'); - -const cache = new Cache(); -const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); - -/** - * Controller: Search for movies by query, page and optional type - * @param {Request} req http request variable - * @param {Response} res - * @returns {Callback} - */ -function searchMediaController(req, res) { - const { query, page, type } = req.query; - - Promise.resolve() - .then(() => tmdb.search(query, page, type)) - .then((movies) => { - if (movies !== undefined || movies.length > 0) { - res.send(movies); - } else { - res.status(404).send({ success: false, error: 'Search query did not return any results.' }); - } - }) - .catch((error) => { - res.status(500).send({ success: false, error: error.message }); - }); -} - -module.exports = searchMediaController; From c589457a6c75e6449023fc509a54c9a4b35e465f Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 3 Nov 2019 20:55:54 +0100 Subject: [PATCH 82/85] Removed unused mongoose package --- seasoned_api/package.json | 1 - seasoned_api/yarn.lock | 872 +++++++++++++++++--------------------- 2 files changed, 393 insertions(+), 480 deletions(-) diff --git a/seasoned_api/package.json b/seasoned_api/package.json index b64922f..05daee0 100644 --- a/seasoned_api/package.json +++ b/seasoned_api/package.json @@ -24,7 +24,6 @@ "express": "~4.16.0", "jsonwebtoken": "^8.0.1", "km-moviedb": "^0.2.12", - "mongoose": "~5.0.11", "node-cache": "^4.1.1", "node-fetch": "^2.6.0", "python-shell": "^0.5.0", diff --git a/seasoned_api/yarn.lock b/seasoned_api/yarn.lock index 8e68ea2..58e6b54 100644 --- a/seasoned_api/yarn.lock +++ b/seasoned_api/yarn.lock @@ -10,17 +10,17 @@ "@babel/highlight" "^7.0.0" "@babel/core@^7.1.2", "@babel/core@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" - integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== + version "7.6.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.4.tgz#6ebd9fe00925f6c3e177bb726a188b5f578088ff" + integrity sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.5.5" - "@babel/helpers" "^7.5.5" - "@babel/parser" "^7.5.5" - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" + "@babel/generator" "^7.6.4" + "@babel/helpers" "^7.6.2" + "@babel/parser" "^7.6.4" + "@babel/template" "^7.6.0" + "@babel/traverse" "^7.6.3" + "@babel/types" "^7.6.3" convert-source-map "^1.1.0" debug "^4.1.0" json5 "^2.1.0" @@ -29,16 +29,15 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.1.3", "@babel/generator@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" - integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== +"@babel/generator@^7.1.3", "@babel/generator@^7.6.3", "@babel/generator@^7.6.4": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.4.tgz#a4f8437287bf9671b07f483b76e3bb731bc97671" + integrity sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w== dependencies: - "@babel/types" "^7.5.5" + "@babel/types" "^7.6.3" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" - trim-right "^1.0.1" "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" @@ -72,10 +71,10 @@ "@babel/traverse" "^7.4.4" "@babel/types" "^7.4.4" -"@babel/helper-create-class-features-plugin@^7.4.4", "@babel/helper-create-class-features-plugin@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz#401f302c8ddbc0edd36f7c6b2887d8fa1122e5a4" - integrity sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg== +"@babel/helper-create-class-features-plugin@^7.5.5", "@babel/helper-create-class-features-plugin@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.6.0.tgz#769711acca889be371e9bc2eb68641d55218021f" + integrity sha512-O1QWBko4fzGju6VoVvrZg0RROCVifcLxiApnGP3OWfWzvxRZFCoBD81K5ur5e3bVY2Vf/5rIJm8cqPKn8HUJng== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/helper-member-expression-to-functions" "^7.5.5" @@ -215,14 +214,14 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helpers@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.5.tgz#63908d2a73942229d1e6685bc2a0e730dde3b75e" - integrity sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g== +"@babel/helpers@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.2.tgz#681ffe489ea4dcc55f23ce469e58e59c1c045153" + integrity sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA== dependencies: - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" + "@babel/template" "^7.6.0" + "@babel/traverse" "^7.6.2" + "@babel/types" "^7.6.0" "@babel/highlight@^7.0.0": version "7.5.0" @@ -234,15 +233,16 @@ js-tokens "^4.0.0" "@babel/node@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.5.5.tgz#5db48a3bcee64d9eda6474f2a0a55b235d0438b5" - integrity sha512-xsW6il+yY+lzXMsQuvIJNA7tU8ix/f4G6bDt4DrnCkVpsR6clk9XgEbp7QF+xGNDdoD7M7QYokCH83pm+UjD0w== + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.6.3.tgz#f175ab6718dde55431cbd4d9dee95f65c38be527" + integrity sha512-+nHje5AcE9TPlB/TRGYyOSQyTfhfU/WXniG6SkVf+V5+ibAjEqkH79lYdiEcytBTH4KeSf25IriySXs6TjaLjg== dependencies: - "@babel/polyfill" "^7.0.0" - "@babel/register" "^7.5.5" + "@babel/register" "^7.6.2" commander "^2.8.1" + core-js "^3.2.1" lodash "^4.17.13" node-environment-flags "^1.0.5" + regenerator-runtime "^0.13.3" v8flags "^3.1.1" "@babel/parser@7.1.3": @@ -250,10 +250,10 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.3.tgz#2c92469bac2b7fbff810b67fca07bd138b48af77" integrity sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w== -"@babel/parser@^7.4.4", "@babel/parser@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" - integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== +"@babel/parser@^7.6.0", "@babel/parser@^7.6.3", "@babel/parser@^7.6.4": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.4.tgz#cb9b36a7482110282d5cb6dd424ec9262b473d81" + integrity sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" @@ -273,18 +273,18 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-decorators@^7.1.2": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.4.tgz#de9b2a1a8ab0196f378e2a82f10b6e2a36f21cc0" - integrity sha512-z7MpQz3XC/iQJWXH9y+MaWcLPNSMY9RQSthrLzak8R8hCj0fuyNk+Dzi9kfNe/JxxlWQ2g7wkABbgWjW36MTcw== + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.6.0.tgz#6659d2572a17d70abd68123e89a12a43d90aa30c" + integrity sha512-ZSyYw9trQI50sES6YxREXKu+4b7MAg6Qx2cvyDDYjP2Hpzd3FleOUwC9cqn1+za8d0A2ZU8SHujxFao956efUg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.4.4" + "@babel/helper-create-class-features-plugin" "^7.6.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-decorators" "^7.2.0" "@babel/plugin-proposal-do-expressions@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.5.0.tgz#ceb594d4a618545b00aa0b5cd61cad4aaaeb7a5a" - integrity sha512-xe0QQrhm+DGj6H23a6XtwkJNimy1fo71O/YVBfrfvfSl0fsq9T9dfoQBIY4QceEIdUo7u9s7OPEdsWEuizfGeg== + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.6.0.tgz#192953fed8620d13d12a61f68defd26f41059193" + integrity sha512-qJDaoBDbLySwU1tG0jbAomOwz8W1PEiiiK0iLQAnHLr4PYIMVX4ltDGkj3uAKx4HDs1WJ0tozGW1zAQjuTIiWg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-do-expressions" "^7.2.0" @@ -362,10 +362,10 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-numeric-separator" "^7.2.0" -"@babel/plugin-proposal-object-rest-spread@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58" - integrity sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw== +"@babel/plugin-proposal-object-rest-spread@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096" + integrity sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" @@ -379,9 +379,9 @@ "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" "@babel/plugin-proposal-optional-chaining@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.2.0.tgz#ae454f4c21c6c2ce8cb2397dc332ae8b420c5441" - integrity sha512-ea3Q6edZC/55wEBVZAEz42v528VulyO0eir+7uky/sT4XRcdkWJcFi1aPtitTlwUzGnECWJNExWww1SStt+yWw== + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.6.0.tgz#e9bf1f9b9ba10c77c033082da75f068389041af8" + integrity sha512-kj4gkZ6qUggkprRq3Uh5KP8XnE1MdIO0J7MhdDX8+rAbB6dJ2UrensGIS+0NPZAaaJ1Vr0PN6oLUgXMU1uMcSg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-chaining" "^7.2.0" @@ -402,14 +402,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-throw-expressions" "^7.2.0" -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" - integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== +"@babel/plugin-proposal-unicode-property-regex@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz#05413762894f41bfe42b9a5e80919bd575dcc802" + integrity sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" + regexpu-core "^4.6.0" "@babel/plugin-syntax-async-generators@^7.2.0": version "7.2.0" @@ -574,10 +574,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz#a35f395e5402822f10d2119f6f8e045e3639a2ce" - integrity sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg== +"@babel/plugin-transform-block-scoping@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz#6e854e51fbbaa84351b15d4ddafe342f3a5d542a" + integrity sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" @@ -603,21 +603,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a" - integrity sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ== +"@babel/plugin-transform-destructuring@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6" + integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" - integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== +"@babel/plugin-transform-dotall-regex@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz#44abb948b88f0199a627024e1508acaf8dc9b2f9" + integrity sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" + regexpu-core "^4.6.0" "@babel/plugin-transform-duplicate-keys@^7.5.0": version "7.5.0" @@ -635,9 +635,9 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-flow-strip-types@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz#d267a081f49a8705fc9146de0768c6b58dccd8f7" - integrity sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q== + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.6.3.tgz#8110f153e7360cfd5996eee68706cfad92d85256" + integrity sha512-l0ETkyEofkqFJ9LS6HChNIKtVJw2ylKbhYMlJ5C6df+ldxxaLIyXY4yOdDQQspfFpV8/vDiaWoJlvflstlYNxg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-flow" "^7.2.0" @@ -680,10 +680,10 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" - integrity sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ== +"@babel/plugin-transform-modules-commonjs@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486" + integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g== dependencies: "@babel/helper-module-transforms" "^7.4.4" "@babel/helper-plugin-utils" "^7.0.0" @@ -707,12 +707,12 @@ "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" - integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz#aaa6e409dd4fb2e50b6e2a91f7e3a3149dbce0cf" + integrity sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw== dependencies: - regexp-tree "^0.1.6" + regexpu-core "^4.6.0" "@babel/plugin-transform-new-target@^7.4.4": version "7.4.4" @@ -798,10 +798,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-spread@^7.2.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" - integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== +"@babel/plugin-transform-spread@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz#fc77cf798b24b10c46e1b51b1b88c2bf661bb8dd" + integrity sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -828,36 +828,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-unicode-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" - integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== +"@babel/plugin-transform-unicode-regex@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz#b692aad888a7e8d8b1b214be6b9dc03d5031f698" + integrity sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" - -"@babel/polyfill@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.4.4.tgz#78801cf3dbe657844eeabf31c1cae3828051e893" - integrity sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg== - dependencies: - core-js "^2.6.5" - regenerator-runtime "^0.13.2" + regexpu-core "^4.6.0" "@babel/preset-env@^7.1.0", "@babel/preset-env@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.5.5.tgz#bc470b53acaa48df4b8db24a570d6da1fef53c9a" - integrity sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A== + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.3.tgz#9e1bf05a2e2d687036d24c40e4639dc46cef2271" + integrity sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-async-generator-functions" "^7.2.0" "@babel/plugin-proposal-dynamic-import" "^7.5.0" "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.5.5" + "@babel/plugin-proposal-object-rest-spread" "^7.6.2" "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.6.2" "@babel/plugin-syntax-async-generators" "^7.2.0" "@babel/plugin-syntax-dynamic-import" "^7.2.0" "@babel/plugin-syntax-json-strings" "^7.2.0" @@ -866,11 +858,11 @@ "@babel/plugin-transform-arrow-functions" "^7.2.0" "@babel/plugin-transform-async-to-generator" "^7.5.0" "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.5.5" + "@babel/plugin-transform-block-scoping" "^7.6.3" "@babel/plugin-transform-classes" "^7.5.5" "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.5.0" - "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/plugin-transform-destructuring" "^7.6.0" + "@babel/plugin-transform-dotall-regex" "^7.6.2" "@babel/plugin-transform-duplicate-keys" "^7.5.0" "@babel/plugin-transform-exponentiation-operator" "^7.2.0" "@babel/plugin-transform-for-of" "^7.4.4" @@ -878,10 +870,10 @@ "@babel/plugin-transform-literals" "^7.2.0" "@babel/plugin-transform-member-expression-literals" "^7.2.0" "@babel/plugin-transform-modules-amd" "^7.5.0" - "@babel/plugin-transform-modules-commonjs" "^7.5.0" + "@babel/plugin-transform-modules-commonjs" "^7.6.0" "@babel/plugin-transform-modules-systemjs" "^7.5.0" "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.3" "@babel/plugin-transform-new-target" "^7.4.4" "@babel/plugin-transform-object-super" "^7.5.5" "@babel/plugin-transform-parameters" "^7.4.4" @@ -889,12 +881,12 @@ "@babel/plugin-transform-regenerator" "^7.4.5" "@babel/plugin-transform-reserved-words" "^7.2.0" "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-spread" "^7.6.2" "@babel/plugin-transform-sticky-regex" "^7.2.0" "@babel/plugin-transform-template-literals" "^7.4.4" "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.4.4" - "@babel/types" "^7.5.5" + "@babel/plugin-transform-unicode-regex" "^7.6.2" + "@babel/types" "^7.6.3" browserslist "^4.6.0" core-js-compat "^3.1.1" invariant "^2.2.2" @@ -910,9 +902,9 @@ "@babel/plugin-transform-flow-strip-types" "^7.0.0" "@babel/preset-react@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" - integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.6.3.tgz#d5242c828322520205ae4eda5d4f4f618964e2f6" + integrity sha512-07yQhmkZmRAfwREYIQgW0HEwMY9GBJVuPY4Q12UC72AbfaawuupVWa8zQs2tlL+yun45Nv/1KreII/0PLfEsgA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-react-display-name" "^7.0.0" @@ -925,55 +917,54 @@ resolved "https://registry.yarnpkg.com/@babel/preset-stage-0/-/preset-stage-0-7.0.0.tgz#999aaec79ee8f0a763042c68c06539c97c6e0646" integrity sha512-FBMd0IiARPtH5aaOFUVki6evHiJQiY0pFy7fizyRF7dtwc+el3nwpzvhb9qBNzceG1OIJModG1xpE0DDFjPXwA== -"@babel/register@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.5.5.tgz#40fe0d474c8c8587b28d6ae18a03eddad3dac3c1" - integrity sha512-pdd5nNR+g2qDkXZlW1yRCWFlNrAn2PPdnZUB72zjX4l1Vv4fMRRLwyf+n/idFCLI1UgVGboUU8oVziwTBiyNKQ== +"@babel/register@^7.5.5", "@babel/register@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.6.2.tgz#25765a922202cb06f8bdac5a3b1e70cd6bf3dd45" + integrity sha512-xgZk2LRZvt6i2SAUWxc7ellk4+OYRgS3Zpsnr13nMS1Qo25w21Uu8o6vTOAqNaxiqrnv30KTYzh9YWY2k21CeQ== dependencies: - core-js "^3.0.0" find-cache-dir "^2.0.0" lodash "^4.17.13" mkdirp "^0.5.1" pirates "^4.0.0" source-map-support "^0.5.9" -"@babel/template@^7.1.0", "@babel/template@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" - integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== +"@babel/template@^7.1.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" + integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.0" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.4", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" - integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.4", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.3.tgz#66d7dba146b086703c0fb10dd588b7364cec47f9" + integrity sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.5.5" + "@babel/generator" "^7.6.3" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.5.5" - "@babel/types" "^7.5.5" + "@babel/parser" "^7.6.3" + "@babel/types" "^7.6.3" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.1.3", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" - integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== +"@babel/types@^7.0.0", "@babel/types@^7.1.3", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0", "@babel/types@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.3.tgz#3f07d96f854f98e2fbd45c64b0cb942d11e8ba09" + integrity sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA== dependencies: esutils "^2.0.2" lodash "^4.17.13" to-fast-properties "^2.0.0" "@types/node@^12.6.8": - version "12.6.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.8.tgz#e469b4bf9d1c9832aee4907ba8a051494357c12c" - integrity sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg== + version "12.12.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.5.tgz#66103d2eddc543d44a04394abb7be52506d7f290" + integrity sha512-KEjODidV4XYUlJBF3XdjSH5FWoMCtO0utnhtdLf1AgeuZLOrRbvmU/gaRCVg7ZaQDjVf3l84egiY0mRNe5xE4A== "@types/unist@^2.0.0", "@types/unist@^2.0.2": version "2.0.3" @@ -1088,7 +1079,7 @@ ansi-styles@^2.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -1219,13 +1210,6 @@ async@1.x: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" - integrity sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ= - dependencies: - lodash "^4.14.0" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1388,15 +1372,10 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== -bluebird@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" - integrity sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw= - bluebird@^3.3.1, bluebird@^3.5.0: - version "3.5.5" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" - integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== + version "3.7.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de" + integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== body-parser@1.18.3, body-parser@~1.18.2: version "1.18.3" @@ -1469,19 +1448,14 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.6.0, browserslist@^4.6.2: - version "4.6.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.6.tgz#6e4bf467cde520bc9dbdf3747dafa03531cec453" - integrity sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA== +browserslist@^4.6.0, browserslist@^4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.2.tgz#1bb984531a476b5d389cedecb195b2cd69fb1348" + integrity sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw== dependencies: - caniuse-lite "^1.0.30000984" - electron-to-chromium "^1.3.191" - node-releases "^1.1.25" - -bson@~1.0.4, bson@~1.0.5: - version "1.0.9" - resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.9.tgz#12319f8323b1254739b7c6bef8d3e89ae05a2f57" - integrity sha512-IQX9/h7WdMBIW/q/++tGd+emQr0XMdeZ6icnT/74Xk9fnabWn+gZgpE+9V+gujL3hhJOoNrnDVY7tWdzc7NUTg== + caniuse-lite "^1.0.30001004" + electron-to-chromium "^1.3.295" + node-releases "^1.1.38" buffer-equal-constant-time@1.0.1: version "1.0.1" @@ -1564,10 +1538,10 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30000984: - version "1.0.30000985" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000985.tgz#0eb40f6c8a8c219155cbe43c4975c0efb4a0f77f" - integrity sha512-1ngiwkgqAYPG0JSSUp3PUDGPKKY59EK7NrGGX+VOxaKCNzRbNc7uXMny+c3VJfZxtoK3wSImTvG9T9sXiTw2+w== +caniuse-lite@^1.0.30001004: + version "1.0.30001006" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001006.tgz#5b6e8288792cfa275f007b2819a00ccad7112655" + integrity sha512-MXnUVX27aGs/QINz+QG1sWSLDr3P1A3Hq5EUWoIt0T7K24DuvMxZEnh3Y5aHlJW6Bz2aApJdSewdYLd8zQnUuw== caseless@~0.12.0: version "0.12.0" @@ -1630,9 +1604,9 @@ charenc@~0.0.1: integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= chokidar@^2.0.4: - version "2.1.6" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" - integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== dependencies: anymatch "^2.0.0" async-each "^1.0.1" @@ -1649,9 +1623,9 @@ chokidar@^2.0.4: fsevents "^1.2.7" chownr@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" - integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== circular-json@^0.3.1: version "0.3.3" @@ -1689,6 +1663,15 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" @@ -1760,10 +1743,10 @@ comma-separated-tokens@^1.0.1: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.7.tgz#419cd7fb3258b1ed838dc0953167a25e152f5b59" integrity sha512-Jrx3xsP4pPv4AwJUDWY9wOXGtwPXARej6Xd99h4TUGotmf8APuquKMpK+dnD3UgyxK7OEWaisjZz+3b5jtL6xQ== -commander@^2.8.1, commander@~2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" - integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== +commander@^2.8.1, commander@~2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commondir@^1.0.1: version "1.0.1" @@ -1852,28 +1835,22 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-compat@^3.1.1: - version "3.1.4" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.4.tgz#e4d0c40fbd01e65b1d457980fe4112d4358a7408" - integrity sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg== + version "3.3.6" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.3.6.tgz#70c30dbeb582626efe9ecd6f49daa9ff4aeb136c" + integrity sha512-YnwZG/+0/f7Pf6Lr3jxtVAFjtGBW9lsLYcqrxhYJai1GfvrP8DEyEpnNzj/FRQfIkOOfk1j5tTBvPBLWVVJm4A== dependencies: - browserslist "^4.6.2" - core-js-pure "3.1.4" - semver "^6.1.1" + browserslist "^4.7.2" + semver "^6.3.0" -core-js-pure@3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.4.tgz#5fa17dc77002a169a3566cc48dc774d2e13e3769" - integrity sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA== +core-js@^2.4.0: + version "2.6.10" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.10.tgz#8a5b8391f8cc7013da703411ce5b585706300d7f" + integrity sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA== -core-js@^2.4.0, core-js@^2.6.5: - version "2.6.9" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" - integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== - -core-js@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.1.4.tgz#3a2837fc48e582e1ae25907afcd6cf03b0cc7a07" - integrity sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ== +core-js@^3.2.1: + version "3.3.6" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.3.6.tgz#6ad1650323c441f45379e176ed175c0d021eac92" + integrity sha512-u4oM8SHwmDuh5mWZdDg9UwNVq5s1uqq6ZDLLIs07VY+VJU91i3h4f3K/pgFvtUQPGdeStrZ+odKyfyt4EnKHfA== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -1881,9 +1858,9 @@ core-util-is@1.0.2, core-util-is@~1.0.0: integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= coveralls@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.5.tgz#28d7274c6c9827aa85537eab82d66e7e62d0d527" - integrity sha512-/KD7PGfZv/tjKB6LoW97jzIgFqem0Tu9tZL9/iwBnBd8zkIZp7vT1ZSHNvnr0GSQMV/LTMxUstWg8WcDDUVQKg== + version "3.0.7" + resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.7.tgz#1eca48e47976e9573d6a2f18b97c2fea4026f34a" + integrity sha512-mUuH2MFOYB2oBaA4D4Ykqi9LaEYpMMlsiOMJOrv358yAjP6enPIk55fod2fNJ8AvwoYXStWQls37rA+s5e7boA== dependencies: growl "~> 1.10.0" js-yaml "^3.13.1" @@ -2119,9 +2096,9 @@ doctrine@^2.1.0: esutils "^2.0.2" documentation@^12.0.3: - version "12.0.3" - resolved "https://registry.yarnpkg.com/documentation/-/documentation-12.0.3.tgz#32f91da8e5cb4104f69db9fd32c87773a1ad6240" - integrity sha512-RoqkH+mQ4Vi/nFMxG0BaqPAnjKfsJ9lbLWB8KqoKVAZy+urSpk1K1zBzaFesdDkKeaR3aBgeR3RjtHp8Ut/1Wg== + version "12.1.2" + resolved "https://registry.yarnpkg.com/documentation/-/documentation-12.1.2.tgz#4ed9ab511363504da7a0c120d192a366bd6b994a" + integrity sha512-k0orsM458oU4m2P7yaXuLwM/0TPC1y0AWeiM5qLIT39oGjUgHLY+VOlb9x2cty5LyENxLQl4rtQzTMWKJ6l5Ng== dependencies: "@babel/core" "^7.1.2" "@babel/generator" "^7.1.3" @@ -2161,6 +2138,7 @@ documentation@^12.0.3: glob "^7.1.2" globals-docs "^2.4.0" highlight.js "^9.15.5" + ini "^1.3.5" js-yaml "^3.10.0" lodash "^4.17.10" mdast-util-inject "^1.1.0" @@ -2174,7 +2152,6 @@ documentation@^12.0.3: remark-html "^8.0.0" remark-reference-links "^4.0.1" remark-toc "^5.0.0" - remote-origin-url "0.4.0" resolve "^1.8.1" stream-array "^1.1.2" strip-json-comments "^2.0.1" @@ -2226,10 +2203,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.191: - version "1.3.201" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.201.tgz#b516e941baf01a7cf8abd33af537a39e1e0096db" - integrity sha512-aCTPIfY1Jvuam5b6vuWRjt1F8i4kY7zX0Qtpu5SNd6l1zjuxU9fDNpbM4o6+oJsra+TMD2o7D20GnkSIgpTr9w== +electron-to-chromium@^1.3.295: + version "1.3.302" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.302.tgz#4c7ba3d56166507a56f7eb603fdde1ed701f5ac8" + integrity sha512-1qConyiVEbj4xZRBXqtGR003+9tV0rJF0PS6aeO0Ln/UL637js9hdwweCl07meh/kJoI2N4W8q3R3g3F5z46ww== "emoji-regex@>=6.0.0 <=6.1.1": version "6.1.1" @@ -2252,9 +2229,9 @@ encodeurl@~1.0.2: integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" @@ -2266,24 +2243,27 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" error@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" - integrity sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI= + version "7.2.0" + resolved "https://registry.yarnpkg.com/error/-/error-7.2.0.tgz#80c989885635b41df9309d145834a4f125ae2245" + integrity sha512-M6t3j3Vt3uDicrViMP5fLq2AeADNrCVFD8Oj4Qt2MHsX0mPYG7D5XdnEfSdRpaHQzjAJ19wu+I1mw9rQYMTAPg== dependencies: string-template "~0.2.1" - xtend "~4.0.0" es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" - integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + version "1.16.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.0.tgz#d3a26dc9c3283ac9750dca569586e976d9dcc06d" + integrity sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg== dependencies: es-to-primitive "^1.2.0" function-bind "^1.1.1" has "^1.0.3" + has-symbols "^1.0.0" is-callable "^1.1.4" is-regex "^1.0.4" - object-keys "^1.0.12" + object-inspect "^1.6.0" + object-keys "^1.1.1" + string.prototype.trimleft "^2.1.0" + string.prototype.trimright "^2.1.0" es-to-primitive@^1.2.0: version "1.2.0" @@ -2370,9 +2350,9 @@ eslint-scope@^3.7.1: estraverse "^4.1.1" eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== eslint@^4.9.0: version "4.19.1" @@ -2456,14 +2436,14 @@ estraverse@^1.9.1: integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== esutils@^2.0.0, esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== etag@~1.8.1: version "1.8.1" @@ -2798,9 +2778,9 @@ forever-agent@~0.6.1: integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@^2.3.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.0.tgz#094ec359dc4b55e7d62e0db4acd76e89fe874d37" - integrity sha512-WXieX3G/8side6VIqx44ablyULoGruSde5PNTxoUyo5CeyAMX6nVWUd0rgist/EuX655cjhUhTo1Fo3tRYqbcA== + version "2.5.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" + integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== dependencies: asynckit "^0.4.0" combined-stream "^1.0.6" @@ -2838,11 +2818,11 @@ fresh@0.5.2: integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= fs-minipass@^1.2.5: - version "1.2.6" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" - integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== dependencies: - minipass "^2.2.1" + minipass "^2.6.0" fs-mkdirp-stream@^1.0.0: version "1.0.0" @@ -3020,9 +3000,9 @@ glob@^5.0.15: path-is-absolute "^1.0.0" glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + version "7.1.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0" + integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3032,9 +3012,9 @@ glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: path-is-absolute "^1.0.0" globals-docs@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/globals-docs/-/globals-docs-2.4.0.tgz#f2c647544eb6161c7c38452808e16e693c2dafbb" - integrity sha512-B69mWcqCmT3jNYmSxRxxOXWfzu3Go8NQXPfl2o0qPd1EEFhwW0dFUg9ztTu915zPQzqwIhWAlw6hmfIcCK4kkQ== + version "2.4.1" + resolved "https://registry.yarnpkg.com/globals-docs/-/globals-docs-2.4.1.tgz#d16887709f4a15eb22d97e96343591f87a2ee3db" + integrity sha512-qpPnUKkWnz8NESjrCvnlGklsgiQzlq+rcCxoG5uNQ+dNA7cFMCmn231slLAwS2N/PlkzZ3COL8CcS10jXmLHqg== globals@^11.0.1, globals@^11.1.0: version "11.12.0" @@ -3047,9 +3027,9 @@ globals@^9.18.0: integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.2.0" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" - integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== growl@1.10.5, "growl@~> 1.10.0": version "1.10.5" @@ -3057,9 +3037,9 @@ growl@1.10.5, "growl@~> 1.10.0": integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== handlebars@^4.0.1, handlebars@^4.0.3: - version "4.1.2" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" - integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== + version "4.5.1" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.1.tgz#8a01c382c180272260d07f2d1aa3ae745715c7ba" + integrity sha512-C29UoFzHe9yM61lOsIlCE5/mQVGrnIOrOq7maQl76L7tYPCgC1og0Ajt6uWnX4ZTxBPnjw+CUvawphwCfJgUnA== dependencies: neo-async "^2.6.0" optimist "^0.6.1" @@ -3184,9 +3164,9 @@ he@1.2.0, he@^1.1.0: integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== highlight.js@^9.15.5: - version "9.15.8" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.15.8.tgz#f344fda123f36f1a65490e932cf90569e4999971" - integrity sha512-RrapkKQWwE+wKdF73VsOa2RQdIoO3mxwJ4P8mhbI6KYJUraUHRKM5w5zQQKXNk0xNL4UVRdulV9SBJcmzJNzVA== + version "9.16.2" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.16.2.tgz#68368d039ffe1c6211bcc07e483daf95de3e403e" + integrity sha512-feMUrVLZvjy0oC7FVJQcSQRqbBq9kwqnYE4+Kj9ZjbHh3g+BisiPgF49NyQbVLNdrL/qqZr3Ca9yOKwgn2i/tw== homedir-polyfill@^1.0.1: version "1.0.3" @@ -3196,9 +3176,9 @@ homedir-polyfill@^1.0.1: parse-passwd "^1.0.0" hosted-git-info@^2.1.4: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + version "2.8.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" + integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== html-void-elements@^1.0.0: version "1.0.4" @@ -3244,9 +3224,9 @@ iconv-lite@^0.4.17, iconv-lite@^0.4.4: safer-buffer ">= 2.1.2 < 3" ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== dependencies: minimatch "^3.0.4" @@ -3278,7 +3258,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.3, ini@~1.3.0: +ini@^1.3.5, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -3383,9 +3363,9 @@ is-buffer@^1.1.4, is-buffer@^1.1.5, is-buffer@~1.1.1: integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-buffer@^2.0.0, is-buffer@^2.0.2, is-buffer@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" - integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== is-callable@^1.1.4: version "1.1.4" @@ -3818,9 +3798,9 @@ json-stringify-safe@~5.0.1: integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json5@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" - integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== dependencies: minimist "^1.2.0" @@ -3872,11 +3852,6 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" -kareem@2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.0.7.tgz#8d260366a4df4236ceccec318fcf10c17c5beb22" - integrity sha512-p8+lEpsNs4N0fvNOC1/zzDO0wDrD3Pb1G+OwfIG+gKVK3MyY5jeaGYh+9Qx6jb4fEG2b3E6U98vaE9MH7Gilsw== - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -3902,9 +3877,9 @@ kind-of@^6.0.0, kind-of@^6.0.2: integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== km-moviedb@^0.2.12: - version "0.2.13" - resolved "https://registry.yarnpkg.com/km-moviedb/-/km-moviedb-0.2.13.tgz#1981f1468ed4a52f6ec3a257310719d79a0892ab" - integrity sha512-/AsIP3oltR6UVDrf05gRsjjIL6cnCP136U65QLf1TQiyz9ixGGNO9M/dxOrMJVCmIdOHW1EJtXDvzBYv7lMfYg== + version "0.2.14" + resolved "https://registry.yarnpkg.com/km-moviedb/-/km-moviedb-0.2.14.tgz#abba26d8172ac31fe8cae77d6db76b26ed7355bb" + integrity sha512-bl362FYXh5XYQhUsjED9HLfiDNcb6G8zN0wHyNrFwH6Ju1PQn48aLBg8yoB333VMaKWvvMUqnW31tRiEzGK4Pg== dependencies: superagent "3.8.2" @@ -4001,11 +3976,6 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash.get@4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" @@ -4041,7 +4011,7 @@ lodash.once@^4.0.0: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= -lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.3.0: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.3.0: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -4334,20 +4304,20 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.1, minipass@^2.3.5: - version "2.3.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" minizlib@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" - integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== dependencies: - minipass "^2.2.1" + minipass "^2.9.0" mixin-deep@^1.2.0: version "1.3.2" @@ -4370,9 +4340,9 @@ mocha-lcov-reporter@^1.3.0: integrity sha1-Rpve9PivyaEWBW8HnfYYLQr7A4Q= mocha@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.0.tgz#f896b642843445d1bb8bca60eabd9206b8916e56" - integrity sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ== + version "6.2.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.2.tgz#5d8987e28940caf8957a7d7664b910dc5b2fea20" + integrity sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A== dependencies: ansi-colors "3.2.3" browser-stdout "1.3.1" @@ -4394,9 +4364,9 @@ mocha@^6.2.0: supports-color "6.0.0" which "1.3.1" wide-align "1.1.3" - yargs "13.2.2" - yargs-parser "13.0.0" - yargs-unparser "1.5.0" + yargs "13.3.0" + yargs-parser "13.1.1" + yargs-unparser "1.6.0" module-deps-sortable@5.0.0: version "5.0.0" @@ -4418,58 +4388,6 @@ module-deps-sortable@5.0.0: through2 "^2.0.0" xtend "^4.0.0" -mongodb-core@3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.0.8.tgz#8d401f4eab6056c0d874a3d5844a4844f761d4d7" - integrity sha512-dFxfhH9N7ohuQnINyIl6dqEF8sYOE0WKuymrFf3L3cipJNrx+S8rAbNOTwa00/fuJCjBMJNFsaA+R2N16//UIw== - dependencies: - bson "~1.0.4" - require_optional "^1.0.1" - -mongodb@3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.0.8.tgz#2c1daecac9a0ec2de2f2aea4dc97d76ae70f8951" - integrity sha512-mj7yIUyAr9xnO2ev8pcVJ9uX7gSum5LLs1qIFoWLxA5Il50+jcojKtaO1/TbexsScZ9Poz00Pc3b86GiSqJ7WA== - dependencies: - mongodb-core "3.0.8" - -mongoose-legacy-pluralize@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4" - integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ== - -mongoose@~5.0.11: - version "5.0.18" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.0.18.tgz#2d04c70f0800959b4c8180e5e70db13bc18d3826" - integrity sha512-13+gKxvViIVp4esPkgQYTdfisLLWxghvsj7aBg4oBurvb0LAXcSXFZpFORZnxtOdyxM7kJiSV9kjFjerEm3Bhw== - dependencies: - async "2.1.4" - bson "~1.0.5" - kareem "2.0.7" - lodash.get "4.4.2" - mongodb "3.0.8" - mongoose-legacy-pluralize "1.0.2" - mpath "0.4.1" - mquery "3.0.0" - ms "2.0.0" - regexp-clone "0.0.1" - sliced "1.0.1" - -mpath@0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.4.1.tgz#ed10388430380bf7bbb5be1391e5d6969cb08e89" - integrity sha512-NNY/MpBkALb9jJmjpBlIi6GRoLveLUM0pJzgbp9vY9F7IQEb/HREC/nxrixechcQwd1NevOhJnWWV8QQQRE+OA== - -mquery@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mquery/-/mquery-3.0.0.tgz#e5f387dbabc0b9b69859e550e810faabe0ceabb0" - integrity sha512-WL1Lk8v4l8VFSSwN3yCzY9TXw+fKVYKn6f+w86TRzOLSE8k1yTgGaLBPUByJQi8VcLbOdnUneFV/y3Kv874pnQ== - dependencies: - bluebird "3.5.0" - debug "2.6.9" - regexp-clone "0.0.1" - sliced "0.0.5" - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -4570,6 +4488,11 @@ node-environment-flags@^1.0.5: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" +node-fetch@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + node-modules-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" @@ -4607,12 +4530,12 @@ node-pre-gyp@^0.11.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.25: - version "1.1.26" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.26.tgz#f30563edc5c7dc20cf524cc8652ffa7be0762937" - integrity sha512-fZPsuhhUHMTlfkhDLGtfY80DSJTjOcx+qD1j5pqPkuhUHVS7xHZIg9EE4DHK8O3f0zTxXHX5VIkDG8pu98/wfQ== +node-releases@^1.1.38: + version "1.1.39" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.39.tgz#c1011f30343aff5b633153b10ff691d278d08e8d" + integrity sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA== dependencies: - semver "^5.3.0" + semver "^6.3.0" nopt@3.x: version "3.0.6" @@ -4674,9 +4597,9 @@ npm-bundled@^1.0.1: integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== npm-packlist@^1.1.6: - version "1.4.4" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" - integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== + version "1.4.6" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4" + integrity sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -4755,7 +4678,12 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-keys@^1.0.11, object-keys@^1.0.12: +object-inspect@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" + integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -4872,7 +4800,7 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-locale@^3.0.0, os-locale@^3.1.0: +os-locale@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== @@ -4917,9 +4845,9 @@ p-limit@^1.1.0: p-try "^1.0.0" p-limit@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" - integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== dependencies: p-try "^2.0.0" @@ -4968,13 +4896,6 @@ parse-filepath@^1.0.2: map-cache "^0.2.0" path-root "^0.1.1" -parse-git-config@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-0.2.0.tgz#272833fdd15fea146fb75d336d236b963b6ff706" - integrity sha1-Jygz/dFf6hRvt10zbSNrljtv9wY= - dependencies: - ini "^1.3.3" - parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -5241,9 +5162,9 @@ pseudomap@^1.0.2: integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.24, psl@^1.1.28: - version "1.2.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.2.0.tgz#df12b5b1b3a30f51c329eacbdef98f3a6e136dc6" - integrity sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA== + version "1.4.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2" + integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw== pump@^2.0.0: version "2.0.1" @@ -5291,9 +5212,9 @@ qs@6.5.2, qs@~6.5.2: integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== qs@^6.4.0, qs@^6.5.1: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + version "6.9.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.0.tgz#d1297e2a049c53119cb49cca366adbbacc80b409" + integrity sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA== query-string@^4.1.0: version "4.3.4" @@ -5454,7 +5375,7 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -regenerate-unicode-properties@^8.0.2: +regenerate-unicode-properties@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== @@ -5471,7 +5392,7 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.2: +regenerator-runtime@^0.13.3: version "0.13.3" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== @@ -5498,37 +5419,27 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp-clone@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-0.0.1.tgz#a7c2e09891fdbf38fbb10d376fb73003e68ac589" - integrity sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk= - -regexp-tree@^0.1.6: - version "0.1.11" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.11.tgz#c9c7f00fcf722e0a56c7390983a7a63dd6c272f3" - integrity sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg== - regexpp@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== -regexpu-core@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" - integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== +regexpu-core@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" + integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== dependencies: regenerate "^1.4.0" - regenerate-unicode-properties "^8.0.2" + regenerate-unicode-properties "^8.1.0" regjsgen "^0.5.0" regjsparser "^0.6.0" unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.1.0" regjsgen@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" - integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== regjsparser@^0.6.0: version "0.6.0" @@ -5621,13 +5532,6 @@ remark@^9.0.0: remark-stringify "^5.0.0" unified "^6.0.0" -remote-origin-url@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/remote-origin-url/-/remote-origin-url-0.4.0.tgz#4d3e2902f34e2d37d1c263d87710b77eb4086a30" - integrity sha1-TT4pAvNOLTfRwmPYdxC3frQIajA= - dependencies: - parse-git-config "^0.2.0" - remove-bom-buffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" @@ -5738,14 +5642,6 @@ require-uncached@^1.0.3: caller-path "^0.1.0" resolve-from "^1.0.0" -require_optional@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" - integrity sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g== - dependencies: - resolve-from "^2.0.0" - semver "^5.1.0" - resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" @@ -5774,9 +5670,9 @@ resolve@1.1.7, resolve@1.1.x: integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= resolve@^1.1.3, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" - integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== + version "1.12.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" + integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== dependencies: path-parse "^1.0.6" @@ -5793,7 +5689,14 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: +rimraf@^2.6.1, rimraf@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -5851,12 +5754,12 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" - integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.1.1: +semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -5934,16 +5837,6 @@ slice-ansi@1.0.0: dependencies: is-fullwidth-code-point "^2.0.0" -sliced@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/sliced/-/sliced-0.0.5.tgz#5edc044ca4eb6f7816d50ba2fc63e25d8fe4707f" - integrity sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8= - -sliced@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" - integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E= - slide@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -5998,9 +5891,9 @@ source-map-resolve@^0.5.0: urix "^0.1.0" source-map-support@^0.5.9: - version "0.5.12" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" - integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -6033,9 +5926,9 @@ space-separated-tokens@^1.0.0: integrity sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA== spawn-wrap@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.2.tgz#cff58e73a8224617b6561abdc32586ea0c82248c" - integrity sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg== + version "1.4.3" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.3.tgz#81b7670e170cca247d80bf5faf0cfb713bdcf848" + integrity sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw== dependencies: foreground-child "^1.5.6" mkdirp "^0.5.0" @@ -6083,9 +5976,9 @@ sprintf-js@~1.0.2: integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sqlite3@^4.0.0: - version "4.0.9" - resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.0.9.tgz#cff74550fa5a1159956815400bdef69245557640" - integrity sha512-IkvzjmsWQl9BuBiM4xKpl5X8WCR4w0AeJHRdobCdXZ8dT/lNc1XS6WqvY35N6+YzIIgzSBeY5prdFObID9F9tA== + version "4.1.0" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.1.0.tgz#e051fb9c133be15726322a69e2e37ec560368380" + integrity sha512-RvqoKxq+8pDHsJo7aXxsFR18i+dU2Wp5o12qAJOV5LNcDt+fgJsc2QKKg3sIRfXrN9ZjzY1T7SNe/DFVqAXjaw== dependencies: nan "^2.12.1" node-pre-gyp "^0.11.0" @@ -6186,7 +6079,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0: +string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -6204,6 +6097,22 @@ string-width@^4.0.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^5.2.0" +string.prototype.trimleft@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" + integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" + integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + string_decoder@0.10, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -6240,7 +6149,7 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -6370,13 +6279,13 @@ table@4.0.2: string-width "^2.1.1" tar@^4: - version "4.4.10" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" - integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== dependencies: chownr "^1.1.1" fs-minipass "^1.2.5" - minipass "^2.3.5" + minipass "^2.8.6" minizlib "^1.2.1" mkdirp "^0.5.0" safe-buffer "^5.1.2" @@ -6567,16 +6476,16 @@ typedarray@^0.0.6, typedarray@~0.0.5: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" - integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== + version "3.6.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.4.tgz#b18752bb3792bc1a0281335f7f6ebf1bbfc5b91d" + integrity sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg== uglify-js@^3.1.4: - version "3.6.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" - integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== + version "3.6.7" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.7.tgz#15f49211df6b8a01ee91322bbe46fa33223175dc" + integrity sha512-4sXQDzmdnoXiO+xvmTzQsfIiwrjUCSA95rSP4SEd8tDb51W2TiDOlL76Hl+Kw0Ie42PSItCW8/t6pBNCF2R48A== dependencies: - commander "~2.20.0" + commander "~2.20.3" source-map "~0.6.1" unc-path-regex@^0.1.2: @@ -6719,9 +6628,9 @@ unset-value@^1.0.0: isobject "^3.0.0" upath@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" - integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== uri-js@^4.2.2: version "4.2.2" @@ -6750,11 +6659,16 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@3.3.2, uuid@^3.3.2: +uuid@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== +uuid@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" + integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== + v8flags@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8" @@ -6959,6 +6873,15 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -7006,14 +6929,14 @@ yallist@^2.1.2: integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yallist@^3.0.0, yallist@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" - integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yargs-parser@13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" - integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw== +yargs-parser@13.1.1, yargs-parser@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -7026,14 +6949,6 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^13.0.0: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^8.0.0: version "8.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" @@ -7048,14 +6963,14 @@ yargs-parser@^9.0.2: dependencies: camelcase "^4.1.0" -yargs-unparser@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.5.0.tgz#f2bb2a7e83cbc87bb95c8e572828a06c9add6e0d" - integrity sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw== +yargs-unparser@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== dependencies: flat "^4.1.0" - lodash "^4.17.11" - yargs "^12.0.5" + lodash "^4.17.15" + yargs "^13.3.0" yargs@11.1.0: version "11.1.0" @@ -7075,24 +6990,23 @@ yargs@11.1.0: y18n "^3.2.1" yargs-parser "^9.0.2" -yargs@13.2.2: - version "13.2.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993" - integrity sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA== +yargs@13.3.0, yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== dependencies: - cliui "^4.0.0" + cliui "^5.0.0" find-up "^3.0.0" get-caller-file "^2.0.1" - os-locale "^3.1.0" require-directory "^2.1.1" require-main-filename "^2.0.0" set-blocking "^2.0.0" string-width "^3.0.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^13.0.0" + yargs-parser "^13.1.1" -yargs@^12.0.2, yargs@^12.0.5: +yargs@^12.0.2: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== From f8cc19b5104fb0509b9e29497377c42235d49549 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 3 Nov 2019 20:56:46 +0100 Subject: [PATCH 83/85] Added rating and release_date when parsing movies and fixed respective tests --- seasoned_api/src/tmdb/types/movie.js | 21 +++++++++++-------- .../controllers/list/listController.js | 4 ++-- .../empty-query-success-response.json | 6 ++++++ seasoned_api/test/helpers/tmdbMock2.js | 16 ++++++++++++++ .../test/unit/tmdb/testConvertTmdbToMovie.js | 17 ++++++++------- seasoned_api/test/unit/tmdb/testTmdb.disabled | 2 +- 6 files changed, 46 insertions(+), 20 deletions(-) create mode 100644 seasoned_api/test/fixtures/empty-query-success-response.json create mode 100644 seasoned_api/test/helpers/tmdbMock2.js diff --git a/seasoned_api/src/tmdb/types/movie.js b/seasoned_api/src/tmdb/types/movie.js index 64556a8..4663245 100644 --- a/seasoned_api/src/tmdb/types/movie.js +++ b/seasoned_api/src/tmdb/types/movie.js @@ -1,14 +1,15 @@ class Movie { - constructor(id, title, year=undefined, overview=undefined, poster=undefined, - backdrop=undefined, rank=undefined, genres=undefined, productionStatus=undefined, - tagline=undefined, runtime=undefined, imdb_id=undefined, popularity) { + constructor(id, title, year=undefined, overview=undefined, poster=undefined, backdrop=undefined, + releaseDate=undefined, rating=undefined, genres=undefined, productionStatus=undefined, + tagline=undefined, runtime=undefined, imdb_id=undefined, popularity=undefined) { this.id = id; this.title = title; this.year = year; this.overview = overview; this.poster = poster; this.backdrop = backdrop; - this.rank = rank; + this.releaseDate = releaseDate; + this.rating = rating; this.genres = genres; this.productionStatus = productionStatus; this.tagline = tagline; @@ -19,13 +20,14 @@ class Movie { } static convertFromTmdbResponse(response) { - const { id, title, release_date, overview, poster_path, backdrop_path, rank, genres, status, + const { id, title, release_date, overview, poster_path, backdrop_path, vote_average, genres, status, tagline, runtime, imdb_id, popularity } = response; - const year = new Date(release_date).getFullYear() + const releaseDate = new Date(release_date); + const year = releaseDate.getFullYear(); const genreNames = genres ? genres.map(g => g.name) : undefined - return new Movie(id, title, year, overview, poster_path, backdrop_path, rank, genreNames, status, + return new Movie(id, title, year, overview, poster_path, backdrop_path, releaseDate, vote_average, genreNames, status, tagline, runtime, imdb_id, popularity) } @@ -34,7 +36,7 @@ class Movie { const { title, year, rating, tagline, summary } = response; const _ = undefined - return new Movie(null, title, year, summary, _, _, rating, _, _, tagline) + return new Movie(null, title, year, summary, _, _, _, rating, _, _, tagline) } createJsonResponse() { @@ -45,7 +47,8 @@ class Movie { overview: this.overview, poster: this.poster, backdrop: this.backdrop, - rank: this.rank, + release_date: this.releaseDate, + rating: this.rating, genres: this.genres, production_status: this.productionStatus, tagline: this.tagline, diff --git a/seasoned_api/src/webserver/controllers/list/listController.js b/seasoned_api/src/webserver/controllers/list/listController.js index c6357dd..0a4018b 100644 --- a/seasoned_api/src/webserver/controllers/list/listController.js +++ b/seasoned_api/src/webserver/controllers/list/listController.js @@ -32,11 +32,11 @@ function handleListResponse(response, res) { .catch(error => handleError(error, res)) } -function fetchTmdbList(req, res, listName, type) { +function fetchTmdbList(req, res, listname, type) { const { page } = req.query; if (type === 'movie') { - return tmdb.movieList(listName, page) + return tmdb.movieList(listname, page) .then(listResponse => res.send(listResponse)) .catch(error => handleError(error, res)) } else if (type === 'show') { diff --git a/seasoned_api/test/fixtures/empty-query-success-response.json b/seasoned_api/test/fixtures/empty-query-success-response.json new file mode 100644 index 0000000..d379177 --- /dev/null +++ b/seasoned_api/test/fixtures/empty-query-success-response.json @@ -0,0 +1,6 @@ +{ + "page":1, + "results":[], + "total_results":0, + "total_pages":1 +} diff --git a/seasoned_api/test/helpers/tmdbMock2.js b/seasoned_api/test/helpers/tmdbMock2.js new file mode 100644 index 0000000..c6ff722 --- /dev/null +++ b/seasoned_api/test/helpers/tmdbMock2.js @@ -0,0 +1,16 @@ +const tmdbMock = () => ({ + error: null, + response: null, + searchMovie(query, callback) { + callback(this.error, this.response); + }, + movieInfo(query, callback) { + callback(this.error, this.response); + }, + miscPopularMovies(callback) { + console.log('miscPopMovies callback', callback) + callback(this.error, this.response); + }, +}); + +module.exports = tmdbMock; diff --git a/seasoned_api/test/unit/tmdb/testConvertTmdbToMovie.js b/seasoned_api/test/unit/tmdb/testConvertTmdbToMovie.js index cf8f3ba..2ae569c 100644 --- a/seasoned_api/test/unit/tmdb/testConvertTmdbToMovie.js +++ b/seasoned_api/test/unit/tmdb/testConvertTmdbToMovie.js @@ -1,28 +1,29 @@ const assert = require('assert'); -const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); +// const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); +const { Movie } = require('src/tmdb/types'); const bladeRunnerQuerySuccess = require('test/fixtures/blade_runner_2049-info-success-response.json') describe('Convert tmdb movieInfo to movie', () => { beforeEach(() => [this.bladeRunnerTmdbMovie] = bladeRunnerQuerySuccess); it('should translate the tmdb release date to movie year', () => { - const bladeRunner = convertTmdbToMovie(this.bladeRunnerTmdbMovie); + const bladeRunner = Movie.convertFromTmdbResponse(this.bladeRunnerTmdbMovie); assert.strictEqual(bladeRunner.year, 2017); }); it('should translate the tmdb release date to instance of Date', () => { - const bladeRunner = convertTmdbToMovie(this.bladeRunnerTmdbMovie); - assert(bladeRunner.release_date instanceof Date); + const bladeRunner = Movie.convertFromTmdbResponse(this.bladeRunnerTmdbMovie); + assert(bladeRunner.releaseDate instanceof Date); }); it('should translate the tmdb title to title', () => { - const bladeRunner = convertTmdbToMovie(this.bladeRunnerTmdbMovie); + const bladeRunner = Movie.convertFromTmdbResponse(this.bladeRunnerTmdbMovie); assert.equal(bladeRunner.title, 'Blade Runner 2049'); }); - it('should translate the tmdb vote_average to rank', () => { - const bladeRunner = convertTmdbToMovie(this.bladeRunnerTmdbMovie); - assert.equal(bladeRunner.rank, 7.3); + it('should translate the tmdb vote_average to rating', () => { + const bladeRunner = Movie.convertFromTmdbResponse(this.bladeRunnerTmdbMovie); + assert.equal(bladeRunner.rating, 7.3); }); diff --git a/seasoned_api/test/unit/tmdb/testTmdb.disabled b/seasoned_api/test/unit/tmdb/testTmdb.disabled index cb5c5eb..703f9ae 100644 --- a/seasoned_api/test/unit/tmdb/testTmdb.disabled +++ b/seasoned_api/test/unit/tmdb/testTmdb.disabled @@ -21,7 +21,7 @@ describe('TMDB', function test() { it('should return the "Blade Runner 2049" year in the collection of popular movies', () => { this.mockMoviedb.response = popularMovieSuccessResponse; const cache = new Cache(this.database); - const tmdb = new TMDB(cache, 'bogus-api-key', this.mockMoviedb); + const tmdb = new TMDB(cache, 'bogus-pi-key', this.mockMoviedb); return tmdb.popular() .then(movies => assert.equal(movies[0].title, "Blade Runner 2049") From 6b737b8ab4fac60d74823fdf9b82cea9382823a2 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Mon, 4 Nov 2019 00:57:27 +0100 Subject: [PATCH 84/85] Updated all controller responses to return message not error on errors. --- .../src/webserver/controllers/list/listController.js | 2 +- seasoned_api/src/webserver/controllers/movie/credits.js | 2 +- seasoned_api/src/webserver/controllers/movie/info.js | 2 +- .../src/webserver/controllers/movie/releaseDates.js | 2 +- seasoned_api/src/webserver/controllers/person/info.js | 2 +- .../src/webserver/controllers/pirate/addMagnet.js | 4 ++-- .../src/webserver/controllers/pirate/searchTheBay.js | 4 ++-- .../src/webserver/controllers/plex/fetchRequested.js | 2 +- .../src/webserver/controllers/plex/plexPlaying.js | 6 +++--- .../src/webserver/controllers/plex/readRequest.js | 6 +++--- seasoned_api/src/webserver/controllers/plex/search.js | 8 ++++---- .../src/webserver/controllers/plex/searchMedia.js | 8 ++++---- .../src/webserver/controllers/plex/searchRequest.js | 4 ++-- .../src/webserver/controllers/plex/submitRequest.js | 4 ++-- .../src/webserver/controllers/plex/updateRequested.js | 2 +- .../src/webserver/controllers/request/fetchAllRequests.js | 6 +++--- .../src/webserver/controllers/request/getRequest.js | 2 +- .../src/webserver/controllers/request/requestTmdbId.js | 8 ++++---- .../src/webserver/controllers/search/movieSearch.js | 2 +- .../src/webserver/controllers/search/multiSearch.js | 2 +- .../src/webserver/controllers/search/personSearch.js | 2 +- .../src/webserver/controllers/search/showSearch.js | 4 ++-- .../src/webserver/controllers/seasoned/readStrays.js | 2 +- .../src/webserver/controllers/seasoned/strayById.js | 2 +- .../src/webserver/controllers/seasoned/verifyStray.js | 2 +- seasoned_api/src/webserver/controllers/show/credits.js | 2 +- seasoned_api/src/webserver/controllers/show/info.js | 6 ++++-- seasoned_api/src/webserver/controllers/user/history.js | 6 +++--- seasoned_api/src/webserver/controllers/user/login.js | 6 +++--- seasoned_api/src/webserver/controllers/user/register.js | 6 +++--- seasoned_api/src/webserver/controllers/user/requests.js | 7 +++---- 31 files changed, 62 insertions(+), 61 deletions(-) diff --git a/seasoned_api/src/webserver/controllers/list/listController.js b/seasoned_api/src/webserver/controllers/list/listController.js index 0a4018b..4e7806f 100644 --- a/seasoned_api/src/webserver/controllers/list/listController.js +++ b/seasoned_api/src/webserver/controllers/list/listController.js @@ -20,7 +20,7 @@ function handleError(error, res) { const { status, message } = error; if (status && message) { - res.status(error.status).send({ success: false, error: error.message }) + res.status(status).send({ success: false, message }) } else { console.log('caught list controller error', error) res.status(500).send({ message: 'An unexpected error occured while requesting list'}) diff --git a/seasoned_api/src/webserver/controllers/movie/credits.js b/seasoned_api/src/webserver/controllers/movie/credits.js index a3eceb8..542adfc 100644 --- a/seasoned_api/src/webserver/controllers/movie/credits.js +++ b/seasoned_api/src/webserver/controllers/movie/credits.js @@ -14,7 +14,7 @@ const movieCreditsController = (req, res) => { const { status, message } = error; if (status && message) { - res.status(error.status).send({ success: false, error: error.message }) + res.status(status).send({ success: false, message }) } else { // TODO log unhandled errors console.log('caugth movie credits controller error', error) diff --git a/seasoned_api/src/webserver/controllers/movie/info.js b/seasoned_api/src/webserver/controllers/movie/info.js index 14d4d82..91d8391 100644 --- a/seasoned_api/src/webserver/controllers/movie/info.js +++ b/seasoned_api/src/webserver/controllers/movie/info.js @@ -10,7 +10,7 @@ function handleError(error, res) { const { status, message } = error; if (status && message) { - res.status(error.status).send({ success: false, error: error.message }) + res.status(status).send({ success: false, message }) } else { console.log('caught movieinfo controller error', error) res.status(500).send({ message: 'An unexpected error occured while requesting movie info'}) diff --git a/seasoned_api/src/webserver/controllers/movie/releaseDates.js b/seasoned_api/src/webserver/controllers/movie/releaseDates.js index 01cd48e..c9797de 100644 --- a/seasoned_api/src/webserver/controllers/movie/releaseDates.js +++ b/seasoned_api/src/webserver/controllers/movie/releaseDates.js @@ -14,7 +14,7 @@ const movieReleaseDatesController = (req, res) => { const { status, message } = error; if (status && message) { - res.status(error.status).send({ success: false, error: error.message }) + res.status(status).send({ success: false, message }) } else { // TODO log unhandled errors : here our at tmdbReleaseError ? console.log('caugth release dates controller error', error) diff --git a/seasoned_api/src/webserver/controllers/person/info.js b/seasoned_api/src/webserver/controllers/person/info.js index a0eeab6..ea24d7a 100644 --- a/seasoned_api/src/webserver/controllers/person/info.js +++ b/seasoned_api/src/webserver/controllers/person/info.js @@ -18,7 +18,7 @@ function personInfoController(req, res) { tmdb.personInfo(personId) .then(person => res.send(person.createJsonResponse())) .catch(error => { - res.status(404).send({ success: false, error: error.message }); + res.status(404).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/pirate/addMagnet.js b/seasoned_api/src/webserver/controllers/pirate/addMagnet.js index e46988a..b11af5f 100644 --- a/seasoned_api/src/webserver/controllers/pirate/addMagnet.js +++ b/seasoned_api/src/webserver/controllers/pirate/addMagnet.js @@ -17,8 +17,8 @@ function addMagnet(req, res) { .then((result) => { res.send(result); }) - .catch((error) => { - res.status(500).send({ success: false, error: error.message }); + .catch(error => { + res.status(500).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/pirate/searchTheBay.js b/seasoned_api/src/webserver/controllers/pirate/searchTheBay.js index fcba93a..1497a29 100644 --- a/seasoned_api/src/webserver/controllers/pirate/searchTheBay.js +++ b/seasoned_api/src/webserver/controllers/pirate/searchTheBay.js @@ -21,8 +21,8 @@ function updateRequested(req, res) { .then((result) => { res.send({ success: true, results: result }); }) - .catch((error) => { - res.status(401).send({ success: false, error: error.message }); + .catch(error => { + res.status(401).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/plex/fetchRequested.js b/seasoned_api/src/webserver/controllers/plex/fetchRequested.js index cd0f842..149fe73 100644 --- a/seasoned_api/src/webserver/controllers/plex/fetchRequested.js +++ b/seasoned_api/src/webserver/controllers/plex/fetchRequested.js @@ -17,7 +17,7 @@ function fetchRequestedController(req, res) { res.send({ success: true, results: requestedItems, total_results: requestedItems.length }); }) .catch((error) => { - res.status(401).send({ success: false, error: error.message }); + res.status(401).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/plex/plexPlaying.js b/seasoned_api/src/webserver/controllers/plex/plexPlaying.js index 30b05e2..c26f677 100644 --- a/seasoned_api/src/webserver/controllers/plex/plexPlaying.js +++ b/seasoned_api/src/webserver/controllers/plex/plexPlaying.js @@ -5,11 +5,11 @@ const plexRepository = new PlexRepository(configuration.get('plex', 'ip')); function playingController(req, res) { plexRepository.nowPlaying() - .then((movies) => { + .then(movies => { res.send(movies); }) - .catch((error) => { - res.status(500).send({ success: false, error: error.message }); + .catch(error => { + res.status(500).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/plex/readRequest.js b/seasoned_api/src/webserver/controllers/plex/readRequest.js index 351dae6..224f682 100644 --- a/seasoned_api/src/webserver/controllers/plex/readRequest.js +++ b/seasoned_api/src/webserver/controllers/plex/readRequest.js @@ -12,10 +12,10 @@ function readRequestController(req, res) { const mediaId = req.params.mediaId; const { type } = req.query; requestRepository.lookup(mediaId, type) - .then((movies) => { + .then(movies => { res.send(movies); - }).catch((error) => { - res.status(404).send({ success: false, error: error.message }); + }).catch(error => { + res.status(404).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/plex/search.js b/seasoned_api/src/webserver/controllers/plex/search.js index 69401c6..bf932d3 100644 --- a/seasoned_api/src/webserver/controllers/plex/search.js +++ b/seasoned_api/src/webserver/controllers/plex/search.js @@ -11,14 +11,14 @@ const plex = new Plex(configuration.get('plex', 'ip')); function searchPlexController(req, res) { const { query, type } = req.query; plex.search(query, type) - .then((movies) => { + .then(movies => { if (movies.length > 0) { res.send(movies); } else { - res.status(404).send({ success: false, error: 'Search query did not give any results from plex.'}) + res.status(404).send({ success: false, message: 'Search query did not give any results from plex.'}) } - }).catch((error) => { - res.status(500).send({ success: false, error: error.message }); + }).catch(error => { + res.status(500).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/plex/searchMedia.js b/seasoned_api/src/webserver/controllers/plex/searchMedia.js index 4eee722..514312f 100644 --- a/seasoned_api/src/webserver/controllers/plex/searchMedia.js +++ b/seasoned_api/src/webserver/controllers/plex/searchMedia.js @@ -14,15 +14,15 @@ function searchMediaController(req, res) { const { query } = req.query; plexRepository.search(query) - .then((media) => { + .then(media => { if (media !== undefined || media.length > 0) { res.send(media); } else { - res.status(404).send({ success: false, error: 'Search query did not return any results.' }); + res.status(404).send({ success: false, message: 'Search query did not return any results.' }); } }) - .catch((error) => { - res.status(500).send({ success: false, error: error.message }); + .catch(error => { + res.status(500).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/plex/searchRequest.js b/seasoned_api/src/webserver/controllers/plex/searchRequest.js index 6aabb7b..2bc970c 100644 --- a/seasoned_api/src/webserver/controllers/plex/searchRequest.js +++ b/seasoned_api/src/webserver/controllers/plex/searchRequest.js @@ -18,8 +18,8 @@ function searchRequestController(req, res) { .then((searchResult) => { res.send(searchResult); }) - .catch((error) => { - res.status(500).send({ success: false, error: error }); + .catch(error => { + res.status(500).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/plex/submitRequest.js b/seasoned_api/src/webserver/controllers/plex/submitRequest.js index e4d7e78..a86aaa2 100644 --- a/seasoned_api/src/webserver/controllers/plex/submitRequest.js +++ b/seasoned_api/src/webserver/controllers/plex/submitRequest.js @@ -37,7 +37,7 @@ function submitRequestController(req, res) { console.log('show') mediaFunction = tmdbShowInfo } else { - res.status(422).send({ success: false, error: 'Incorrect type. Allowed types: "movie" or "show"'}) + res.status(422).send({ success: false, message: 'Incorrect type. Allowed types: "movie" or "show"'}) } if (mediaFunction === undefined) { res.status(200); return } @@ -45,7 +45,7 @@ function submitRequestController(req, res) { mediaFunction(id) .then(tmdbMedia => request.requestFromTmdb(tmdbMedia, ip, user_agent, user)) .then(() => res.send({ success: true, message: 'Media item successfully requested' })) - .catch(err => res.status(500).send({ success: false, error: err.message })) + .catch(err => res.status(500).send({ success: false, message: err.message })) } module.exports = submitRequestController; diff --git a/seasoned_api/src/webserver/controllers/plex/updateRequested.js b/seasoned_api/src/webserver/controllers/plex/updateRequested.js index 6057bf4..fdb2a72 100644 --- a/seasoned_api/src/webserver/controllers/plex/updateRequested.js +++ b/seasoned_api/src/webserver/controllers/plex/updateRequested.js @@ -18,7 +18,7 @@ function updateRequested(req, res) { res.send({ success: true }); }) .catch((error) => { - res.status(401).send({ success: false, error: error.message }); + res.status(401).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/request/fetchAllRequests.js b/seasoned_api/src/webserver/controllers/request/fetchAllRequests.js index fb16b41..030deb3 100644 --- a/seasoned_api/src/webserver/controllers/request/fetchAllRequests.js +++ b/seasoned_api/src/webserver/controllers/request/fetchAllRequests.js @@ -18,9 +18,9 @@ function fetchAllRequests(req, res) { Promise.resolve() .then(() => request.fetchAll(page, sort_by, sort_direction, filter, query)) - .then((result) => res.send(result)) - .catch((error) => { - res.status(404).send({ success: false, error: error.message }); + .then(result => res.send(result)) + .catch(error => { + res.status(404).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/request/getRequest.js b/seasoned_api/src/webserver/controllers/request/getRequest.js index e72b8e2..856f320 100644 --- a/seasoned_api/src/webserver/controllers/request/getRequest.js +++ b/seasoned_api/src/webserver/controllers/request/getRequest.js @@ -14,7 +14,7 @@ function fetchAllRequests(req, res) { request.getRequestByIdAndType(id, type) .then(result => res.send(result)) .catch(error => { - res.status(404).send({ success: false, error: error.message }); + res.status(404).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/request/requestTmdbId.js b/seasoned_api/src/webserver/controllers/request/requestTmdbId.js index 5604252..016accb 100644 --- a/seasoned_api/src/webserver/controllers/request/requestTmdbId.js +++ b/seasoned_api/src/webserver/controllers/request/requestTmdbId.js @@ -38,15 +38,15 @@ function requestTmdbIdController(req, res) { } else if (type === 'show') { mediaFunction = tmdbShowInfo } else { - res.status(422).send({ success: false, error: 'Incorrect type. Allowed types: "movie" or "show"'}) + res.status(422).send({ success: false, message: 'Incorrect type. Allowed types: "movie" or "show"'}) } mediaFunction(id) // .catch((error) => { console.error(error); res.status(404).send({ success: false, error: 'Id not found' }) }) - .then((tmdbMedia) => request.requestFromTmdb(tmdbMedia, ip, user_agent, user)) + .then(tmdbMedia => request.requestFromTmdb(tmdbMedia, ip, user_agent, user)) .then(() => res.send({success: true, message: 'Request has been submitted.'})) - .catch((error) => { - res.send({ success: false, error: error.message }); + .catch(error => { + res.send({ success: false, message: error.message }); }) } diff --git a/seasoned_api/src/webserver/controllers/search/movieSearch.js b/seasoned_api/src/webserver/controllers/search/movieSearch.js index 4a9dfd7..e9b7ffa 100644 --- a/seasoned_api/src/webserver/controllers/search/movieSearch.js +++ b/seasoned_api/src/webserver/controllers/search/movieSearch.js @@ -26,7 +26,7 @@ function movieSearchController(req, res) { const { status, message } = error; if (status && message) { - res.status(error.status).send({ success: false, error: error.message }) + res.status(status).send({ success: false, message }) } else { // TODO log unhandled errors console.log('caugth movie search controller error', error) diff --git a/seasoned_api/src/webserver/controllers/search/multiSearch.js b/seasoned_api/src/webserver/controllers/search/multiSearch.js index 37b44cf..0f9b05f 100644 --- a/seasoned_api/src/webserver/controllers/search/multiSearch.js +++ b/seasoned_api/src/webserver/controllers/search/multiSearch.js @@ -33,7 +33,7 @@ function multiSearchController(req, res) { const { status, message } = error; if (status && message) { - res.status(error.status).send({ success: false, error: error.message }) + res.status(status).send({ success: false, message }) } else { // TODO log unhandled errors console.log('caugth multi search controller error', error) diff --git a/seasoned_api/src/webserver/controllers/search/personSearch.js b/seasoned_api/src/webserver/controllers/search/personSearch.js index 7c35272..dcb7b2a 100644 --- a/seasoned_api/src/webserver/controllers/search/personSearch.js +++ b/seasoned_api/src/webserver/controllers/search/personSearch.js @@ -28,7 +28,7 @@ function personSearchController(req, res) { const { status, message } = error; if (status && message) { - res.status(error.status).send({ success: false, error: error.message }) + res.status(status).send({ success: false, message }) } else { // TODO log unhandled errors console.log('caugth person search controller error', error) diff --git a/seasoned_api/src/webserver/controllers/search/showSearch.js b/seasoned_api/src/webserver/controllers/search/showSearch.js index f982116..fc77cae 100644 --- a/seasoned_api/src/webserver/controllers/search/showSearch.js +++ b/seasoned_api/src/webserver/controllers/search/showSearch.js @@ -27,8 +27,8 @@ function showSearchController(req, res) { .then((shows) => { res.send(shows); }) - .catch((error) => { - res.status(500).send({ success: false, error: error.message }); + .catch(error => { + res.status(500).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/seasoned/readStrays.js b/seasoned_api/src/webserver/controllers/seasoned/readStrays.js index 1f87b31..ca71d46 100644 --- a/seasoned_api/src/webserver/controllers/seasoned/readStrays.js +++ b/seasoned_api/src/webserver/controllers/seasoned/readStrays.js @@ -10,7 +10,7 @@ function readStraysController(req, res) { res.send(strays); }) .catch((error) => { - res.status(500).send({ success: false, error: error.message }); + res.status(500).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/seasoned/strayById.js b/seasoned_api/src/webserver/controllers/seasoned/strayById.js index 9cdd57c..2810097 100644 --- a/seasoned_api/src/webserver/controllers/seasoned/strayById.js +++ b/seasoned_api/src/webserver/controllers/seasoned/strayById.js @@ -10,7 +10,7 @@ function strayByIdController(req, res) { res.send(stray); }) .catch((error) => { - res.status(500).send({ success: false, error: error.message }); + res.status(500).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/seasoned/verifyStray.js b/seasoned_api/src/webserver/controllers/seasoned/verifyStray.js index 79c807c..84abc76 100644 --- a/seasoned_api/src/webserver/controllers/seasoned/verifyStray.js +++ b/seasoned_api/src/webserver/controllers/seasoned/verifyStray.js @@ -10,7 +10,7 @@ function verifyStrayController(req, res) { res.send({ success: true, message: 'Episode verified' }); }) .catch((error) => { - res.status(500).send({ success: false, error: error.message }); + res.status(500).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/show/credits.js b/seasoned_api/src/webserver/controllers/show/credits.js index fcfccbd..7974f1f 100644 --- a/seasoned_api/src/webserver/controllers/show/credits.js +++ b/seasoned_api/src/webserver/controllers/show/credits.js @@ -14,7 +14,7 @@ const showCreditsController = (req, res) => { const { status, message } = error; if (status && message) { - res.status(error.status).send({ success: false, error: error.message }) + res.status(status).send({ success: false, message }) } else { // TODO log unhandled errors console.log('caugth show credits controller error', error) diff --git a/seasoned_api/src/webserver/controllers/show/info.js b/seasoned_api/src/webserver/controllers/show/info.js index 5cd56e8..e335b15 100644 --- a/seasoned_api/src/webserver/controllers/show/info.js +++ b/seasoned_api/src/webserver/controllers/show/info.js @@ -10,10 +10,12 @@ function handleError(error, res) { const { status, message } = error; if (status && message) { - res.status(error.status).send({ success: false, error: error.message }) + res.status(status).send({ success: false, message }) } else { console.log('caught showinfo controller error', error) - res.status(500).send({ message: 'An unexpected error occured while requesting show info'}) + res.status(500).send({ + message: 'An unexpected error occured while requesting show info.' + }) } } diff --git a/seasoned_api/src/webserver/controllers/user/history.js b/seasoned_api/src/webserver/controllers/user/history.js index ef41bb5..36cb77f 100644 --- a/seasoned_api/src/webserver/controllers/user/history.js +++ b/seasoned_api/src/webserver/controllers/user/history.js @@ -13,11 +13,11 @@ function historyController(req, res) { const username = user === undefined ? undefined : user.username; searchHistory.read(username) - .then((searchQueries) => { + .then(searchQueries => { res.send({ success: true, searchQueries }); }) - .catch((error) => { - res.status(404).send({ success: false, error: error }); + .catch(error => { + res.status(404).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/user/login.js b/seasoned_api/src/webserver/controllers/user/login.js index 25d8bca..ada2bcc 100644 --- a/seasoned_api/src/webserver/controllers/user/login.js +++ b/seasoned_api/src/webserver/controllers/user/login.js @@ -20,13 +20,13 @@ function loginController(req, res) { userSecurity.login(user, password) .then(() => userRepository.checkAdmin(user)) - .then((checkAdmin) => { + .then(checkAdmin => { const isAdmin = checkAdmin === 1 ? true : false; const token = new Token(user, isAdmin).toString(secret); res.send({ success: true, token }); }) - .catch((error) => { - res.status(401).send({ success: false, error: error.message }); + .catch(error => { + res.status(401).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/user/register.js b/seasoned_api/src/webserver/controllers/user/register.js index 36d9ff2..4ede957 100644 --- a/seasoned_api/src/webserver/controllers/user/register.js +++ b/seasoned_api/src/webserver/controllers/user/register.js @@ -20,15 +20,15 @@ function registerController(req, res) { userSecurity.createNewUser(user, password) .then(() => userRepository.checkAdmin(user)) - .then((checkAdmin) => { + .then(checkAdmin => { const isAdmin = checkAdmin === 1 ? true : false; const token = new Token(user, isAdmin).toString(secret); res.send({ success: true, message: 'Welcome to Seasoned!', token }); }) - .catch((error) => { - res.status(401).send({ success: false, error: error.message }); + .catch(error => { + res.status(401).send({ success: false, message: error.message }); }); } diff --git a/seasoned_api/src/webserver/controllers/user/requests.js b/seasoned_api/src/webserver/controllers/user/requests.js index 98bb219..b43e71c 100644 --- a/seasoned_api/src/webserver/controllers/user/requests.js +++ b/seasoned_api/src/webserver/controllers/user/requests.js @@ -12,12 +12,11 @@ function requestsController(req, res) { const user = req.loggedInUser; requestRepository.userRequests(user) - .then((requests) => { + .then(requests => { res.send({ success: true, results: requests, total_results: requests.length }); }) - .catch((error) => { - console.log(error) - res.status(500).send({ success: false, error: error }); + .catch(error => { + res.status(500).send({ success: false, message: error.message }); }); } From fd475265c10f012e6f493695a73035eee511fa10 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Mon, 4 Nov 2019 17:54:08 +0100 Subject: [PATCH 85/85] Updated test to reflect changes to all error response objects. (changed from returning message in error key to message. --- .../asAUserIWantToGetErrorWhenRegisteringExistingUsername.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seasoned_api/test/system/asAUserIWantToGetErrorWhenRegisteringExistingUsername.js b/seasoned_api/test/system/asAUserIWantToGetErrorWhenRegisteringExistingUsername.js index 0fd4557..9eab046 100644 --- a/seasoned_api/test/system/asAUserIWantToGetErrorWhenRegisteringExistingUsername.js +++ b/seasoned_api/test/system/asAUserIWantToGetErrorWhenRegisteringExistingUsername.js @@ -15,6 +15,6 @@ describe('As a user I want error when registering existing username', () => { .post('/api/v1/user') .send({ username: 'test_user', password: 'password' }) .expect(401) - .then(response => assert.equal(response.text, '{"success":false,"error":"That username is already registered"}')) + .then(response => assert.equal(response.text, '{"success":false,"message":"That username is already registered"}')) ); });