From 69ad45daa5653e968e4e911ecacc6e1a635bcc31 Mon Sep 17 00:00:00 2001 From: Amila Welihinda Date: Sat, 25 Aug 2018 12:55:04 -0700 Subject: [PATCH] v1.1.0 (#277) * chore(misc): migrate all code style to eslint config, fix all eslint errors * chore(item): migrate more components to reactstrap * chore(item): migrate more components to reactstrap * chore(package): remove unnecessary dependencies * feat(main.dev.js): save and restore window state * fix(item): fix broken item page playback toggle active bug * chore(pct): bump pct from 1.0.0 -> 1.1.0 * feat(item): add recently watched feature --- .eslintrc | 25 +- .flowconfig | 1 - .travis.yml | 2 + README.md | 2 +- app/api/Subtitle.js | 2 + app/api/Torrent.js | 68 +- app/api/metadata/MetadataAdapter.js | 26 +- .../metadata/TheMovieDbMetadataProvider.js | 244 ++--- app/api/metadata/TraktMetadataProvider.js | 221 ---- app/api/torrents/BaseTorrentProvider.js | 210 ++-- app/api/torrents/PctTorrentProvider.js | 2 +- app/api/torrents/RarbgTorrentProvider.js | 127 --- app/api/torrents/TorrentAdapter.js | 173 ++-- app/api/torrents/TorrentProviderInterface.js | 23 +- app/api/torrents/YtsTorrentProvider.js | 8 +- app/components/card/Card.js | 15 +- app/components/card/CardList.js | 51 +- app/components/card/Rating.js | 11 +- app/components/header/Header.js | 17 +- app/components/home/Home.js | 112 +- app/components/item/Item.js | 222 ++-- app/components/metadata/SaveItem.js | 51 +- app/components/show/Show.js | 41 +- app/containers/App.js | 14 +- app/containers/ItemPage.js | 6 +- app/main.dev.js | 16 +- app/package.json | 2 +- app/styles/components/Show.scss | 2 +- app/utils/CheckUpdate.js | 8 +- appveyor.yml | 2 +- package.json | 29 +- test/.eslintrc | 6 +- test/e2e/HomePage.e2e.js | 4 +- test/e2e/ItemPage.e2e.js | 24 +- yarn.lock | 961 ++---------------- 35 files changed, 831 insertions(+), 1897 deletions(-) delete mode 100644 app/api/metadata/TraktMetadataProvider.js diff --git a/.eslintrc b/.eslintrc index 7acfa55d..71c9e3b4 100644 --- a/.eslintrc +++ b/.eslintrc @@ -7,33 +7,14 @@ }, "rules": { "class-methods-use-this": "off", - "fp/no-arguments": "off", - "fp/no-class": "off", - "fp/no-delete": "off", - "fp/no-events": "off", - "fp/no-get-set": "off", - "fp/no-let": "off", - "fp/no-loops": "off", - "fp/no-mutating-assign": "off", - "fp/no-mutating-methods": "off", - "fp/no-mutation": "off", - "fp/no-nil": "off", - "fp/no-proxy": "off", - "fp/no-rest-parameters": "off", - "fp/no-this": "off", - "fp/no-throw": "off", - "fp/no-unused-expression": "off", - "fp/no-valueof-field": "off", - "import/no-extraneous-dependencies": "off", - "no-var": "off", "no-let": "off", "no-plusplus": "off", - "no-use-before-define": "off", "no-console": "off", "promise/avoid-new": "off", "react/sort-comp": "off", - "react/destructuring-assignment": "off", - "react/jsx-filename-extension": "off" + "react/jsx-filename-extension": "off", + "import/no-extraneous-dependencies": "off", + "no-nested-ternary": "off" }, "settings": { "import/extensions": [".jsx", ".js"], diff --git a/.flowconfig b/.flowconfig index 9d34b28d..a7e63f9f 100644 --- a/.flowconfig +++ b/.flowconfig @@ -14,7 +14,6 @@ app esproposal.class_static_fields=enable esproposal.class_instance_fields=enable esproposal.export_star_as=enable -experimental.strict_type_args=true module.name_mapper.extension='css' -> '/internals/flow/CSSModule.js.flow' module.name_mapper.extension='styl' -> '/internals/flow/CSSModule.js.flow' diff --git a/.travis.yml b/.travis.yml index 36cc0499..0049ec36 100644 --- a/.travis.yml +++ b/.travis.yml @@ -74,6 +74,8 @@ before_script: - greenkeeper-lockfile-update script: + - yarn lint + # - yarn test - yarn package-ci - yarn build-e2e - yarn test-e2e --quarantine-mode diff --git a/README.md b/README.md index 1cbe870f..07b01de0 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ cd popcorn-time-desktop # 💡 For casting support, you will need to satisfy mdns's requirements: # For windows install bonjour: https://support.apple.com/downloads/bonjour_for_windows # For linux, make sure you have these dependencies installed with apt-get: -# https://github.com/amilajack/popcorn-time-desktop/blob/v1.0.0/.travis.yml#L23-L35 +# https://github.com/amilajack/popcorn-time-desktop/blob/v1.1.0/.travis.yml#L24-L35 # Install dependencies # Have a cup of coffee ☕️ this might take a while diff --git a/app/api/Subtitle.js b/app/api/Subtitle.js index 41f9a7ca..5fd4de75 100644 --- a/app/api/Subtitle.js +++ b/app/api/Subtitle.js @@ -20,6 +20,8 @@ export default class SubtitleServer { server: express; + port: ?number; + async startServer(): Promise { // Find a port at runtime. Default to 4000 if it is available this.port = diff --git a/app/api/Torrent.js b/app/api/Torrent.js index 71bb3b52..f2e0b6d2 100644 --- a/app/api/Torrent.js +++ b/app/api/Torrent.js @@ -14,6 +14,35 @@ type metadataType = { activeMode: string }; +/** + * Get the subtitle file buffer given an array of files + */ +export function selectSubtitleFile( + files: Array<{ name: string }> = [], + activeMode: string, + metadata: { season: number, episode: number } +): { name: string } | boolean { + return ( + files.find(file => { + const formatIsSupported = file.name.includes('.srt'); + + switch (activeMode) { + // Check if the current file is the exact episode we're looking for + case 'season_complete': { + const { season, episode } = metadata; + return ( + formatIsSupported && isExactEpisode(file.name, season, episode) + ); + } + + // Check if the current file is greater than the previous file + default: + return formatIsSupported; + } + }) || false + ); +} + export default class Torrent { inProgress: boolean = false; @@ -60,8 +89,8 @@ export default class Torrent { this.engine.add(magnetURI, { path: cacheLocation }, torrent => { const server = torrent.createServer(); - server.listen(port); - this.server = server; + this.server = server.listen(port); + // this.server = server; const { file, torrentIndex } = torrent.files.reduce( (previous, current, index) => { @@ -146,15 +175,15 @@ export default class Torrent { destroy() { if (this.inProgress) { - console.log('Destroyed Torrent...'); - - if (this.server && typeof this.server.close === 'function') { + if (this.server && this.server.close) { + console.log('Closing the torrent server...'); this.server.close(); this.server = {}; } this.clearIntervals(); + console.log('Destroying the torrent engine...'); this.engine.destroy(); this.engine = undefined; @@ -190,32 +219,3 @@ export function formatSpeeds( ratio }; } - -/** - * Get the subtitle file buffer given an array of files - */ -export function selectSubtitleFile( - files: Array<{ name: string }> = [], - activeMode: string, - metadata: { season: number, episode: number } -): { name: string } | boolean { - return ( - files.find(file => { - const formatIsSupported = file.name.includes('.srt'); - - switch (activeMode) { - // Check if the current file is the exact episode we're looking for - case 'season_complete': { - const { season, episode } = metadata; - return ( - formatIsSupported && isExactEpisode(file.name, season, episode) - ); - } - - // Check if the current file is greater than the previous file - default: - return formatIsSupported; - } - }) || false - ); -} diff --git a/app/api/metadata/MetadataAdapter.js b/app/api/metadata/MetadataAdapter.js index a8451413..8b6f446c 100644 --- a/app/api/metadata/MetadataAdapter.js +++ b/app/api/metadata/MetadataAdapter.js @@ -5,7 +5,6 @@ import OpenSubtitles from 'opensubtitles-api'; import { merge, resolveCache, setCache } from '../torrents/BaseTorrentProvider'; import TheMovieDbMetadataProvider from './TheMovieDbMetadataProvider'; -// import TraktMetadataProvider from './TraktMetadataProvider'; import type { runtimeType } from './MetadataProviderInterface'; type subtitlesType = { @@ -27,10 +26,7 @@ const openSubtitles = new OpenSubtitles({ }); function MetadataAdapter() { - return [ - // new TraktMetadataProvider(), - new TheMovieDbMetadataProvider() - ]; + return [new TheMovieDbMetadataProvider()]; } async function interceptAndHandleRequest( @@ -156,6 +152,16 @@ function getShows(...args: Array) { return interceptAndHandleRequest('getShows', args); } +function formatSubtitle(subtitle) { + return { + kind: 'captions', + label: subtitle.langName, + srclang: subtitle.lang, + src: `${subtitlesEndpoint}/${encodeURIComponent(subtitle.url)}`, + default: subtitle.lang === 'en' + }; +} + /** * Get the subtitles for a movie or show * @@ -259,16 +265,6 @@ export function parseRuntimeMinutesToObject( }; } -function formatSubtitle(subtitle) { - return { - kind: 'captions', - label: subtitle.langName, - srclang: subtitle.lang, - src: `${subtitlesEndpoint}/${encodeURIComponent(subtitle.url)}`, - default: subtitle.lang === 'en' - }; -} - export default { getMovie, getMovies, diff --git a/app/api/metadata/TheMovieDbMetadataProvider.js b/app/api/metadata/TheMovieDbMetadataProvider.js index 12efc1ea..c942d7b1 100644 --- a/app/api/metadata/TheMovieDbMetadataProvider.js +++ b/app/api/metadata/TheMovieDbMetadataProvider.js @@ -4,6 +4,128 @@ import { parseRuntimeMinutesToObject } from './MetadataAdapter'; import BaseMetadataProvider from './BaseMetadataProvider'; import type { MetadataProviderInterface } from './MetadataProviderInterface'; +function formatImage( + imageUri, + path: string, + size: string = 'original' +): string { + return `${imageUri}${size}/${path}`; +} + +function formatMetadata(item, type: string, imageUri: string, genres) { + return { + // 'title' property is on movies only. 'name' property is on + // shows only + title: item.name || item.title, + year: new Date(item.release_date || item.first_air_date).getFullYear(), + // @DEPRECATE + id: String(item.id), + ids: { + tmdbId: String(item.id), + imdbId: + item.imdb_id || + (item.external_ids && item.external_ids.imdb_id + ? item.external_ids.imdb_id + : '') + }, + type, + certification: 'n/a', + summary: item.overview, + genres: item.genres + ? item.genres.map(genre => genre.name) + : item.genre_ids + ? item.genre_ids.map(genre => genres[String(genre)]) + : [], + rating: item.vote_average, + runtime: + item.runtime || + (item.episode_run_time && item.episode_run_time.length > 0) + ? parseRuntimeMinutesToObject( + type === 'movies' ? item.runtime : item.episode_run_time[0] + ) + : { + full: 'n/a', + hours: 'n/a', + minutes: 'n/a' + }, + trailer: + item.videos && item.videos.results && item.videos.results.length > 0 + ? `http://youtube.com/watch?v=${item.videos.results[0].key}` + : 'n/a', + images: { + fanart: { + full: formatImage(imageUri, item.backdrop_path, 'original'), + medium: formatImage(imageUri, item.backdrop_path, 'w780'), + thumb: formatImage(imageUri, item.backdrop_path, 'w342') + }, + poster: { + full: formatImage(imageUri, item.poster_path, 'original'), + medium: formatImage(imageUri, item.poster_path, 'w780'), + thumb: formatImage(imageUri, item.poster_path, 'w342') + } + } + }; +} + +function formatSeasons(show) { + const firstSeasonIsZero = + show.seasons.length > 0 ? show.seasons[0].season_number === 0 : false; + + return show.seasons.map(season => ({ + season: firstSeasonIsZero ? season.season_number + 1 : season.season_number, + overview: show.overview, + id: String(season.id), + ids: { + tmdbId: String(season.id) + }, + images: { + full: season.poster_path, + medium: season.poster_path, + thumb: season.poster_path + } + })); +} + +function formatSeason(season) { + return season.episodes.map(episode => ({ + id: String(episode.id), + ids: { + tmdbId: String(episode.id) + }, + title: episode.name, + season: episode.season_number, + episode: episode.episode_number, + overview: episode.overview, + rating: episode.vote_average, + // rating: episode.rating ? roundRating(episode.rating) : 'n/a', + images: { + full: episode.poster_path, + medium: episode.poster_path, + thumb: episode.poster_path + } + })); +} + +function formatEpisode(episode) { + return { + id: String(episode.id), + ids: { + tmdbId: String(episode.id) + }, + title: episode.name, + season: episode.season_number, + episode: episode.episode_number, + overview: episode.overview, + rating: episode.vote_average, + // rating: episode.rating ? roundRating(episode.rating) : 'n/a', + images: { + full: episode.still_path, + medium: episode.still_path, + thumb: episode.still_path + } + }; +} + export default class TheMovieDbMetadataProvider extends BaseMetadataProvider implements MetadataProviderInterface { apiKey = '809858c82322872e2be9b2c127ccdcf7'; @@ -154,125 +276,3 @@ export default class TheMovieDbMetadataProvider extends BaseMetadataProvider // @TODO: Properly implement provider architecture provide() {} } - -function formatImage( - imageUri, - path: string, - size: string = 'original' -): string { - return `${imageUri}${size}/${path}`; -} - -function formatMetadata(item, type: string, imageUri: string, genres) { - return { - // 'title' property is on movies only. 'name' property is on - // shows only - title: item.name || item.title, - year: new Date(item.release_date || item.first_air_date).getFullYear(), - // @DEPRECATE - id: String(item.id), - ids: { - tmdbId: String(item.id), - imdbId: - item.imdb_id || - (item.external_ids && item.external_ids.imdb_id - ? item.external_ids.imdb_id - : '') - }, - type, - certification: 'n/a', - summary: item.overview, - genres: item.genres - ? item.genres.map(genre => genre.name) - : item.genre_ids - ? item.genre_ids.map(genre => genres[String(genre)]) - : [], - rating: item.vote_average, - runtime: - item.runtime || - (item.episode_run_time && item.episode_run_time.length > 0) - ? parseRuntimeMinutesToObject( - type === 'movies' ? item.runtime : item.episode_run_time[0] - ) - : { - full: 'n/a', - hours: 'n/a', - minutes: 'n/a' - }, - trailer: - item.videos && item.videos.results && item.videos.results.length > 0 - ? `http://youtube.com/watch?v=${item.videos.results[0].key}` - : 'n/a', - images: { - fanart: { - full: formatImage(imageUri, item.backdrop_path, 'original'), - medium: formatImage(imageUri, item.backdrop_path, 'w780'), - thumb: formatImage(imageUri, item.backdrop_path, 'w342') - }, - poster: { - full: formatImage(imageUri, item.poster_path, 'original'), - medium: formatImage(imageUri, item.poster_path, 'w780'), - thumb: formatImage(imageUri, item.poster_path, 'w342') - } - } - }; -} - -function formatSeasons(show) { - const firstSeasonIsZero = - show.seasons.length > 0 ? show.seasons[0].season_number === 0 : false; - - return show.seasons.map(season => ({ - season: firstSeasonIsZero ? season.season_number + 1 : season.season_number, - overview: show.overview, - id: String(season.id), - ids: { - tmdbId: String(season.id) - }, - images: { - full: season.poster_path, - medium: season.poster_path, - thumb: season.poster_path - } - })); -} - -function formatSeason(season) { - return season.episodes.map(episode => ({ - id: String(episode.id), - ids: { - tmdbId: String(episode.id) - }, - title: episode.name, - season: episode.season_number, - episode: episode.episode_number, - overview: episode.overview, - rating: episode.vote_average, - // rating: episode.rating ? roundRating(episode.rating) : 'n/a', - images: { - full: episode.poster_path, - medium: episode.poster_path, - thumb: episode.poster_path - } - })); -} - -function formatEpisode(episode) { - return { - id: String(episode.id), - ids: { - tmdbId: String(episode.id) - }, - title: episode.name, - season: episode.season_number, - episode: episode.episode_number, - overview: episode.overview, - rating: episode.vote_average, - // rating: episode.rating ? roundRating(episode.rating) : 'n/a', - images: { - full: episode.still_path, - medium: episode.still_path, - thumb: episode.still_path - } - }; -} diff --git a/app/api/metadata/TraktMetadataProvider.js b/app/api/metadata/TraktMetadataProvider.js deleted file mode 100644 index 68d32be0..00000000 --- a/app/api/metadata/TraktMetadataProvider.js +++ /dev/null @@ -1,221 +0,0 @@ -// @flow -import fetch from 'isomorphic-fetch'; -import Trakt from 'trakt.tv'; -import { parseRuntimeMinutesToObject } from './MetadataAdapter'; -import BaseMetadataProvider from './BaseMetadataProvider'; -import type { MetadataProviderInterface } from './MetadataProviderInterface'; - -export default class TraktMetadataAdapter extends BaseMetadataProvider - implements MetadataProviderInterface { - clientId = '647c69e4ed1ad13393bf6edd9d8f9fb6fe9faf405b44320a6b71ab960b4540a2'; - - clientSecret = - 'f55b0a53c63af683588b47f6de94226b7572a6f83f40bd44c58a7c83fe1f2cb1'; - - trakt: Trakt; - - constructor() { - super(); - this.trakt = new Trakt({ - client_id: this.clientId, - client_secret: this.clientSecret - }); - } - - getMovies(page: number = 1, limit: number = 50) { - return this.trakt.movies - .popular({ - paginate: true, - page, - limit, - extended: 'full,images,metadata' - }) - .then(movies => movies.map(movie => formatMetadata(movie, 'movies'))); - } - - getMovie(itemId: string) { - return this.trakt.movies - .summary({ - id: itemId, - extended: 'full,images,metadata' - }) - .then(movie => formatMetadata(movie, 'movies')); - } - - getShows(page: number = 1, limit: number = 50) { - return this.trakt.shows - .popular({ - paginate: true, - page, - limit, - extended: 'full,images,metadata' - }) - .then(shows => shows.map(show => formatMetadata(show, 'shows'))); - } - - getShow(itemId: string) { - return this.trakt.shows - .summary({ - id: itemId, - extended: 'full,images,metadata' - }) - .then(show => formatMetadata(show, 'shows')); - } - - getSeasons(itemId: string) { - return this.trakt.seasons - .summary({ - id: itemId, - extended: 'full,images,metadata' - }) - .then(res => - res.filter(season => season.aired_episodes !== 0).map(season => ({ - season: season.number + 1, - overview: season.overview, - id: season.ids.imdb, - images: { - full: season.images.poster.full, - medium: season.images.poster.medium, - thumb: season.images.poster.thumb - } - })) - ); - } - - getSeason(itemId: string, season: number) { - return this.trakt.seasons - .season({ - id: itemId, - season, - extended: 'full,images,metadata' - }) - .then(episodes => episodes.map(episode => formatSeason(episode))); - } - - getEpisode(itemId: string, season: number, episode: number) { - return this.trakt.episodes - .summary({ - id: itemId, - season, - episode, - extended: 'full,images,metadata' - }) - .then(res => formatSeason(res)); - } - - search(query: string, page: number = 1) { - if (!query) { - throw Error('Query paramater required'); - } - - // http://www.omdbapi.com/?t=Game+of+thrones&y=&plot=short&r=json - return fetch( - `http://www.omdbapi.com/?s=${encodeURIComponent(query)}&y=&page=${page}` - ) - .then(response => response.json()) - .then(response => response.Search.map(movie => formatMovieSearch(movie))); - } - - /** - * @param {string} type | movie or show - * @param {string} itemId | movie or show - */ - getSimilar(type: string = 'movies', itemId: string, limit: number = 5) { - return this.trakt[type] - .related({ - id: itemId, - limit, - extended: 'full,images,metadata' - }) - .then(movies => movies.map(movie => formatMetadata(movie, type))); - } - - // @TODO: Properly implement provider architecture - provide() {} -} - -function formatMetadata(movie = {}, type: string) { - return { - title: movie.title, - year: movie.year, - // @DEPRECATE - id: movie.ids.imdb, - ids: { - imdbId: movie.ids.imdb - }, - type, - certification: movie.certification, - summary: movie.overview, - genres: movie.genres, - rating: movie.rating ? roundRating(movie.rating) : 'n/a', - runtime: parseRuntimeMinutesToObject(movie.runtime), - trailer: movie.trailer, - images: { - fanart: { - full: movie.images.fanart.full, - medium: movie.images.fanart.medium, - thumb: movie.images.fanart.thumb - }, - poster: { - full: movie.images.poster.full, - medium: movie.images.poster.medium, - thumb: movie.images.poster.thumb - } - } - }; -} - -function formatMovieSearch(movie) { - return { - title: movie.Title, - year: parseInt(movie.Year, 10), - // @DEPRECATE - id: movie.imdbID, - ids: { - imdbId: movie.imdbID - }, - type: movie.Type.includes('movie') ? 'movies' : 'shows', - certification: movie.Rated, - summary: 'n/a', // omdbapi does not support - genres: [], - rating: 'n/a', // omdbapi does not support - runtime: { - full: 'n/a', // omdbapi does not support - hours: 'n/a', // omdbapi does not support - minutes: 'n/a' // omdbapi does not support - }, - trailer: 'n/a', // omdbapi does not support - images: { - fanart: { - full: movie.Poster || '', - medium: movie.Poster || '', - thumb: movie.Poster || '' - }, - poster: { - full: movie.Poster || '', - medium: movie.Poster || '', - thumb: movie.Poster || '' - } - } - }; -} - -function formatSeason(season, image: string = 'screenshot') { - return { - id: season.ids.imdb, - title: season.title, - season: season.season, - episode: season.number, - overview: season.overview, - rating: season.rating ? roundRating(season.rating) : 'n/a', - images: { - full: season.images[image].full, - medium: season.images[image].medium, - thumb: season.images[image].thumb - } - }; -} - -function roundRating(rating: number): number { - return Math.round(rating * 10) / 10; -} diff --git a/app/api/torrents/BaseTorrentProvider.js b/app/api/torrents/BaseTorrentProvider.js index 999289d1..9605e562 100644 --- a/app/api/torrents/BaseTorrentProvider.js +++ b/app/api/torrents/BaseTorrentProvider.js @@ -24,107 +24,6 @@ export function timeout(promise: Promise, ms: number = 20000) { return Promise.race([promise, timeoutPromise]); } -export function determineQuality( - magnet: string, - metadata: string = '' -): string { - const lowerCaseMetadata = (metadata || magnet).toLowerCase(); - - if (process.env.FLAG_UNVERIFIED_TORRENTS === 'true') { - return '480p'; - } - - // Filter non-english languages - if (hasNonEnglishLanguage(lowerCaseMetadata)) { - return ''; - } - - // Filter videos with 'rendered' subtitles - if (hasSubtitles(lowerCaseMetadata)) { - return process.env.FLAG_SUBTITLE_EMBEDDED_MOVIES === 'true' ? '480p' : ''; - } - - // Most accurate categorization - if (lowerCaseMetadata.includes('1080')) return '1080p'; - if (lowerCaseMetadata.includes('720')) return '720p'; - if (lowerCaseMetadata.includes('480')) return '480p'; - - // Guess the quality 1080p - if (lowerCaseMetadata.includes('bluray')) return '1080p'; - if (lowerCaseMetadata.includes('blu-ray')) return '1080p'; - - // Guess the quality 720p, prefer english - if (lowerCaseMetadata.includes('dvd')) return '720p'; - if (lowerCaseMetadata.includes('rip')) return '720p'; - if (lowerCaseMetadata.includes('mp4')) return '720p'; - if (lowerCaseMetadata.includes('web')) return '720p'; - if (lowerCaseMetadata.includes('hdtv')) return '720p'; - if (lowerCaseMetadata.includes('eng')) return '720p'; - - if (hasNonNativeCodec(lowerCaseMetadata)) { - return process.env.FLAG_SUPPORTED_PLAYBACK_FILTERING === 'true' - ? '720p' - : ''; - } - - if (process.env.NODE_ENV === 'development') { - console.warn(`${magnet}, could not be verified`); - } - - return ''; -} - -export async function convertTmdbToImdb(tmdbId: string): Promise { - const theMovieDbProvider = new TheMovieDbMetadataProvider(); - const movie = await theMovieDbProvider.getMovie(tmdbId); - if (!movie.ids.imdbId) { - throw new Error('Cannot convert tmdbId to imdbId'); - } - return movie.ids.imdbId; -} - -// export async function convertImdbtoTmdb(imdbId: string): Promise { -// const theMovieDbProvider = new TheMovieDbMetadataProvider(); -// const movie = await theMovieDbProvider.getMovie(imdbId); -// if (!movie.ids.imdbId) { -// throw new Error('Cannot convert imdbId to tmdbId'); -// } -// return movie.ids.imdbId; -// } - -export function formatSeasonEpisodeToString( - season: number, - episode: number -): string { - return ( - 's' + - (String(season).length === 1 ? '0' + String(season) : String(season)) + - ('e' + - (String(episode).length === 1 ? '0' + String(episode) : String(episode))) - ); -} - -export function formatSeasonEpisodeToObject( - season: number, - episode: ?number -): Object { - return { - season: String(season).length === 1 ? '0' + String(season) : String(season), - episode: - String(episode).length === 1 ? '0' + String(episode) : String(episode) - }; -} - -export function isExactEpisode( - title: string, - season: number, - episode: number -): boolean { - return title - .toLowerCase() - .includes(formatSeasonEpisodeToString(season, episode)); -} - export function getHealth(seeders: number, leechers: number = 0): string { const ratio = seeders && !!leechers ? seeders / leechers : seeders; @@ -165,10 +64,6 @@ export function hasSubtitles(metadata: string): boolean { return metadata.includes('sub'); } -export function hasNonNativeCodec(metadata: string): boolean { - return metadata.includes('avi') || metadata.includes('mkv'); -} - export function sortTorrentsBySeeders(torrents: Array): Array { return torrents.sort( (prev: Object, next: Object) => @@ -188,6 +83,17 @@ export function constructMovieQueries( return title.includes("'") ? [...queries, title.replace(/'/g, '')] : queries; } +export function formatSeasonEpisodeToObject( + season: number, + episode: ?number +): Object { + return { + season: String(season).length === 1 ? '0' + String(season) : String(season), + episode: + String(episode).length === 1 ? '0' + String(episode) : String(episode) + }; +} + export function constructSeasonQueries( title: string, season: number @@ -280,3 +186,97 @@ export function setCache(key: string, value: any) { } return providerCache.set(key, value); } + +export function hasNonNativeCodec(metadata: string): boolean { + return metadata.includes('avi') || metadata.includes('mkv'); +} + +export function determineQuality( + magnet: string, + metadata: string = '' +): string { + const lowerCaseMetadata = (metadata || magnet).toLowerCase(); + + if (process.env.FLAG_UNVERIFIED_TORRENTS === 'true') { + return '480p'; + } + + // Filter non-english languages + if (hasNonEnglishLanguage(lowerCaseMetadata)) { + return ''; + } + + // Filter videos with 'rendered' subtitles + if (hasSubtitles(lowerCaseMetadata)) { + return process.env.FLAG_SUBTITLE_EMBEDDED_MOVIES === 'true' ? '480p' : ''; + } + + // Most accurate categorization + if (lowerCaseMetadata.includes('1080')) return '1080p'; + if (lowerCaseMetadata.includes('720')) return '720p'; + if (lowerCaseMetadata.includes('480')) return '480p'; + + // Guess the quality 1080p + if (lowerCaseMetadata.includes('bluray')) return '1080p'; + if (lowerCaseMetadata.includes('blu-ray')) return '1080p'; + + // Guess the quality 720p, prefer english + if (lowerCaseMetadata.includes('dvd')) return '720p'; + if (lowerCaseMetadata.includes('rip')) return '720p'; + if (lowerCaseMetadata.includes('mp4')) return '720p'; + if (lowerCaseMetadata.includes('web')) return '720p'; + if (lowerCaseMetadata.includes('hdtv')) return '720p'; + if (lowerCaseMetadata.includes('eng')) return '720p'; + + if (hasNonNativeCodec(lowerCaseMetadata)) { + return process.env.FLAG_SUPPORTED_PLAYBACK_FILTERING === 'true' + ? '720p' + : ''; + } + + if (process.env.NODE_ENV === 'development') { + console.warn(`${magnet}, could not be verified`); + } + + return ''; +} + +export async function convertTmdbToImdb(tmdbId: string): Promise { + const theMovieDbProvider = new TheMovieDbMetadataProvider(); + const movie = await theMovieDbProvider.getMovie(tmdbId); + if (!movie.ids.imdbId) { + throw new Error('Cannot convert tmdbId to imdbId'); + } + return movie.ids.imdbId; +} + +// export async function convertImdbtoTmdb(imdbId: string): Promise { +// const theMovieDbProvider = new TheMovieDbMetadataProvider(); +// const movie = await theMovieDbProvider.getMovie(imdbId); +// if (!movie.ids.imdbId) { +// throw new Error('Cannot convert imdbId to tmdbId'); +// } +// return movie.ids.imdbId; +// } + +export function formatSeasonEpisodeToString( + season: number, + episode: number +): string { + return ( + 's' + + (String(season).length === 1 ? '0' + String(season) : String(season)) + + ('e' + + (String(episode).length === 1 ? '0' + String(episode) : String(episode))) + ); +} + +export function isExactEpisode( + title: string, + season: number, + episode: number +): boolean { + return title + .toLowerCase() + .includes(formatSeasonEpisodeToString(season, episode)); +} diff --git a/app/api/torrents/PctTorrentProvider.js b/app/api/torrents/PctTorrentProvider.js index e1e57ee3..b1a5b095 100644 --- a/app/api/torrents/PctTorrentProvider.js +++ b/app/api/torrents/PctTorrentProvider.js @@ -128,7 +128,7 @@ export default class PctTorrentProvider implements TorrentProviderInterface { return []; }); default: - return []; + return Promise.resolve([]); } } } diff --git a/app/api/torrents/RarbgTorrentProvider.js b/app/api/torrents/RarbgTorrentProvider.js index eb5e3469..e69de29b 100644 --- a/app/api/torrents/RarbgTorrentProvider.js +++ b/app/api/torrents/RarbgTorrentProvider.js @@ -1,127 +0,0 @@ -// // @flow -// import rbg from 'torrentapi-wrapper'; -// import type { -// TorrentProviderInterface, -// torrentQueryType -// } from './TorrentProviderInterface'; -// import { -// formatSeasonEpisodeToString, -// constructSeasonQueries, -// constructMovieQueries, -// handleProviderError, -// determineQuality -// } from './BaseTorrentProvider'; - -// export default class RarbgTorrentProvider implements TorrentProviderInterface { -// static providerName = 'rbg'; - -// static provide(itemId: string, type: string) { -// const { searchQuery } = extendedDetails; - -// switch (type) { -// case 'movies': -// return ( -// timeout( -// Promise.all( -// constructMovieQueries(searchQuery, itemId).map(query => -// this.fetch(query) -// ) -// ) -// ) -// // Flatten array of arrays to an array with no empty arrays -// .then(res => merge(res).filter(array => array.length !== 0)) -// .catch(error => { -// handleProviderError(error); -// return []; -// }) -// ); -// case 'shows': { -// const { season, episode } = extendedDetails; - -// return this.fetch( -// `${searchQuery} ${formatSeasonEpisodeToString(season, episode)}` -// ).catch(error => { -// handleProviderError(error); -// return []; -// }); -// } -// case 'season_complete': { -// const { season } = extendedDetails; -// const queries = constructSeasonQueries(searchQuery, season); - -// return timeout(Promise.all(queries.map(query => this.fetch(query)))) -// .then(res => -// res.reduce( -// (previous, current) => -// previous.length && current.length -// ? [...previous, ...current] -// : previous.length && !current.length -// ? previous -// : current -// ) -// ) -// .catch(error => { -// handleProviderError(error); -// return []; -// }); -// } -// default: -// return []; -// } -// } - -// searchEpisode(item, season: string, episode: string, retry: boolean = false) { -// return rbg -// .search({ -// query: formatShowToSearchQuery(item.title, season, episode), -// category: 'TV', -// sort: 'seeders', -// verified: false -// }) -// .then(results => { -// const bestTorrents = {}; -// results -// .filter(torrent => torrent.episode_info.imdb === item.id) -// .map(torrent => -// this.formatTorrent(torrent, determineQuality(torrent.download)) -// ) -// .forEach((torrent: TorrentType) => { -// if ( -// !bestTorrents[torrent.quality] || -// getBestTorrent(bestTorrents[torrent.quality], torrent) -// ) { -// bestTorrents[torrent.quality] = torrent; -// } -// }); - -// return bestTorrents; -// }); -// } - -// fetch(query: string, type: torrentQueryType) { -// return rbg -// .search({ -// query, -// category: 'foo', -// sort: 'seeders', -// verified: false -// }) -// .then(results => results.map(torrent => this.formatTorrent(torrent))) -// .catch( -// error => (!retry ? this.search(query, category, true) : resolve([])) -// ); -// } - -// static formatTorrent(torrent, quality) { -// return { -// url: torrent.download, -// seeds: torrent.seeders, -// peers: torrent.leechers, -// size: torrent.size, -// filesize: torrent.size, -// provider: RarbgTorrentProvider.providerName, -// health: getHealth(torrent.seeders, torrent.leechers), -// quality -// }; -// } -// } diff --git a/app/api/torrents/TorrentAdapter.js b/app/api/torrents/TorrentAdapter.js index 428be18c..09ea1e5a 100644 --- a/app/api/torrents/TorrentAdapter.js +++ b/app/api/torrents/TorrentAdapter.js @@ -26,10 +26,92 @@ const providers = [ // import('./PbTorrentProvider').then(e => e.default || e), import('./PctTorrentProvider').then(e => e.default || e) // import('./KatTorrentProvider').then(e => e.default || e) - // import('./RarbgTorrentProvider'), - // import('./KatShowsTorrentProvider') + // import('./KatShowsTorrentProvider').then(e => e.default || e) ]; +export function filterShows(show, season: number, episode: number) { + return ( + show.metadata + .toLowerCase() + .includes(formatSeasonEpisodeToString(season, episode)) && + show.seeders !== 0 && + show.magnet + ); +} + +/** + * Select one 720p and 1080p quality movie from torrent list + * By default, sort all torrents by seeders + */ +export function selectTorrents( + torrents, + returnAll: boolean = false, + key: string +) { + const sortedTorrents = sortTorrentsBySeeders( + torrents.filter( + torrent => + torrent.quality !== 'n/a' && torrent.quality !== '' && !!torrent.magnet + ) + ); + + const formattedTorrents = returnAll + ? sortedTorrents + : { + '480p': sortedTorrents.find(torrent => torrent.quality === '480p'), + '720p': sortedTorrents.find(torrent => torrent.quality === '720p'), + '1080p': sortedTorrents.find(torrent => torrent.quality === '1080p') + }; + + setCache(key, formattedTorrents); + + return formattedTorrents; +} + +/** + * Merge results from providers + * + * @param {array} providerResults + * @return {array} + */ +function appendAttributes(providerResults) { + const formattedResults = merge(providerResults).map(result => ({ + ...result, + health: getHealth(result.seeders || 0, result.leechers || 0), + quality: + 'quality' in result + ? result.quality + : determineQuality(result.magnet, result.metadata, result) + })); + + return formattedResults; +} + +export function filterShowsComplete(show, season: number) { + const metadata = show.metadata.toLowerCase(); + + return ( + metadata.includes(`${season} complete`) || + metadata.includes(`${season} [complete]`) || + metadata.includes(`${season} - complete`) || + metadata.includes(`season ${season}`) || + (metadata.includes(`s${formatSeasonEpisodeToObject(season).season}`) && + !metadata.includes('e0') && + show.seeders !== 0 && + show.magnet) + ); +} + +export function getStatuses() { + return Promise.all(providers.map(provider => provider.getStatus())).then( + providerStatuses => + providerStatuses.map((status, index) => ({ + providerName: providers[index].providerName, + online: status + })) + ); +} + export default async function TorrentAdapter( _itemId: string, type: string, @@ -65,7 +147,6 @@ export default async function TorrentAdapter( ...result, method: 'movies' })), - undefined, returnAll, args ); @@ -78,7 +159,6 @@ export default async function TorrentAdapter( ...result, method: 'shows' })), - undefined, returnAll, args ); @@ -91,7 +171,6 @@ export default async function TorrentAdapter( ...result, method: 'season_complete' })), - undefined, returnAll, args ); @@ -106,87 +185,3 @@ export default async function TorrentAdapter( throw new Error('Invalid query method'); } } - -/** - * Merge results from providers - * - * @param {array} providerResults - * @return {array} - */ -function appendAttributes(providerResults) { - const formattedResults = merge(providerResults).map(result => ({ - ...result, - health: getHealth(result.seeders || 0, result.leechers || 0), - quality: - 'quality' in result - ? result.quality - : determineQuality(result.magnet, result.metadata, result) - })); - - return formattedResults; -} - -export function filterShows(show, season: number, episode: number) { - return ( - show.metadata - .toLowerCase() - .includes(formatSeasonEpisodeToString(season, episode)) && - show.seeders !== 0 && - show.magnet - ); -} - -export function filterShowsComplete(show, season: number) { - const metadata = show.metadata.toLowerCase(); - - return ( - metadata.includes(`${season} complete`) || - metadata.includes(`${season} [complete]`) || - metadata.includes(`${season} - complete`) || - metadata.includes(`season ${season}`) || - (metadata.includes(`s${formatSeasonEpisodeToObject(season).season}`) && - !metadata.includes('e0') && - show.seeders !== 0 && - show.magnet) - ); -} - -export function getStatuses() { - return Promise.all(providers.map(provider => provider.getStatus())).then( - providerStatuses => - providerStatuses.map((status, index) => ({ - providerName: providers[index].providerName, - online: status - })) - ); -} - -/** - * Select one 720p and 1080p quality movie from torrent list - * By default, sort all torrents by seeders - */ -export function selectTorrents( - torrents, - sortMethod: string = 'seeders', - returnAll: boolean = false, - key: string -) { - const sortedTorrents = sortTorrentsBySeeders( - torrents.filter( - torrent => - torrent.quality !== 'n/a' && torrent.quality !== '' && !!torrent.magnet - ) - ); - - const formattedTorrents = returnAll - ? sortedTorrents - : { - '480p': sortedTorrents.find(torrent => torrent.quality === '480p'), - '720p': sortedTorrents.find(torrent => torrent.quality === '720p'), - '1080p': sortedTorrents.find(torrent => torrent.quality === '1080p') - }; - - setCache(key, formattedTorrents); - - return formattedTorrents; -} diff --git a/app/api/torrents/TorrentProviderInterface.js b/app/api/torrents/TorrentProviderInterface.js index a28f1cff..5365ff7b 100644 --- a/app/api/torrents/TorrentProviderInterface.js +++ b/app/api/torrents/TorrentProviderInterface.js @@ -8,13 +8,6 @@ export type fetchType = { _provider: string }; -export type torrentType = { - ...fetchType, - health: healthType, - quality: qualityType, - method: torrentQueryType -}; - export type healthType = 'poor' | 'decent' | 'healthy'; export type torrentMethodType = 'all' | 'race'; @@ -23,12 +16,16 @@ export type qualityType = '1080p' | '720p' | '480p' | 'default'; export type torrentQueryType = 'movies' | 'show' | 'season_complete'; +export type torrentType = { + ...fetchType, + health: healthType, + quality: qualityType, + method: torrentQueryType +}; + export interface TorrentProviderInterface { supportedIdTypes: Array<'tmdb' | 'imdb'>; - static getStatus: () => Promise; - static fetch: (itemId: string) => Promise>; - static provide: ( - itemId: string, - type: torrentType - ) => Promise>; + getStatus: () => Promise; + fetch: (itemId: string) => Promise>; + provide: (itemId: string, type: torrentType) => Promise>; } diff --git a/app/api/torrents/YtsTorrentProvider.js b/app/api/torrents/YtsTorrentProvider.js index 82c69e95..55a9636c 100644 --- a/app/api/torrents/YtsTorrentProvider.js +++ b/app/api/torrents/YtsTorrentProvider.js @@ -11,6 +11,10 @@ const endpoint = 'https://yts.am'; const providerId = 'YTS'; const resolvedEndpoint = resolveEndpoint(endpoint, providerId); +function constructMagnet(hash: string): string { + return `magnet:?xt=urn:btih:${hash}`; +} + export default class YtsTorrentProvider implements TorrentProviderInterface { static providerName = 'YTS'; @@ -57,7 +61,3 @@ export default class YtsTorrentProvider implements TorrentProviderInterface { } } } - -function constructMagnet(hash: string): string { - return `magnet:?xt=urn:btih:${hash}`; -} diff --git a/app/components/card/Card.js b/app/components/card/Card.js index 72d76468..48383aaa 100644 --- a/app/components/card/Card.js +++ b/app/components/card/Card.js @@ -3,6 +3,7 @@ * @flow */ import React from 'react'; +import { Col, Row } from 'reactstrap'; import { Link } from 'react-router-dom'; import Rating from './Rating'; @@ -35,18 +36,20 @@ export default function Card(props: Props) {
-
-
+ + {title} -
-
+ + + + {typeof rating === 'number' ? ( ) : null} -
-
+ +
); diff --git a/app/components/card/CardList.js b/app/components/card/CardList.js index 78f3329a..14020235 100644 --- a/app/components/card/CardList.js +++ b/app/components/card/CardList.js @@ -3,6 +3,7 @@ * @flow */ import React from 'react'; +import { Container, Col, Row } from 'reactstrap'; import Card from './Card'; import Loader from '../loader/Loader'; import type { contentType } from '../../api/metadata/MetadataProviderInterface'; @@ -20,29 +21,33 @@ export default function CardList(props: Props) { const { items, isLoading, isFinished, title, limit, justifyContent } = props; return ( -
-
-

{title}

-
- {(limit ? items.filter((e, i) => i < limit) : items).map(item => ( - - ))} -
-
-
- -
-
+ + + +

{title}

+
+ {(limit ? items.filter((e, i) => i < limit) : items).map(item => ( + + ))} +
+ +
+ + + + + +
); } diff --git a/app/components/card/Rating.js b/app/components/card/Rating.js index f593e251..33ee5414 100644 --- a/app/components/card/Rating.js +++ b/app/components/card/Rating.js @@ -9,18 +9,19 @@ type Props = { }; export default function StarRating(props: Props) { - return typeof props.rating === 'number' ? ( + const { rating, starColor, emptyStarColor } = props; + return typeof rating === 'number' ? (
} renderStarIcon={() => } name="rating" - starColor={props.starColor} - emptyStarColor={props.emptyStarColor} - value={Math.floor(props.rating / 2)} + starColor={starColor} + emptyStarColor={emptyStarColor} + value={Math.floor(rating / 2)} editing={false} /> - {props.rating} + {rating}
) : null; } diff --git a/app/components/header/Header.js b/app/components/header/Header.js index e6a6c7c3..6047e437 100644 --- a/app/components/header/Header.js +++ b/app/components/header/Header.js @@ -21,7 +21,7 @@ type Props = { activeMode: string }; -export default class Header extends Component { +export default class Header extends Component { props: Props; state: { @@ -43,7 +43,8 @@ export default class Header extends Component { * Set the mode of the movies to be 'search' */ setSearchState(searchQuery: string) { - this.props.setActiveMode('search', { searchQuery }); + const { setActiveMode } = this.props; + setActiveMode('search', { searchQuery }); } handleSearchChange({ target: { value } }: Event) { @@ -59,11 +60,11 @@ export default class Header extends Component { } handleKeyPress({ key }: Event) { + const { searchQuery } = this.state; + const { setActiveMode } = this.props; if (key === 'Enter') { - // browserHistory.replace('/item/movies'); - // browserHistory.replace('/item/search'); - this.props.setActiveMode('search', { - searchQuery: this.state.searchQuery + setActiveMode('search', { + searchQuery }); } } @@ -83,7 +84,7 @@ export default class Header extends Component { aria-expanded="false" aria-label="Toggle navigation" > - + this.props.setActiveMode('home')} + onClick={() => setActiveMode('home')} > Home diff --git a/app/components/home/Home.js b/app/components/home/Home.js index 7df4fe3c..bdc0865a 100644 --- a/app/components/home/Home.js +++ b/app/components/home/Home.js @@ -1,6 +1,7 @@ // @flow /* eslint react/no-unused-prop-types: 0 */ import React, { Component } from 'react'; +import { Container, Col, Row } from 'reactstrap'; import VisibilitySensor from 'react-visibility-sensor'; import Butter from '../../api/Butter'; import Header from '../header/Header'; @@ -58,20 +59,20 @@ type State = { watchList: Array }; -export default class Home extends Component { +export default class Home extends Component { props: Props; + state: State = { + favorites: [], + watchList: [] + }; + butter: Butter; didMount: boolean; onChange: () => void; - state: State = { - favorites: [], - watchList: [] - }; - constructor(props: Props) { super(props); this.butter = new Butter(); @@ -89,8 +90,9 @@ export default class Home extends Component { } async onChange(isVisible: boolean) { - if (isVisible && !this.props.isLoading) { - await this.paginate(this.props.activeMode, this.props.activeModeOptions); + const { isLoading, activeMode, activeModeOptions } = this.props; + if (isVisible && !isLoading) { + await this.paginate(activeMode, activeModeOptions); } } @@ -106,12 +108,14 @@ export default class Home extends Component { queryType: string, activeModeOptions: activeModeOptionsType = {} ) { - this.props.actions.setLoading(true); + const { actions, modes } = this.props; + + actions.setLoading(true); // HACK: This is a temporary solution. // Waiting on: https://github.com/yannickcr/eslint-plugin-react/issues/818 - const { limit, page } = this.props.modes[queryType]; + const { limit, page } = modes[queryType]; const items = await (async () => { switch (queryType) { @@ -127,8 +131,8 @@ export default class Home extends Component { } })(); - this.props.actions.paginate(items); - this.props.actions.setLoading(false); + actions.paginate(items); + actions.setLoading(false); return items; } @@ -137,12 +141,19 @@ export default class Home extends Component { * If bottom of component is 2000px from viewport, query */ initInfinitePagination() { - if (this.props.infinitePagination) { + const { + infinitePagination, + activeMode, + activeModeOptions, + isLoading + } = this.props; + + if (infinitePagination) { const scrollDimentions = document .querySelector('body') .getBoundingClientRect(); - if (scrollDimentions.bottom < 2000 && !this.props.isLoading) { - this.paginate(this.props.activeMode, this.props.activeModeOptions); + if (scrollDimentions.bottom < 2000 && !isLoading) { + this.paginate(activeMode, activeModeOptions); } } } @@ -154,25 +165,34 @@ export default class Home extends Component { } async componentDidMount() { + const { activeMode } = this.props; this.didMount = true; document.addEventListener('scroll', this.initInfinitePagination.bind(this)); - window.scrollTo(0, global.pct[`${this.props.activeMode}ScrollTop`]); + window.scrollTo(0, global.pct[`${activeMode}ScrollTop`]); + + const [favorites, watchList, recentlyWatched] = await Promise.all([ + this.butter.favorites('get'), + this.butter.watchList('get'), + this.butter.recentlyWatched('get') + ]); this.setState({ - favorites: await this.butter.favorites('get'), - watchList: await this.butter.watchList('get') + favorites, + watchList, + recentlyWatched }); } componentWillReceiveProps(nextProps: Props) { - global.pct[`${this.props.activeMode}ScrollTop`] = document.body.scrollTop; + const { activeMode, activeModeOptions, actions } = this.props; + global.pct[`${activeMode}ScrollTop`] = document.body.scrollTop; if ( JSON.stringify(nextProps.activeModeOptions) !== - JSON.stringify(this.props.activeModeOptions) + JSON.stringify(activeModeOptions) ) { if (nextProps.activeMode === 'search') { - this.props.actions.clearAllItems(); + actions.clearAllItems(); } this.paginate(nextProps.activeMode, nextProps.activeModeOptions); @@ -180,19 +200,21 @@ export default class Home extends Component { } componentDidUpdate(prevProps: Props) { - if (prevProps.activeMode !== this.props.activeMode) { - window.scrollTo(0, global.pct[`${this.props.activeMode}ScrollTop`]); + const { activeMode } = this.props; + if (prevProps.activeMode !== activeMode) { + window.scrollTo(0, global.pct[`${activeMode}ScrollTop`]); } } componentWillUnmount() { + const { activeMode } = this.props; if (!document.body) { throw new Error( '"document" not defined. You are probably not running in the renderer process' ); } - global.pct[`${this.props.activeMode}ScrollTop`] = document.body.scrollTop; + global.pct[`${activeMode}ScrollTop`] = document.body.scrollTop; this.didMount = false; document.removeEventListener( @@ -203,30 +225,32 @@ export default class Home extends Component { render() { const { activeMode, actions, items, isLoading } = this.props; + const { favorites, watchList, recentlyWatched } = this.state; const home = ( -
-
- -
-
- -
-
+ + + + + + + + + + + + + + + + + ); return ( -
+
-
+ {activeMode === 'home' ? ( home ) : ( @@ -235,8 +259,8 @@ export default class Home extends Component {
)} -
- + + ); } } diff --git a/app/components/item/Item.js b/app/components/item/Item.js index 59cc3e9e..6744a608 100644 --- a/app/components/item/Item.js +++ b/app/components/item/Item.js @@ -8,7 +8,10 @@ import { Dropdown, DropdownToggle, DropdownMenu, - DropdownItem + DropdownItem, + Container, + Row, + Col } from 'reactstrap'; import { Link } from 'react-router-dom'; import classNames from 'classnames'; @@ -34,8 +37,6 @@ import type { } from '../../api/torrents/TorrentProviderInterface'; import type { deviceType } from '../../api/players/PlayerProviderInterface'; -const SUMMARY_CHAR_LIMIT = 300; - type playerType = 'default' | 'plyr' | 'vlc' | 'chromecast' | 'youtube'; type torrentSelectionType = { @@ -77,7 +78,7 @@ type State = { isFinished: boolean }; -export default class Item extends Component { +export default class Item extends Component { props: Props; state: State; @@ -92,6 +93,8 @@ export default class Item extends Component { checkCastingDevicesInterval: number; + SUMMARY_CHAR_LIMIT = 300; + defaultTorrent: torrentSelectionType = { default: { quality: undefined, @@ -189,7 +192,6 @@ export default class Item extends Component { * Check which players are available on the system */ setPlayer(player: playerType) { - console.log(this.plyr); switch (player) { case 'youtube': this.player.player = this.plyr; @@ -205,12 +207,13 @@ export default class Item extends Component { } toggle() { - this.setState({ - dropdownOpen: !this.state.dropdownOpen - }); + this.setState(prevState => ({ + dropdownOpen: !prevState.dropdownOpen + })); } async componentDidMount() { + const { itemId } = this.props; window.scrollTo(0, 0); this.initCastingDevices(); this.checkCastingDevicesInterval = setInterval(() => { @@ -218,7 +221,7 @@ export default class Item extends Component { this.initCastingDevices(); }, 10000); - this.getAllData(this.props.itemId); + this.getAllData(itemId); this.stopPlayback(); this.player.destroy(); @@ -251,14 +254,11 @@ export default class Item extends Component { } getAllData(itemId: string) { + const { activeMode } = this.props; + const { selectedSeason, selectedEpisode } = this.state; this.setState(this.initialState, () => { - if (this.props.activeMode === 'shows') { - this.getShowData( - 'seasons', - itemId, - this.state.selectedSeason, - this.state.selectedEpisode - ); + if (activeMode === 'shows') { + this.getShowData('seasons', itemId, selectedSeason, selectedEpisode); } }); @@ -315,10 +315,11 @@ export default class Item extends Component { * Get the details of a movie using the butter api */ async getItem(imdbId: string) { + const { activeMode } = this.props; this.setState({ metadataLoading: true }); const item = await (() => { - switch (this.props.activeMode) { + switch (activeMode) { case 'movies': return this.butter.getMovie(imdbId); case 'shows': @@ -339,6 +340,7 @@ export default class Item extends Component { season: number, episode: number ) { + const { activeMode } = this.props; this.setState({ fetchingTorrents: true, idealTorrent: this.defaultTorrent, @@ -347,11 +349,11 @@ export default class Item extends Component { try { const { torrent, idealTorrent } = await (async () => { - switch (this.props.activeMode) { + switch (activeMode) { case 'movies': { const originalTorrent = await this.butter.getTorrent( imdbId, - this.props.activeMode, + activeMode, { searchQuery: title } @@ -368,7 +370,7 @@ export default class Item extends Component { case 'shows': { if (process.env.FLAG_SEASON_COMPLETE === 'true') { const [shows, seasonComplete] = await Promise.all([ - this.butter.getTorrent(imdbId, this.props.activeMode, { + this.butter.getTorrent(imdbId, activeMode, { season, episode, searchQuery: title @@ -407,7 +409,7 @@ export default class Item extends Component { const singleEpisodeTorrent = await this.butter.getTorrent( imdbId, - this.props.activeMode, + activeMode, { season, episode, @@ -453,13 +455,11 @@ export default class Item extends Component { } async getSimilar(imdbId: string) { + const { activeMode } = this.props; this.setState({ similarLoading: true }); try { - const similarItems = await this.butter.getSimilar( - this.props.activeMode, - imdbId - ); + const similarItems = await this.butter.getSimilar(activeMode, imdbId); this.setState({ similarItems, @@ -472,10 +472,11 @@ export default class Item extends Component { } stopPlayback() { - if (!this.state.torrentInProgress && !this.state.playbackInProgress) { + const { torrentInProgress, playbackInProgress, currentPlayer } = this.state; + if (!torrentInProgress && !playbackInProgress) { return; } - switch (this.state.currentPlayer) { + switch (currentPlayer) { case 'youtube': this.plyr.pause(); break; @@ -494,27 +495,24 @@ export default class Item extends Component { selectedSeason: number, selectedEpisode: number = 1 ) => { + const { item } = this.state; switch (type) { case 'episodes': this.setState({ selectedSeason }); - this.getShowData( - 'episodes', - this.state.item.ids.tmdbId, - selectedSeason - ); + this.getShowData('episodes', item.ids.tmdbId, selectedSeason); this.selectShow('episode', selectedSeason, 1); break; case 'episode': this.setState({ selectedSeason, selectedEpisode }); this.getShowData( 'episode', - this.state.item.ids.tmdbId, + item.ids.tmdbId, selectedSeason, selectedEpisode ); this.getTorrent( - this.state.item.ids.imdbId, - this.state.item.title, + item.ids.imdbId, + item.title, selectedSeason, selectedEpisode ); @@ -573,7 +571,8 @@ export default class Item extends Component { } closeVideo() { - if (!this.state.playbackInProgress) { + const { playbackInProgress } = this.state; + if (!playbackInProgress) { return; } this.toggleActive(); @@ -584,15 +583,15 @@ export default class Item extends Component { } toggleActive() { - this.setState({ - playbackInProgress: !this.state.playbackInProgress - }); + this.setState(prevState => ({ + playbackInProgress: !prevState.playbackInProgress + })); } toggleStateProperty(property: string) { - this.setState({ - [property]: !this.state[property] - }); + this.setState(prevState => ({ + [property]: !prevState[property] + })); } async startPlayback( @@ -600,7 +599,13 @@ export default class Item extends Component { activeMode?: string, currentPlayer: playerType ) { - if (this.state.torrentInProgress) { + const { + torrentInProgress, + selectedEpisode, + selectedSeason, + item + } = this.state; + if (torrentInProgress) { this.stopPlayback(); } if (!magnet || !activeMode) { @@ -614,8 +619,8 @@ export default class Item extends Component { const metadata = { activeMode, - season: this.state.selectedSeason, - episode: this.state.selectedEpisode + season: selectedSeason, + episode: selectedEpisode }; const formats = [ @@ -635,44 +640,55 @@ export default class Item extends Component { subtitle: string ) => { console.log(`Serving torrent at: ${servingUrl}`); - this.setState({ servingUrl }); // const filename = file.name; const subtitles = subtitle && process.env.FLAG_SUBTITLES === 'true' ? await this.getSubtitles( subtitle, - this.props.activeMode, - this.state.item + activeMode, + // eslint-disable-next-line + item ) : []; - console.log(subtitles); - this.setState({ - captions: subtitles - }); switch (currentPlayer) { case 'VLC': return this.player.initVLC(servingUrl); case 'chromecast': { - this.player.initCast( - this.playerProvider, - servingUrl, - this.state.item - ); + this.player.initCast(this.playerProvider, servingUrl, item); break; } case 'youtube': this.toggleActive(); + setTimeout(() => { + this.plyr.play(); + }, 3000); break; case 'default': this.toggleActive(); + setTimeout(() => { + this.plyr.play(); + }, 3000); break; default: console.error('Invalid player'); break; } + const recentlyWatchedList = await this.butter.recentlyWatched('get'); + const containsRecentlyWatchedItem = recentlyWatchedList.some( + e => e.id === item.id + ); + if (!containsRecentlyWatchedItem) { + await this.butter.recentlyWatched('set', item); + } + + this.setState({ + captions: subtitles, + servingUrl + }); + return torrent; }, downloaded => { @@ -703,8 +719,7 @@ export default class Item extends Component { watchList, magnetPopoverOpen, trailerPopoverOpen, - castingDevices, - captions + castingDevices } = this.state; const { activeMode } = this.props; @@ -727,13 +742,13 @@ export default class Item extends Component { }; return ( -
this.stopPlayback()} @@ -741,7 +756,7 @@ export default class Item extends Component { Back -
+ {playbackInProgress ? ( - this.closeVideo()}> + this.closeVideo()} + > - + ) : null} -
-
+ +
this.startPlayback( @@ -781,6 +802,7 @@ export default class Item extends Component { > {idealTorrent.magnet ? ( @@ -798,6 +820,7 @@ export default class Item extends Component { height="350px" width="233px" role="presentation" + alt="item-poster" style={{ opacity: item.images.poster.thumb ? 1 : 0 }} src={item.images.poster.thumb} /> @@ -812,13 +835,13 @@ export default class Item extends Component { favorites={favorites} watchList={watchList} /> -
+ -
+

{item.title}

-
+ {item.runtime && item.runtime.hours && item.runtime.minutes ? (
@@ -832,36 +855,36 @@ export default class Item extends Component { {item.genres ?
{item.genres.join(', ')}
: null}
-
+ {/* HACK: Prefer a CSS solution to this, using text-overflow: ellipse */}
{item.summary - ? item.summary.length > SUMMARY_CHAR_LIMIT - ? `${item.summary.slice(0, SUMMARY_CHAR_LIMIT)}...` + ? item.summary.length > this.SUMMARY_CHAR_LIMIT + ? `${item.summary.slice(0, this.SUMMARY_CHAR_LIMIT)}...` : item.summary : ''}
-
+ {item.rating && typeof item.rating === 'number' ? ( -
+ -
+ ) : null} - + + {item.year} + {item && item.certification && item.certification !== 'n/a' ? ( -
+
{item.certification}
-
+ ) : null} -
+
-
+ - {process.env.NODE_ENV === 'test' && item.trailer && item.trailer !== 'n/a' ? ( -
+ {process.env.NODE_ENV === 'test' && + item.trailer && + item.trailer !== 'n/a' ? ( + this.setPlayer('youtube')} + role="presentation" /> Trailer -
+ ) : null} -
-
+ +
-
-
+ + -
-
+ + -
-
+ + {(() => { if (process.env.FLAG_MANUAL_TORRENT_SELECTION === 'true') { return ( @@ -1008,8 +1034,8 @@ export default class Item extends Component { return null; })()} -
-
+ + {activeMode === 'shows' ? ( -
+ ); } } diff --git a/app/components/metadata/SaveItem.js b/app/components/metadata/SaveItem.js index 23ded3e5..375dbc68 100644 --- a/app/components/metadata/SaveItem.js +++ b/app/components/metadata/SaveItem.js @@ -15,22 +15,30 @@ type State = { isInFavorites: boolean }; -export default class SaveItem extends Component { - butter = new Butter(); +function hasFavorites(favorites: Array, tmdbId: string): boolean { + return !!favorites.find(favorite => favorite.ids.tmdbId === tmdbId); +} + +function hasWatchList(watchList: Array, tmdbId: string): boolean { + return !!watchList.find(watchListItem => watchListItem.ids.tmdbId === tmdbId); +} +export default class SaveItem extends Component { props: Props; + state: State = { + isInFavorites: false, + isInWatchList: false + }; + + butter = new Butter(); + static defaultProps: Props = { item: {}, favorites: [], watchList: [] }; - state: State = { - isInFavorites: false, - isInWatchList: false - }; - componentWillReceiveProps(nextProps: Props) { if (!(nextProps.item && nextProps.item.ids && nextProps.item.ids.tmdbId)) { return; @@ -47,14 +55,15 @@ export default class SaveItem extends Component { } async addFavorite() { + const { item } = this.props; const favorites = await this.butter.favorites('get'); - if (!hasFavorites(favorites, this.props.item.ids.tmdbId)) { - await this.butter.favorites('set', this.props.item); + if (!hasFavorites(favorites, item.ids.tmdbId)) { + await this.butter.favorites('set', item); this.setState({ isInFavorites: true }); } else { - await this.butter.favorites('remove', this.props.item); + await this.butter.favorites('remove', item); this.setState({ isInFavorites: false }); @@ -62,14 +71,15 @@ export default class SaveItem extends Component { } async addWatchList() { + const { item } = this.props; const watchList = await this.butter.watchList('get'); - if (!hasWatchList(watchList, this.props.item.ids.tmdbId)) { - await this.butter.watchList('set', this.props.item); + if (!hasWatchList(watchList, item.ids.tmdbId)) { + await this.butter.watchList('set', item); this.setState({ isInWatchList: true }); } else { - await this.butter.watchList('remove', this.props.item); + await this.butter.watchList('remove', item); this.setState({ isInWatchList: false }); @@ -77,26 +87,29 @@ export default class SaveItem extends Component { } render() { + const { isInFavorites, isInWatchList } = this.state; return (
this.addFavorite()} /> this.addWatchList()} @@ -105,11 +118,3 @@ export default class SaveItem extends Component { ); } } - -function hasFavorites(favorites: Array, tmdbId: string): boolean { - return !!favorites.find(favorite => favorite.ids.tmdbId === tmdbId); -} - -function hasWatchList(watchList: Array, tmdbId: string): boolean { - return !!watchList.find(watchListItem => watchListItem.ids.tmdbId === tmdbId); -} diff --git a/app/components/show/Show.js b/app/components/show/Show.js index 79cfbf6d..5604b60a 100644 --- a/app/components/show/Show.js +++ b/app/components/show/Show.js @@ -1,5 +1,6 @@ // @flow import React from 'react'; +import { Col, Row, ListGroup, ListGroupItem } from 'reactstrap'; import classNames from 'classnames'; type Props = { @@ -27,11 +28,12 @@ export default function Show(props: Props) { } = props; return ( -
-
-
+ + {/* Seasons */} + + {seasons.map(season => ( - Season {season.season} - + ))} -
-
- -
-
+ + + {/* Episodes */} + + {episodes.length === 0 ? seasons.length > 0 ? 'No episodes for this season' : null : episodes.map(episode => ( - Ep {episode.episode}. {episode.title} - + ))} -
-
- -
+ + + {/* Summary */} +

@@ -81,13 +83,12 @@ export default function Show(props: Props) {

-
-
+ + ); } Show.defaultProps = { seasons: [], - episodes: [], - episode: {} + episodes: [] }; diff --git a/app/containers/App.js b/app/containers/App.js index de0cab73..1cb5d811 100644 --- a/app/containers/App.js +++ b/app/containers/App.js @@ -1,13 +1,17 @@ // @flow +/* eslint react/prefer-stateless-function: off */ import React, { Component } from 'react'; import type { Children } from 'react'; -export default class App extends Component { - props: { - children: Children - }; +type Props = { + children: Children +}; + +export default class App extends Component { + props: Props; render() { - return
{this.props.children}
; + const { children } = this.props; + return
{children}
; } } diff --git a/app/containers/ItemPage.js b/app/containers/ItemPage.js index 6f69aedf..4b6676f9 100644 --- a/app/containers/ItemPage.js +++ b/app/containers/ItemPage.js @@ -12,12 +12,10 @@ type Props = { }; export default function ItemPage(props: Props) { + const { match } = props; return (
- +
); } diff --git a/app/main.dev.js b/app/main.dev.js index 5082e200..1491bad6 100644 --- a/app/main.dev.js +++ b/app/main.dev.js @@ -1,4 +1,4 @@ -/* eslint global-require: 1, flowtype-errors/show-errors: 0 */ +/* eslint global-require: off, flowtype-errors/show-errors: off */ /** * This module executes inside of electron's main process. You can start @@ -11,6 +11,7 @@ * @flow */ import { app, BrowserWindow } from 'electron'; +import windowStateKeeper from 'electron-window-state'; import MenuBuilder from './menu'; let mainWindow = null; @@ -60,10 +61,17 @@ app.on('ready', async () => { await installExtensions(); } + const mainWindowState = windowStateKeeper({ + defaultWidth: 1224, + defaultHeight: 728 + }); + mainWindow = new BrowserWindow({ show: false, - width: 1224, - height: 728, + x: mainWindowState.x, + y: mainWindowState.y, + width: mainWindowState.width, + height: mainWindowState.height, minWidth: 900, backgroundColor: '#252525', webPreferences: { @@ -74,6 +82,8 @@ app.on('ready', async () => { } }); + mainWindowState.manage(mainWindow); + mainWindow.loadURL(`file://${__dirname}/app.html?`); mainWindow.show(); mainWindow.focus(); diff --git a/app/package.json b/app/package.json index a9814e60..301cc259 100644 --- a/app/package.json +++ b/app/package.json @@ -2,7 +2,7 @@ "name": "PopcornTime", "description": "An experimental PopcornTime client", "homepage": "https://github.com/amilajack/popcorn-time-desktop", - "version": "1.0.0", + "version": "1.1.0", "main": "./main.prod.js", "author": { "name": "Amila Welihinda ", diff --git a/app/styles/components/Show.scss b/app/styles/components/Show.scss index b766fb79..1422ee35 100644 --- a/app/styles/components/Show.scss +++ b/app/styles/components/Show.scss @@ -1,6 +1,6 @@ .Show { .card { - width: 75% !important; + // width: 75% !important; padding: 30px; } diff --git a/app/utils/CheckUpdate.js b/app/utils/CheckUpdate.js index db16d258..3ec5b52a 100644 --- a/app/utils/CheckUpdate.js +++ b/app/utils/CheckUpdate.js @@ -7,6 +7,10 @@ export const defaultUpdateEndpoint = process.env.APP_API_UPDATE_ENDPOINT || 'https://api.github.com/repos/amilajack/popcorn-time-desktop/releases'; +export function isNewerSemvar(current: string, next: string): boolean { + return semver.gt(current, next); +} + /** * Return if the current application version is the latest */ @@ -23,7 +27,3 @@ export default function CheckUpdate(): Promise { ).length ); } - -export function isNewerSemvar(current: string, next: string): boolean { - return semver.gt(current, next); -} diff --git a/appveyor.yml b/appveyor.yml index 090adda0..93d61fd9 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -40,7 +40,7 @@ install: - yarn test_script: - # - yarn lint + - yarn lint # - yarn test - yarn package-ci - yarn build-e2e diff --git a/package.json b/package.json index c275911f..d0d60baa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "popcorn-time-desktop", - "version": "1.0.0", + "version": "1.1.0", "description": "An experimental Popcorn Time client", "scripts": { "bench-api": "cross-env NODE_ENV=test BABEL_DISABLE_CACHE=1 jest test/**/*.benchmark.js", @@ -24,7 +24,7 @@ "package-ci": "yarn postinstall && yarn build && electron-builder --publish always", "precommit": "yarn build-e2e && yarn test-e2e && lint-staged", "prettier": "prettier --single-quote --write \"./{app,test}/{actions,api,components,containers,reducers,utils}/**/*.js\" && prettier --single-quote --write \"./app/{actions,api,components,containers,reducers,utils}/**/*.js\"", - "postinstall": "yarn build-dll & node -r babel-register postinstall.js & electron-builder install-app-deps", + "postinstall": "yarn flow-typed & yarn build-dll & node -r babel-register postinstall.js & electron-builder install-app-deps", "postlint-fix": "prettier --ignore-path .eslintignore --single-quote --write '**/*.js'", "test": "cross-env NODE_ENV=test BABEL_DISABLE_CACHE=1 jest ./test/components/*.spec.js", "test-all": "yarn lint && yarn lint-styles && yarn lint-summary && yarn build && yarn test-api && yarn test-e2e", @@ -138,11 +138,7 @@ "moduleDirectories": [ "node_modules", "app/node_modules" - ], - "transform": { - "^.+\\.jsx$": "babel-jest", - "^.+\\.js$": "babel-jest" - } + ] }, "directories": { "buildResources": "resources", @@ -153,29 +149,20 @@ "autoprefixer": "^9.1.3", "babel-core": "^6.26.3", "babel-eslint": "8.2.6", - "babel-jest": "^23.4.2", "babel-loader": "^7.1.5", - "babel-plugin-add-module-exports": "0.2.1", "babel-plugin-dev-expression": "0.2.1", "babel-plugin-dynamic-import-node": "^2.0.0", "babel-plugin-dynamic-import-webpack": "1.0.2", "babel-plugin-flow-runtime": "0.17.0", "babel-plugin-module-alias": "1.6.0", "babel-plugin-react-remove-properties": "^0.2.5", - "babel-plugin-syntax-flow": "6.18.0", "babel-plugin-transform-decorators-legacy": "1.3.5", - "babel-plugin-transform-remove-console": "^6.9.4", - "babel-plugin-transform-remove-debugger": "^6.9.4", "babel-plugin-transform-runtime": "6.23.0", - "babel-plugin-webpack-loaders": "0.9.0", "babel-preset-env": "^1.7.0", "babel-preset-react": "6.24.1", - "babel-preset-react-hmre": "1.1.1", "babel-preset-react-optimize": "1.0.1", "babel-preset-stage-0": "6.24.1", "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babili-webpack-plugin": "^0.1.2", "chai": "^4.1.2", "chalk": "^2.4.1", "classnames": "2.2.6", @@ -193,7 +180,6 @@ "electron-debug": "^2.0.0", "electron-devtools-installer": "2.2.4", "electron-rebuild": "^1.8.2", - "electron-squirrel-startup": "1.0.0", "enzyme": "^3.4.4", "enzyme-adapter-react-16": "^1.2.0", "enzyme-to-json": "^3.3.4", @@ -203,8 +189,6 @@ "eslint-config-prettier": "^3.0.1", "eslint-formatter-pretty": "1.3.0", "eslint-import-resolver-webpack": "^0.10.1", - "eslint-loader": "^2.1.0", - "eslint-nibble-ignore": "3.0.0", "eslint-plugin-import": "^2.14.0", "eslint-plugin-jest": "21.22.0", "eslint-plugin-jsx-a11y": "^6.1.1", @@ -222,11 +206,9 @@ "gm": "1.23.1", "husky": "^0.14.3", "image-diff": "2.0.0", - "immutable": "3.8.2", "ionicons-temp": "2.0.0", "jest-cli": "^23.5.0", "jsdom": "^12.0.0", - "json-loader": "^0.5.7", "lint-staged": "^7.2.2", "lodash-webpack-plugin": "^0.11.5", "lru-cache": "4.1.3", @@ -249,7 +231,6 @@ "testcafe-browser-provider-electron": "^0.0.6", "testcafe-live": "^0.1.3", "testcafe-react-selectors": "^3.0.0", - "uglify-js": "^3.4.8", "uglifyjs-webpack-plugin": "1.3.0", "url-loader": "1.1.1", "webpack": "^4.17.1", @@ -265,6 +246,7 @@ "axios": "^0.18.0", "bluebird": "^3.5.1", "bootstrap": "4.1.3", + "electron-window-state": "^4.1.1", "find-free-port": "^2.0.0", "get-port": "^4.0.0", "isomorphic-fetch": "2.2.1", @@ -298,15 +280,12 @@ "speedtest-net": "1.4.3", "srt2vtt": "1.3.1", "super-kat": "0.1.0", - "torrentapi-wrapper": "^0.0.2", - "trakt.tv": "^7.0.0", "vlc-command": "1.1.1", "webtorrent": "github:amilajack/webtorrent", "yargs": "12.0.1" }, "devEngines": { "node": ">=8.x", - "npm": ">=5.x", "yarn": ">=0.27.5" } } diff --git a/test/.eslintrc b/test/.eslintrc index fa0fa2f9..156efc98 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -3,11 +3,9 @@ "env": { "jest": true }, - "plugins": [ - "testcafe" - ], + "plugins": ["testcafe"], "rules": { - "fp/no-loops": "off", + "no-use-before-define": "off", "global-require": "off", "import/no-dynamic-require": "off", "no-restricted-syntax": "off", diff --git a/test/e2e/HomePage.e2e.js b/test/e2e/HomePage.e2e.js index e44a9de8..8d846777 100644 --- a/test/e2e/HomePage.e2e.js +++ b/test/e2e/HomePage.e2e.js @@ -26,7 +26,9 @@ test('it should display cards list and cards', async t => { }); test('it should search items', async t => { - await t.typeText('#pct-search-input', "harry potter and the philosopher's stone").pressKey('enter'); + await t + .typeText('#pct-search-input', "harry potter and the philosopher's stone") + .pressKey('enter'); await t .expect( (await cardSelector.find('.Card--title').nth(0).innerText).toLowerCase() diff --git a/test/e2e/ItemPage.e2e.js b/test/e2e/ItemPage.e2e.js index a811a8f0..ec06d3b7 100644 --- a/test/e2e/ItemPage.e2e.js +++ b/test/e2e/ItemPage.e2e.js @@ -18,7 +18,9 @@ fixture`Item Page Movies`.page(BASE_URL).beforeEach(async t => { clearConfigs(); await t .click(Selector('a').withExactText('Home')) - .typeText('#pct-search-input', "harry potter and the philosopher's stone", { replace: true }) + .typeText('#pct-search-input', "harry potter and the philosopher's stone", { + replace: true + }) .pressKey('enter') .click(cardSelector); }); @@ -82,6 +84,22 @@ test('it should add items to watch list', async t => { .contains('item/'); }); +test.skip('it should add items to recently watched list', async t => { + await t + .click('[data-e2e="item-play-button"]') + .wait(20000) + .click('[data-e2e="close-player"]'); + + await clickItemPageBackButton(t); + await navigateTo(t, 'home'); + await t + .expect(await getLowerCaseCardTitle()) + .contains("harry potter and the philosopher's stone") + .click(cardSelector) + .expect(getPageUrl()) + .contains('item/'); +}); + test('it should display torrent loading status', async t => { await t.expect(Selector('[data-e2e="item-play-button"]').visible).ok(); }); @@ -120,7 +138,7 @@ test('it should load and play a movie', async t => { .visible ) .ok() - .expect(Selector('a[data-e2e="item-year"]').withExactText('2001').visible) + .expect(Selector('[data-e2e="item-year"]').withExactText('2001').visible) .ok(); }); @@ -131,7 +149,7 @@ fixture`Item Page TV Shows`.page(BASE_URL).beforeEach(async t => { .typeText('#pct-search-input', 'silicon valley', { replace: true }) .pressKey('enter') .click(cardSelector) - .expect(Selector('a[data-e2e="item-year"]').withExactText('2014').visible) + .expect(Selector('[data-e2e="item-year"]').withExactText('2014').visible) .ok(); }); diff --git a/yarn.lock b/yarn.lock index 97b8a82b..e3772af3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -258,12 +258,12 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.116.tgz#5ccf215653e3e8c786a58390751033a9adca0eb9" "@types/node@*": - version "10.9.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.9.1.tgz#06f002136fbcf51e730995149050bb3c45ee54e6" + version "10.9.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.9.2.tgz#f0ab8dced5cd6c56b26765e1c0d9e4fdcc9f2a00" "@types/node@^8.0.24": - version "8.10.27" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.27.tgz#667d03fcd44d8683de5459b8ecd80506eee65f0e" + version "8.10.28" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.28.tgz#03bf70dd7f1de7826251331ce57beddf7f9dd253" "@webassemblyjs/ast@1.5.13": version "1.5.13" @@ -442,12 +442,6 @@ acorn-globals@^4.1.0: dependencies: acorn "^5.0.0" -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - dependencies: - acorn "^3.0.4" - acorn-jsx@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e" @@ -458,11 +452,7 @@ acorn@^2.1.0, acorn@^2.4.0: version "2.7.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^5.0.0, acorn@^5.0.3, acorn@^5.3.0, acorn@^5.5.0, acorn@^5.5.3, acorn@^5.6.0, acorn@^5.6.2, acorn@^5.7.1: +acorn@^5.0.0, acorn@^5.0.3, acorn@^5.3.0, acorn@^5.5.3, acorn@^5.6.0, acorn@^5.6.2, acorn@^5.7.1: version "5.7.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.2.tgz#91fa871883485d06708800318404e72bfb26dcc5" @@ -484,21 +474,10 @@ ajv-errors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" -ajv-keywords@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" - ajv-keywords@^3.0.0, ajv-keywords@^3.1.0, ajv-keywords@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" -ajv@^4.7.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - ajv@^5.1.0, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" @@ -555,7 +534,7 @@ ansi-cyan@^0.1.1: dependencies: ansi-wrap "0.1.0" -ansi-escapes@^1.0.0, ansi-escapes@^1.1.0: +ansi-escapes@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -583,10 +562,6 @@ ansi-red@^0.1.1: dependencies: ansi-wrap "0.1.0" -ansi-regex@^0.2.0, ansi-regex@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -595,10 +570,6 @@ ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" -ansi-styles@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" - ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -937,7 +908,7 @@ axobject-query@^2.0.1: dependencies: ast-types-flow "0.0.7" -babel-code-frame@^6.16.0, babel-code-frame@^6.26.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" dependencies: @@ -945,7 +916,7 @@ babel-code-frame@^6.16.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.0.0, babel-core@^6.22.1, babel-core@^6.24.1, babel-core@^6.26.0, babel-core@^6.26.3, babel-core@^6.7.2: +babel-core@^6.0.0, babel-core@^6.22.1, babel-core@^6.26.0, babel-core@^6.26.3, babel-core@^6.7.2: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" dependencies: @@ -1035,10 +1006,6 @@ babel-helper-define-map@^6.24.1: babel-types "^6.26.0" lodash "^4.17.4" -babel-helper-evaluate-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.1.0.tgz#95d98c4ea36150483db2e7d3ec9e1954a72629cb" - babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" @@ -1056,10 +1023,6 @@ babel-helper-explode-class@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-helper-flip-expressions@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.1.2.tgz#77f6652f9de9c42401d827bd46ebd2109e3ef18a" - babel-helper-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" @@ -1084,22 +1047,10 @@ babel-helper-hoist-variables@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-helper-is-nodes-equiv@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz#34e9b300b1479ddd98ec77ea0bbe9342dfe39684" - babel-helper-is-react-class@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/babel-helper-is-react-class/-/babel-helper-is-react-class-1.0.0.tgz#ef6f3678b05c76dbdeedadead7af98c2724d8431" -babel-helper-is-void-0@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/babel-helper-is-void-0/-/babel-helper-is-void-0-0.1.1.tgz#72f21a3abba0bef3837f9174fca731aed9a02888" - -babel-helper-mark-eval-scopes@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.1.1.tgz#4554345edf9f2549427bd2098e530253f8af2992" - babel-helper-optimise-call-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" @@ -1125,10 +1076,6 @@ babel-helper-remap-async-to-generator@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-helper-remove-or-void@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.1.1.tgz#9d7e1856dc6fafcb41b283a416730dc1844f66d7" - babel-helper-replace-supers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" @@ -1140,10 +1087,6 @@ babel-helper-replace-supers@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-helper-to-multiple-sequence-expressions@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.1.1.tgz#5f1b832b39e4acf954e9137f0251395c71196b35" - babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" @@ -1172,10 +1115,6 @@ babel-messages@^6.23.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-add-module-exports@0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz#9ae9a1f4a8dc67f0cdec4f4aeda1e43a5ff65e25" - babel-plugin-check-es2015-constants@^6.22.0, babel-plugin-check-es2015-constants@^6.8.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" @@ -1224,70 +1163,6 @@ babel-plugin-jest-hoist@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" -babel-plugin-minify-builtins@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.1.3.tgz#4f21a7dcb51f91a04ea71d47ff0e8e3b05fec021" - dependencies: - babel-helper-evaluate-path "^0.1.0" - -babel-plugin-minify-constant-folding@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.1.3.tgz#57bd172adf8b8d74ad7c99612eb950414ebea3ca" - dependencies: - babel-helper-evaluate-path "^0.1.0" - -babel-plugin-minify-dead-code-elimination@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.1.7.tgz#774f536f347b98393a27baa717872968813c342c" - dependencies: - babel-helper-mark-eval-scopes "^0.1.1" - babel-helper-remove-or-void "^0.1.1" - lodash.some "^4.6.0" - -babel-plugin-minify-flip-comparisons@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.1.2.tgz#e286b40b7599b18dfea195071e4279465cfc1884" - dependencies: - babel-helper-is-void-0 "^0.1.1" - -babel-plugin-minify-guarded-expressions@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.1.2.tgz#dfc3d473b0362d9605d3ce0ac1e22328c60d1007" - dependencies: - babel-helper-flip-expressions "^0.1.2" - -babel-plugin-minify-infinity@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.1.2.tgz#5f1cf67ddedcba13c8a00da832542df0091a1cd4" - -babel-plugin-minify-mangle-names@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.1.3.tgz#bfa24661a6794fb03833587e55828b65449e06fe" - dependencies: - babel-helper-mark-eval-scopes "^0.1.1" - -babel-plugin-minify-numeric-literals@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.1.1.tgz#d4b8b0c925f874714ee33ee4b26678583d7ce7fb" - -babel-plugin-minify-replace@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.1.2.tgz#b90b9e71ab4d3b36325629a91beabe13b0b16ac1" - -babel-plugin-minify-simplify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.1.2.tgz#a968f1658fdeb2fc759e81fe331d89829df0f6b9" - dependencies: - babel-helper-flip-expressions "^0.1.2" - babel-helper-is-nodes-equiv "^0.0.1" - babel-helper-to-multiple-sequence-expressions "^0.1.1" - -babel-plugin-minify-type-constructors@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.1.2.tgz#db53c5b76cb8e2fcd45d862f17104c78761337ee" - dependencies: - babel-helper-is-void-0 "^0.1.1" - babel-plugin-module-alias@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/babel-plugin-module-alias/-/babel-plugin-module-alias-1.6.0.tgz#df7e3aaba3544f4c06a9d3314a26bbbff6d87b61" @@ -1296,12 +1171,6 @@ babel-plugin-react-remove-properties@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/babel-plugin-react-remove-properties/-/babel-plugin-react-remove-properties-0.2.5.tgz#c076e1291940c730f4fb7dfb670691fc41787cf8" -babel-plugin-react-transform@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-react-transform/-/babel-plugin-react-transform-2.0.2.tgz#515bbfa996893981142d90b1f9b1635de2995109" - dependencies: - lodash "^4.6.1" - babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -1338,7 +1207,7 @@ babel-plugin-syntax-export-extensions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" -babel-plugin-syntax-flow@6.18.0, babel-plugin-syntax-flow@^6.18.0, babel-plugin-syntax-flow@^6.8.0: +babel-plugin-syntax-flow@^6.18.0, babel-plugin-syntax-flow@^6.8.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" @@ -1428,7 +1297,7 @@ babel-plugin-transform-es2015-block-scoped-functions@^6.22.0, babel-plugin-trans dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.24.1, babel-plugin-transform-es2015-block-scoping@^6.8.0: +babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.8.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" dependencies: @@ -1438,7 +1307,7 @@ babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es20 babel-types "^6.26.0" lodash "^4.17.4" -babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-classes@^6.24.1, babel-plugin-transform-es2015-classes@^6.8.0: +babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-classes@^6.8.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" dependencies: @@ -1452,33 +1321,33 @@ babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-cla babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-plugin-transform-es2015-computed-properties@^6.22.0, babel-plugin-transform-es2015-computed-properties@^6.24.1, babel-plugin-transform-es2015-computed-properties@^6.8.0: +babel-plugin-transform-es2015-computed-properties@^6.22.0, babel-plugin-transform-es2015-computed-properties@^6.8.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.23.0, babel-plugin-transform-es2015-destructuring@^6.8.0: +babel-plugin-transform-es2015-destructuring@^6.23.0, babel-plugin-transform-es2015-destructuring@^6.8.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-duplicate-keys@^6.22.0, babel-plugin-transform-es2015-duplicate-keys@^6.24.1: +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.23.0, babel-plugin-transform-es2015-for-of@^6.8.0: +babel-plugin-transform-es2015-for-of@^6.23.0, babel-plugin-transform-es2015-for-of@^6.8.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-function-name@^6.22.0, babel-plugin-transform-es2015-function-name@^6.24.1, babel-plugin-transform-es2015-function-name@^6.8.0: +babel-plugin-transform-es2015-function-name@^6.22.0, babel-plugin-transform-es2015-function-name@^6.8.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" dependencies: @@ -1509,7 +1378,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-e babel-template "^6.26.0" babel-types "^6.26.0" -babel-plugin-transform-es2015-modules-systemjs@^6.23.0, babel-plugin-transform-es2015-modules-systemjs@^6.24.1: +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" dependencies: @@ -1517,7 +1386,7 @@ babel-plugin-transform-es2015-modules-systemjs@^6.23.0, babel-plugin-transform-e babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-modules-umd@^6.23.0, babel-plugin-transform-es2015-modules-umd@^6.24.1: +babel-plugin-transform-es2015-modules-umd@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" dependencies: @@ -1525,14 +1394,14 @@ babel-plugin-transform-es2015-modules-umd@^6.23.0, babel-plugin-transform-es2015 babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-object-super@^6.22.0, babel-plugin-transform-es2015-object-super@^6.24.1, babel-plugin-transform-es2015-object-super@^6.8.0: +babel-plugin-transform-es2015-object-super@^6.22.0, babel-plugin-transform-es2015-object-super@^6.8.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" dependencies: babel-helper-replace-supers "^6.24.1" babel-runtime "^6.22.0" -babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015-parameters@^6.24.1, babel-plugin-transform-es2015-parameters@^6.8.0: +babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015-parameters@^6.8.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" dependencies: @@ -1543,7 +1412,7 @@ babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015- babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-plugin-transform-es2015-shorthand-properties@^6.22.0, babel-plugin-transform-es2015-shorthand-properties@^6.24.1, babel-plugin-transform-es2015-shorthand-properties@^6.8.0: +babel-plugin-transform-es2015-shorthand-properties@^6.22.0, babel-plugin-transform-es2015-shorthand-properties@^6.8.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" dependencies: @@ -1556,7 +1425,7 @@ babel-plugin-transform-es2015-spread@^6.22.0, babel-plugin-transform-es2015-spre dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-sticky-regex@^6.22.0, babel-plugin-transform-es2015-sticky-regex@^6.24.1: +babel-plugin-transform-es2015-sticky-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" dependencies: @@ -1570,13 +1439,13 @@ babel-plugin-transform-es2015-template-literals@^6.22.0, babel-plugin-transform- dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.23.0: +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-unicode-regex@^6.22.0, babel-plugin-transform-es2015-unicode-regex@^6.24.1: +babel-plugin-transform-es2015-unicode-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" dependencies: @@ -1625,22 +1494,6 @@ babel-plugin-transform-function-bind@^6.22.0: babel-plugin-syntax-function-bind "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-inline-consecutive-adds@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.1.2.tgz#5442e9f1c19c78a7899f8a4dee6fd481f61001f5" - -babel-plugin-transform-member-expression-literals@^6.8.4: - version "6.9.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz#37039c9a0c3313a39495faac2ff3a6b5b9d038bf" - -babel-plugin-transform-merge-sibling-variables@^6.8.5: - version "6.9.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz#85b422fc3377b449c9d1cde44087203532401dae" - -babel-plugin-transform-minify-booleans@^6.8.2: - version "6.9.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz#acbb3e56a3555dd23928e4b582d285162dd2b198" - babel-plugin-transform-object-rest-spread@^6.22.0, babel-plugin-transform-object-rest-spread@^6.8.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" @@ -1648,12 +1501,6 @@ babel-plugin-transform-object-rest-spread@^6.22.0, babel-plugin-transform-object babel-plugin-syntax-object-rest-spread "^6.8.0" babel-runtime "^6.26.0" -babel-plugin-transform-property-literals@^6.8.4: - version "6.9.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz#98c1d21e255736573f93ece54459f6ce24985d39" - dependencies: - esutils "^2.0.2" - babel-plugin-transform-react-constant-elements@^6.5.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz#2f119bf4d2cdd45eb9baaae574053c604f6147dd" @@ -1704,28 +1551,12 @@ babel-plugin-transform-react-remove-prop-types@^0.2.5: version "0.2.12" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.2.12.tgz#3406696df0b8b456089f9d726d27e7e123d2f929" -babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.24.1: +babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" dependencies: regenerator-transform "^0.10.0" -babel-plugin-transform-regexp-constructors@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.1.1.tgz#312ab7487cc88a1c62ee25ea1b6087e89b87799c" - -babel-plugin-transform-remove-console@^6.8.4, babel-plugin-transform-remove-console@^6.9.4: - version "6.9.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz#b980360c067384e24b357a588d807d3c83527780" - -babel-plugin-transform-remove-debugger@^6.8.4, babel-plugin-transform-remove-debugger@^6.9.4: - version "6.9.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz#42b727631c97978e1eb2d199a7aec84a18339ef2" - -babel-plugin-transform-remove-undefined@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.1.2.tgz#e1ebf51110f6b1e0665f28382ef73f95e5023652" - babel-plugin-transform-runtime@6.15.0: version "6.15.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.15.0.tgz#3d75b4d949ad81af157570273846fb59aeb0d57c" @@ -1738,10 +1569,6 @@ babel-plugin-transform-runtime@6.23.0, babel-plugin-transform-runtime@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-simplify-comparison-operators@^6.8.4: - version "6.9.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz#f62afe096cab0e1f68a2d753fdf283888471ceb9" - babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" @@ -1749,25 +1576,6 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-plugin-transform-undefined-to-void@^6.8.2: - version "6.9.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz#be241ca81404030678b748717322b89d0c8fe280" - -babel-plugin-webpack-loaders@0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-webpack-loaders/-/babel-plugin-webpack-loaders-0.9.0.tgz#686ec1cab9db348958f990a95f57090f7e16b743" - dependencies: - babel-preset-es2015 "^6.3.13" - babel-preset-stage-0 "^6.5.0" - babel-register "^6.4.3" - babel-traverse "^6.3.26" - babel-types "^6.3.24" - babylon "^6.3.26" - colors "^1.1.2" - enhanced-resolve "^2.2.2" - lodash "^4.6.1" - rimraf "^2.5.0" - babel-polyfill@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" @@ -1776,34 +1584,6 @@ babel-polyfill@^6.26.0: core-js "^2.5.0" regenerator-runtime "^0.10.5" -babel-preset-babili@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/babel-preset-babili/-/babel-preset-babili-0.1.4.tgz#ad9d6651002f5bc3f07cab300781167f54724bf2" - dependencies: - babel-plugin-minify-builtins "^0.1.3" - babel-plugin-minify-constant-folding "^0.1.3" - babel-plugin-minify-dead-code-elimination "^0.1.7" - babel-plugin-minify-flip-comparisons "^0.1.2" - babel-plugin-minify-guarded-expressions "^0.1.2" - babel-plugin-minify-infinity "^0.1.2" - babel-plugin-minify-mangle-names "^0.1.3" - babel-plugin-minify-numeric-literals "^0.1.1" - babel-plugin-minify-replace "^0.1.2" - babel-plugin-minify-simplify "^0.1.2" - babel-plugin-minify-type-constructors "^0.1.2" - babel-plugin-transform-inline-consecutive-adds "^0.1.2" - babel-plugin-transform-member-expression-literals "^6.8.4" - babel-plugin-transform-merge-sibling-variables "^6.8.5" - babel-plugin-transform-minify-booleans "^6.8.2" - babel-plugin-transform-property-literals "^6.8.4" - babel-plugin-transform-regexp-constructors "^0.1.1" - babel-plugin-transform-remove-console "^6.8.4" - babel-plugin-transform-remove-debugger "^6.8.4" - babel-plugin-transform-remove-undefined "^0.1.2" - babel-plugin-transform-simplify-comparison-operators "^6.8.4" - babel-plugin-transform-undefined-to-void "^6.8.2" - lodash.isplainobject "^4.0.6" - babel-preset-env@^1.1.8, babel-preset-env@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" @@ -1839,35 +1619,6 @@ babel-preset-env@^1.1.8, babel-preset-env@^1.7.0: invariant "^2.2.2" semver "^5.3.0" -babel-preset-es2015@^6.3.13: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.24.1" - babel-plugin-transform-es2015-classes "^6.24.1" - babel-plugin-transform-es2015-computed-properties "^6.24.1" - babel-plugin-transform-es2015-destructuring "^6.22.0" - babel-plugin-transform-es2015-duplicate-keys "^6.24.1" - babel-plugin-transform-es2015-for-of "^6.22.0" - babel-plugin-transform-es2015-function-name "^6.24.1" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-plugin-transform-es2015-modules-systemjs "^6.24.1" - babel-plugin-transform-es2015-modules-umd "^6.24.1" - babel-plugin-transform-es2015-object-super "^6.24.1" - babel-plugin-transform-es2015-parameters "^6.24.1" - babel-plugin-transform-es2015-shorthand-properties "^6.24.1" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.24.1" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.22.0" - babel-plugin-transform-es2015-unicode-regex "^6.24.1" - babel-plugin-transform-regenerator "^6.24.1" - babel-preset-fbjs@^2.1.2: version "2.3.0" resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-2.3.0.tgz#92ff81307c18b926895114f9828ae1674c097f80" @@ -1914,15 +1665,6 @@ babel-preset-jest@^23.2.0: babel-plugin-jest-hoist "^23.2.0" babel-plugin-syntax-object-rest-spread "^6.13.0" -babel-preset-react-hmre@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/babel-preset-react-hmre/-/babel-preset-react-hmre-1.1.1.tgz#d216e60cb5b8d4c873e19ed0f54eaff1437bc492" - dependencies: - babel-plugin-react-transform "^2.0.2" - react-transform-catch-errors "^1.0.2" - react-transform-hmr "^1.0.3" - redbox-react "^1.2.2" - babel-preset-react-optimize@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-preset-react-optimize/-/babel-preset-react-optimize-1.0.1.tgz#c23509fba7cbc76d7de7050e7d26bcd22bc304e8" @@ -1943,7 +1685,7 @@ babel-preset-react@6.24.1: babel-plugin-transform-react-jsx-source "^6.22.0" babel-preset-flow "^6.23.0" -babel-preset-stage-0@6.24.1, babel-preset-stage-0@^6.5.0: +babel-preset-stage-0@6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a" dependencies: @@ -1978,7 +1720,7 @@ babel-preset-stage-3@^6.24.1: babel-plugin-transform-exponentiation-operator "^6.24.1" babel-plugin-transform-object-rest-spread "^6.22.0" -babel-register@^6.26.0, babel-register@^6.4.3: +babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" dependencies: @@ -2013,7 +1755,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0, babel-te babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.20.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0, babel-traverse@^6.3.26: +babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.20.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: @@ -2027,7 +1769,7 @@ babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.20.0, babel-tra invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.0.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0, babel-types@^6.3.24: +babel-types@^6.0.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: @@ -2036,19 +1778,11 @@ babel-types@^6.0.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19. lodash "^4.17.4" to-fast-properties "^1.0.3" -babili-webpack-plugin@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babili-webpack-plugin/-/babili-webpack-plugin-0.1.2.tgz#164ac03d5932f6a52143e7ffc06f2711c651b6f2" - dependencies: - babel-core "^6.24.1" - babel-preset-babili "^0.1.4" - webpack-sources "^1.0.1" - babylon@7.0.0-beta.44: version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" -babylon@^6.16.1, babylon@^6.18.0, babylon@^6.3.26: +babylon@^6.16.1, babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -2778,16 +2512,6 @@ chainsaw@~0.1.0: dependencies: traverse ">=0.3.0 <0.4" -chalk@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" - dependencies: - ansi-styles "^1.1.0" - escape-string-regexp "^1.0.0" - has-ansi "^0.1.0" - strip-ansi "^0.3.0" - supports-color "^0.2.0" - chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -2956,7 +2680,7 @@ cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" -cli-cursor@^1.0.1, cli-cursor@^1.0.2: +cli-cursor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" dependencies: @@ -3125,7 +2849,7 @@ combined-stream@1.0.6, combined-stream@~1.0.5, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@, commander@^2.11.0, commander@^2.13.0, commander@^2.14.1, commander@^2.8.1, commander@^2.9.0, commander@~2.17.1: +commander@, commander@^2.11.0, commander@^2.13.0, commander@^2.14.1, commander@^2.8.1, commander@^2.9.0: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" @@ -3206,7 +2930,7 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@, concat-stream@1.6.2, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.5.2: +concat-stream@, concat-stream@1.6.2, concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" dependencies: @@ -3368,7 +3092,7 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.0.0" -create-error-class@^3.0.0, create-error-class@^3.0.1: +create-error-class@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" dependencies: @@ -3761,7 +3485,7 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.5.1, debug@^2.6.0, debug@^2.6.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.1.0, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.5.1, debug@^2.6.0, debug@^2.6.3, debug@^2.6.6, 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: @@ -4080,7 +3804,7 @@ doctrine@1.5.0: esutils "^2.0.2" isarray "^1.0.0" -doctrine@^2.0.0, doctrine@^2.1.0: +doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" dependencies: @@ -4180,7 +3904,7 @@ draftlog@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/draftlog/-/draftlog-1.0.12.tgz#7db6a3c5b62106bb32dd4a35d67bcccb6c7d9da0" -duplexer2@^0.1.4, duplexer2@~0.1.4: +duplexer2@~0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" dependencies: @@ -4350,16 +4074,18 @@ electron-rebuild@^1.8.2: spawn-rx "^2.0.10" yargs "^7.0.2" -electron-squirrel-startup@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/electron-squirrel-startup/-/electron-squirrel-startup-1.0.0.tgz#19b4e55933fa0ef8f556784b9c660f772546a0b8" - dependencies: - debug "^2.2.0" - electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.61: version "1.3.61" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.61.tgz#a8ac295b28d0f03d85e37326fd16b6b6b17a1795" +electron-window-state@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/electron-window-state/-/electron-window-state-4.1.1.tgz#6b34fdc31b38514dfec8b7c8f7b5d4addb67632d" + dependencies: + deep-equal "^1.0.1" + jsonfile "^2.2.3" + mkdirp "^0.5.1" + electron@2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/electron/-/electron-2.0.8.tgz#6ec7113b356e09cc9899797e0d41ebff8163e962" @@ -4415,15 +4141,6 @@ endpoint-utils@^1.0.2: ip "^1.1.3" pinkie-promise "^1.0.0" -enhanced-resolve@^2.2.2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-2.3.0.tgz#a115c32504b6302e85a76269d7a57ccdd962e359" - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.3.0" - object-assign "^4.0.1" - tapable "^0.2.3" - enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" @@ -4453,21 +4170,20 @@ env-paths@^1.0.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" enzyme-adapter-react-16@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.2.0.tgz#c6e80f334e0a817873262d7d01ee9e4747e3c97e" + version "1.3.0" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.3.0.tgz#4cfba44f8c27256d28e171bdf7a5b5aebce6041b" dependencies: - enzyme-adapter-utils "^1.5.0" + enzyme-adapter-utils "^1.6.0" function.prototype.name "^1.1.0" object.assign "^4.1.0" object.values "^1.0.4" prop-types "^15.6.2" react-is "^16.4.2" - react-reconciler "^0.7.0" react-test-renderer "^16.0.0-0" -enzyme-adapter-utils@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.5.0.tgz#a020ab3ae79bb1c85e1d51f48f35e995e0eed810" +enzyme-adapter-utils@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.6.0.tgz#c59a3f311769fc4087489bff3ee98d8397682c75" dependencies: function.prototype.name "^1.1.0" object.assign "^4.1.0" @@ -4480,8 +4196,8 @@ enzyme-to-json@^3.3.4: lodash "^4.17.4" enzyme@^3.4.4: - version "3.4.4" - resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.4.4.tgz#92c7c6b9e59d4ef0c3d36a75dccc0e41a5c14d21" + version "3.5.0" + resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.5.0.tgz#fd452a698fd1352c737b641dd3a64e079f42d9d5" dependencies: array.prototype.flat "^1.2.1" cheerio "^1.0.0-rc.2" @@ -4492,7 +4208,8 @@ enzyme@^3.4.4: is-number-object "^1.0.3" is-string "^1.0.4" is-subset "^0.1.1" - lodash "^4.17.4" + lodash.escape "^4.0.1" + lodash.isequal "^4.5.0" object-inspect "^1.6.0" object-is "^1.0.1" object.assign "^4.1.0" @@ -4541,7 +4258,7 @@ es-to-primitive@^1.1.1: is-date-object "^1.0.1" is-symbol "^1.0.1" -es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: +es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: version "0.10.46" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" dependencies: @@ -4549,7 +4266,7 @@ es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: es6-symbol "~3.1.1" next-tick "1" -es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: +es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" dependencies: @@ -4557,17 +4274,6 @@ es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: es5-ext "^0.10.35" es6-symbol "^3.1.1" -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - es6-promise@^4.0.3, es6-promise@^4.0.5: version "4.2.4" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" @@ -4578,37 +4284,18 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: +es6-symbol@^3.1.1, es6-symbol@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" dependencies: d "1" es5-ext "~0.10.14" -es6-weak-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" - escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, 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" @@ -4623,15 +4310,6 @@ escodegen@^1.11.0, escodegen@^1.6.1, escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - eslint-config-airbnb-base@^13.0.0, eslint-config-airbnb-base@^13.1.0: version "13.1.0" resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.1.0.tgz#b5a1b480b80dfad16433d6c4ad84e6605052c05c" @@ -4680,15 +4358,6 @@ eslint-formatter-pretty@1.3.0: plur "^2.1.2" string-width "^2.0.0" -eslint-friendly-formatter@^2.0.6: - version "2.0.7" - resolved "https://registry.yarnpkg.com/eslint-friendly-formatter/-/eslint-friendly-formatter-2.0.7.tgz#657f95a19af4989636afebb1cc9de6cebbd088ee" - dependencies: - chalk "^1.0.0" - extend "^3.0.0" - minimist "^1.2.0" - text-table "^0.2.0" - eslint-import-resolver-node@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" @@ -4711,16 +4380,6 @@ eslint-import-resolver-webpack@^0.10.1: resolve "^1.4.0" semver "^5.3.0" -eslint-loader@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-2.1.0.tgz#61334c548aeb0b8e20ec3a552fb7a88c47261c6a" - dependencies: - loader-fs-cache "^1.0.0" - loader-utils "^1.0.2" - object-assign "^4.0.1" - object-hash "^1.1.4" - rimraf "^2.6.1" - 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" @@ -4728,18 +4387,6 @@ eslint-module-utils@^2.2.0: debug "^2.6.8" pkg-dir "^1.0.0" -eslint-nibble-ignore@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-nibble-ignore/-/eslint-nibble-ignore-3.0.0.tgz#78368d55fc63b3d3bd119d79c58f9c66bfdb5fa9" - dependencies: - chalk "^1.0.0" - eslint "^3.0.0" - eslint-friendly-formatter "^2.0.6" - eslint-stats "^0.1.3" - eslint-summary "^1.0.0" - inquirer "^1.1.2" - optionator "^0.8.0" - eslint-plugin-compat@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-2.5.1.tgz#ff6d8e80f8c5d001ea192511564715bb2e84b587" @@ -4842,20 +4489,6 @@ eslint-scope@^4.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-stats@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/eslint-stats/-/eslint-stats-0.1.4.tgz#3f43cf31fa97b239b95ec7c9964da2dd9a4d6750" - dependencies: - chalk "^0.5.1" - lodash "^3.10.0" - -eslint-summary@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-summary/-/eslint-summary-1.0.0.tgz#b811f00437016b20c0f6f5234479bd6395b57886" - dependencies: - chalk "^1.0.0" - text-table "^0.2.0" - eslint-utils@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" @@ -4864,46 +4497,6 @@ 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" -eslint@^3.0.0: - version "3.19.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" - dependencies: - babel-code-frame "^6.16.0" - chalk "^1.1.3" - concat-stream "^1.5.2" - debug "^2.1.1" - doctrine "^2.0.0" - escope "^3.6.0" - espree "^3.4.0" - esquery "^1.0.0" - estraverse "^4.2.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - glob "^7.0.3" - globals "^9.14.0" - ignore "^3.2.0" - imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" - is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" - levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.1" - pluralize "^1.2.1" - progress "^1.1.8" - require-uncached "^1.0.2" - shelljs "^0.7.5" - strip-bom "^3.0.0" - strip-json-comments "~2.0.1" - table "^3.7.8" - text-table "~0.2.0" - user-home "^2.0.0" - eslint@^5.4.0: version "5.4.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.4.0.tgz#d068ec03006bb9e06b429dc85f7e46c1b69fac62" @@ -4947,13 +4540,6 @@ eslint@^5.4.0: table "^4.0.3" text-table "^0.2.0" -espree@^3.4.0: - version "3.5.4" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" - dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" - espree@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/espree/-/espree-4.0.0.tgz#253998f20a0f82db5d866385799d912a83a36634" @@ -4969,7 +4555,7 @@ esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" -esquery@^1.0.0, esquery@^1.0.1: +esquery@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" dependencies: @@ -4993,13 +4579,6 @@ etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - dependencies: - d "1" - es5-ext "~0.10.14" - event-pubsub@4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/event-pubsub/-/event-pubsub-4.3.0.tgz#f68d816bc29f1ec02c539dc58c8dd40ce72cb36e" @@ -5183,14 +4762,6 @@ extend@^3.0.0, extend@~3.0.1, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" -external-editor@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" - dependencies: - extend "^3.0.0" - spawn-sync "^1.0.15" - tmp "^0.0.29" - external-editor@^2.0.4, external-editor@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" @@ -5352,7 +4923,7 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" -figures@^1.3.5, figures@^1.7.0: +figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" dependencies: @@ -5473,14 +5044,6 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" -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" - dependencies: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" - find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" @@ -5769,16 +5332,6 @@ gaze@^1.0.0, gaze@~1.1.2: dependencies: globule "^1.0.0" -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - dependencies: - is-property "^1.0.0" - generic-names@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-1.0.3.tgz#2d786a121aee508876796939e8e3bff836c20917" @@ -5916,7 +5469,7 @@ globals@^11.1.0, globals@^11.7.0: version "11.7.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" -globals@^9.14.0, globals@^9.18.0: +globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -5999,48 +5552,6 @@ gonzales-pe@4.2.3: dependencies: minimist "1.1.x" -got@5.x.x: - version "5.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" - dependencies: - create-error-class "^3.0.1" - duplexer2 "^0.1.4" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - node-status-codes "^1.0.0" - object-assign "^4.0.1" - parse-json "^2.1.0" - pinkie-promise "^2.0.0" - read-all-stream "^3.0.0" - readable-stream "^2.0.5" - timed-out "^3.0.0" - unzip-response "^1.0.2" - url-parse-lax "^1.0.0" - -got@8.x.x, got@^8.3.1: - version "8.3.2" - resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" - dependencies: - "@sindresorhus/is" "^0.7.0" - cacheable-request "^2.1.1" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - into-stream "^3.1.0" - is-retry-allowed "^1.1.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - mimic-response "^1.0.0" - p-cancelable "^0.4.0" - p-timeout "^2.0.1" - pify "^3.0.0" - safe-buffer "^5.1.1" - timed-out "^4.0.1" - url-parse-lax "^3.0.0" - url-to-options "^1.0.1" - got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -6076,6 +5587,28 @@ got@^7.1.0: url-parse-lax "^1.0.0" url-to-options "^1.0.1" +got@^8.3.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" + dependencies: + "@sindresorhus/is" "^0.7.0" + cacheable-request "^2.1.1" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + into-stream "^3.1.0" + is-retry-allowed "^1.1.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + mimic-response "^1.0.0" + p-cancelable "^0.4.0" + p-timeout "^2.0.1" + pify "^3.0.0" + safe-buffer "^5.1.1" + timed-out "^4.0.1" + url-parse-lax "^3.0.0" + url-to-options "^1.0.1" + graceful-fs@^4.1.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -6161,12 +5694,6 @@ har-validator@~5.1.0: ajv "^5.3.0" har-schema "^2.0.0" -has-ansi@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" - dependencies: - ansi-regex "^0.2.0" - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -6498,7 +6025,7 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.2.0, ignore@^3.3.5: +ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" @@ -6521,10 +6048,6 @@ immediate-chunk-store@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/immediate-chunk-store/-/immediate-chunk-store-1.0.8.tgz#0ecdad0c546332672d7b5b511b26bb18ce56e73f" -immutable@3.8.2: - version "3.8.2" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" - import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" @@ -6605,43 +6128,6 @@ ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" -inquirer@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" - dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" - cli-width "^2.0.0" - figures "^1.3.5" - lodash "^4.3.0" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" - strip-ansi "^3.0.0" - through "^2.3.6" - -inquirer@^1.1.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-1.2.3.tgz#4dec6f32f37ef7bb0b2ed3f1d1a5c3f545074918" - dependencies: - ansi-escapes "^1.1.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" - cli-width "^2.0.0" - external-editor "^1.1.0" - figures "^1.3.5" - lodash "^4.3.0" - mute-stream "0.0.6" - pinkie-promise "^2.0.0" - run-async "^2.2.0" - rx "^4.1.0" - string-width "^1.0.1" - strip-ansi "^3.0.0" - through "^2.3.6" - inquirer@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" @@ -6959,20 +6445,6 @@ is-installed-globally@^0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" -is-my-ip-valid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" - -is-my-json-valid@^2.10.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz#8fd6e40363cd06b963fa877d444bfb5eddc62175" - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - is-my-ip-valid "^1.0.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - is-natural-number@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" @@ -7053,10 +6525,6 @@ is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" @@ -7552,7 +7020,7 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" -js-yaml@^3.11.0, js-yaml@^3.12.0, js-yaml@^3.5.1, js-yaml@^3.7.0, js-yaml@^3.9.0: +js-yaml@^3.11.0, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" dependencies: @@ -7667,10 +7135,6 @@ json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" -json-loader@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" - json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -7691,12 +7155,6 @@ 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" -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - 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" @@ -7715,7 +7173,7 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -jsonfile@^2.1.0: +jsonfile@^2.1.0, jsonfile@^2.2.3: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" optionalDependencies: @@ -7733,14 +7191,6 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsonpointer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -8041,13 +7491,6 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" -loader-fs-cache@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz#56e0bf08bd9708b26a765b68509840c8dec9fdbc" - dependencies: - find-cache-dir "^0.1.1" - mkdirp "0.5.1" - loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" @@ -8113,6 +7556,10 @@ lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" +lodash.escape@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" + lodash.every@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.every/-/lodash.every-4.6.0.tgz#eb89984bebc4364279bb3aefbbd1ca19bfa6c6a7" @@ -8141,10 +7588,6 @@ lodash.isobject@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - lodash.isstring@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" @@ -8189,14 +7632,10 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -lodash@4.17.10, "lodash@4.6.1 || ^4.16.1", lodash@^4.0.0, lodash@^4.1.0, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.6.1, lodash@^4.8.0, lodash@~4.17.10: +lodash@4.17.10, "lodash@4.6.1 || ^4.16.1", lodash@^4.0.0, lodash@^4.1.0, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.10: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" -lodash@^3.10.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" @@ -8423,13 +7862,6 @@ memory-fs@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" -memory-fs@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -8739,14 +8171,6 @@ mustache@^2.1.1, mustache@^2.1.2, mustache@^2.2.1, mustache@^2.3.0: version "2.3.2" resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5" -mute-stream@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" - -mute-stream@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" - mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -8979,10 +8403,6 @@ node-sass@4.9.3: stdout-stream "^1.4.0" "true-case-path" "^1.0.2" -node-status-codes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" - node-version@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.2.0.tgz#34fde3ffa8e1149bd323983479dda620e1b5060d" @@ -9155,10 +8575,6 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-hash@^1.1.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.0.tgz#76d9ba6ff113cf8efc0d996102851fe6723963e2" - object-inspect@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" @@ -9289,7 +8705,7 @@ optimize-css-assets-webpack-plugin@^5.0.0: cssnano "^4.0.2" last-call-webpack-plugin "^3.0.0" -optionator@^0.8.0, optionator@^0.8.1, optionator@^0.8.2: +optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" dependencies: @@ -9350,10 +8766,6 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-shim@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" - os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -9498,7 +8910,7 @@ parse-glob@^3.0.4: is-extglob "^1.0.0" is-glob "^2.0.0" -parse-json@^2.1.0, parse-json@^2.2.0: +parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" dependencies: @@ -9727,10 +9139,6 @@ plur@^2.1.2: dependencies: irregular-plurals "^1.0.0" -pluralize@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" - pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" @@ -10230,10 +9638,6 @@ progress-stream@^1.1.0: speedometer "~0.1.2" through2 "~0.2.3" -progress@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" - progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" @@ -10500,10 +9904,6 @@ react-addons-transition-group@15.6.2: dependencies: react-transition-group "^1.2.0" -react-deep-force-update@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.1.2.tgz#3d2ae45c2c9040cbb1772be52f8ea1ade6ca2ee1" - react-dom@16.4.2: version "16.4.2" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.2.tgz#4afed569689f2c561d2b8da0b819669c38a0bda4" @@ -10552,22 +9952,6 @@ react-popper@^0.10.4: popper.js "^1.14.1" prop-types "^15.6.1" -react-proxy@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a" - dependencies: - lodash "^4.6.1" - react-deep-force-update "^1.0.0" - -react-reconciler@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.7.0.tgz#9614894103e5f138deeeb5eabaf3ee80eb1d026d" - dependencies: - fbjs "^0.8.16" - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.0" - react-redux@^5.0.7: version "5.0.7" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.7.tgz#0dc1076d9afb4670f993ffaef44b8f8c1155a4c8" @@ -10626,17 +10010,6 @@ react-test-renderer@^16.0.0-0: prop-types "^15.6.0" react-is "^16.4.2" -react-transform-catch-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/react-transform-catch-errors/-/react-transform-catch-errors-1.0.2.tgz#1b4d4a76e97271896fc16fe3086c793ec88a9eeb" - -react-transform-hmr@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz#e1a40bd0aaefc72e8dfd7a7cda09af85066397bb" - dependencies: - global "^4.3.0" - react-proxy "^1.1.7" - react-transition-group@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.1.tgz#e11f72b257f921b213229a774df46612346c7ca6" @@ -10685,13 +10058,6 @@ reactstrap@6.4.0: react-popper "^0.10.4" react-transition-group "^2.3.1" -read-all-stream@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" - dependencies: - pinkie-promise "^2.0.0" - readable-stream "^2.0.0" - read-config-file@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-3.1.2.tgz#9b299cb7a2bcec1511a4c22e71620df0a2e3b896" @@ -10816,39 +10182,16 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" -readline2@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - mute-stream "0.0.5" - realpath-native@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.1.tgz#07f40a0cce8f8261e2e8b7ebebf5c95965d7b633" dependencies: util.promisify "^1.0.0" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - dependencies: - resolve "^1.1.6" - record-cache@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/record-cache/-/record-cache-1.1.0.tgz#f8a467a691a469584b26e88d36b18afdb3932037" -redbox-react@^1.2.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/redbox-react/-/redbox-react-1.6.0.tgz#e753ac02595bc1bf695b3935889a4f5b1b5a21a1" - dependencies: - error-stack-parser "^1.3.6" - object-assign "^4.0.1" - prop-types "^15.5.4" - sourcemapped-stacktrace "^1.1.6" - redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -11128,7 +10471,7 @@ 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" -require-uncached@^1.0.2, require-uncached@^1.0.3: +require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" dependencies: @@ -11183,7 +10526,7 @@ resolve@1.1.7, resolve@~1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" -resolve@^1.1.6, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0: +resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" dependencies: @@ -11231,7 +10574,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.4.2, rimraf@^2.5.0, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2, rimraf@^2.2.8, rimraf@^2.4.2, rimraf@^2.5.2, 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: @@ -11259,12 +10602,6 @@ rsvp@^3.3.3: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" -run-async@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" - dependencies: - once "^1.3.0" - run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -11303,14 +10640,6 @@ 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" -rx-lite@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" - -rx@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" - rxjs@6.2.2, rxjs@^6.1.0: version "6.2.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" @@ -11366,10 +10695,6 @@ sanitize-filename@^1.6.0, sanitize-filename@^1.6.1: dependencies: truncate-utf8-bytes "^1.0.0" -sanitizer@0.x.x: - version "0.1.3" - resolved "https://registry.yarnpkg.com/sanitizer/-/sanitizer-0.1.3.tgz#d4f0af7475d9a7baf2a9e5a611718baa178a39e1" - sass-graph@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" @@ -11568,14 +10893,6 @@ shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" -shelljs@^0.7.5: - version "0.7.8" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" @@ -11782,10 +11099,6 @@ source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" -source-map@0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - source-map@^0.1.38: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" @@ -11806,12 +11119,6 @@ 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" -sourcemapped-stacktrace@^1.1.6: - version "1.1.8" - resolved "https://registry.yarnpkg.com/sourcemapped-stacktrace/-/sourcemapped-stacktrace-1.1.8.tgz#6b7a3f1a6fb15f6d40e701e23ce404553480d688" - dependencies: - source-map "0.5.6" - spawn-args@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" @@ -11828,13 +11135,6 @@ spawn-rx@^2.0.10: lodash.assign "^4.2.0" rxjs "^5.1.1" -spawn-sync@^1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" - dependencies: - concat-stream "^1.4.7" - os-shim "^0.1.2" - spdx-correct@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" @@ -12115,12 +11415,6 @@ stringify-object@^3.2.2: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" - dependencies: - ansi-regex "^0.2.1" - 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" @@ -12280,10 +11574,6 @@ super-kat@0.1.0: isomorphic-fetch "^2.2.1" urijs "^1.18.2" -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -12353,17 +11643,6 @@ table-parser@^0.1.3: dependencies: connected-domain "^1.0.0" -table@^3.7.8: - version "3.8.3" - resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" - dependencies: - ajv "^4.7.0" - ajv-keywords "^1.0.0" - chalk "^1.1.1" - lodash "^4.0.0" - slice-ansi "0.0.4" - string-width "^2.0.0" - table@^4.0.1, table@^4.0.2, table@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" @@ -12379,10 +11658,6 @@ tapable@^0.1.8: version "0.1.10" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" -tapable@^0.2.3: - version "0.2.8" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" - tapable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" @@ -12648,7 +11923,7 @@ text-encoding@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" -text-table@^0.2.0, text-table@~0.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" @@ -12694,10 +11969,6 @@ time-stamp@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" -timed-out@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" - timed-out@^4.0.0, timed-out@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" @@ -12732,12 +12003,6 @@ tmp@0.0.x, tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@^0.0.29: - version "0.0.29" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" - dependencies: - os-tmpdir "~1.0.1" - tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -12795,12 +12060,6 @@ torrent-piece@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/torrent-piece/-/torrent-piece-1.1.2.tgz#774cadac08f65e3d55b84610842171365e349dc6" -torrentapi-wrapper@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/torrentapi-wrapper/-/torrentapi-wrapper-0.0.2.tgz#199111ccffe8a42a47274435490918fd419839c5" - dependencies: - got "5.x.x" - tough-cookie@2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" @@ -12830,13 +12089,6 @@ tr46@~0.0.1: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" -trakt.tv@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/trakt.tv/-/trakt.tv-7.0.0.tgz#ccdfb9e34503c7efadc5d52c80e04dcfdb8a698d" - dependencies: - got "8.x.x" - sanitizer "0.x.x" - "traverse@>=0.3.0 <0.4": version "0.3.9" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" @@ -12968,13 +12220,6 @@ uglify-js@^2.6: optionalDependencies: uglify-to-browserify "~1.0.0" -uglify-js@^3.4.8: - version "3.4.8" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.8.tgz#d590777b208258b54131b1ae45bc9d3f68033a3e" - dependencies: - commander "~2.17.1" - 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" @@ -13121,10 +12366,6 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -unzip-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" - unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" @@ -13230,12 +12471,6 @@ use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" -user-home@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - dependencies: - os-homedir "^1.0.0" - useragent@^2.1.7: version "2.3.0" resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972"