diff --git a/.gitignore b/.gitignore index 4ce2e5c..7a0e4e8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.idea/ build/ node_modules/ config.js diff --git a/package.json b/package.json index 45e07bd..299fd3b 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "dev": "webpack-dev-server --content-base static --mode development", "build": "NODE_ENV=production webpack --mode production", "test": "ava --verbose", - "test-watch": "ava --watch" + "test-watch": "ava --watch", + "lint": "standard \"src/**/*.js\" \"test/**/*.js\"" }, "dependencies": { "babel-polyfill": "^6.26.0", @@ -48,6 +49,7 @@ "node-sass": "^4.9.4", "redux-devtools": "^3.4.0", "sass-loader": "^7.1.0", + "standard": "^12.0.1", "style-loader": "^0.23.1", "webpack": "^4.20.2", "webpack-cli": "^3.1.2", diff --git a/src/actions/index.js b/src/actions/index.js index cad3fa1..b8bdce0 100644 --- a/src/actions/index.js +++ b/src/actions/index.js @@ -1,16 +1,15 @@ +/* global fetch, alert */ import { urlFromEnv } from '../js/utilities' -const EVENT_DATA_URL = urlFromEnv('EVENT_EXT'); -const CATEGORY_URL = urlFromEnv('CATEGORY_EXT'); -const TAGS_URL = urlFromEnv('TAGS_EXT'); -const SOURCES_URL = urlFromEnv('SOURCES_EXT'); -const NARRATIVE_URL = urlFromEnv('NARRATIVE_EXT'); -const SITES_URL = urlFromEnv('SITES_EXT'); -const eventUrlMap = (event) => `${process.env.SERVER_ROOT}${process.env.EVENT_DESC_ROOT}/${(event.id) ? event.id : event}`; +const EVENT_DATA_URL = urlFromEnv('EVENT_EXT') +const CATEGORY_URL = urlFromEnv('CATEGORY_EXT') +const TAGS_URL = urlFromEnv('TAGS_EXT') +const SOURCES_URL = urlFromEnv('SOURCES_EXT') +const NARRATIVE_URL = urlFromEnv('NARRATIVE_EXT') +const SITES_URL = urlFromEnv('SITES_EXT') const domainMsg = (domainType) => `Something went wrong fetching ${domainType}. Check the URL or try disabling them in the config file.` - export function fetchDomain () { let notifications = [] @@ -24,7 +23,6 @@ export function fetchDomain () { return dispatch => { dispatch(toggleFetchingDomain()) - const promises = [] const eventPromise = fetch(EVENT_DATA_URL) .then(response => response.json()) @@ -96,27 +94,26 @@ export function fetchDomain () { // TODO: handle this appropriately in React hierarchy alert(err.message) }) - }; + } } export const FETCH_ERROR = 'FETCH_ERROR' -export function fetchError(message) { +export function fetchError (message) { return { type: FETCH_ERROR, - message, + message } } export const UPDATE_DOMAIN = 'UPDATE_DOMAIN' -export function updateDomain(domain) { +export function updateDomain (domain) { return { type: UPDATE_DOMAIN, domain } } - -export function fetchSource(source) { +export function fetchSource (source) { return dispatch => { if (!SOURCES_URL) { dispatch(fetchSourceError('No source extension specified.')) @@ -135,14 +132,12 @@ export function fetchSource(source) { dispatch(fetchSourceError(err.message)) dispatch(toggleFetchingSources()) }) - } - } } export const UPDATE_HIGHLIGHTED = 'UPDATE_HIGHLIGHTED' -export function updateHighlighted(highlighted) { +export function updateHighlighted (highlighted) { return { type: UPDATE_HIGHLIGHTED, highlighted: highlighted @@ -150,7 +145,7 @@ export function updateHighlighted(highlighted) { } export const UPDATE_SELECTED = 'UPDATE_SELECTED' -export function updateSelected(selected) { +export function updateSelected (selected) { return { type: UPDATE_SELECTED, selected: selected @@ -158,7 +153,7 @@ export function updateSelected(selected) { } export const UPDATE_DISTRICT = 'UPDATE_DISTRICT' -export function updateDistrict(district) { +export function updateDistrict (district) { return { type: UPDATE_DISTRICT, district @@ -166,7 +161,7 @@ export function updateDistrict(district) { } export const UPDATE_TAGFILTERS = 'UPDATE_TAGFILTERS' -export function updateTagFilters(tag) { +export function updateTagFilters (tag) { return { type: UPDATE_TAGFILTERS, tag @@ -174,52 +169,52 @@ export function updateTagFilters(tag) { } export const UPDATE_CATEGORYFILTERS = 'UPDATE_CATEGORYFILTERS' -export function updateCategoryFilters(category) { +export function updateCategoryFilters (category) { return { type: UPDATE_CATEGORYFILTERS, category } } -export const UPDATE_TIMERANGE = 'UPDATE_TIMERANGE'; -export function updateTimeRange(timerange) { +export const UPDATE_TIMERANGE = 'UPDATE_TIMERANGE' +export function updateTimeRange (timerange) { return { type: UPDATE_TIMERANGE, timerange } } -export const UPDATE_NARRATIVE = 'UPDATE_NARRATIVE'; -export function updateNarrative(narrative) { +export const UPDATE_NARRATIVE = 'UPDATE_NARRATIVE' +export function updateNarrative (narrative) { return { type: UPDATE_NARRATIVE, narrative } } -export const INCREMENT_NARRATIVE_CURRENT = 'INCREMENT_NARRATIVE_CURRENT'; -export function incrementNarrativeCurrent() { +export const INCREMENT_NARRATIVE_CURRENT = 'INCREMENT_NARRATIVE_CURRENT' +export function incrementNarrativeCurrent () { return { type: INCREMENT_NARRATIVE_CURRENT } } -export const DECREMENT_NARRATIVE_CURRENT = 'DECREMENT_NARRATIVE_CURRENT'; -export function decrementNarrativeCurrent() { +export const DECREMENT_NARRATIVE_CURRENT = 'DECREMENT_NARRATIVE_CURRENT' +export function decrementNarrativeCurrent () { return { type: DECREMENT_NARRATIVE_CURRENT } } export const RESET_ALLFILTERS = 'RESET_ALLFILTERS' -export function resetAllFilters() { +export function resetAllFilters () { return { type: RESET_ALLFILTERS } } -export const UPDATE_SOURCE = "UPDATE_SOURCE" -export function updateSource(source) { +export const UPDATE_SOURCE = 'UPDATE_SOURCE' +export function updateSource (source) { return { type: UPDATE_SOURCE, source @@ -229,65 +224,65 @@ export function updateSource(source) { // UI export const TOGGLE_SITES = 'TOGGLE_SITES' -export function toggleSites() { +export function toggleSites () { return { type: TOGGLE_SITES } } export const TOGGLE_FETCHING_DOMAIN = 'TOGGLE_FETCHING_DOMAIN' -export function toggleFetchingDomain() { +export function toggleFetchingDomain () { return { type: TOGGLE_FETCHING_DOMAIN } } export const TOGGLE_FETCHING_SOURCES = 'TOGGLE_FETCHING_SOURCES' -export function toggleFetchingSources() { +export function toggleFetchingSources () { return { type: TOGGLE_FETCHING_SOURCES } } -export const TOGGLE_LANGUAGE = 'TOGGLE_LANGUAGE'; -export function toggleLanguage(language) { +export const TOGGLE_LANGUAGE = 'TOGGLE_LANGUAGE' +export function toggleLanguage (language) { return { type: TOGGLE_LANGUAGE, - language, + language } } -export const CLOSE_TOOLBAR = 'CLOSE_TOOLBAR'; -export function closeToolbar() { +export const CLOSE_TOOLBAR = 'CLOSE_TOOLBAR' +export function closeToolbar () { return { type: CLOSE_TOOLBAR } } -export const TOGGLE_INFOPOPUP = 'TOGGLE_INFOPOPUP'; -export function toggleInfoPopup() { +export const TOGGLE_INFOPOPUP = 'TOGGLE_INFOPOPUP' +export function toggleInfoPopup () { return { type: TOGGLE_INFOPOPUP } } -export const TOGGLE_MAPVIEW = 'TOGGLE_MAPVIEW'; - export function toggleMapView(layer) { - return { - type: TOGGLE_MAPVIEW, - layer - } - } +export const TOGGLE_MAPVIEW = 'TOGGLE_MAPVIEW' +export function toggleMapView (layer) { + return { + type: TOGGLE_MAPVIEW, + layer + } +} export const TOGGLE_NOTIFICATIONS = 'TOGGLE_NOTIFICATIONS' -export function toggleNotifications() { +export function toggleNotifications () { return { type: TOGGLE_NOTIFICATIONS } } export const MARK_NOTIFICATIONS_READ = 'MARK_NOTIFICATIONS_READ' -export function markNotificationsRead() { +export function markNotificationsRead () { return { type: MARK_NOTIFICATIONS_READ } @@ -296,7 +291,7 @@ export function markNotificationsRead() { // ERRORS export const FETCH_SOURCE_ERROR = 'FETCH_SOURCE_ERROR' -export function fetchSourceError(msg) { +export function fetchSourceError (msg) { return { type: FETCH_SOURCE_ERROR, msg diff --git a/src/components/presentational/CardCaret.js b/src/components/presentational/CardCaret.js index 36994b3..d3d4fc8 100644 --- a/src/components/presentational/CardCaret.js +++ b/src/components/presentational/CardCaret.js @@ -1,18 +1,17 @@ -import React from 'react'; +import React from 'react' const CardCaret = ({ isHighlighted, toggle }) => { - let classes = (isHighlighted) ? 'arrow-down' - : 'arrow-down folded'; + : 'arrow-down folded' return ( -
+

- +

- ); + ) } -export default CardCaret; +export default CardCaret diff --git a/src/components/presentational/CardCategory.js b/src/components/presentational/CardCategory.js index 20b396d..2d09d8d 100644 --- a/src/components/presentational/CardCategory.js +++ b/src/components/presentational/CardCategory.js @@ -1,15 +1,15 @@ -import React from 'react'; +import React from 'react' -import { capitalizeFirstLetter } from '../../js/utilities.js'; +import { capitalizeFirstLetter } from '../../js/utilities.js' const CardCategory = ({ categoryTitle, categoryLabel, color }) => ( -
+

{categoryTitle}

{capitalizeFirstLetter(categoryLabel)} - +

-); +) -export default CardCategory; +export default CardCategory diff --git a/src/components/presentational/CardLocation.js b/src/components/presentational/CardLocation.js index e9598fa..92f1944 100644 --- a/src/components/presentational/CardLocation.js +++ b/src/components/presentational/CardLocation.js @@ -1,30 +1,29 @@ -import React from 'react'; +import React from 'react' -import copy from '../../js/data/copy.json'; -import { isNotNullNorUndefined } from '../../js/utilities'; +import copy from '../../js/data/copy.json' +import { isNotNullNorUndefined } from '../../js/utilities' const CardLocation = ({ language, location }) => { - if (isNotNullNorUndefined(location)) { return ( -
+

- location_on + location_on {location}

- ); + ) } else { - const unknown = copy[language].cardstack.unknown_location; + const unknown = copy[language].cardstack.unknown_location return ( -
+

- location_on + location_on {unknown}

- ); + ) } } -export default CardLocation; +export default CardLocation diff --git a/src/components/presentational/CardNarrative.js b/src/components/presentational/CardNarrative.js index 49f590d..1f01808 100644 --- a/src/components/presentational/CardNarrative.js +++ b/src/components/presentational/CardNarrative.js @@ -1,15 +1,15 @@ -import React from 'react'; +import React from 'react' -import CardNarrativeLink from './CardNarrativeLink'; +import CardNarrativeLink from './CardNarrativeLink' const CardNarrative = (props) => ( -
+

Connected events

-
-

+
+

-); +) -export default CardNarrative; +export default CardNarrative diff --git a/src/components/presentational/CardNarrativeLink.js b/src/components/presentational/CardNarrativeLink.js index 4d93316..b292e16 100644 --- a/src/components/presentational/CardNarrativeLink.js +++ b/src/components/presentational/CardNarrativeLink.js @@ -1,17 +1,17 @@ -import React from 'react'; +import React from 'react' const CardNarrativeLink = ({ event, makeTimelabel, select }) => { if (event !== null) { - const timelabel = makeTimelabel(event.timestamp); + const timelabel = makeTimelabel(event.timestamp) return ( select(event)}> {`${timelabel} / ${event.location}`} - ); + ) } - return (None); + return (None) } -export default CardNarrativeLink; +export default CardNarrativeLink diff --git a/src/components/presentational/CardSource.js b/src/components/presentational/CardSource.js index 9b3da5b..f322a1b 100644 --- a/src/components/presentational/CardSource.js +++ b/src/components/presentational/CardSource.js @@ -3,11 +3,9 @@ import PropTypes from 'prop-types' import Spinner from './Spinner' import Img from 'react-image' -import copy from '../../js/data/copy.json' - const CardSource = ({ source, isLoading, onClickHandler }) => { - function renderIconText(type) { - switch(type) { + function renderIconText (type) { + switch (type) { case 'Eyewitness Testimony': return 'visibility' case 'Government Data': @@ -29,7 +27,7 @@ const CardSource = ({ source, isLoading, onClickHandler }) => { if (!source) { return ( -
+
Error: this source was not found
) @@ -45,30 +43,30 @@ const CardSource = ({ source, isLoading, onClickHandler }) => { } const fallbackIcon = ( - + {renderIconText(source.type)} ) return ( -
+
{isLoading - ? - : ( -
onClickHandler(source)}> - {!!thumbnail ? ( - } - unloader={fallbackIcon} - width={30} - height={30} - /> - ) : fallbackIcon} -

{source.id}

-
- )} + ? + : ( +
onClickHandler(source)}> + {thumbnail ? ( + } + unloader={fallbackIcon} + width={30} + height={30} + /> + ) : fallbackIcon} +

{source.id}

+
+ )}
) } @@ -79,7 +77,7 @@ CardSource.propTypes = { type: PropTypes.string }), isLoading: PropTypes.bool, - onClickHandler: PropTypes.func.isRequired, + onClickHandler: PropTypes.func.isRequired } export default CardSource diff --git a/src/components/presentational/CardSummary.js b/src/components/presentational/CardSummary.js index 3e0cdbf..5cc2a3d 100644 --- a/src/components/presentational/CardSummary.js +++ b/src/components/presentational/CardSummary.js @@ -1,19 +1,18 @@ -import React from 'react'; +import React from 'react' -import copy from '../../js/data/copy.json'; +import copy from '../../js/data/copy.json' const CardSummary = ({ language, description, isHighlighted }) => { - - const summary = copy[language].cardstack.description; + const summary = copy[language].cardstack.description return ( -
-
+
+

{summary}

{description}

- ); + ) } -export default CardSummary; +export default CardSummary diff --git a/src/components/presentational/CardTags.js b/src/components/presentational/CardTags.js index 6841cd4..711a888 100644 --- a/src/components/presentational/CardTags.js +++ b/src/components/presentational/CardTags.js @@ -1,37 +1,36 @@ -import React from 'react'; +import React from 'react' -import copy from '../../js/data/copy.json'; +import copy from '../../js/data/copy.json' const CardTags = ({ tags, language }) => { - const tags_lang = copy[language].cardstack.tags; - const no_tags_lang = copy[language].cardstack.notags; + const tagsLang = copy[language].cardstack.tags + const noTagsLang = copy[language].cardstack.notags if (tags.length > 0) { return ( -
-

{tags_lang}:

+
+

{tagsLang}:

{tags.map((tag, idx) => { - return ( - - {tag.name} - {(idx < tags.length - 1) - ? ',' - : ''} - - ); + return ( + + {tag.name} + {(idx < tags.length - 1) + ? ',' + : ''} + + ) })}

- ); + ) } return ( -
-

{tags_lang}

-

{no_tags_lang}

+
+

{tagsLang}

+

{noTagsLang}

- ); - + ) } -export default CardTags; +export default CardTags diff --git a/src/components/presentational/CardTimestamp.js b/src/components/presentational/CardTimestamp.js index 0317896..ce8ec66 100644 --- a/src/components/presentational/CardTimestamp.js +++ b/src/components/presentational/CardTimestamp.js @@ -1,34 +1,31 @@ -import React from 'react'; +import React from 'react' -import copy from '../../js/data/copy.json'; -import { isNotNullNorUndefined } from '../../js/utilities'; +import copy from '../../js/data/copy.json' +import { isNotNullNorUndefined } from '../../js/utilities' const CardTimestamp = ({ makeTimelabel, language, timestamp }) => { - - const daytime_lang = copy[language].cardstack.timestamp; - const estimated_lang = copy[language].cardstack.estimated; - const unknown_lang = copy[language].cardstack.unknown_time; + const unknownLang = copy[language].cardstack.unknown_time if (isNotNullNorUndefined(timestamp)) { - const timelabel = makeTimelabel(timestamp); + const timelabel = makeTimelabel(timestamp) return ( -
+

- today + today {timelabel}

- ); + ) } else { return ( -
+

- today - {unknown_lang} + today + {unknownLang}

- ); + ) } } -export default CardTimestamp; +export default CardTimestamp diff --git a/src/components/presentational/Checkbox.js b/src/components/presentational/Checkbox.js index c57d409..976551c 100644 --- a/src/components/presentational/Checkbox.js +++ b/src/components/presentational/Checkbox.js @@ -1,10 +1,10 @@ -import React from 'react'; +import React from 'react' export default ({ label, isActive, onClickCheckbox }) => (
onClickCheckbox()}>{label}
-); +) diff --git a/src/components/presentational/DatetimeDot.js b/src/components/presentational/DatetimeDot.js index 8caf52a..24a7abd 100644 --- a/src/components/presentational/DatetimeDot.js +++ b/src/components/presentational/DatetimeDot.js @@ -15,14 +15,12 @@ export default ({ onClick={() => onSelect(events)} > - + /> { extraRender ? extraRender() : null } ) - diff --git a/src/components/presentational/Icons/CoeventIcon.js b/src/components/presentational/Icons/CoeventIcon.js index ffa5db7..7ddc2f9 100644 --- a/src/components/presentational/Icons/CoeventIcon.js +++ b/src/components/presentational/Icons/CoeventIcon.js @@ -1,24 +1,21 @@ -import React from 'react'; +import React from 'react' const CoeventIcon = ({ isEnabled, toggleMapViews }) => { - - const classes = (isEnabled) ? 'action-button active disabled' : 'action-button disabled'; - return ( - ); + ) } -export default CoeventIcon; +export default CoeventIcon diff --git a/src/components/presentational/Icons/RefreshIcon.js b/src/components/presentational/Icons/RefreshIcon.js index 1e1eb03..b67c47a 100644 --- a/src/components/presentational/Icons/RefreshIcon.js +++ b/src/components/presentational/Icons/RefreshIcon.js @@ -1,14 +1,13 @@ -import React from 'react'; - -const RefreshIcon = ({ }) => { +import React from 'react' +const RefreshIcon = () => { return ( - - - + + + - ); + ) } -export default RefreshIcon; +export default RefreshIcon diff --git a/src/components/presentational/Icons/RouteIcon.js b/src/components/presentational/Icons/RouteIcon.js index 4febda9..d0b9b36 100644 --- a/src/components/presentational/Icons/RouteIcon.js +++ b/src/components/presentational/Icons/RouteIcon.js @@ -1,20 +1,17 @@ -import React from 'react'; +import React from 'react' const RouteIcon = ({ isEnabled, toggleMapViews }) => { - - const classes = (isEnabled) ? 'action-button active disabled' : 'action-button disabled'; - return ( - ); + ) } -export default RouteIcon; +export default RouteIcon diff --git a/src/components/presentational/Icons/SitesIcon.js b/src/components/presentational/Icons/SitesIcon.js index 226d31e..0b394cb 100644 --- a/src/components/presentational/Icons/SitesIcon.js +++ b/src/components/presentational/Icons/SitesIcon.js @@ -1,7 +1,7 @@ -import React from 'react'; +import React from 'react' const SitesIcon = ({ isActive, isDisabled, onClickHandler }) => { - let classes = (isActive) ? 'action-button enabled' : 'action-button'; + let classes = (isActive) ? 'action-button enabled' : 'action-button' if (isDisabled) { classes = 'action-button disabled' } @@ -11,11 +11,11 @@ const SitesIcon = ({ isActive, isDisabled, onClickHandler }) => { className={classes} onClick={onClickHandler} > - - + + ) } -export default SitesIcon; +export default SitesIcon diff --git a/src/components/presentational/LoadingOverlay.js b/src/components/presentational/LoadingOverlay.js index bb1d0b7..14bc32c 100644 --- a/src/components/presentational/LoadingOverlay.js +++ b/src/components/presentational/LoadingOverlay.js @@ -1,21 +1,21 @@ -import React from 'react'; -import copy from '../../js/data/copy.json'; +import React from 'react' +import copy from '../../js/data/copy.json' const LoadingOverlay = ({ isLoading, language }) => { - let classes = 'loading-overlay'; - classes += (!isLoading) ? ' hidden' : ''; + let classes = 'loading-overlay' + classes += (!isLoading) ? ' hidden' : '' return ( -
-
- {copy[language].loading} -
-
-
+
+
+ {copy[language].loading} +
+
+
- ); -}; + ) +} -export default LoadingOverlay; +export default LoadingOverlay diff --git a/src/components/presentational/NarrativeCard.js b/src/components/presentational/NarrativeCard.js index b47e10c..54a8b45 100644 --- a/src/components/presentational/NarrativeCard.js +++ b/src/components/presentational/NarrativeCard.js @@ -3,12 +3,10 @@ import { connect } from 'react-redux' import { selectActiveNarrative } from '../../selectors' function NarrativeCard ({ narrative }) { - // no display if no narrative + // no display if no narrative const { steps, current } = narrative if (steps[current]) { - const step = steps[current] - return (
@@ -27,14 +25,14 @@ function NarrativeCard ({ narrative }) {

{narrative.description}

-
+
) } else { return null } } -function mapStateToProps(state) { +function mapStateToProps (state) { return { narrative: selectActiveNarrative(state) } diff --git a/src/components/presentational/NarrativeClose.js b/src/components/presentational/NarrativeClose.js index c514479..55a58af 100644 --- a/src/components/presentational/NarrativeClose.js +++ b/src/components/presentational/NarrativeClose.js @@ -9,7 +9,7 @@ export default ({ onClickHandler, closeMsg }) => {
{closeMsg}
diff --git a/src/components/presentational/NoSource.js b/src/components/presentational/NoSource.js index d5c8701..a8b5749 100644 --- a/src/components/presentational/NoSource.js +++ b/src/components/presentational/NoSource.js @@ -1,16 +1,16 @@ -import React from 'react'; +import React from 'react' -const NoSource = ({ failedUrls }) => { +const NoSource = ({ failedUrls }) => { return ( -
-
+
+

- error -

+ error +

No media found, as the original media has not yet been uploaded to the platform.

) } -export default NoSource; +export default NoSource diff --git a/src/components/presentational/Spinner.js b/src/components/presentational/Spinner.js index f3c483c..841a8ea 100644 --- a/src/components/presentational/Spinner.js +++ b/src/components/presentational/Spinner.js @@ -1,12 +1,12 @@ -import React from 'react'; +import React from 'react' const Spinner = ({ small }) => { return (
-
-
+
+
) } -export default Spinner; +export default Spinner diff --git a/src/components/presentational/TimelineClip.js b/src/components/presentational/TimelineClip.js index 29491da..ad1024b 100644 --- a/src/components/presentational/TimelineClip.js +++ b/src/components/presentational/TimelineClip.js @@ -1,15 +1,14 @@ -import React from 'react'; +import React from 'react' const TimelineClip = ({ dims }) => ( - + - + /> -); +) -export default TimelineClip; +export default TimelineClip diff --git a/src/components/presentational/TimelineEvents.js b/src/components/presentational/TimelineEvents.js index 8c9678f..0e59a3f 100644 --- a/src/components/presentational/TimelineEvents.js +++ b/src/components/presentational/TimelineEvents.js @@ -1,8 +1,8 @@ -import React from 'react'; +import React from 'react' import DatetimeDot from './DatetimeDot' // return a list of lists, where each list corresponds to a single category -function getDotsToRender(events) { +function getDotsToRender (events) { // each datetime needs to render as many dots as there are distinct // categories in the events contained by the datetime. // To this end, eventsByCategory is an intermediate data structure that @@ -32,7 +32,7 @@ const TimelineEvents = ({ transitionDuration, styleDatetime }) => { - function renderDatetime(datetime) { + function renderDatetime (datetime) { if (narrative) { const { steps } = narrative // check all events in the datetime before rendering in narrative @@ -41,7 +41,7 @@ const TimelineEvents = ({ const event = datetime.events[i] if (steps.map(s => s.id).includes(event.id)) { isInNarrative = true - break; + break } } @@ -80,11 +80,11 @@ const TimelineEvents = ({ return ( {datetimes.map(datetime => renderDatetime(datetime))} - ); + ) } -export default TimelineEvents; +export default TimelineEvents diff --git a/src/components/presentational/TimelineHandles.js b/src/components/presentational/TimelineHandles.js index 3e65f9b..1e9be34 100644 --- a/src/components/presentational/TimelineHandles.js +++ b/src/components/presentational/TimelineHandles.js @@ -1,26 +1,24 @@ -import React from 'react'; +import React from 'react' const TimelineHandles = ({ dims, onMoveTime }) => { - return ( - + onMoveTime('backwards')} > - - + + onMoveTime('forward')} > - - + + ) - } -export default TimelineHandles; \ No newline at end of file +export default TimelineHandles diff --git a/src/components/presentational/TimelineHeader.js b/src/components/presentational/TimelineHeader.js index f9ece09..a942cb7 100644 --- a/src/components/presentational/TimelineHeader.js +++ b/src/components/presentational/TimelineHeader.js @@ -1,15 +1,15 @@ -import React from 'react'; +import React from 'react' const TimelineHeader = ({ title, date0, date1, onClick, hideInfo }) => (
onClick()}> -

+

{title}

{date0} - {date1}

-); +) -export default TimelineHeader; +export default TimelineHeader diff --git a/src/components/presentational/TimelineLabels.js b/src/components/presentational/TimelineLabels.js index 36466ba..63a2154 100644 --- a/src/components/presentational/TimelineLabels.js +++ b/src/components/presentational/TimelineLabels.js @@ -1,27 +1,22 @@ -import React from 'react'; - -import { formatterWithYear } from '../../js/utilities.js'; +import React from 'react' const TimelineLabels = ({ dims, timelabels }) => { - return ( - + y1='10' + y2='20' + /> - + y1='10' + y2='20' + /> {/* { ) } -export default TimelineLabels; +export default TimelineLabels diff --git a/src/components/presentational/TimelineMarkers.js b/src/components/presentational/TimelineMarkers.js index f780947..79166b1 100644 --- a/src/components/presentational/TimelineMarkers.js +++ b/src/components/presentational/TimelineMarkers.js @@ -1,10 +1,10 @@ -import React from 'react'; +import React from 'react' const TimelineMarkers = ({ getEventX, getCategoryY, transitionDuration, selected }) => { - function renderMarker(event) { + function renderMarker (event) { return ( - + r='10' + /> ) } return ( {selected.map(event => renderMarker(event))} - ); + ) } -export default TimelineMarkers; +export default TimelineMarkers diff --git a/src/components/presentational/TimelineZoomControls.js b/src/components/presentational/TimelineZoomControls.js index 3c0a564..a1b9379 100644 --- a/src/components/presentational/TimelineZoomControls.js +++ b/src/components/presentational/TimelineZoomControls.js @@ -1,12 +1,12 @@ -import React from 'react'; +import React from 'react' const TimelineZoomControls = ({ extent, zoomLevels, dims, onApplyZoom }) => { - function renderZoom(zoom, idx) { + function renderZoom (zoom, idx) { const isActive = (zoom.duration === extent) return ( onApplyZoom(zoom)} > @@ -19,7 +19,7 @@ const TimelineZoomControls = ({ extent, zoomLevels, dims, onApplyZoom }) => { {zoomLevels.map((z, idx) => renderZoom(z, idx))} - ); + ) } -export default TimelineZoomControls; +export default TimelineZoomControls diff --git a/src/js/utilities.js b/src/js/utilities.js index dc242c3..42bc3b9 100644 --- a/src/js/utilities.js +++ b/src/js/utilities.js @@ -1,20 +1,21 @@ +/* global d3 */ /** * Get URI params to start with predefined set of * https://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript * @param {string} name: name of paramater to search * @param {string} url: url passed as variable, defaults to window.location.href */ -export function getParameterByName(name, url) { - if (!url) url = window.location.href; - name = name.replace(/[\[\]]/g, `\\$&`); +export function getParameterByName (name, url) { + if (!url) url = window.location.href + name = name.replace(/[[\]]/g, `\\$&`) - const regex = new RegExp(`[?&]${name}(=([^&#]*)|&|#|$)`); - const results = regex.exec(url); + const regex = new RegExp(`[?&]${name}(=([^&#]*)|&|#|$)`) + const results = regex.exec(url) - if (!results) return null; - if (!results[2]) return ''; + if (!results) return null + if (!results[2]) return '' - return decodeURIComponent(results[2].replace(/\+/g, ' ')); + return decodeURIComponent(results[2].replace(/\+/g, ' ')) } /** @@ -22,61 +23,61 @@ export function getParameterByName(name, url) { * @param {array} arr1: array of numbers * @param {array} arr2: array of numbers */ -export function areEqual(arr1, arr2) { - return ((arr1.length === arr2.length) && arr1.every((element, index) => { - return element === arr2[index]; - })); +export function areEqual (arr1, arr2) { + return ((arr1.length === arr2.length) && arr1.every((element, index) => { + return element === arr2[index] + })) } /** * Return whether the variable is neither null nor undefined * @param {object} variable */ -export function isNotNullNorUndefined(variable) { - return (typeof variable !== 'undefined' && variable !== null); +export function isNotNullNorUndefined (variable) { + return (typeof variable !== 'undefined' && variable !== null) } /* * Capitalizes _only_ the first letter of a string * Taken from: https://stackoverflow.com/questions/1026069/how-do-i-make-the-first-letter-of-a-string-uppercase-in-javascript */ -export function capitalizeFirstLetter(string) { - return string.charAt(0).toUpperCase() + string.slice(1); +export function capitalizeFirstLetter (string) { + return string.charAt(0).toUpperCase() + string.slice(1) } -export function trimAndEllipse(string, stringNum) { +export function trimAndEllipse (string, stringNum) { if (string.length > stringNum) { return string.substring(0, 120) + '...' } - return string; + return string } /** * Return a Date object given a datetime string of the format: "2016-09-10T07:00:00" * @param {string} datetime */ -export function parseDate(datetime) { +export function parseDate (datetime) { return new Date(datetime.slice(0, 4), datetime.slice(5, 7) - 1, datetime.slice(8, 10), datetime.slice(11, 13), datetime.slice(14, 16), datetime.slice(17, 19) - ); + ) } -export function formatterWithYear(datetime) { - return d3.timeFormat("%d %b %Y, %H:%M")(datetime); +export function formatterWithYear (datetime) { + return d3.timeFormat('%d %b %Y, %H:%M')(datetime) } -export function formatter(datetime) { - return d3.timeFormat("%d %b, %H:%M")(datetime); +export function formatter (datetime) { + return d3.timeFormat('%d %b, %H:%M')(datetime) } -export const parseTimestamp = ts => d3.timeParse("%Y-%m-%dT%H:%M:%S")(ts); +export const parseTimestamp = ts => d3.timeParse('%Y-%m-%dT%H:%M:%S')(ts) export function compareTimestamp (a, b) { - return (parseTimestamp(a.timestamp) > parseTimestamp(b.timestamp)); + return (parseTimestamp(a.timestamp) > parseTimestamp(b.timestamp)) } /** @@ -85,7 +86,7 @@ export function compareTimestamp (a, b) { * source, call with two sets of parentheses: * const src = insetSourceFrom(sources)(anEvent) */ -export function insetSourceFrom(allSources) { +export function insetSourceFrom (allSources) { return (event) => { let sources if (!event.sources) { @@ -100,14 +101,13 @@ export function insetSourceFrom(allSources) { sources } } - } /** * Debugging function: put in place of a mapStateToProps function to * view that source modal by default */ -export function injectSource(id) { +export function injectSource (id) { return state => { return { ...state, @@ -119,7 +119,7 @@ export function injectSource(id) { } } -export function urlFromEnv(ext) { +export function urlFromEnv (ext) { if (process.env[ext]) { return `${process.env.SERVER_ROOT}${process.env[ext]}` } else { diff --git a/src/reducers/app.js b/src/reducers/app.js index 43e39aa..cdf90f1 100644 --- a/src/reducers/app.js +++ b/src/reducers/app.js @@ -1,3 +1,4 @@ +/* global d3 */ import initial from '../store/initial.js' import { parseDate } from '../js/utilities' @@ -20,22 +21,22 @@ import { TOGGLE_INFOPOPUP, TOGGLE_NOTIFICATIONS, FETCH_ERROR, - FETCH_SOURCE_ERROR, + FETCH_SOURCE_ERROR } from '../actions' -function updateHighlighted(appState, action) { +function updateHighlighted (appState, action) { return Object.assign({}, appState, { highlighted: action.highlighted }) } -function updateSelected(appState, action) { +function updateSelected (appState, action) { return Object.assign({}, appState, { selected: action.selected }) } -function updateNarrative(appState, action) { +function updateNarrative (appState, action) { let minTime = appState.filters.timerange[0] let maxTime = appState.filters.timerange[1] @@ -43,7 +44,7 @@ function updateNarrative(appState, action) { let cornerBound1 = [-180, -180] // Compute narrative time range and map bounds - if (!!action.narrative) { + if (action.narrative) { minTime = parseDate('2100-01-01T00:00:00') maxTime = parseDate('1900-01-01T00:00:00') @@ -85,7 +86,7 @@ function updateNarrative(appState, action) { ...appState, narrative: action.narrative, narrativeState: { - current: !!action.narrative ? 0 : null + current: action.narrative ? 0 : null }, filters: { ...appState.filters, @@ -95,29 +96,33 @@ function updateNarrative(appState, action) { } } -function incrementNarrativeCurrent(appState, action) { +function incrementNarrativeCurrent (appState, action) { + appState.narrativeState.current += 1 + return { ...appState, narrativeState: { - current: appState.narrativeState.current += 1 + current: appState.narrativeState.current } } } -function decrementNarrativeCurrent(appState, action) { +function decrementNarrativeCurrent (appState, action) { + appState.narrativeState.current -= 1 + return { ...appState, narrativeState: { - current: appState.narrativeState.current -= 1 + current: appState.narrativeState.current } } } -function updateTagFilters(appState, action) { +function updateTagFilters (appState, action) { const tagFilters = appState.filters.tags.slice(0) const nextActiveState = action.tag.active - function traverseNode(node) { + function traverseNode (node) { const tagFilter = tagFilters.find(tF => tF.key === node.key) node.active = nextActiveState if (!tagFilter) tagFilters.push(node) @@ -136,7 +141,7 @@ function updateTagFilters(appState, action) { }) } -function updateCategoryFilters(appState, action) { +function updateCategoryFilters (appState, action) { const categoryFilters = appState.filters.categories.slice(0) const catFilter = categoryFilters.find(cF => cF.category === action.category.category) @@ -147,7 +152,6 @@ function updateCategoryFilters(appState, action) { catFilter.active = (!!action.category.active) } - return Object.assign({}, appState, { filters: Object.assign({}, appState.filters, { categories: categoryFilters @@ -155,36 +159,36 @@ function updateCategoryFilters(appState, action) { }) } -function updateTimeRange(appState, action) { // XXX +function updateTimeRange (appState, action) { // XXX return Object.assign({}, appState, { filters: Object.assign({}, appState.filters, { timerange: action.timerange - }), + }) }) } -function resetAllFilters(appState) { // XXX +function resetAllFilters (appState) { // XXX return Object.assign({}, appState, { filters: Object.assign({}, appState.filters, { tags: [], categories: [], timerange: [ - d3.timeParse("%Y-%m-%dT%H:%M:%S")("2014-09-25T12:00:00"), - d3.timeParse("%Y-%m-%dT%H:%M:%S")("2014-09-28T12:00:00") - ], + d3.timeParse('%Y-%m-%dT%H:%M:%S')('2014-09-25T12:00:00'), + d3.timeParse('%Y-%m-%dT%H:%M:%S')('2014-09-28T12:00:00') + ] }), - selected: [], + selected: [] }) } -function toggleLanguage(appState, action) { +function toggleLanguage (appState, action) { let otherLanguage = (appState.language === 'es-MX') ? 'en-US' : 'es-MX' return Object.assign({}, appState, { language: action.language || otherLanguage }) } -function toggleMapView(appState, action) { +function toggleMapView (appState, action) { const isLayerInView = !appState.views[layer] const newViews = {} newViews[layer] = isLayerInView @@ -196,7 +200,7 @@ function toggleMapView(appState, action) { }) } -function toggleSites(appState, action) { +function toggleSites (appState, action) { return { ...appState, flags: { @@ -206,14 +210,14 @@ function toggleSites(appState, action) { } } -function updateSource(appState, action) { +function updateSource (appState, action) { return { ...appState, source: action.source } } -function fetchError(state, action) { +function fetchError (state, action) { return { ...state, error: action.message, @@ -221,7 +225,7 @@ function fetchError(state, action) { } } -function toggleFetchingDomain(appState, action) { +function toggleFetchingDomain (appState, action) { return Object.assign({}, appState, { flags: Object.assign({}, appState.flags, { isFetchingDomain: !appState.flags.isFetchingDomain @@ -229,7 +233,7 @@ function toggleFetchingDomain(appState, action) { }) } -function toggleFetchingSources(appState, action) { +function toggleFetchingSources (appState, action) { return Object.assign({}, appState, { flags: Object.assign({}, appState.flags, { isFetchingSources: !appState.flags.isFetchingSources @@ -237,7 +241,7 @@ function toggleFetchingSources(appState, action) { }) } -function toggleInfoPopup(appState, action) { +function toggleInfoPopup (appState, action) { return Object.assign({}, appState, { flags: Object.assign({}, appState.flags, { isInfopopup: !appState.flags.isInfopopup @@ -245,7 +249,7 @@ function toggleInfoPopup(appState, action) { }) } -function toggleNotifications(appState, action) { +function toggleNotifications (appState, action) { return Object.assign({}, appState, { flags: Object.assign({}, appState.flags, { isNotification: !appState.flags.isNotification @@ -253,7 +257,7 @@ function toggleNotifications(appState, action) { }) } -function fetchSourceError(appState, action) { +function fetchSourceError (appState, action) { return { ...appState, errors: { @@ -263,9 +267,7 @@ function fetchSourceError(appState, action) { } } - - -function app(appState = initial.app, action) { +function app (appState = initial.app, action) { switch (action.type) { case UPDATE_HIGHLIGHTED: return updateHighlighted(appState, action) diff --git a/src/reducers/index.js b/src/reducers/index.js index 3b39f37..f7f3756 100644 --- a/src/reducers/index.js +++ b/src/reducers/index.js @@ -8,4 +8,4 @@ export default combineReducers({ app, domain, ui -});; +}) diff --git a/src/reducers/schema/categorySchema.js b/src/reducers/schema/categorySchema.js index d51b561..9cc6f47 100644 --- a/src/reducers/schema/categorySchema.js +++ b/src/reducers/schema/categorySchema.js @@ -1,8 +1,8 @@ -import Joi from 'joi'; +import Joi from 'joi' const categorySchema = Joi.object().keys({ - category: Joi.string().required(), - description: Joi.string(), -}); + category: Joi.string().required(), + description: Joi.string() +}) -export default categorySchema; +export default categorySchema diff --git a/src/reducers/schema/eventSchema.js b/src/reducers/schema/eventSchema.js index fb42cf5..f351f7c 100644 --- a/src/reducers/schema/eventSchema.js +++ b/src/reducers/schema/eventSchema.js @@ -1,24 +1,24 @@ -import Joi from 'joi'; +import Joi from 'joi' const eventSchema = Joi.object().keys({ - id: Joi.string().required(), - description: Joi.string().allow('').required(), - date: Joi.string().allow(''), - time: Joi.string().allow(''), - time_precision: Joi.string().allow(''), - location: Joi.string().allow(''), - latitude: Joi.string().allow(''), - longitude: Joi.string().allow(''), - type: Joi.string().allow(''), - category: Joi.string().required(), - narratives: Joi.array(), - sources: Joi.array(), - tags: Joi.array().allow(''), - comments: Joi.string().allow(''), - timestamp: Joi.string(), + id: Joi.string().required(), + description: Joi.string().allow('').required(), + date: Joi.string().allow(''), + time: Joi.string().allow(''), + time_precision: Joi.string().allow(''), + location: Joi.string().allow(''), + latitude: Joi.string().allow(''), + longitude: Joi.string().allow(''), + type: Joi.string().allow(''), + category: Joi.string().required(), + narratives: Joi.array(), + sources: Joi.array(), + tags: Joi.array().allow(''), + comments: Joi.string().allow(''), + timestamp: Joi.string(), - // nested - narrative___stepStyles: Joi.array(), + // nested + narrative___stepStyles: Joi.array() }) .and('latitude', 'longitude') .and('date', 'time', 'timestamp') diff --git a/src/reducers/schema/narrativeSchema.js b/src/reducers/schema/narrativeSchema.js index 373c0ac..2f4c8ff 100644 --- a/src/reducers/schema/narrativeSchema.js +++ b/src/reducers/schema/narrativeSchema.js @@ -1,9 +1,9 @@ -import Joi from 'joi'; +import Joi from 'joi' const narrativeSchema = Joi.object().keys({ - id: Joi.string().required(), - description: Joi.string().allow('').required(), - label: Joi.string().required() -}); + id: Joi.string().required(), + description: Joi.string().allow('').required(), + label: Joi.string().required() +}) -export default narrativeSchema; +export default narrativeSchema diff --git a/src/reducers/schema/siteSchema.js b/src/reducers/schema/siteSchema.js index f58a71c..e054897 100644 --- a/src/reducers/schema/siteSchema.js +++ b/src/reducers/schema/siteSchema.js @@ -1,11 +1,11 @@ -import Joi from 'joi'; +import Joi from 'joi' const siteSchema = Joi.object().keys({ - id: Joi.string().required(), - description: Joi.string().allow('').required(), - site: Joi.string().required(), - latitude: Joi.string().required(), - longitude: Joi.string().required() -}); + id: Joi.string().required(), + description: Joi.string().allow('').required(), + site: Joi.string().required(), + latitude: Joi.string().required(), + longitude: Joi.string().required() +}) -export default siteSchema; +export default siteSchema diff --git a/src/reducers/schema/sourceSchema.js b/src/reducers/schema/sourceSchema.js index 8ee91fc..eb5065d 100644 --- a/src/reducers/schema/sourceSchema.js +++ b/src/reducers/schema/sourceSchema.js @@ -1,18 +1,18 @@ -import Joi from 'joi'; +import Joi from 'joi' const sourceSchema = Joi.object().keys({ - id: Joi.string().required(), - title: Joi.string().allow(''), - thumbnail: Joi.string().allow(''), - paths: Joi.array().required(), - type: Joi.string().allow(''), - affil_s: Joi.array().allow(''), - url: Joi.string().allow(''), - desc: Joi.string().allow(''), - parent: Joi.string().allow(''), - author: Joi.string().allow(''), - date: Joi.string().allow(''), - notes: Joi.string().allow('') -}); + id: Joi.string().required(), + title: Joi.string().allow(''), + thumbnail: Joi.string().allow(''), + paths: Joi.array().required(), + type: Joi.string().allow(''), + affil_s: Joi.array().allow(''), + url: Joi.string().allow(''), + desc: Joi.string().allow(''), + parent: Joi.string().allow(''), + author: Joi.string().allow(''), + date: Joi.string().allow(''), + notes: Joi.string().allow('') +}) -export default sourceSchema; +export default sourceSchema diff --git a/src/reducers/ui.js b/src/reducers/ui.js index da2e018..e45dead 100644 --- a/src/reducers/ui.js +++ b/src/reducers/ui.js @@ -1,9 +1,9 @@ -import initial from '../store/initial.js'; +import initial from '../store/initial.js' import {} from '../actions' -function ui(uiState = initial.ui, action) { - return uiState; +function ui (uiState = initial.ui, action) { + return uiState } -export default ui; +export default ui diff --git a/src/reducers/utils/helpers.js b/src/reducers/utils/helpers.js index 0a0509a..f18adaf 100644 --- a/src/reducers/utils/helpers.js +++ b/src/reducers/utils/helpers.js @@ -1,18 +1,19 @@ -export function parseDateTimes(arrayToParse) { - const parsedArray = []; +/* global d3 */ +export function parseDateTimes (arrayToParse) { + const parsedArray = [] arrayToParse.forEach(item => { - let incoming_datetime = `${item.date}T00:00`; - if (item.time) incoming_datetime = `${item.date}T${item.time}`; - const parser = d3.timeParse(process.env.INCOMING_DATETIME_FORMAT); - item.timestamp = d3.timeFormat("%Y-%m-%dT%H:%M:%S")(parser(incoming_datetime)); + let incomingDateTime = `${item.date}T00:00` + if (item.time) incomingDateTime = `${item.date}T${item.time}` + const parser = d3.timeParse(process.env.incomingDateTime_FORMAT) + item.timestamp = d3.timeFormat('%Y-%m-%dT%H:%M:%S')(parser(incomingDateTime)) - parsedArray.push(item); - }); + parsedArray.push(item) + }) - return parsedArray; + return parsedArray } -export function capitalize(string) { - return string.charAt(0).toUpperCase() + string.slice(1); +export function capitalize (string) { + return string.charAt(0).toUpperCase() + string.slice(1) } diff --git a/src/reducers/utils/validators.js b/src/reducers/utils/validators.js index 42bf3d3..97f7ed5 100644 --- a/src/reducers/utils/validators.js +++ b/src/reducers/utils/validators.js @@ -1,18 +1,18 @@ -import Joi from 'joi'; +import Joi from 'joi' -import eventSchema from '../schema/eventSchema'; -import categorySchema from '../schema/categorySchema'; -import siteSchema from '../schema/siteSchema'; -import narrativeSchema from '../schema/narrativeSchema'; +import eventSchema from '../schema/eventSchema' +import categorySchema from '../schema/categorySchema' +import siteSchema from '../schema/siteSchema' +import narrativeSchema from '../schema/narrativeSchema' import sourceSchema from '../schema/sourceSchema' -import { capitalize } from './helpers.js'; +import { capitalize } from './helpers.js' /* * Create an error notification object * Types: ['error', 'warning', 'good', 'neural'] */ -function makeError(type, id, message) { +function makeError (type, id, message) { return { type: 'error', id, @@ -20,10 +20,8 @@ function makeError(type, id, message) { } } - -const isLeaf = node => (Object.keys(node.children).length === 0); -const isDuplicate = (node, set) => { return (set.has(node.key)); }; - +const isLeaf = node => (Object.keys(node.children).length === 0) +const isDuplicate = (node, set) => { return (set.has(node.key)) } /* * Traverse a tag tree and check its duplicates @@ -70,29 +68,29 @@ export function validateDomain (domain) { categories: [], sites: [], narratives: [], - sources: [], + sources: [] } - function validateArrayItem(item, domainKey, schema) { - const result = Joi.validate(item, schema); + function validateArrayItem (item, domainKey, schema) { + const result = Joi.validate(item, schema) if (result.error !== null) { - const id = item.id || '-'; - const domainStr = capitalize(domainKey); - const error = makeError(domainStr, id, result.error.message); + const id = item.id || '-' + const domainStr = capitalize(domainKey) + const error = makeError(domainStr, id, result.error.message) - discardedDomain[domainKey].push(Object.assign(item, { error })); + discardedDomain[domainKey].push(Object.assign(item, { error })) } else { - sanitizedDomain[domainKey].push(item); + sanitizedDomain[domainKey].push(item) } } - function validateArray(items, domainKey, schema) { + function validateArray (items, domainKey, schema) { items.forEach(item => { validateArrayItem(item, domainKey, schema) }) } - function validateObject(obj, domainKey, itemSchema) { + function validateObject (obj, domainKey, itemSchema) { Object.keys(obj).forEach(key => { const vl = obj[key] const result = Joi.validate(vl, itemSchema) @@ -109,29 +107,28 @@ export function validateDomain (domain) { }) } - validateArray(domain.events, 'events', eventSchema); - validateArray(domain.categories, 'categories', categorySchema); - validateArray(domain.sites, 'sites', siteSchema); - validateArray(domain.narratives, 'narratives', narrativeSchema); - validateObject(domain.sources, 'sources', sourceSchema); - + validateArray(domain.events, 'events', eventSchema) + validateArray(domain.categories, 'categories', categorySchema) + validateArray(domain.sites, 'sites', siteSchema) + validateArray(domain.narratives, 'narratives', narrativeSchema) + validateObject(domain.sources, 'sources', sourceSchema) // Message the number of failed items in domain Object.keys(discardedDomain).forEach(disc => { - const len = discardedDomain[disc].length; + const len = discardedDomain[disc].length if (len) { sanitizedDomain.notifications.push({ message: `${len} invalid ${disc} not displayed.`, items: discardedDomain[disc], type: 'error' - }); + }) } - }); + }) // Validate uniqueness of tags - const tagSet = new Set([]); - const duplicateTags = []; - validateTree(domain.tags, {}, tagSet, duplicateTags); + const tagSet = new Set([]) + const duplicateTags = [] + validateTree(domain.tags, {}, tagSet, duplicateTags) // Duplicated tags if (duplicateTags.length > 0) { @@ -139,9 +136,9 @@ export function validateDomain (domain) { message: `Tags are required to be unique. Ignoring duplicates for now.`, items: duplicateTags, type: 'error' - }); + }) } - sanitizedDomain.tags = domain.tags; + sanitizedDomain.tags = domain.tags - return sanitizedDomain; + return sanitizedDomain } diff --git a/src/selectors/index.js b/src/selectors/index.js index 53cae3f..5af508e 100644 --- a/src/selectors/index.js +++ b/src/selectors/index.js @@ -1,4 +1,4 @@ -import { createSelector} from 'reselect' +import { createSelector } from 'reselect' import { parseTimestamp, compareTimestamp, insetSourceFrom } from '../js/utilities' // Input selectors @@ -23,7 +23,6 @@ export const getTagsFilter = state => state.app.filters.tags export const getCategoriesFilter = state => state.app.filters.categories export const getTimeRange = state => state.app.filters.timerange - /** * Some handy helpers */ @@ -32,7 +31,7 @@ export const getTimeRange = state => state.app.filters.timerange * Given an event and all tags, * returns true/false if event has any tag that is active */ -function isTaggedIn(event, tagFilters) { +function isTaggedIn (event, tagFilters) { if (event.tags) { const isTagged = event.tags.some((tag) => { return tagFilters.find(tF => (tF.key === tag && tF.active)) @@ -47,10 +46,10 @@ function isTaggedIn(event, tagFilters) { * Given an event and all categories, * returns true/false if event has a category that is active */ -function isTaggedInWithCategory(event, categories) { +function isTaggedInWithCategory (event, categories) { if (event.category) { if (categories.find(c => (c.category === event.category && c.active))) return true - return false; + return false } else { return false } @@ -59,22 +58,22 @@ function isTaggedInWithCategory(event, categories) { /* * Returns true if no tags are selected */ -function isNoTags(tagFilters) { +function isNoTags (tagFilters) { return ( - tagFilters.length === 0 - || !process.env.features.USE_TAGS - || tagFilters.every(t => !t.active) + tagFilters.length === 0 || + !process.env.features.USE_TAGS || + tagFilters.every(t => !t.active) ) } /* * Returns true if no categories are selected */ -function isNoCategories(categories) { +function isNoCategories (categories) { return ( - categories.length === 0 - || !process.env.features.CATEGORIES_AS_TAGS - || categories.every(c => !c.active) + categories.length === 0 || + !process.env.features.CATEGORIES_AS_TAGS || + categories.every(c => !c.active) ) } @@ -82,10 +81,10 @@ function isNoCategories(categories) { * Given an event and a time range, * returns true/false if the event falls within timeRange */ -function isTimeRangedIn(event, timeRange) { +function isTimeRangedIn (event, timeRange) { return ( - timeRange[0] < parseTimestamp(event.timestamp) - && parseTimestamp(event.timestamp) < timeRange[1] + timeRange[0] < parseTimestamp(event.timestamp) && + parseTimestamp(event.timestamp) < timeRange[1] ) } @@ -94,76 +93,73 @@ function isTimeRangedIn(event, timeRange) { * and if TAGS are being used, select them if their tags are enabled */ export const selectEvents = createSelector( - [getEvents, getTagsFilter, getCategoriesFilter, getTimeRange], - (events, tagFilters, categories, timeRange) => { + [getEvents, getTagsFilter, getCategoriesFilter, getTimeRange], + (events, tagFilters, categories, timeRange) => { + return events.reduce((acc, event) => { + const isTagged = isTaggedIn(event, tagFilters) || isNoTags(tagFilters) + const isTaggedWithCategory = isTaggedInWithCategory(event, categories) || isNoCategories(categories) + const isTimeRanged = isTimeRangedIn(event, timeRange) - return events.reduce((acc, event) => { - const isTagged = isTaggedIn(event, tagFilters) || isNoTags(tagFilters) - const isTaggedWithCategory = isTaggedInWithCategory(event, categories) || isNoCategories(categories) - const isTimeRanged = isTimeRangedIn(event, timeRange) + if (isTimeRanged && isTagged && isTaggedWithCategory) { + const eventClone = Object.assign({}, event) + acc[event.id] = eventClone + } - if (isTimeRanged && isTagged && isTaggedWithCategory) { - const eventClone = Object.assign({}, event) - acc[event.id] = eventClone - } - - return acc + return acc }, []) -}) + }) /** * Of all available events, selects those that fall within the time range, * and if TAGS are being used, select them if their tags are enabled */ export const selectNarratives = createSelector( - [getEvents, getNarratives, getSources], - (events, narrativesMeta, sources) => { + [getEvents, getNarratives, getSources], + (events, narrativesMeta, sources) => { + const narratives = {} + const narrativeSkeleton = id => ({ id, steps: [] }) - const narratives = {} - const narrativeSkeleton = id => ({ id, steps: [] }) + /* populate narratives dict with events */ + events.forEach(evt => { + const isInNarrative = evt.narratives.length > 0 - /* populate narratives dict with events */ - events.forEach(evt => { - const isInNarrative = evt.narratives.length > 0 + evt.narratives.forEach(narrative => { + // initialise + if (!narratives[narrative]) { narratives[narrative] = narrativeSkeleton(narrative) } - evt.narratives.forEach(narrative => { - // initialise - if (!narratives[narrative]) - narratives[narrative] = narrativeSkeleton(narrative) - - // add evt to steps - if (isInNarrative) - // NB: insetSourceFrom is a 'curried' function to allow with maps - narratives[narrative].steps.push(insetSourceFrom(sources)(evt)) - }) - }) - - - /* sort steps by time */ - Object.keys(narratives).forEach(key => { - const steps = narratives[key].steps - - steps.sort(compareTimestamp) - - if (narrativesMeta.find(n => n.id === key)) { - narratives[key] = { - ...narrativesMeta.find(n => n.id === key), - ...narratives[key] - } + // add evt to steps + if (isInNarrative) { + // NB: insetSourceFrom is a 'curried' function to allow with maps + narratives[narrative].steps.push(insetSourceFrom(sources)(evt)) } }) + }) - // Return narratives in original order - // + filter those that are undefined - return narrativesMeta.map(n => narratives[n.id]).filter(d => d); -}) + /* sort steps by time */ + Object.keys(narratives).forEach(key => { + const steps = narratives[key].steps + + steps.sort(compareTimestamp) + + if (narrativesMeta.find(n => n.id === key)) { + narratives[key] = { + ...narrativesMeta.find(n => n.id === key), + ...narratives[key] + } + } + }) + + // Return narratives in original order + // + filter those that are undefined + return narrativesMeta.map(n => narratives[n.id]).filter(d => d) + }) /** Aggregate information about the narrative and the current step into * a single object. If narrative is null, the whole object is null. */ export const selectActiveNarrative = createSelector( [getActiveNarrative, getActiveStep], - (narrative, current) => !!narrative + (narrative, current) => narrative ? { ...narrative, current } : null ) @@ -180,7 +176,6 @@ export const selectActiveNarrative = createSelector( export const selectLocations = createSelector( [selectEvents], (events) => { - const selectedLocations = {} events.forEach(event => { const location = event.location @@ -230,7 +225,6 @@ export const selectDatetimes = createSelector( } ) - /** * Of all the sources, select those that are relevant to the selected events. */ @@ -253,12 +247,11 @@ export const selectCategories = createSelector( (categories) => { categories.map(cat => { cat.active = (!cat.hasOwnProperty('active')) ? false : cat.active - }); - return categories; + }) + return categories } ) - /** * Given a tree of tags, return those tags as a list * Each node has been aware of its depth, and given an 'active' flag @@ -268,7 +261,7 @@ export const selectTagList = createSelector( (tags) => { const tagList = [] let depth = 0 - function traverseNode(node, depth) { + function traverseNode (node, depth) { node.active = (!node.hasOwnProperty('active')) ? false : node.active node.depth = depth diff --git a/src/store/index.js b/src/store/index.js index 735a481..09508d2 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1,12 +1,12 @@ -import { createStore, applyMiddleware, compose } from 'redux'; -import thunk from 'redux-thunk'; +import { createStore, applyMiddleware, compose } from 'redux' +import thunk from 'redux-thunk' -import rootReducer from '../reducers'; -const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; +import rootReducer from '../reducers' +const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose const store = createStore( rootReducer, composeEnhancers(applyMiddleware(thunk)) -); +) -export default store; +export default store diff --git a/src/store/initial.js b/src/store/initial.js index 9cb4a2a..5b3cea0 100644 --- a/src/store/initial.js +++ b/src/store/initial.js @@ -16,7 +16,7 @@ const initial = { sources: {}, sites: [], tags: {}, - notifications: [], + notifications: [] }, /* @@ -29,7 +29,7 @@ const initial = { */ app: { errors: { - source: null, + source: null }, highlighted: null, selected: [], @@ -51,7 +51,7 @@ const initial = { coevents: false, routes: false, sites: true - }, + } }, isMobile: (/Mobi/.test(navigator.userAgent)), language: 'en-US', @@ -83,7 +83,7 @@ const initial = { ui: { style: { categories: { - default: '#f3de2c', + default: '#f3de2c' }, narratives: { default: { @@ -94,16 +94,16 @@ const initial = { } }, dom: { - timeline: "timeline", - timeslider: "timeslider", - map: "map" - }, + timeline: 'timeline', + timeslider: 'timeslider', + map: 'map' + } } -}; +} -let appStore; +let appStore if (process.env.store) { - appStore = mergeDeepLeft(process.env.store, initial); + appStore = mergeDeepLeft(process.env.store, initial) } else { appStore = initial } diff --git a/test/server_process.js b/test/server_process.js index 350e901..5383859 100644 --- a/test/server_process.js +++ b/test/server_process.js @@ -1,68 +1,65 @@ -var assert = require('assert'); -var child_process = require('child_process') -var http = require('http'); import test from 'ava' +var childProcess = require('childProcess') +var http = require('http') -const SERVER_LAUNCH_WAIT_TIME = 5 * 1000; +const SERVER_LAUNCH_WAIT_TIME = 5 * 1000 -var server_proc = null; -var server_exited = false; +var serverProc = null +var serverExited = false test.before.cb(t => { - console.log("launching server...") - server_proc = child_process.spawn('yarn', ['dev'], { + console.log('launching server...') + serverProc = childProcess.spawn('yarn', ['dev'], { cwd: '.', stdio: 'ignore' - }); + }) - server_proc.on('exit', function(code, signal) { - server_exited = true; - }); + serverProc.on('exit', function (code, signal) { + serverExited = true + }) setTimeout(t.end, SERVER_LAUNCH_WAIT_TIME) -}); +}) -test.after(function() { - console.log("killing server...") - server_proc.kill('SIGKILL'); -}); +test.after(function () { + console.log('killing server...') + serverProc.kill('SIGKILL') +}) test('should launch', t => { - t.false(server_exited); -}); + t.false(serverExited) +}) var urls = [ '/', 'js/index.bundle.js' -]; +] -urls.forEach(function(url) { +urls.forEach(function (url) { test.cb('should respond to request for "' + url + '"', t => { http.get({ hostname: 'localhost', port: 8080, path: '/', agent: false - }, function(res) { - var result_data = ''; + }, function (res) { + var resultData = '' - if(res.statusCode != 200) { - t.fail('Server response was not 200.'); + if (res.statusCode !== 200) { + t.fail('Server response was not 200.') } else { - res.on('data', function(data) { result_data += data }); + res.on('data', function (data) { resultData += data }) - res.on('end', function() { - if (result_data.length > 0) { - t.pass(); + res.on('end', function () { + if (resultData.length > 0) { + t.pass() } else { - t.fail("Server returned no data."); + t.fail('Server returned no data.') } - }); + }) } - t.end(); + t.end() }) - - }); - -}); + }) +}) diff --git a/yarn.lock b/yarn.lock index 2f8e62f..9f68406 100644 --- a/yarn.lock +++ b/yarn.lock @@ -825,15 +825,25 @@ acorn-dynamic-import@^3.0.0: dependencies: acorn "^5.0.0" +acorn-jsx@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" + integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== + acorn@^5.0.0, acorn@^5.6.2: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" +acorn@^6.0.2: + version "6.0.5" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.5.tgz#81730c0815f3f3b34d8efa95cb7430965f4d887a" + integrity sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg== + 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@^3.1.0: +ajv-keywords@^3.0.0, ajv-keywords@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" @@ -846,6 +856,16 @@ ajv@^5.3.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" +ajv@^6.0.1, ajv@^6.5.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.7.0.tgz#e3ce7bb372d6577bb1839f1dfdfcbf5ad2948d96" + integrity sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ajv@^6.1.0: version "6.5.4" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.4.tgz#247d5274110db653706b550fcc2b797ca28cfc59" @@ -869,7 +889,7 @@ ansi-colors@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.1.0.tgz#dcfaacc90ef9187de413ec3ef8d5eb981a98808f" -ansi-escapes@^3.1.0: +ansi-escapes@^3.0.0, ansi-escapes@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" @@ -947,6 +967,14 @@ array-flatten@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -1415,6 +1443,18 @@ call-signature@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/call-signature/-/call-signature-0.0.2.tgz#a84abc825a55ef4cb2b028bd74e205a65b9a4996" +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= + camel-case@3.0.x: version "3.0.0" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" @@ -1479,6 +1519,20 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.1, chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^2.1.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= + chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" @@ -1523,6 +1577,11 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -1571,6 +1630,11 @@ cli-truncate@^1.1.0: slice-ansi "^1.0.0" string-width "^2.0.0" +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -1741,6 +1805,11 @@ constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" @@ -2229,7 +2298,12 @@ date-time@^2.1.0: dependencies: time-zone "^1.0.0" -debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8: +debug-log@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" + integrity sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8= + +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.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: @@ -2276,6 +2350,11 @@ deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + default-gateway@^2.6.0: version "2.7.2" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" @@ -2314,6 +2393,18 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +deglob@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/deglob/-/deglob-2.1.1.tgz#d268e168727799862e8eac07042e165957c1f3be" + integrity sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw== + dependencies: + find-root "^1.0.0" + glob "^7.0.5" + ignore "^3.0.9" + pkg-config "^1.1.0" + run-parallel "^1.1.2" + uniq "^1.0.1" + del@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" @@ -2392,6 +2483,21 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + dom-converter@~0.2: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" @@ -2549,7 +2655,19 @@ es-abstract@^1.5.1: is-callable "^1.1.3" is-regex "^1.0.4" -es-to-primitive@^1.1.1: +es-abstract@^1.7.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" + +es-to-primitive@^1.1.1, es-to-primitive@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" dependencies: @@ -2577,6 +2695,89 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" +eslint-config-standard-jsx@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz#90c9aa16ac2c4f8970c13fc7efc608bacd02da70" + integrity sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg== + +eslint-config-standard@12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9" + integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ== + +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" + integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-module-utils@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" + integrity sha1-snA2LNiLGkitMIl2zn+lTphBF0Y= + dependencies: + debug "^2.6.8" + pkg-dir "^1.0.0" + +eslint-plugin-es@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz#475f65bb20c993fc10e8c8fe77d1d60068072da6" + integrity sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw== + dependencies: + eslint-utils "^1.3.0" + regexpp "^2.0.1" + +eslint-plugin-import@~2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" + integrity sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g== + dependencies: + contains-path "^0.1.0" + debug "^2.6.8" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.1" + eslint-module-utils "^2.2.0" + has "^1.0.1" + lodash "^4.17.4" + minimatch "^3.0.3" + read-pkg-up "^2.0.0" + resolve "^1.6.0" + +eslint-plugin-node@~7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz#a6e054e50199b2edd85518b89b4e7b323c9f36db" + integrity sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw== + dependencies: + eslint-plugin-es "^1.3.1" + eslint-utils "^1.3.1" + ignore "^4.0.2" + minimatch "^3.0.4" + resolve "^1.8.1" + semver "^5.5.0" + +eslint-plugin-promise@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz#2d074b653f35a23d1ba89d8e976a985117d1c6a2" + integrity sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg== + +eslint-plugin-react@~7.11.1: + version "7.11.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz#c01a7af6f17519457d6116aa94fc6d2ccad5443c" + integrity sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw== + dependencies: + array-includes "^3.0.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.0.1" + prop-types "^15.6.2" + +eslint-plugin-standard@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz#f845b45109c99cd90e77796940a344546c8f6b5c" + integrity sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA== + eslint-scope@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" @@ -2584,6 +2785,60 @@ eslint-scope@^4.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-utils@^1.3.0, eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== + +eslint@~5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.4.0.tgz#d068ec03006bb9e06b429dc85f7e46c1b69fac62" + integrity sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg== + dependencies: + ajv "^6.5.0" + babel-code-frame "^6.26.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^4.0.0" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^4.0.0" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.2" + imurmurhash "^0.1.4" + inquirer "^5.2.0" + is-resolvable "^1.1.0" + js-yaml "^3.11.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.5" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^2.0.0" + require-uncached "^1.0.3" + semver "^5.5.0" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^4.0.3" + text-table "^0.2.0" + esm@^3.0.80: version "3.0.84" resolved "https://registry.yarnpkg.com/esm/-/esm-3.0.84.tgz#bb108989f4673b32d4f62406869c28eed3815a63" @@ -2597,6 +2852,15 @@ espower-location-detector@^1.0.0: source-map "^0.5.0" xtend "^4.0.0" +espree@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f" + integrity sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w== + dependencies: + acorn "^6.0.2" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -2607,6 +2871,13 @@ espurify@^1.6.0: dependencies: core-js "^2.0.0" +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" @@ -2734,6 +3005,15 @@ extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" +external-editor@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -2771,6 +3051,11 @@ fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + fastparse@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" @@ -2793,6 +3078,14 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + file-loader@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde" @@ -2829,6 +3122,11 @@ find-cache-dir@^1.0.0: make-dir "^1.0.0" pkg-dir "^2.0.0" +find-root@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -2848,6 +3146,16 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +flat-cache@^1.2.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" + integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== + dependencies: + circular-json "^0.3.1" + graceful-fs "^4.1.2" + rimraf "~2.6.2" + write "^0.2.1" + flush-write-stream@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" @@ -2957,6 +3265,11 @@ function-name-support@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/function-name-support/-/function-name-support-0.2.0.tgz#55d3bfaa6eafd505a50f9bc81fdf57564a0bb071" +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -2988,6 +3301,11 @@ get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + get-stream@^3.0.0: version "3.0.0" resolved "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -3020,7 +3338,7 @@ glob@7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" dependencies: @@ -3059,6 +3377,11 @@ globals@^11.1.0: version "11.8.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d" +globals@^11.7.0: + version "11.10.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.10.0.tgz#1e09776dffda5e01816b3bb4077c8b59c24eaa50" + integrity sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ== + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -3172,7 +3495,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.1: +has@^1.0.1, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" dependencies: @@ -3308,7 +3631,7 @@ https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" -iconv-lite@0.4, iconv-lite@^0.4.4: +iconv-lite@0.4, iconv-lite@^0.4.17, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" dependencies: @@ -3348,10 +3671,15 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.3.5: +ignore@^3.0.9, ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" +ignore@^4.0.2: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" @@ -3415,6 +3743,25 @@ 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@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" + integrity sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.1.0" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^5.5.2" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + internal-ip@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" @@ -3657,6 +4004,11 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" +is-resolvable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" @@ -3758,6 +4110,14 @@ js-yaml@^3.10.0: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.11.0: + version "3.12.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600" + integrity sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -3786,6 +4146,11 @@ json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -3807,6 +4172,13 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jsx-ast-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" + integrity sha1-6AGxs5mF4g//yHtA43SAgOLcrH8= + dependencies: + array-includes "^3.0.3" + killable@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -3853,6 +4225,14 @@ leaflet@^1.0.3: version "1.3.4" resolved "https://registry.yarnpkg.com/leaflet/-/leaflet-1.3.4.tgz#7f006ea5832603b53d7269ef5c595fd773060a40" +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + load-json-file@^1.0.0: version "1.1.0" resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -3863,6 +4243,16 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -3963,7 +4353,7 @@ lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" -lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.3, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@~4.17.10: +lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.10: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" @@ -4188,7 +4578,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" -minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -4205,7 +4595,7 @@ minimist@0.0.8: version "0.0.8" resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -4312,6 +4702,11 @@ multimatch@^2.1.0: arrify "^1.0.0" minimatch "^3.0.0" +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + nan@^2.10.0, nan@^2.9.2: version "2.11.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" @@ -4332,6 +4727,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + needle@^2.2.1: version "2.2.4" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" @@ -4602,6 +5002,18 @@ opn@^5.1.0: dependencies: is-wsl "^1.1.0" +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + ora@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ora/-/ora-3.0.0.tgz#8179e3525b9aafd99242d63cc206fd64732741d0" @@ -4641,7 +5053,7 @@ os-locale@^3.0.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -4800,7 +5212,7 @@ path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-is-inside@^1.0.1: +path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" @@ -4808,7 +5220,7 @@ path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" -path-parse@^1.0.5: +path-parse@^1.0.5, path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -4824,6 +5236,13 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -4862,13 +5281,29 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" -pkg-conf@^2.1.0: +pkg-conf@^2.0.0, pkg-conf@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" dependencies: find-up "^2.0.0" load-json-file "^4.0.0" +pkg-config@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pkg-config/-/pkg-config-1.1.1.tgz#557ef22d73da3c8837107766c52eadabde298fe4" + integrity sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q= + dependencies: + debug-log "^1.0.0" + find-root "^1.0.0" + xtend "^4.0.1" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= + dependencies: + find-up "^1.0.0" + pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" @@ -4887,6 +5322,11 @@ plur@^3.0.1: dependencies: irregular-plurals "^2.0.0" +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== + portfinder@^1.0.9: version "1.0.17" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a" @@ -4938,6 +5378,11 @@ postcss@^6.0.1, postcss@^6.0.23: source-map "^0.6.1" supports-color "^5.4.0" +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -4971,6 +5416,11 @@ process@~0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -5155,6 +5605,14 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -5170,6 +5628,15 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -5291,6 +5758,11 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexpp@^2.0.0, regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + regexpu-core@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" @@ -5418,6 +5890,14 @@ require-precompiled@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/require-precompiled/-/require-precompiled-0.1.0.tgz#5a1b52eb70ebed43eb982e974c85ab59571e56fa" +require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -5432,6 +5912,11 @@ resolve-cwd@^2.0.0: dependencies: resolve-from "^3.0.0" +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -5446,6 +5931,13 @@ resolve@^1.3.2: dependencies: path-parse "^1.0.5" +resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06" + integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ== + dependencies: + path-parse "^1.0.6" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -5463,6 +5955,13 @@ rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: dependencies: glob "^7.0.5" +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -5470,6 +5969,18 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +run-parallel@^1.1.2: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -5486,6 +5997,13 @@ rw@1: version "1.3.3" resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" +rxjs@^5.5.2: + version "5.5.12" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" + integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== + dependencies: + symbol-observable "1.0.1" + safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -5697,7 +6215,7 @@ slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" -slice-ansi@^1.0.0: +slice-ansi@1.0.0, slice-ansi@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" dependencies: @@ -5870,6 +6388,31 @@ stack-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" +standard-engine@~9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-9.0.0.tgz#d3a3d74c4c1b91f51a1e66362465261ca7610316" + integrity sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w== + dependencies: + deglob "^2.1.0" + get-stdin "^6.0.0" + minimist "^1.1.0" + pkg-conf "^2.0.0" + +standard@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/standard/-/standard-12.0.1.tgz#0fc5a8aa6c34c546c5562aae644242b24dae2e61" + integrity sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg== + dependencies: + eslint "~5.4.0" + eslint-config-standard "12.0.0" + eslint-config-standard-jsx "6.0.2" + eslint-plugin-import "~2.14.0" + eslint-plugin-node "~7.0.1" + eslint-plugin-promise "~4.0.0" + eslint-plugin-react "~7.11.1" + eslint-plugin-standard "~4.0.0" + standard-engine "~9.0.0" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -5927,7 +6470,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: @@ -5986,7 +6529,7 @@ strip-indent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" -strip-json-comments@~2.0.1: +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -6023,6 +6566,11 @@ supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-co dependencies: has-flag "^3.0.0" +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= + symbol-observable@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" @@ -6031,6 +6579,18 @@ symbol-observable@^1.0.2, symbol-observable@^1.0.3, symbol-observable@^1.0.4, sy version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" +table@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" + integrity sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg== + dependencies: + ajv "^6.0.1" + ajv-keywords "^3.0.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + tapable@^1.0.0, tapable@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" @@ -6061,6 +6621,11 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + through2@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" @@ -6068,6 +6633,11 @@ through2@^2.0.0: readable-stream "^2.1.5" xtend "~4.0.1" +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + thunky@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826" @@ -6086,6 +6656,13 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -6181,6 +6758,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + type-is@~1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" @@ -6251,6 +6835,11 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + unique-filename@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -6621,6 +7210,11 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + worker-farm@^1.5.2: version "1.6.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" @@ -6646,6 +7240,13 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= + dependencies: + mkdirp "^0.5.1" + xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" @@ -6667,7 +7268,7 @@ xregexp@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" -xtend@^4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"